From 8e4c9282802eee13c2be20c6898855f3139398e4 Mon Sep 17 00:00:00 2001 From: Richard Levitte Date: Thu, 11 Sep 2025 15:30:15 +0200 Subject: [PATCH 01/69] design: Fixed size large numbers For the longest time, we have mitigated security issues related to large numbers (BIGNUM) and constant time in a piece-meal fashion, without really looking at the problem from a zoomed out, holistic perspective. An interesting aspect in this problem is that large numbers can vary in size, and that depending on their combined sizes, the time to perform mathematical calculations with them vary equally much, and may thereby unintentionally leak information on those numbers. To mitigate that sort of timing issue, we introduce fixed size numbers, which are designed to have payload sizes that are pre-determined, usually by the crypto system that uses them. This means that even a very small number (let's take 1 as a ridiculous example) would have the same size payload as a much larger number, and calculations using them would perform across all payload bits of all input numbers combined. These fixed size numbers primarly differ from BIGNUMs in that once they have been allocated to a certain size, that size will not change throughout its lifetime. Reviewed-by: Dmitry Belyavskiy Reviewed-by: Tomas Mraz (Merged from https://github.com/openssl/openssl/pull/28522) --- doc/designs/fixed-size-large-numbers.md | 711 ++++++++++++++++++++++++ 1 file changed, 711 insertions(+) create mode 100644 doc/designs/fixed-size-large-numbers.md diff --git a/doc/designs/fixed-size-large-numbers.md b/doc/designs/fixed-size-large-numbers.md new file mode 100644 index 0000000000..dbcf3640ee --- /dev/null +++ b/doc/designs/fixed-size-large-numbers.md @@ -0,0 +1,711 @@ +Fixed size large numbers +======================== + +*`BIGNUM` redesign for better constant time calculations* +--------------------------------------------------------- + +
+

Abstract

+ +

+In this design, we explore and define how OpenSSL's `BIGNUM` library can +be remodelled for constant-size calculations. Furthermore, we explore and +define a fixed size large number library, which never changes the in-memory +size of a number once it has been allocated. Finally, we define how `BIGNUM` +functions with corresponding fixed size large number functions can be remade +into wrappers around the latter. +

+ +
+ +### Table of contents: + +- [Background][] +- [Goals][] +- [Challenges][] +- [Design][] + - [The `OSSL_FN` type][] + - [The `OSSL_FN_CTX` type][] + - [The `OSSL_FN_CTX` type, with frames][] + - [The `OSSL_FN_CTX` type, without frames][] + - [The `BIGNUM` type][] + - [Mutability][] + - [Dropping `top` from `BIGNUM`][] + - [Memory functionality for `OSSL_FN`][] + - [Memory functionality for `OSSL_FN_CTX`][] + - [Wrapping an `OSSL_FN` function with a `BIGNUM` function][] + - [Failures][] +- [Repurposing existing code][] +- [How to apply `OSSL_FN`][] +- [Where to apply `OSSL_FN`][] +- [How to apply `OSSL_FN_CTX`][] + - [The variant with frames][] + - [The variant without frames][] +- [Testing][] +- [Appendix][] + - [Using the C99 flexible array member feature][] + +Background +========== + +[Background]: #background + +The current internal definition of OpenSSL's `BIGNUM` looks like this: + +```c +struct bignum_st { + BN_ULONG *d; /* + * Pointer to an array of 'BN_BITS2' bit + * chunks. These chunks are organised in + * a least significant chunk first order. + */ + int top; /* Index of last used d +1. */ + /* The next are internal book keeping for bn_expand. */ + int dmax; /* Size of the d array. */ + int neg; /* one if the number is negative */ + int flags; +}; +``` + +The fields `d`, `top` and `dmax` allow the numbers to be quite dynamic in +terms of its memory footprint, as it can both increase in size[^1] and +decrease in size.[^2] + +Furthermore, the result of any `BIGNUM` operation may be the same `BIGNUM` +instance as any of the operands, which means that any `BIGNUM` may have its +memory footprint adjusted at any time. + +While this is very flexible, it leaves uncertainties about the time any +calculation may take, following any earlier calculation, which is a security +vulnerability. + +[^1]: the array `d` is reallocated to a larger size and `dmax` as well as top + are updated +[^2]: `top` is diminished + +Goals +===== + +[Goals]: #goals + +Overall goal: Introduce a new type and API that are inherently constant size +to replace the existing `BIGNUM` usage. + +The intention is to enhance this one aspect of constant time calculations. +Other aspects are considered out of scope for this design. + +The included sub-goals are: + +* To define a new large number type and accompanying API, that doesn't allow + size adjustments of the large numbers once their individual size has been + established +* To define that large number type and API in such a way it's compatible + with and can be used by the `BIGNUM` API through easy transition to the + new type. +* To ensure that the new large number API is constant-size +* To repurpose as much as possible of our current `BIGNUM` code for the new + large number API, especially our assembler code (with the assumption that + everything that doesn't change the `BIGNUM` sizes can be repurposed as is) +* To replace the public `BIGNUM` API that has been repurposed as wrappers + around the new large number API +* To replace all security critical large number calculations so that they + are not just constant-size in themselves, but that the whole set of + calculations remains constant-size, within OpenSSL code + +Challenges +========== + +[Challenges]: #challenges + +The challenges we have are: + +- **`BIGNUM` usage** + + Because `BIGNUM` is a public facing API, it's likely to be used by OpenSSL + users. This existing API needs to be backward compatible, but performance + isn't necessarily critical. + +- **constant-time through constant-size** + + To make calculation time predictable on a broader scale than on a + per-operation basis, there's a need to ensure that each large number being + used in the calculations involved has a fixed size, i.e. to avoid the sort + of dynamic sizing that the `BIGNUM` functionality does. + +Design +====== + +[Design]: #design + +The overall design defines a new type, `OSSL_FN` (where FN is short for +"FIXNUM"), which can somehow be made compatible with `BIGNUM`, but yet be +distinct. Early thoughts on this was to make them essentially the same type +internally, and cast between them, but unfortunately, a compliant C compiler +is very likely to auto-cast between them, making it difficult to keep them +separate yet castable back and forth. + +To allow a stricter or more explicit way to remedy the flexibility of the C +language, this design therefore defines a `OSSL_FN` which is separate from +the `BIGNUM`, yet compatible with BIGNUM insofar that the `BIGNUM` type +wraps around the `OSSL_FN` type, and `BIGNUM` functions wrap around +corresponding `OSSL_FN` functions when there are any. + +The idea is that a `BIGNUM` (`BN_`) function may call an `OSSL_FN` function, +but not the other way around, i.e. when an `OSSL_FN` function is called, an +"`OSSL_FN` only" bubble is entered, and such a function must therefore only +in turn call other `OSSL_FN` functions for large number operations, rather +than `BIGNUM` functions. + +The overall design also defines new associated types to replace their +`BIGNUM` counterparts: `OSSL_FN_CTX`, `OSSL_FN_BLINDING`, `OSSL_FN_MONT_CTX`, +and `OSSL_FN_RECP_CTX`. Notably, however, the callback type `BN_GENCB` +isn't replaced, as it contains nothing `BIGNUM`, and can therefore be reused +unchanged with an `OSSL_FN` API. + +The `OSSL_FN` type and API will be designed in such a way to enable it to +become public at some point in the future. *The initial version will not be +public and will only be used internally within OpenSSL.* + +Let's go over the details + +The `OSSL_FN` type +------------------ + +[The `OSSL_FN` type]: #the-ossl_fn-type + +The `OSSL_FN` type would be a structure derived from the existing `BIGNUM` +type, retaining a minimum amount of data. Just as was previously with +`BIGNUM`, the absolute value of the number is stored in a `BN_ULONG` array, +and a flag indicates if the number is positive or negative. + +```c +typedef struct ossl_fn_st OSSL_FN; + +struct ossl_fn_st { + /* Flag: alloced with OSSL_FN_new() or OSSL_FN_secure_new() */ + unsigned int is_dynamically_allocated : 1; + /* Flag: alloced with OSSL_FN_secure_new() */ + unsigned int is_securely_allocated : 1; + /* Flag: the caller holds a pointer to this OSSL_FN as well as the BIGNUM that wraps it */ + unsigned int is_acquired : 1; + /* Flag: the number is negative */ + unsigned int is_negative : 1; + + /* + * The d array, with its size in number of BN_ULONG. + * This stores the number itself + */ + size_t dsize; + BN_ULONG d[]; +}; +``` + +To be noted is that current cryptosystems never use negative numbers, so +it's possible that the `is_negative` flag will never be used. Therefore, it +is possible that it will never exist in actual implementation. It is +retained in this design, though, to keep that option open. + +The `OSSL_FN_CTX` type +---------------------- + +[The `OSSL_FN_CTX` type]: #the-ossl_fn_ctx-type + +The `OSSL_FN_CTX` type is made to replace the `BN_CTX` type where `OSSL_FN` +type is used instead of `BIGNUM`. + +The `OSSL_FN_CTX` type is to be implemented as an arena (a large enough chunk +of memory) in which `OSSL_FN` instances are allocated. More in detail, there +are two possibilities. + +### The `OSSL_FN_CTX` type, with frames + +[The `OSSL_FN_CTX` type, with frames]: #the-ossl_fn_ctx-type-with-frames + +This variant is intended to mimic all `BN_CTX` functionality. The idea is to +create a large `OSSL_FN_CTX` at the top function of a complex calculation, and +pass it around to all sub-function calls. + +Each sub-function would begin with starting a frame (using `OSSL_FN_CTX_begin()`, +similar in spirit to `BN_CTX_start()`) in the passed `OSSL_FN_CTX` arena, +obtain what temporary `OSSL_FN`s it needs from it (using `OSSL_FN_CTX_get()`, +similar in spirit to `BN_CTX_get()`), perform what calculations it needs, and +finish with ending the frame (using `OSSL_FN_CTX_end()`, similar in spirit to +`BN_CTX_end()`), which relinquishing that frame's space in the `OSSL_FN_CTX` +arena, and thereby making that same space available for the next sub-function. + +```c +typedef struct ossl_fn_ctx_st OSSL_FN_CTX; + +struct ossl_fn_ctx_frame_st; /* forwarding, see below */ +struct ossl_fn_ctx_st { + /* + * Pointer to the last OSSL_FN_CTX_start() location (a simple pointer into + * the memory area). See the struct ossl_fn_ctx_frame_st definition below + * for details. + */ + struct ossl_fn_ctx_frame_st *last_frame; + /* + * The arena itself. + */ + size_t msize; /* bytes */ + unsigned char memory[]; +}; + +struct ossl_fn_ctx_frame_st { + /* + * Pointer back to the whole arena where the frame is located, to access + * |msize| and |memory| from it. + */ + struct ossl_fn_ctx_st *arena; + /* + * Pointer to the previous frame in the arena, allowing OSSL_FN_CTX_end() + * to do its job. + */ + struct ossl_fn_ctx_frame_st *previous_frame; + /* + * Pointer to the free area of the frame. Every time OSSL_FN_CTX_get() is + * called, the current value of this pointer is returned, and it's updated + * by incrementing it by the number of bytes given by OSSL_FN_CTX_get(). + * The available number of bytes is limited by what's left in the arena. + */ + unsigned char *free_memory; + unsigned char memory[]; +}; +``` + +The arena design requires that the total use of the arena can be predicted +at the point of allocating the arena. There is an inherent uncertainty how +large an arena should be to accommodate the needs of a large tree of +function calls using it. A possible solution is to allocate a very large +arena (could 32kB be considered enough?), but it may require some +investigation to find out what's reasonable. + +Looking at the current use of `BN_CTX_new`, it can be noted that they are +allocated all over current OpenSSL code, so it's easy to assume that each is +used in a fairly limited fashion. Furthermore, the `BN_CTX` internals allow +for a maximum of 16 `BIGNUM`s. A corresponding arena could the reasonably +have the size 16 \* *size of largest fixed number* plus a little extra for +bookkeeping purposes. + +### The `OSSL_FN_CTX` type, without frames + +[The `OSSL_FN_CTX` type, without frames]: #the-ossl_fn_ctx-type-without-frames + +Compared to the variant with frames, this `OSSL_FN_CTX` variant is much +simpler, but also more heap allocation intense. + +The idea with this one is that each function that needs to obtain temporary +`OSSL_FN`s would also create their own `OSSL_FN_CTX`, independently from any +other function. + +```c +typedef struct ossl_fn_ctx_st OSSL_FN_CTX; + +struct ossl_fn_ctx_st { + /* + * Pointer to the free area of the arena. Every time OSSL_FN_CTX_get() is + * called, the current value of this pointer is returned, and it's updated + * by incrementing it by the number of bytes given by OSSL_FN_CTX_get(). + * The available number of bytes is limited by what's left in the arena. + */ + unsigned char *free_memory; + /* + * The arena itself. + */ + size_t msize; /* bytes */ + unsigned char memory[]; +}; +``` + +Other associated types +---------------------- + +[Other associated types]: #other-associated-types + +There are a few types that, like `BN_CTX` / `OSSL_FN_CTX`, are used to hold +a context around some more complicated calculations. Just like `OSSL_FN_CTX`, +The `OSSL_FN` variants of these types are made into strictly separate types, +not compatible with their `BIGNUM` counterparts. + +| `BIGNUM` types | `OSSL_FN` types | +|----------------|--------------------| +| `BN_BLINDING` | `OSSL_FN_BLINDING` | +| `BN_MONT_CTX` | `OSSL_FN_MONT_CTX` | +| `BN_RECP_CTX` | `OSSL_FN_RECP_CTX` | + +Their `OSSL_FN` APIs for these types should be possible to create by +repurposing the corresponding `BIGNUM` APIs, with adjustments for the +constant-size requirements of all `OSSL_FN` functions. + +The `BIGNUM` type +----------------- + +[The `BIGNUM` type]: #the-bignum-type + +The `BIGNUM` type is changed to include a `OSSL_FN` for its data, and other +fields that are only of interest for `BIGNUM`s: + +```c +struct bignum_st { + OSSL_FN *data; + /* Some of these flags are replicated in OSSL_FN, some are not */ + int flags; +}; +``` + +When structured this way, it's easy to get an `OSSL_FN` out of a `BIGNUM`, +as well as to wrap an `OSSL_FN` in a `BIGNUM`: + +```c +/* + * BN_acquire_fn() and BN_release_fn() function together. It is done this + * way as a safety measure, to make sure that a BIGNUM doesn't expand an OSSL_FN + * that the caller currently has a handle on. However, it's possible to + * adjust the size of the OSSL_FN while acquiring it. + */ +OSSL_FN *BN_acquire_fn(BIGNUM *a, size_t bits) +{ + if (a->data->is_acquired) + return NULL; /* only one acquisition at a time */ + if ((bn_expand(a, bits)) <= 0) + return NULL; + a->data->is_acquired = 1; + return a->data; +} +void BN_release_fn(BIGNUM *a) +{ + a->data->is_acquired = 0; +} +``` + +Note that these functions are not designed to be thread-safe, nor do they +support multiple suímultaneous acquisitions. By design, holding pointers to +a `BIGNUM` and its wrapped `OSSL_FN` at the same time should only happen in +a very short term. + +If there's a need, it would also be possible to wrap an `OSSL_FN` with a +`BIGNUM`: + +``` C +/* + * When wrapping an OSSL_FN in a BIGNUM, the OSSL_FN is considered acquired + * until the caller decides to release it. + */ +BIGNUM *BN_wrap_fn(OSSL_FN *a) +{ + BIGNUM *r = OPENSSL_zalloc(sizeof(BIGNUM)); + + if (r != NULL) { + r->data = a; + r->flags |= (a->is_dynamically_allocated ? BN_FLG_MALLOCED); + r->flags |= (a->is_securely_allocated ? BN_FLG_SECURE); + a->is_acquired = 1; + } + + return r; +} +``` + +This should be avoided, but we retain this possibility just in case its use +is unavoidable. + +Mutability +---------- + +[Mutability]: #mutability + +The understanding is that within a `OSSL_FN` API, `dsize` is immutable as +soon as a `OSSL_FN` has been allocated to its target size, except for when +the `OSSL_FN` instance is freed. However, when accessed through the `BIGNUM` +type (i.e. by the `BIGNUM` API), the `OSSL_FN` size may be reallocated to +allow a larger size than initially allocated, and `dsize` may be modified +accordingly. + +The `OSSL_FN_CTX` API is much more strict. The size of an `OSSL_FN_CTX` +instance is immutable after it has been allocated, except when it is freed. + +In the case where an `OSSL_FN` is "acquired" (i.e. the calling code holds a +pointer to a `OSSL_FN` and to a `BIGNUM` that wraps it), `BIGNUM` must +consider the `OSSL_FN` size as immutable. + +Dropping `top` from `BIGNUM` +---------------------------- + +[Dropping `top` from `BIGNUM`]: #dropping-top-from-bignum + +With this design, the `top` field is dropped, meaning that a `BIGNUM` will +no longer be able to diminish its memory footprint. The reason is that the +`OSSL_FN` functionality would need to update it, but that runs counter to +the ideas behind the `OSSL_FN` functionality in terms of mutability. + +This may come at a performance cost for users calling the `BIGNUM` +API. However, it's our judgement that this is acceptable to get better +overall safety. + +Memory functionality for `OSSL_FN` +---------------------------------- + +[Memory functionality for `OSSL_FN`]: #memory-functionality-for-ossl_fn + +We anticipate that we will need the following functions to allocate and +deallocate `OSSL_FN`s: + +```c +OSSL_FN *OSSL_FN_new(size_t size); +void OSSL_FN_free(OSSL_FN *f); +``` + +Memory functionality for `OSSL_FN_CTX` +-------------------------------------- + +[Memory functionality for `OSSL_FN_CTX`]: #memory-functionality-for-ossl_fn_ctx + +We anticipate that the `OSSL_FN_CTX` API will look very much like the +`BN_CTX` API, except for the allocation functionality: + +```c +OSSL_FN_CTX *OSSL_FN_CTX_new(OSSL_LIB_CTX *libctx, size_t arena_size); +OSSL_FN_CTX *OSSL_FN_CTX_secure_new(OSSL_LIB_CTX *libctx, size_t arena_size); +void OSSL_FN_CTX_free(OSSL_FN_CTX *ctx); + +OSSL_FN *OSSL_FN_CTX_get(OSSL_FN_CTX *ctx, size_t size); +``` + +*Something to be noted is that `OSSL_FN_CTX_secure_new()` allocates the +whole arena in secure memory. The impact compared to allocating individual +`OSSL_FN` instances in secure memory is considered minimal.* + +If the variant of `OSSL_FN_CTX` *with frames* is chosen, the following +functions will also have to be defined: + +```c +int OSSL_FN_CTX_start(OSSL_FN_CTX *ctx); +int OSSL_FN_CTX_end(OSSL_FN_CTX *ctx); +``` + +Wrapping an `OSSL_FN` function with a `BIGNUM` function +------------------------------------------------------- + +[Wrapping an `OSSL_FN` function with a `BIGNUM` function]: #wrapping-an-ossl_fn-function-with-a-bignum-function + +This is one example of what that would look like. This assumes that there is +a function `OSSL_FN_add()`: + +```c +int OSSL_FN_add(OSSL_FN *r, const OSSL_FN *a, const OSSL_FN *b) +{ + /* + * Code from the current BN_add() goes here, without the part that touches + * top and dmax (top doesn't exist in this design, but it does exist in + * current OpenSSL code) + */ +} + +int BN_add(BIGNUM *r, BIGNUM *a, BIGNUM *b) +{ + int ret; + + if (!r->data.is_acquired) { + size_t max_size = a->data.dsize; /* number of sizeof(BN_ULONG) limbs */ + BN_ULONG n = a->data->d[max_size-1]; + + if (b->data.dsize > max_size) { + max_size = b->data->dsize; + n = b->data->d[max_size-1]; + } + + /* + * If the highest limb in the biggest number is non-zero and they are + * both positive or both negative, it's assumed that the resulting + * bignum may grow by one limb. + */ + if (n != 0 && a->data->is_negative == b->data->is_negative) + max_size++; + + if ((ret = bn_expand(r, max_size * BN_BITS2)) <= 0) + return ret; + } + + /* + * It's not necessary to "acquire" the OSSL_FNs here, because it's + * assumed that the call of OSSL_FN_add() enters a "OSSL_FN only" bubble. + */ + ret = OSSL_FN_add(r->data, a->data, b->data); + + return ret; +} +``` + +*(This is not perfect and tested code, it's just an example. Actual code +should be more perfect, and of course, tested)* + +Failures +-------- + +[Failures]: #failures + +A fixed size large number introduces new problems, which introduces new ways +that the `OSSL_FN` API can fail: + +* Overflow: this will happen when the caller has allocated an improperly + sized `OSSL_FN` to store future calculation results in. *This is akin to + memory allocation failures in so far that there isn't enough memory space* + +Repurposing existing code +========================= + +[Repurposing existing code]: #repurposing-existing-code + +A majority of existing internal `BIGNUM` code operates directly on the `d` +array of the existing `BIGNUM` structure, with the size of that array given +separately, and are already essentially operating on fixed size numbers. +This design assumes that such functions can be repurposed for `OSSL_FN` +functionality with zero change, apart from function name changes. + +Furthermore, this design assumes that the remaining functions, which do +manipulate the size of the `BIGNUM`, or are public facing `BIGNUM` +functions, can be rewritten in the same way as [the `BN_add()` example +above](#wrapping-an-ossl_fn-function-with-a-bignum-function), thereby +functionally separating the dynamic properties of `BIGNUM`s from the less +dynamic properties of `OSSL_FN`s. + +How to apply `OSSL_FN` +====================== + +[How to apply `OSSL_FN`]: #how-to-apply-ossl_fn + +The purpose of `OSSL_FN` is to make the number constant size (implying +enhanced constant time) for a crypto system. To guarantee this with high +confidence, any function that performs some sort of numeric operation on a +set of input `OSSL_FN`s must only use other functions that only affect the +contents of their `d` array, but not its size. Those are typically other +`OSSL_FN` functions, or reused bignum functions that receive the `d` array +and its size directly. + +Where to apply `OSSL_FN` +======================== + +[Where to apply `OSSL_FN`]: #where-to-apply-ossl_fn + +`OSSL_FN` should primarily be used instead of `BIGNUM` in internal +calculations throughout OpenSSLs libraries. Exceptions can be made where +calculations aren't security critical. + +In this, "calculations" is meant in a mathematical sense, i.e. whatever what +would be expressed as a mathematical formula is considered a "calculation". + +However, `BIGNUM` has other uses than mere calculations. For example, +`BIGNUM` is used as storage of numbers that were originally ASN.1 INTEGERs, +and while individual ASN.1 INTEGERs always have a known size, they are +usually just one number in a set, and it's often only known at a later time +what are the size requirements of the cryptosystem that use them. +For example, the size of an RSA key can only be determined when a known +number in that key - usually *n* - has been seen by code, and this affects +what size all numbers in an RSA key should be adjusted to before doing +calculations on them. + +How to apply `OSSL_FN_CTX` +========================== + +[How to apply `OSSL_FN_CTX`]: #how-to-apply-ossl_fn_ctx + +The variant with frames +----------------------- + +[The variant with frames]: #the-variant-with-frames + +All internal uses of `BN_CTX_new()` and `BN_CTX_new_ex()` are to be replaced +with calls of `OSSL_FN_CTX_new()`. + +All internal uses of `BN_CTX_secure_new()` and `BN_CTX_secure_new_ex()` are to +be replaced with calls of `OSSL_FN_CTX_secure_new()`. + +All internal uses of `BN_CTX_free()` are to be replaced with calls of +`OSSL_FN_CTX_free()`. + +All internal uses of `BN_CTX_start()` are to be replaced with calls of +`OSSL_FN_CTX_start()`. + +All internal uses of `BN_CTX_get()` are to be replaced with calls of +`OSSL_FN_CTX_get()`. + +All internal uses of `BN_CTX_end()` are to be replaced with calls of +`OSSL_FN_CTX_end()`. + +The variant without frames +-------------------------- + +[The variant without frames]: #the-variant-without-frames + +All internal uses of `BN_CTX_new()`, `BN_CTX_new_ex()`, `BN_CTX_secure_new()`, +`BN_CTX_secure_new_ex()`, and `BN_CTX_free()` are to be dropped. + +All internal uses of `BN_CTX_start()` are to be replaced with calls of +`OSSL_FN_CTX_new()`. + +All internal uses of `BN_CTX_get()` are to be replaced with calls of +`OSSL_FN_CTX_get()`. + +All internal uses of `BN_CTX_end()` are to be replaced with calls of +`OSSL_FN_CTX_free()`. + +Testing +======= + +[Testing]: #testing + +Functional tests similar to `test/recipes/10-test_bn.t` must be added. + +Timing tests to compare operations on a variety of inputs of different sizes +must also be added. These tests should perform operations based on a given +fixed number size. + +It should also prove interesting to collect timing statistics for a set of +operations using `BIGNUM` in previous OpenSSL versions and compare them with +similar timing statistics using `BIGNUM` when reimplemented according to this +design. It is *assumed* that the new statistics will show a higher degree +of constant time, [due to `top` being dropped](#dropping-top-from-bignum), +even though not as much as pure `OSSL_FN` operations. + +Appendix +======== + +[Appendix]: #appendix + +Using the C99 flexible array member feature +------------------------------------------- + +[Using the C99 flexible array member feature]: #using-the-c99-flexible-array-member-feature + +In this design, the C99 feature that's dubbed "flexible array member" is used +extensively. This a `struct` member that's an array, that must come last in +the struct, and that is incomplete in so far that no array size is given. It +can look like this: + +``` C +struct t { + size_t a; + char b; + char c[]; /**< flexible array member */ +}; +``` + +Some attention must be payed to how it's arranged in memory. It's debated +whether the offset of a flexible array member's offset from the start of the +`struct` is set to be before or after the `struct`'s end padding, i.e. whether +`sizeof(struct t) == offsetof(struct t, c)` is true or not in all circumstances. + +Here's how that would differ on a 64-bit system: + +| location of `c` | `offsetof(struct t, a)` | `offsetof(struct t, b)` | `offsetof(struct t, c)` | `sizeof(struct t)` | +|-----------------|:-----------------------:|:-----------------------:|:-----------------------:|:------------------:| +| before padding | 0 | 8 | 9 | 16 | +| after padding | 0 | 8 | 16 | 16 | + +To be noted, `gcc` and `clang` favor "before padding". + +For consistent placement of the flexible array member, one therefore needs to +pay attention to possible `struct` padding. Among other methods, one chosen +here is to precede the flexible array member with a member whose type is +assumed to be large enough that no padding is needed after it, such as +`size_t` or a pointer. From a5b9c8d60f6b91dbd1688e16d565b43420645b36 Mon Sep 17 00:00:00 2001 From: Richard Levitte Date: Wed, 8 Oct 2025 15:29:09 +0200 Subject: [PATCH 02/69] Fix spelling in doc/designs/fixed-size-large-numbers.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Found by codespell. payed → paid Reviewed-by: Frederik Wedel-Heinen Reviewed-by: Shane Lontis (Merged from https://github.com/openssl/openssl/pull/28787) --- doc/designs/fixed-size-large-numbers.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/designs/fixed-size-large-numbers.md b/doc/designs/fixed-size-large-numbers.md index dbcf3640ee..82c87a38a2 100644 --- a/doc/designs/fixed-size-large-numbers.md +++ b/doc/designs/fixed-size-large-numbers.md @@ -690,7 +690,7 @@ struct t { }; ``` -Some attention must be payed to how it's arranged in memory. It's debated +Some attention must be paid to how it's arranged in memory. It's debated whether the offset of a flexible array member's offset from the start of the `struct` is set to be before or after the `struct`'s end padding, i.e. whether `sizeof(struct t) == offsetof(struct t, c)` is true or not in all circumstances. From 584e7138af0ab90be4e97c5bb1959ccafe633b22 Mon Sep 17 00:00:00 2001 From: Richard Levitte Date: Wed, 8 Oct 2025 14:56:34 +0200 Subject: [PATCH 03/69] Add the fixed number type (OSSL_FN) and its allocators and deallocator This includes a small test program that performs introspection of the OSSL_FN, to check that diverse functions do what's expected of them. For future compatibility reasons, the limb type OSSL_FN_ULONG is based on BN_ULONG. This caused a slight rearrangement of public BIGNUM related headers. Note: experiments with changing the current BIGNUM's 'dmax' and 'top' to be "size_t" has shown disastrous effects, due to some lower level functions assuming that they'll receive the size in "int" form rather than "size_t" form (on some major platforms, these two types have different sizes). Therefore, this change deviates slightly from the design for fixed numbers (doc/designs/fixed-size-large-numbers.md) by making OSSL_FN's 'dsize' an "int" rather than a "size_t". Related-to: doc/designs/fixed-size-large-numbers.md Resolves: https://github.com/openssl/project/issues/1649 Reviewed-by: Matt Caswell Reviewed-by: Tomas Mraz (Merged from https://github.com/openssl/openssl/pull/28784) --- crypto/build.info | 2 +- crypto/fn/build.info | 8 ++ crypto/fn/fn_lib.c | 121 +++++++++++++++++++++++++++ crypto/fn/fn_local.h | 35 ++++++++ include/crypto/fn.h | 128 +++++++++++++++++++++++++++++ include/crypto/types.h | 3 + include/openssl/bn.h | 23 +----- include/openssl/bn_limbs.h | 48 +++++++++++ test/build.info | 5 ++ test/fn_internal_test.c | 97 ++++++++++++++++++++++ test/recipes/03-test_internal_fn.t | 19 +++++ 11 files changed, 466 insertions(+), 23 deletions(-) create mode 100644 crypto/fn/build.info create mode 100644 crypto/fn/fn_lib.c create mode 100644 crypto/fn/fn_local.h create mode 100644 include/crypto/fn.h create mode 100644 include/openssl/bn_limbs.h create mode 100644 test/fn_internal_test.c create mode 100644 test/recipes/03-test_internal_fn.t diff --git a/crypto/build.info b/crypto/build.info index 8e4a885dde..b5891b553f 100644 --- a/crypto/build.info +++ b/crypto/build.info @@ -4,7 +4,7 @@ SUBDIRS=objects buffer bio stack lhash hashtable rand evp asn1 pem x509 conf \ txt_db pkcs7 pkcs12 ui kdf store property \ md2 md4 md5 sha mdc2 ml_kem hmac ripemd whrlpool poly1305 \ siphash sm3 des aes rc2 rc4 rc5 idea aria bf cast camellia \ - seed sm4 chacha modes bn ec rsa dsa dh sm2 dso \ + seed sm4 chacha modes fn bn ec rsa dsa dh sm2 dso \ err comp http ocsp cms ts srp cmac ct async ess crmf cmp encode_decode \ ffc hpke thread lms ml_dsa slh_dsa diff --git a/crypto/fn/build.info b/crypto/fn/build.info new file mode 100644 index 0000000000..218e4b01e5 --- /dev/null +++ b/crypto/fn/build.info @@ -0,0 +1,8 @@ +$LIBCRYPTO=../../libcrypto +$LIBFIPS=../../providers/libfips.a +LIBS=$LIBCRYPTO + +$COMMON=fn_lib.c + +SOURCE[$LIBCRYPTO]=$COMMON +SOURCE[$LIBFIPS]=$COMMON diff --git a/crypto/fn/fn_lib.c b/crypto/fn/fn_lib.c new file mode 100644 index 0000000000..87da4c2a91 --- /dev/null +++ b/crypto/fn/fn_lib.c @@ -0,0 +1,121 @@ +/* + * Copyright 2025 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#include +#include +#include +#include +#include "internal/common.h" +#include "fn_local.h" + +static OSSL_FN *ossl_fn_new_internal(size_t limbs, bool securely) +{ + /* + * Since the number of limbs is represented as an 'int' in OSSL_FN, + * we must ensure that the desired size isn't larger than can be + * represented. + */ + if (ossl_unlikely(limbs >= INT_MAX)) + return NULL; + + /* Total size of the whole OSSL_FN, in bytes */ + size_t totalsize = sizeof(OSSL_FN) + limbs * sizeof(OSSL_FN_ULONG); + + /* + * If the size ends up being smaller than the bookkeeping struct, + * we know that the size calculation has wrapped around and is + * therefore invalid. Also, we don't allow zero byte numbers. + */ + if (totalsize <= sizeof(OSSL_FN)) + return NULL; + + OSSL_FN *ret = NULL; + + if (securely) + ret = OPENSSL_secure_zalloc(totalsize); + else + ret = OPENSSL_zalloc(totalsize); + + if (ret != NULL) { + ret->dsize = (int)limbs; + ret->is_dynamically_allocated = 1; + ret->is_securely_allocated = securely; + } + return ret; +} + +static void ossl_fn_free_internal(OSSL_FN *f, bool clear) +{ + if (f == NULL) + return; + + size_t limbssize = f->dsize * sizeof(OSSL_FN_ULONG); + size_t totalsize = limbssize + sizeof(OSSL_FN); + + if (f->is_dynamically_allocated) { + if (f->is_securely_allocated) + OPENSSL_secure_clear_free(f, totalsize); + else if (clear) + OPENSSL_clear_free(f, totalsize); + else + OPENSSL_free(f); + } else if (clear) { + OPENSSL_cleanse(f->d, limbssize); + } +} + +OSSL_FN *OSSL_FN_new_limbs(size_t size) +{ + return ossl_fn_new_internal(size, false); +} + +OSSL_FN *OSSL_FN_secure_new_limbs(size_t size) +{ + return ossl_fn_new_internal(size, true); +} + +static size_t bytes_to_limbs(size_t size) +{ + return (size + sizeof(OSSL_FN_ULONG) - 1) / sizeof(OSSL_FN_ULONG); +} + +OSSL_FN *OSSL_FN_new_bytes(size_t size) +{ + return OSSL_FN_new_limbs(bytes_to_limbs(size)); +} + +OSSL_FN *OSSL_FN_secure_new_bytes(size_t size) +{ + return OSSL_FN_secure_new_limbs(bytes_to_limbs(size)); +} + +static size_t bits_to_bytes(size_t size) +{ + return (size + 7) / 8; +} + +OSSL_FN *OSSL_FN_new_bits(size_t size) +{ + return OSSL_FN_new_bytes(bits_to_bytes(size)); +} + +OSSL_FN *OSSL_FN_secure_new_bits(size_t size) +{ + return OSSL_FN_secure_new_bytes(bits_to_bytes(size)); +} + +void OSSL_FN_free(OSSL_FN *f) +{ + ossl_fn_free_internal(f, false); +} + +void OSSL_FN_clear_free(OSSL_FN *f) +{ + ossl_fn_free_internal(f, true); +} diff --git a/crypto/fn/fn_local.h b/crypto/fn/fn_local.h new file mode 100644 index 0000000000..d20b46c6a4 --- /dev/null +++ b/crypto/fn/fn_local.h @@ -0,0 +1,35 @@ +/* + * Copyright 2025 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef OSSL_CRYPTO_FN_LOCAL_H +#define OSSL_CRYPTO_FN_LOCAL_H + +#include +#include "crypto/fn.h" + +struct ossl_fn_st { + /* Flag: alloced with OSSL_FN_new() or OSSL_FN_secure_new() */ + unsigned int is_dynamically_allocated : 1; + /* Flag: alloced with OSSL_FN_secure_new() */ + unsigned int is_securely_allocated : 1; + + /* + * The d array, with its size in number of OSSL_FN_ULONG. + * This stores the number itself. + * + * Note: |dsize| is an int, because it turns out that some lower level + * (possibly assembler) functions expect that type (especially, that + * type size). + * This deviates from the design in doc/designs/fixed-size-large-numbers.md + */ + int dsize; + OSSL_FN_ULONG d[]; +}; + +#endif diff --git a/include/crypto/fn.h b/include/crypto/fn.h new file mode 100644 index 0000000000..5c3a8f01ea --- /dev/null +++ b/include/crypto/fn.h @@ -0,0 +1,128 @@ +/* + * Copyright 2025 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef OPENSSL_FN_H +#define OPENSSL_FN_H +#pragma once + +#include +#include +#include +#include "crypto/types.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * @type OSSL_FN_ULONG is the type for the OSSL_FN limb. It's made to be + * compatible with BN_ULONG (quite literally). + * + * @def OSSL_FN_BYTES is defined with the size of OSSL_FN_ULONG, measured in + * bytes. This is mainly useful where 'sizeof(OSSL_FN_ULONG)' isn't suitable, + * such as the C pre-processor. + */ + +#ifdef BN_BYTES +typedef BN_ULONG OSSL_FN_ULONG; +#define OSSL_FN_BYTES BN_BYTES +#endif + +#ifndef OSSL_FN_BYTES +#error "OpenSSL doesn't support large numbers on this platform" +#endif + +/* + * For practical reasons, we allow allocating OSSL_FNs in terms of limbs (what + * the BIGNUM library calls "words"), bytes and bits. The number of bytes and + * bits are rounded up to the number of limbs that can fit them. + */ + +/** + * Allocate an OSSL_FN in memory. + * + * @param[in] size The number of limbs for the number itself. + * There's an additional few bytes allocated for bookkeeping. + * @returns an OSSL_FN instance. + * @retval NULL on error. + */ +OSSL_FN *OSSL_FN_new_limbs(size_t size); + +/** + * Allocate an OSSL_FN in secure memory. + * + * @param[in] size The number of limbs for the number itself. + * There's an additional few bytes allocated for bookkeeping. + * @returns an OSSL_FN instance. + * @retval NULL on error. + */ +OSSL_FN *OSSL_FN_secure_new_limbs(size_t size); + +/** + * Allocate an OSSL_FN in memory. + * + * @param[in] size The number of bytes for the number itself. + * There's an additional few bytes allocated for bookkeeping. + * @returns an OSSL_FN instance. + * @retval NULL on error. + */ +OSSL_FN *OSSL_FN_new_bytes(size_t size); + +/** + * Allocate an OSSL_FN in secure memory. + * + * @param[in] size The number of bytes for the number itself. + * There's an additional few bytes allocated for bookkeeping. + * @returns an OSSL_FN instance. + * @retval NULL on error. + */ +OSSL_FN *OSSL_FN_secure_new_bytes(size_t size); + +/** + * Allocate an OSSL_FN in memory. + * + * @param[in] size The number of bits for the number itself. + * There's an additional few bytes allocated for bookkeeping. + * @returns an OSSL_FN instance. + * @retval NULL on error. + */ +OSSL_FN *OSSL_FN_new_bits(size_t size); + +/** + * Allocate an OSSL_FN in secure memory. + * + * @param[in] size The number of bits for the number itself. + * There's an additional few bytes allocated for bookkeeping. + * @returns an OSSL_FN instance. + * @retval NULL on error. + */ +OSSL_FN *OSSL_FN_secure_new_bits(size_t size); + +/** + * Free an OSSL_FN instance if it was dynamically allocated. + * Free it securely if it was allocated securely. + * + * @param[in] f The OSSL_FN instance to be freed. + */ +void OSSL_FN_free(OSSL_FN *f); + +/** + * Cleanse and free an OSSL_FN instance if it was dynamically allocated. + * Cleanse and free it securely if it was allocated securely. + * Merely cleanse it if it was not dynamically allocated. + * + * @param[in] f The OSSL_FN instance to be freed. + */ +void OSSL_FN_clear_free(OSSL_FN *f); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/include/crypto/types.h b/include/crypto/types.h index 8a9d0029d4..9ff8db69c4 100644 --- a/include/crypto/types.h +++ b/include/crypto/types.h @@ -13,6 +13,9 @@ #define OSSL_CRYPTO_TYPES_H #pragma once +/* At some point in the future, this may move to include/openssl/types.h */ +typedef struct ossl_fn_st OSSL_FN; + #ifdef OPENSSL_NO_DEPRECATED_3_0 typedef struct rsa_st RSA; typedef struct rsa_meth_st RSA_METHOD; diff --git a/include/openssl/bn.h b/include/openssl/bn.h index 5d7e5ce83f..d7eaa22736 100644 --- a/include/openssl/bn.h +++ b/include/openssl/bn.h @@ -21,36 +21,15 @@ #ifndef OPENSSL_NO_STDIO #include #endif -#include #include #include #include +#include #ifdef __cplusplus extern "C" { #endif -/* - * 64-bit processor with LP64 ABI - */ -#ifdef SIXTY_FOUR_BIT_LONG -typedef unsigned long BN_ULONG; -#define BN_BYTES 8 -#endif - -/* - * 64-bit processor other than LP64 ABI - */ -#ifdef SIXTY_FOUR_BIT -typedef unsigned long long BN_ULONG; -#define BN_BYTES 8 -#endif - -#ifdef THIRTY_TWO_BIT -typedef unsigned int BN_ULONG; -#define BN_BYTES 4 -#endif - #define BN_BITS2 (BN_BYTES * 8) #define BN_BITS (BN_BITS2 * 2) #define BN_TBIT ((BN_ULONG)1 << (BN_BITS2 - 1)) diff --git a/include/openssl/bn_limbs.h b/include/openssl/bn_limbs.h new file mode 100644 index 0000000000..ed440d95ba --- /dev/null +++ b/include/openssl/bn_limbs.h @@ -0,0 +1,48 @@ +/* + * Copyright 2025 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +/** + * @file Defines the type of large integer limbs. + * + * The large number is composed of words, the size of which is assumed to + * be optimal for the platform it's built for. In many large number texts, + * these words are called "limb". The BIGNUM library also calls this "word". + * + * In OpenSSL code, the BIGNUM "limb" is represented with the type macro + * BN_ULONG. + */ + +#ifndef OPENSSL_BN_LIMBS_H +#define OPENSSL_BN_LIMBS_H +#pragma once + +#include + +/* + * 64-bit processor with LP64 ABI + */ +#ifdef SIXTY_FOUR_BIT_LONG +typedef unsigned long BN_ULONG; +#define BN_BYTES 8 +#endif + +/* + * 64-bit processor other than LP64 ABI + */ +#ifdef SIXTY_FOUR_BIT +typedef unsigned long long BN_ULONG; +#define BN_BYTES 8 +#endif + +#ifdef THIRTY_TWO_BIT +typedef unsigned int BN_ULONG; +#define BN_BYTES 4 +#endif + +#endif diff --git a/test/build.info b/test/build.info index 43812e3989..743c4a2c3a 100644 --- a/test/build.info +++ b/test/build.info @@ -1127,6 +1127,11 @@ IF[{- !$disabled{tests} -}] DEPEND[rsa_x931_test]=../libcrypto.a libtestutil.a ENDIF + PROGRAMS{noinst}=fn_internal_test + SOURCE[fn_internal_test]=fn_internal_test.c + INCLUDE[fn_internal_test]=.. ../include ../crypto/fn ../apps/include + DEPEND[fn_internal_test]=../libcrypto.a libtestutil.a + SOURCE[bn_internal_test]=bn_internal_test.c INCLUDE[bn_internal_test]=.. ../include ../crypto/bn ../apps/include DEPEND[bn_internal_test]=../libcrypto.a libtestutil.a diff --git a/test/fn_internal_test.c b/test/fn_internal_test.c new file mode 100644 index 0000000000..fd3f17f030 --- /dev/null +++ b/test/fn_internal_test.c @@ -0,0 +1,97 @@ +/* + * Copyright 2025 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +/** + * @file Internal tests of OSSL_FN + * + * This tests OSSL_FN internals only, i.e. anything that requires including + * ../crypto/fn/fn_local.h, such as introspection. + */ + +#include "crypto/fn.h" +#include "fn_local.h" +#include "testutil.h" + +static int test_struct(void) +{ + TEST_note("OSSL_FN struct is %zu bytes\n", sizeof(OSSL_FN)); + TEST_note("OSSL_FN 'd' array starts at offset %zu\n", offsetof(OSSL_FN, d)); + + /* + * Note: The working theory for the moment is that the 'd' array *must* + * align with the end of the OSSL_FN struct. + * If it turns out that this isn't the case, we can choose to run + * TEST_size_t_eq() for display purposes, but ignore its result and + * return 1. + */ + return TEST_size_t_eq(sizeof(OSSL_FN), offsetof(OSSL_FN, d)); +} + +static int test_alloc(void) +{ + int ret = 1; + OSSL_FN *f = NULL; + + /* + * OSSL_FN_new_bits() calls OSSL_FN_new_bytes(), which calls + * OSSL_FN_new_limbs(), so we're exercising all three in one go. + * + * The curious size formula is there to check that the number of bits that + * is passed in gets properly rounded up to the number of limbs they fit + * into. + * This formula aims for two limbs (each of which is at least 32 bits), + * shaving off 17 bits for demonstration purposes. + */ + if (!TEST_ptr(f = OSSL_FN_new_bits(sizeof(OSSL_FN_ULONG) * 16 - 17)) + || !TEST_uint_eq(f->is_dynamically_allocated, 1) + || !TEST_uint_eq(f->is_securely_allocated, 0) + || !TEST_int_eq(f->dsize, 2) + || !TEST_size_t_eq(f->d[0], 0) + || !TEST_size_t_eq(f->d[1], 0)) + ret = 0; + OSSL_FN_free(f); + + return ret; +} + +static int test_secure_alloc(void) +{ + int ret = 1; + OSSL_FN *f = NULL; + + /* + * OSSL_FN_secure_new_bits() calls OSSL_FN_secure_new_bytes(), which calls + * OSSL_FN_secure_new_limbs(), so we're exercising all three in one go. + * + * The curious size formula is there to check that the number of bits that + * is passed in gets properly rounded up to the number of limbs they fit + * into. + * This formula aims for two limbs (each of which is at least 32 bits), + * shaving off 17 bits for demonstration purposes. + */ + if (!TEST_ptr(f = OSSL_FN_secure_new_bits(sizeof(OSSL_FN_ULONG) * 16 - 17)) + || !TEST_uint_eq(f->is_dynamically_allocated, 1) + || !TEST_uint_eq(f->is_securely_allocated, 1) + || !TEST_int_eq(f->dsize, 2) + || !TEST_size_t_eq(f->d[0], 0) + || !TEST_size_t_eq(f->d[1], 0)) + ret = 0; + OSSL_FN_free(f); + + return ret; +} + +int setup_tests(void) +{ + ADD_TEST(test_struct); + ADD_TEST(test_alloc); + ADD_TEST(test_secure_alloc); + + return 1; +} diff --git a/test/recipes/03-test_internal_fn.t b/test/recipes/03-test_internal_fn.t new file mode 100644 index 0000000000..46a477f000 --- /dev/null +++ b/test/recipes/03-test_internal_fn.t @@ -0,0 +1,19 @@ +#! /usr/bin/env perl +# Copyright 2025 The OpenSSL Project Authors. All Rights Reserved. +# +# Licensed under the Apache License 2.0 (the "License"). You may not use +# this file except in compliance with the License. You can obtain a copy +# in the file LICENSE in the source distribution or at +# https://www.openssl.org/source/license.html + +use strict; +use OpenSSL::Test; # get 'plan' +use OpenSSL::Test::Simple; +use OpenSSL::Test::Utils; + +setup("test_internal_fn"); + +plan skip_all => "This test is unsupported in a shared library build on Windows" + if $^O eq 'MSWin32' && !disabled("shared"); + +simple_test("test_internal_fn", "fn_internal_test"); From 2a691a034ea742aad155eb752b8d3074af589508 Mon Sep 17 00:00:00 2001 From: Richard Levitte Date: Wed, 15 Oct 2025 14:06:34 +0200 Subject: [PATCH 04/69] First integration of OSSL_FN into BIGNUM This integration is made in such a way that OSSL_FN is an optional 'data' field in BIGNUM, i.e. it's allowed to be NULL even though the BIGNUM's 'd' field is non-NULL. The public BIGNUM API will do what it can to ensure that the 'data' field becomes non-NULL, but remains lax on input BIGNUMs, for now. This allows diverse internal bn constants and hacks to continue to function with minimal friction. These constants and hacks will incrementally be modified to use OSSL_FN where they currently use BN_ULONG. Related-to: doc/designs/fixed-size-large-numbers.md Resolves: https://github.com/openssl/openssl/issues/28931 Reviewed-by: Matt Caswell Reviewed-by: Tomas Mraz (Merged from https://github.com/openssl/openssl/pull/28930) --- crypto/bn/bn_dh.c | 77 +++++++++++++++--------------- crypto/bn/bn_exp.c | 2 +- crypto/bn/bn_intern.c | 1 + crypto/bn/bn_lib.c | 80 ++++++++++++++++++++++---------- crypto/bn/bn_local.h | 51 ++++++++++++-------- crypto/bn/bn_nist.c | 85 ++++++++++++++++------------------ crypto/bn/bn_prime.c | 9 ++-- crypto/bn/bn_rsa_fips186_5.c | 9 ++-- crypto/bn/bn_srp.c | 90 ++++++++++++++++-------------------- crypto/fn/fn_lib.c | 7 +++ crypto/fn/fn_local.h | 32 +++++++++++++ include/crypto/bn.h | 1 + include/crypto/fn.h | 7 +++ 13 files changed, 264 insertions(+), 187 deletions(-) diff --git a/crypto/bn/bn_dh.c b/crypto/bn/bn_dh.c index 1630be9191..ee948095dd 100644 --- a/crypto/bn/bn_dh.c +++ b/crypto/bn/bn_dh.c @@ -1374,50 +1374,53 @@ static const BN_ULONG ffdhe8192_q[] = { #define make_dh_bn(x) \ extern const BIGNUM ossl_bignum_##x; \ const BIGNUM ossl_bignum_##x = { \ - (BN_ULONG *)x, \ - OSSL_NELEM(x), \ - OSSL_NELEM(x), \ - 0, BN_FLG_STATIC_DATA \ - }; + .d = (BN_ULONG *)x, \ + .top = OSSL_NELEM(x), \ + .dmax = OSSL_NELEM(x), \ + .flags = BN_FLG_STATIC_DATA, \ + } static const BN_ULONG value_2 = 2; const BIGNUM ossl_bignum_const_2 = { - (BN_ULONG *)&value_2, 1, 1, 0, BN_FLG_STATIC_DATA + .d = (BN_ULONG *)&value_2, + .top = 1, + .dmax = 1, + .flags = BN_FLG_STATIC_DATA, }; -make_dh_bn(dh1024_160_p) -make_dh_bn(dh1024_160_q) -make_dh_bn(dh1024_160_g) -make_dh_bn(dh2048_224_p) -make_dh_bn(dh2048_224_q) -make_dh_bn(dh2048_224_g) -make_dh_bn(dh2048_256_p) -make_dh_bn(dh2048_256_q) -make_dh_bn(dh2048_256_g) +make_dh_bn(dh1024_160_p); +make_dh_bn(dh1024_160_q); +make_dh_bn(dh1024_160_g); +make_dh_bn(dh2048_224_p); +make_dh_bn(dh2048_224_q); +make_dh_bn(dh2048_224_g); +make_dh_bn(dh2048_256_p); +make_dh_bn(dh2048_256_q); +make_dh_bn(dh2048_256_g); -make_dh_bn(ffdhe2048_p) -make_dh_bn(ffdhe2048_q) -make_dh_bn(ffdhe3072_p) -make_dh_bn(ffdhe3072_q) -make_dh_bn(ffdhe4096_p) -make_dh_bn(ffdhe4096_q) -make_dh_bn(ffdhe6144_p) -make_dh_bn(ffdhe6144_q) -make_dh_bn(ffdhe8192_p) -make_dh_bn(ffdhe8192_q) +make_dh_bn(ffdhe2048_p); +make_dh_bn(ffdhe2048_q); +make_dh_bn(ffdhe3072_p); +make_dh_bn(ffdhe3072_q); +make_dh_bn(ffdhe4096_p); +make_dh_bn(ffdhe4096_q); +make_dh_bn(ffdhe6144_p); +make_dh_bn(ffdhe6144_q); +make_dh_bn(ffdhe8192_p); +make_dh_bn(ffdhe8192_q); #ifndef FIPS_MODULE -make_dh_bn(modp_1536_p) -make_dh_bn(modp_1536_q) +make_dh_bn(modp_1536_p); +make_dh_bn(modp_1536_q); #endif -make_dh_bn(modp_2048_p) -make_dh_bn(modp_2048_q) -make_dh_bn(modp_3072_p) -make_dh_bn(modp_3072_q) -make_dh_bn(modp_4096_p) -make_dh_bn(modp_4096_q) -make_dh_bn(modp_6144_p) -make_dh_bn(modp_6144_q) -make_dh_bn(modp_8192_p) -make_dh_bn(modp_8192_q) +make_dh_bn(modp_2048_p); +make_dh_bn(modp_2048_q); +make_dh_bn(modp_3072_p); +make_dh_bn(modp_3072_q); +make_dh_bn(modp_4096_p); +make_dh_bn(modp_4096_q); +make_dh_bn(modp_6144_p); +make_dh_bn(modp_6144_q); +make_dh_bn(modp_8192_p); +make_dh_bn(modp_8192_q); diff --git a/crypto/bn/bn_exp.c b/crypto/bn/bn_exp.c index c3bd5e7b5d..6618113e88 100644 --- a/crypto/bn/bn_exp.c +++ b/crypto/bn/bn_exp.c @@ -612,7 +612,7 @@ int bn_mod_exp_mont_fixed_top(BIGNUM *rr, const BIGNUM *a, const BIGNUM *p, unsigned char *powerbufFree = NULL; int powerbufLen = 0; unsigned char *powerbuf = NULL; - BIGNUM tmp, am; + BIGNUM tmp = { .data = NULL }, am = { .data = NULL }; #if defined(SPARC_T4_MONT) unsigned int t4 = 0; #endif diff --git a/crypto/bn/bn_intern.c b/crypto/bn/bn_intern.c index f963d42b86..e369a167b9 100644 --- a/crypto/bn/bn_intern.c +++ b/crypto/bn/bn_intern.c @@ -174,6 +174,7 @@ void bn_set_static_words(BIGNUM *a, const BN_ULONG *words, int size) * |const| qualifier omission is compensated by BN_FLG_STATIC_DATA * flag, which effectively means "read-only data". */ + a->data = NULL; a->d = (BN_ULONG *)words; a->dmax = a->top = size; a->neg = 0; diff --git a/crypto/bn/bn_lib.c b/crypto/bn/bn_lib.c index 84d5151b62..8787817488 100644 --- a/crypto/bn/bn_lib.c +++ b/crypto/bn/bn_lib.c @@ -9,11 +9,14 @@ #include #include +#include +#include +#include #include "internal/cryptlib.h" #include "internal/endian.h" -#include "bn_local.h" -#include #include "internal/constant_time.h" +#include "crypto/fn.h" +#include "bn_local.h" /* This stuff appears to be completely unused, so is deprecated */ #ifndef OPENSSL_NO_DEPRECATED_0_9_8 @@ -83,7 +86,10 @@ const BIGNUM *BN_value_one(void) { static const BN_ULONG data_one = 1L; static const BIGNUM const_one = { - (BN_ULONG *)&data_one, 1, 1, 0, BN_FLG_STATIC_DATA + .d = (BN_ULONG *)&data_one, + .top = 1, + .dmax = 1, + .flags = BN_FLG_STATIC_DATA, }; return &const_one; @@ -199,7 +205,7 @@ int BN_num_bits(const BIGNUM *a) return ((i * BN_BITS2) + BN_num_bits_word(a->d[i])); } -static void bn_free_d(BIGNUM *a, int clear) +static void bn_free_d(BIGNUM *a, bool clear) { if (BN_get_flags(a, BN_FLG_SECURE)) OPENSSL_secure_clear_free(a->d, a->dmax * sizeof(a->d[0])); @@ -213,8 +219,12 @@ void BN_clear_free(BIGNUM *a) { if (a == NULL) return; - if (a->d != NULL && !BN_get_flags(a, BN_FLG_STATIC_DATA)) - bn_free_d(a, 1); + if (!BN_get_flags(a, BN_FLG_STATIC_DATA)) { + if (a->data != NULL) + OSSL_FN_clear_free(a->data); + else + bn_free_d(a, true); + } if (BN_get_flags(a, BN_FLG_MALLOCED)) { OPENSSL_cleanse(a, sizeof(*a)); OPENSSL_free(a); @@ -225,8 +235,12 @@ void BN_free(BIGNUM *a) { if (a == NULL) return; - if (!BN_get_flags(a, BN_FLG_STATIC_DATA)) - bn_free_d(a, 0); + if (!BN_get_flags(a, BN_FLG_STATIC_DATA)) { + if (a->data != NULL) + OSSL_FN_free(a->data); + else + bn_free_d(a, false); + } if (a->flags & BN_FLG_MALLOCED) OPENSSL_free(a); } @@ -261,9 +275,9 @@ BIGNUM *BN_secure_new(void) /* This is used by bn_expand2() */ /* The caller MUST check that words > b->dmax before calling this */ -static BN_ULONG *bn_expand_internal(const BIGNUM *b, int words) +static OSSL_FN *bn_expand_internal(const BIGNUM *b, int words) { - BN_ULONG *a = NULL; + OSSL_FN *a = NULL; if (ossl_unlikely(words > (INT_MAX / (4 * BN_BITS2)))) { ERR_raise(ERR_LIB_BN, BN_R_BIGNUM_TOO_LONG); @@ -274,15 +288,19 @@ static BN_ULONG *bn_expand_internal(const BIGNUM *b, int words) return NULL; } if (BN_get_flags(b, BN_FLG_SECURE)) - a = OPENSSL_secure_calloc(words, sizeof(*a)); + a = OSSL_FN_secure_new_limbs(words); else - a = OPENSSL_calloc(words, sizeof(*a)); + a = OSSL_FN_new_limbs(words); if (ossl_unlikely(a == NULL)) return NULL; assert(b->top <= words); - if (b->top > 0) - memcpy(a, b->d, sizeof(*a) * b->top); + if (b->top > 0) { + if (b->data != NULL) + ossl_fn_copy_internal(a, b->data, -1); + else if (b->d != NULL) + ossl_fn_copy_internal_limbs(a, b->d, b->top); + } return a; } @@ -298,14 +316,18 @@ static BN_ULONG *bn_expand_internal(const BIGNUM *b, int words) BIGNUM *bn_expand2(BIGNUM *b, int words) { if (ossl_likely(words > b->dmax)) { - BN_ULONG *a = bn_expand_internal(b, words); + OSSL_FN *a = bn_expand_internal(b, words); if (ossl_unlikely(!a)) return NULL; - if (b->d != NULL) - bn_free_d(b, 1); - b->d = a; - b->dmax = words; + if (b->data != NULL) + OSSL_FN_clear_free(b->data); + else if (b->d != NULL) + bn_free_d(b, true); + b->data = a; + /* TODO(FIXNUM) The following is TO BE REMOVED */ + b->d = b->data->d; + b->dmax = b->data->dsize; } return b; @@ -343,9 +365,12 @@ BIGNUM *BN_copy(BIGNUM *a, const BIGNUM *b) if (ossl_unlikely(bn_wexpand(a, bn_words) == NULL)) return NULL; - if (ossl_likely(b->top > 0)) - memcpy(a->d, b->d, sizeof(b->d[0]) * bn_words); - + if (ossl_likely(bn_words > 0)) { + if (b->data != NULL) + ossl_fn_copy_internal(a->data, b->data, bn_words); + else if (b->d != NULL) + ossl_fn_copy_internal_limbs(a->data, b->d, bn_words); + } a->neg = b->neg; a->top = b->top; a->flags |= b->flags & BN_FLG_FIXED_TOP; @@ -359,6 +384,7 @@ BIGNUM *BN_copy(BIGNUM *a, const BIGNUM *b) void BN_swap(BIGNUM *a, BIGNUM *b) { int flags_old_a, flags_old_b; + OSSL_FN *tmp_data; BN_ULONG *tmp_d; int tmp_top, tmp_dmax, tmp_neg; @@ -368,16 +394,19 @@ void BN_swap(BIGNUM *a, BIGNUM *b) flags_old_a = a->flags; flags_old_b = b->flags; + tmp_data = a->data; tmp_d = a->d; tmp_top = a->top; tmp_dmax = a->dmax; tmp_neg = a->neg; + a->data = b->data; a->d = b->d; a->top = b->top; a->dmax = b->dmax; a->neg = b->neg; + b->data = tmp_data; b->d = tmp_d; b->top = tmp_top; b->dmax = tmp_dmax; @@ -394,7 +423,9 @@ void BN_clear(BIGNUM *a) if (a == NULL) return; bn_check_top(a); - if (a->d != NULL) + if (a->data != NULL) + OSSL_FN_clear(a->data); + else if (a->d != NULL) OPENSSL_cleanse(a->d, sizeof(*a->d) * a->dmax); a->neg = 0; a->top = 0; @@ -414,7 +445,7 @@ BN_ULONG BN_get_word(const BIGNUM *a) int BN_set_word(BIGNUM *a, BN_ULONG w) { bn_check_top(a); - if (bn_expand(a, (int)sizeof(BN_ULONG) * 8) == NULL) + if (bn_wexpand(a, 1) == NULL) return 0; a->neg = 0; a->d[0] = w; @@ -1081,6 +1112,7 @@ int BN_to_montgomery(BIGNUM *r, const BIGNUM *a, BN_MONT_CTX *mont, void BN_with_flags(BIGNUM *dest, const BIGNUM *b, int flags) { + dest->data = b->data; dest->d = b->d; dest->top = b->top; dest->dmax = b->dmax; diff --git a/crypto/bn/bn_local.h b/crypto/bn/bn_local.h index db02711132..49eb7dd088 100644 --- a/crypto/bn/bn_local.h +++ b/crypto/bn/bn_local.h @@ -15,6 +15,8 @@ #include "internal/numbers.h" #include "crypto/bn.h" +#include "../fn/fn_local.h" + /* * These preprocessor symbols control various aspects of the bignum headers * and library code. They're not defined by any "normal" configuration, as @@ -183,18 +185,19 @@ typedef unsigned long long BN_ULLONG; #else #define bn_pollute(a) #endif -#define bn_check_top(a) \ - do { \ - const BIGNUM *_bnum2 = (a); \ - if (_bnum2 != NULL) { \ - int _top = _bnum2->top; \ - if (_top == 0) { \ - assert(!_bnum2->neg); \ - } else if ((_bnum2->flags & BN_FLG_FIXED_TOP) == 0) { \ - assert(_bnum2->d[_top - 1] != 0); \ - } \ - bn_pollute(_bnum2); \ - } \ +#define bn_check_top(a) \ + do { \ + const BIGNUM *_bnum2 = (a); \ + if (_bnum2 != NULL) { \ + int _top = _bnum2->top; \ + /* BIGNUM <-> OSSL_FN compat checks */ \ + assert((_bnum2->data == NULL /* && _bnum2->d == NULL */) \ + || (_bnum2->d == _bnum2->data->d \ + && _bnum2->dmax == _bnum2->data->dsize)); \ + /* BIGNUM specific checks */ \ + assert((_top == 0 && !_bnum2->neg) || (_top && ((_bnum2->flags & BN_FLG_FIXED_TOP) || _bnum2->d[_top - 1] != 0))); \ + bn_pollute(_bnum2); \ + } \ } while (0) #define bn_fix_top(a) bn_check_top(a) @@ -230,16 +233,24 @@ BN_ULONG bn_sub_words(BN_ULONG *rp, const BN_ULONG *ap, const BN_ULONG *bp, int num); struct bignum_st { - BN_ULONG *d; /* - * Pointer to an array of 'BN_BITS2' bit - * chunks. These chunks are organised in - * a least significant chunk first order. - */ + /* The number itself is a FIXNUM */ + OSSL_FN *data; + + /* Some of these flags are replicated in OSSL_FN, some are not */ + int flags; + + /* + * TODO(FIXNUM) The fields that follow ARE TO BE REMOVED when all relevant + * BN_ functions have transitioned to be wrappers around OSSL_FN_ functions. + * All of this is maintained by bn_expand and BIGNUM allocators and + * deallocators. + */ + + BN_ULONG *d; /* Pointer to |data->d| */ int top; /* Index of last used d +1. */ /* The next are internal book keeping for bn_expand. */ - int dmax; /* Size of the d array. */ - int neg; /* one if the number is negative */ - int flags; + int dmax; /* Copy of |data->dsize| */ + int neg; /* One if the number is negative */ }; /* Used for montgomery multiplication */ diff --git a/crypto/bn/bn_nist.c b/crypto/bn/bn_nist.c index b820ef7486..d81a6f2aca 100644 --- a/crypto/bn/bn_nist.c +++ b/crypto/bn/bn_nist.c @@ -184,43 +184,38 @@ static const BN_ULONG _nist_p_521_sqr[] = { #endif static const BIGNUM ossl_bignum_nist_p_192 = { - (BN_ULONG *)_nist_p_192[0], - BN_NIST_192_TOP, - BN_NIST_192_TOP, - 0, - BN_FLG_STATIC_DATA + .d = (BN_ULONG *)_nist_p_192[0], + .top = BN_NIST_192_TOP, + .dmax = BN_NIST_192_TOP, + .flags = BN_FLG_STATIC_DATA, }; static const BIGNUM ossl_bignum_nist_p_224 = { - (BN_ULONG *)_nist_p_224[0], - BN_NIST_224_TOP, - BN_NIST_224_TOP, - 0, - BN_FLG_STATIC_DATA + .d = (BN_ULONG *)_nist_p_224[0], + .top = BN_NIST_224_TOP, + .dmax = BN_NIST_224_TOP, + .flags = BN_FLG_STATIC_DATA, }; static const BIGNUM ossl_bignum_nist_p_256 = { - (BN_ULONG *)_nist_p_256[0], - BN_NIST_256_TOP, - BN_NIST_256_TOP, - 0, - BN_FLG_STATIC_DATA + .d = (BN_ULONG *)_nist_p_256[0], + .top = BN_NIST_256_TOP, + .dmax = BN_NIST_256_TOP, + .flags = BN_FLG_STATIC_DATA, }; static const BIGNUM ossl_bignum_nist_p_384 = { - (BN_ULONG *)_nist_p_384[0], - BN_NIST_384_TOP, - BN_NIST_384_TOP, - 0, - BN_FLG_STATIC_DATA + .d = (BN_ULONG *)_nist_p_384[0], + .top = BN_NIST_384_TOP, + .dmax = BN_NIST_384_TOP, + .flags = BN_FLG_STATIC_DATA, }; static const BIGNUM ossl_bignum_nist_p_521 = { - (BN_ULONG *)_nist_p_521, - BN_NIST_521_TOP, - BN_NIST_521_TOP, - 0, - BN_FLG_STATIC_DATA + .d = (BN_ULONG *)_nist_p_521, + .top = BN_NIST_521_TOP, + .dmax = BN_NIST_521_TOP, + .flags = BN_FLG_STATIC_DATA, }; const BIGNUM *BN_get0_nist_prime_192(void) @@ -359,10 +354,10 @@ int BN_nist_mod_192(BIGNUM *r, const BIGNUM *a, const BIGNUM *field, } buf; BN_ULONG c_d[BN_NIST_192_TOP], *res; static const BIGNUM ossl_bignum_nist_p_192_sqr = { - (BN_ULONG *)_nist_p_192_sqr, - OSSL_NELEM(_nist_p_192_sqr), - OSSL_NELEM(_nist_p_192_sqr), - 0, BN_FLG_STATIC_DATA + .d = (BN_ULONG *)_nist_p_192_sqr, + .top = OSSL_NELEM(_nist_p_192_sqr), + .dmax = OSSL_NELEM(_nist_p_192_sqr), + .flags = BN_FLG_STATIC_DATA, }; field = &ossl_bignum_nist_p_192; /* just to make sure */ @@ -495,10 +490,10 @@ int BN_nist_mod_224(BIGNUM *r, const BIGNUM *a, const BIGNUM *field, BN_ULONG c_d[BN_NIST_224_TOP], *res; bn_addsub_f adjust; static const BIGNUM ossl_bignum_nist_p_224_sqr = { - (BN_ULONG *)_nist_p_224_sqr, - OSSL_NELEM(_nist_p_224_sqr), - OSSL_NELEM(_nist_p_224_sqr), - 0, BN_FLG_STATIC_DATA + .d = (BN_ULONG *)_nist_p_224_sqr, + .top = OSSL_NELEM(_nist_p_224_sqr), + .dmax = OSSL_NELEM(_nist_p_224_sqr), + .flags = BN_FLG_STATIC_DATA, }; field = &ossl_bignum_nist_p_224; /* just to make sure */ @@ -661,10 +656,10 @@ int BN_nist_mod_256(BIGNUM *r, const BIGNUM *a, const BIGNUM *field, BN_ULONG c_d[BN_NIST_256_TOP], *res; bn_addsub_f adjust; static const BIGNUM ossl_bignum_nist_p_256_sqr = { - (BN_ULONG *)_nist_p_256_sqr, - OSSL_NELEM(_nist_p_256_sqr), - OSSL_NELEM(_nist_p_256_sqr), - 0, BN_FLG_STATIC_DATA + .d = (BN_ULONG *)_nist_p_256_sqr, + .top = OSSL_NELEM(_nist_p_256_sqr), + .dmax = OSSL_NELEM(_nist_p_256_sqr), + .flags = BN_FLG_STATIC_DATA, }; field = &ossl_bignum_nist_p_256; /* just to make sure */ @@ -894,10 +889,10 @@ int BN_nist_mod_384(BIGNUM *r, const BIGNUM *a, const BIGNUM *field, BN_ULONG c_d[BN_NIST_384_TOP], *res; bn_addsub_f adjust; static const BIGNUM ossl_bignum_nist_p_384_sqr = { - (BN_ULONG *)_nist_p_384_sqr, - OSSL_NELEM(_nist_p_384_sqr), - OSSL_NELEM(_nist_p_384_sqr), - 0, BN_FLG_STATIC_DATA + .d = (BN_ULONG *)_nist_p_384_sqr, + .top = OSSL_NELEM(_nist_p_384_sqr), + .dmax = OSSL_NELEM(_nist_p_384_sqr), + .flags = BN_FLG_STATIC_DATA, }; field = &ossl_bignum_nist_p_384; /* just to make sure */ @@ -1142,10 +1137,10 @@ int BN_nist_mod_521(BIGNUM *r, const BIGNUM *a, const BIGNUM *field, int top = a->top, i; BN_ULONG *r_d, *a_d = a->d, t_d[BN_NIST_521_TOP], val, tmp, *res; static const BIGNUM ossl_bignum_nist_p_521_sqr = { - (BN_ULONG *)_nist_p_521_sqr, - OSSL_NELEM(_nist_p_521_sqr), - OSSL_NELEM(_nist_p_521_sqr), - 0, BN_FLG_STATIC_DATA + .d = (BN_ULONG *)_nist_p_521_sqr, + .top = OSSL_NELEM(_nist_p_521_sqr), + .dmax = OSSL_NELEM(_nist_p_521_sqr), + .flags = BN_FLG_STATIC_DATA, }; field = &ossl_bignum_nist_p_521; /* just to make sure */ diff --git a/crypto/bn/bn_prime.c b/crypto/bn/bn_prime.c index 33a9fc8d67..d626956e3d 100644 --- a/crypto/bn/bn_prime.c +++ b/crypto/bn/bn_prime.c @@ -55,11 +55,10 @@ static const BN_ULONG small_prime_factors[] = { #define BN_SMALL_PRIME_FACTORS_TOP OSSL_NELEM(small_prime_factors) static const BIGNUM _bignum_small_prime_factors = { - (BN_ULONG *)small_prime_factors, - BN_SMALL_PRIME_FACTORS_TOP, - BN_SMALL_PRIME_FACTORS_TOP, - 0, - BN_FLG_STATIC_DATA + .d = (BN_ULONG *)small_prime_factors, + .top = BN_SMALL_PRIME_FACTORS_TOP, + .dmax = BN_SMALL_PRIME_FACTORS_TOP, + .flags = BN_FLG_STATIC_DATA, }; const BIGNUM *ossl_bn_get0_small_factors(void) diff --git a/crypto/bn/bn_rsa_fips186_5.c b/crypto/bn/bn_rsa_fips186_5.c index 635f013f73..ee80bb3a5a 100644 --- a/crypto/bn/bn_rsa_fips186_5.c +++ b/crypto/bn/bn_rsa_fips186_5.c @@ -41,11 +41,10 @@ static const BN_ULONG inv_sqrt_2_val[] = { }; const BIGNUM ossl_bn_inv_sqrt_2 = { - (BN_ULONG *)inv_sqrt_2_val, - OSSL_NELEM(inv_sqrt_2_val), - OSSL_NELEM(inv_sqrt_2_val), - 0, - BN_FLG_STATIC_DATA + .d = (BN_ULONG *)inv_sqrt_2_val, + .top = OSSL_NELEM(inv_sqrt_2_val), + .dmax = OSSL_NELEM(inv_sqrt_2_val), + .flags = BN_FLG_STATIC_DATA, }; /* diff --git a/crypto/bn/bn_srp.c b/crypto/bn/bn_srp.c index 1cc30a56dd..1e7b38b619 100644 --- a/crypto/bn/bn_srp.c +++ b/crypto/bn/bn_srp.c @@ -49,11 +49,10 @@ static const BN_ULONG bn_group_1024_value[] = { }; const BIGNUM ossl_bn_group_1024 = { - (BN_ULONG *)bn_group_1024_value, - OSSL_NELEM(bn_group_1024_value), - OSSL_NELEM(bn_group_1024_value), - 0, - BN_FLG_STATIC_DATA + .d = (BN_ULONG *)bn_group_1024_value, + .top = OSSL_NELEM(bn_group_1024_value), + .dmax = OSSL_NELEM(bn_group_1024_value), + .flags = BN_FLG_STATIC_DATA, }; static const BN_ULONG bn_group_1536_value[] = { @@ -84,11 +83,10 @@ static const BN_ULONG bn_group_1536_value[] = { }; const BIGNUM ossl_bn_group_1536 = { - (BN_ULONG *)bn_group_1536_value, - OSSL_NELEM(bn_group_1536_value), - OSSL_NELEM(bn_group_1536_value), - 0, - BN_FLG_STATIC_DATA + .d = (BN_ULONG *)bn_group_1536_value, + .top = OSSL_NELEM(bn_group_1536_value), + .dmax = OSSL_NELEM(bn_group_1536_value), + .flags = BN_FLG_STATIC_DATA, }; static const BN_ULONG bn_group_2048_value[] = { @@ -127,11 +125,10 @@ static const BN_ULONG bn_group_2048_value[] = { }; const BIGNUM ossl_bn_group_2048 = { - (BN_ULONG *)bn_group_2048_value, - OSSL_NELEM(bn_group_2048_value), - OSSL_NELEM(bn_group_2048_value), - 0, - BN_FLG_STATIC_DATA + .d = (BN_ULONG *)bn_group_2048_value, + .top = OSSL_NELEM(bn_group_2048_value), + .dmax = OSSL_NELEM(bn_group_2048_value), + .flags = BN_FLG_STATIC_DATA, }; static const BN_ULONG bn_group_3072_value[] = { @@ -186,11 +183,10 @@ static const BN_ULONG bn_group_3072_value[] = { }; const BIGNUM ossl_bn_group_3072 = { - (BN_ULONG *)bn_group_3072_value, - OSSL_NELEM(bn_group_3072_value), - OSSL_NELEM(bn_group_3072_value), - 0, - BN_FLG_STATIC_DATA + .d = (BN_ULONG *)bn_group_3072_value, + .top = OSSL_NELEM(bn_group_3072_value), + .dmax = OSSL_NELEM(bn_group_3072_value), + .flags = BN_FLG_STATIC_DATA, }; static const BN_ULONG bn_group_4096_value[] = { @@ -261,11 +257,10 @@ static const BN_ULONG bn_group_4096_value[] = { }; const BIGNUM ossl_bn_group_4096 = { - (BN_ULONG *)bn_group_4096_value, - OSSL_NELEM(bn_group_4096_value), - OSSL_NELEM(bn_group_4096_value), - 0, - BN_FLG_STATIC_DATA + .d = (BN_ULONG *)bn_group_4096_value, + .top = OSSL_NELEM(bn_group_4096_value), + .dmax = OSSL_NELEM(bn_group_4096_value), + .flags = BN_FLG_STATIC_DATA, }; static const BN_ULONG bn_group_6144_value[] = { @@ -368,11 +363,10 @@ static const BN_ULONG bn_group_6144_value[] = { }; const BIGNUM ossl_bn_group_6144 = { - (BN_ULONG *)bn_group_6144_value, - OSSL_NELEM(bn_group_6144_value), - OSSL_NELEM(bn_group_6144_value), - 0, - BN_FLG_STATIC_DATA + .d = (BN_ULONG *)bn_group_6144_value, + .top = OSSL_NELEM(bn_group_6144_value), + .dmax = OSSL_NELEM(bn_group_6144_value), + .flags = BN_FLG_STATIC_DATA, }; static const BN_ULONG bn_group_8192_value[] = { @@ -507,39 +501,35 @@ static const BN_ULONG bn_group_8192_value[] = { }; const BIGNUM ossl_bn_group_8192 = { - (BN_ULONG *)bn_group_8192_value, - OSSL_NELEM(bn_group_8192_value), - OSSL_NELEM(bn_group_8192_value), - 0, - BN_FLG_STATIC_DATA + .d = (BN_ULONG *)bn_group_8192_value, + .top = OSSL_NELEM(bn_group_8192_value), + .dmax = OSSL_NELEM(bn_group_8192_value), + .flags = BN_FLG_STATIC_DATA, }; static const BN_ULONG bn_generator_19_value[] = { 19 }; const BIGNUM ossl_bn_generator_19 = { - (BN_ULONG *)bn_generator_19_value, - 1, - 1, - 0, - BN_FLG_STATIC_DATA + .d = (BN_ULONG *)bn_generator_19_value, + .top = 1, + .dmax = 1, + .flags = BN_FLG_STATIC_DATA, }; static const BN_ULONG bn_generator_5_value[] = { 5 }; const BIGNUM ossl_bn_generator_5 = { - (BN_ULONG *)bn_generator_5_value, - 1, - 1, - 0, - BN_FLG_STATIC_DATA + .d = (BN_ULONG *)bn_generator_5_value, + .top = 1, + .dmax = 1, + .flags = BN_FLG_STATIC_DATA, }; static const BN_ULONG bn_generator_2_value[] = { 2 }; const BIGNUM ossl_bn_generator_2 = { - (BN_ULONG *)bn_generator_2_value, - 1, - 1, - 0, - BN_FLG_STATIC_DATA + .d = (BN_ULONG *)bn_generator_2_value, + .top = 1, + .dmax = 1, + .flags = BN_FLG_STATIC_DATA, }; #endif diff --git a/crypto/fn/fn_lib.c b/crypto/fn/fn_lib.c index 87da4c2a91..a4eb60b98e 100644 --- a/crypto/fn/fn_lib.c +++ b/crypto/fn/fn_lib.c @@ -119,3 +119,10 @@ void OSSL_FN_clear_free(OSSL_FN *f) { ossl_fn_free_internal(f, true); } + +void OSSL_FN_clear(OSSL_FN *f) +{ + size_t limbssize = f->dsize * sizeof(OSSL_FN_ULONG); + + OPENSSL_cleanse(f->d, limbssize); +} diff --git a/crypto/fn/fn_local.h b/crypto/fn/fn_local.h index d20b46c6a4..46b3e82b26 100644 --- a/crypto/fn/fn_local.h +++ b/crypto/fn/fn_local.h @@ -10,7 +10,10 @@ #ifndef OSSL_CRYPTO_FN_LOCAL_H #define OSSL_CRYPTO_FN_LOCAL_H +#include #include +#include +#include "internal/common.h" #include "crypto/fn.h" struct ossl_fn_st { @@ -32,4 +35,33 @@ struct ossl_fn_st { OSSL_FN_ULONG d[]; }; +/* + * Internal functions to support BIGNUM's bn_expand_internal, BN_copy, and + * similar. + * The caller must ensure that src and dest are not NULL. + * With ossl_fn_copy_internal, bn_words may be given -1 to signify that the + * number of BN_ULONG should be found in src. + */ +static ossl_inline OSSL_FN *ossl_fn_copy_internal_limbs(OSSL_FN *dest, + const OSSL_FN_ULONG *src, + int limbs) +{ + if (ossl_unlikely(dest->dsize < limbs)) + return NULL; + memcpy(dest->d, src, limbs * sizeof(dest->d[0])); + memset(dest->d + limbs, 0, (dest->dsize - limbs) * sizeof(dest->d[0])); + return dest; +} + +static ossl_inline OSSL_FN *ossl_fn_copy_internal(OSSL_FN *dest, + const OSSL_FN *src, + int bn_words) +{ + int words = bn_words < 0 ? src->dsize : bn_words; + + if (ossl_fn_copy_internal_limbs(dest, src->d, words) == NULL) + return NULL; + return dest; +} + #endif diff --git a/include/crypto/bn.h b/include/crypto/bn.h index d2caade6a4..fa35e56cd9 100644 --- a/include/crypto/bn.h +++ b/include/crypto/bn.h @@ -13,6 +13,7 @@ #include #include +#include "types.h" BIGNUM *bn_wexpand(BIGNUM *a, int words); BIGNUM *bn_expand2(BIGNUM *a, int words); diff --git a/include/crypto/fn.h b/include/crypto/fn.h index 5c3a8f01ea..b982c74844 100644 --- a/include/crypto/fn.h +++ b/include/crypto/fn.h @@ -121,6 +121,13 @@ void OSSL_FN_free(OSSL_FN *f); */ void OSSL_FN_clear_free(OSSL_FN *f); +/** + * Cleanse the data of an OSSL_FN instance, effectively making it zero. + * + * @param[in] f The OSSL_FN instance to be cleared. + */ +void OSSL_FN_clear(OSSL_FN *f); + #ifdef __cplusplus } #endif From 2ccd86a0b16952adf006b247d505cc30e8181534 Mon Sep 17 00:00:00 2001 From: Richard Levitte Date: Mon, 27 Oct 2025 13:57:56 +0100 Subject: [PATCH 05/69] BIGNUM: Adjust the requirements on 'top' and the 'd' array for OSSL_FN compat BIGNUM is quite sloppy with its contents of the 'd' array above 'top'. This has been further exasperated by the 'bn_pollute' macro, which makes that slop quite explicit. That's fine within a purely BIGNUM context. Enter OSSL_FN, which requires that the whole 'd' array is numerically consistent, not just the BN_ULONGs up to 'top'. This will, of course, cause trouble as soon as an OSSL_FN that's integrated in a BIGNUM gets passed to OSSL_FN functions. To ensure consistency, the following updates are made: - [only for BIGNUMs in which 'data' is non-NULL] when decreasing 'top', all BN_ULONGs between the preceding 'top' and the new 'top' must be made zero. - Drop bn_pollute() entirely, as it's now more harmful than useful. - Modify bn_check_top() to better check the consistency of BIGNUM with integrated OSSL_FN, by checking that the part of the 'd' array between 'top' and 'dmax' is all zeroes. - Add the function 'bn_set_top()', which is recommended to use instead of assigning 'top' directly, as it will zeroise the intermediary limbs in the 'd' array when 'top' decreases. On using 'bn_set_top()', it's highly recommended to use it everywhere, unless you can be absolutely sure that the BIGNUM that's modified will never be checked with 'bn_check_top()' or passed to any OSSL_FN function. Related-to: doc/designs/fixed-size-large-numbers.md Reviewed-by: Dmitry Belyavskiy Reviewed-by: Tomas Mraz (Merged from https://github.com/openssl/openssl/pull/29015) --- crypto/bn/bn_add.c | 7 +- crypto/bn/bn_blind.c | 2 +- crypto/bn/bn_conv.c | 2 +- crypto/bn/bn_div.c | 12 ++-- crypto/bn/bn_exp.c | 15 +++-- crypto/bn/bn_gf2m.c | 14 ++-- crypto/bn/bn_intern.c | 6 +- crypto/bn/bn_lib.c | 45 +++++++++---- crypto/bn/bn_local.h | 149 ++++++++++++++++++++++++------------------ crypto/bn/bn_mod.c | 4 +- crypto/bn/bn_mont.c | 10 +-- crypto/bn/bn_mpi.c | 2 +- crypto/bn/bn_mul.c | 14 +++- crypto/bn/bn_nist.c | 10 +-- crypto/bn/bn_shift.c | 11 ++-- crypto/bn/bn_sqr.c | 9 ++- 16 files changed, 187 insertions(+), 125 deletions(-) diff --git a/crypto/bn/bn_add.c b/crypto/bn/bn_add.c index 88d77c534f..1784091b01 100644 --- a/crypto/bn/bn_add.c +++ b/crypto/bn/bn_add.c @@ -96,7 +96,7 @@ int BN_uadd(BIGNUM *r, const BIGNUM *a, const BIGNUM *b) if (bn_wexpand(r, max + 1) == NULL) return 0; - r->top = max; + bn_set_top(r, max); ap = a->d; bp = b->d; @@ -114,7 +114,7 @@ int BN_uadd(BIGNUM *r, const BIGNUM *a, const BIGNUM *b) carry &= (t2 == 0); } *rp = carry; - r->top += (int)carry; + bn_set_top(r, r->top + (int)carry); r->neg = 0; bn_check_top(r); @@ -162,9 +162,8 @@ int BN_usub(BIGNUM *r, const BIGNUM *a, const BIGNUM *b) while (max && *--rp == 0) max--; - r->top = max; + bn_set_top(r, max); r->neg = 0; - bn_pollute(r); return 1; } diff --git a/crypto/bn/bn_blind.c b/crypto/bn/bn_blind.c index 7722ed1e48..681b086b18 100644 --- a/crypto/bn/bn_blind.c +++ b/crypto/bn/bn_blind.c @@ -185,7 +185,7 @@ int BN_BLINDING_invert_ex(BIGNUM *n, const BIGNUM *r, BN_BLINDING *b, } mask = (BN_ULONG)0 - ((rtop - ntop) >> (8 * sizeof(ntop) - 1)); /* always true, if (rtop >= ntop) n->top = r->top; */ - n->top = (int)((rtop & ~mask) | (ntop & mask)); + bn_set_top(n, (int)((rtop & ~mask) | (ntop & mask))); n->flags |= (BN_FLG_FIXED_TOP & ~mask); } ret = bn_mul_mont_fixed_top(n, n, r, b->m_ctx, ctx); diff --git a/crypto/bn/bn_conv.c b/crypto/bn/bn_conv.c index f295e5db9a..ff49ebca81 100644 --- a/crypto/bn/bn_conv.c +++ b/crypto/bn/bn_conv.c @@ -178,7 +178,7 @@ int BN_hex2bn(BIGNUM **bn, const char *a) } j -= BN_BYTES * 2; } - ret->top = h; + bn_set_top(ret, h); bn_correct_top(ret); *bn = ret; diff --git a/crypto/bn/bn_div.c b/crypto/bn/bn_div.c index 2b2ace05e3..0cec75bf94 100644 --- a/crypto/bn/bn_div.c +++ b/crypto/bn/bn_div.c @@ -61,7 +61,7 @@ int BN_div(BIGNUM *dv, BIGNUM *rem, const BIGNUM *m, const BIGNUM *d, BN_zero(dv); if (bn_wexpand(dv, 1) == NULL) goto end; - dv->top = 1; + bn_set_top(dv, 1); if (!BN_lshift(D, D, nm - nd)) goto end; @@ -310,7 +310,9 @@ int bn_div_fixed_top(BIGNUM *dv, BIGNUM *rm, const BIGNUM *num, if (bn_wexpand(snum, div_n + 1) == NULL) goto err; memset(&(snum->d[num_n]), 0, (div_n - num_n + 1) * sizeof(BN_ULONG)); - snum->top = num_n = div_n + 1; + num_n = div_n + 1; + bn_set_top(snum, num_n); + snum->flags |= BN_FLG_FIXED_TOP; } loop = num_n - div_n; @@ -330,13 +332,15 @@ int bn_div_fixed_top(BIGNUM *dv, BIGNUM *rm, const BIGNUM *num, goto err; num_neg = num->neg; res->neg = (num_neg ^ divisor->neg); - res->top = loop; + bn_set_top(res, loop); res->flags |= BN_FLG_FIXED_TOP; resp = &(res->d[loop]); /* space for temp */ if (!bn_wexpand(tmp, (div_n + 1))) goto err; + tmp->top = div_n + 1; + tmp->flags |= BN_FLG_FIXED_TOP; for (i = 0; i < loop; i++, wnumtop--) { BN_ULONG q, l0; @@ -446,7 +450,7 @@ int bn_div_fixed_top(BIGNUM *dv, BIGNUM *rm, const BIGNUM *num, } /* snum holds remainder, it's as wide as divisor */ snum->neg = num_neg; - snum->top = div_n; + bn_set_top(snum, div_n); snum->flags |= BN_FLG_FIXED_TOP; if (rm != NULL && bn_rshift_fixed_top(rm, snum, norm_shift) == 0) diff --git a/crypto/bn/bn_exp.c b/crypto/bn/bn_exp.c index 6618113e88..65445a40e5 100644 --- a/crypto/bn/bn_exp.c +++ b/crypto/bn/bn_exp.c @@ -402,7 +402,7 @@ int BN_mod_exp_mont(BIGNUM *rr, const BIGNUM *a, const BIGNUM *p, r->d[0] = (0 - m->d[0]) & BN_MASK2; for (i = 1; i < j; i++) r->d[i] = (~m->d[i]) & BN_MASK2; - r->top = j; + bn_set_top(r, j); r->flags |= BN_FLG_FIXED_TOP; } else #endif @@ -468,7 +468,8 @@ int BN_mod_exp_mont(BIGNUM *rr, const BIGNUM *a, const BIGNUM *p, val[0]->d[0] = 1; /* borrow val[0] */ for (i = 1; i < j; i++) val[0]->d[i] = 0; - val[0]->top = j; + bn_set_top(val[0], j); + val[0]->flags |= BN_FLG_FIXED_TOP; if (!BN_mod_mul_montgomery(rr, r, val[0], mont, ctx)) goto err; } else @@ -581,7 +582,7 @@ static int MOD_EXP_CTIME_COPY_FROM_PREBUF(BIGNUM *b, int top, } } - b->top = top; + bn_set_top(b, top); b->flags |= BN_FLG_FIXED_TOP; return 1; } @@ -681,7 +682,7 @@ int bn_mod_exp_mont_fixed_top(BIGNUM *rr, const BIGNUM *a, const BIGNUM *p, goto err; RSAZ_1024_mod_exp_avx2(rr->d, a->d, p->d, m->d, mont->RR.d, mont->n0[0]); - rr->top = 16; + bn_set_top(rr, 16); rr->neg = 0; bn_correct_top(rr); ret = 1; @@ -690,7 +691,7 @@ int bn_mod_exp_mont_fixed_top(BIGNUM *rr, const BIGNUM *a, const BIGNUM *p, if (NULL == bn_wexpand(rr, 8)) goto err; RSAZ_512_mod_exp(rr->d, a->d, p->d, m->d, mont->n0[0], mont->RR.d); - rr->top = 8; + bn_set_top(rr, 8); rr->neg = 0; bn_correct_top(rr); ret = 1; @@ -1488,12 +1489,12 @@ int BN_mod_exp_mont_consttime_x2(BIGNUM *rr1, const BIGNUM *a1, const BIGNUM *p1 mont2->RR.d, mont2->n0[0], mod_bits); - rr1->top = topn; + bn_set_top(rr1, topn); rr1->neg = 0; bn_correct_top(rr1); bn_check_top(rr1); - rr2->top = topn; + bn_set_top(rr2, topn); rr2->neg = 0; bn_correct_top(rr2); bn_check_top(rr2); diff --git a/crypto/bn/bn_gf2m.c b/crypto/bn/bn_gf2m.c index 81a7fda5b3..5ad173337e 100644 --- a/crypto/bn/bn_gf2m.c +++ b/crypto/bn/bn_gf2m.c @@ -267,7 +267,7 @@ int BN_GF2m_add(BIGNUM *r, const BIGNUM *a, const BIGNUM *b) r->d[i] = at->d[i]; } - r->top = at->top; + bn_set_top(r, at->top); bn_correct_top(r); return 1; @@ -305,7 +305,7 @@ int BN_GF2m_mod_arr(BIGNUM *r, const BIGNUM *a, const int p[]) for (j = 0; j < a->top; j++) { r->d[j] = a->d[j]; } - r->top = a->top; + bn_set_top(r, a->top); } z = r->d; @@ -419,7 +419,7 @@ int BN_GF2m_mod_mul_arr(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, zlen = a->top + b->top + 4; if (!bn_wexpand(s, zlen)) goto err; - s->top = zlen; + bn_set_top(s, zlen); for (i = 0; i < zlen; i++) s->d[i] = 0; @@ -498,7 +498,7 @@ int BN_GF2m_mod_sqr_arr(BIGNUM *r, const BIGNUM *a, const int p[], s->d[2 * i] = SQR0(a->d[i]); } - s->top = 2 * a->top; + bn_set_top(s, 2 * a->top); bn_correct_top(s); if (!BN_GF2m_mod_arr(r, s, p)) goto err; @@ -618,20 +618,20 @@ static int BN_GF2m_mod_inv_vartime(BIGNUM *r, const BIGNUM *a, udp = u->d; for (i = u->top; i < top; i++) udp[i] = 0; - u->top = top; + bn_set_top(u, top); if (!bn_wexpand(b, top)) goto err; bdp = b->d; bdp[0] = 1; for (i = 1; i < top; i++) bdp[i] = 0; - b->top = top; + bn_set_top(b, top); if (!bn_wexpand(c, top)) goto err; cdp = c->d; for (i = 0; i < top; i++) cdp[i] = 0; - c->top = top; + bn_set_top(c, top); vdp = v->d; /* It pays off to "cache" *->d pointers, * because it allows optimizer to be more * aggressive. But we don't have to "cache" diff --git a/crypto/bn/bn_intern.c b/crypto/bn/bn_intern.c index e369a167b9..dcd9e8b3db 100644 --- a/crypto/bn/bn_intern.c +++ b/crypto/bn/bn_intern.c @@ -176,6 +176,7 @@ void bn_set_static_words(BIGNUM *a, const BN_ULONG *words, int size) */ a->data = NULL; a->d = (BN_ULONG *)words; + /* No need to call bn_set_top() in this case */ a->dmax = a->top = size; a->neg = 0; a->flags |= BN_FLG_STATIC_DATA; @@ -189,8 +190,11 @@ int bn_set_words(BIGNUM *a, const BN_ULONG *words, int num_words) return 0; } + /* TODO(FIXNUM): In the future, we'll use an OSSL_FN function on a->data */ memcpy(a->d, words, sizeof(BN_ULONG) * num_words); - a->top = num_words; + + /* TODO(FIXNUM): The following two lines are TO BE REMOVED */ + bn_set_top(a, num_words); bn_correct_top(a); return 1; } diff --git a/crypto/bn/bn_lib.c b/crypto/bn/bn_lib.c index 8787817488..f5b224ba42 100644 --- a/crypto/bn/bn_lib.c +++ b/crypto/bn/bn_lib.c @@ -372,7 +372,7 @@ BIGNUM *BN_copy(BIGNUM *a, const BIGNUM *b) ossl_fn_copy_internal_limbs(a->data, b->d, bn_words); } a->neg = b->neg; - a->top = b->top; + bn_set_top(a, b->top); a->flags |= b->flags & BN_FLG_FIXED_TOP; bn_check_top(a); return a; @@ -428,7 +428,7 @@ void BN_clear(BIGNUM *a) else if (a->d != NULL) OPENSSL_cleanse(a->d, sizeof(*a->d) * a->dmax); a->neg = 0; - a->top = 0; + bn_set_top(a, 0); a->flags &= ~BN_FLG_FIXED_TOP; } @@ -449,7 +449,7 @@ int BN_set_word(BIGNUM *a, BN_ULONG w) return 0; a->neg = 0; a->d[0] = w; - a->top = (w ? 1 : 0); + bn_set_top(a, (w ? 1 : 0)); a->flags &= ~BN_FLG_FIXED_TOP; bn_check_top(a); return 1; @@ -531,7 +531,7 @@ static BIGNUM *bin2bn(const unsigned char *s, int len, BIGNUM *ret, } /* If it was all zeros, we're done */ if (len == 0) { - ret->top = 0; + bn_set_top(ret, 0); return ret; } n = ((len - 1) / BN_BYTES) + 1; /* Number of resulting bignum chunks */ @@ -539,7 +539,7 @@ static BIGNUM *bin2bn(const unsigned char *s, int len, BIGNUM *ret, BN_free(bn); return NULL; } - ret->top = n; + bn_set_top(ret, n); ret->neg = neg; for (i = 0; n-- > 0; i++) { BN_ULONG l = 0; /* Accumulator */ @@ -820,7 +820,7 @@ int BN_cmp(const BIGNUM *a, const BIGNUM *b) int BN_set_bit(BIGNUM *a, int n) { - int i, j, k; + int i, j; if (n < 0) return 0; @@ -830,9 +830,12 @@ int BN_set_bit(BIGNUM *a, int n) if (a->top <= i) { if (bn_wexpand(a, i + 1) == NULL) return 0; - for (k = a->top; k < i + 1; k++) - a->d[k] = 0; - a->top = i + 1; + /* + * If 'a' is actually expanded, we know that the expanded + * part of the 'd' array is zeroed during allocation, so + * no need to zero it again here. + */ + bn_set_top(a, i + 1); a->flags &= ~BN_FLG_FIXED_TOP; } @@ -885,9 +888,9 @@ int ossl_bn_mask_bits_fixed_top(BIGNUM *a, int n) if (w >= a->top) return 0; if (b == 0) - a->top = w; + bn_set_top(a, w); else { - a->top = w + 1; + bn_set_top(a, w + 1); a->d[w] &= ~(BN_MASK2 << b); } a->flags |= BN_FLG_FIXED_TOP; @@ -1054,7 +1057,7 @@ int BN_security_bits(int L, int N) void BN_zero_ex(BIGNUM *a) { a->neg = 0; - a->top = 0; + bn_set_top(a, 0); a->flags &= ~BN_FLG_FIXED_TOP; } @@ -1065,7 +1068,12 @@ int BN_abs_is_word(const BIGNUM *a, const BN_ULONG w) int BN_is_zero(const BIGNUM *a) { - return a->top == 0; + if ((a->flags & BN_FLG_FIXED_TOP) == 0) + return a->top == 0; + for (size_t i = a->top; i-- > 0;) + if (a->d[i] != (BN_ULONG)0) + return 0; + return 1; } int BN_is_one(const BIGNUM *a) @@ -1196,6 +1204,11 @@ void bn_correct_top_consttime(BIGNUM *a) } mask = constant_time_eq_int(atop, 0); + /* + * We just went through the whole 'd' array to identify where + * any leading set of zeros are located, so there's no need to + * call bn_set_top() here. + */ a->top = atop; a->neg = constant_time_select_int(mask, 0, a->neg); a->flags &= ~BN_FLG_FIXED_TOP; @@ -1212,10 +1225,14 @@ void bn_correct_top(BIGNUM *a) if (*ftl != 0) break; } + /* + * We just verified that the BN_ULONGs between a->top and + * tmp_top are all zero, so there's no need to call + * bn_set_top() here. + */ a->top = tmp_top; } if (a->top == 0) a->neg = 0; a->flags &= ~BN_FLG_FIXED_TOP; - bn_pollute(a); } diff --git a/crypto/bn/bn_local.h b/crypto/bn/bn_local.h index 49eb7dd088..a3c850ea2d 100644 --- a/crypto/bn/bn_local.h +++ b/crypto/bn/bn_local.h @@ -10,6 +10,9 @@ #ifndef OSSL_CRYPTO_BN_LOCAL_H #define OSSL_CRYPTO_BN_LOCAL_H +#include +#include + #include #include "internal/cryptlib.h" #include "internal/numbers.h" @@ -18,21 +21,13 @@ #include "../fn/fn_local.h" /* - * These preprocessor symbols control various aspects of the bignum headers - * and library code. They're not defined by any "normal" configuration, as - * they are intended for development and testing purposes. NB: defining - * them can be useful for debugging application code as well as openssl - * itself. BN_DEBUG - turn on various debugging alterations to the bignum - * code BN_RAND_DEBUG - uses random poisoning of unused words to trip up - * mismanagement of bignum internals. Enable BN_RAND_DEBUG is known to - * break some of the OpenSSL tests. + * BN_RAND_DEBUG was historically used to poison unused words in bignum data, + * for integrity debugging purposes. This isn't done any more, but enabling + * BN_RAND_DEBUG also defined BN_DEBUG, which we preserve for the moment. */ #if defined(BN_RAND_DEBUG) && !defined(BN_DEBUG) #define BN_DEBUG #endif -#if defined(BN_RAND_DEBUG) -#include -#endif /* * This should limit the stack usage due to alloca to about 4K. @@ -124,30 +119,37 @@ typedef unsigned long long BN_ULLONG; /*- * Bignum consistency macros + * * There is one "API" macro, bn_fix_top(), for stripping leading zeroes from * bignum data after direct manipulations on the data. There is also an * "internal" macro, bn_check_top(), for verifying that there are no leading - * zeroes. Unfortunately, some auditing is required due to the fact that - * bn_fix_top() has become an overabused duct-tape because bignum data is - * occasionally passed around in an inconsistent state. So the following - * changes have been made to sort this out; + * zeroes, and in case the BIGNUM has an integrated OSSL_FN, check the + * consistency of the integration, including that the unused part of the + * data is all zeros. + * + * Unfortunately, some auditing is required due to the fact that bn_fix_top() + * has become an overabused duck-tape because bignum data is occasionally + * passed around in an inconsistent state. So the following changes have been + * made to sort this out; + * * - bn_fix_top()s implementation has been moved to bn_correct_top() - * - if BN_DEBUG isn't defined, bn_fix_top() maps to bn_correct_top(), and - * bn_check_top() is as before. - * - if BN_DEBUG *is* defined; - * - bn_check_top() tries to pollute unused words even if the bignum 'top' is - * consistent. (ed: only if BN_RAND_DEBUG is defined) + * - if BN_DEBUG isn't defined: + * - bn_check_top() does nothing. + * - bn_fix_top() maps to bn_correct_top() + * - if BN_DEBUG is defined: + * - bn_check_top() performs its consistency checks * - bn_fix_top() maps to bn_check_top() rather than "fixing" anything. + * * The idea is to have debug builds flag up inconsistent bignums when they - * occur. If that occurs in a bn_fix_top(), we examine the code in question; if - * the use of bn_fix_top() was appropriate (ie. it follows directly after code - * that manipulates the bignum) it is converted to bn_correct_top(), and if it - * was not appropriate, we convert it permanently to bn_check_top() and track - * down the cause of the bug. Eventually, no internal code should be using the - * bn_fix_top() macro. External applications and libraries should try this with - * their own code too, both in terms of building against the openssl headers - * with BN_DEBUG defined *and* linking with a version of OpenSSL built with it - * defined. This not only improves external code, it provides more test + * occur. If that occurs in a bn_fix_top(), we examine the code in question; + * if the use of bn_fix_top() was appropriate (ie. it follows directly after + * code that manipulates the bignum) it is converted to bn_correct_top(), + * and if it was not appropriate, we convert it permanently to bn_check_top() + * and track down the cause of the bug. Eventually, no internal code should be + * using the bn_fix_top() macro. External applications and libraries should try + * this with their own code too, both in terms of building against the openssl + * headers with BN_DEBUG defined *and* linking with a version of OpenSSL built + * with it defined. This not only improves external code, it provides more test * coverage for openssl's own code. */ @@ -166,38 +168,37 @@ typedef unsigned long long BN_ULLONG; * all operations manipulating the bit in question in non-BN_DEBUG build. */ #define BN_FLG_FIXED_TOP 0x10000 -#ifdef BN_RAND_DEBUG -#define bn_pollute(a) \ - do { \ - const BIGNUM *_bnum1 = (a); \ - if (_bnum1->top < _bnum1->dmax) { \ - unsigned char _tmp_char; \ - /* We cast away const without the compiler knowing, any \ - * *genuinely* constant variables that aren't mutable \ - * wouldn't be constructed with top!=dmax. */ \ - BN_ULONG *_not_const; \ - memcpy(&_not_const, &_bnum1->d, sizeof(_not_const)); \ - (void)RAND_bytes(&_tmp_char, 1); /* Debug only - safe to ignore error return */ \ - memset(_not_const + _bnum1->top, _tmp_char, \ - sizeof(*_not_const) * (_bnum1->dmax - _bnum1->top)); \ - } \ - } while (0) -#else -#define bn_pollute(a) -#endif -#define bn_check_top(a) \ - do { \ - const BIGNUM *_bnum2 = (a); \ - if (_bnum2 != NULL) { \ - int _top = _bnum2->top; \ - /* BIGNUM <-> OSSL_FN compat checks */ \ - assert((_bnum2->data == NULL /* && _bnum2->d == NULL */) \ - || (_bnum2->d == _bnum2->data->d \ - && _bnum2->dmax == _bnum2->data->dsize)); \ - /* BIGNUM specific checks */ \ - assert((_top == 0 && !_bnum2->neg) || (_top && ((_bnum2->flags & BN_FLG_FIXED_TOP) || _bnum2->d[_top - 1] != 0))); \ - bn_pollute(_bnum2); \ - } \ + +static ossl_inline bool bn_check_zero(BN_ULONG *words, int num_words) +{ + for (int i = 0; i < num_words; i++) + if (words[i] != 0) + return false; + return true; +} + +#define bn_check_top(a) \ + do { \ + const BIGNUM *_bnum2 = (a); \ + if (_bnum2 != NULL) { \ + int _top = _bnum2->top; \ + int _dmax = _bnum2->dmax; \ + BN_ULONG *_d = _bnum2->d; \ + /* BIGNUM <-> OSSL_FN compat checks */ \ + if (_bnum2->data != NULL) { \ + /* Assertion for the future */ \ + /* assert(_bnum2->d == NULL); */ \ + assert(_d == _bnum2->data->d); \ + assert(_dmax == _bnum2->data->dsize); \ + assert(bn_check_zero(&_d[_top], _dmax - _top)); \ + } \ + /* BIGNUM specific checks */ \ + if (_top == 0) { \ + assert(!_bnum2->neg); \ + } else if ((_bnum2->flags & BN_FLG_FIXED_TOP) == 0) { \ + assert(_bnum2->d[_top - 1] != 0); \ + } \ + } \ } while (0) #define bn_fix_top(a) bn_check_top(a) @@ -214,7 +215,6 @@ typedef unsigned long long BN_ULLONG; #else /* !BN_DEBUG */ #define BN_FLG_FIXED_TOP 0 -#define bn_pollute(a) #define bn_check_top(a) #define bn_fix_top(a) bn_correct_top(a) #define bn_check_size(bn, bits) @@ -693,4 +693,29 @@ static ossl_inline BIGNUM *bn_expand(BIGNUM *a, int bits) int ossl_bn_check_prime(const BIGNUM *w, int checks, BN_CTX *ctx, int do_trial_division, BN_GENCB *cb); +/** + * Set top on a given BIGNUM. If it has an associated OSSL_FN (the 'data' + * field is non-NULL), and the new 'top' is less than the existing 'top', + * zeroise the space between them. + * + * @param[in] b The BIGNUM instance to zeroise + * @param[in] newtop The new 'top' + * @returns the new 'top' + * @pre b must not be NULL and newtop must be zero or positive + */ +static ossl_inline int bn_set_top(BIGNUM *b, int newtop) +{ + assert(b != NULL && newtop >= 0); + + if (b->data != NULL && newtop < b->top) { + BN_ULONG *start = &(b->d[newtop]); + size_t bytes = sizeof(BN_ULONG) * (b->top - newtop); + + memset(start, 0, bytes); + } + + b->top = newtop; + return b->top; +} + #endif diff --git a/crypto/bn/bn_mod.c b/crypto/bn/bn_mod.c index 703072bbf2..6db2636d76 100644 --- a/crypto/bn/bn_mod.c +++ b/crypto/bn/bn_mod.c @@ -90,7 +90,7 @@ int bn_mod_add_fixed_top(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, rp[i] = (carry & tp[i]) | (~carry & rp[i]); ((volatile BN_ULONG *)tp)[i] = 0; } - r->top = (int)mtop; + bn_set_top(r, (int)mtop); r->flags |= BN_FLG_FIXED_TOP; r->neg = 0; @@ -176,7 +176,7 @@ int bn_mod_sub_fixed_top(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, carry += (rp[i] < ta); } - r->top = (int)mtop; + bn_set_top(r, (int)mtop); r->flags |= BN_FLG_FIXED_TOP; r->neg = 0; diff --git a/crypto/bn/bn_mont.c b/crypto/bn/bn_mont.c index 0bdfce3c48..aeaf399231 100644 --- a/crypto/bn/bn_mont.c +++ b/crypto/bn/bn_mont.c @@ -46,7 +46,7 @@ int bn_mul_mont_fixed_top(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, return 0; if (bn_mul_mont(r->d, a->d, b->d, mont->N.d, mont->n0, num)) { r->neg = a->neg ^ b->neg; - r->top = num; + bn_set_top(r, num); r->flags |= BN_FLG_FIXED_TOP; return 1; } @@ -94,7 +94,7 @@ static int bn_from_montgomery_word(BIGNUM *ret, BIGNUM *r, BN_MONT_CTX *mont) n = &(mont->N); nl = n->top; if (nl == 0) { - ret->top = 0; + bn_set_top(ret, 0); return 1; } @@ -112,7 +112,7 @@ static int bn_from_montgomery_word(BIGNUM *ret, BIGNUM *r, BN_MONT_CTX *mont) rp[i] &= v; } - r->top = max; + bn_set_top(r, max); r->flags |= BN_FLG_FIXED_TOP; n0 = mont->n0[0]; @@ -131,7 +131,7 @@ static int bn_from_montgomery_word(BIGNUM *ret, BIGNUM *r, BN_MONT_CTX *mont) if (bn_wexpand(ret, nl) == NULL) return 0; - ret->top = nl; + bn_set_top(ret, nl); ret->flags |= BN_FLG_FIXED_TOP; ret->neg = r->neg; @@ -325,7 +325,7 @@ int BN_MONT_CTX_set(BN_MONT_CTX *mont, const BIGNUM *mod, BN_CTX *ctx) Ri->neg = 0; Ri->d[0] = BN_MASK2; Ri->d[1] = BN_MASK2; - Ri->top = 2; + bn_set_top(Ri, 2); } if (!BN_div(Ri, NULL, Ri, &tmod, ctx)) goto err; diff --git a/crypto/bn/bn_mpi.c b/crypto/bn/bn_mpi.c index d2a86a3ead..17ffc6a476 100644 --- a/crypto/bn/bn_mpi.c +++ b/crypto/bn/bn_mpi.c @@ -65,7 +65,7 @@ BIGNUM *BN_mpi2bn(const unsigned char *d, int n, BIGNUM *ain) if (len == 0) { a->neg = 0; - a->top = 0; + bn_set_top(a, 0); return a; } d += 4; diff --git a/crypto/bn/bn_mul.c b/crypto/bn/bn_mul.c index aefc335923..4717556cc6 100644 --- a/crypto/bn/bn_mul.c +++ b/crypto/bn/bn_mul.c @@ -533,6 +533,7 @@ int bn_mul_fixed_top(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, BN_CTX *ctx) if (al == 4) { if (bn_wexpand(rr, 8) == NULL) goto err; + rr->flags |= BN_FLG_FIXED_TOP; rr->top = 8; bn_mul_comba4(rr->d, a->d, b->d); goto end; @@ -541,6 +542,7 @@ int bn_mul_fixed_top(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, BN_CTX *ctx) if (al == 8) { if (bn_wexpand(rr, 16) == NULL) goto err; + rr->flags |= BN_FLG_FIXED_TOP; rr->top = 16; bn_mul_comba8(rr->d, a->d, b->d); goto end; @@ -568,26 +570,34 @@ int bn_mul_fixed_top(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, BN_CTX *ctx) if (al > j || bl > j) { if (bn_wexpand(t, k * 4) == NULL) goto err; + t->top = k * 4; + t->flags |= BN_FLG_FIXED_TOP; if (bn_wexpand(rr, k * 4) == NULL) goto err; + rr->top = k * 4; + rr->flags |= BN_FLG_FIXED_TOP; bn_mul_part_recursive(rr->d, a->d, b->d, j, al - j, bl - j, t->d); } else { /* al <= j || bl <= j */ if (bn_wexpand(t, k * 2) == NULL) goto err; + t->top = k * 2; + t->flags |= BN_FLG_FIXED_TOP; if (bn_wexpand(rr, k * 2) == NULL) goto err; + rr->top = k * 2; + rr->flags |= BN_FLG_FIXED_TOP; bn_mul_recursive(rr->d, a->d, b->d, j, al - j, bl - j, t->d); } - rr->top = top; + bn_set_top(rr, top); goto end; } } #endif /* OPENSSL_SMALL_FOOTPRINT */ if (bn_wexpand(rr, top) == NULL) goto err; - rr->top = top; + bn_set_top(rr, top); bn_mul_normal(rr->d, a->d, al, b->d, bl); #if !defined(OPENSSL_SMALL_FOOTPRINT) diff --git a/crypto/bn/bn_nist.c b/crypto/bn/bn_nist.c index d81a6f2aca..b7c99006d0 100644 --- a/crypto/bn/bn_nist.c +++ b/crypto/bn/bn_nist.c @@ -457,7 +457,7 @@ int BN_nist_mod_192(BIGNUM *r, const BIGNUM *a, const BIGNUM *field, ? r_d : c_d; nist_cp_bn(r_d, res, BN_NIST_192_TOP); - r->top = BN_NIST_192_TOP; + bn_set_top(r, BN_NIST_192_TOP); bn_correct_top(r); return 1; @@ -625,7 +625,7 @@ int BN_nist_mod_224(BIGNUM *r, const BIGNUM *a, const BIGNUM *field, ? r_d : c_d; nist_cp_bn(r_d, res, BN_NIST_224_TOP); - r->top = BN_NIST_224_TOP; + bn_set_top(r, BN_NIST_224_TOP); bn_correct_top(r); return 1; @@ -854,7 +854,7 @@ int BN_nist_mod_256(BIGNUM *r, const BIGNUM *a, const BIGNUM *field, ? r_d : c_d; nist_cp_bn(r_d, res, BN_NIST_256_TOP); - r->top = BN_NIST_256_TOP; + bn_set_top(r, BN_NIST_256_TOP); bn_correct_top(r); return 1; @@ -1121,7 +1121,7 @@ int BN_nist_mod_384(BIGNUM *r, const BIGNUM *a, const BIGNUM *field, ? r_d : c_d; nist_cp_bn(r_d, res, BN_NIST_384_TOP); - r->top = BN_NIST_384_TOP; + bn_set_top(r, BN_NIST_384_TOP); bn_correct_top(r); return 1; @@ -1192,7 +1192,7 @@ int BN_nist_mod_521(BIGNUM *r, const BIGNUM *a, const BIGNUM *field, ? r_d : t_d; nist_cp_bn(r_d, res, BN_NIST_521_TOP); - r->top = BN_NIST_521_TOP; + bn_set_top(r, BN_NIST_521_TOP); bn_correct_top(r); return 1; diff --git a/crypto/bn/bn_shift.c b/crypto/bn/bn_shift.c index 1ba635096e..2e6f7c7401 100644 --- a/crypto/bn/bn_shift.c +++ b/crypto/bn/bn_shift.c @@ -23,7 +23,7 @@ int BN_lshift1(BIGNUM *r, const BIGNUM *a) r->neg = a->neg; if (bn_wexpand(r, a->top + 1) == NULL) return 0; - r->top = a->top; + bn_set_top(r, a->top); } else { if (bn_wexpand(r, a->top + 1) == NULL) return 0; @@ -37,7 +37,7 @@ int BN_lshift1(BIGNUM *r, const BIGNUM *a) c = t >> (BN_BITS2 - 1); } *rp = c; - r->top += (int)c; + bn_set_top(r, r->top + (int)c); bn_check_top(r); return 1; } @@ -62,11 +62,10 @@ int BN_rshift1(BIGNUM *r, const BIGNUM *a) r->neg = a->neg; } rp = r->d; - r->top = i; t = ap[--i]; rp[i] = t >> 1; c = t << (BN_BITS2 - 1); - r->top -= (t == 1); + bn_set_top(r, i + (t > 1)); while (i > 0) { t = ap[--i]; rp[i] = ((t >> 1) & BN_MASK2) | c; @@ -141,7 +140,7 @@ int bn_lshift_fixed_top(BIGNUM *r, const BIGNUM *a, int n) memset(r->d, 0, sizeof(*t) * nw); r->neg = a->neg; - r->top = a->top + nw + 1; + bn_set_top(r, a->top + nw + 1); r->flags |= BN_FLG_FIXED_TOP; return 1; @@ -209,7 +208,7 @@ int bn_rshift_fixed_top(BIGNUM *r, const BIGNUM *a, int n) t[i] = l >> rb; r->neg = a->neg; - r->top = top; + bn_set_top(r, top); r->flags |= BN_FLG_FIXED_TOP; return 1; diff --git a/crypto/bn/bn_sqr.c b/crypto/bn/bn_sqr.c index 807577bae5..1eb9e4c9ab 100644 --- a/crypto/bn/bn_sqr.c +++ b/crypto/bn/bn_sqr.c @@ -34,7 +34,7 @@ int bn_sqr_fixed_top(BIGNUM *r, const BIGNUM *a, BN_CTX *ctx) al = a->top; if (al <= 0) { - r->top = 0; + bn_set_top(r, 0); r->neg = 0; return 1; } @@ -91,8 +91,12 @@ int bn_sqr_fixed_top(BIGNUM *r, const BIGNUM *a, BN_CTX *ctx) #endif } + /* Ensure that tmp won't cause any trouble */ + tmp->top = tmp->dmax; + tmp->flags |= BN_FLG_FIXED_TOP; + rr->neg = 0; - rr->top = max; + bn_set_top(rr, max); rr->flags |= BN_FLG_FIXED_TOP; if (r != rr && BN_copy(r, rr) == NULL) goto err; @@ -100,7 +104,6 @@ int bn_sqr_fixed_top(BIGNUM *r, const BIGNUM *a, BN_CTX *ctx) ret = 1; err: bn_check_top(rr); - bn_check_top(tmp); BN_CTX_end(ctx); return ret; } From 133420b1722c4390c36ed6aa32f87946e1ca4faa Mon Sep 17 00:00:00 2001 From: Richard Levitte Date: Tue, 28 Oct 2025 10:47:33 +0100 Subject: [PATCH 06/69] BN_DEBUG: Refactor 'bn_check_top', 'bn_wcheck_size' into static inline functions All the BN_DEBUG code is also moved below the definition of 'struct bignum_st', to keep the compilers happy. Reviewed-by: Dmitry Belyavskiy Reviewed-by: Tomas Mraz (Merged from https://github.com/openssl/openssl/pull/29015) --- crypto/bn/bn_local.h | 119 +++++++++++++++++++++---------------------- 1 file changed, 58 insertions(+), 61 deletions(-) diff --git a/crypto/bn/bn_local.h b/crypto/bn/bn_local.h index a3c850ea2d..16c7d35355 100644 --- a/crypto/bn/bn_local.h +++ b/crypto/bn/bn_local.h @@ -117,6 +117,39 @@ typedef unsigned long long BN_ULLONG; #define BN_DEC_FMT2 "%09u" #endif +#define BN_MAX_WORDS (INT_MAX / (4 * BN_BITS2)) + +BN_ULONG bn_mul_add_words(BN_ULONG *rp, const BN_ULONG *ap, int num, + BN_ULONG w); +BN_ULONG bn_mul_words(BN_ULONG *rp, const BN_ULONG *ap, int num, BN_ULONG w); +void bn_sqr_words(BN_ULONG *rp, const BN_ULONG *ap, int num); +BN_ULONG bn_div_words(BN_ULONG h, BN_ULONG l, BN_ULONG d); +BN_ULONG bn_add_words(BN_ULONG *rp, const BN_ULONG *ap, const BN_ULONG *bp, + int num); +BN_ULONG bn_sub_words(BN_ULONG *rp, const BN_ULONG *ap, const BN_ULONG *bp, + int num); + +struct bignum_st { + /* The number itself is a FIXNUM */ + OSSL_FN *data; + + /* Some of these flags are replicated in OSSL_FN, some are not */ + int flags; + + /* + * TODO(FIXNUM) The fields that follow ARE TO BE REMOVED when all relevant + * BN_ functions have transitioned to be wrappers around OSSL_FN_ functions. + * All of this is maintained by bn_expand and BIGNUM allocators and + * deallocators. + */ + + BN_ULONG *d; /* Pointer to |data->d| */ + int top; /* Index of last used d +1. */ + /* The next are internal book keeping for bn_expand. */ + int dmax; /* Copy of |data->dsize| */ + int neg; /* One if the number is negative */ +}; + /*- * Bignum consistency macros * @@ -177,40 +210,35 @@ static ossl_inline bool bn_check_zero(BN_ULONG *words, int num_words) return true; } -#define bn_check_top(a) \ - do { \ - const BIGNUM *_bnum2 = (a); \ - if (_bnum2 != NULL) { \ - int _top = _bnum2->top; \ - int _dmax = _bnum2->dmax; \ - BN_ULONG *_d = _bnum2->d; \ - /* BIGNUM <-> OSSL_FN compat checks */ \ - if (_bnum2->data != NULL) { \ - /* Assertion for the future */ \ - /* assert(_bnum2->d == NULL); */ \ - assert(_d == _bnum2->data->d); \ - assert(_dmax == _bnum2->data->dsize); \ - assert(bn_check_zero(&_d[_top], _dmax - _top)); \ - } \ - /* BIGNUM specific checks */ \ - if (_top == 0) { \ - assert(!_bnum2->neg); \ - } else if ((_bnum2->flags & BN_FLG_FIXED_TOP) == 0) { \ - assert(_bnum2->d[_top - 1] != 0); \ - } \ - } \ - } while (0) +static ossl_inline void bn_check_top(const BIGNUM *bn) +{ + if (bn != NULL) { + /* BIGNUM <-> OSSL_FN compat checks */ + if (bn->data != NULL) { + /* TODO(FIXNUM): Assertion for the future */ + /* assert(_bnum2->d == NULL); */ + assert(bn->d == bn->data->d); + assert(bn->dmax == bn->data->dsize); + assert(bn_check_zero(&bn->d[bn->top], bn->dmax - bn->top)); + } + /* BIGNUM specific checks */ + if (bn->top == 0) { + assert(!bn->neg); + } else if ((bn->flags & BN_FLG_FIXED_TOP) == 0) { + assert(bn->d[bn->top - 1] != 0); + } + } +} #define bn_fix_top(a) bn_check_top(a) +static ossl_inline void bn_wcheck_size(const BIGNUM *bn, int words) +{ + assert(words <= bn->dmax); + assert(words >= bn->top); +} + #define bn_check_size(bn, bits) bn_wcheck_size(bn, ((bits + BN_BITS2 - 1)) / BN_BITS2) -#define bn_wcheck_size(bn, words) \ - do { \ - const BIGNUM *_bnum2 = (bn); \ - assert((words) <= (_bnum2)->dmax && (words) >= (_bnum2)->top); \ - /* avoid unused variable warning with NDEBUG */ \ - (void)(_bnum2); \ - } while (0) #else /* !BN_DEBUG */ @@ -222,37 +250,6 @@ static ossl_inline bool bn_check_zero(BN_ULONG *words, int num_words) #endif -BN_ULONG bn_mul_add_words(BN_ULONG *rp, const BN_ULONG *ap, int num, - BN_ULONG w); -BN_ULONG bn_mul_words(BN_ULONG *rp, const BN_ULONG *ap, int num, BN_ULONG w); -void bn_sqr_words(BN_ULONG *rp, const BN_ULONG *ap, int num); -BN_ULONG bn_div_words(BN_ULONG h, BN_ULONG l, BN_ULONG d); -BN_ULONG bn_add_words(BN_ULONG *rp, const BN_ULONG *ap, const BN_ULONG *bp, - int num); -BN_ULONG bn_sub_words(BN_ULONG *rp, const BN_ULONG *ap, const BN_ULONG *bp, - int num); - -struct bignum_st { - /* The number itself is a FIXNUM */ - OSSL_FN *data; - - /* Some of these flags are replicated in OSSL_FN, some are not */ - int flags; - - /* - * TODO(FIXNUM) The fields that follow ARE TO BE REMOVED when all relevant - * BN_ functions have transitioned to be wrappers around OSSL_FN_ functions. - * All of this is maintained by bn_expand and BIGNUM allocators and - * deallocators. - */ - - BN_ULONG *d; /* Pointer to |data->d| */ - int top; /* Index of last used d +1. */ - /* The next are internal book keeping for bn_expand. */ - int dmax; /* Copy of |data->dsize| */ - int neg; /* One if the number is negative */ -}; - /* Used for montgomery multiplication */ struct bn_mont_ctx_st { BIGNUM RR; /* used to convert to montgomery form, From 96dc6a9ac8f8bd48f66d0848581f2a1e16007065 Mon Sep 17 00:00:00 2001 From: Richard Levitte Date: Wed, 22 Oct 2025 15:50:41 +0200 Subject: [PATCH 07/69] OSSL_FN: Add internal construction and introspection functions These functions will be useful with other test programs without having to include crypto/fn/fn_local.h, making them closer to real world use. This also introduces OSSL_FN errors Related-to: doc/designs/fixed-size-large-numbers.md Reviewed-by: Matt Caswell Reviewed-by: Tomas Mraz (Merged from https://github.com/openssl/openssl/pull/29028) --- crypto/err/err_all.c | 2 ++ crypto/err/openssl.ec | 1 + crypto/err/openssl.txt | 1 + crypto/fn/build.info | 2 +- crypto/fn/fn_err.c | 31 +++++++++++++++++++++ crypto/fn/fn_intern.c | 56 ++++++++++++++++++++++++++++++++++++++ crypto/fn/fn_local.h | 13 +++++++++ include/crypto/fn_intern.h | 53 ++++++++++++++++++++++++++++++++++++ include/crypto/fnerr.h | 32 ++++++++++++++++++++++ include/openssl/err.h.in | 1 + test/fn_internal_test.c | 25 ++++++++++------- 11 files changed, 206 insertions(+), 11 deletions(-) create mode 100644 crypto/fn/fn_err.c create mode 100644 crypto/fn/fn_intern.c create mode 100644 include/crypto/fn_intern.h create mode 100644 include/crypto/fnerr.h diff --git a/crypto/err/err_all.c b/crypto/err/err_all.c index 7761410f2d..e614f4229d 100644 --- a/crypto/err/err_all.c +++ b/crypto/err/err_all.c @@ -13,6 +13,7 @@ #include "crypto/cryptoerr.h" #include "crypto/asn1err.h" #include "crypto/bnerr.h" +#include "crypto/fnerr.h" #include "crypto/ecerr.h" #include "crypto/buffererr.h" #include "crypto/bioerr.h" @@ -51,6 +52,7 @@ int ossl_err_load_crypto_strings(void) #ifndef OPENSSL_NO_ERR || ossl_err_load_ERR_strings() == 0 /* include error strings for SYSerr */ || ossl_err_load_BN_strings() == 0 + || ossl_err_load_OSSL_FN_strings() == 0 || ossl_err_load_RSA_strings() == 0 #ifndef OPENSSL_NO_DH || ossl_err_load_DH_strings() == 0 diff --git a/crypto/err/openssl.ec b/crypto/err/openssl.ec index 91aa11d1a6..ca1fae106f 100644 --- a/crypto/err/openssl.ec +++ b/crypto/err/openssl.ec @@ -43,6 +43,7 @@ L PROV include/openssl/proverr.h providers/common/provider_err.c L OSSL_ENCODER include/openssl/encodererr.h crypto/encode_decode/encoder_err.c include/crypto/encodererr.h L OSSL_DECODER include/openssl/decodererr.h crypto/encode_decode/decoder_err.c include/crypto/decodererr.h L HTTP include/openssl/httperr.h crypto/http/http_err.c include/crypto/httperr.h +L OSSL_FN NONE crypto/fn/fn_err.c include/crypto/fnerr.h # SSL/TLS alerts R SSL_R_TLS_ALERT_UNEXPECTED_MESSAGE 1010 diff --git a/crypto/err/openssl.txt b/crypto/err/openssl.txt index d993f02d69..7753ba5621 100644 --- a/crypto/err/openssl.txt +++ b/crypto/err/openssl.txt @@ -888,6 +888,7 @@ OSSL_ENCODER_R_ENCODER_NOT_FOUND:101:encoder not found OSSL_ENCODER_R_INCORRECT_PROPERTY_QUERY:100:incorrect property query OSSL_ENCODER_R_MISSING_GET_PARAMS:102:missing get params OSSL_ENCODER_R_UNKNOWN_PARAMETER_NAME:104:unknown parameter name +OSSL_FN_R_RESULT_ARG_TOO_SMALL:100:result arg too small OSSL_STORE_R_AMBIGUOUS_CONTENT_TYPE:107:ambiguous content type OSSL_STORE_R_BAD_PASSWORD_READ:115:bad password read OSSL_STORE_R_ERROR_VERIFYING_PKCS12_MAC:113:error verifying pkcs12 mac diff --git a/crypto/fn/build.info b/crypto/fn/build.info index 218e4b01e5..694acce2e4 100644 --- a/crypto/fn/build.info +++ b/crypto/fn/build.info @@ -2,7 +2,7 @@ $LIBCRYPTO=../../libcrypto $LIBFIPS=../../providers/libfips.a LIBS=$LIBCRYPTO -$COMMON=fn_lib.c +$COMMON=fn_err.c fn_lib.c fn_intern.c SOURCE[$LIBCRYPTO]=$COMMON SOURCE[$LIBFIPS]=$COMMON diff --git a/crypto/fn/fn_err.c b/crypto/fn/fn_err.c new file mode 100644 index 0000000000..bf6c147820 --- /dev/null +++ b/crypto/fn/fn_err.c @@ -0,0 +1,31 @@ +/* + * Generated by util/mkerr.pl DO NOT EDIT + * Copyright 1995-2025 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#include +#include "crypto/fnerr.h" + +#ifndef OPENSSL_NO_ERR + +static const ERR_STRING_DATA OSSL_FN_str_reasons[] = { + { ERR_PACK(ERR_LIB_OSSL_FN, 0, OSSL_FN_R_RESULT_ARG_TOO_SMALL), + "result arg too small" }, + { 0, NULL } +}; + +#endif + +int ossl_err_load_OSSL_FN_strings(void) +{ +#ifndef OPENSSL_NO_ERR + if (ERR_reason_error_string(OSSL_FN_str_reasons[0].error) == NULL) + ERR_load_strings_const(OSSL_FN_str_reasons); +#endif + return 1; +} diff --git a/crypto/fn/fn_intern.c b/crypto/fn/fn_intern.c new file mode 100644 index 0000000000..3aa3afb3f1 --- /dev/null +++ b/crypto/fn/fn_intern.c @@ -0,0 +1,56 @@ +/* + * Copyright 2025 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#include "internal/cryptlib.h" +#include "crypto/fn_intern.h" +#include "crypto/fnerr.h" +#include "fn_local.h" +#include + +int ossl_fn_set_words(OSSL_FN *f, const OSSL_FN_ULONG *words, size_t limbs) +{ + if (ossl_unlikely(f == NULL)) { + ERR_raise(ERR_LIB_OSSL_FN, ERR_R_PASSED_NULL_PARAMETER); + return 0; + } + + if ((size_t)f->dsize < limbs) { + ERR_raise(ERR_LIB_OSSL_FN, OSSL_FN_R_RESULT_ARG_TOO_SMALL); + return 0; + } + + memcpy(f->d, words, sizeof(OSSL_FN_ULONG) * limbs); + memset(f->d + limbs, 0, sizeof(OSSL_FN_ULONG) * (f->dsize - limbs)); + return 1; +} + +const OSSL_FN_ULONG *ossl_fn_get_words(OSSL_FN *f) +{ + if (ossl_unlikely(f == NULL)) { + ERR_raise(ERR_LIB_OSSL_FN, ERR_R_PASSED_NULL_PARAMETER); + return NULL; + } + + return f->d; +} + +size_t ossl_fn_get_dsize(OSSL_FN *f) +{ + return f->dsize; +} + +bool ossl_fn_is_dynamically_allocated(OSSL_FN *f) +{ + return f->is_dynamically_allocated; +} + +bool ossl_fn_is_securely_allocated(OSSL_FN *f) +{ + return f->is_securely_allocated; +} diff --git a/crypto/fn/fn_local.h b/crypto/fn/fn_local.h index 46b3e82b26..c30ab72304 100644 --- a/crypto/fn/fn_local.h +++ b/crypto/fn/fn_local.h @@ -15,6 +15,19 @@ #include #include "internal/common.h" #include "crypto/fn.h" +#include "crypto/fn_intern.h" + +#if OSSL_FN_BYTES == 4 +/* 32-bit systems */ +#define OSSL_FN_MASK UINT32_MAX +#elif OSSL_FN_BYTES == 8 +/* 64-bit systems */ +#define OSSL_FN_MASK UINT64_MAX +#else +#error "OpenSSL doesn't support large numbers on this platform" +#endif + +#define OSSL_FN_HIGH_BIT_MASK (OSSL_FN_ULONG_C(1) << (OSSL_FN_BYTES * 8 - 1)) struct ossl_fn_st { /* Flag: alloced with OSSL_FN_new() or OSSL_FN_secure_new() */ diff --git a/include/crypto/fn_intern.h b/include/crypto/fn_intern.h new file mode 100644 index 0000000000..df35a0a5dc --- /dev/null +++ b/include/crypto/fn_intern.h @@ -0,0 +1,53 @@ +/* + * Copyright 2025 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +/** + * @file A set of internal functions to manipulate the OSSL_FN d array, and + * for introspection. + */ + +#ifndef OPENSSL_FN_INTERN_H +#define OPENSSL_FN_INTERN_H +#pragma once + +#include +#include "crypto/fn.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#if OSSL_FN_BYTES == 4 +/* 32-bit systems */ +#define OSSL_FN_ULONG_C(n) UINT32_C(n) +#define OSSL_FN_ULONG64_C(hi32, lo32) OSSL_FN_ULONG_C(lo32), OSSL_FN_ULONG_C(hi32) +#elif OSSL_FN_BYTES == 8 +/* 64-bit systems */ +#define OSSL_FN_ULONG_C(n) UINT64_C(n) +#define OSSL_FN_ULONG64_C(hi32, lo32) (OSSL_FN_ULONG_C(hi32) << 32 | OSSL_FN_ULONG_C(lo32)) +#else +#error "OpenSSL doesn't support large numbers on this platform" +#endif + +int ossl_fn_set_words(OSSL_FN *f, const OSSL_FN_ULONG *words, size_t limbs); +const OSSL_FN_ULONG *ossl_fn_get_words(OSSL_FN *f); + +size_t ossl_fn_get_dsize(OSSL_FN *f); + +void ossl_fn_set_negative(OSSL_FN *f, bool neg); + +bool ossl_fn_is_negative(OSSL_FN *f); +bool ossl_fn_is_dynamically_allocated(OSSL_FN *f); +bool ossl_fn_is_securely_allocated(OSSL_FN *f); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/include/crypto/fnerr.h b/include/crypto/fnerr.h new file mode 100644 index 0000000000..c3aeb32671 --- /dev/null +++ b/include/crypto/fnerr.h @@ -0,0 +1,32 @@ +/* + * Generated by util/mkerr.pl DO NOT EDIT + * Copyright 2020-2025 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef OSSL_CRYPTO_FNERR_H +#define OSSL_CRYPTO_FNERR_H +#pragma once + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +int ossl_err_load_OSSL_FN_strings(void); + +/* + * OSSL_FN reason codes. + */ +#define OSSL_FN_R_RESULT_ARG_TOO_SMALL 100 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/include/openssl/err.h.in b/include/openssl/err.h.in index de27183c00..e99d5954be 100644 --- a/include/openssl/err.h.in +++ b/include/openssl/err.h.in @@ -105,6 +105,7 @@ extern "C" { #define ERR_LIB_OSSL_ENCODER 59 #define ERR_LIB_OSSL_DECODER 60 #define ERR_LIB_HTTP 61 +#define ERR_LIB_OSSL_FN 62 #define ERR_LIB_USER 128 diff --git a/test/fn_internal_test.c b/test/fn_internal_test.c index fd3f17f030..b94422bee7 100644 --- a/test/fn_internal_test.c +++ b/test/fn_internal_test.c @@ -15,6 +15,7 @@ */ #include "crypto/fn.h" +#include "crypto/fn_intern.h" #include "fn_local.h" #include "testutil.h" @@ -37,6 +38,7 @@ static int test_alloc(void) { int ret = 1; OSSL_FN *f = NULL; + const OSSL_FN_ULONG *u = NULL; /* * OSSL_FN_new_bits() calls OSSL_FN_new_bytes(), which calls @@ -49,11 +51,12 @@ static int test_alloc(void) * shaving off 17 bits for demonstration purposes. */ if (!TEST_ptr(f = OSSL_FN_new_bits(sizeof(OSSL_FN_ULONG) * 16 - 17)) - || !TEST_uint_eq(f->is_dynamically_allocated, 1) - || !TEST_uint_eq(f->is_securely_allocated, 0) - || !TEST_int_eq(f->dsize, 2) - || !TEST_size_t_eq(f->d[0], 0) - || !TEST_size_t_eq(f->d[1], 0)) + || !TEST_true(ossl_fn_is_dynamically_allocated(f)) + || !TEST_false(ossl_fn_is_securely_allocated(f)) + || !TEST_size_t_eq(ossl_fn_get_dsize(f), 2) + || !TEST_ptr(u = ossl_fn_get_words(f)) + || !TEST_size_t_eq(u[0], 0) + || !TEST_size_t_eq(u[1], 0)) ret = 0; OSSL_FN_free(f); @@ -64,6 +67,7 @@ static int test_secure_alloc(void) { int ret = 1; OSSL_FN *f = NULL; + const OSSL_FN_ULONG *u = NULL; /* * OSSL_FN_secure_new_bits() calls OSSL_FN_secure_new_bytes(), which calls @@ -76,11 +80,12 @@ static int test_secure_alloc(void) * shaving off 17 bits for demonstration purposes. */ if (!TEST_ptr(f = OSSL_FN_secure_new_bits(sizeof(OSSL_FN_ULONG) * 16 - 17)) - || !TEST_uint_eq(f->is_dynamically_allocated, 1) - || !TEST_uint_eq(f->is_securely_allocated, 1) - || !TEST_int_eq(f->dsize, 2) - || !TEST_size_t_eq(f->d[0], 0) - || !TEST_size_t_eq(f->d[1], 0)) + || !TEST_true(ossl_fn_is_dynamically_allocated(f)) + || !TEST_true(ossl_fn_is_securely_allocated(f)) + || !TEST_size_t_eq(ossl_fn_get_dsize(f), 2) + || !TEST_ptr(u = ossl_fn_get_words(f)) + || !TEST_size_t_eq(u[0], 0) + || !TEST_size_t_eq(u[1], 0)) ret = 0; OSSL_FN_free(f); From 23fdb656c30b7846147883465dd0a0a4f160176f Mon Sep 17 00:00:00 2001 From: Richard Levitte Date: Thu, 16 Oct 2025 14:58:43 +0200 Subject: [PATCH 08/69] OSSL_FN: Add 'add' and 'sub' functions This also introduces 'cmp' and 'ucmp' functions, as well as an OSSL_FN API test program. OSSL_FNs must not be polluted, so if a BIGNUM has a non-NULL 'data' field, bn_pollute() will not pollute it. It may be a good idea, though, to pollute an OSSL_FN before an operation result is written to it, for testing purposes. Related-to: doc/designs/fixed-size-large-numbers.md Resolves: https://github.com/openssl/openssl/issues/28932 Reviewed-by: Matt Caswell Reviewed-by: Tomas Mraz (Merged from https://github.com/openssl/openssl/pull/29028) --- crypto/fn/build.info | 2 +- crypto/fn/fn_addsub.c | 126 +++++++++++++++++++++++ crypto/fn/fn_local.h | 15 +++ include/crypto/fn.h | 45 +++++++++ test/README-dev.md | 2 +- test/build.info | 5 + test/fn_api_test.c | 182 ++++++++++++++++++++++++++++++++++ test/recipes/11-test_fn_api.t | 19 ++++ 8 files changed, 394 insertions(+), 2 deletions(-) create mode 100644 crypto/fn/fn_addsub.c create mode 100644 test/fn_api_test.c create mode 100644 test/recipes/11-test_fn_api.t diff --git a/crypto/fn/build.info b/crypto/fn/build.info index 694acce2e4..a7dc915760 100644 --- a/crypto/fn/build.info +++ b/crypto/fn/build.info @@ -2,7 +2,7 @@ $LIBCRYPTO=../../libcrypto $LIBFIPS=../../providers/libfips.a LIBS=$LIBCRYPTO -$COMMON=fn_err.c fn_lib.c fn_intern.c +$COMMON=fn_err.c fn_lib.c fn_intern.c fn_addsub.c SOURCE[$LIBCRYPTO]=$COMMON SOURCE[$LIBFIPS]=$COMMON diff --git a/crypto/fn/fn_addsub.c b/crypto/fn/fn_addsub.c new file mode 100644 index 0000000000..6c81c3c733 --- /dev/null +++ b/crypto/fn/fn_addsub.c @@ -0,0 +1,126 @@ +/* + * Copyright 1995-2025 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#include "internal/cryptlib.h" +#include "crypto/fnerr.h" +#include "../bn/bn_local.h" /* For using the low level bignum functions */ +#include "fn_local.h" + +/* add of b to a. */ +/* unsigned add of b to a, r can be equal to a or b. */ +int OSSL_FN_add(OSSL_FN *r, const OSSL_FN *a, const OSSL_FN *b) +{ + /* + * Addition is commutative, so we switch 'a' and 'b' around to + * ensure that 'a' is physically the largest, so a maximum of + * work is done with 'bn_add_words' + */ + if (a->dsize < b->dsize) { + const OSSL_FN *tmp; + + tmp = a; + a = b; + b = tmp; + } + + /* At this point, we know that a->dsize >= b->dsize */ + size_t max = a->dsize; + size_t min = b->dsize; + size_t rs = r->dsize; + + /* + * 'r' must be able to contain the result. This is on the caller. + */ + if (!ossl_assert(max <= rs)) { + ERR_raise(ERR_LIB_OSSL_FN, OSSL_FN_R_RESULT_ARG_TOO_SMALL); + return 0; + } + + const OSSL_FN_ULONG *ap = a->d; + const OSSL_FN_ULONG *bp = b->d; + + OSSL_FN_ULONG *rp = r->d; + OSSL_FN_ULONG carry = bn_add_words(rp, ap, bp, (int)min); + + rp += min; + ap += min; + + for (size_t dif = max - min; dif > 0; dif--, ap++, rp++) { + OSSL_FN_ULONG t1 = *ap; + OSSL_FN_ULONG t2 = (t1 + carry) & OSSL_FN_MASK; + + *rp = t2; + carry &= (t2 == 0); + } + + for (size_t dif = r->dsize - max; dif > 0; dif--, rp++) { + OSSL_FN_ULONG t1 = 0; + OSSL_FN_ULONG t2 = (t1 + carry) & OSSL_FN_MASK; + + *rp = carry; + carry &= (t2 == 0); + } + + return 1; +} + +/* unsigned subtraction of b from a */ +int OSSL_FN_sub(OSSL_FN *r, const OSSL_FN *a, const OSSL_FN *b) +{ + size_t max = (a->dsize >= b->dsize) ? a->dsize : b->dsize; + size_t min = (a->dsize <= b->dsize) ? a->dsize : b->dsize; + size_t rs = r->dsize; + + /* + * 'r' must be able to contain the result. This is on the caller. + */ + if (!ossl_assert(max <= rs)) { + ERR_raise(ERR_LIB_OSSL_FN, OSSL_FN_R_RESULT_ARG_TOO_SMALL); + return 0; + } + + const OSSL_FN_ULONG *ap = a->d; + const OSSL_FN_ULONG *bp = b->d; + OSSL_FN_ULONG *rp = r->d; + OSSL_FN_ULONG borrow = bn_sub_words(rp, ap, bp, (int)min); + + /* + * TODO(FIXNUM): everything following isn't strictly constant-time, + * and could use improvement in that regard. + */ + + ap += min; + bp += min; + rp += min; + + const OSSL_FN_ULONG *maxp = (a->dsize >= b->dsize) ? ap : bp; + + /* "sign" borrow, depending on if maxp == ap or maxp == bp */ + borrow *= (OSSL_FN_ULONG)((a->dsize >= b->dsize) ? 1 : -1); + + /* calculate the result of borrowing from more significant limbs */ + for (size_t dif = max - min; dif > 0; dif--, maxp++, rp++) { + OSSL_FN_ULONG t1 = *maxp; + OSSL_FN_ULONG t2 = (t1 - borrow) & OSSL_FN_MASK; + + *rp = t2; + borrow &= (t1 == 0); + } + + /* Finally, fill in the rest of the result array by borrowing from zeros */ + for (size_t dif = rs - max; dif > 0; dif--, rp++) { + OSSL_FN_ULONG t1 = 0; + OSSL_FN_ULONG t2 = (t1 - borrow) & OSSL_FN_MASK; + + *rp = t2; + borrow &= (t1 == 0); + } + + return 1; +} diff --git a/crypto/fn/fn_local.h b/crypto/fn/fn_local.h index c30ab72304..522548dac4 100644 --- a/crypto/fn/fn_local.h +++ b/crypto/fn/fn_local.h @@ -11,6 +11,8 @@ #define OSSL_CRYPTO_FN_LOCAL_H #include +#include +#include #include #include #include "internal/common.h" @@ -29,6 +31,19 @@ #define OSSL_FN_HIGH_BIT_MASK (OSSL_FN_ULONG_C(1) << (OSSL_FN_BYTES * 8 - 1)) +#if OSSL_FN_BYTES == 4 +/* 32-bit systems */ +#define OSSL_FN_ULONG_C(n) UINT32_C(n) +#define OSSL_FN_MASK UINT32_MAX +#elif OSSL_FN_BYTES == 8 +#define OSSL_FN_ULONG_C(n) UINT64_C(n) +#define OSSL_FN_MASK UINT64_MAX +#else +#error "OpenSSL doesn't support large numbers on this platform" +#endif + +#define OSSL_FN_HIGH_BIT_MASK (OSSL_FN_ULONG_C(1) << (OSSL_FN_BYTES * 8 - 1)) + struct ossl_fn_st { /* Flag: alloced with OSSL_FN_new() or OSSL_FN_secure_new() */ unsigned int is_dynamically_allocated : 1; diff --git a/include/crypto/fn.h b/include/crypto/fn.h index b982c74844..7858aa051d 100644 --- a/include/crypto/fn.h +++ b/include/crypto/fn.h @@ -128,6 +128,51 @@ void OSSL_FN_clear_free(OSSL_FN *f); */ void OSSL_FN_clear(OSSL_FN *f); +/* + * Arithmetic functions treat the OSSL_FN 'd' array as a large 2's complement + * unsigned integer, least significant limb first. All carrys or borrows are + * extended in the result and otherwise ignored. This makes OSSL_FN functions + * act just like operations on C unsigned integer types, but at a larger scale. + */ + +/** + * Add two OSSL_FN numbers. + * + * @param[out] r The OSSL_FN for the result + * @param[in] a The first operand + * @param[in] b The second operand + * @returns 1 on success, 0 on error + */ +int OSSL_FN_add(OSSL_FN *r, const OSSL_FN *a, const OSSL_FN *b); + +/** + * Add an OSSL_FN_ULONG word to an OSSL_FN numbers. + * + * @param[in,out] a The OSSL_FN to add the word to + * @param[in] w The OSSL_FN_ULONG word + * @returns 1 on success, 0 on error + */ +int OSSL_FN_add_word(OSSL_FN *a, const OSSL_FN_ULONG *w); + +/** + * Subtract two OSSL_FN numbers. + * + * @param[out] r The OSSL_FN for the result + * @param[in] a The first operand + * @param[in] b The second operand + * @returns 1 on success, 0 on error + */ +int OSSL_FN_sub(OSSL_FN *r, const OSSL_FN *a, const OSSL_FN *b); + +/** + * Subtract an OSSL_FN_ULONG word from an OSSL_FN numbers. + * + * @param[in,out] a The OSSL_FN to subtract the word from + * @param[in] w The OSSL_FN_ULONG word + * @returns 1 on success, 0 on error + */ +int OSSL_FN_sub_word(OSSL_FN *a, const OSSL_FN_ULONG *w); + #ifdef __cplusplus } #endif diff --git a/test/README-dev.md b/test/README-dev.md index 3b855d8519..3c29fe2894 100644 --- a/test/README-dev.md +++ b/test/README-dev.md @@ -25,7 +25,7 @@ The number `{nn}` is (somewhat loosely) grouped as follows: 00-04 sanity, internal and essential API tests 05-09 individual symmetric cipher algorithms - 10-14 math (bignum) + 10-14 math (bignum and ossl_fn) 15-19 individual asymmetric cipher algorithms 20-24 openssl commands (some otherwise not tested) 25-29 certificate forms, generation and verification diff --git a/test/build.info b/test/build.info index 743c4a2c3a..85b768b758 100644 --- a/test/build.info +++ b/test/build.info @@ -1132,6 +1132,11 @@ IF[{- !$disabled{tests} -}] INCLUDE[fn_internal_test]=.. ../include ../crypto/fn ../apps/include DEPEND[fn_internal_test]=../libcrypto.a libtestutil.a + PROGRAMS{noinst}=fn_api_test + SOURCE[fn_api_test]=fn_api_test.c + INCLUDE[fn_api_test]=.. ../include ../crypto/fn ../apps/include + DEPEND[fn_api_test]=../libcrypto.a libtestutil.a + SOURCE[bn_internal_test]=bn_internal_test.c INCLUDE[bn_internal_test]=.. ../include ../crypto/bn ../apps/include DEPEND[bn_internal_test]=../libcrypto.a libtestutil.a diff --git a/test/fn_api_test.c b/test/fn_api_test.c new file mode 100644 index 0000000000..949901d55b --- /dev/null +++ b/test/fn_api_test.c @@ -0,0 +1,182 @@ +/* + * Copyright 2025 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +/** + * @file Internal tests of OSSL_FN + * + * This tests OSSL_FN internals only, i.e. anything that requires including + * ../crypto/fn/fn_local.h, such as introspection. + */ + +#include +#include "crypto/fn.h" +#include "crypto/fn_intern.h" +#include "testutil.h" + +/* + * Helper to pollute a number before writing to it. + * This is a destructive function, use with care! + */ +static int pollute(OSSL_FN *f, size_t start, size_t end) +{ + /* Constness deliberately violated here */ + OSSL_FN_ULONG *u = (OSSL_FN_ULONG *)ossl_fn_get_words(f); + size_t l = ossl_fn_get_dsize(f); + + if (end > l) + end = l; + if (start > end) + start = end; + + unsigned char tmp_char; + (void)RAND_bytes(&tmp_char, 1); + memset(u + start, tmp_char, sizeof(OSSL_FN_ULONG) * (end - start)); + return 1; +} + +static const OSSL_FN_ULONG num[][8 / OSSL_FN_BYTES] = { + /* num[0] */ { OSSL_FN_ULONG64_C(0x80000000, 0x00000001) }, + /* num[1] */ { OSSL_FN_ULONG64_C(0x00000001, 0x80000000) }, + /* num[2] */ { OSSL_FN_ULONG64_C(0x01234567, 0x89abcdef) }, + /* num[3] */ { OSSL_FN_ULONG64_C(0xfedcba98, 0x76543210) }, +}; + +static const OSSL_FN_ULONG expected_add_num_num[4][4][3] = { + { + /* num[0] + num[0] */ { OSSL_FN_ULONG64_C(0x00000000, 0x00000002), OSSL_FN_ULONG_C(0x1) }, + /* num[0] + num[1] */ { OSSL_FN_ULONG64_C(0x80000001, 0x80000001) }, + /* num[0] + num[2] */ { OSSL_FN_ULONG64_C(0x81234567, 0x89abcdf0) }, + /* num[0] + num[3] */ { OSSL_FN_ULONG64_C(0x7edcba98, 0x76543211), OSSL_FN_ULONG_C(0x1) }, + }, + { + /* num[1] + num[0] */ { OSSL_FN_ULONG64_C(0x80000001, 0x80000001) }, + /* num[1] + num[1] */ { OSSL_FN_ULONG64_C(0x00000003, 0x00000000) }, + /* num[1] + num[2] */ { OSSL_FN_ULONG64_C(0x01234569, 0x09abcdef) }, + /* num[1] + num[3] */ { OSSL_FN_ULONG64_C(0xfedcba99, 0xf6543210) }, + }, + { + /* num[2] + num[0] */ { OSSL_FN_ULONG64_C(0x81234567, 0x89abcdf0) }, + /* num[2] + num[1] */ { OSSL_FN_ULONG64_C(0x01234569, 0x09abcdef) }, + /* num[2] + num[2] */ { OSSL_FN_ULONG64_C(0x02468acf, 0x13579bde) }, + /* num[2] + num[3] */ { OSSL_FN_ULONG64_C(0xffffffff, 0xffffffff) }, + }, + { + /* num[3] + num[0] */ { OSSL_FN_ULONG64_C(0x7edcba98, 0x76543211), OSSL_FN_ULONG_C(0x1) }, + /* num[3] + num[1] */ { OSSL_FN_ULONG64_C(0xfedcba99, 0xf6543210) }, + /* num[3] + num[2] */ { OSSL_FN_ULONG64_C(0xffffffff, 0xffffffff) }, + /* num[3] + num[3] */ { OSSL_FN_ULONG64_C(0xfdb97530, 0xeca86420), OSSL_FN_ULONG_C(0x1) }, + }, +}; + +static int test_add(int i) +{ + size_t i1 = i / 4; + size_t i2 = i % 4; + const OSSL_FN_ULONG *n1 = num[i1]; + size_t n1_limbs = sizeof(num[i1]) / OSSL_FN_BYTES; + const OSSL_FN_ULONG *n2 = num[i2]; + size_t n2_limbs = sizeof(num[i2]) / OSSL_FN_BYTES; + const OSSL_FN_ULONG *ex = expected_add_num_num[i1][i2]; + size_t ex_limbs = sizeof(expected_add_num_num[i1][i2]) / OSSL_FN_BYTES; + int ret = 1; + OSSL_FN *num1 = NULL, *num2 = NULL, *res = NULL; + const OSSL_FN_ULONG *u = NULL; + + /* To test that OSSL_FN_add() does a complete job, 'res' is pre-polluted */ + + if (!TEST_ptr(num1 = OSSL_FN_new_limbs(n1_limbs)) + || !TEST_ptr(num2 = OSSL_FN_new_limbs(n2_limbs)) + || !TEST_ptr(res = OSSL_FN_new_limbs(ex_limbs)) + || !TEST_true(pollute(res, 0, ex_limbs)) + || !TEST_true(ossl_fn_set_words(num1, n1, n1_limbs)) + || !TEST_true(ossl_fn_set_words(num2, n2, n2_limbs)) + || !TEST_true(OSSL_FN_add(res, num1, num2)) + || !TEST_ptr(u = ossl_fn_get_words(res)) + || !TEST_mem_eq(u, ossl_fn_get_dsize(res) * OSSL_FN_BYTES, + ex, ex_limbs * OSSL_FN_BYTES)) + ret = 0; + OSSL_FN_free(num1); + OSSL_FN_free(num2); + OSSL_FN_free(res); + + return ret; +} + +/* Dimension the expected arrays to fit 4 32-bit limbs */ +#define EXPECTED_LIMBS ((16 + OSSL_FN_BYTES - 1) / OSSL_FN_BYTES) +static OSSL_FN_ULONG expected_sub_num_num[4][4][EXPECTED_LIMBS] = { + { + /* num[0] - num[0] */ { OSSL_FN_ULONG64_C(0x00000000, 0x00000000) }, + /* num[0] - num[1] */ { OSSL_FN_ULONG64_C(0x7ffffffe, 0x80000001) }, + /* num[0] - num[2] */ { OSSL_FN_ULONG64_C(0x7edcba98, 0x76543212) }, + /* num[0] - num[3] */ { OSSL_FN_ULONG64_C(0x81234567, 0x89abcdf1), OSSL_FN_ULONG64_C(0xffffffff, 0xffffffff) }, + }, + { + /* num[1] - num[0] */ { OSSL_FN_ULONG64_C(0x80000001, 0x7fffffff), + OSSL_FN_ULONG64_C(0xffffffff, 0xffffffff) }, + /* num[1] - num[1] */ { OSSL_FN_ULONG64_C(0x00000000, 0x00000000) }, + /* num[1] - num[2] */ { OSSL_FN_ULONG64_C(0xfedcba99, 0xf6543211), OSSL_FN_ULONG64_C(0xffffffff, 0xffffffff) }, + /* num[1] - num[3] */ { OSSL_FN_ULONG64_C(0x01234569, 0x09abcdf0), OSSL_FN_ULONG64_C(0xffffffff, 0xffffffff) }, + }, + { + /* num[2] - num[0] */ { OSSL_FN_ULONG64_C(0x81234567, 0x89abcdee), + OSSL_FN_ULONG64_C(0xffffffff, 0xffffffff) }, + /* num[2] - num[1] */ { OSSL_FN_ULONG64_C(0x01234566, 0x09abcdef) }, + /* num[2] - num[2] */ { OSSL_FN_ULONG64_C(0x00000000, 0x00000000) }, + /* num[2] - num[3] */ { OSSL_FN_ULONG64_C(0x02468acf, 0x13579bdf), OSSL_FN_ULONG64_C(0xffffffff, 0xffffffff) }, + }, + { + /* num[3] - num[0] */ { OSSL_FN_ULONG64_C(0x7edcba98, 0x7654320f) }, + /* num[3] - num[1] */ { OSSL_FN_ULONG64_C(0xfedcba96, 0xf6543210) }, + /* num[3] - num[2] */ { OSSL_FN_ULONG64_C(0xfdb97530, 0xeca86421) }, + /* num[3] - num[3] */ { OSSL_FN_ULONG64_C(0x00000000, 0x00000000) }, + }, +}; + +static int test_sub(int i) +{ + size_t i1 = i / 4; + size_t i2 = i % 4; + const OSSL_FN_ULONG *n1 = num[i1]; + size_t n1_limbs = sizeof(num[i1]) / OSSL_FN_BYTES; + const OSSL_FN_ULONG *n2 = num[i2]; + size_t n2_limbs = sizeof(num[i2]) / OSSL_FN_BYTES; + const OSSL_FN_ULONG *ex = expected_sub_num_num[i1][i2]; + size_t ex_limbs = sizeof(expected_sub_num_num[i1][i2]) / OSSL_FN_BYTES; + int ret = 1; + OSSL_FN *num1 = NULL, *num2 = NULL, *res = NULL; + const OSSL_FN_ULONG *u = NULL; + + /* To test that OSSL_FN_sub() does a complete job, 'res' is pre-polluted */ + + if (!TEST_ptr(num1 = OSSL_FN_new_limbs(n1_limbs)) + || !TEST_ptr(num2 = OSSL_FN_new_limbs(n2_limbs)) + || !TEST_ptr(res = OSSL_FN_new_limbs(ex_limbs)) + || !TEST_true(pollute(res, 0, ex_limbs)) + || !TEST_true(ossl_fn_set_words(num1, n1, n1_limbs)) + || !TEST_true(ossl_fn_set_words(num2, n2, n2_limbs)) + || !TEST_true(OSSL_FN_sub(res, num1, num2)) + || !TEST_ptr(u = ossl_fn_get_words(res)) + || !TEST_mem_eq(u, ossl_fn_get_dsize(res) * OSSL_FN_BYTES, + ex, ex_limbs * OSSL_FN_BYTES)) + ret = 0; + OSSL_FN_free(num1); + OSSL_FN_free(num2); + OSSL_FN_free(res); + + return ret; +} + +int setup_tests(void) +{ + ADD_ALL_TESTS(test_add, 16); + ADD_ALL_TESTS(test_sub, 16); + + return 1; +} diff --git a/test/recipes/11-test_fn_api.t b/test/recipes/11-test_fn_api.t new file mode 100644 index 0000000000..0bec5d2a83 --- /dev/null +++ b/test/recipes/11-test_fn_api.t @@ -0,0 +1,19 @@ +#! /usr/bin/env perl +# Copyright 2025 The OpenSSL Project Authors. All Rights Reserved. +# +# Licensed under the Apache License 2.0 (the "License"). You may not use +# this file except in compliance with the License. You can obtain a copy +# in the file LICENSE in the source distribution or at +# https://www.openssl.org/source/license.html + +use strict; +use OpenSSL::Test; # get 'plan' +use OpenSSL::Test::Simple; +use OpenSSL::Test::Utils; + +setup("test_fn_api"); + +plan skip_all => "This test is unsupported in a shared library build on Windows" + if $^O eq 'MSWin32' && !disabled("shared"); + +simple_test("test_fn_api", "fn_api_test"); From 1bde024e9b695eb2349f350559ba711efe4ff6ca Mon Sep 17 00:00:00 2001 From: Richard Levitte Date: Thu, 23 Oct 2025 13:33:37 +0200 Subject: [PATCH 09/69] OSSL_FN: Add internal functions to acquire the OSSL_FN from a BIGNUM bn_acquire_ossl_fn() returns the OSSL_FN of a BIGNUM if there is one, expanded to a given number of limbs. bn_release() makes necessary adjustments to the BIGNUM after a run of OSSL_FN operations on the OSSL instance it's backed by. These two functions are most useful with BIGNUMs used to store operation results, and are meant to help refactoring BN operators to be wrappers around corresponding OSSL_FN operators. Reviewed-by: Matt Caswell Reviewed-by: Tomas Mraz (Merged from https://github.com/openssl/openssl/pull/29028) --- crypto/bn/bn_local.h | 54 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git a/crypto/bn/bn_local.h b/crypto/bn/bn_local.h index 16c7d35355..ce955c97d0 100644 --- a/crypto/bn/bn_local.h +++ b/crypto/bn/bn_local.h @@ -715,4 +715,58 @@ static ossl_inline int bn_set_top(BIGNUM *b, int newtop) return b->top; } +/* + * bn_acquire_ossl_fn() and bn_release() work in tandem, and are + * most useful in OSSL_FN_ wrapper functions, specifically with the + * BIGNUM in which an operation result is written. + */ + +/** + * Acquire the OSSL_FN from a BIGNUM. The BIGNUM should no longer be + * used until bn_release() is called. + * + * @param[in] b The BIGNUM instance to get an OSSL_FN from + * @param[in] limbs The minimum number of limbs 'b' should be expanded to. + * Note that this doesn't set 'top', that's done by + * bn_release(). + * @returns the OSSL_FN instance of the BIGNUM, if there is one + * @pre b and b->data must not be NULL + */ +static ossl_inline OSSL_FN *bn_acquire_ossl_fn(BIGNUM *b, int limbs) +{ + if (ossl_unlikely(b == NULL || b->data == NULL)) + return NULL; + + if (bn_wexpand(b, limbs) == NULL) + return NULL; + /* TODO(FIXNUM): should we add a flag bit for this in b->flags ? */ + return b->data; +} + +/** + * Release the BIGNUM from which the OSSL_FN was acquired. This will + * adjust the BIGNUM to what was done with its OSSL_FN, and the BIGNUM + * can again be used with BN_ functions. + * + * @param[in] b The BIGNUM instance to release + * @param[in] limbs The maximum number of significant limbs. This sets + * 'top'. + * @pre b and b->data must not be NULL + */ +static ossl_inline void bn_release(BIGNUM *b, int limbs) +{ + if (ossl_unlikely(b == NULL || b->data == NULL)) + return; + + int fixed_top = (b->flags & BN_FLG_FIXED_TOP) != 0; + + bn_set_top(b, limbs); + + /* Don't correct top if BN_FLG_FIXED_TOP was set */ + if (fixed_top) + return; + + bn_correct_top(b); +} + #endif From e3ae863a2db66e6bb58b2e91366671ca1946bc92 Mon Sep 17 00:00:00 2001 From: Richard Levitte Date: Thu, 23 Oct 2025 13:42:37 +0200 Subject: [PATCH 10/69] OSSL_FN: Wrap BIGNUM 'add' and 'sub' functions around OSSL_FN functions This involves the following functions: - 'BN_add' - 'BN_sub' - 'BN_uadd' - 'BN_usub' Care is taken to use the previous (now legacy) code if any of the argument BIGNUMs isn't backed by an OSSL_FN (i.e. if its 'data' field is NULL). Reviewed-by: Matt Caswell Reviewed-by: Tomas Mraz (Merged from https://github.com/openssl/openssl/pull/29028) --- crypto/bn/bn_add.c | 75 +++++++++++++++++++++++++++++++++++++++++--- crypto/bn/bn_lib.c | 2 +- crypto/bn/bn_local.h | 1 + 3 files changed, 73 insertions(+), 5 deletions(-) diff --git a/crypto/bn/bn_add.c b/crypto/bn/bn_add.c index 1784091b01..497526cc64 100644 --- a/crypto/bn/bn_add.c +++ b/crypto/bn/bn_add.c @@ -10,6 +10,21 @@ #include "internal/cryptlib.h" #include "bn_local.h" +static size_t calculate_max_limbs(const BIGNUM *a, const BIGNUM *b) +{ + OSSL_FN *af = a->data; + OSSL_FN *bf = b->data; + + return (af->dsize > bf->dsize) ? af->dsize : bf->dsize; +} + +static bool is_highest_bit_set(const BIGNUM *a) +{ + OSSL_FN *af = a->data; + + return (af->d[af->dsize - 1] & OSSL_FN_HIGH_BIT_MASK) != 0; +} + /* signed add of b to a. */ int BN_add(BIGNUM *r, const BIGNUM *a, const BIGNUM *b) { @@ -72,8 +87,9 @@ int BN_sub(BIGNUM *r, const BIGNUM *a, const BIGNUM *b) return ret; } -/* unsigned add of b to a, r can be equal to a or b. */ -int BN_uadd(BIGNUM *r, const BIGNUM *a, const BIGNUM *b) +/* TODO(FIXNUM): TO BE REMOVED */ +/* pure BIGNUM unsigned add of b to a, r can be equal to a or b. */ +static int bn_uadd_legacy(BIGNUM *r, const BIGNUM *a, const BIGNUM *b) { int max, min, dif; const BN_ULONG *ap, *bp; @@ -121,8 +137,35 @@ int BN_uadd(BIGNUM *r, const BIGNUM *a, const BIGNUM *b) return 1; } -/* unsigned subtraction of b from a, a must be larger than b. */ -int BN_usub(BIGNUM *r, const BIGNUM *a, const BIGNUM *b) +/* unsigned add of b to a, r can be equal to a or b. */ +int BN_uadd(BIGNUM *r, const BIGNUM *a, const BIGNUM *b) +{ + /* TODO(FIXNUM): TO BE REMOVED */ + if (r->data == NULL || a->data == NULL || b->data == NULL) + return bn_uadd_legacy(r, a, b); + + bn_check_top(a); + bn_check_top(b); + + size_t max = calculate_max_limbs(a, b); + + /* + * If either operands have the highest bit set the result may become + * one limb larger. + */ + if (is_highest_bit_set(a) || is_highest_bit_set(b)) + max++; + + OSSL_FN *rf = bn_acquire_ossl_fn(r, (int)max); + int ret = OSSL_FN_add(rf, a->data, b->data); + bn_release(r, (int)max); + + return ret; +} + +/* TODO(FIXNUM): TO BE REMOVED */ +/* pure BIGNUM unsigned subtraction of b from a, a must be larger than b. */ +static int bn_usub_legacy(BIGNUM *r, const BIGNUM *a, const BIGNUM *b) { int max, min, dif; BN_ULONG t1, t2, borrow, *rp; @@ -167,3 +210,27 @@ int BN_usub(BIGNUM *r, const BIGNUM *a, const BIGNUM *b) return 1; } + +/* unsigned subtraction of b from a, a must be larger than b. */ +int BN_usub(BIGNUM *r, const BIGNUM *a, const BIGNUM *b) +{ + /* TODO(FIXNUM): TO BE REMOVED */ + if (r->data == NULL || a->data == NULL || b->data == NULL) + return bn_usub_legacy(r, a, b); + + bn_check_top(a); + bn_check_top(b); + + if (a->top < b->top) { /* hmm... should not be happening */ + ERR_raise(ERR_LIB_BN, BN_R_ARG2_LT_ARG3); + return 0; + } + + size_t max = calculate_max_limbs(a, b); + + OSSL_FN *rf = bn_acquire_ossl_fn(r, (int)max); + int ret = OSSL_FN_sub(rf, a->data, b->data); + bn_release(r, (int)max); + + return ret; +} diff --git a/crypto/bn/bn_lib.c b/crypto/bn/bn_lib.c index f5b224ba42..33ada652e5 100644 --- a/crypto/bn/bn_lib.c +++ b/crypto/bn/bn_lib.c @@ -279,7 +279,7 @@ static OSSL_FN *bn_expand_internal(const BIGNUM *b, int words) { OSSL_FN *a = NULL; - if (ossl_unlikely(words > (INT_MAX / (4 * BN_BITS2)))) { + if (ossl_unlikely(words > BN_MAX_WORDS)) { ERR_raise(ERR_LIB_BN, BN_R_BIGNUM_TOO_LONG); return NULL; } diff --git a/crypto/bn/bn_local.h b/crypto/bn/bn_local.h index ce955c97d0..235a2a851b 100644 --- a/crypto/bn/bn_local.h +++ b/crypto/bn/bn_local.h @@ -227,6 +227,7 @@ static ossl_inline void bn_check_top(const BIGNUM *bn) } else if ((bn->flags & BN_FLG_FIXED_TOP) == 0) { assert(bn->d[bn->top - 1] != 0); } + assert(bn->dmax >= 0 && bn->dmax <= BN_MAX_WORDS); } } From e148c8a233d9967cea7cd9b67c957f15768fe435 Mon Sep 17 00:00:00 2001 From: Richard Levitte Date: Fri, 21 Nov 2025 09:41:43 +0100 Subject: [PATCH 11/69] BIGNUM: fix setting of 'top' in 'bn_mul_fixed_top' When 'bn_set_top()' was applied, a couple of spots were missed. This cause some test failures. Reviewed-by: Matt Caswell Reviewed-by: Tomas Mraz (Merged from https://github.com/openssl/openssl/pull/29028) --- crypto/bn/bn_mul.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/crypto/bn/bn_mul.c b/crypto/bn/bn_mul.c index 4717556cc6..f87b0d3c99 100644 --- a/crypto/bn/bn_mul.c +++ b/crypto/bn/bn_mul.c @@ -501,8 +501,6 @@ int bn_mul_fixed_top(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, BN_CTX *ctx) BIGNUM *rr; #if !defined(OPENSSL_SMALL_FOOTPRINT) int i; - BIGNUM *t = NULL; - int j = 0, k; #endif bn_check_top(a); @@ -534,7 +532,7 @@ int bn_mul_fixed_top(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, BN_CTX *ctx) if (bn_wexpand(rr, 8) == NULL) goto err; rr->flags |= BN_FLG_FIXED_TOP; - rr->top = 8; + bn_set_top(rr, 8); bn_mul_comba4(rr->d, a->d, b->d); goto end; } @@ -543,7 +541,7 @@ int bn_mul_fixed_top(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, BN_CTX *ctx) if (bn_wexpand(rr, 16) == NULL) goto err; rr->flags |= BN_FLG_FIXED_TOP; - rr->top = 16; + bn_set_top(rr, 16); bn_mul_comba8(rr->d, a->d, b->d); goto end; } @@ -551,6 +549,9 @@ int bn_mul_fixed_top(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, BN_CTX *ctx) if ((al >= BN_MULL_SIZE_NORMAL) && (bl >= BN_MULL_SIZE_NORMAL)) { if (i >= -1 && i <= 1) { + BIGNUM *t = NULL; + int j = 0, k; + /* * Find out the power of two lower or equal to the longest of the * two numbers @@ -574,19 +575,18 @@ int bn_mul_fixed_top(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, BN_CTX *ctx) t->flags |= BN_FLG_FIXED_TOP; if (bn_wexpand(rr, k * 4) == NULL) goto err; - rr->top = k * 4; + bn_set_top(rr, k * 4); rr->flags |= BN_FLG_FIXED_TOP; bn_mul_part_recursive(rr->d, a->d, b->d, j, al - j, bl - j, t->d); } else { /* al <= j || bl <= j */ - if (bn_wexpand(t, k * 2) == NULL) goto err; t->top = k * 2; t->flags |= BN_FLG_FIXED_TOP; if (bn_wexpand(rr, k * 2) == NULL) goto err; - rr->top = k * 2; + bn_set_top(rr, k * 2); rr->flags |= BN_FLG_FIXED_TOP; bn_mul_recursive(rr->d, a->d, b->d, j, al - j, bl - j, t->d); } From cf738674e17072fff2c890e8123a2d2a9dfdf607 Mon Sep 17 00:00:00 2001 From: Richard Levitte Date: Mon, 17 Nov 2025 13:50:43 +0100 Subject: [PATCH 12/69] Add the fixed number context (OSSL_FN_CTX) with (de)allocators and tests OSSL_FN_CTX is a reimplementation of BN_CTX, with the intent to have good enough API parity. The distinguishing feature with OSSL_FN_CTX is that it works as an arena allocator, so it must be allocated with an estimate of how much memory space will be needed for all OSSL_FN instances that will be retrieved from that arena, and a bit of overhead. Related-to: doc/designs/fixed-size-large-numbers.md Resolves: https://github.com/openssl/openssl/issues/28933 Reviewed-by: Matt Caswell Reviewed-by: Tomas Mraz (Merged from https://github.com/openssl/openssl/pull/29161) --- crypto/fn/build.info | 2 +- crypto/fn/fn_ctx.c | 186 ++++++++++++++++++++++++++++++++++++++++ crypto/fn/fn_lib.c | 36 ++------ crypto/fn/fn_local.h | 30 +++++++ include/crypto/fn.h | 79 +++++++++++++++++ include/crypto/types.h | 1 + test/fn_internal_test.c | 113 ++++++++++++++++++++++++ 7 files changed, 416 insertions(+), 31 deletions(-) create mode 100644 crypto/fn/fn_ctx.c diff --git a/crypto/fn/build.info b/crypto/fn/build.info index a7dc915760..ecaf1ac6e7 100644 --- a/crypto/fn/build.info +++ b/crypto/fn/build.info @@ -2,7 +2,7 @@ $LIBCRYPTO=../../libcrypto $LIBFIPS=../../providers/libfips.a LIBS=$LIBCRYPTO -$COMMON=fn_err.c fn_lib.c fn_intern.c fn_addsub.c +$COMMON=fn_err.c fn_lib.c fn_ctx.c fn_intern.c fn_addsub.c SOURCE[$LIBCRYPTO]=$COMMON SOURCE[$LIBFIPS]=$COMMON diff --git a/crypto/fn/fn_ctx.c b/crypto/fn/fn_ctx.c new file mode 100644 index 0000000000..d463cd0774 --- /dev/null +++ b/crypto/fn/fn_ctx.c @@ -0,0 +1,186 @@ +/* + * Copyright 2025 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#include +#include +#include "crypto/fn.h" +#include "fn_local.h" + +/* + * An OSSL_FN_CTX is a large pre-allocated chunk of memory that can be used + * to quickly allocate OSSL_FN instances. The organization of memory is as + * a fairly typical arena, where OSSL_FN instances are "stacked" one after + * the other. + * + * However, there is also the concept of frames, which are arenas within an + * arena. This allows easily passing an OSSL_FN_CTX to a function, and for + * that function to allocate such a frame for itself, and easily deallocate + * it when it's done. + */ + +struct ossl_fn_ctx_st { + /* + * Pointer to the last OSSL_FN_CTX_start() location (a simple pointer into + * the memory area). See the struct ossl_fn_ctx_frame_st definition below + * for details. + */ + struct ossl_fn_ctx_frame_st *last_frame; + + /* + * Flags + */ + unsigned int is_securely_allocated : 1; + + /* + * The arena itself. + */ + size_t msize; /* Size of the arena, in bytes */ + unsigned char memory[]; +}; + +struct ossl_fn_ctx_frame_st { + /* + * Pointer back to the whole arena where the frame is located, + * for |last_frame| bookkeeping. + */ + struct ossl_fn_ctx_st *arena; + /* + * Pointer to the previous frame in the arena, allowing OSSL_FN_CTX_end() + * to do its job. + */ + struct ossl_fn_ctx_frame_st *previous_frame; + /* + * Every time OSSL_FN_CTX_get() is called, the current value of + * |free_memory| is returned, and it's updated by incrementing it + * by the number of bytes given by OSSL_FN_CTX_get(). + * The available number of bytes is limited by what's left in the arena. + */ + unsigned char *free_memory; /* Pointer to the free area of the frame */ + size_t msize; /* Size of the frame, in bytes */ + unsigned char memory[]; +}; + +static size_t calculate_arena_size(size_t max_n_frames, size_t max_n_numbers, size_t max_n_limbs) +{ + return max_n_frames * sizeof(struct ossl_fn_ctx_frame_st) + + max_n_numbers * sizeof(OSSL_FN) + + max_n_limbs * OSSL_FN_BYTES; +} + +OSSL_FN_CTX *OSSL_FN_CTX_new(OSSL_LIB_CTX *libctx, size_t max_n_frames, + size_t max_n_numbers, size_t max_n_limbs) +{ + size_t arena_size = calculate_arena_size(max_n_frames, max_n_numbers, max_n_limbs); + OSSL_FN_CTX *ctx = OPENSSL_zalloc(sizeof(OSSL_FN_CTX) + arena_size); + + if (ctx != NULL) + ctx->msize = arena_size; + + return ctx; +} + +OSSL_FN_CTX *OSSL_FN_CTX_secure_new(OSSL_LIB_CTX *libctx, size_t max_n_frames, + size_t max_n_numbers, size_t max_n_limbs) +{ + size_t arena_size = calculate_arena_size(max_n_frames, max_n_numbers, max_n_limbs); + OSSL_FN_CTX *ctx = OPENSSL_secure_zalloc(sizeof(OSSL_FN_CTX) + arena_size); + + if (ctx != NULL) { + ctx->msize = arena_size; + ctx->is_securely_allocated = 1; + } + + return ctx; +} + +void OSSL_FN_CTX_free(OSSL_FN_CTX *ctx) +{ + if (ctx == NULL) + return; + + assert(ctx->last_frame == NULL); + + if (ctx->is_securely_allocated) + OPENSSL_secure_free(ctx); + else + OPENSSL_free(ctx); +} + +int OSSL_FN_CTX_start(OSSL_FN_CTX *ctx) +{ + if (!ossl_assert(ctx != NULL)) + return 0; + + struct ossl_fn_ctx_frame_st *last_frame = ctx->last_frame; + size_t used = (last_frame == NULL) ? 0 : last_frame->free_memory - ctx->memory; + + if (ctx->msize - used < sizeof(struct ossl_fn_ctx_frame_st)) + return 0; + + if (ctx->last_frame == NULL) + ctx->last_frame = (struct ossl_fn_ctx_frame_st *)ctx->memory; + else + ctx->last_frame = (struct ossl_fn_ctx_frame_st *)last_frame->free_memory; + + struct ossl_fn_ctx_frame_st *frame = ctx->last_frame; + frame->arena = ctx; + frame->previous_frame = last_frame; + frame->free_memory = frame->memory; + frame->msize = ctx->msize - used - sizeof(*frame); + + return 1; +} + +int OSSL_FN_CTX_end(OSSL_FN_CTX *ctx) +{ + if (!ossl_assert(ctx != NULL)) + return 0; + + struct ossl_fn_ctx_frame_st *last_frame = ctx->last_frame; + + ctx->last_frame = last_frame->previous_frame; + + return 1; +} + +OSSL_FN *OSSL_FN_CTX_get_limbs(OSSL_FN_CTX *ctx, size_t limbs) +{ + if (!ossl_assert(ctx != NULL)) + return NULL; + + struct ossl_fn_ctx_frame_st *frame = ctx->last_frame; + + if (!ossl_assert(frame != NULL)) + return NULL; + + size_t totalsize = ossl_fn_totalsize(limbs); + size_t used = frame->free_memory - frame->memory; + if (totalsize == 0 || frame->msize - used < totalsize) + return NULL; + + OSSL_FN *fn = (OSSL_FN *)frame->free_memory; + frame->free_memory += totalsize; + + memset(fn, 0, totalsize); + fn->dsize = (int)limbs; + fn->is_securely_allocated = ctx->is_securely_allocated; + fn->is_dynamically_allocated = 1; + + return fn; +} + +OSSL_FN *OSSL_FN_CTX_get_bytes(OSSL_FN_CTX *ctx, size_t bytes) +{ + return OSSL_FN_CTX_get_limbs(ctx, ossl_fn_bytes_to_limbs(bytes)); +} + +OSSL_FN *OSSL_FN_CTX_get_bits(OSSL_FN_CTX *ctx, size_t bits) +{ + return OSSL_FN_CTX_get_bytes(ctx, ossl_fn_bits_to_bytes(bits)); +} diff --git a/crypto/fn/fn_lib.c b/crypto/fn/fn_lib.c index a4eb60b98e..78638151f8 100644 --- a/crypto/fn/fn_lib.c +++ b/crypto/fn/fn_lib.c @@ -16,23 +16,9 @@ static OSSL_FN *ossl_fn_new_internal(size_t limbs, bool securely) { - /* - * Since the number of limbs is represented as an 'int' in OSSL_FN, - * we must ensure that the desired size isn't larger than can be - * represented. - */ - if (ossl_unlikely(limbs >= INT_MAX)) - return NULL; - /* Total size of the whole OSSL_FN, in bytes */ - size_t totalsize = sizeof(OSSL_FN) + limbs * sizeof(OSSL_FN_ULONG); - - /* - * If the size ends up being smaller than the bookkeeping struct, - * we know that the size calculation has wrapped around and is - * therefore invalid. Also, we don't allow zero byte numbers. - */ - if (totalsize <= sizeof(OSSL_FN)) + size_t totalsize = ossl_fn_totalsize(limbs); + if (totalsize == 0) return NULL; OSSL_FN *ret = NULL; @@ -80,34 +66,24 @@ OSSL_FN *OSSL_FN_secure_new_limbs(size_t size) return ossl_fn_new_internal(size, true); } -static size_t bytes_to_limbs(size_t size) -{ - return (size + sizeof(OSSL_FN_ULONG) - 1) / sizeof(OSSL_FN_ULONG); -} - OSSL_FN *OSSL_FN_new_bytes(size_t size) { - return OSSL_FN_new_limbs(bytes_to_limbs(size)); + return OSSL_FN_new_limbs(ossl_fn_bytes_to_limbs(size)); } OSSL_FN *OSSL_FN_secure_new_bytes(size_t size) { - return OSSL_FN_secure_new_limbs(bytes_to_limbs(size)); -} - -static size_t bits_to_bytes(size_t size) -{ - return (size + 7) / 8; + return OSSL_FN_secure_new_limbs(ossl_fn_bytes_to_limbs(size)); } OSSL_FN *OSSL_FN_new_bits(size_t size) { - return OSSL_FN_new_bytes(bits_to_bytes(size)); + return OSSL_FN_new_bytes(ossl_fn_bits_to_bytes(size)); } OSSL_FN *OSSL_FN_secure_new_bits(size_t size) { - return OSSL_FN_secure_new_bytes(bits_to_bytes(size)); + return OSSL_FN_secure_new_bytes(ossl_fn_bits_to_bytes(size)); } void OSSL_FN_free(OSSL_FN *f) diff --git a/crypto/fn/fn_local.h b/crypto/fn/fn_local.h index 522548dac4..0c7893f2b9 100644 --- a/crypto/fn/fn_local.h +++ b/crypto/fn/fn_local.h @@ -63,6 +63,36 @@ struct ossl_fn_st { OSSL_FN_ULONG d[]; }; +static ossl_inline size_t ossl_fn_totalsize(size_t limbs) +{ + /* + * TODO(FIXNUM): Since the number of limbs is currently represented + * as an 'int' in OSSL_FN, we must ensure that the desired size isn't + * larger than can be represented. + */ + if (ossl_unlikely(limbs >= INT_MAX)) + return 0; + + /* + * sizeof(OSSL_FN) + limbs * sizeof(OSSL_FN_ULONG) > SIZE_MAX + * => limbs * sizeof(OSSL_FN_ULONG) > SIZE_MAX - sizeof(OSSL_FN) + * => limbs > (SIZE_MAX - sizeof(OSSL_FN)) / sizeof(OSSL_FN_ULONG) + */ + if (ossl_unlikely(limbs > (SIZE_MAX - sizeof(OSSL_FN)) / sizeof(OSSL_FN_ULONG))) + return 0; + return sizeof(OSSL_FN) + limbs * sizeof(OSSL_FN_ULONG); +} + +static ossl_inline size_t ossl_fn_bytes_to_limbs(size_t size) +{ + return (size + sizeof(OSSL_FN_ULONG) - 1) / sizeof(OSSL_FN_ULONG); +} + +static ossl_inline size_t ossl_fn_bits_to_bytes(size_t size) +{ + return (size + 7) / 8; +} + /* * Internal functions to support BIGNUM's bn_expand_internal, BN_copy, and * similar. diff --git a/include/crypto/fn.h b/include/crypto/fn.h index 7858aa051d..b5eb37a296 100644 --- a/include/crypto/fn.h +++ b/include/crypto/fn.h @@ -14,6 +14,7 @@ #include #include #include +#include #include "crypto/types.h" #ifdef __cplusplus @@ -128,6 +129,84 @@ void OSSL_FN_clear_free(OSSL_FN *f); */ void OSSL_FN_clear(OSSL_FN *f); +/** + * Allocate a new OSSL_FN_CTX, given a set of input numbers. + * + * @param[in] libctx OpenSSL library context (currently unused) + * @param[in] max_n_frames Maximum number of simultaneously active frames. + * This indicates the expected depth of call stack + * that the resulting OSSL_FN_CTX will be used in. + * @param[in] max_n_numbers Maximum number of simultaneously active OSSL_FN. + * @param[in] max_n_limbs Maximum number of simultaneously active OSSL_FN + * limbs. + * @returns An allocated OSSL_FN_CTX, or NULL on error. + **/ +OSSL_FN_CTX *OSSL_FN_CTX_new(OSSL_LIB_CTX *libctx, size_t max_n_frames, + size_t max_n_numbers, size_t max_n_limbs); +/** + * Allocate a new OSSL_FN_CTX in secure memory, given a set of input numbers. + * Other than allocating in secure memory, this function does exactly the same + * thing as OSSL_FN_CTX_new(). + **/ +OSSL_FN_CTX *OSSL_FN_CTX_secure_new(OSSL_LIB_CTX *libctx, size_t max_n_frames, + size_t max_n_numbers, size_t max_n_limbs); +/** + * Free an OSSL_FN_CTX. + * + * @param[in] ctx The OSSL_FN_CTX to be freed. This may be NULL. + */ +void OSSL_FN_CTX_free(OSSL_FN_CTX *ctx); + +/** + * Start a new OSSL_FN_CTX frame. This *must* be called by any function + * that wants to get a temporary OSSL_FN from the OSSL_FN_CTX. The function + * call this must also clean up with a OSSL_FN_CTX_end() call. + * + * @param[in] ctx The OSSL_FN_CTX to start the frame in. + * @returns 1 on success, 0 on error. + */ +int OSSL_FN_CTX_start(OSSL_FN_CTX *ctx); + +/** + * End the last OSSL_FN_CTX frame, resetting back to the previous + * frame. If a function called OSSL_FN_CTX_start(), it *must* call + * this function before returning. + * + * @param[in] ctx The OSSL_FN_CTX to start the frame in. + * @returns 1 on success, 0 on error. + */ +int OSSL_FN_CTX_end(OSSL_FN_CTX *ctx); + +/** + * Get a suitably sized OSSL_FN from an OSSL_FN_CTX. + * + * @param[in] ctx The OSSL_FN_CTX + * @param[in] limbs The desired size of the resulting OSSL_FN, + * in number of limbs. + * @returns an OSSL_FN pointer on success, NULL on error. + */ +OSSL_FN *OSSL_FN_CTX_get_limbs(OSSL_FN_CTX *ctx, size_t limbs); + +/** + * Get a suitably sized OSSL_FN from an OSSL_FN_CTX. + * + * @param[in] ctx The OSSL_FN_CTX + * @param[in] limbs The desired size of the resulting OSSL_FN, + * in number of bytes. + * @returns an OSSL_FN pointer on success, NULL on error. + */ +OSSL_FN *OSSL_FN_CTX_get_bytes(OSSL_FN_CTX *ctx, size_t bytes); + +/** + * Get a suitably sized OSSL_FN from an OSSL_FN_CTX. + * + * @param[in] ctx The OSSL_FN_CTX + * @param[in] limbs The desired size of the resulting OSSL_FN, + * in number of bits. + * @returns an OSSL_FN pointer on success, NULL on error. + */ +OSSL_FN *OSSL_FN_CTX_get_bits(OSSL_FN_CTX *ctx, size_t bits); + /* * Arithmetic functions treat the OSSL_FN 'd' array as a large 2's complement * unsigned integer, least significant limb first. All carrys or borrows are diff --git a/include/crypto/types.h b/include/crypto/types.h index 9ff8db69c4..32a7517ee6 100644 --- a/include/crypto/types.h +++ b/include/crypto/types.h @@ -15,6 +15,7 @@ /* At some point in the future, this may move to include/openssl/types.h */ typedef struct ossl_fn_st OSSL_FN; +typedef struct ossl_fn_ctx_st OSSL_FN_CTX; #ifdef OPENSSL_NO_DEPRECATED_3_0 typedef struct rsa_st RSA; diff --git a/test/fn_internal_test.c b/test/fn_internal_test.c index b94422bee7..fb157cdc54 100644 --- a/test/fn_internal_test.c +++ b/test/fn_internal_test.c @@ -92,11 +92,124 @@ static int test_secure_alloc(void) return ret; } +static int test_ctx(void) +{ + int ret = 1; + OSSL_FN_CTX *ctx = NULL; + OSSL_FN *f = NULL; + + /* + * Make a CTX that is likely to contain two 2048-bit or one 4096-bit OSSL_FN + * and one frame (let's overestimate its size to 128 bytes). + * Note that OSSL_FN_CTX_new() takes a size in bytes, so we must ensure that + * we get that number right. + */ + if (!TEST_ptr(ctx = OSSL_FN_CTX_new(NULL, 1, 2, 4096 / 8 / OSSL_FN_BYTES))) { + ret = 0; + /* It's pointless to try more tests after this failure */ + goto end; + } + + /* Check that we can get 1 2048-bit OSSL_FN instance, and check its metadata */ + if (!TEST_true(OSSL_FN_CTX_start(ctx))) { + ret = 0; + /* It's pointless to try more tests after this failure */ + goto end; + } + if (!TEST_ptr(f = OSSL_FN_CTX_get_bits(ctx, 2048)) + || !TEST_true(ossl_fn_is_dynamically_allocated(f)) + || !TEST_false(ossl_fn_is_securely_allocated(f))) + ret = 0; + if (!TEST_true(OSSL_FN_CTX_end(ctx))) { + ret = 0; + /* It's pointless to try more tests after this failure */ + goto end; + } + + /* Check that we can get 2 2048-bit OSSL_FN instances, but not 3 */ + if (!TEST_true(OSSL_FN_CTX_start(ctx))) { + ret = 0; + /* It's pointless to try more tests after this failure */ + goto end; + } + if (!TEST_ptr(f = OSSL_FN_CTX_get_bits(ctx, 2048)) + || !TEST_ptr(f = OSSL_FN_CTX_get_bits(ctx, 2048)) + || !TEST_ptr_null(f = OSSL_FN_CTX_get_bits(ctx, 2048))) + ret = 0; + if (!TEST_true(OSSL_FN_CTX_end(ctx))) { + ret = 0; + /* It's pointless to try more tests after this failure */ + goto end; + } + + /* Check that we can get 1 4096-bit OSSL_FN instance, but not 2 */ + if (!TEST_true(OSSL_FN_CTX_start(ctx))) { + ret = 0; + /* It's pointless to try more tests after this failure */ + goto end; + } + if (!TEST_ptr(f = OSSL_FN_CTX_get_bits(ctx, 4096)) + || !TEST_ptr_null(f = OSSL_FN_CTX_get_bits(ctx, 2048))) + ret = 0; + if (!TEST_true(OSSL_FN_CTX_end(ctx))) { + ret = 0; + /* It's pointless to try more tests after this failure */ + goto end; + } + +end: + OSSL_FN_CTX_free(ctx); + + return ret; +} + +static int test_secure_ctx(void) +{ + int ret = 1; + OSSL_FN_CTX *ctx = NULL; + OSSL_FN *f = NULL; + + /* + * Make a CTX that is likely to contain two 2048-bit OSSL_FN and one frame + * (let's overestimate its size to 128 bytes). + * Note that OSSL_FN_CTX_new() takes a size in bytes, so we must ensure that + * we get that number right. + */ + if (!TEST_ptr(ctx = OSSL_FN_CTX_secure_new(NULL, 1, 2, 2048 / 8 / OSSL_FN_BYTES))) { + ret = 0; + /* It's pointless to try more tests after this failure */ + goto end; + } + + /* Check that we can get 1 2048-bit OSSL_FN instance, and check its metadata */ + if (!TEST_true(OSSL_FN_CTX_start(ctx))) { + ret = 0; + /* It's pointless to try more tests after this failure */ + goto end; + } + if (!TEST_ptr(f = OSSL_FN_CTX_get_bits(ctx, 2048)) + || !TEST_true(ossl_fn_is_dynamically_allocated(f)) + || !TEST_true(ossl_fn_is_securely_allocated(f))) + ret = 0; + if (!TEST_true(OSSL_FN_CTX_end(ctx))) { + ret = 0; + /* It's pointless to try more tests after this failure */ + goto end; + } + +end: + OSSL_FN_CTX_free(ctx); + + return ret; +} + int setup_tests(void) { ADD_TEST(test_struct); ADD_TEST(test_alloc); ADD_TEST(test_secure_alloc); + ADD_TEST(test_ctx); + ADD_TEST(test_secure_ctx); return 1; } From 504fb345aff0c6d2576da847835fe46f11725f44 Mon Sep 17 00:00:00 2001 From: Richard Levitte Date: Mon, 24 Nov 2025 08:52:53 +0100 Subject: [PATCH 13/69] BIGNUM: separate out word-only helper functions from bn_mul.c This separation will allow us to use the word-only helper functions from OSSL_FN functions without pulling in functions that operate on BIGNUMs. This also starts the collection of source files with word-only BN functions that haven't found their way into bn_asm.c for various reasons. To recognise them, they are prefixed 'bnw_' instead of 'bn_'. While at it, consitification is done where appropriate among words helpers. Reviewed-by: Matt Caswell Reviewed-by: Tomas Mraz (Merged from https://github.com/openssl/openssl/pull/29203) --- crypto/bn/asm/x86_64-gcc.c | 6 +- crypto/bn/bn_asm.c | 8 +- crypto/bn/bn_local.h | 14 +- crypto/bn/bn_mul.c | 536 ------------------------------------- crypto/bn/bnw_mul.c | 405 ++++++++++++++++++++++++++++ crypto/bn/bnw_sub.c | 155 +++++++++++ crypto/bn/build.info | 9 +- 7 files changed, 582 insertions(+), 551 deletions(-) create mode 100644 crypto/bn/bnw_mul.c create mode 100644 crypto/bn/bnw_sub.c diff --git a/crypto/bn/asm/x86_64-gcc.c b/crypto/bn/asm/x86_64-gcc.c index 7edb77806e..c25b06e770 100644 --- a/crypto/bn/asm/x86_64-gcc.c +++ b/crypto/bn/asm/x86_64-gcc.c @@ -261,7 +261,7 @@ BN_ULONG bn_sub_words(BN_ULONG *rp, const BN_ULONG *ap, const BN_ULONG *bp, #else /* Simics 1.4<7 has buggy sbbq:-( */ #define BN_MASK2 0xffffffffffffffffL -BN_ULONG bn_sub_words(BN_ULONG *r, BN_ULONG *a, BN_ULONG *b, int n) +BN_ULONG bn_sub_words(BN_ULONG *r, const BN_ULONG *a, const BN_ULONG *b, int n) { BN_ULONG t1, t2; int c = 0; @@ -408,7 +408,7 @@ BN_ULONG bn_sub_words(BN_ULONG *r, BN_ULONG *a, BN_ULONG *b, int n) #define sqr_add_c2(a, i, j, c0, c1, c2) \ mul_add_c2((a)[i], (a)[j], c0, c1, c2) -void bn_mul_comba8(BN_ULONG *r, BN_ULONG *a, BN_ULONG *b) +void bn_mul_comba8(BN_ULONG *r, const BN_ULONG *a, const BN_ULONG *b) { BN_ULONG c1, c2, c3; @@ -511,7 +511,7 @@ void bn_mul_comba8(BN_ULONG *r, BN_ULONG *a, BN_ULONG *b) r[15] = c1; } -void bn_mul_comba4(BN_ULONG *r, BN_ULONG *a, BN_ULONG *b) +void bn_mul_comba4(BN_ULONG *r, const BN_ULONG *a, const BN_ULONG *b) { BN_ULONG c1, c2, c3; diff --git a/crypto/bn/bn_asm.c b/crypto/bn/bn_asm.c index e667702143..f7998658ac 100644 --- a/crypto/bn/bn_asm.c +++ b/crypto/bn/bn_asm.c @@ -622,7 +622,7 @@ BN_ULONG bn_sub_words(BN_ULONG *r, const BN_ULONG *a, const BN_ULONG *b, mul_add_c2((a)[i], (a)[j], c0, c1, c2) #endif /* !BN_LLONG */ -void bn_mul_comba8(BN_ULONG *r, BN_ULONG *a, BN_ULONG *b) +void bn_mul_comba8(BN_ULONG *r, const BN_ULONG *a, const BN_ULONG *b) { BN_ULONG c1, c2, c3; @@ -725,7 +725,7 @@ void bn_mul_comba8(BN_ULONG *r, BN_ULONG *a, BN_ULONG *b) r[15] = c1; } -void bn_mul_comba4(BN_ULONG *r, BN_ULONG *a, BN_ULONG *b) +void bn_mul_comba4(BN_ULONG *r, const BN_ULONG *a, const BN_ULONG *b) { BN_ULONG c1, c2, c3; @@ -1006,7 +1006,7 @@ void bn_sqr_comba8(BN_ULONG *r, const BN_ULONG *a) bn_sqr_normal(r, a, 8, t); } -void bn_mul_comba4(BN_ULONG *r, BN_ULONG *a, BN_ULONG *b) +void bn_mul_comba4(BN_ULONG *r, const BN_ULONG *a, const BN_ULONG *b) { r[4] = bn_mul_words(&(r[0]), a, 4, b[0]); r[5] = bn_mul_add_words(&(r[1]), a, 4, b[1]); @@ -1014,7 +1014,7 @@ void bn_mul_comba4(BN_ULONG *r, BN_ULONG *a, BN_ULONG *b) r[7] = bn_mul_add_words(&(r[3]), a, 4, b[3]); } -void bn_mul_comba8(BN_ULONG *r, BN_ULONG *a, BN_ULONG *b) +void bn_mul_comba8(BN_ULONG *r, const BN_ULONG *a, const BN_ULONG *b) { r[8] = bn_mul_words(&(r[0]), a, 8, b[0]); r[9] = bn_mul_add_words(&(r[1]), a, 8, b[1]); diff --git a/crypto/bn/bn_local.h b/crypto/bn/bn_local.h index 235a2a851b..6668209728 100644 --- a/crypto/bn/bn_local.h +++ b/crypto/bn/bn_local.h @@ -652,21 +652,21 @@ void BN_RECP_CTX_init(BN_RECP_CTX *recp); void BN_MONT_CTX_init(BN_MONT_CTX *ctx); void bn_init(BIGNUM *a); -void bn_mul_normal(BN_ULONG *r, BN_ULONG *a, int na, BN_ULONG *b, int nb); -void bn_mul_comba8(BN_ULONG *r, BN_ULONG *a, BN_ULONG *b); -void bn_mul_comba4(BN_ULONG *r, BN_ULONG *a, BN_ULONG *b); +void bn_mul_normal(BN_ULONG *r, const BN_ULONG *a, int na, const BN_ULONG *b, int nb); +void bn_mul_comba8(BN_ULONG *r, const BN_ULONG *a, const BN_ULONG *b); +void bn_mul_comba4(BN_ULONG *r, const BN_ULONG *a, const BN_ULONG *b); void bn_sqr_normal(BN_ULONG *r, const BN_ULONG *a, int n, BN_ULONG *tmp); void bn_sqr_comba8(BN_ULONG *r, const BN_ULONG *a); void bn_sqr_comba4(BN_ULONG *r, const BN_ULONG *a); int bn_cmp_words(const BN_ULONG *a, const BN_ULONG *b, int n); int bn_cmp_part_words(const BN_ULONG *a, const BN_ULONG *b, int cl, int dl); -void bn_mul_recursive(BN_ULONG *r, BN_ULONG *a, BN_ULONG *b, int n2, +void bn_mul_recursive(BN_ULONG *r, const BN_ULONG *a, const BN_ULONG *b, int n2, int dna, int dnb, BN_ULONG *t); -void bn_mul_part_recursive(BN_ULONG *r, BN_ULONG *a, BN_ULONG *b, +void bn_mul_part_recursive(BN_ULONG *r, const BN_ULONG *a, const BN_ULONG *b, int n, int tna, int tnb, BN_ULONG *t); void bn_sqr_recursive(BN_ULONG *r, const BN_ULONG *a, int n2, BN_ULONG *t); -void bn_mul_low_normal(BN_ULONG *r, BN_ULONG *a, BN_ULONG *b, int n); -void bn_mul_low_recursive(BN_ULONG *r, BN_ULONG *a, BN_ULONG *b, int n2, +void bn_mul_low_normal(BN_ULONG *r, const BN_ULONG *a, const BN_ULONG *b, int n); +void bn_mul_low_recursive(BN_ULONG *r, const BN_ULONG *a, const BN_ULONG *b, int n2, BN_ULONG *t); BN_ULONG bn_sub_part_words(BN_ULONG *r, const BN_ULONG *a, const BN_ULONG *b, int cl, int dl); diff --git a/crypto/bn/bn_mul.c b/crypto/bn/bn_mul.c index f87b0d3c99..d887c23225 100644 --- a/crypto/bn/bn_mul.c +++ b/crypto/bn/bn_mul.c @@ -11,479 +11,6 @@ #include "internal/cryptlib.h" #include "bn_local.h" -#if defined(OPENSSL_NO_ASM) || !defined(OPENSSL_BN_ASM_PART_WORDS) -/* - * Here follows specialised variants of bn_add_words() and bn_sub_words(). - * They have the property performing operations on arrays of different sizes. - * The sizes of those arrays is expressed through cl, which is the common - * length ( basically, min(len(a),len(b)) ), and dl, which is the delta - * between the two lengths, calculated as len(a)-len(b). All lengths are the - * number of BN_ULONGs... For the operations that require a result array as - * parameter, it must have the length cl+abs(dl). These functions should - * probably end up in bn_asm.c as soon as there are assembler counterparts - * for the systems that use assembler files. - */ - -BN_ULONG bn_sub_part_words(BN_ULONG *r, - const BN_ULONG *a, const BN_ULONG *b, - int cl, int dl) -{ - BN_ULONG c, t; - - assert(cl >= 0); - c = bn_sub_words(r, a, b, cl); - - if (dl == 0) - return c; - - r += cl; - a += cl; - b += cl; - - if (dl < 0) { - for (;;) { - t = b[0]; - r[0] = (0 - t - c) & BN_MASK2; - if (t != 0) - c = 1; - if (++dl >= 0) - break; - - t = b[1]; - r[1] = (0 - t - c) & BN_MASK2; - if (t != 0) - c = 1; - if (++dl >= 0) - break; - - t = b[2]; - r[2] = (0 - t - c) & BN_MASK2; - if (t != 0) - c = 1; - if (++dl >= 0) - break; - - t = b[3]; - r[3] = (0 - t - c) & BN_MASK2; - if (t != 0) - c = 1; - if (++dl >= 0) - break; - - b += 4; - r += 4; - } - } else { - int save_dl = dl; - while (c) { - t = a[0]; - r[0] = (t - c) & BN_MASK2; - if (t != 0) - c = 0; - if (--dl <= 0) - break; - - t = a[1]; - r[1] = (t - c) & BN_MASK2; - if (t != 0) - c = 0; - if (--dl <= 0) - break; - - t = a[2]; - r[2] = (t - c) & BN_MASK2; - if (t != 0) - c = 0; - if (--dl <= 0) - break; - - t = a[3]; - r[3] = (t - c) & BN_MASK2; - if (t != 0) - c = 0; - if (--dl <= 0) - break; - - save_dl = dl; - a += 4; - r += 4; - } - if (dl > 0) { - if (save_dl > dl) { - switch (save_dl - dl) { - case 1: - r[1] = a[1]; - if (--dl <= 0) - break; - /* fall through */ - case 2: - r[2] = a[2]; - if (--dl <= 0) - break; - /* fall through */ - case 3: - r[3] = a[3]; - if (--dl <= 0) - break; - } - a += 4; - r += 4; - } - } - if (dl > 0) { - for (;;) { - r[0] = a[0]; - if (--dl <= 0) - break; - r[1] = a[1]; - if (--dl <= 0) - break; - r[2] = a[2]; - if (--dl <= 0) - break; - r[3] = a[3]; - if (--dl <= 0) - break; - - a += 4; - r += 4; - } - } - } - return c; -} -#endif - -#ifndef OPENSSL_SMALL_FOOTPRINT -/* - * Karatsuba recursive multiplication algorithm (cf. Knuth, The Art of - * Computer Programming, Vol. 2) - */ - -/*- - * r is 2*n2 words in size, - * a and b are both n2 words in size. - * n2 must be a power of 2. - * We multiply and return the result. - * t must be 2*n2 words in size - * We calculate - * a[0]*b[0] - * a[0]*b[0]+a[1]*b[1]+(a[0]-a[1])*(b[1]-b[0]) - * a[1]*b[1] - */ -/* dnX may not be positive, but n2/2+dnX has to be */ -void bn_mul_recursive(BN_ULONG *r, BN_ULONG *a, BN_ULONG *b, int n2, - int dna, int dnb, BN_ULONG *t) -{ - int n = n2 / 2, c1, c2; - int tna = n + dna, tnb = n + dnb; - unsigned int neg, zero; - BN_ULONG ln, lo, *p; - - /* - * Only call bn_mul_comba 8 if n2 == 8 and the two arrays are complete - * [steve] - */ - if (n2 == 8 && dna == 0 && dnb == 0) { - bn_mul_comba8(r, a, b); - return; - } - - /* Else do normal multiply */ - if (n2 < BN_MUL_RECURSIVE_SIZE_NORMAL) { - bn_mul_normal(r, a, n2 + dna, b, n2 + dnb); - if ((dna + dnb) < 0) - memset(&r[2 * n2 + dna + dnb], 0, - sizeof(BN_ULONG) * -(dna + dnb)); - return; - } - /* r=(a[0]-a[1])*(b[1]-b[0]) */ - c1 = bn_cmp_part_words(a, &(a[n]), tna, n - tna); - c2 = bn_cmp_part_words(&(b[n]), b, tnb, tnb - n); - zero = neg = 0; - switch (c1 * 3 + c2) { - case -4: - bn_sub_part_words(t, &(a[n]), a, tna, tna - n); /* - */ - bn_sub_part_words(&(t[n]), b, &(b[n]), tnb, n - tnb); /* - */ - break; - case -3: - zero = 1; - break; - case -2: - bn_sub_part_words(t, &(a[n]), a, tna, tna - n); /* - */ - bn_sub_part_words(&(t[n]), &(b[n]), b, tnb, tnb - n); /* + */ - neg = 1; - break; - case -1: - case 0: - case 1: - zero = 1; - break; - case 2: - bn_sub_part_words(t, a, &(a[n]), tna, n - tna); /* + */ - bn_sub_part_words(&(t[n]), b, &(b[n]), tnb, n - tnb); /* - */ - neg = 1; - break; - case 3: - zero = 1; - break; - case 4: - bn_sub_part_words(t, a, &(a[n]), tna, n - tna); - bn_sub_part_words(&(t[n]), &(b[n]), b, tnb, tnb - n); - break; - } - - if (n == 4 && dna == 0 && dnb == 0) { /* XXX: bn_mul_comba4 could take - * extra args to do this well */ - if (!zero) - bn_mul_comba4(&(t[n2]), t, &(t[n])); - else - memset(&t[n2], 0, sizeof(*t) * 8); - - bn_mul_comba4(r, a, b); - bn_mul_comba4(&(r[n2]), &(a[n]), &(b[n])); - } else if (n == 8 && dna == 0 && dnb == 0) { /* XXX: bn_mul_comba8 could - * take extra args to do - * this well */ - if (!zero) - bn_mul_comba8(&(t[n2]), t, &(t[n])); - else - memset(&t[n2], 0, sizeof(*t) * 16); - - bn_mul_comba8(r, a, b); - bn_mul_comba8(&(r[n2]), &(a[n]), &(b[n])); - } else { - p = &(t[n2 * 2]); - if (!zero) - bn_mul_recursive(&(t[n2]), t, &(t[n]), n, 0, 0, p); - else - memset(&t[n2], 0, sizeof(*t) * n2); - bn_mul_recursive(r, a, b, n, 0, 0, p); - bn_mul_recursive(&(r[n2]), &(a[n]), &(b[n]), n, dna, dnb, p); - } - - /*- - * t[32] holds (a[0]-a[1])*(b[1]-b[0]), c1 is the sign - * r[10] holds (a[0]*b[0]) - * r[32] holds (b[1]*b[1]) - */ - - c1 = (int)(bn_add_words(t, r, &(r[n2]), n2)); - - if (neg) { /* if t[32] is negative */ - c1 -= (int)(bn_sub_words(&(t[n2]), t, &(t[n2]), n2)); - } else { - /* Might have a carry */ - c1 += (int)(bn_add_words(&(t[n2]), &(t[n2]), t, n2)); - } - - /*- - * t[32] holds (a[0]-a[1])*(b[1]-b[0])+(a[0]*b[0])+(a[1]*b[1]) - * r[10] holds (a[0]*b[0]) - * r[32] holds (b[1]*b[1]) - * c1 holds the carry bits - */ - c1 += (int)(bn_add_words(&(r[n]), &(r[n]), &(t[n2]), n2)); - if (c1) { - p = &(r[n + n2]); - lo = *p; - ln = (lo + c1) & BN_MASK2; - *p = ln; - - /* - * The overflow will stop before we over write words we should not - * overwrite - */ - if (ln < (BN_ULONG)c1) { - do { - p++; - lo = *p; - ln = (lo + 1) & BN_MASK2; - *p = ln; - } while (ln == 0); - } - } -} - -/* - * n+tn is the word length t needs to be n*4 is size, as does r - */ -/* tnX may not be negative but less than n */ -void bn_mul_part_recursive(BN_ULONG *r, BN_ULONG *a, BN_ULONG *b, int n, - int tna, int tnb, BN_ULONG *t) -{ - int i, j, n2 = n * 2; - int c1, c2, neg; - BN_ULONG ln, lo, *p; - - if (n < 8) { - bn_mul_normal(r, a, n + tna, b, n + tnb); - return; - } - - /* r=(a[0]-a[1])*(b[1]-b[0]) */ - c1 = bn_cmp_part_words(a, &(a[n]), tna, n - tna); - c2 = bn_cmp_part_words(&(b[n]), b, tnb, tnb - n); - neg = 0; - switch (c1 * 3 + c2) { - case -4: - bn_sub_part_words(t, &(a[n]), a, tna, tna - n); /* - */ - bn_sub_part_words(&(t[n]), b, &(b[n]), tnb, n - tnb); /* - */ - break; - case -3: - case -2: - bn_sub_part_words(t, &(a[n]), a, tna, tna - n); /* - */ - bn_sub_part_words(&(t[n]), &(b[n]), b, tnb, tnb - n); /* + */ - neg = 1; - break; - case -1: - case 0: - case 1: - case 2: - bn_sub_part_words(t, a, &(a[n]), tna, n - tna); /* + */ - bn_sub_part_words(&(t[n]), b, &(b[n]), tnb, n - tnb); /* - */ - neg = 1; - break; - case 3: - case 4: - bn_sub_part_words(t, a, &(a[n]), tna, n - tna); - bn_sub_part_words(&(t[n]), &(b[n]), b, tnb, tnb - n); - break; - } - /* - * The zero case isn't yet implemented here. The speedup would probably - * be negligible. - */ -#if 0 - if (n == 4) { - bn_mul_comba4(&(t[n2]), t, &(t[n])); - bn_mul_comba4(r, a, b); - bn_mul_normal(&(r[n2]), &(a[n]), tn, &(b[n]), tn); - memset(&r[n2 + tn * 2], 0, sizeof(*r) * (n2 - tn * 2)); - } else -#endif - if (n == 8) { - bn_mul_comba8(&(t[n2]), t, &(t[n])); - bn_mul_comba8(r, a, b); - bn_mul_normal(&(r[n2]), &(a[n]), tna, &(b[n]), tnb); - memset(&r[n2 + tna + tnb], 0, sizeof(*r) * (n2 - tna - tnb)); - } else { - p = &(t[n2 * 2]); - bn_mul_recursive(&(t[n2]), t, &(t[n]), n, 0, 0, p); - bn_mul_recursive(r, a, b, n, 0, 0, p); - i = n / 2; - /* - * If there is only a bottom half to the number, just do it - */ - if (tna > tnb) - j = tna - i; - else - j = tnb - i; - if (j == 0) { - bn_mul_recursive(&(r[n2]), &(a[n]), &(b[n]), - i, tna - i, tnb - i, p); - memset(&r[n2 + i * 2], 0, sizeof(*r) * (n2 - i * 2)); - } else if (j > 0) { /* eg, n == 16, i == 8 and tn == 11 */ - bn_mul_part_recursive(&(r[n2]), &(a[n]), &(b[n]), - i, tna - i, tnb - i, p); - memset(&(r[n2 + tna + tnb]), 0, - sizeof(BN_ULONG) * (n2 - tna - tnb)); - } else { /* (j < 0) eg, n == 16, i == 8 and tn == 5 */ - - memset(&r[n2], 0, sizeof(*r) * n2); - if (tna < BN_MUL_RECURSIVE_SIZE_NORMAL - && tnb < BN_MUL_RECURSIVE_SIZE_NORMAL) { - bn_mul_normal(&(r[n2]), &(a[n]), tna, &(b[n]), tnb); - } else { - for (;;) { - i /= 2; - /* - * these simplified conditions work exclusively because - * difference between tna and tnb is 1 or 0 - */ - if (i < tna || i < tnb) { - bn_mul_part_recursive(&(r[n2]), - &(a[n]), &(b[n]), - i, tna - i, tnb - i, p); - break; - } else if (i == tna || i == tnb) { - bn_mul_recursive(&(r[n2]), - &(a[n]), &(b[n]), - i, tna - i, tnb - i, p); - break; - } - } - } - } - } - - /*- - * t[32] holds (a[0]-a[1])*(b[1]-b[0]), c1 is the sign - * r[10] holds (a[0]*b[0]) - * r[32] holds (b[1]*b[1]) - */ - - c1 = (int)(bn_add_words(t, r, &(r[n2]), n2)); - - if (neg) { /* if t[32] is negative */ - c1 -= (int)(bn_sub_words(&(t[n2]), t, &(t[n2]), n2)); - } else { - /* Might have a carry */ - c1 += (int)(bn_add_words(&(t[n2]), &(t[n2]), t, n2)); - } - - /*- - * t[32] holds (a[0]-a[1])*(b[1]-b[0])+(a[0]*b[0])+(a[1]*b[1]) - * r[10] holds (a[0]*b[0]) - * r[32] holds (b[1]*b[1]) - * c1 holds the carry bits - */ - c1 += (int)(bn_add_words(&(r[n]), &(r[n]), &(t[n2]), n2)); - if (c1) { - p = &(r[n + n2]); - lo = *p; - ln = (lo + c1) & BN_MASK2; - *p = ln; - - /* - * The overflow will stop before we over write words we should not - * overwrite - */ - if (ln < (BN_ULONG)c1) { - do { - p++; - lo = *p; - ln = (lo + 1) & BN_MASK2; - *p = ln; - } while (ln == 0); - } - } -} - -/*- - * a and b must be the same size, which is n2. - * r needs to be n2 words and t needs to be n2*2 - */ -void bn_mul_low_recursive(BN_ULONG *r, BN_ULONG *a, BN_ULONG *b, int n2, - BN_ULONG *t) -{ - int n = n2 / 2; - - bn_mul_recursive(r, a, b, n, 0, 0, &(t[0])); - if (n >= BN_MUL_LOW_RECURSIVE_SIZE_NORMAL) { - bn_mul_low_recursive(&(t[0]), &(a[0]), &(b[n]), n, &(t[n2])); - bn_add_words(&(r[n]), &(r[n]), &(t[0]), n); - bn_mul_low_recursive(&(t[0]), &(a[n]), &(b[0]), n, &(t[n2])); - bn_add_words(&(r[n]), &(r[n]), &(t[0]), n); - } else { - bn_mul_low_normal(&(t[0]), &(a[0]), &(b[n]), n); - bn_mul_low_normal(&(t[n]), &(a[n]), &(b[0]), n); - bn_add_words(&(r[n]), &(r[n]), &(t[0]), n); - bn_add_words(&(r[n]), &(r[n]), &(t[n]), n); - } -} -#endif /* OPENSSL_SMALL_FOOTPRINT */ - int BN_mul(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, BN_CTX *ctx) { int ret = bn_mul_fixed_top(r, a, b, ctx); @@ -614,66 +141,3 @@ err: BN_CTX_end(ctx); return ret; } - -void bn_mul_normal(BN_ULONG *r, BN_ULONG *a, int na, BN_ULONG *b, int nb) -{ - BN_ULONG *rr; - - if (na < nb) { - int itmp; - BN_ULONG *ltmp; - - itmp = na; - na = nb; - nb = itmp; - ltmp = a; - a = b; - b = ltmp; - } - rr = &(r[na]); - if (nb <= 0) { - (void)bn_mul_words(r, a, na, 0); - return; - } else - rr[0] = bn_mul_words(r, a, na, b[0]); - - for (;;) { - if (--nb <= 0) - return; - rr[1] = bn_mul_add_words(&(r[1]), a, na, b[1]); - if (--nb <= 0) - return; - rr[2] = bn_mul_add_words(&(r[2]), a, na, b[2]); - if (--nb <= 0) - return; - rr[3] = bn_mul_add_words(&(r[3]), a, na, b[3]); - if (--nb <= 0) - return; - rr[4] = bn_mul_add_words(&(r[4]), a, na, b[4]); - rr += 4; - r += 4; - b += 4; - } -} - -void bn_mul_low_normal(BN_ULONG *r, BN_ULONG *a, BN_ULONG *b, int n) -{ - bn_mul_words(r, a, n, b[0]); - - for (;;) { - if (--n <= 0) - return; - bn_mul_add_words(&(r[1]), a, n, b[1]); - if (--n <= 0) - return; - bn_mul_add_words(&(r[2]), a, n, b[2]); - if (--n <= 0) - return; - bn_mul_add_words(&(r[3]), a, n, b[3]); - if (--n <= 0) - return; - bn_mul_add_words(&(r[4]), a, n, b[4]); - r += 4; - b += 4; - } -} diff --git a/crypto/bn/bnw_mul.c b/crypto/bn/bnw_mul.c new file mode 100644 index 0000000000..4ab4cac21c --- /dev/null +++ b/crypto/bn/bnw_mul.c @@ -0,0 +1,405 @@ +/* + * Copyright 1995-2025 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#include +#include "bn_local.h" + +#ifndef OPENSSL_SMALL_FOOTPRINT +/* + * Karatsuba recursive multiplication algorithm (cf. Knuth, The Art of + * Computer Programming, Vol. 2) + */ + +/*- + * r is 2*n2 words in size, + * a and b are both n2 words in size. + * n2 must be a power of 2. + * We multiply and return the result. + * t must be 2*n2 words in size + * We calculate + * a[0]*b[0] + * a[0]*b[0]+a[1]*b[1]+(a[0]-a[1])*(b[1]-b[0]) + * a[1]*b[1] + */ +/* dnX may not be positive, but n2/2+dnX has to be */ +void bn_mul_recursive(BN_ULONG *r, const BN_ULONG *a, const BN_ULONG *b, int n2, + int dna, int dnb, BN_ULONG *t) +{ + int n = n2 / 2, c1, c2; + int tna = n + dna, tnb = n + dnb; + unsigned int neg, zero; + BN_ULONG ln, lo, *p; + + /* + * Only call bn_mul_comba 8 if n2 == 8 and the two arrays are complete + * [steve] + */ + if (n2 == 8 && dna == 0 && dnb == 0) { + bn_mul_comba8(r, a, b); + return; + } + + /* Else do normal multiply */ + if (n2 < BN_MUL_RECURSIVE_SIZE_NORMAL) { + bn_mul_normal(r, a, n2 + dna, b, n2 + dnb); + if ((dna + dnb) < 0) + memset(&r[2 * n2 + dna + dnb], 0, + sizeof(BN_ULONG) * -(dna + dnb)); + return; + } + /* r=(a[0]-a[1])*(b[1]-b[0]) */ + c1 = bn_cmp_part_words(a, &(a[n]), tna, n - tna); + c2 = bn_cmp_part_words(&(b[n]), b, tnb, tnb - n); + zero = neg = 0; + switch (c1 * 3 + c2) { + case -4: + bn_sub_part_words(t, &(a[n]), a, tna, tna - n); /* - */ + bn_sub_part_words(&(t[n]), b, &(b[n]), tnb, n - tnb); /* - */ + break; + case -3: + zero = 1; + break; + case -2: + bn_sub_part_words(t, &(a[n]), a, tna, tna - n); /* - */ + bn_sub_part_words(&(t[n]), &(b[n]), b, tnb, tnb - n); /* + */ + neg = 1; + break; + case -1: + case 0: + case 1: + zero = 1; + break; + case 2: + bn_sub_part_words(t, a, &(a[n]), tna, n - tna); /* + */ + bn_sub_part_words(&(t[n]), b, &(b[n]), tnb, n - tnb); /* - */ + neg = 1; + break; + case 3: + zero = 1; + break; + case 4: + bn_sub_part_words(t, a, &(a[n]), tna, n - tna); + bn_sub_part_words(&(t[n]), &(b[n]), b, tnb, tnb - n); + break; + } + + if (n == 4 && dna == 0 && dnb == 0) { /* XXX: bn_mul_comba4 could take + * extra args to do this well */ + if (!zero) + bn_mul_comba4(&(t[n2]), t, &(t[n])); + else + memset(&t[n2], 0, sizeof(*t) * 8); + + bn_mul_comba4(r, a, b); + bn_mul_comba4(&(r[n2]), &(a[n]), &(b[n])); + } else if (n == 8 && dna == 0 && dnb == 0) { /* XXX: bn_mul_comba8 could + * take extra args to do + * this well */ + if (!zero) + bn_mul_comba8(&(t[n2]), t, &(t[n])); + else + memset(&t[n2], 0, sizeof(*t) * 16); + + bn_mul_comba8(r, a, b); + bn_mul_comba8(&(r[n2]), &(a[n]), &(b[n])); + } else { + p = &(t[n2 * 2]); + if (!zero) + bn_mul_recursive(&(t[n2]), t, &(t[n]), n, 0, 0, p); + else + memset(&t[n2], 0, sizeof(*t) * n2); + bn_mul_recursive(r, a, b, n, 0, 0, p); + bn_mul_recursive(&(r[n2]), &(a[n]), &(b[n]), n, dna, dnb, p); + } + + /*- + * t[32] holds (a[0]-a[1])*(b[1]-b[0]), c1 is the sign + * r[10] holds (a[0]*b[0]) + * r[32] holds (b[1]*b[1]) + */ + + c1 = (int)(bn_add_words(t, r, &(r[n2]), n2)); + + if (neg) { /* if t[32] is negative */ + c1 -= (int)(bn_sub_words(&(t[n2]), t, &(t[n2]), n2)); + } else { + /* Might have a carry */ + c1 += (int)(bn_add_words(&(t[n2]), &(t[n2]), t, n2)); + } + + /*- + * t[32] holds (a[0]-a[1])*(b[1]-b[0])+(a[0]*b[0])+(a[1]*b[1]) + * r[10] holds (a[0]*b[0]) + * r[32] holds (b[1]*b[1]) + * c1 holds the carry bits + */ + c1 += (int)(bn_add_words(&(r[n]), &(r[n]), &(t[n2]), n2)); + if (c1) { + p = &(r[n + n2]); + lo = *p; + ln = (lo + c1) & BN_MASK2; + *p = ln; + + /* + * The overflow will stop before we over write words we should not + * overwrite + */ + if (ln < (BN_ULONG)c1) { + do { + p++; + lo = *p; + ln = (lo + 1) & BN_MASK2; + *p = ln; + } while (ln == 0); + } + } +} + +/* + * n+tn is the word length t needs to be n*4 is size, as does r + */ +/* tnX may not be negative but less than n */ +void bn_mul_part_recursive(BN_ULONG *r, const BN_ULONG *a, const BN_ULONG *b, + int n, int tna, int tnb, BN_ULONG *t) +{ + int i, j, n2 = n * 2; + int c1, c2, neg; + BN_ULONG ln, lo, *p; + + if (n < 8) { + bn_mul_normal(r, a, n + tna, b, n + tnb); + return; + } + + /* r=(a[0]-a[1])*(b[1]-b[0]) */ + c1 = bn_cmp_part_words(a, &(a[n]), tna, n - tna); + c2 = bn_cmp_part_words(&(b[n]), b, tnb, tnb - n); + neg = 0; + switch (c1 * 3 + c2) { + case -4: + bn_sub_part_words(t, &(a[n]), a, tna, tna - n); /* - */ + bn_sub_part_words(&(t[n]), b, &(b[n]), tnb, n - tnb); /* - */ + break; + case -3: + case -2: + bn_sub_part_words(t, &(a[n]), a, tna, tna - n); /* - */ + bn_sub_part_words(&(t[n]), &(b[n]), b, tnb, tnb - n); /* + */ + neg = 1; + break; + case -1: + case 0: + case 1: + case 2: + bn_sub_part_words(t, a, &(a[n]), tna, n - tna); /* + */ + bn_sub_part_words(&(t[n]), b, &(b[n]), tnb, n - tnb); /* - */ + neg = 1; + break; + case 3: + case 4: + bn_sub_part_words(t, a, &(a[n]), tna, n - tna); + bn_sub_part_words(&(t[n]), &(b[n]), b, tnb, tnb - n); + break; + } + /* + * The zero case isn't yet implemented here. The speedup would probably + * be negligible. + */ +#if 0 + if (n == 4) { + bn_mul_comba4(&(t[n2]), t, &(t[n])); + bn_mul_comba4(r, a, b); + bn_mul_normal(&(r[n2]), &(a[n]), tn, &(b[n]), tn); + memset(&r[n2 + tn * 2], 0, sizeof(*r) * (n2 - tn * 2)); + } else +#endif + if (n == 8) { + bn_mul_comba8(&(t[n2]), t, &(t[n])); + bn_mul_comba8(r, a, b); + bn_mul_normal(&(r[n2]), &(a[n]), tna, &(b[n]), tnb); + memset(&r[n2 + tna + tnb], 0, sizeof(*r) * (n2 - tna - tnb)); + } else { + p = &(t[n2 * 2]); + bn_mul_recursive(&(t[n2]), t, &(t[n]), n, 0, 0, p); + bn_mul_recursive(r, a, b, n, 0, 0, p); + i = n / 2; + /* + * If there is only a bottom half to the number, just do it + */ + if (tna > tnb) + j = tna - i; + else + j = tnb - i; + if (j == 0) { + bn_mul_recursive(&(r[n2]), &(a[n]), &(b[n]), + i, tna - i, tnb - i, p); + memset(&r[n2 + i * 2], 0, sizeof(*r) * (n2 - i * 2)); + } else if (j > 0) { /* eg, n == 16, i == 8 and tn == 11 */ + bn_mul_part_recursive(&(r[n2]), &(a[n]), &(b[n]), + i, tna - i, tnb - i, p); + memset(&(r[n2 + tna + tnb]), 0, + sizeof(BN_ULONG) * (n2 - tna - tnb)); + } else { /* (j < 0) eg, n == 16, i == 8 and tn == 5 */ + + memset(&r[n2], 0, sizeof(*r) * n2); + if (tna < BN_MUL_RECURSIVE_SIZE_NORMAL + && tnb < BN_MUL_RECURSIVE_SIZE_NORMAL) { + bn_mul_normal(&(r[n2]), &(a[n]), tna, &(b[n]), tnb); + } else { + for (;;) { + i /= 2; + /* + * these simplified conditions work exclusively because + * difference between tna and tnb is 1 or 0 + */ + if (i < tna || i < tnb) { + bn_mul_part_recursive(&(r[n2]), + &(a[n]), &(b[n]), + i, tna - i, tnb - i, p); + break; + } else if (i == tna || i == tnb) { + bn_mul_recursive(&(r[n2]), + &(a[n]), &(b[n]), + i, tna - i, tnb - i, p); + break; + } + } + } + } + } + + /*- + * t[32] holds (a[0]-a[1])*(b[1]-b[0]), c1 is the sign + * r[10] holds (a[0]*b[0]) + * r[32] holds (b[1]*b[1]) + */ + + c1 = (int)(bn_add_words(t, r, &(r[n2]), n2)); + + if (neg) { /* if t[32] is negative */ + c1 -= (int)(bn_sub_words(&(t[n2]), t, &(t[n2]), n2)); + } else { + /* Might have a carry */ + c1 += (int)(bn_add_words(&(t[n2]), &(t[n2]), t, n2)); + } + + /*- + * t[32] holds (a[0]-a[1])*(b[1]-b[0])+(a[0]*b[0])+(a[1]*b[1]) + * r[10] holds (a[0]*b[0]) + * r[32] holds (b[1]*b[1]) + * c1 holds the carry bits + */ + c1 += (int)(bn_add_words(&(r[n]), &(r[n]), &(t[n2]), n2)); + if (c1) { + p = &(r[n + n2]); + lo = *p; + ln = (lo + c1) & BN_MASK2; + *p = ln; + + /* + * The overflow will stop before we over write words we should not + * overwrite + */ + if (ln < (BN_ULONG)c1) { + do { + p++; + lo = *p; + ln = (lo + 1) & BN_MASK2; + *p = ln; + } while (ln == 0); + } + } +} + +/*- + * a and b must be the same size, which is n2. + * r needs to be n2 words and t needs to be n2*2 + */ +void bn_mul_low_recursive(BN_ULONG *r, const BN_ULONG *a, const BN_ULONG *b, + int n2, BN_ULONG *t) +{ + int n = n2 / 2; + + bn_mul_recursive(r, a, b, n, 0, 0, &(t[0])); + if (n >= BN_MUL_LOW_RECURSIVE_SIZE_NORMAL) { + bn_mul_low_recursive(&(t[0]), &(a[0]), &(b[n]), n, &(t[n2])); + bn_add_words(&(r[n]), &(r[n]), &(t[0]), n); + bn_mul_low_recursive(&(t[0]), &(a[n]), &(b[0]), n, &(t[n2])); + bn_add_words(&(r[n]), &(r[n]), &(t[0]), n); + } else { + bn_mul_low_normal(&(t[0]), &(a[0]), &(b[n]), n); + bn_mul_low_normal(&(t[n]), &(a[n]), &(b[0]), n); + bn_add_words(&(r[n]), &(r[n]), &(t[0]), n); + bn_add_words(&(r[n]), &(r[n]), &(t[n]), n); + } +} +#endif /* OPENSSL_SMALL_FOOTPRINT */ + +void bn_mul_normal(BN_ULONG *r, const BN_ULONG *a, int na, const BN_ULONG *b, + int nb) +{ + BN_ULONG *rr; + + if (na < nb) { + int itmp; + const BN_ULONG *ltmp; + + itmp = na; + na = nb; + nb = itmp; + ltmp = a; + a = b; + b = ltmp; + } + rr = &(r[na]); + if (nb <= 0) { + (void)bn_mul_words(r, a, na, 0); + return; + } else + rr[0] = bn_mul_words(r, a, na, b[0]); + + for (;;) { + if (--nb <= 0) + return; + rr[1] = bn_mul_add_words(&(r[1]), a, na, b[1]); + if (--nb <= 0) + return; + rr[2] = bn_mul_add_words(&(r[2]), a, na, b[2]); + if (--nb <= 0) + return; + rr[3] = bn_mul_add_words(&(r[3]), a, na, b[3]); + if (--nb <= 0) + return; + rr[4] = bn_mul_add_words(&(r[4]), a, na, b[4]); + rr += 4; + r += 4; + b += 4; + } +} + +void bn_mul_low_normal(BN_ULONG *r, const BN_ULONG *a, const BN_ULONG *b, int n) +{ + bn_mul_words(r, a, n, b[0]); + + for (;;) { + if (--n <= 0) + return; + bn_mul_add_words(&(r[1]), a, n, b[1]); + if (--n <= 0) + return; + bn_mul_add_words(&(r[2]), a, n, b[2]); + if (--n <= 0) + return; + bn_mul_add_words(&(r[3]), a, n, b[3]); + if (--n <= 0) + return; + bn_mul_add_words(&(r[4]), a, n, b[4]); + r += 4; + b += 4; + } +} diff --git a/crypto/bn/bnw_sub.c b/crypto/bn/bnw_sub.c new file mode 100644 index 0000000000..f989878ce0 --- /dev/null +++ b/crypto/bn/bnw_sub.c @@ -0,0 +1,155 @@ +/* + * Copyright 1995-2025 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#include +#include "bn_local.h" + +#if defined(OPENSSL_NO_ASM) || !defined(OPENSSL_BN_ASM_PART_WORDS) +/* + * Here follows specialised variants of bn_add_words() and bn_sub_words(). + * They have the property performing operations on arrays of different sizes. + * The sizes of those arrays is expressed through cl, which is the common + * length ( basically, min(len(a),len(b)) ), and dl, which is the delta + * between the two lengths, calculated as len(a)-len(b). All lengths are the + * number of BN_ULONGs... For the operations that require a result array as + * parameter, it must have the length cl+abs(dl). + * + * These functions should probably end up in bn_asm.c as soon as there are + * assembler counterparts for the systems that use assembler files. + */ + +BN_ULONG bn_sub_part_words(BN_ULONG *r, + const BN_ULONG *a, const BN_ULONG *b, + int cl, int dl) +{ + BN_ULONG c, t; + + assert(cl >= 0); + c = bn_sub_words(r, a, b, cl); + + if (dl == 0) + return c; + + r += cl; + a += cl; + b += cl; + + if (dl < 0) { + for (;;) { + t = b[0]; + r[0] = (0 - t - c) & BN_MASK2; + if (t != 0) + c = 1; + if (++dl >= 0) + break; + + t = b[1]; + r[1] = (0 - t - c) & BN_MASK2; + if (t != 0) + c = 1; + if (++dl >= 0) + break; + + t = b[2]; + r[2] = (0 - t - c) & BN_MASK2; + if (t != 0) + c = 1; + if (++dl >= 0) + break; + + t = b[3]; + r[3] = (0 - t - c) & BN_MASK2; + if (t != 0) + c = 1; + if (++dl >= 0) + break; + + b += 4; + r += 4; + } + } else { + int save_dl = dl; + while (c) { + t = a[0]; + r[0] = (t - c) & BN_MASK2; + if (t != 0) + c = 0; + if (--dl <= 0) + break; + + t = a[1]; + r[1] = (t - c) & BN_MASK2; + if (t != 0) + c = 0; + if (--dl <= 0) + break; + + t = a[2]; + r[2] = (t - c) & BN_MASK2; + if (t != 0) + c = 0; + if (--dl <= 0) + break; + + t = a[3]; + r[3] = (t - c) & BN_MASK2; + if (t != 0) + c = 0; + if (--dl <= 0) + break; + + save_dl = dl; + a += 4; + r += 4; + } + if (dl > 0) { + if (save_dl > dl) { + switch (save_dl - dl) { + case 1: + r[1] = a[1]; + if (--dl <= 0) + break; + /* fall through */ + case 2: + r[2] = a[2]; + if (--dl <= 0) + break; + /* fall through */ + case 3: + r[3] = a[3]; + if (--dl <= 0) + break; + } + a += 4; + r += 4; + } + } + if (dl > 0) { + for (;;) { + r[0] = a[0]; + if (--dl <= 0) + break; + r[1] = a[1]; + if (--dl <= 0) + break; + r[2] = a[2]; + if (--dl <= 0) + break; + r[3] = a[3]; + if (--dl <= 0) + break; + + a += 4; + r += 4; + } + } + } + return c; +} +#endif diff --git a/crypto/bn/build.info b/crypto/bn/build.info index 01e98e4544..10680e1100 100644 --- a/crypto/bn/build.info +++ b/crypto/bn/build.info @@ -105,11 +105,18 @@ IF[{- !$disabled{asm} -}] ENDIF ENDIF -$COMMON=bn_add.c bn_div.c bn_exp.c bn_lib.c bn_ctx.c bn_mul.c \ +$COMMON_BN=bn_add.c bn_div.c bn_exp.c bn_lib.c bn_ctx.c bn_mul.c \ bn_mod.c bn_conv.c bn_rand.c bn_shift.c bn_word.c bn_blind.c \ bn_kron.c bn_sqrt.c bn_gcd.c bn_prime.c bn_sqr.c \ bn_recp.c bn_mont.c bn_mpi.c bn_exp2.c bn_gf2m.c bn_nist.c \ bn_intern.c bn_dh.c bn_rsa_fips186_5.c bn_const.c +# bnw_*.c is a growing collection of files with routines that operate on +# BN_ULONG only. They were helper routines dispersed in bn_*.c, and are +# often routines that don't have an assembler implementation, and therefore +# didn't fit into bn_asm.c. +$COMMON_BNW=bnw_sub.c bnw_mul.c +$COMMON=$COMMON_BN $COMMON_BNW + SOURCE[../../libcrypto]=$COMMON $BNASM bn_print.c bn_err.c bn_srp.c DEFINE[../../libcrypto]=$BNDEF IF[{- !$disabled{'deprecated-0.9.8'} -}] From 74ebdc1535846709f41baa320ee9c093f6d229e6 Mon Sep 17 00:00:00 2001 From: Richard Levitte Date: Tue, 25 Nov 2025 09:17:18 +0100 Subject: [PATCH 14/69] BIGNUM: add internal function 'bn_mul_truncated' This is a variant of 'bn_mul_normal' that allows the result array to have a smaller size than otherwise expected. 'bn_mul_normal' is refactored to be a wrapper around 'bn_mul_truncated', with an assumed result size (which is the sum of the operands' sizes). Reviewed-by: Matt Caswell Reviewed-by: Tomas Mraz (Merged from https://github.com/openssl/openssl/pull/29203) --- crypto/bn/bn_local.h | 1 + crypto/bn/bnw_mul.c | 46 ++++++++++++++---------------- doc/internal/man3/bn_mul_words.pod | 9 +++++- 3 files changed, 31 insertions(+), 25 deletions(-) diff --git a/crypto/bn/bn_local.h b/crypto/bn/bn_local.h index 6668209728..d17c9d8fb6 100644 --- a/crypto/bn/bn_local.h +++ b/crypto/bn/bn_local.h @@ -676,6 +676,7 @@ void bn_correct_top_consttime(BIGNUM *a); BIGNUM *int_bn_mod_inverse(BIGNUM *in, const BIGNUM *a, const BIGNUM *n, BN_CTX *ctx, int *noinv); +void bn_mul_truncated(BN_ULONG *r, int nr, const BN_ULONG *a, int na, const BN_ULONG *b, int nb); static ossl_inline BIGNUM *bn_expand(BIGNUM *a, int bits) { diff --git a/crypto/bn/bnw_mul.c b/crypto/bn/bnw_mul.c index 4ab4cac21c..ee9c329aa4 100644 --- a/crypto/bn/bnw_mul.c +++ b/crypto/bn/bnw_mul.c @@ -340,10 +340,11 @@ void bn_mul_low_recursive(BN_ULONG *r, const BN_ULONG *a, const BN_ULONG *b, } #endif /* OPENSSL_SMALL_FOOTPRINT */ -void bn_mul_normal(BN_ULONG *r, const BN_ULONG *a, int na, const BN_ULONG *b, - int nb) +void bn_mul_truncated(BN_ULONG *r, int nr, const BN_ULONG *a, int na, + const BN_ULONG *b, int nb) { - BN_ULONG *rr; + BN_ULONG tmp, *carryp = NULL; + int n; /* Number of words to use in the current iteration */ if (na < nb) { int itmp; @@ -356,30 +357,27 @@ void bn_mul_normal(BN_ULONG *r, const BN_ULONG *a, int na, const BN_ULONG *b, a = b; b = ltmp; } - rr = &(r[na]); + n = (na < nr) ? na : nr; if (nb <= 0) { - (void)bn_mul_words(r, a, na, 0); + (void)bn_mul_words(r, a, n, 0); return; - } else - rr[0] = bn_mul_words(r, a, na, b[0]); - - for (;;) { - if (--nb <= 0) - return; - rr[1] = bn_mul_add_words(&(r[1]), a, na, b[1]); - if (--nb <= 0) - return; - rr[2] = bn_mul_add_words(&(r[2]), a, na, b[2]); - if (--nb <= 0) - return; - rr[3] = bn_mul_add_words(&(r[3]), a, na, b[3]); - if (--nb <= 0) - return; - rr[4] = bn_mul_add_words(&(r[4]), a, na, b[4]); - rr += 4; - r += 4; - b += 4; + } else { + carryp = (na < nr) ? &r[na] : &tmp; + *carryp = bn_mul_words(r, a, n, b[0]); } + + for (int i = 1; i < nb && i < nr; i++) { + int rspace = nr - i; + n = (na < rspace) ? na : rspace; + carryp = (na < rspace) ? &r[i + na] : &tmp; + *carryp = bn_mul_add_words(&(r[i]), a, n, b[i]); + } +} + +void bn_mul_normal(BN_ULONG *r, const BN_ULONG *a, int na, const BN_ULONG *b, + int nb) +{ + bn_mul_truncated(r, na + nb, a, na, b, nb); } void bn_mul_low_normal(BN_ULONG *r, const BN_ULONG *a, const BN_ULONG *b, int n) diff --git a/doc/internal/man3/bn_mul_words.pod b/doc/internal/man3/bn_mul_words.pod index d2d8e3397a..7dc4267fd6 100644 --- a/doc/internal/man3/bn_mul_words.pod +++ b/doc/internal/man3/bn_mul_words.pod @@ -4,7 +4,7 @@ bn_mul_words, bn_mul_add_words, bn_sqr_words, bn_div_words, bn_add_words, bn_sub_words, bn_mul_comba4, bn_mul_comba8, -bn_sqr_comba4, bn_sqr_comba8, bn_cmp_words, bn_mul_normal, +bn_sqr_comba4, bn_sqr_comba8, bn_cmp_words, bn_mul_truncated, bn_mul_normal, bn_mul_low_normal, bn_mul_recursive, bn_mul_part_recursive, bn_mul_low_recursive, bn_sqr_normal, bn_sqr_recursive, bn_expand, bn_wexpand, bn_expand2, bn_fix_top, bn_check_top, @@ -32,6 +32,8 @@ library internal functions int bn_cmp_words(BN_ULONG *a, BN_ULONG *b, int n); + void bn_mul_truncated(BN_ULONG *r, int rn, BN_ULONG *a, int na, + BN_ULONG *b, int nb); void bn_mul_normal(BN_ULONG *r, BN_ULONG *a, int na, BN_ULONG *b, int nb); void bn_mul_low_normal(BN_ULONG *r, BN_ULONG *a, BN_ULONG *b, int n); @@ -151,6 +153,11 @@ bn_cmp_words(B, B, B) operates on the B word arrays B and B. It returns 1, 0 and -1 if B is greater than, equal and less than B. +bn_mul_truncated(B, B, B, B, B, B) operates on the +B word array B, the B word array B and the B word array +B. It computes B*B and places the result in B, truncated to +B words. + bn_mul_normal(B, B, B, B, B) operates on the B word array B, the B word array B and the B+B word array B. It computes B*B and places the result in B. From 2532cdf821cb6720fac1ceb0ca581e2d9db54c86 Mon Sep 17 00:00:00 2001 From: Richard Levitte Date: Tue, 25 Nov 2025 11:26:20 +0100 Subject: [PATCH 15/69] OSSL_FN: constify some of the internal construction and introspection functions This should have been done when they were added. Reviewed-by: Matt Caswell Reviewed-by: Tomas Mraz (Merged from https://github.com/openssl/openssl/pull/29203) --- crypto/fn/fn_intern.c | 8 ++++---- include/crypto/fn_intern.h | 10 +++++----- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/crypto/fn/fn_intern.c b/crypto/fn/fn_intern.c index 3aa3afb3f1..6113ccd215 100644 --- a/crypto/fn/fn_intern.c +++ b/crypto/fn/fn_intern.c @@ -30,7 +30,7 @@ int ossl_fn_set_words(OSSL_FN *f, const OSSL_FN_ULONG *words, size_t limbs) return 1; } -const OSSL_FN_ULONG *ossl_fn_get_words(OSSL_FN *f) +const OSSL_FN_ULONG *ossl_fn_get_words(const OSSL_FN *f) { if (ossl_unlikely(f == NULL)) { ERR_raise(ERR_LIB_OSSL_FN, ERR_R_PASSED_NULL_PARAMETER); @@ -40,17 +40,17 @@ const OSSL_FN_ULONG *ossl_fn_get_words(OSSL_FN *f) return f->d; } -size_t ossl_fn_get_dsize(OSSL_FN *f) +size_t ossl_fn_get_dsize(const OSSL_FN *f) { return f->dsize; } -bool ossl_fn_is_dynamically_allocated(OSSL_FN *f) +bool ossl_fn_is_dynamically_allocated(const OSSL_FN *f) { return f->is_dynamically_allocated; } -bool ossl_fn_is_securely_allocated(OSSL_FN *f) +bool ossl_fn_is_securely_allocated(const OSSL_FN *f) { return f->is_securely_allocated; } diff --git a/include/crypto/fn_intern.h b/include/crypto/fn_intern.h index df35a0a5dc..46b5be7077 100644 --- a/include/crypto/fn_intern.h +++ b/include/crypto/fn_intern.h @@ -36,15 +36,15 @@ extern "C" { #endif int ossl_fn_set_words(OSSL_FN *f, const OSSL_FN_ULONG *words, size_t limbs); -const OSSL_FN_ULONG *ossl_fn_get_words(OSSL_FN *f); +const OSSL_FN_ULONG *ossl_fn_get_words(const OSSL_FN *f); -size_t ossl_fn_get_dsize(OSSL_FN *f); +size_t ossl_fn_get_dsize(const OSSL_FN *f); void ossl_fn_set_negative(OSSL_FN *f, bool neg); -bool ossl_fn_is_negative(OSSL_FN *f); -bool ossl_fn_is_dynamically_allocated(OSSL_FN *f); -bool ossl_fn_is_securely_allocated(OSSL_FN *f); +bool ossl_fn_is_negative(const OSSL_FN *f); +bool ossl_fn_is_dynamically_allocated(const OSSL_FN *f); +bool ossl_fn_is_securely_allocated(const OSSL_FN *f); #ifdef __cplusplus } From 12e7939872e080e34db63bd2577cf8b145e83605 Mon Sep 17 00:00:00 2001 From: Richard Levitte Date: Mon, 24 Nov 2025 14:26:42 +0100 Subject: [PATCH 16/69] Add ossl_num_bits(), which returns the significant number of bits in a size_t This existed as an isolated static function in crypto/asn1/x_long.c, but is really a pretty generic integer function, so it will serve better by being exactly that. Reviewed-by: Matt Caswell Reviewed-by: Tomas Mraz (Merged from https://github.com/openssl/openssl/pull/29203) --- crypto/asn1/x_long.c | 29 ++--------------------------- crypto/build.info | 3 ++- crypto/int.c | 29 +++++++++++++++++++++++++++++ include/crypto/cryptlib.h | 2 ++ 4 files changed, 35 insertions(+), 28 deletions(-) create mode 100644 crypto/int.c diff --git a/crypto/asn1/x_long.c b/crypto/asn1/x_long.c index 4dc9dc6c6b..19f44f7b68 100644 --- a/crypto/asn1/x_long.c +++ b/crypto/asn1/x_long.c @@ -8,8 +8,8 @@ */ #include -#include "internal/cryptlib.h" #include +#include "crypto/cryptlib.h" #define COPY_SIZE(a, b) (sizeof(a) < sizeof(b) ? sizeof(a) : sizeof(b)) @@ -56,31 +56,6 @@ static void long_free(ASN1_VALUE **pval, const ASN1_ITEM *it) memcpy(pval, &it->size, COPY_SIZE(*pval, it->size)); } -/* - * Originally BN_num_bits_word was called to perform this operation, but - * trouble is that there is no guarantee that sizeof(long) equals to - * sizeof(BN_ULONG). BN_ULONG is a configurable type that can be as wide - * as long, but also double or half... - */ -static int num_bits_ulong(unsigned long value) -{ - size_t i; - unsigned long ret = 0; - - /* - * It is argued that *on average* constant counter loop performs - * not worse [if not better] than one with conditional break or - * mask-n-table-lookup-style, because of branch misprediction - * penalties. - */ - for (i = 0; i < sizeof(value) * 8; i++) { - ret += (value != 0); - value >>= 1; - } - - return (int)ret; -} - static int long_i2c(const ASN1_VALUE **pval, unsigned char *cont, int *putype, const ASN1_ITEM *it) { @@ -103,7 +78,7 @@ static int long_i2c(const ASN1_VALUE **pval, unsigned char *cont, int *putype, sign = 0; utmp = ltmp; } - clen = num_bits_ulong(utmp); + clen = (int)ossl_num_bits(utmp); /* If MSB of leading octet set we need to pad */ if (!(clen & 0x7)) pad = 1; diff --git a/crypto/build.info b/crypto/build.info index b5891b553f..68ecd2db27 100644 --- a/crypto/build.info +++ b/crypto/build.info @@ -99,7 +99,8 @@ $UTIL_COMMON=\ threads_pthread.c threads_win.c threads_none.c threads_common.c \ initthread.c context.c sparse_array.c asn1_dsa.c packet.c \ param_build.c param_build_set.c der_writer.c threads_lib.c \ - params_dup.c time.c array_alloc.c aligned_alloc.c deterministic_nonce.c + params_dup.c time.c array_alloc.c aligned_alloc.c deterministic_nonce.c \ + int.c SOURCE[../libcrypto]=$UTIL_COMMON \ mem.c mem_sec.c \ diff --git a/crypto/int.c b/crypto/int.c new file mode 100644 index 0000000000..f782c2aec6 --- /dev/null +++ b/crypto/int.c @@ -0,0 +1,29 @@ +/* + * Copyright 2025 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#include "crypto/cryptlib.h" + +size_t ossl_num_bits(size_t value) +{ + size_t i; + unsigned long ret = 0; + + /* + * It is argued that *on average* constant counter loop performs + * not worse [if not better] than one with conditional break or + * mask-n-table-lookup-style, because of branch misprediction + * penalties. + */ + for (i = 0; i < sizeof(value) * 8; i++) { + ret += (value != 0); + value >>= 1; + } + + return (int)ret; +} diff --git a/include/crypto/cryptlib.h b/include/crypto/cryptlib.h index 242de6fc2f..823cbbcf2c 100644 --- a/include/crypto/cryptlib.h +++ b/include/crypto/cryptlib.h @@ -36,4 +36,6 @@ void ossl_malloc_setup_failures(void); int ossl_crypto_alloc_ex_data_intern(int class_index, void *obj, CRYPTO_EX_DATA *ad, int idx); +size_t ossl_num_bits(size_t value); + #endif /* OSSL_CRYPTO_CRYPTLIB_H */ From 5ea9b46e95e95e3e58ba8cd63c89f6b3cd6a31d6 Mon Sep 17 00:00:00 2001 From: Richard Levitte Date: Mon, 24 Nov 2025 14:33:33 +0100 Subject: [PATCH 17/69] OSSL_FN: Add the 'mul' function OSSL_FN_mul() multiplies two operands. The result OSSL_FN may be of any size, and if it's smaller than the result of multiplying the two operands, the result is truncated to that size. This also adds the function OSSL_FN_copy(), a counterpart for BN_copy(), as well as an OSSL_FN API test program. Finally, test/fn_api_test.c is updated with a 'struct test_case_st', used to instruct test functions what numbers to operate on, and some conditions, and the 'add' and 'sub' test functions are upgraded to use that structure for their input. Related-to: doc/designs/fixed-size-large-numbers.md Resolves: https://github.com/openssl/openssl/issues/28934 Reviewed-by: Matt Caswell Reviewed-by: Tomas Mraz (Merged from https://github.com/openssl/openssl/pull/29203) --- crypto/fn/build.info | 2 +- crypto/fn/fn_lib.c | 25 ++ crypto/fn/fn_mul.c | 65 +++++ include/crypto/fn.h | 26 ++ test/fn_api_test.c | 651 ++++++++++++++++++++++++++++++++++++------- 5 files changed, 672 insertions(+), 97 deletions(-) create mode 100644 crypto/fn/fn_mul.c diff --git a/crypto/fn/build.info b/crypto/fn/build.info index ecaf1ac6e7..599d4f5f68 100644 --- a/crypto/fn/build.info +++ b/crypto/fn/build.info @@ -2,7 +2,7 @@ $LIBCRYPTO=../../libcrypto $LIBFIPS=../../providers/libfips.a LIBS=$LIBCRYPTO -$COMMON=fn_err.c fn_lib.c fn_ctx.c fn_intern.c fn_addsub.c +$COMMON=fn_err.c fn_lib.c fn_ctx.c fn_intern.c fn_addsub.c fn_mul.c SOURCE[$LIBCRYPTO]=$COMMON SOURCE[$LIBFIPS]=$COMMON diff --git a/crypto/fn/fn_lib.c b/crypto/fn/fn_lib.c index 78638151f8..3853b058ea 100644 --- a/crypto/fn/fn_lib.c +++ b/crypto/fn/fn_lib.c @@ -11,7 +11,9 @@ #include #include #include +#include #include "internal/common.h" +#include "crypto/fnerr.h" #include "fn_local.h" static OSSL_FN *ossl_fn_new_internal(size_t limbs, bool securely) @@ -102,3 +104,26 @@ void OSSL_FN_clear(OSSL_FN *f) OPENSSL_cleanse(f->d, limbssize); } + +OSSL_FN *OSSL_FN_copy(OSSL_FN *a, const OSSL_FN *b) +{ + if (ossl_unlikely(a == b)) + return a; + + size_t al = a->dsize; + size_t bl = b->dsize; + + if (al < bl) { + ERR_raise_data(ERR_LIB_OSSL_FN, OSSL_FN_R_RESULT_ARG_TOO_SMALL, + "Needs to be at least %d, but is only %d", + bl, al); + return 0; + } + + size_t t = ossl_fn_totalsize(bl); + + memcpy(a, b, t); + a->dsize = (int)al; /* Restore to its original size */ + memset(&a->d[a->dsize], 0, sizeof(OSSL_FN_ULONG) * (a->dsize - b->dsize)); + return a; +} diff --git a/crypto/fn/fn_mul.c b/crypto/fn/fn_mul.c new file mode 100644 index 0000000000..005714afe1 --- /dev/null +++ b/crypto/fn/fn_mul.c @@ -0,0 +1,65 @@ +/* + * Copyright 2025 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#include +#include +#include "crypto/cryptlib.h" +#include "crypto/fnerr.h" +#include "../bn/bn_local.h" /* For using the low level bignum functions */ +#include "fn_local.h" + +int OSSL_FN_mul(OSSL_FN *r, const OSSL_FN *a, const OSSL_FN *b, OSSL_FN_CTX *ctx) +{ + if (!OSSL_FN_CTX_start(ctx)) + return 0; + + size_t al = (size_t)a->dsize; + size_t bl = (size_t)b->dsize; + size_t rl = (size_t)r->dsize; + size_t max = (size_t)(al + bl); + + int ret = 0; +#ifdef BN_MUL_COMBA + if (al == bl) { + if (rl >= 16 && al == 8) { + bn_mul_comba8(r->d, a->d, b->d); + goto end; + } + } +#endif /* BN_MUL_COMBA */ + + OSSL_FN *rr = r; + if ((r == a) || (r == b)) + if ((rr = OSSL_FN_CTX_get_limbs(ctx, rl)) == NULL) + goto err; + + bn_mul_truncated(rr->d, (int)rl, a->d, (int)al, b->d, (int)bl); + + if (rr != r) + if (OSSL_FN_copy(r, rr) == NULL) + goto err; + +#if defined(BN_MUL_COMBA) || defined(BN_RECURSION) +end: +#endif + +{ + size_t dif = (rl > max) ? rl - max : 0; + OSSL_FN_ULONG *rp = &r->d[max]; + while (dif > 0) { + *rp++ = 0; + dif--; + } +} + + ret = 1; +err: + OSSL_FN_CTX_end(ctx); + return ret; +} diff --git a/include/crypto/fn.h b/include/crypto/fn.h index b5eb37a296..8c32f10a12 100644 --- a/include/crypto/fn.h +++ b/include/crypto/fn.h @@ -129,6 +129,15 @@ void OSSL_FN_clear_free(OSSL_FN *f); */ void OSSL_FN_clear(OSSL_FN *f); +/** + * Copy the contents of one OSSL_FN instance to another. + * + * @param[out] a The destination OSSL_FN + * @param[in] b The source OSSL_FN + * @returns 1 on success, 0 on error. + */ +OSSL_FN *OSSL_FN_copy(OSSL_FN *a, const OSSL_FN *b); + /** * Allocate a new OSSL_FN_CTX, given a set of input numbers. * @@ -252,6 +261,23 @@ int OSSL_FN_sub(OSSL_FN *r, const OSSL_FN *a, const OSSL_FN *b); */ int OSSL_FN_sub_word(OSSL_FN *a, const OSSL_FN_ULONG *w); +/** + * Multiply two OSSL_FN numbers. Truncates the result to fit in r. + * + * @param[out] r The OSSL_FN for the result + * @param[in] a The first operand + * @param[in] b The second operand + * @param[in] ctx A context to get temporary OSSL_FN + * instances from. + * @returns 1 on success, 0 on error + * + * @note This function currently requires that the OSSL_FN_CTX has free + * space for one temporary OSSL_FN with res->dsize limbs, plus one frame + * (currently 32 bytes). + */ +int OSSL_FN_mul(OSSL_FN *r, const OSSL_FN *a, const OSSL_FN *b, + OSSL_FN_CTX *ctx); + #ifdef __cplusplus } #endif diff --git a/test/fn_api_test.c b/test/fn_api_test.c index 949901d55b..0bf8351ed6 100644 --- a/test/fn_api_test.c +++ b/test/fn_api_test.c @@ -8,10 +8,11 @@ */ /** - * @file Internal tests of OSSL_FN + * @file API tests of OSSL_FN * - * This tests OSSL_FN internals only, i.e. anything that requires including - * ../crypto/fn/fn_local.h, such as introspection. + * This tests the OSSL_FN "public" API, i.e. anything that only requires + * including crypto/fn.h. including crypto/fn_intern.h is included too, + * for introspection. */ #include @@ -40,143 +41,601 @@ static int pollute(OSSL_FN *f, size_t start, size_t end) return 1; } -static const OSSL_FN_ULONG num[][8 / OSSL_FN_BYTES] = { - /* num[0] */ { OSSL_FN_ULONG64_C(0x80000000, 0x00000001) }, - /* num[1] */ { OSSL_FN_ULONG64_C(0x00000001, 0x80000000) }, - /* num[2] */ { OSSL_FN_ULONG64_C(0x01234567, 0x89abcdef) }, - /* num[3] */ { OSSL_FN_ULONG64_C(0xfedcba98, 0x76543210) }, +static int check_zero(const OSSL_FN *f, size_t start, size_t end) +{ + const OSSL_FN_ULONG *u = ossl_fn_get_words(f); + size_t l = ossl_fn_get_dsize(f); + + if (end > l) + end = l; + if (start > end) + start = end; + + for (size_t i = start; i < end; i++) + if (u[i] != 0) + return 0; + return 1; +} + +/* A set of numbers on OSSL_FN_ULONG array form */ +static const OSSL_FN_ULONG num0[] = { OSSL_FN_ULONG64_C(0x80000000, 0x00000001) }; +static const OSSL_FN_ULONG num1[] = { OSSL_FN_ULONG64_C(0x00000001, 0x80000000) }; +static const OSSL_FN_ULONG num2[] = { OSSL_FN_ULONG64_C(0x01234567, 0x89abcdef) }; +static const OSSL_FN_ULONG num3[] = { OSSL_FN_ULONG64_C(0xfedcba98, 0x76543210) }; + +/* Numbers for edge cases */ +static const OSSL_FN_ULONG num4[] = { OSSL_FN_ULONG64_C(0x00000000, 0x00000000) }; +static const OSSL_FN_ULONG num5[] = { OSSL_FN_ULONG64_C(0xffffffff, 0xffffffff) }; +static const OSSL_FN_ULONG num6[] = { + OSSL_FN_ULONG64_C(0x00000000, 0x00000000), + OSSL_FN_ULONG64_C(0x10000000, 0x00000000), }; -static const OSSL_FN_ULONG expected_add_num_num[4][4][3] = { - { - /* num[0] + num[0] */ { OSSL_FN_ULONG64_C(0x00000000, 0x00000002), OSSL_FN_ULONG_C(0x1) }, - /* num[0] + num[1] */ { OSSL_FN_ULONG64_C(0x80000001, 0x80000001) }, - /* num[0] + num[2] */ { OSSL_FN_ULONG64_C(0x81234567, 0x89abcdf0) }, - /* num[0] + num[3] */ { OSSL_FN_ULONG64_C(0x7edcba98, 0x76543211), OSSL_FN_ULONG_C(0x1) }, - }, - { - /* num[1] + num[0] */ { OSSL_FN_ULONG64_C(0x80000001, 0x80000001) }, - /* num[1] + num[1] */ { OSSL_FN_ULONG64_C(0x00000003, 0x00000000) }, - /* num[1] + num[2] */ { OSSL_FN_ULONG64_C(0x01234569, 0x09abcdef) }, - /* num[1] + num[3] */ { OSSL_FN_ULONG64_C(0xfedcba99, 0xf6543210) }, - }, - { - /* num[2] + num[0] */ { OSSL_FN_ULONG64_C(0x81234567, 0x89abcdf0) }, - /* num[2] + num[1] */ { OSSL_FN_ULONG64_C(0x01234569, 0x09abcdef) }, - /* num[2] + num[2] */ { OSSL_FN_ULONG64_C(0x02468acf, 0x13579bde) }, - /* num[2] + num[3] */ { OSSL_FN_ULONG64_C(0xffffffff, 0xffffffff) }, - }, - { - /* num[3] + num[0] */ { OSSL_FN_ULONG64_C(0x7edcba98, 0x76543211), OSSL_FN_ULONG_C(0x1) }, - /* num[3] + num[1] */ { OSSL_FN_ULONG64_C(0xfedcba99, 0xf6543210) }, - /* num[3] + num[2] */ { OSSL_FN_ULONG64_C(0xffffffff, 0xffffffff) }, - /* num[3] + num[3] */ { OSSL_FN_ULONG64_C(0xfdb97530, 0xeca86420), OSSL_FN_ULONG_C(0x1) }, - }, +/* + * For each test function using predefined numbers, set up an + * arrays of test cases to simply run through, and call common + * test function for the operation being tested. + * + * All sizes are in number of limbs, the LIMBSOF() macro is there to help + */ +#define LIMBSOF(num) ((sizeof(num) + OSSL_FN_BYTES - 1) / OSSL_FN_BYTES) +struct test_case_st { + /* Two operands and expected full result */ + const OSSL_FN_ULONG *op1; + size_t op1_size; + const OSSL_FN_ULONG *op2; + size_t op2_size; + const OSSL_FN_ULONG *ex; + size_t ex_size; + + /* Setup sizes for creating OSSL_FNs */ + size_t op1_live_size; + size_t op2_live_size; + size_t res_live_size; + + /* Number of limbs to compare the result's OSSL_FN_ULONG array against ex */ + size_t check_size; +}; + +static const OSSL_FN_ULONG ex_add_num0_num0[] = { + OSSL_FN_ULONG64_C(0x00000000, 0x00000002), + OSSL_FN_ULONG_C(0x1), +}; +static const OSSL_FN_ULONG ex_add_num0_num1[] = { + OSSL_FN_ULONG64_C(0x80000001, 0x80000001), +}; +static const OSSL_FN_ULONG ex_add_num0_num2[] = { + OSSL_FN_ULONG64_C(0x81234567, 0x89abcdf0), +}; +static const OSSL_FN_ULONG ex_add_num0_num3[] = { + OSSL_FN_ULONG64_C(0x7edcba98, 0x76543211), + OSSL_FN_ULONG_C(0x1), +}; +static const OSSL_FN_ULONG ex_add_num1_num1[] = { + OSSL_FN_ULONG64_C(0x00000003, 0x00000000), +}; +static const OSSL_FN_ULONG ex_add_num1_num2[] = { + OSSL_FN_ULONG64_C(0x01234569, 0x09abcdef), +}; +static const OSSL_FN_ULONG ex_add_num1_num3[] = { + OSSL_FN_ULONG64_C(0xfedcba99, 0xf6543210), +}; +static const OSSL_FN_ULONG ex_add_num2_num2[] = { + OSSL_FN_ULONG64_C(0x02468acf, 0x13579bde), +}; +static const OSSL_FN_ULONG ex_add_num2_num3[] = { + OSSL_FN_ULONG64_C(0xffffffff, 0xffffffff), +}; +static const OSSL_FN_ULONG ex_add_num3_num3[] = { + OSSL_FN_ULONG64_C(0xfdb97530, 0xeca86420), + OSSL_FN_ULONG_C(0x1), +}; + +#define ADD_CASE(i, op1, op2, ex) \ + { \ + /* op1, with size */ op1, \ + LIMBSOF(op1), \ + /* op2, with size */ op2, \ + LIMBSOF(op2), \ + /* ex, with size */ ex, \ + LIMBSOF(ex), \ + /* op1_live_size */ LIMBSOF(op1), \ + /* op2_live_size */ LIMBSOF(op2), \ + /* res_live_size */ LIMBSOF(ex), \ + /* check_size */ LIMBSOF(ex), \ + } + +static struct test_case_st test_add_cases[] = { + ADD_CASE(1, num0, num0, ex_add_num0_num0), + ADD_CASE(2, num0, num1, ex_add_num0_num1), + ADD_CASE(3, num0, num2, ex_add_num0_num2), + ADD_CASE(4, num0, num3, ex_add_num0_num3), + ADD_CASE(5, num1, num0, ex_add_num0_num1), /* Commutativity check */ + ADD_CASE(6, num1, num1, ex_add_num1_num1), + ADD_CASE(7, num1, num2, ex_add_num1_num2), + ADD_CASE(8, num1, num3, ex_add_num1_num3), + ADD_CASE(9, num2, num0, ex_add_num0_num2), /* Commutativity check */ + ADD_CASE(10, num2, num1, ex_add_num1_num2), /* Commutativity check */ + ADD_CASE(11, num2, num2, ex_add_num2_num2), + ADD_CASE(12, num2, num3, ex_add_num2_num3), + ADD_CASE(13, num3, num0, ex_add_num0_num3), /* Commutativity check */ + ADD_CASE(14, num3, num1, ex_add_num1_num3), /* Commutativity check */ + ADD_CASE(15, num3, num2, ex_add_num2_num3), /* Commutativity check */ + ADD_CASE(16, num3, num3, ex_add_num3_num3), }; static int test_add(int i) { - size_t i1 = i / 4; - size_t i2 = i % 4; - const OSSL_FN_ULONG *n1 = num[i1]; - size_t n1_limbs = sizeof(num[i1]) / OSSL_FN_BYTES; - const OSSL_FN_ULONG *n2 = num[i2]; - size_t n2_limbs = sizeof(num[i2]) / OSSL_FN_BYTES; - const OSSL_FN_ULONG *ex = expected_add_num_num[i1][i2]; - size_t ex_limbs = sizeof(expected_add_num_num[i1][i2]) / OSSL_FN_BYTES; + const OSSL_FN_ULONG *n1 = test_add_cases[i].op1; + size_t n1_limbs = test_add_cases[i].op1_size; + const OSSL_FN_ULONG *n2 = test_add_cases[i].op2; + size_t n2_limbs = test_add_cases[i].op2_size; + const OSSL_FN_ULONG *ex = test_add_cases[i].ex; + size_t ex_limbs = test_add_cases[i].ex_size; + size_t check_limbs = test_add_cases[i].check_size; int ret = 1; - OSSL_FN *num1 = NULL, *num2 = NULL, *res = NULL; + OSSL_FN *fn1 = NULL, *fn2 = NULL, *res = NULL; const OSSL_FN_ULONG *u = NULL; /* To test that OSSL_FN_add() does a complete job, 'res' is pre-polluted */ - if (!TEST_ptr(num1 = OSSL_FN_new_limbs(n1_limbs)) - || !TEST_ptr(num2 = OSSL_FN_new_limbs(n2_limbs)) + if (!TEST_ptr(fn1 = OSSL_FN_new_limbs(n1_limbs)) + || !TEST_ptr(fn2 = OSSL_FN_new_limbs(n2_limbs)) || !TEST_ptr(res = OSSL_FN_new_limbs(ex_limbs)) || !TEST_true(pollute(res, 0, ex_limbs)) - || !TEST_true(ossl_fn_set_words(num1, n1, n1_limbs)) - || !TEST_true(ossl_fn_set_words(num2, n2, n2_limbs)) - || !TEST_true(OSSL_FN_add(res, num1, num2)) + || !TEST_true(ossl_fn_set_words(fn1, n1, n1_limbs)) + || !TEST_true(ossl_fn_set_words(fn2, n2, n2_limbs)) + || !TEST_true(OSSL_FN_add(res, fn1, fn2)) || !TEST_ptr(u = ossl_fn_get_words(res)) || !TEST_mem_eq(u, ossl_fn_get_dsize(res) * OSSL_FN_BYTES, - ex, ex_limbs * OSSL_FN_BYTES)) + ex, check_limbs * OSSL_FN_BYTES)) ret = 0; - OSSL_FN_free(num1); - OSSL_FN_free(num2); + OSSL_FN_free(fn1); + OSSL_FN_free(fn2); OSSL_FN_free(res); return ret; } -/* Dimension the expected arrays to fit 4 32-bit limbs */ -#define EXPECTED_LIMBS ((16 + OSSL_FN_BYTES - 1) / OSSL_FN_BYTES) -static OSSL_FN_ULONG expected_sub_num_num[4][4][EXPECTED_LIMBS] = { - { - /* num[0] - num[0] */ { OSSL_FN_ULONG64_C(0x00000000, 0x00000000) }, - /* num[0] - num[1] */ { OSSL_FN_ULONG64_C(0x7ffffffe, 0x80000001) }, - /* num[0] - num[2] */ { OSSL_FN_ULONG64_C(0x7edcba98, 0x76543212) }, - /* num[0] - num[3] */ { OSSL_FN_ULONG64_C(0x81234567, 0x89abcdf1), OSSL_FN_ULONG64_C(0xffffffff, 0xffffffff) }, - }, - { - /* num[1] - num[0] */ { OSSL_FN_ULONG64_C(0x80000001, 0x7fffffff), - OSSL_FN_ULONG64_C(0xffffffff, 0xffffffff) }, - /* num[1] - num[1] */ { OSSL_FN_ULONG64_C(0x00000000, 0x00000000) }, - /* num[1] - num[2] */ { OSSL_FN_ULONG64_C(0xfedcba99, 0xf6543211), OSSL_FN_ULONG64_C(0xffffffff, 0xffffffff) }, - /* num[1] - num[3] */ { OSSL_FN_ULONG64_C(0x01234569, 0x09abcdf0), OSSL_FN_ULONG64_C(0xffffffff, 0xffffffff) }, - }, - { - /* num[2] - num[0] */ { OSSL_FN_ULONG64_C(0x81234567, 0x89abcdee), - OSSL_FN_ULONG64_C(0xffffffff, 0xffffffff) }, - /* num[2] - num[1] */ { OSSL_FN_ULONG64_C(0x01234566, 0x09abcdef) }, - /* num[2] - num[2] */ { OSSL_FN_ULONG64_C(0x00000000, 0x00000000) }, - /* num[2] - num[3] */ { OSSL_FN_ULONG64_C(0x02468acf, 0x13579bdf), OSSL_FN_ULONG64_C(0xffffffff, 0xffffffff) }, - }, - { - /* num[3] - num[0] */ { OSSL_FN_ULONG64_C(0x7edcba98, 0x7654320f) }, - /* num[3] - num[1] */ { OSSL_FN_ULONG64_C(0xfedcba96, 0xf6543210) }, - /* num[3] - num[2] */ { OSSL_FN_ULONG64_C(0xfdb97530, 0xeca86421) }, - /* num[3] - num[3] */ { OSSL_FN_ULONG64_C(0x00000000, 0x00000000) }, - }, +static const OSSL_FN_ULONG ex_sub_num0_num0[] = { + OSSL_FN_ULONG64_C(0x00000000, 0x00000000), +}; +static const OSSL_FN_ULONG ex_sub_num0_num1[] = { + OSSL_FN_ULONG64_C(0x7ffffffe, 0x80000001), +}; +static const OSSL_FN_ULONG ex_sub_num0_num2[] = { + OSSL_FN_ULONG64_C(0x7edcba98, 0x76543212), +}; +static const OSSL_FN_ULONG ex_sub_num0_num3[] = { + OSSL_FN_ULONG64_C(0x81234567, 0x89abcdf1), + OSSL_FN_ULONG64_C(0xffffffff, 0xffffffff) +}; +static const OSSL_FN_ULONG ex_sub_num1_num0[] = { + OSSL_FN_ULONG64_C(0x80000001, 0x7fffffff), + OSSL_FN_ULONG64_C(0xffffffff, 0xffffffff), +}; +static const OSSL_FN_ULONG ex_sub_num1_num1[] = { + OSSL_FN_ULONG64_C(0x00000000, 0x00000000), +}; +static const OSSL_FN_ULONG ex_sub_num1_num2[] = { + OSSL_FN_ULONG64_C(0xfedcba99, 0xf6543211), + OSSL_FN_ULONG64_C(0xffffffff, 0xffffffff), +}; +static const OSSL_FN_ULONG ex_sub_num1_num3[] = { + OSSL_FN_ULONG64_C(0x01234569, 0x09abcdf0), + OSSL_FN_ULONG64_C(0xffffffff, 0xffffffff), +}; +static const OSSL_FN_ULONG ex_sub_num2_num0[] = { + OSSL_FN_ULONG64_C(0x81234567, 0x89abcdee), + OSSL_FN_ULONG64_C(0xffffffff, 0xffffffff), +}; +static const OSSL_FN_ULONG ex_sub_num2_num1[] = { + OSSL_FN_ULONG64_C(0x01234566, 0x09abcdef), +}; +static const OSSL_FN_ULONG ex_sub_num2_num2[] = { + OSSL_FN_ULONG64_C(0x00000000, 0x00000000), +}; +static const OSSL_FN_ULONG ex_sub_num2_num3[] = { + OSSL_FN_ULONG64_C(0x02468acf, 0x13579bdf), + OSSL_FN_ULONG64_C(0xffffffff, 0xffffffff), +}; +static const OSSL_FN_ULONG ex_sub_num3_num0[] = { + OSSL_FN_ULONG64_C(0x7edcba98, 0x7654320f), +}; +static const OSSL_FN_ULONG ex_sub_num3_num1[] = { + OSSL_FN_ULONG64_C(0xfedcba96, 0xf6543210), +}; +static const OSSL_FN_ULONG ex_sub_num3_num2[] = { + OSSL_FN_ULONG64_C(0xfdb97530, 0xeca86421), +}; +static const OSSL_FN_ULONG ex_sub_num3_num3[] = { + OSSL_FN_ULONG64_C(0x00000000, 0x00000000), +}; + +#define SUB_CASE(i, op1, op2, ex) \ + { \ + /* op1, with size */ op1, \ + LIMBSOF(op1), \ + /* op2, with size */ op2, \ + LIMBSOF(op2), \ + /* ex, with size */ ex, \ + LIMBSOF(ex), \ + /* op1_live_size */ LIMBSOF(op1), \ + /* op2_live_size */ LIMBSOF(op2), \ + /* res_live_size */ LIMBSOF(ex), \ + /* check_size */ LIMBSOF(ex), \ + } + +static struct test_case_st test_sub_cases[] = { + SUB_CASE(1, num0, num0, ex_sub_num0_num0), + SUB_CASE(2, num0, num1, ex_sub_num0_num1), + SUB_CASE(3, num0, num2, ex_sub_num0_num2), + SUB_CASE(4, num0, num3, ex_sub_num0_num3), + SUB_CASE(5, num1, num0, ex_sub_num1_num0), + SUB_CASE(6, num1, num1, ex_sub_num1_num1), + SUB_CASE(7, num1, num2, ex_sub_num1_num2), + SUB_CASE(8, num1, num3, ex_sub_num1_num3), + SUB_CASE(9, num2, num0, ex_sub_num2_num0), + SUB_CASE(10, num2, num1, ex_sub_num2_num1), + SUB_CASE(11, num2, num2, ex_sub_num2_num2), + SUB_CASE(12, num2, num3, ex_sub_num2_num3), + SUB_CASE(13, num3, num0, ex_sub_num3_num0), + SUB_CASE(14, num3, num1, ex_sub_num3_num1), + SUB_CASE(15, num3, num2, ex_sub_num3_num2), + SUB_CASE(16, num3, num3, ex_sub_num3_num3), }; static int test_sub(int i) { - size_t i1 = i / 4; - size_t i2 = i % 4; - const OSSL_FN_ULONG *n1 = num[i1]; - size_t n1_limbs = sizeof(num[i1]) / OSSL_FN_BYTES; - const OSSL_FN_ULONG *n2 = num[i2]; - size_t n2_limbs = sizeof(num[i2]) / OSSL_FN_BYTES; - const OSSL_FN_ULONG *ex = expected_sub_num_num[i1][i2]; - size_t ex_limbs = sizeof(expected_sub_num_num[i1][i2]) / OSSL_FN_BYTES; + const OSSL_FN_ULONG *n1 = test_sub_cases[i].op1; + size_t n1_limbs = test_sub_cases[i].op1_size; + const OSSL_FN_ULONG *n2 = test_sub_cases[i].op2; + size_t n2_limbs = test_sub_cases[i].op2_size; + const OSSL_FN_ULONG *ex = test_sub_cases[i].ex; + size_t ex_limbs = test_sub_cases[i].ex_size; + size_t check_limbs = test_sub_cases[i].check_size; int ret = 1; - OSSL_FN *num1 = NULL, *num2 = NULL, *res = NULL; + OSSL_FN *fn1 = NULL, *fn2 = NULL, *res = NULL; const OSSL_FN_ULONG *u = NULL; /* To test that OSSL_FN_sub() does a complete job, 'res' is pre-polluted */ - if (!TEST_ptr(num1 = OSSL_FN_new_limbs(n1_limbs)) - || !TEST_ptr(num2 = OSSL_FN_new_limbs(n2_limbs)) + if (!TEST_ptr(fn1 = OSSL_FN_new_limbs(n1_limbs)) + || !TEST_ptr(fn2 = OSSL_FN_new_limbs(n2_limbs)) || !TEST_ptr(res = OSSL_FN_new_limbs(ex_limbs)) || !TEST_true(pollute(res, 0, ex_limbs)) - || !TEST_true(ossl_fn_set_words(num1, n1, n1_limbs)) - || !TEST_true(ossl_fn_set_words(num2, n2, n2_limbs)) - || !TEST_true(OSSL_FN_sub(res, num1, num2)) + || !TEST_true(ossl_fn_set_words(fn1, n1, n1_limbs)) + || !TEST_true(ossl_fn_set_words(fn2, n2, n2_limbs)) + || !TEST_true(OSSL_FN_sub(res, fn1, fn2)) || !TEST_ptr(u = ossl_fn_get_words(res)) || !TEST_mem_eq(u, ossl_fn_get_dsize(res) * OSSL_FN_BYTES, - ex, ex_limbs * OSSL_FN_BYTES)) + ex, check_limbs * OSSL_FN_BYTES)) ret = 0; - OSSL_FN_free(num1); - OSSL_FN_free(num2); + OSSL_FN_free(fn1); + OSSL_FN_free(fn2); OSSL_FN_free(res); return ret; } +/* A set of expected results, also in OSSL_FN_ULONG array form */ +static const OSSL_FN_ULONG ex_mul_num0_num0[] = { + OSSL_FN_ULONG64_C(0x00000000, 0x00000001), + OSSL_FN_ULONG64_C(0x40000000, 0x00000001), +}; +static const OSSL_FN_ULONG ex_mul_num0_num1[] = { + OSSL_FN_ULONG64_C(0x00000001, 0x80000000), + OSSL_FN_ULONG64_C(0x00000000, 0xC0000000), +}; +static const OSSL_FN_ULONG ex_mul_num0_num2[] = { + OSSL_FN_ULONG64_C(0x81234567, 0x89ABCDEF), + OSSL_FN_ULONG64_C(0x0091A2B3, 0xC4D5E6F7), +}; +static const OSSL_FN_ULONG ex_mul_num0_num3[] = { + OSSL_FN_ULONG64_C(0xFEDCBA98, 0x76543210), + OSSL_FN_ULONG64_C(0x7F6E5D4C, 0x3B2A1908), +}; +static const OSSL_FN_ULONG ex_mul_num1_num1[] = { + OSSL_FN_ULONG64_C(0x40000000, 0x00000000), + OSSL_FN_ULONG64_C(0x00000000, 0x00000002), +}; +static const OSSL_FN_ULONG ex_mul_num1_num2[] = { + OSSL_FN_ULONG64_C(0x4E81B4E6, 0x80000000), + OSSL_FN_ULONG64_C(0x00000000, 0x01B4E81B), +}; +static const OSSL_FN_ULONG ex_mul_num1_num3[] = { + OSSL_FN_ULONG64_C(0xB17E4B18, 0x00000000), + OSSL_FN_ULONG64_C(0x00000001, 0x7E4B17E4), +}; +static const OSSL_FN_ULONG ex_mul_num2_num2[] = { + OSSL_FN_ULONG64_C(0xDCA5E208, 0x90F2A521), + OSSL_FN_ULONG64_C(0x00014B66, 0xDC33F6AC), +}; +static const OSSL_FN_ULONG ex_mul_num2_num3[] = { + OSSL_FN_ULONG64_C(0x2236D88F, 0xE5618CF0), + OSSL_FN_ULONG64_C(0x0121FA00, 0xAD77D742), +}; +static const OSSL_FN_ULONG ex_mul_num3_num3[] = { + OSSL_FN_ULONG64_C(0xDEEC6CD7, 0xA44A4100), + OSSL_FN_ULONG64_C(0xFDBAC097, 0xC8DC5ACC), +}; +/* Expected results for edge cases */ +static const OSSL_FN_ULONG ex_mul_num4_num4[] = { + OSSL_FN_ULONG64_C(0x00000000, 0x00000000), + OSSL_FN_ULONG64_C(0x00000000, 0x00000000), +}; +static const OSSL_FN_ULONG ex_mul_num5_num5[] = { + OSSL_FN_ULONG64_C(0x00000000, 0x00000001), + OSSL_FN_ULONG64_C(0xFFFFFFFF, 0xFFFFFFFE), +}; +static const OSSL_FN_ULONG ex_mul_num6_num6[] = { + OSSL_FN_ULONG64_C(0x00000000, 0x00000000), + OSSL_FN_ULONG64_C(0x00000000, 0x00000000), + OSSL_FN_ULONG64_C(0x00000000, 0x00000000), + OSSL_FN_ULONG64_C(0x01000000, 0x00000000), +}; + +static int test_mul_feature_r_is_operand(int i) +{ + int ret = 1; + const OSSL_FN_ULONG *a_data = num0; + size_t a_limbs = sizeof(num0) / OSSL_FN_BYTES; + const OSSL_FN_ULONG *b_data = num1; + size_t b_limbs = sizeof(num1) / OSSL_FN_BYTES; + OSSL_FN *a = NULL, *b = NULL, *res = NULL; + + OSSL_FN_CTX *ctx = NULL; + if (!TEST_ptr(ctx = OSSL_FN_CTX_new(NULL, 1, 1, a_limbs + b_limbs)) + || !TEST_ptr(a = OSSL_FN_new_limbs(a_limbs)) + || !TEST_ptr(b = OSSL_FN_new_limbs(b_limbs)) + || !TEST_true(ossl_fn_set_words(a, a_data, a_limbs)) + || !TEST_true(ossl_fn_set_words(b, b_data, b_limbs))) { + ret = 0; + /* There's no way to continue tests in this case */ + goto end; + } + + const OSSL_FN *op1 = NULL, *op2 = NULL; + const OSSL_FN_ULONG *u = NULL; + const OSSL_FN_ULONG *ex_data = NULL; + size_t ex_limbs = 0; + + switch (i) { + case 0: + /* a * b, result in separate OSSL_FN */ + if (!TEST_ptr(res = OSSL_FN_new_limbs(a_limbs + b_limbs))) { + ret = 0; + goto end; + } + op1 = a; + op2 = b; + ex_data = ex_mul_num0_num1; + ex_limbs = ossl_fn_get_dsize(res); + break; + case 1: + /* a * b, result in a */ + res = a; + op1 = a; + op2 = b; + ex_data = ex_mul_num0_num1; + ex_limbs = ossl_fn_get_dsize(res); + break; + case 2: + /* a * b, result in b */ + res = b; + op1 = a; + op2 = b; + ex_data = ex_mul_num0_num1; + ex_limbs = ossl_fn_get_dsize(res); + break; + case 3: + /* a * a, result in a */ + res = a; + op1 = a; + op2 = a; + ex_data = ex_mul_num0_num0; + ex_limbs = ossl_fn_get_dsize(res); + break; + default: + /* Invalid call */ + ret = 0; + goto end; + } + + if (!TEST_true(OSSL_FN_mul(res, op1, op2, ctx)) + || !TEST_ptr(u = ossl_fn_get_words(res)) + || !TEST_mem_eq(u, ex_limbs * OSSL_FN_BYTES, + ex_data, ex_limbs * OSSL_FN_BYTES)) + ret = 0; + + if (TEST_ptr(u = ossl_fn_get_words(a))) { + if (res == a) { + if (!TEST_mem_eq(u, ex_limbs * OSSL_FN_BYTES, + ex_data, ex_limbs * OSSL_FN_BYTES)) + res = 0; + } else { + if (!TEST_mem_eq(u, a_limbs * OSSL_FN_BYTES, + a_data, a_limbs * OSSL_FN_BYTES)) + res = 0; + } + } + + if (TEST_ptr(u = ossl_fn_get_words(b))) { + if (res == b) { + if (!TEST_mem_eq(u, ex_limbs * OSSL_FN_BYTES, + ex_data, ex_limbs * OSSL_FN_BYTES)) + res = 0; + } else { + if (!TEST_mem_eq(u, b_limbs * OSSL_FN_BYTES, + b_data, b_limbs * OSSL_FN_BYTES)) + res = 0; + } + } + +end: + OSSL_FN_CTX_free(ctx); + if (res != a && res != b) + OSSL_FN_free(res); + OSSL_FN_free(a); + OSSL_FN_free(b); + return ret; +} + +static int test_mul_common(struct test_case_st test_case) +{ + int ret = 1; + const OSSL_FN_ULONG *n1 = test_case.op1; + size_t n1_limbs = test_case.op1_size; + const OSSL_FN_ULONG *n2 = test_case.op2; + size_t n2_limbs = test_case.op2_size; + const OSSL_FN_ULONG *ex = test_case.ex; + size_t n1_new_limbs = test_case.op1_live_size; + size_t n2_new_limbs = test_case.op2_live_size; + size_t res_limbs = test_case.res_live_size; + size_t check_limbs = test_case.check_size; + OSSL_FN *fn1 = NULL, *fn2 = NULL, *res = NULL; + const OSSL_FN_ULONG *u = NULL; + + OSSL_FN_CTX *ctx = NULL; + if (!TEST_ptr(ctx = OSSL_FN_CTX_new(NULL, 1, 1, res_limbs)) + || !TEST_ptr(fn1 = OSSL_FN_new_limbs(n1_new_limbs)) + || !TEST_ptr(fn2 = OSSL_FN_new_limbs(n2_new_limbs)) + || !TEST_true(ossl_fn_set_words(fn1, n1, n1_limbs)) + || !TEST_true(ossl_fn_set_words(fn2, n2, n2_limbs)) + || !TEST_ptr(res = OSSL_FN_new_limbs(res_limbs))) { + res = 0; + /* There's no way to continue tests in this case */ + goto end; + } + + /* To test that OSSL_FN_mul() does a complete job, 'res' is pre-polluted */ + + if (!TEST_true(pollute(res, 0, res_limbs)) + || !TEST_true(OSSL_FN_mul(res, fn1, fn2, ctx)) + || !TEST_ptr(u = ossl_fn_get_words(res)) + || !TEST_mem_eq(u, check_limbs * OSSL_FN_BYTES, + ex, check_limbs * OSSL_FN_BYTES) + || !TEST_true(check_zero(res, check_limbs, res_limbs))) + ret = 0; + +end: + OSSL_FN_CTX_free(ctx); + OSSL_FN_free(fn1); + OSSL_FN_free(fn2); + OSSL_FN_free(res); + + return ret; +} + +/* i should be set to match the iteration number that's displayed when testing */ +#define MUL_CASE(i, op1, op2, ex) \ + { \ + /* op1, with size */ op1, \ + LIMBSOF(op1), \ + /* op2, with size */ op2, \ + LIMBSOF(op2), \ + /* ex, with size */ ex, \ + LIMBSOF(ex), \ + /* op1_live_size */ LIMBSOF(op1) + 1, \ + /* op2_live_size */ LIMBSOF(op2) + 2, \ + /* res_live_size */ LIMBSOF(op1) + LIMBSOF(op2) + ((i - 1) % 4), \ + /* check_size */ LIMBSOF(ex), \ + } + +static struct test_case_st test_mul_cases[] = { + MUL_CASE(1, num0, num0, ex_mul_num0_num0), + MUL_CASE(2, num0, num1, ex_mul_num0_num1), + MUL_CASE(3, num0, num2, ex_mul_num0_num2), + MUL_CASE(4, num0, num3, ex_mul_num0_num3), + MUL_CASE(5, num1, num0, ex_mul_num0_num1), /* Commutativity check */ + MUL_CASE(6, num1, num1, ex_mul_num1_num1), + MUL_CASE(7, num1, num2, ex_mul_num1_num2), + MUL_CASE(8, num1, num3, ex_mul_num1_num3), + MUL_CASE(9, num2, num0, ex_mul_num0_num2), /* Commutativity check */ + MUL_CASE(10, num2, num1, ex_mul_num1_num2), /* Commutativity check */ + MUL_CASE(11, num2, num2, ex_mul_num2_num2), + MUL_CASE(12, num2, num3, ex_mul_num2_num3), + MUL_CASE(13, num3, num0, ex_mul_num0_num3), /* Commutativity check */ + MUL_CASE(14, num3, num1, ex_mul_num1_num3), /* Commutativity check */ + MUL_CASE(15, num3, num2, ex_mul_num2_num3), /* Commutativity check */ + MUL_CASE(16, num3, num3, ex_mul_num3_num3), + + /* Edge cases */ + MUL_CASE(17, num4, num4, ex_mul_num4_num4), + MUL_CASE(18, num5, num5, ex_mul_num5_num5), + MUL_CASE(19, num6, num6, ex_mul_num6_num6), +}; + +static int test_mul(int i) +{ + return test_mul_common(test_mul_cases[i]); +} + +/* i should be set to match the iteration number that's displayed when testing */ +#define MUL_TRUNCATED_CASE(i, op1, op2, ex) \ + { \ + /* op1, with size */ op1, \ + LIMBSOF(op1), \ + /* op2, with size */ op2, \ + LIMBSOF(op2), \ + /* ex, with size */ ex, \ + LIMBSOF(ex), \ + /* op1_live_size */ LIMBSOF(op1) + 1, \ + /* op2_live_size */ LIMBSOF(op2) + 2, \ + /* res_live_size */ LIMBSOF(ex) / 2, \ + /* check_size */ LIMBSOF(ex) / 2, \ + } +/* A special case, where the truncation is set to the size of ex minus 64 bits */ +#define MUL_TRUNCATED_SPECIAL_CASE1(i, op1, op2, ex) \ + { \ + /* op1, with size */ op1, \ + LIMBSOF(op1), \ + /* op2, with size */ op2, \ + LIMBSOF(op2), \ + /* ex, with size */ ex, \ + LIMBSOF(ex), \ + /* op1_live_size */ LIMBSOF(op1) + 1, \ + /* op2_live_size */ LIMBSOF(op2) + 2, \ + /* res_live_size */ LIMBSOF(ex) - 8 / OSSL_FN_BYTES, \ + /* check_size */ LIMBSOF(ex) - 8 / OSSL_FN_BYTES, \ + } + +static struct test_case_st test_mul_truncate_cases[] = { + MUL_TRUNCATED_CASE(1, num0, num0, ex_mul_num0_num0), + MUL_TRUNCATED_CASE(2, num0, num1, ex_mul_num0_num1), + MUL_TRUNCATED_CASE(3, num0, num2, ex_mul_num0_num2), + MUL_TRUNCATED_CASE(4, num0, num3, ex_mul_num0_num3), + MUL_TRUNCATED_CASE(5, num1, num0, ex_mul_num0_num1), /* Commutativity check */ + MUL_TRUNCATED_CASE(6, num1, num1, ex_mul_num1_num1), + MUL_TRUNCATED_CASE(7, num1, num2, ex_mul_num1_num2), + MUL_TRUNCATED_CASE(8, num1, num3, ex_mul_num1_num3), + MUL_TRUNCATED_CASE(9, num2, num0, ex_mul_num0_num2), /* Commutativity check */ + MUL_TRUNCATED_CASE(10, num2, num1, ex_mul_num1_num2), /* Commutativity check */ + MUL_TRUNCATED_CASE(11, num2, num2, ex_mul_num2_num2), + MUL_TRUNCATED_CASE(12, num2, num3, ex_mul_num2_num3), + MUL_TRUNCATED_CASE(13, num3, num0, ex_mul_num0_num3), /* Commutativity check */ + MUL_TRUNCATED_CASE(14, num3, num1, ex_mul_num1_num3), /* Commutativity check */ + MUL_TRUNCATED_CASE(15, num3, num2, ex_mul_num2_num3), /* Commutativity check */ + MUL_TRUNCATED_CASE(16, num3, num3, ex_mul_num3_num3), + + /* Edge cases */ + MUL_TRUNCATED_CASE(17, num4, num4, ex_mul_num4_num4), + MUL_TRUNCATED_CASE(18, num5, num5, ex_mul_num5_num5), + MUL_TRUNCATED_SPECIAL_CASE1(19, num6, num6, ex_mul_num6_num6), +}; + +static int test_mul_truncated(int i) +{ + return test_mul_common(test_mul_truncate_cases[i]); +} + int setup_tests(void) { ADD_ALL_TESTS(test_add, 16); ADD_ALL_TESTS(test_sub, 16); + ADD_ALL_TESTS(test_mul_feature_r_is_operand, 4); + ADD_ALL_TESTS(test_mul, OSSL_NELEM(test_mul_cases)); + ADD_ALL_TESTS(test_mul_truncated, OSSL_NELEM(test_mul_truncate_cases)); return 1; } From 8f77f825faf01f6b068b374e86769e201334d6de Mon Sep 17 00:00:00 2001 From: Richard Levitte Date: Mon, 24 Nov 2025 14:39:44 +0100 Subject: [PATCH 18/69] OSSL_FN: Wrap BIGNUM the 'mul' function around the OSSL_FN 'mul' function Reviewed-by: Matt Caswell Reviewed-by: Tomas Mraz (Merged from https://github.com/openssl/openssl/pull/29203) --- crypto/bn/bn_mul.c | 30 ++++++++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/crypto/bn/bn_mul.c b/crypto/bn/bn_mul.c index d887c23225..d480d48722 100644 --- a/crypto/bn/bn_mul.c +++ b/crypto/bn/bn_mul.c @@ -13,11 +13,37 @@ int BN_mul(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, BN_CTX *ctx) { - int ret = bn_mul_fixed_top(r, a, b, ctx); + /* TODO(FIXNUM): TO BE REMOVED */ + if (r->data == NULL || a->data == NULL || b->data == NULL) { + int ret = bn_mul_fixed_top(r, a, b, ctx); - bn_correct_top(r); + bn_correct_top(r); + bn_check_top(r); + + return ret; + } + + bn_check_top(a); + bn_check_top(b); bn_check_top(r); + size_t top = a->top + b->top; + size_t max = a->dmax + b->dmax; + + /* + * Unfortunately, OSSL_FN_CTX and BN_CTX are too wildly different to + * be interchangeable. We must therefore create an OSSL_FN_CTX here. + * (OSSL_FN_CTX is only really useful within OSSL_FN functionality) + */ + OSSL_FN_CTX *fnctx = OSSL_FN_CTX_new(NULL, 1, 1, max); + OSSL_FN *rf = bn_acquire_ossl_fn(r, (int)top); + int ret = OSSL_FN_mul(rf, a->data, b->data, fnctx); + bn_release(r, (int)top); + + if (ret && !BN_is_zero(r)) + r->neg = a->neg ^ b->neg; + + OSSL_FN_CTX_free(fnctx); return ret; } From ab79f5411473f0f304fd6570106d0470ccb48484 Mon Sep 17 00:00:00 2001 From: Richard Levitte Date: Tue, 16 Dec 2025 08:04:37 +0100 Subject: [PATCH 19/69] OSSL_FN: Add the OSSL_FN_ typedefs to .clang-format's TypeNames Furthermore, reformatting left some weird commenting in fn_api_test.c because of (legitimate) line breaks, so they get adjust for purpose. Reviewed-by: Matt Caswell Reviewed-by: Tomas Mraz (Merged from https://github.com/openssl/openssl/pull/29412) --- .clang-format | 2 ++ test/fn_api_test.c | 48 +++++++++++++++++++++++----------------------- 2 files changed, 26 insertions(+), 24 deletions(-) diff --git a/.clang-format b/.clang-format index df41044fe1..32b8bd5cfd 100644 --- a/.clang-format +++ b/.clang-format @@ -599,6 +599,8 @@ TypeNames: - "ossl_finish_mutate_cb" - "OSSL_FIPS_IND" - "OSSL_FIPS_IND_CHECK_CB" + - "OSSL_FN_CTX" + - "OSSL_FN_ULONG" - "OSSL_FUNC" - "OSSL_HANDSHAKE_STATE" - "OSSL_HASH" diff --git a/test/fn_api_test.c b/test/fn_api_test.c index 0bf8351ed6..880d0b275c 100644 --- a/test/fn_api_test.c +++ b/test/fn_api_test.c @@ -133,12 +133,12 @@ static const OSSL_FN_ULONG ex_add_num3_num3[] = { #define ADD_CASE(i, op1, op2, ex) \ { \ - /* op1, with size */ op1, \ - LIMBSOF(op1), \ - /* op2, with size */ op2, \ - LIMBSOF(op2), \ - /* ex, with size */ ex, \ - LIMBSOF(ex), \ + /* op1 */ op1, \ + /* op1_size */ LIMBSOF(op1), \ + /* op2 */ op2, \ + /* op2_size */ LIMBSOF(op2), \ + /* ex */ ex, \ + /* ex_size */ LIMBSOF(ex), \ /* op1_live_size */ LIMBSOF(op1), \ /* op2_live_size */ LIMBSOF(op2), \ /* res_live_size */ LIMBSOF(ex), \ @@ -530,12 +530,12 @@ end: /* i should be set to match the iteration number that's displayed when testing */ #define MUL_CASE(i, op1, op2, ex) \ { \ - /* op1, with size */ op1, \ - LIMBSOF(op1), \ - /* op2, with size */ op2, \ - LIMBSOF(op2), \ - /* ex, with size */ ex, \ - LIMBSOF(ex), \ + /* op1 */ op1, \ + /* op1_size */ LIMBSOF(op1), \ + /* op2 */ op2, \ + /* op2_size */ LIMBSOF(op2), \ + /* ex */ ex, \ + /* ex_size */ LIMBSOF(ex), \ /* op1_live_size */ LIMBSOF(op1) + 1, \ /* op2_live_size */ LIMBSOF(op2) + 2, \ /* res_live_size */ LIMBSOF(op1) + LIMBSOF(op2) + ((i - 1) % 4), \ @@ -574,12 +574,12 @@ static int test_mul(int i) /* i should be set to match the iteration number that's displayed when testing */ #define MUL_TRUNCATED_CASE(i, op1, op2, ex) \ { \ - /* op1, with size */ op1, \ - LIMBSOF(op1), \ - /* op2, with size */ op2, \ - LIMBSOF(op2), \ - /* ex, with size */ ex, \ - LIMBSOF(ex), \ + /* op1 */ op1, \ + /* op1_size */ LIMBSOF(op1), \ + /* op2 */ op2, \ + /* op2_size */ LIMBSOF(op2), \ + /* ex */ ex, \ + /* ex_size */ LIMBSOF(ex), \ /* op1_live_size */ LIMBSOF(op1) + 1, \ /* op2_live_size */ LIMBSOF(op2) + 2, \ /* res_live_size */ LIMBSOF(ex) / 2, \ @@ -588,12 +588,12 @@ static int test_mul(int i) /* A special case, where the truncation is set to the size of ex minus 64 bits */ #define MUL_TRUNCATED_SPECIAL_CASE1(i, op1, op2, ex) \ { \ - /* op1, with size */ op1, \ - LIMBSOF(op1), \ - /* op2, with size */ op2, \ - LIMBSOF(op2), \ - /* ex, with size */ ex, \ - LIMBSOF(ex), \ + /* op1 */ op1, \ + /* op1_size */ LIMBSOF(op1), \ + /* op2 */ op2, \ + /* op2_size */ LIMBSOF(op2), \ + /* ex */ ex, \ + /* ex_size */ LIMBSOF(ex), \ /* op1_live_size */ LIMBSOF(op1) + 1, \ /* op2_live_size */ LIMBSOF(op2) + 2, \ /* res_live_size */ LIMBSOF(ex) - 8 / OSSL_FN_BYTES, \ From ded391d6ce0dc0ad97a990fcbf76ab2524596ff8 Mon Sep 17 00:00:00 2001 From: Richard Levitte Date: Wed, 3 Dec 2025 21:21:37 +0100 Subject: [PATCH 20/69] OSSL_FN: Refactor OSSL_FN_add() and OSSL_FN_sub() for truncation OSSL_FN_mul() set a path that wasn't considered for OSSL_FN_add() and OSSL_FN_sub(); a truncated result if the result OSSL_FN isn't large enough to contain the full result. This is done to keep the OSSL_FN API consistent, with a (tentative) bonus, that the function calls become more constant time accross repeated calls with the same size for operands and result. Reviewed-by: Matt Caswell Reviewed-by: Tomas Mraz (Merged from https://github.com/openssl/openssl/pull/29309) --- crypto/fn/fn_addsub.c | 104 ++++++++----- test/fn_api_test.c | 331 +++++++++++++++++++++++++++++------------- 2 files changed, 300 insertions(+), 135 deletions(-) diff --git a/crypto/fn/fn_addsub.c b/crypto/fn/fn_addsub.c index 6c81c3c733..53b0530819 100644 --- a/crypto/fn/fn_addsub.c +++ b/crypto/fn/fn_addsub.c @@ -33,33 +33,53 @@ int OSSL_FN_add(OSSL_FN *r, const OSSL_FN *a, const OSSL_FN *b) size_t max = a->dsize; size_t min = b->dsize; size_t rs = r->dsize; - - /* - * 'r' must be able to contain the result. This is on the caller. - */ - if (!ossl_assert(max <= rs)) { - ERR_raise(ERR_LIB_OSSL_FN, OSSL_FN_R_RESULT_ARG_TOO_SMALL); - return 0; - } - const OSSL_FN_ULONG *ap = a->d; const OSSL_FN_ULONG *bp = b->d; - OSSL_FN_ULONG *rp = r->d; - OSSL_FN_ULONG carry = bn_add_words(rp, ap, bp, (int)min); + /* + * Three stages, after which there's a possible return. + * Each stage is limited by the number of remaining limbs + * in |r|. + * + * For each stage, |stage_limbs| is used to hold the number + * of limbs being treated in that stage, and |borrow| is + * used to transport the borrow from one stage to the other. + */ + size_t stage_limbs; + OSSL_FN_ULONG carry; + + /* Stage 1 */ + + stage_limbs = (min > rs) ? rs : min; + carry = bn_add_words(rp, ap, bp, (int)stage_limbs); + if (stage_limbs == rs) + return 1; + + /* At this point, we know that |min| limbs have been used so far */ rp += min; ap += min; - for (size_t dif = max - min; dif > 0; dif--, ap++, rp++) { + /* Stage 2 */ + + stage_limbs = ((max > rs) ? rs : max) - min; + + for (size_t dif = stage_limbs; dif > 0; dif--, ap++, rp++) { OSSL_FN_ULONG t1 = *ap; OSSL_FN_ULONG t2 = (t1 + carry) & OSSL_FN_MASK; *rp = t2; carry &= (t2 == 0); } + if (stage_limbs == rs) + return 1; - for (size_t dif = r->dsize - max; dif > 0; dif--, rp++) { + /* Stage 3 */ + + /* We know that |max| limbs have been used */ + stage_limbs = rs - max; + + for (size_t dif = stage_limbs; dif > 0; dif--, rp++) { OSSL_FN_ULONG t1 = 0; OSSL_FN_ULONG t2 = (t1 + carry) & OSSL_FN_MASK; @@ -76,45 +96,61 @@ int OSSL_FN_sub(OSSL_FN *r, const OSSL_FN *a, const OSSL_FN *b) size_t max = (a->dsize >= b->dsize) ? a->dsize : b->dsize; size_t min = (a->dsize <= b->dsize) ? a->dsize : b->dsize; size_t rs = r->dsize; - - /* - * 'r' must be able to contain the result. This is on the caller. - */ - if (!ossl_assert(max <= rs)) { - ERR_raise(ERR_LIB_OSSL_FN, OSSL_FN_R_RESULT_ARG_TOO_SMALL); - return 0; - } - const OSSL_FN_ULONG *ap = a->d; const OSSL_FN_ULONG *bp = b->d; OSSL_FN_ULONG *rp = r->d; - OSSL_FN_ULONG borrow = bn_sub_words(rp, ap, bp, (int)min); /* - * TODO(FIXNUM): everything following isn't strictly constant-time, - * and could use improvement in that regard. + * Three stages, after which there's a possible return. + * Each stage is limited by the number of remaining limbs + * in |r|. + * + * For each stage, |stage_limbs| is used to hold the number + * of limbs being treated in that stage, and |borrow| is + * used to transport the borrow from one stage to the other. */ + size_t stage_limbs; + OSSL_FN_ULONG borrow; + /* Stage 1 */ + + stage_limbs = (min > rs) ? rs : min; + borrow = bn_sub_words(rp, ap, bp, (int)stage_limbs); + if (stage_limbs == rs) + return 1; + + /* At this point, we know that |min| limbs have been used so far */ ap += min; bp += min; rp += min; - const OSSL_FN_ULONG *maxp = (a->dsize >= b->dsize) ? ap : bp; + /* Stage 2 */ - /* "sign" borrow, depending on if maxp == ap or maxp == bp */ - borrow *= (OSSL_FN_ULONG)((a->dsize >= b->dsize) ? 1 : -1); + const OSSL_FN_ULONG *maxp = (a->dsize >= b->dsize) ? ap : bp; + const OSSL_FN_ULONG s2_mask1 = (a->dsize >= b->dsize) ? OSSL_FN_MASK : 0; + const OSSL_FN_ULONG s2_mask2 = ~s2_mask1; + + stage_limbs = ((max > rs) ? rs : max) - min; /* calculate the result of borrowing from more significant limbs */ - for (size_t dif = max - min; dif > 0; dif--, maxp++, rp++) { - OSSL_FN_ULONG t1 = *maxp; - OSSL_FN_ULONG t2 = (t1 - borrow) & OSSL_FN_MASK; + for (size_t dif = stage_limbs; dif > 0; dif--, maxp++, rp++) { + OSSL_FN_ULONG t1 = (*maxp & s2_mask1); + OSSL_FN_ULONG t2 = (*maxp & s2_mask2); + OSSL_FN_ULONG t3 = (t1 - t2 - borrow) & OSSL_FN_MASK; - *rp = t2; - borrow &= (t1 == 0); + *rp = t3; + borrow &= (t1 <= t2); } + if (stage_limbs == rs) + return 1; + + /* Stage 3 */ + + /* We know that |max| limbs have been used */ + stage_limbs = rs - max; /* Finally, fill in the rest of the result array by borrowing from zeros */ - for (size_t dif = rs - max; dif > 0; dif--, rp++) { + for (size_t dif = stage_limbs; dif > 0; dif--, rp++) { OSSL_FN_ULONG t1 = 0; OSSL_FN_ULONG t2 = (t1 - borrow) & OSSL_FN_MASK; diff --git a/test/fn_api_test.c b/test/fn_api_test.c index 880d0b275c..ad0dc2a028 100644 --- a/test/fn_api_test.c +++ b/test/fn_api_test.c @@ -41,7 +41,8 @@ static int pollute(OSSL_FN *f, size_t start, size_t end) return 1; } -static int check_zero(const OSSL_FN *f, size_t start, size_t end) +static int check_limbs_value(const OSSL_FN *f, size_t start, size_t end, + OSSL_FN_ULONG value) { const OSSL_FN_ULONG *u = ossl_fn_get_words(f); size_t l = ossl_fn_get_dsize(f); @@ -52,8 +53,10 @@ static int check_zero(const OSSL_FN *f, size_t start, size_t end) start = end; for (size_t i = start; i < end; i++) - if (u[i] != 0) + if (!TEST_size_t_eq(u[i], value)) { + TEST_note("start = %zu, end = %zu, i = %zu\n", start, end, i); return 0; + } return 1; } @@ -95,6 +98,11 @@ struct test_case_st { /* Number of limbs to compare the result's OSSL_FN_ULONG array against ex */ size_t check_size; + + /* When the result is larger than check_size, the expected extended value */ + OSSL_FN_ULONG extended_limb_value; +#define EXTENDED_LIMB_ZERO ((OSSL_FN_ULONG)0) +#define EXTENDED_LIMB_MINUS_ONE ((OSSL_FN_ULONG)-1) }; static const OSSL_FN_ULONG ex_add_num0_num0[] = { @@ -131,18 +139,64 @@ static const OSSL_FN_ULONG ex_add_num3_num3[] = { OSSL_FN_ULONG_C(0x1), }; -#define ADD_CASE(i, op1, op2, ex) \ - { \ - /* op1 */ op1, \ - /* op1_size */ LIMBSOF(op1), \ - /* op2 */ op2, \ - /* op2_size */ LIMBSOF(op2), \ - /* ex */ ex, \ - /* ex_size */ LIMBSOF(ex), \ - /* op1_live_size */ LIMBSOF(op1), \ - /* op2_live_size */ LIMBSOF(op2), \ - /* res_live_size */ LIMBSOF(ex), \ - /* check_size */ LIMBSOF(ex), \ +static int test_add_common(struct test_case_st test_case) +{ + const OSSL_FN_ULONG *n1 = test_case.op1; + size_t n1_limbs = test_case.op1_size; + const OSSL_FN_ULONG *n2 = test_case.op2; + size_t n2_limbs = test_case.op2_size; + const OSSL_FN_ULONG *ex = test_case.ex; + size_t n1_new_limbs = test_case.op1_live_size; + size_t n2_new_limbs = test_case.op2_live_size; + size_t res_limbs = test_case.res_live_size; + size_t check_limbs = test_case.check_size; + OSSL_FN_ULONG extended_value = test_case.extended_limb_value; + int ret = 1; + OSSL_FN *fn1 = NULL, *fn2 = NULL, *res = NULL; + const OSSL_FN_ULONG *u = NULL; + + /* To test that OSSL_FN_add() does a complete job, 'res' is pre-polluted */ + + if (!TEST_ptr(fn1 = OSSL_FN_new_limbs(n1_new_limbs)) + || !TEST_ptr(fn2 = OSSL_FN_new_limbs(n2_new_limbs)) + || !TEST_true(ossl_fn_set_words(fn1, n1, n1_limbs)) + || !TEST_true(ossl_fn_set_words(fn2, n2, n2_limbs)) + || !TEST_ptr(res = OSSL_FN_new_limbs(res_limbs)) + || !TEST_true(pollute(res, 0, res_limbs))) { + res = 0; + /* There's no way to continue tests in this case */ + goto end; + } + + if (!TEST_true(OSSL_FN_add(res, fn1, fn2)) + || !TEST_ptr(u = ossl_fn_get_words(res)) + || !TEST_mem_eq(u, check_limbs * OSSL_FN_BYTES, + ex, check_limbs * OSSL_FN_BYTES) + || !TEST_true(check_limbs_value(res, check_limbs, res_limbs, + extended_value))) + ret = 0; + +end: + OSSL_FN_free(fn1); + OSSL_FN_free(fn2); + OSSL_FN_free(res); + + return ret; +} + +#define ADD_CASE(i, op1, op2, ex) \ + { \ + /* op1 */ op1, \ + /* op1_size */ LIMBSOF(op1), \ + /* op2 */ op2, \ + /* op2_size */ LIMBSOF(op2), \ + /* ex */ ex, \ + /* ex_size */ LIMBSOF(ex), \ + /* op1_live_size */ LIMBSOF(op1) + 1, \ + /* op2_live_size */ LIMBSOF(op2) + 2, \ + /* res_live_size */ LIMBSOF(ex) + 3, \ + /* check_size */ LIMBSOF(ex), \ + /* extended_limb_value */ EXTENDED_LIMB_ZERO, \ } static struct test_case_st test_add_cases[] = { @@ -166,35 +220,46 @@ static struct test_case_st test_add_cases[] = { static int test_add(int i) { - const OSSL_FN_ULONG *n1 = test_add_cases[i].op1; - size_t n1_limbs = test_add_cases[i].op1_size; - const OSSL_FN_ULONG *n2 = test_add_cases[i].op2; - size_t n2_limbs = test_add_cases[i].op2_size; - const OSSL_FN_ULONG *ex = test_add_cases[i].ex; - size_t ex_limbs = test_add_cases[i].ex_size; - size_t check_limbs = test_add_cases[i].check_size; - int ret = 1; - OSSL_FN *fn1 = NULL, *fn2 = NULL, *res = NULL; - const OSSL_FN_ULONG *u = NULL; + return test_add_common(test_add_cases[i]); +} - /* To test that OSSL_FN_add() does a complete job, 'res' is pre-polluted */ +#define ADD_TRUNCATED_CASE(i, op1, op2, ex) \ + { \ + /* op1 */ op1, \ + /* op1_size */ LIMBSOF(op1), \ + /* op2 */ op2, \ + /* op2_size */ LIMBSOF(op2), \ + /* ex */ ex, \ + /* ex_size */ LIMBSOF(ex), \ + /* op1_live_size */ LIMBSOF(op1) + 1, \ + /* op2_live_size */ LIMBSOF(op2) + 2, \ + /* res_live_size */ LIMBSOF(ex) - 1, \ + /* check_size */ LIMBSOF(ex) - 1, \ + /* extended_limb_value */ EXTENDED_LIMB_ZERO, \ + } - if (!TEST_ptr(fn1 = OSSL_FN_new_limbs(n1_limbs)) - || !TEST_ptr(fn2 = OSSL_FN_new_limbs(n2_limbs)) - || !TEST_ptr(res = OSSL_FN_new_limbs(ex_limbs)) - || !TEST_true(pollute(res, 0, ex_limbs)) - || !TEST_true(ossl_fn_set_words(fn1, n1, n1_limbs)) - || !TEST_true(ossl_fn_set_words(fn2, n2, n2_limbs)) - || !TEST_true(OSSL_FN_add(res, fn1, fn2)) - || !TEST_ptr(u = ossl_fn_get_words(res)) - || !TEST_mem_eq(u, ossl_fn_get_dsize(res) * OSSL_FN_BYTES, - ex, check_limbs * OSSL_FN_BYTES)) - ret = 0; - OSSL_FN_free(fn1); - OSSL_FN_free(fn2); - OSSL_FN_free(res); +static struct test_case_st test_add_truncated_cases[] = { + ADD_TRUNCATED_CASE(1, num0, num0, ex_add_num0_num0), + ADD_TRUNCATED_CASE(2, num0, num1, ex_add_num0_num1), + ADD_TRUNCATED_CASE(3, num0, num2, ex_add_num0_num2), + ADD_TRUNCATED_CASE(4, num0, num3, ex_add_num0_num3), + ADD_TRUNCATED_CASE(5, num1, num0, ex_add_num0_num1), /* Commutativity check */ + ADD_TRUNCATED_CASE(6, num1, num1, ex_add_num1_num1), + ADD_TRUNCATED_CASE(7, num1, num2, ex_add_num1_num2), + ADD_TRUNCATED_CASE(8, num1, num3, ex_add_num1_num3), + ADD_TRUNCATED_CASE(9, num2, num0, ex_add_num0_num2), /* Commutativity check */ + ADD_TRUNCATED_CASE(10, num2, num1, ex_add_num1_num2), /* Commutativity check */ + ADD_TRUNCATED_CASE(11, num2, num2, ex_add_num2_num2), + ADD_TRUNCATED_CASE(12, num2, num3, ex_add_num2_num3), + ADD_TRUNCATED_CASE(13, num3, num0, ex_add_num0_num3), /* Commutativity check */ + ADD_TRUNCATED_CASE(14, num3, num1, ex_add_num1_num3), /* Commutativity check */ + ADD_TRUNCATED_CASE(15, num3, num2, ex_add_num2_num3), /* Commutativity check */ + ADD_TRUNCATED_CASE(16, num3, num3, ex_add_num3_num3), +}; - return ret; +static int test_add_truncated(int i) +{ + return test_add_common(test_add_truncated_cases[i]); } static const OSSL_FN_ULONG ex_sub_num0_num0[] = { @@ -252,65 +317,44 @@ static const OSSL_FN_ULONG ex_sub_num3_num3[] = { OSSL_FN_ULONG64_C(0x00000000, 0x00000000), }; -#define SUB_CASE(i, op1, op2, ex) \ - { \ - /* op1, with size */ op1, \ - LIMBSOF(op1), \ - /* op2, with size */ op2, \ - LIMBSOF(op2), \ - /* ex, with size */ ex, \ - LIMBSOF(ex), \ - /* op1_live_size */ LIMBSOF(op1), \ - /* op2_live_size */ LIMBSOF(op2), \ - /* res_live_size */ LIMBSOF(ex), \ - /* check_size */ LIMBSOF(ex), \ - } - -static struct test_case_st test_sub_cases[] = { - SUB_CASE(1, num0, num0, ex_sub_num0_num0), - SUB_CASE(2, num0, num1, ex_sub_num0_num1), - SUB_CASE(3, num0, num2, ex_sub_num0_num2), - SUB_CASE(4, num0, num3, ex_sub_num0_num3), - SUB_CASE(5, num1, num0, ex_sub_num1_num0), - SUB_CASE(6, num1, num1, ex_sub_num1_num1), - SUB_CASE(7, num1, num2, ex_sub_num1_num2), - SUB_CASE(8, num1, num3, ex_sub_num1_num3), - SUB_CASE(9, num2, num0, ex_sub_num2_num0), - SUB_CASE(10, num2, num1, ex_sub_num2_num1), - SUB_CASE(11, num2, num2, ex_sub_num2_num2), - SUB_CASE(12, num2, num3, ex_sub_num2_num3), - SUB_CASE(13, num3, num0, ex_sub_num3_num0), - SUB_CASE(14, num3, num1, ex_sub_num3_num1), - SUB_CASE(15, num3, num2, ex_sub_num3_num2), - SUB_CASE(16, num3, num3, ex_sub_num3_num3), -}; - -static int test_sub(int i) +static int test_sub_common(struct test_case_st test_case) { - const OSSL_FN_ULONG *n1 = test_sub_cases[i].op1; - size_t n1_limbs = test_sub_cases[i].op1_size; - const OSSL_FN_ULONG *n2 = test_sub_cases[i].op2; - size_t n2_limbs = test_sub_cases[i].op2_size; - const OSSL_FN_ULONG *ex = test_sub_cases[i].ex; - size_t ex_limbs = test_sub_cases[i].ex_size; - size_t check_limbs = test_sub_cases[i].check_size; + const OSSL_FN_ULONG *n1 = test_case.op1; + size_t n1_limbs = test_case.op1_size; + const OSSL_FN_ULONG *n2 = test_case.op2; + size_t n2_limbs = test_case.op2_size; + const OSSL_FN_ULONG *ex = test_case.ex; + size_t n1_new_limbs = test_case.op1_live_size; + size_t n2_new_limbs = test_case.op2_live_size; + size_t res_limbs = test_case.res_live_size; + size_t check_limbs = test_case.check_size; + OSSL_FN_ULONG extended_value = test_case.extended_limb_value; int ret = 1; OSSL_FN *fn1 = NULL, *fn2 = NULL, *res = NULL; const OSSL_FN_ULONG *u = NULL; /* To test that OSSL_FN_sub() does a complete job, 'res' is pre-polluted */ - if (!TEST_ptr(fn1 = OSSL_FN_new_limbs(n1_limbs)) - || !TEST_ptr(fn2 = OSSL_FN_new_limbs(n2_limbs)) - || !TEST_ptr(res = OSSL_FN_new_limbs(ex_limbs)) - || !TEST_true(pollute(res, 0, ex_limbs)) + if (!TEST_ptr(fn1 = OSSL_FN_new_limbs(n1_new_limbs)) + || !TEST_ptr(fn2 = OSSL_FN_new_limbs(n2_new_limbs)) || !TEST_true(ossl_fn_set_words(fn1, n1, n1_limbs)) || !TEST_true(ossl_fn_set_words(fn2, n2, n2_limbs)) - || !TEST_true(OSSL_FN_sub(res, fn1, fn2)) + || !TEST_ptr(res = OSSL_FN_new_limbs(res_limbs)) + || !TEST_true(pollute(res, 0, res_limbs))) { + res = 0; + /* There's no way to continue tests in this case */ + goto end; + } + + if (!TEST_true(OSSL_FN_sub(res, fn1, fn2)) || !TEST_ptr(u = ossl_fn_get_words(res)) - || !TEST_mem_eq(u, ossl_fn_get_dsize(res) * OSSL_FN_BYTES, - ex, check_limbs * OSSL_FN_BYTES)) + || !TEST_mem_eq(u, check_limbs * OSSL_FN_BYTES, + ex, check_limbs * OSSL_FN_BYTES) + || !TEST_true(check_limbs_value(res, check_limbs, res_limbs, + extended_value))) ret = 0; + +end: OSSL_FN_free(fn1); OSSL_FN_free(fn2); OSSL_FN_free(res); @@ -318,6 +362,84 @@ static int test_sub(int i) return ret; } +#define SUB_CASE(i, op1, op2, ex, ext) \ + { \ + /* op1 */ op1, \ + /* op1_size */ LIMBSOF(op1), \ + /* op2 */ op2, \ + /* op2_size */ LIMBSOF(op2), \ + /* ex */ ex, \ + /* ex_size */ LIMBSOF(ex), \ + /* op1_live_size */ LIMBSOF(op1) + 1, \ + /* op2_live_size */ LIMBSOF(op2) + 2, \ + /* res_live_size */ LIMBSOF(ex) + 3, \ + /* check_size */ LIMBSOF(ex), \ + /* extended_limb_value */ (ext), \ + } + +static struct test_case_st test_sub_cases[] = { + SUB_CASE(1, num0, num0, ex_sub_num0_num0, EXTENDED_LIMB_ZERO), + SUB_CASE(2, num0, num1, ex_sub_num0_num1, EXTENDED_LIMB_ZERO), + SUB_CASE(3, num0, num2, ex_sub_num0_num2, EXTENDED_LIMB_ZERO), + SUB_CASE(4, num0, num3, ex_sub_num0_num3, EXTENDED_LIMB_MINUS_ONE), + SUB_CASE(5, num1, num0, ex_sub_num1_num0, EXTENDED_LIMB_MINUS_ONE), + SUB_CASE(6, num1, num1, ex_sub_num1_num1, EXTENDED_LIMB_ZERO), + SUB_CASE(7, num1, num2, ex_sub_num1_num2, EXTENDED_LIMB_MINUS_ONE), + SUB_CASE(8, num1, num3, ex_sub_num1_num3, EXTENDED_LIMB_MINUS_ONE), + SUB_CASE(9, num2, num0, ex_sub_num2_num0, EXTENDED_LIMB_MINUS_ONE), + SUB_CASE(10, num2, num1, ex_sub_num2_num1, EXTENDED_LIMB_ZERO), + SUB_CASE(11, num2, num2, ex_sub_num2_num2, EXTENDED_LIMB_ZERO), + SUB_CASE(12, num2, num3, ex_sub_num2_num3, EXTENDED_LIMB_MINUS_ONE), + SUB_CASE(13, num3, num0, ex_sub_num3_num0, EXTENDED_LIMB_ZERO), + SUB_CASE(14, num3, num1, ex_sub_num3_num1, EXTENDED_LIMB_ZERO), + SUB_CASE(15, num3, num2, ex_sub_num3_num2, EXTENDED_LIMB_ZERO), + SUB_CASE(16, num3, num3, ex_sub_num3_num3, EXTENDED_LIMB_ZERO), +}; + +static int test_sub(int i) +{ + return test_sub_common(test_sub_cases[i]); +} + +#define SUB_TRUNCATED_CASE(i, op1, op2, ex) \ + { \ + /* op1 */ op1, \ + /* op1_size */ LIMBSOF(op1), \ + /* op2 */ op2, \ + /* op2_size */ LIMBSOF(op2), \ + /* ex */ ex, \ + /* ex_size */ LIMBSOF(ex), \ + /* op1_live_size */ LIMBSOF(op1) + 1, \ + /* op2_live_size */ LIMBSOF(op2) + 2, \ + /* res_live_size */ LIMBSOF(ex) - 1, \ + /* check_size */ LIMBSOF(ex) - 1, \ + /* extended_limb_value */ EXTENDED_LIMB_ZERO, \ + } + +static struct test_case_st test_sub_truncated_cases[] = { + SUB_TRUNCATED_CASE(1, num0, num0, ex_sub_num0_num0), + SUB_TRUNCATED_CASE(2, num0, num1, ex_sub_num0_num1), + SUB_TRUNCATED_CASE(3, num0, num2, ex_sub_num0_num2), + SUB_TRUNCATED_CASE(4, num0, num3, ex_sub_num0_num3), + SUB_TRUNCATED_CASE(5, num1, num0, ex_sub_num1_num0), + SUB_TRUNCATED_CASE(6, num1, num1, ex_sub_num1_num1), + SUB_TRUNCATED_CASE(7, num1, num2, ex_sub_num1_num2), + SUB_TRUNCATED_CASE(8, num1, num3, ex_sub_num1_num3), + SUB_TRUNCATED_CASE(9, num2, num0, ex_sub_num2_num0), + SUB_TRUNCATED_CASE(10, num2, num1, ex_sub_num2_num1), + SUB_TRUNCATED_CASE(11, num2, num2, ex_sub_num2_num2), + SUB_TRUNCATED_CASE(12, num2, num3, ex_sub_num2_num3), + SUB_TRUNCATED_CASE(13, num3, num0, ex_sub_num3_num0), + SUB_TRUNCATED_CASE(14, num3, num1, ex_sub_num3_num1), + SUB_TRUNCATED_CASE(15, num3, num2, ex_sub_num3_num2), + SUB_TRUNCATED_CASE(16, num3, num3, ex_sub_num3_num3), +}; + +static int test_sub_truncated(int i) +{ + return test_sub_common(test_sub_truncated_cases[i]); +} + /* A set of expected results, also in OSSL_FN_ULONG array form */ static const OSSL_FN_ULONG ex_mul_num0_num0[] = { OSSL_FN_ULONG64_C(0x00000000, 0x00000001), @@ -493,6 +615,7 @@ static int test_mul_common(struct test_case_st test_case) size_t n2_new_limbs = test_case.op2_live_size; size_t res_limbs = test_case.res_live_size; size_t check_limbs = test_case.check_size; + OSSL_FN_ULONG extended_value = test_case.extended_limb_value; OSSL_FN *fn1 = NULL, *fn2 = NULL, *res = NULL; const OSSL_FN_ULONG *u = NULL; @@ -515,7 +638,8 @@ static int test_mul_common(struct test_case_st test_case) || !TEST_ptr(u = ossl_fn_get_words(res)) || !TEST_mem_eq(u, check_limbs * OSSL_FN_BYTES, ex, check_limbs * OSSL_FN_BYTES) - || !TEST_true(check_zero(res, check_limbs, res_limbs))) + || !TEST_true(check_limbs_value(res, check_limbs, res_limbs, + extended_value))) ret = 0; end: @@ -540,6 +664,7 @@ end: /* op2_live_size */ LIMBSOF(op2) + 2, \ /* res_live_size */ LIMBSOF(op1) + LIMBSOF(op2) + ((i - 1) % 4), \ /* check_size */ LIMBSOF(ex), \ + /* extended_limb_value */ EXTENDED_LIMB_ZERO, \ } static struct test_case_st test_mul_cases[] = { @@ -572,18 +697,19 @@ static int test_mul(int i) } /* i should be set to match the iteration number that's displayed when testing */ -#define MUL_TRUNCATED_CASE(i, op1, op2, ex) \ - { \ - /* op1 */ op1, \ - /* op1_size */ LIMBSOF(op1), \ - /* op2 */ op2, \ - /* op2_size */ LIMBSOF(op2), \ - /* ex */ ex, \ - /* ex_size */ LIMBSOF(ex), \ - /* op1_live_size */ LIMBSOF(op1) + 1, \ - /* op2_live_size */ LIMBSOF(op2) + 2, \ - /* res_live_size */ LIMBSOF(ex) / 2, \ - /* check_size */ LIMBSOF(ex) / 2, \ +#define MUL_TRUNCATED_CASE(i, op1, op2, ex) \ + { \ + /* op1 */ op1, \ + /* op1_size */ LIMBSOF(op1), \ + /* op2 */ op2, \ + /* op2_size */ LIMBSOF(op2), \ + /* ex */ ex, \ + /* ex_size */ LIMBSOF(ex), \ + /* op1_live_size */ LIMBSOF(op1) + 1, \ + /* op2_live_size */ LIMBSOF(op2) + 2, \ + /* res_live_size */ LIMBSOF(ex) / 2, \ + /* check_size */ LIMBSOF(ex) / 2, \ + /* extended_limb_value */ EXTENDED_LIMB_ZERO, \ } /* A special case, where the truncation is set to the size of ex minus 64 bits */ #define MUL_TRUNCATED_SPECIAL_CASE1(i, op1, op2, ex) \ @@ -598,6 +724,7 @@ static int test_mul(int i) /* op2_live_size */ LIMBSOF(op2) + 2, \ /* res_live_size */ LIMBSOF(ex) - 8 / OSSL_FN_BYTES, \ /* check_size */ LIMBSOF(ex) - 8 / OSSL_FN_BYTES, \ + /* extended_limb_value */ EXTENDED_LIMB_ZERO, \ } static struct test_case_st test_mul_truncate_cases[] = { @@ -632,7 +759,9 @@ static int test_mul_truncated(int i) int setup_tests(void) { ADD_ALL_TESTS(test_add, 16); + ADD_ALL_TESTS(test_add_truncated, 16); ADD_ALL_TESTS(test_sub, 16); + ADD_ALL_TESTS(test_sub_truncated, 16); ADD_ALL_TESTS(test_mul_feature_r_is_operand, 4); ADD_ALL_TESTS(test_mul, OSSL_NELEM(test_mul_cases)); ADD_ALL_TESTS(test_mul_truncated, OSSL_NELEM(test_mul_truncate_cases)); From 7e7280f1b2a51f60e6d908a4cc9cea46a8fbb3f2 Mon Sep 17 00:00:00 2001 From: Richard Levitte Date: Wed, 28 Jan 2026 14:38:00 +0100 Subject: [PATCH 21/69] Small fixups of things that somehow passed through our tests Reviewed-by: Matt Caswell Reviewed-by: Tomas Mraz MergeDate: Fri Apr 3 12:32:17 2026 (Merged from https://github.com/openssl/openssl/pull/29819) --- crypto/fn/fn_local.h | 12 ------------ crypto/fn/fn_mul.c | 2 +- test/fn_api_test.c | 14 +++++++------- 3 files changed, 8 insertions(+), 20 deletions(-) diff --git a/crypto/fn/fn_local.h b/crypto/fn/fn_local.h index 0c7893f2b9..e0beca42a4 100644 --- a/crypto/fn/fn_local.h +++ b/crypto/fn/fn_local.h @@ -19,18 +19,6 @@ #include "crypto/fn.h" #include "crypto/fn_intern.h" -#if OSSL_FN_BYTES == 4 -/* 32-bit systems */ -#define OSSL_FN_MASK UINT32_MAX -#elif OSSL_FN_BYTES == 8 -/* 64-bit systems */ -#define OSSL_FN_MASK UINT64_MAX -#else -#error "OpenSSL doesn't support large numbers on this platform" -#endif - -#define OSSL_FN_HIGH_BIT_MASK (OSSL_FN_ULONG_C(1) << (OSSL_FN_BYTES * 8 - 1)) - #if OSSL_FN_BYTES == 4 /* 32-bit systems */ #define OSSL_FN_ULONG_C(n) UINT32_C(n) diff --git a/crypto/fn/fn_mul.c b/crypto/fn/fn_mul.c index 005714afe1..b28a78a708 100644 --- a/crypto/fn/fn_mul.c +++ b/crypto/fn/fn_mul.c @@ -45,7 +45,7 @@ int OSSL_FN_mul(OSSL_FN *r, const OSSL_FN *a, const OSSL_FN *b, OSSL_FN_CTX *ctx if (OSSL_FN_copy(r, rr) == NULL) goto err; -#if defined(BN_MUL_COMBA) || defined(BN_RECURSION) +#ifdef BN_MUL_COMBA end: #endif diff --git a/test/fn_api_test.c b/test/fn_api_test.c index ad0dc2a028..43edadf3a3 100644 --- a/test/fn_api_test.c +++ b/test/fn_api_test.c @@ -163,7 +163,7 @@ static int test_add_common(struct test_case_st test_case) || !TEST_true(ossl_fn_set_words(fn2, n2, n2_limbs)) || !TEST_ptr(res = OSSL_FN_new_limbs(res_limbs)) || !TEST_true(pollute(res, 0, res_limbs))) { - res = 0; + ret = 0; /* There's no way to continue tests in this case */ goto end; } @@ -341,7 +341,7 @@ static int test_sub_common(struct test_case_st test_case) || !TEST_true(ossl_fn_set_words(fn2, n2, n2_limbs)) || !TEST_ptr(res = OSSL_FN_new_limbs(res_limbs)) || !TEST_true(pollute(res, 0, res_limbs))) { - res = 0; + ret = 0; /* There's no way to continue tests in this case */ goto end; } @@ -574,11 +574,11 @@ static int test_mul_feature_r_is_operand(int i) if (res == a) { if (!TEST_mem_eq(u, ex_limbs * OSSL_FN_BYTES, ex_data, ex_limbs * OSSL_FN_BYTES)) - res = 0; + ret = 0; } else { if (!TEST_mem_eq(u, a_limbs * OSSL_FN_BYTES, a_data, a_limbs * OSSL_FN_BYTES)) - res = 0; + ret = 0; } } @@ -586,11 +586,11 @@ static int test_mul_feature_r_is_operand(int i) if (res == b) { if (!TEST_mem_eq(u, ex_limbs * OSSL_FN_BYTES, ex_data, ex_limbs * OSSL_FN_BYTES)) - res = 0; + ret = 0; } else { if (!TEST_mem_eq(u, b_limbs * OSSL_FN_BYTES, b_data, b_limbs * OSSL_FN_BYTES)) - res = 0; + ret = 0; } } @@ -626,7 +626,7 @@ static int test_mul_common(struct test_case_st test_case) || !TEST_true(ossl_fn_set_words(fn1, n1, n1_limbs)) || !TEST_true(ossl_fn_set_words(fn2, n2, n2_limbs)) || !TEST_ptr(res = OSSL_FN_new_limbs(res_limbs))) { - res = 0; + ret = 0; /* There's no way to continue tests in this case */ goto end; } From 929db7822d7e6d61a96ba182e7cadeed883965be Mon Sep 17 00:00:00 2001 From: Richard Levitte Date: Wed, 28 Jan 2026 14:44:46 +0100 Subject: [PATCH 22/69] OSSL_FN: Add the 'sqr' function OSSL_FN_sqr() takes the square of on operand. The result OSSL_FN may be of any size, and if it's smaller than the result of squaring the operand, the result is truncated to that size. This also adds OSSL_FN_sqr() testcases in test/fn_api_test.c Related-to: doc/designs/fixed-size-large-numbers.md Issue: https://github.com/openssl/project/issues/1654 Reviewed-by: Matt Caswell Reviewed-by: Tomas Mraz MergeDate: Fri Apr 3 12:32:20 2026 (Merged from https://github.com/openssl/openssl/pull/29819) --- crypto/fn/build.info | 2 +- crypto/fn/fn_local.h | 2 + crypto/fn/fn_sqr.c | 77 +++++++++++++++ include/crypto/fn.h | 15 +++ test/fn_api_test.c | 224 +++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 319 insertions(+), 1 deletion(-) create mode 100644 crypto/fn/fn_sqr.c diff --git a/crypto/fn/build.info b/crypto/fn/build.info index 599d4f5f68..b836ab4321 100644 --- a/crypto/fn/build.info +++ b/crypto/fn/build.info @@ -2,7 +2,7 @@ $LIBCRYPTO=../../libcrypto $LIBFIPS=../../providers/libfips.a LIBS=$LIBCRYPTO -$COMMON=fn_err.c fn_lib.c fn_ctx.c fn_intern.c fn_addsub.c fn_mul.c +$COMMON=fn_err.c fn_lib.c fn_ctx.c fn_intern.c fn_addsub.c fn_mul.c fn_sqr.c SOURCE[$LIBCRYPTO]=$COMMON SOURCE[$LIBFIPS]=$COMMON diff --git a/crypto/fn/fn_local.h b/crypto/fn/fn_local.h index e0beca42a4..5dc11e1483 100644 --- a/crypto/fn/fn_local.h +++ b/crypto/fn/fn_local.h @@ -31,6 +31,8 @@ #endif #define OSSL_FN_HIGH_BIT_MASK (OSSL_FN_ULONG_C(1) << (OSSL_FN_BYTES * 8 - 1)) +#define OSSL_FN_LOW_HALF_MASK ((OSSL_FN_ULONG_C(1) << (OSSL_FN_BYTES / 2 * 8)) - 1) +#define OSSL_FN_HIGH_HALF_MASK (OSSL_FN_LOW_HALF_MASK << (OSSL_FN_BYTES / 2 * 8)) struct ossl_fn_st { /* Flag: alloced with OSSL_FN_new() or OSSL_FN_secure_new() */ diff --git a/crypto/fn/fn_sqr.c b/crypto/fn/fn_sqr.c new file mode 100644 index 0000000000..78d5ccf49f --- /dev/null +++ b/crypto/fn/fn_sqr.c @@ -0,0 +1,77 @@ +/* + * Copyright 2026 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#include +#include +#include "crypto/cryptlib.h" +#include "crypto/fnerr.h" +#include "../bn/bn_local.h" /* For using the low level bignum functions */ +#include "fn_local.h" + +int OSSL_FN_sqr(OSSL_FN *r, const OSSL_FN *a, OSSL_FN_CTX *ctx) +{ + if (!OSSL_FN_CTX_start(ctx)) + return 0; + + size_t al = (size_t)a->dsize; + size_t rl = (size_t)r->dsize; + size_t max = (size_t)(2 * al); + + int ret = 0; +#ifdef BN_SQR_COMBA + if (al == 4 && rl >= 8) { + bn_sqr_comba4(r->d, a->d); + goto end; + } else if (al == 8 && rl >= 16) { + bn_sqr_comba8(r->d, a->d); + goto end; + } +#endif + + /* rl < max is always true when r == a, so covers that case too */ + OSSL_FN *rr = r; + if (rl < max) + if ((rr = OSSL_FN_CTX_get_limbs(ctx, max)) == NULL) + goto err; + + OSSL_FN *tmp = NULL; + if ((tmp = OSSL_FN_CTX_get_limbs(ctx, max)) == NULL) + goto err; + + if (al != 0) + bn_sqr_normal(rr->d, a->d, (int)al, tmp->d); + + if (rr != r) { + /* + * Because OSSL_FN_copy() expects to make a full copy, but r + * may be smaller than rr, rr's size is modified to truncate. + */ + rr->dsize = r->dsize; + if (OSSL_FN_copy(r, rr) == NULL) + goto err; + } + +#ifdef BN_SQR_COMBA +end: +#endif + + ret = 1; + + /* Zeroise everything above the result, if the r is that large */ + size_t dif = (rl > max) ? rl - max : 0; + OSSL_FN_ULONG *rp = &r->d[max]; + while (dif > 0) { + *rp++ = 0; + dif--; + } + +err: + OSSL_FN_CTX_end(ctx); + return ret; +} diff --git a/include/crypto/fn.h b/include/crypto/fn.h index 8c32f10a12..743a77f310 100644 --- a/include/crypto/fn.h +++ b/include/crypto/fn.h @@ -278,6 +278,21 @@ int OSSL_FN_sub_word(OSSL_FN *a, const OSSL_FN_ULONG *w); int OSSL_FN_mul(OSSL_FN *r, const OSSL_FN *a, const OSSL_FN *b, OSSL_FN_CTX *ctx); +/** + * Calculate the square of one OSSL_FN number. Truncates the result to fit in r. + * + * @param[out] r The OSSL_FN for the result + * @param[in] a The operand + * @param[in] ctx A context to get temporary OSSL_FN + * instances from. + * @returns 1 on success, 0 on error + * + * @note This function currently requires that the OSSL_FN_CTX has free + * space for two temporary OSSL_FNs, a->dsize * 2 limbs each, plus one + * frame (currently 32 bytes). + */ +int OSSL_FN_sqr(OSSL_FN *r, const OSSL_FN *a, OSSL_FN_CTX *ctx); + #ifdef __cplusplus } #endif diff --git a/test/fn_api_test.c b/test/fn_api_test.c index 43edadf3a3..3a992f51a8 100644 --- a/test/fn_api_test.c +++ b/test/fn_api_test.c @@ -73,6 +73,17 @@ static const OSSL_FN_ULONG num6[] = { OSSL_FN_ULONG64_C(0x00000000, 0x00000000), OSSL_FN_ULONG64_C(0x10000000, 0x00000000), }; +static const OSSL_FN_ULONG num7[] = { + OSSL_FN_ULONG64_C(0x00000000, 0x00000000), + OSSL_FN_ULONG64_C(0x00000000, 0x00000000), +#if OSSL_FN_BYTES == 4 + OSSL_FN_ULONG_C(0xffffffff) +#elif OSSL_FN_BYTES == 8 + OSSL_FN_ULONG64_C(0xffffffff, 0xffffffff) +#else +#error "OpenSSL doesn't support large numbers on this platform" +#endif +}; /* * For each test function using predefined numbers, set up an @@ -756,6 +767,216 @@ static int test_mul_truncated(int i) return test_mul_common(test_mul_truncate_cases[i]); } +/* All sqr tests reuse selected mul result numbers (ex_mul_num{n}_num{n}), except one */ +#define ex_sqr_num0 ex_mul_num0_num0 +#define ex_sqr_num1 ex_mul_num1_num1 +#define ex_sqr_num2 ex_mul_num2_num2 +#define ex_sqr_num3 ex_mul_num3_num3 +#define ex_sqr_num4 ex_mul_num4_num4 +#define ex_sqr_num5 ex_mul_num5_num5 +#define ex_sqr_num6 ex_mul_num6_num6 +static const OSSL_FN_ULONG ex_sqr_num7[] = { + OSSL_FN_ULONG64_C(0x00000000, 0x00000000), + OSSL_FN_ULONG64_C(0x00000000, 0x00000000), + OSSL_FN_ULONG64_C(0x00000000, 0x00000000), + OSSL_FN_ULONG64_C(0x00000000, 0x00000000), +#if OSSL_FN_BYTES == 4 + OSSL_FN_ULONG64_C(0xFFFFFFFE, 0x00000001), +#elif OSSL_FN_BYTES == 8 + OSSL_FN_ULONG64_C(0x00000000, 0x00000001), + OSSL_FN_ULONG64_C(0xFFFFFFFF, 0xFFFFFFFE), +#endif +}; + +static int test_sqr_feature_r_is_operand(int i) +{ + int ret = 1; + const OSSL_FN_ULONG *a_data = num0; + size_t a_limbs = sizeof(num0) / OSSL_FN_BYTES; + OSSL_FN *a = NULL, *res = NULL; + + OSSL_FN_CTX *ctx = NULL; + if (!TEST_ptr(ctx = OSSL_FN_CTX_new(NULL, 1, 2, a_limbs * 4)) + || !TEST_ptr(a = OSSL_FN_new_limbs(a_limbs)) + || !TEST_true(ossl_fn_set_words(a, a_data, a_limbs))) { + ret = 0; + /* There's no way to continue tests in this case */ + goto end; + } + + switch (i) { + case 0: + /* a ** 2, result in separate OSSL_FN */ + if (!TEST_ptr(res = OSSL_FN_new_limbs(a_limbs * 2))) { + ret = 0; + goto end; + } + break; + case 1: + /* a ** 2, result in a */ + res = a; + break; + default: + /* Invalid call */ + ret = 0; + goto end; + } + + const OSSL_FN_ULONG *u = NULL; + const OSSL_FN_ULONG *ex_data = ex_mul_num0_num0; + size_t ex_limbs = ossl_fn_get_dsize(res); + + if (!TEST_true(OSSL_FN_sqr(res, a, ctx)) + || !TEST_ptr(u = ossl_fn_get_words(res)) + || !TEST_mem_eq(u, ex_limbs * OSSL_FN_BYTES, + ex_data, ex_limbs * OSSL_FN_BYTES)) + ret = 0; + + if (TEST_ptr(u = ossl_fn_get_words(a))) { + if (res == a) { + if (!TEST_mem_eq(u, ex_limbs * OSSL_FN_BYTES, + ex_data, ex_limbs * OSSL_FN_BYTES)) + ret = 0; + } else { + if (!TEST_mem_eq(u, a_limbs * OSSL_FN_BYTES, + a_data, a_limbs * OSSL_FN_BYTES)) + ret = 0; + } + } + +end: + OSSL_FN_CTX_free(ctx); + if (res != a) + OSSL_FN_free(res); + OSSL_FN_free(a); + return ret; +} + +static int test_sqr_common(struct test_case_st test_case) +{ + int ret = 1; + const OSSL_FN_ULONG *n1 = test_case.op1; + size_t n1_limbs = test_case.op1_size; + const OSSL_FN_ULONG *ex = test_case.ex; + size_t n1_new_limbs = test_case.op1_live_size; + size_t res_limbs = test_case.res_live_size; + size_t check_limbs = test_case.check_size; + OSSL_FN_ULONG extended_value = test_case.extended_limb_value; + OSSL_FN *fn1 = NULL, *res = NULL; + const OSSL_FN_ULONG *u = NULL; + + OSSL_FN_CTX *ctx = NULL; + if (!TEST_ptr(ctx = OSSL_FN_CTX_new(NULL, 1, 2, n1_new_limbs * 4)) + || !TEST_ptr(fn1 = OSSL_FN_new_limbs(n1_new_limbs)) + || !TEST_true(ossl_fn_set_words(fn1, n1, n1_limbs)) + || !TEST_ptr(res = OSSL_FN_new_limbs(res_limbs))) { + ret = 0; + /* There's no way to continue tests in this case */ + goto end; + } + + /* To test that OSSL_FN_sqr() does a complete job, 'res' is pre-polluted */ + + if (!TEST_true(pollute(res, 0, res_limbs)) + || !TEST_true(OSSL_FN_sqr(res, fn1, ctx)) + || !TEST_ptr(u = ossl_fn_get_words(res)) + || !TEST_mem_eq(u, check_limbs * OSSL_FN_BYTES, + ex, check_limbs * OSSL_FN_BYTES) + || !TEST_true(check_limbs_value(res, check_limbs, res_limbs, + extended_value))) + ret = 0; + +end: + OSSL_FN_CTX_free(ctx); + OSSL_FN_free(fn1); + OSSL_FN_free(res); + + return ret; +} + +/* i should be set to match the iteration number that's displayed when testing */ +#define SQR_CASE(i, op1, ex) \ + { \ + /* op1 */ op1, \ + /* op1_size */ LIMBSOF(op1), \ + /* op2 */ NULL, \ + /* op2_size */ 0, \ + /* ex */ ex, \ + /* ex_size */ LIMBSOF(ex), \ + /* op1_live_size */ LIMBSOF(op1) + 1, \ + /* op2_live_size */ 0, \ + /* res_live_size */ LIMBSOF(op1) * 2 + ((i - 1) % 4), \ + /* check_size */ LIMBSOF(ex), \ + /* extended_limb_value */ EXTENDED_LIMB_ZERO, \ + } + +static struct test_case_st test_sqr_cases[] = { + SQR_CASE(1, num0, ex_sqr_num0), + SQR_CASE(2, num1, ex_sqr_num1), + SQR_CASE(3, num2, ex_sqr_num2), + SQR_CASE(4, num3, ex_sqr_num3), + + /* Edge cases */ + SQR_CASE(5, num4, ex_sqr_num4), + SQR_CASE(6, num5, ex_sqr_num5), + SQR_CASE(7, num6, ex_sqr_num6), + SQR_CASE(8, num7, ex_sqr_num7), +}; + +static int test_sqr(int i) +{ + return test_sqr_common(test_sqr_cases[i]); +} + +/* i should be set to match the iteration number that's displayed when testing */ +#define SQR_TRUNCATED_CASE(i, op1, ex) \ + { \ + /* op1 */ op1, \ + /* op1_size */ LIMBSOF(op1), \ + /* op2 */ NULL, \ + /* op2_size */ 0, \ + /* ex */ ex, \ + /* ex_size */ LIMBSOF(ex), \ + /* op1_live_size */ LIMBSOF(op1) + 1, \ + /* op2_live_size */ 0, \ + /* res_live_size */ LIMBSOF(ex) / 2, \ + /* check_size */ LIMBSOF(ex) / 2, \ + /* extended_limb_value */ EXTENDED_LIMB_ZERO, \ + } +/* A special case, where the truncation is set to the size of ex minus 64 bits */ +#define SQR_TRUNCATED_SPECIAL_CASE1(i, op1, ex) \ + { \ + /* op1 */ op1, \ + /* op1_size */ LIMBSOF(op1), \ + /* op2 */ NULL, \ + /* op2_size */ 0, \ + /* ex */ ex, \ + /* ex_size */ LIMBSOF(ex), \ + /* op1_live_size */ LIMBSOF(op1) + 1, \ + /* op2_live_size */ 0, \ + /* res_live_size */ LIMBSOF(ex) - 8 / OSSL_FN_BYTES, \ + /* check_size */ LIMBSOF(ex) - 8 / OSSL_FN_BYTES, \ + /* extended_limb_value */ EXTENDED_LIMB_ZERO, \ + } + +static struct test_case_st test_sqr_truncate_cases[] = { + SQR_TRUNCATED_CASE(1, num0, ex_sqr_num0), + SQR_TRUNCATED_CASE(2, num1, ex_sqr_num1), + SQR_TRUNCATED_CASE(3, num2, ex_sqr_num2), + SQR_TRUNCATED_CASE(4, num3, ex_sqr_num3), + + /* Edge cases */ + SQR_TRUNCATED_CASE(5, num4, ex_sqr_num4), + SQR_TRUNCATED_CASE(6, num5, ex_sqr_num5), + SQR_TRUNCATED_SPECIAL_CASE1(7, num6, ex_sqr_num6), + SQR_TRUNCATED_CASE(7, num7, ex_sqr_num7), +}; + +static int test_sqr_truncated(int i) +{ + return test_sqr_common(test_sqr_truncate_cases[i]); +} + int setup_tests(void) { ADD_ALL_TESTS(test_add, 16); @@ -765,6 +986,9 @@ int setup_tests(void) ADD_ALL_TESTS(test_mul_feature_r_is_operand, 4); ADD_ALL_TESTS(test_mul, OSSL_NELEM(test_mul_cases)); ADD_ALL_TESTS(test_mul_truncated, OSSL_NELEM(test_mul_truncate_cases)); + ADD_ALL_TESTS(test_sqr_feature_r_is_operand, 2); + ADD_ALL_TESTS(test_sqr, OSSL_NELEM(test_sqr_cases)); + ADD_ALL_TESTS(test_sqr_truncated, OSSL_NELEM(test_sqr_truncate_cases)); return 1; } From f52bf9d167086acf9fbda5efe61ae591e8f825ad Mon Sep 17 00:00:00 2001 From: Richard Levitte Date: Wed, 28 Jan 2026 14:49:34 +0100 Subject: [PATCH 23/69] OSSL_FN: Wrap the BIGNUM 'sqr' function around the OSSL_FN 'sqr' function Reviewed-by: Matt Caswell Reviewed-by: Tomas Mraz MergeDate: Fri Apr 3 12:32:22 2026 (Merged from https://github.com/openssl/openssl/pull/29819) --- crypto/bn/bn_sqr.c | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/crypto/bn/bn_sqr.c b/crypto/bn/bn_sqr.c index 1eb9e4c9ab..ba28a0e6cf 100644 --- a/crypto/bn/bn_sqr.c +++ b/crypto/bn/bn_sqr.c @@ -16,11 +16,34 @@ */ int BN_sqr(BIGNUM *r, const BIGNUM *a, BN_CTX *ctx) { - int ret = bn_sqr_fixed_top(r, a, ctx); + /* TODO(FIXNUM): TO BE REMOVED */ + if (r->data == NULL || a->data == NULL) { + int ret = bn_sqr_fixed_top(r, a, ctx); - bn_correct_top(r); + bn_correct_top(r); + bn_check_top(r); + + return ret; + } + + bn_check_top(a); bn_check_top(r); + size_t top = a->top * 2; + size_t max = a->dmax * 2; + + /* + * Unfortunately, OSSL_FN_CTX and BN_CTX are too wildly different to + * be interchangeable. We must therefore create an OSSL_FN_CTX here. + * (OSSL_FN_CTX is only really useful within OSSL_FN functionality) + */ + OSSL_FN_CTX *fnctx = OSSL_FN_CTX_new(NULL, 1, 2, max * 4); + OSSL_FN *rf = bn_acquire_ossl_fn(r, (int)top); + int ret = OSSL_FN_sqr(rf, a->data, fnctx); + bn_release(r, (int)top); + r->neg = 0; + + OSSL_FN_CTX_free(fnctx); return ret; } From 7d5084df86c585c8fee5164b47b3e6d3c51bac2a Mon Sep 17 00:00:00 2001 From: Igor Ustinov Date: Wed, 15 Apr 2026 15:37:58 +0200 Subject: [PATCH 24/69] Added OSSL_FN_truncate() function, which allows to copy a longer number to a shorter one, truncating the high bytes. Reviewed-by: Tomas Mraz Reviewed-by: Richard Levitte MergeDate: Fri Apr 17 14:09:28 2026 (Merged from https://github.com/openssl/openssl/pull/30846) --- crypto/fn/fn_lib.c | 18 ++++++++++++++++++ crypto/fn/fn_sqr.c | 8 +++----- include/crypto/fn.h | 10 ++++++++++ 3 files changed, 31 insertions(+), 5 deletions(-) diff --git a/crypto/fn/fn_lib.c b/crypto/fn/fn_lib.c index 3853b058ea..f85ab683e3 100644 --- a/crypto/fn/fn_lib.c +++ b/crypto/fn/fn_lib.c @@ -127,3 +127,21 @@ OSSL_FN *OSSL_FN_copy(OSSL_FN *a, const OSSL_FN *b) memset(&a->d[a->dsize], 0, sizeof(OSSL_FN_ULONG) * (a->dsize - b->dsize)); return a; } + +OSSL_FN *OSSL_FN_copy_truncate(OSSL_FN *a, const OSSL_FN *b) +{ + if (ossl_unlikely(a == b)) + return a; + + size_t al = a->dsize; + size_t bl = b->dsize; + + if (ossl_unlikely(al > bl)) { + memcpy(a->d, b->d, bl * sizeof(OSSL_FN_ULONG)); + memset(&a->d[bl], 0, sizeof(OSSL_FN_ULONG) * (al - bl)); + } else { + memcpy(a->d, b->d, al * sizeof(OSSL_FN_ULONG)); + } + + return a; +} diff --git a/crypto/fn/fn_sqr.c b/crypto/fn/fn_sqr.c index 78d5ccf49f..ffa68f0fff 100644 --- a/crypto/fn/fn_sqr.c +++ b/crypto/fn/fn_sqr.c @@ -49,12 +49,10 @@ int OSSL_FN_sqr(OSSL_FN *r, const OSSL_FN *a, OSSL_FN_CTX *ctx) if (rr != r) { /* - * Because OSSL_FN_copy() expects to make a full copy, but r - * may be smaller than rr, rr's size is modified to truncate. + * We use OSSL_FN_copy_truncate() here, because OSSL_FN_copy() expects + * to make a full copy, but r may be smaller than rr */ - rr->dsize = r->dsize; - if (OSSL_FN_copy(r, rr) == NULL) - goto err; + OSSL_FN_copy_truncate(r, rr); } #ifdef BN_SQR_COMBA diff --git a/include/crypto/fn.h b/include/crypto/fn.h index 743a77f310..1c9e62c2d2 100644 --- a/include/crypto/fn.h +++ b/include/crypto/fn.h @@ -138,6 +138,16 @@ void OSSL_FN_clear(OSSL_FN *f); */ OSSL_FN *OSSL_FN_copy(OSSL_FN *a, const OSSL_FN *b); +/** + * Copy the contents of one OSSL_FN instance to another, + * normally the shorter one, truncating the high bytes. + * + * @param[out] a The destination OSSL_FN + * @param[in] b The source OSSL_FN + * @returns the destination. + */ +OSSL_FN *OSSL_FN_copy_truncate(OSSL_FN *a, const OSSL_FN *b); + /** * Allocate a new OSSL_FN_CTX, given a set of input numbers. * From 17c4d15971470b42a2a6bb40a5920689903af210 Mon Sep 17 00:00:00 2001 From: Igor Ustinov Date: Wed, 15 Apr 2026 08:28:11 +0200 Subject: [PATCH 25/69] Some bugfixes for OSSL_FN - Fixed the stage 2 exit criteria in OSSL_FN_add() and OSSL_FN_sub(). - Fixed the calculation of a-b when a is shorter than b and borrow==1 after stage 1. - Added sanity check in OSSL_FN_CTX_end(). - Do not set the is_dynamically_allocated flag when getting a new OSSL_FN from OSSL_FN_CTX. - Added units of measurement to the error message in the OSSL_FN_copy() function. - is_dynamically_allocated and is_securely_allocated shouldn't be copied in OSSL_BN_copy(). - Fixed the comment in OSSL_FN_add(). - Added a comment to bn_mul_truncated() that it is a duty of the calling function to zero out the rest of r in case of rn>an+bn. Reviewed-by: Tomas Mraz Reviewed-by: Richard Levitte MergeDate: Fri Apr 17 16:02:44 2026 (Merged from https://github.com/openssl/openssl/pull/30833) --- crypto/bn/bnw_mul.c | 4 ++++ crypto/fn/fn_addsub.c | 10 +++++----- crypto/fn/fn_ctx.c | 3 +-- crypto/fn/fn_lib.c | 11 ++++------- include/crypto/fn.h | 4 +++- test/fn_api_test.c | 41 +++++++++++++++++++++++++++++++++++++---- test/fn_internal_test.c | 4 ++-- 7 files changed, 56 insertions(+), 21 deletions(-) diff --git a/crypto/bn/bnw_mul.c b/crypto/bn/bnw_mul.c index ee9c329aa4..d2f44d8608 100644 --- a/crypto/bn/bnw_mul.c +++ b/crypto/bn/bnw_mul.c @@ -340,6 +340,10 @@ void bn_mul_low_recursive(BN_ULONG *r, const BN_ULONG *a, const BN_ULONG *b, } #endif /* OPENSSL_SMALL_FOOTPRINT */ +/* + * This function doesn't zero out the rest of r in case of nr>na+nb; + * it's the calling function's responsibility to do so. + */ void bn_mul_truncated(BN_ULONG *r, int nr, const BN_ULONG *a, int na, const BN_ULONG *b, int nb) { diff --git a/crypto/fn/fn_addsub.c b/crypto/fn/fn_addsub.c index 53b0530819..85286a5439 100644 --- a/crypto/fn/fn_addsub.c +++ b/crypto/fn/fn_addsub.c @@ -43,8 +43,8 @@ int OSSL_FN_add(OSSL_FN *r, const OSSL_FN *a, const OSSL_FN *b) * in |r|. * * For each stage, |stage_limbs| is used to hold the number - * of limbs being treated in that stage, and |borrow| is - * used to transport the borrow from one stage to the other. + * of limbs being treated in that stage, and |carry| is + * used to transport the carry from one stage to the other. */ size_t stage_limbs; OSSL_FN_ULONG carry; @@ -71,7 +71,7 @@ int OSSL_FN_add(OSSL_FN *r, const OSSL_FN *a, const OSSL_FN *b) *rp = t2; carry &= (t2 == 0); } - if (stage_limbs == rs) + if (stage_limbs == rs - min) return 1; /* Stage 3 */ @@ -139,9 +139,9 @@ int OSSL_FN_sub(OSSL_FN *r, const OSSL_FN *a, const OSSL_FN *b) OSSL_FN_ULONG t3 = (t1 - t2 - borrow) & OSSL_FN_MASK; *rp = t3; - borrow &= (t1 <= t2); + borrow = (t1 < t2 + borrow); } - if (stage_limbs == rs) + if (stage_limbs == rs - min) return 1; /* Stage 3 */ diff --git a/crypto/fn/fn_ctx.c b/crypto/fn/fn_ctx.c index d463cd0774..4dae3ea738 100644 --- a/crypto/fn/fn_ctx.c +++ b/crypto/fn/fn_ctx.c @@ -139,7 +139,7 @@ int OSSL_FN_CTX_start(OSSL_FN_CTX *ctx) int OSSL_FN_CTX_end(OSSL_FN_CTX *ctx) { - if (!ossl_assert(ctx != NULL)) + if (!ossl_assert(ctx != NULL) || !ossl_assert(ctx->last_frame != NULL)) return 0; struct ossl_fn_ctx_frame_st *last_frame = ctx->last_frame; @@ -170,7 +170,6 @@ OSSL_FN *OSSL_FN_CTX_get_limbs(OSSL_FN_CTX *ctx, size_t limbs) memset(fn, 0, totalsize); fn->dsize = (int)limbs; fn->is_securely_allocated = ctx->is_securely_allocated; - fn->is_dynamically_allocated = 1; return fn; } diff --git a/crypto/fn/fn_lib.c b/crypto/fn/fn_lib.c index f85ab683e3..c2c3305a66 100644 --- a/crypto/fn/fn_lib.c +++ b/crypto/fn/fn_lib.c @@ -115,16 +115,13 @@ OSSL_FN *OSSL_FN_copy(OSSL_FN *a, const OSSL_FN *b) if (al < bl) { ERR_raise_data(ERR_LIB_OSSL_FN, OSSL_FN_R_RESULT_ARG_TOO_SMALL, - "Needs to be at least %d, but is only %d", - bl, al); + "Needs to be at least %zu bytes, but is only %zu bytes", + bl * sizeof(OSSL_FN_ULONG), al * sizeof(OSSL_FN_ULONG)); return 0; } - size_t t = ossl_fn_totalsize(bl); - - memcpy(a, b, t); - a->dsize = (int)al; /* Restore to its original size */ - memset(&a->d[a->dsize], 0, sizeof(OSSL_FN_ULONG) * (a->dsize - b->dsize)); + memcpy(a->d, b->d, bl * sizeof(OSSL_FN_ULONG)); + memset(a->d + bl, 0, (al - bl) * sizeof(OSSL_FN_ULONG)); return a; } diff --git a/include/crypto/fn.h b/include/crypto/fn.h index 1c9e62c2d2..8f66a5540c 100644 --- a/include/crypto/fn.h +++ b/include/crypto/fn.h @@ -134,7 +134,7 @@ void OSSL_FN_clear(OSSL_FN *f); * * @param[out] a The destination OSSL_FN * @param[in] b The source OSSL_FN - * @returns 1 on success, 0 on error. + * @returns The destination on success, NULL on error. */ OSSL_FN *OSSL_FN_copy(OSSL_FN *a, const OSSL_FN *b); @@ -162,6 +162,7 @@ OSSL_FN *OSSL_FN_copy_truncate(OSSL_FN *a, const OSSL_FN *b); **/ OSSL_FN_CTX *OSSL_FN_CTX_new(OSSL_LIB_CTX *libctx, size_t max_n_frames, size_t max_n_numbers, size_t max_n_limbs); + /** * Allocate a new OSSL_FN_CTX in secure memory, given a set of input numbers. * Other than allocating in secure memory, this function does exactly the same @@ -169,6 +170,7 @@ OSSL_FN_CTX *OSSL_FN_CTX_new(OSSL_LIB_CTX *libctx, size_t max_n_frames, **/ OSSL_FN_CTX *OSSL_FN_CTX_secure_new(OSSL_LIB_CTX *libctx, size_t max_n_frames, size_t max_n_numbers, size_t max_n_limbs); + /** * Free an OSSL_FN_CTX. * diff --git a/test/fn_api_test.c b/test/fn_api_test.c index 3a992f51a8..d13f3c4cf8 100644 --- a/test/fn_api_test.c +++ b/test/fn_api_test.c @@ -149,6 +149,17 @@ static const OSSL_FN_ULONG ex_add_num3_num3[] = { OSSL_FN_ULONG64_C(0xfdb97530, 0xeca86420), OSSL_FN_ULONG_C(0x1), }; +static const OSSL_FN_ULONG ex_add_num0_num7[] = { + OSSL_FN_ULONG64_C(0x80000000, 0x00000001), + OSSL_FN_ULONG64_C(0x00000000, 0x00000000), +#if OSSL_FN_BYTES == 4 + OSSL_FN_ULONG_C(0xffffffff) +#elif OSSL_FN_BYTES == 8 + OSSL_FN_ULONG64_C(0xffffffff, 0xffffffff) +#else +#error "OpenSSL doesn't support large numbers on this platform" +#endif +}; static int test_add_common(struct test_case_st test_case) { @@ -227,6 +238,7 @@ static struct test_case_st test_add_cases[] = { ADD_CASE(14, num3, num1, ex_add_num1_num3), /* Commutativity check */ ADD_CASE(15, num3, num2, ex_add_num2_num3), /* Commutativity check */ ADD_CASE(16, num3, num3, ex_add_num3_num3), + ADD_CASE(17, num0, num7, ex_add_num0_num7), }; static int test_add(int i) @@ -266,6 +278,7 @@ static struct test_case_st test_add_truncated_cases[] = { ADD_TRUNCATED_CASE(14, num3, num1, ex_add_num1_num3), /* Commutativity check */ ADD_TRUNCATED_CASE(15, num3, num2, ex_add_num2_num3), /* Commutativity check */ ADD_TRUNCATED_CASE(16, num3, num3, ex_add_num3_num3), + ADD_TRUNCATED_CASE(17, num0, num7, ex_add_num0_num7), }; static int test_add_truncated(int i) @@ -327,6 +340,22 @@ static const OSSL_FN_ULONG ex_sub_num3_num2[] = { static const OSSL_FN_ULONG ex_sub_num3_num3[] = { OSSL_FN_ULONG64_C(0x00000000, 0x00000000), }; +static const OSSL_FN_ULONG ex_sub_num0_num7[] = { + OSSL_FN_ULONG64_C(0x80000000, 0x00000001), + OSSL_FN_ULONG64_C(0x00000000, 0x00000000), + OSSL_FN_ULONG_C(0x1), +}; +static const OSSL_FN_ULONG ex_sub_num7_num0[] = { + OSSL_FN_ULONG64_C(0x7fffffff, 0xffffffff), + OSSL_FN_ULONG64_C(0xffffffff, 0xffffffff), +#if OSSL_FN_BYTES == 4 + OSSL_FN_ULONG_C(0xfffffffe) +#elif OSSL_FN_BYTES == 8 + OSSL_FN_ULONG64_C(0xffffffff, 0xfffffffe) +#else +#error "OpenSSL doesn't support large numbers on this platform" +#endif +}; static int test_sub_common(struct test_case_st test_case) { @@ -405,6 +434,8 @@ static struct test_case_st test_sub_cases[] = { SUB_CASE(14, num3, num1, ex_sub_num3_num1, EXTENDED_LIMB_ZERO), SUB_CASE(15, num3, num2, ex_sub_num3_num2, EXTENDED_LIMB_ZERO), SUB_CASE(16, num3, num3, ex_sub_num3_num3, EXTENDED_LIMB_ZERO), + SUB_CASE(17, num0, num7, ex_sub_num0_num7, EXTENDED_LIMB_MINUS_ONE), + SUB_CASE(18, num7, num0, ex_sub_num7_num0, EXTENDED_LIMB_ZERO), }; static int test_sub(int i) @@ -444,6 +475,8 @@ static struct test_case_st test_sub_truncated_cases[] = { SUB_TRUNCATED_CASE(14, num3, num1, ex_sub_num3_num1), SUB_TRUNCATED_CASE(15, num3, num2, ex_sub_num3_num2), SUB_TRUNCATED_CASE(16, num3, num3, ex_sub_num3_num3), + SUB_TRUNCATED_CASE(17, num0, num7, ex_sub_num0_num7), + SUB_TRUNCATED_CASE(18, num7, num0, ex_sub_num7_num0), }; static int test_sub_truncated(int i) @@ -979,10 +1012,10 @@ static int test_sqr_truncated(int i) int setup_tests(void) { - ADD_ALL_TESTS(test_add, 16); - ADD_ALL_TESTS(test_add_truncated, 16); - ADD_ALL_TESTS(test_sub, 16); - ADD_ALL_TESTS(test_sub_truncated, 16); + ADD_ALL_TESTS(test_add, 17); + ADD_ALL_TESTS(test_add_truncated, 17); + ADD_ALL_TESTS(test_sub, 18); + ADD_ALL_TESTS(test_sub_truncated, 18); ADD_ALL_TESTS(test_mul_feature_r_is_operand, 4); ADD_ALL_TESTS(test_mul, OSSL_NELEM(test_mul_cases)); ADD_ALL_TESTS(test_mul_truncated, OSSL_NELEM(test_mul_truncate_cases)); diff --git a/test/fn_internal_test.c b/test/fn_internal_test.c index fb157cdc54..fd16d0df7f 100644 --- a/test/fn_internal_test.c +++ b/test/fn_internal_test.c @@ -117,7 +117,7 @@ static int test_ctx(void) goto end; } if (!TEST_ptr(f = OSSL_FN_CTX_get_bits(ctx, 2048)) - || !TEST_true(ossl_fn_is_dynamically_allocated(f)) + || !TEST_false(ossl_fn_is_dynamically_allocated(f)) || !TEST_false(ossl_fn_is_securely_allocated(f))) ret = 0; if (!TEST_true(OSSL_FN_CTX_end(ctx))) { @@ -188,7 +188,7 @@ static int test_secure_ctx(void) goto end; } if (!TEST_ptr(f = OSSL_FN_CTX_get_bits(ctx, 2048)) - || !TEST_true(ossl_fn_is_dynamically_allocated(f)) + || !TEST_false(ossl_fn_is_dynamically_allocated(f)) || !TEST_true(ossl_fn_is_securely_allocated(f))) ret = 0; if (!TEST_true(OSSL_FN_CTX_end(ctx))) { From f53cc8e2138f7197113495ff3ae7ece5a210d45e Mon Sep 17 00:00:00 2001 From: Igor Ustinov Date: Fri, 17 Apr 2026 18:23:00 +0200 Subject: [PATCH 26/69] Add an ownership token for OSSL_FN_CTX frames This prevents ending a frame that wasn't started by the caller. Reviewed-by: Richard Levitte Reviewed-by: Tomas Mraz MergeDate: Thu Apr 30 09:18:52 2026 (Merged from https://github.com/openssl/openssl/pull/30886) --- crypto/fn/fn_ctx.c | 13 ++++++++----- crypto/fn/fn_mul.c | 8 ++++---- crypto/fn/fn_sqr.c | 5 +++-- include/crypto/fn.h | 13 ++++++++++--- test/fn_internal_test.c | 18 ++++++++++-------- 5 files changed, 35 insertions(+), 22 deletions(-) diff --git a/crypto/fn/fn_ctx.c b/crypto/fn/fn_ctx.c index 4dae3ea738..7cb67f45ad 100644 --- a/crypto/fn/fn_ctx.c +++ b/crypto/fn/fn_ctx.c @@ -112,16 +112,16 @@ void OSSL_FN_CTX_free(OSSL_FN_CTX *ctx) OPENSSL_free(ctx); } -int OSSL_FN_CTX_start(OSSL_FN_CTX *ctx) +const void *OSSL_FN_CTX_start(OSSL_FN_CTX *ctx) { if (!ossl_assert(ctx != NULL)) - return 0; + return NULL; struct ossl_fn_ctx_frame_st *last_frame = ctx->last_frame; size_t used = (last_frame == NULL) ? 0 : last_frame->free_memory - ctx->memory; if (ctx->msize - used < sizeof(struct ossl_fn_ctx_frame_st)) - return 0; + return NULL; if (ctx->last_frame == NULL) ctx->last_frame = (struct ossl_fn_ctx_frame_st *)ctx->memory; @@ -134,16 +134,19 @@ int OSSL_FN_CTX_start(OSSL_FN_CTX *ctx) frame->free_memory = frame->memory; frame->msize = ctx->msize - used - sizeof(*frame); - return 1; + return ctx->last_frame; } -int OSSL_FN_CTX_end(OSSL_FN_CTX *ctx) +int OSSL_FN_CTX_end(OSSL_FN_CTX *ctx, const void *token) { if (!ossl_assert(ctx != NULL) || !ossl_assert(ctx->last_frame != NULL)) return 0; struct ossl_fn_ctx_frame_st *last_frame = ctx->last_frame; + if (last_frame != token) + return 0; + ctx->last_frame = last_frame->previous_frame; return 1; diff --git a/crypto/fn/fn_mul.c b/crypto/fn/fn_mul.c index b28a78a708..8322fe9f35 100644 --- a/crypto/fn/fn_mul.c +++ b/crypto/fn/fn_mul.c @@ -16,13 +16,13 @@ int OSSL_FN_mul(OSSL_FN *r, const OSSL_FN *a, const OSSL_FN *b, OSSL_FN_CTX *ctx) { - if (!OSSL_FN_CTX_start(ctx)) - return 0; - size_t al = (size_t)a->dsize; size_t bl = (size_t)b->dsize; size_t rl = (size_t)r->dsize; size_t max = (size_t)(al + bl); + const void *token = OSSL_FN_CTX_start(ctx); + if (token == NULL) + return 0; int ret = 0; #ifdef BN_MUL_COMBA @@ -60,6 +60,6 @@ end: ret = 1; err: - OSSL_FN_CTX_end(ctx); + OSSL_FN_CTX_end(ctx, token); return ret; } diff --git a/crypto/fn/fn_sqr.c b/crypto/fn/fn_sqr.c index ffa68f0fff..423f49ffff 100644 --- a/crypto/fn/fn_sqr.c +++ b/crypto/fn/fn_sqr.c @@ -16,7 +16,8 @@ int OSSL_FN_sqr(OSSL_FN *r, const OSSL_FN *a, OSSL_FN_CTX *ctx) { - if (!OSSL_FN_CTX_start(ctx)) + const void *token = OSSL_FN_CTX_start(ctx); + if (token == NULL) return 0; size_t al = (size_t)a->dsize; @@ -70,6 +71,6 @@ end: } err: - OSSL_FN_CTX_end(ctx); + OSSL_FN_CTX_end(ctx, token); return ret; } diff --git a/include/crypto/fn.h b/include/crypto/fn.h index 8f66a5540c..5db7ab42cd 100644 --- a/include/crypto/fn.h +++ b/include/crypto/fn.h @@ -184,9 +184,10 @@ void OSSL_FN_CTX_free(OSSL_FN_CTX *ctx); * call this must also clean up with a OSSL_FN_CTX_end() call. * * @param[in] ctx The OSSL_FN_CTX to start the frame in. - * @returns 1 on success, 0 on error. + * @returns Ownership token of the started frame, NULL on error. + * This token must be passed to OSSL_FN_CTX_end(). */ -int OSSL_FN_CTX_start(OSSL_FN_CTX *ctx); +const void *OSSL_FN_CTX_start(OSSL_FN_CTX *ctx); /** * End the last OSSL_FN_CTX frame, resetting back to the previous @@ -194,9 +195,15 @@ int OSSL_FN_CTX_start(OSSL_FN_CTX *ctx); * this function before returning. * * @param[in] ctx The OSSL_FN_CTX to start the frame in. + * @param[in] token Ownership token returned by OSSL_FN_CTX_start(). * @returns 1 on success, 0 on error. + * + * @note The token parameter is validated but not used for choosing a + * frame; only the most recent frame can be ended. Passing an incorrect + * token indicates a programming error and the function will fail. + * If NULL is passed, nothing will be done but the function will return 1. */ -int OSSL_FN_CTX_end(OSSL_FN_CTX *ctx); +int OSSL_FN_CTX_end(OSSL_FN_CTX *ctx, const void *token); /** * Get a suitably sized OSSL_FN from an OSSL_FN_CTX. diff --git a/test/fn_internal_test.c b/test/fn_internal_test.c index fd16d0df7f..4439332890 100644 --- a/test/fn_internal_test.c +++ b/test/fn_internal_test.c @@ -97,6 +97,7 @@ static int test_ctx(void) int ret = 1; OSSL_FN_CTX *ctx = NULL; OSSL_FN *f = NULL; + const void *token = NULL; /* * Make a CTX that is likely to contain two 2048-bit or one 4096-bit OSSL_FN @@ -111,7 +112,7 @@ static int test_ctx(void) } /* Check that we can get 1 2048-bit OSSL_FN instance, and check its metadata */ - if (!TEST_true(OSSL_FN_CTX_start(ctx))) { + if (!TEST_ptr(token = OSSL_FN_CTX_start(ctx))) { ret = 0; /* It's pointless to try more tests after this failure */ goto end; @@ -120,14 +121,14 @@ static int test_ctx(void) || !TEST_false(ossl_fn_is_dynamically_allocated(f)) || !TEST_false(ossl_fn_is_securely_allocated(f))) ret = 0; - if (!TEST_true(OSSL_FN_CTX_end(ctx))) { + if (!TEST_true(OSSL_FN_CTX_end(ctx, token))) { ret = 0; /* It's pointless to try more tests after this failure */ goto end; } /* Check that we can get 2 2048-bit OSSL_FN instances, but not 3 */ - if (!TEST_true(OSSL_FN_CTX_start(ctx))) { + if (!TEST_ptr(token = OSSL_FN_CTX_start(ctx))) { ret = 0; /* It's pointless to try more tests after this failure */ goto end; @@ -136,14 +137,14 @@ static int test_ctx(void) || !TEST_ptr(f = OSSL_FN_CTX_get_bits(ctx, 2048)) || !TEST_ptr_null(f = OSSL_FN_CTX_get_bits(ctx, 2048))) ret = 0; - if (!TEST_true(OSSL_FN_CTX_end(ctx))) { + if (!TEST_true(OSSL_FN_CTX_end(ctx, token))) { ret = 0; /* It's pointless to try more tests after this failure */ goto end; } /* Check that we can get 1 4096-bit OSSL_FN instance, but not 2 */ - if (!TEST_true(OSSL_FN_CTX_start(ctx))) { + if (!TEST_ptr(token = OSSL_FN_CTX_start(ctx))) { ret = 0; /* It's pointless to try more tests after this failure */ goto end; @@ -151,7 +152,7 @@ static int test_ctx(void) if (!TEST_ptr(f = OSSL_FN_CTX_get_bits(ctx, 4096)) || !TEST_ptr_null(f = OSSL_FN_CTX_get_bits(ctx, 2048))) ret = 0; - if (!TEST_true(OSSL_FN_CTX_end(ctx))) { + if (!TEST_true(OSSL_FN_CTX_end(ctx, token))) { ret = 0; /* It's pointless to try more tests after this failure */ goto end; @@ -168,6 +169,7 @@ static int test_secure_ctx(void) int ret = 1; OSSL_FN_CTX *ctx = NULL; OSSL_FN *f = NULL; + const void *token = NULL; /* * Make a CTX that is likely to contain two 2048-bit OSSL_FN and one frame @@ -182,7 +184,7 @@ static int test_secure_ctx(void) } /* Check that we can get 1 2048-bit OSSL_FN instance, and check its metadata */ - if (!TEST_true(OSSL_FN_CTX_start(ctx))) { + if (!TEST_ptr(token = OSSL_FN_CTX_start(ctx))) { ret = 0; /* It's pointless to try more tests after this failure */ goto end; @@ -191,7 +193,7 @@ static int test_secure_ctx(void) || !TEST_false(ossl_fn_is_dynamically_allocated(f)) || !TEST_true(ossl_fn_is_securely_allocated(f))) ret = 0; - if (!TEST_true(OSSL_FN_CTX_end(ctx))) { + if (!TEST_true(OSSL_FN_CTX_end(ctx, token))) { ret = 0; /* It's pointless to try more tests after this failure */ goto end; From 54f13a2ef703de7ba8237cd7e084031b92ff86af Mon Sep 17 00:00:00 2001 From: Richard Levitte Date: Wed, 10 Jun 2026 19:47:18 +0200 Subject: [PATCH 27/69] Use top to size BN add/sub results Size the acquired result OSSL_FN from the significant operand limbs instead of the allocated operand width. This keeps BN_uadd() and BN_usub() consistent with the other wrappers that already use top for result sizing. This follows a realization that applying OSSL_FN semantics onto BIGNUM too much is pointless, and as demonstrated with BN_mul(), may be harmful, especially when the result BIGNUM as the same as one of the operands. Assisted-by: Pi:openai/gpt-5.5 Signed-off-by: Richard Levitte Reviewed-by: Tomas Mraz Reviewed-by: Igor Ustinov MergeDate: Fri Jun 12 15:16:33 2026 (Merged from https://github.com/openssl/openssl/pull/31448) --- crypto/bn/bn_add.c | 25 ++++++++++--------------- 1 file changed, 10 insertions(+), 15 deletions(-) diff --git a/crypto/bn/bn_add.c b/crypto/bn/bn_add.c index 497526cc64..c62ab63521 100644 --- a/crypto/bn/bn_add.c +++ b/crypto/bn/bn_add.c @@ -10,19 +10,14 @@ #include "internal/cryptlib.h" #include "bn_local.h" -static size_t calculate_max_limbs(const BIGNUM *a, const BIGNUM *b) +static size_t calculate_max_top(const BIGNUM *a, const BIGNUM *b) { - OSSL_FN *af = a->data; - OSSL_FN *bf = b->data; - - return (af->dsize > bf->dsize) ? af->dsize : bf->dsize; + return (a->top > b->top) ? a->top : b->top; } static bool is_highest_bit_set(const BIGNUM *a) { - OSSL_FN *af = a->data; - - return (af->d[af->dsize - 1] & OSSL_FN_HIGH_BIT_MASK) != 0; + return a->top > 0 && (a->d[a->top - 1] & OSSL_FN_HIGH_BIT_MASK) != 0; } /* signed add of b to a. */ @@ -147,18 +142,18 @@ int BN_uadd(BIGNUM *r, const BIGNUM *a, const BIGNUM *b) bn_check_top(a); bn_check_top(b); - size_t max = calculate_max_limbs(a, b); + size_t top = calculate_max_top(a, b); /* * If either operands have the highest bit set the result may become * one limb larger. */ if (is_highest_bit_set(a) || is_highest_bit_set(b)) - max++; + top++; - OSSL_FN *rf = bn_acquire_ossl_fn(r, (int)max); + OSSL_FN *rf = bn_acquire_ossl_fn(r, (int)top); int ret = OSSL_FN_add(rf, a->data, b->data); - bn_release(r, (int)max); + bn_release(r, (int)top); return ret; } @@ -226,11 +221,11 @@ int BN_usub(BIGNUM *r, const BIGNUM *a, const BIGNUM *b) return 0; } - size_t max = calculate_max_limbs(a, b); + size_t top = calculate_max_top(a, b); - OSSL_FN *rf = bn_acquire_ossl_fn(r, (int)max); + OSSL_FN *rf = bn_acquire_ossl_fn(r, (int)top); int ret = OSSL_FN_sub(rf, a->data, b->data); - bn_release(r, (int)max); + bn_release(r, (int)top); return ret; } From f03efd47b7421004a0e0407cc890b6c0526e6c3f Mon Sep 17 00:00:00 2001 From: Richard Levitte Date: Wed, 10 Jun 2026 20:00:01 +0200 Subject: [PATCH 28/69] Acquire BN_mul result before ctx sizing Acquire the writable result before reading operand dmax values for the OSSL_FN_CTX arena size. This avoids stale context sizing when the result aliases an operand and acquisition expands that BIGNUM. Assisted-by: Pi:openai/gpt-5.5 Signed-off-by: Richard Levitte Reviewed-by: Tomas Mraz Reviewed-by: Igor Ustinov MergeDate: Fri Jun 12 15:16:34 2026 (Merged from https://github.com/openssl/openssl/pull/31448) --- crypto/bn/bn_mul.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/crypto/bn/bn_mul.c b/crypto/bn/bn_mul.c index d480d48722..42a4ce10cd 100644 --- a/crypto/bn/bn_mul.c +++ b/crypto/bn/bn_mul.c @@ -27,7 +27,14 @@ int BN_mul(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, BN_CTX *ctx) bn_check_top(b); bn_check_top(r); + /* + * Acquiring rf may make r larger. + * If r == a, then a will also become larger. Therefore, max must + * be calculated after rf has been acquired. + */ size_t top = a->top + b->top; + OSSL_FN *rf = bn_acquire_ossl_fn(r, (int)top); + size_t max = a->dmax + b->dmax; /* @@ -36,7 +43,6 @@ int BN_mul(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, BN_CTX *ctx) * (OSSL_FN_CTX is only really useful within OSSL_FN functionality) */ OSSL_FN_CTX *fnctx = OSSL_FN_CTX_new(NULL, 1, 1, max); - OSSL_FN *rf = bn_acquire_ossl_fn(r, (int)top); int ret = OSSL_FN_mul(rf, a->data, b->data, fnctx); bn_release(r, (int)top); From 76f93f270ef770c972a6f383324e800f737462fe Mon Sep 17 00:00:00 2001 From: Richard Levitte Date: Wed, 10 Jun 2026 20:00:43 +0200 Subject: [PATCH 29/69] Acquire BN_sqr result before ctx sizing Acquire the writable result before reading the operand dmax value for the OSSL_FN_CTX arena size. This avoids stale context sizing when the result aliases the operand and acquisition expands that BIGNUM. Assisted-by: Pi:openai/gpt-5.5 Signed-off-by: Richard Levitte Reviewed-by: Tomas Mraz Reviewed-by: Igor Ustinov MergeDate: Fri Jun 12 15:16:36 2026 (Merged from https://github.com/openssl/openssl/pull/31448) --- crypto/bn/bn_sqr.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/crypto/bn/bn_sqr.c b/crypto/bn/bn_sqr.c index ba28a0e6cf..2be5c787f8 100644 --- a/crypto/bn/bn_sqr.c +++ b/crypto/bn/bn_sqr.c @@ -29,7 +29,14 @@ int BN_sqr(BIGNUM *r, const BIGNUM *a, BN_CTX *ctx) bn_check_top(a); bn_check_top(r); + /* + * Acquiring rf may make r larger. + * If r == a, then a will also become larger. Therefore, max must + * be calculated after rf has been acquired. + */ size_t top = a->top * 2; + OSSL_FN *rf = bn_acquire_ossl_fn(r, (int)top); + size_t max = a->dmax * 2; /* @@ -38,7 +45,6 @@ int BN_sqr(BIGNUM *r, const BIGNUM *a, BN_CTX *ctx) * (OSSL_FN_CTX is only really useful within OSSL_FN functionality) */ OSSL_FN_CTX *fnctx = OSSL_FN_CTX_new(NULL, 1, 2, max * 4); - OSSL_FN *rf = bn_acquire_ossl_fn(r, (int)top); int ret = OSSL_FN_sqr(rf, a->data, fnctx); bn_release(r, (int)top); r->neg = 0; From 96609d570ac3bcd874db414759d0122407146bdd Mon Sep 17 00:00:00 2001 From: Richard Levitte Date: Fri, 15 May 2026 07:26:45 +0200 Subject: [PATCH 30/69] Add OSSL_FN_BITS, use it instead of 'OSSL_FN_BYTES * 8' Reviewed-by: Dmitry Belyavskiy Reviewed-by: Igor Ustinov Reviewed-by: Matt Caswell MergeDate: Sun Jun 14 08:35:04 2026 (Merged from https://github.com/openssl/openssl/pull/31452) --- crypto/fn/fn_local.h | 7 ++++--- test/fn_internal_test.c | 4 ++-- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/crypto/fn/fn_local.h b/crypto/fn/fn_local.h index 5dc11e1483..fdc2218ad1 100644 --- a/crypto/fn/fn_local.h +++ b/crypto/fn/fn_local.h @@ -30,9 +30,10 @@ #error "OpenSSL doesn't support large numbers on this platform" #endif -#define OSSL_FN_HIGH_BIT_MASK (OSSL_FN_ULONG_C(1) << (OSSL_FN_BYTES * 8 - 1)) -#define OSSL_FN_LOW_HALF_MASK ((OSSL_FN_ULONG_C(1) << (OSSL_FN_BYTES / 2 * 8)) - 1) -#define OSSL_FN_HIGH_HALF_MASK (OSSL_FN_LOW_HALF_MASK << (OSSL_FN_BYTES / 2 * 8)) +#define OSSL_FN_BITS (OSSL_FN_BYTES * 8) +#define OSSL_FN_HIGH_BIT_MASK (OSSL_FN_ULONG_C(1) << (OSSL_FN_BITS - 1)) +#define OSSL_FN_LOW_HALF_MASK ((OSSL_FN_ULONG_C(1) << (OSSL_FN_BITS / 2)) - 1) +#define OSSL_FN_HIGH_HALF_MASK (OSSL_FN_LOW_HALF_MASK << (OSSL_FN_BITS / 2)) struct ossl_fn_st { /* Flag: alloced with OSSL_FN_new() or OSSL_FN_secure_new() */ diff --git a/test/fn_internal_test.c b/test/fn_internal_test.c index 4439332890..fd31b31654 100644 --- a/test/fn_internal_test.c +++ b/test/fn_internal_test.c @@ -105,7 +105,7 @@ static int test_ctx(void) * Note that OSSL_FN_CTX_new() takes a size in bytes, so we must ensure that * we get that number right. */ - if (!TEST_ptr(ctx = OSSL_FN_CTX_new(NULL, 1, 2, 4096 / 8 / OSSL_FN_BYTES))) { + if (!TEST_ptr(ctx = OSSL_FN_CTX_new(NULL, 1, 2, 4096 / OSSL_FN_BITS))) { ret = 0; /* It's pointless to try more tests after this failure */ goto end; @@ -177,7 +177,7 @@ static int test_secure_ctx(void) * Note that OSSL_FN_CTX_new() takes a size in bytes, so we must ensure that * we get that number right. */ - if (!TEST_ptr(ctx = OSSL_FN_CTX_secure_new(NULL, 1, 2, 2048 / 8 / OSSL_FN_BYTES))) { + if (!TEST_ptr(ctx = OSSL_FN_CTX_secure_new(NULL, 1, 2, 2048 / OSSL_FN_BITS))) { ret = 0; /* It's pointless to try more tests after this failure */ goto end; From 277448082dd25df80e86ca3197c684067d00ce9a Mon Sep 17 00:00:00 2001 From: Richard Levitte Date: Thu, 11 Jun 2026 10:44:26 +0200 Subject: [PATCH 31/69] Document OSSL_FN_copy zero-padding of oversized destination limbs The OSSL_FN_copy() function already zeroes any high destination limbs beyond the source size, but this was not stated in the public header. Add an explicit note so callers know unused high bytes are cleared. Assisted-by: Pi:moonshotai/kimi-k2.6 Signed-off-by: Richard Levitte Reviewed-by: Dmitry Belyavskiy Reviewed-by: Igor Ustinov Reviewed-by: Matt Caswell MergeDate: Sun Jun 14 08:35:06 2026 (Merged from https://github.com/openssl/openssl/pull/31452) --- include/crypto/fn.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/include/crypto/fn.h b/include/crypto/fn.h index 5db7ab42cd..49d2a766e0 100644 --- a/include/crypto/fn.h +++ b/include/crypto/fn.h @@ -135,6 +135,9 @@ void OSSL_FN_clear(OSSL_FN *f); * @param[out] a The destination OSSL_FN * @param[in] b The source OSSL_FN * @returns The destination on success, NULL on error. + * + * @note The destination must be at least as large as the source. + * Any limbs beyond the source size are zeroed. */ OSSL_FN *OSSL_FN_copy(OSSL_FN *a, const OSSL_FN *b); From e77ef334283482f926dad9b73b6fbdc161c565aa Mon Sep 17 00:00:00 2001 From: Richard Levitte Date: Tue, 9 Jun 2026 14:27:58 +0200 Subject: [PATCH 32/69] Add OSSL_FN_CTX_peak_usage() for arena usage instrumentation Track the maximum number of frames, numbers and limbs ever consumed from an OSSL_FN_CTX arena during its lifetime. This allows callers to empirically size their contexts instead of predicting precise max_n_frames / max_n_numbers / max_n_limbs ahead of time. These peak usages are updated whenever a frame is started or an OSSL_FN is obtained. They never decrease, reflecting the worst-case simultaneous allocation across all nested frames. Assisted-by: Pi:moonshotai/kimi-k2.6 Signed-off-by: Richard Levitte Reviewed-by: Igor Ustinov Reviewed-by: Tomas Mraz MergeDate: Sun Jun 14 08:40:38 2026 (Merged from https://github.com/openssl/openssl/pull/31431) --- crypto/fn/fn_ctx.c | 58 +++++++++++++++++++++++++++++++++++++++++++++ include/crypto/fn.h | 17 +++++++++++++ 2 files changed, 75 insertions(+) diff --git a/crypto/fn/fn_ctx.c b/crypto/fn/fn_ctx.c index 7cb67f45ad..c12c97ce50 100644 --- a/crypto/fn/fn_ctx.c +++ b/crypto/fn/fn_ctx.c @@ -37,6 +37,20 @@ struct ossl_fn_ctx_st { */ unsigned int is_securely_allocated : 1; + /* + * Current and peak usage tracking, by allocation components. + * The |n_*| fields hold the currently active counts; the |peak_n_*| + * fields hold the maximum each count has ever reached simultaneously. + * This allows callers to determine suitable arena parameters for a + * given workload without precise up-front prediction. + */ + size_t n_frames; + size_t n_numbers; + size_t n_limbs; + size_t peak_n_frames; + size_t peak_n_numbers; + size_t peak_n_limbs; + /* * The arena itself. */ @@ -55,6 +69,12 @@ struct ossl_fn_ctx_frame_st { * to do its job. */ struct ossl_fn_ctx_frame_st *previous_frame; + /* + * Tracking for peak usage instrumentation. These count the OSSL_FN + * instances and total limbs allocated within this frame. + */ + size_t n_numbers; + size_t n_limbs; /* * Every time OSSL_FN_CTX_get() is called, the current value of * |free_memory| is returned, and it's updated by incrementing it @@ -99,6 +119,26 @@ OSSL_FN_CTX *OSSL_FN_CTX_secure_new(OSSL_LIB_CTX *libctx, size_t max_n_frames, return ctx; } +void OSSL_FN_CTX_peak_usage(const OSSL_FN_CTX *ctx, size_t *peak_n_frames, + size_t *peak_n_numbers, size_t *peak_n_limbs) +{ + if (ctx == NULL) { + if (peak_n_frames != NULL) + *peak_n_frames = 0; + if (peak_n_numbers != NULL) + *peak_n_numbers = 0; + if (peak_n_limbs != NULL) + *peak_n_limbs = 0; + return; + } + if (peak_n_frames != NULL) + *peak_n_frames = ctx->peak_n_frames; + if (peak_n_numbers != NULL) + *peak_n_numbers = ctx->peak_n_numbers; + if (peak_n_limbs != NULL) + *peak_n_limbs = ctx->peak_n_limbs; +} + void OSSL_FN_CTX_free(OSSL_FN_CTX *ctx) { if (ctx == NULL) @@ -133,6 +173,12 @@ const void *OSSL_FN_CTX_start(OSSL_FN_CTX *ctx) frame->previous_frame = last_frame; frame->free_memory = frame->memory; frame->msize = ctx->msize - used - sizeof(*frame); + frame->n_numbers = 0; + frame->n_limbs = 0; + + ctx->n_frames++; + if (ctx->n_frames > ctx->peak_n_frames) + ctx->peak_n_frames = ctx->n_frames; return ctx->last_frame; } @@ -147,6 +193,9 @@ int OSSL_FN_CTX_end(OSSL_FN_CTX *ctx, const void *token) if (last_frame != token) return 0; + ctx->n_numbers -= last_frame->n_numbers; + ctx->n_limbs -= last_frame->n_limbs; + ctx->n_frames--; ctx->last_frame = last_frame->previous_frame; return 1; @@ -169,6 +218,15 @@ OSSL_FN *OSSL_FN_CTX_get_limbs(OSSL_FN_CTX *ctx, size_t limbs) OSSL_FN *fn = (OSSL_FN *)frame->free_memory; frame->free_memory += totalsize; + frame->n_numbers++; + frame->n_limbs += limbs; + + ctx->n_numbers++; + ctx->n_limbs += limbs; + if (ctx->n_numbers > ctx->peak_n_numbers) + ctx->peak_n_numbers = ctx->n_numbers; + if (ctx->n_limbs > ctx->peak_n_limbs) + ctx->peak_n_limbs = ctx->n_limbs; memset(fn, 0, totalsize); fn->dsize = (int)limbs; diff --git a/include/crypto/fn.h b/include/crypto/fn.h index 49d2a766e0..36f0f7430b 100644 --- a/include/crypto/fn.h +++ b/include/crypto/fn.h @@ -174,6 +174,23 @@ OSSL_FN_CTX *OSSL_FN_CTX_new(OSSL_LIB_CTX *libctx, size_t max_n_frames, OSSL_FN_CTX *OSSL_FN_CTX_secure_new(OSSL_LIB_CTX *libctx, size_t max_n_frames, size_t max_n_numbers, size_t max_n_limbs); +/** + * Report the peak number of frames, numbers, and limbs that were + * simultaneously active during the lifetime of the OSSL_FN_CTX. + * This can be used to determine suitable arena parameters for a + * given workload. + * + * @param[in] ctx The OSSL_FN_CTX to query. This may be NULL. + * @param[out] peak_n_frames Peak number of simultaneously active frames + * @param[out] peak_n_numbers Peak number of simultaneously active OSSL_FNs + * @param[out] peak_n_limbs Peak total limbs across all active OSSL_FNs + * + * Any of the out parameters may be NULL. If ctx is NULL, all out + * parameters that are non-NULL are set to 0. + */ +void OSSL_FN_CTX_peak_usage(const OSSL_FN_CTX *ctx, size_t *peak_n_frames, + size_t *peak_n_numbers, size_t *peak_n_limbs); + /** * Free an OSSL_FN_CTX. * From 3a5594d70e55c3009e82329b509261ffc880e060 Mon Sep 17 00:00:00 2001 From: Richard Levitte Date: Tue, 9 Jun 2026 14:28:08 +0200 Subject: [PATCH 33/69] Add test for OSSL_FN_CTX_peak_usage Verify that peak_usage starts at zero, rises after frame start and allocation, and never decreases after a frame is ended. Also correct misleading comments that claimed OSSL_FN_CTX_new() takes a size in bytes -- the last parameter is actually max_n_limbs. Assisted-by: Pi:moonshotai/kimi-k2.6 Signed-off-by: Richard Levitte Reviewed-by: Igor Ustinov Reviewed-by: Tomas Mraz MergeDate: Sun Jun 14 08:40:40 2026 (Merged from https://github.com/openssl/openssl/pull/31431) --- test/fn_internal_test.c | 141 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 137 insertions(+), 4 deletions(-) diff --git a/test/fn_internal_test.c b/test/fn_internal_test.c index fd31b31654..a08a9fe1c5 100644 --- a/test/fn_internal_test.c +++ b/test/fn_internal_test.c @@ -102,8 +102,8 @@ static int test_ctx(void) /* * Make a CTX that is likely to contain two 2048-bit or one 4096-bit OSSL_FN * and one frame (let's overestimate its size to 128 bytes). - * Note that OSSL_FN_CTX_new() takes a size in bytes, so we must ensure that - * we get that number right. + * Note that OSSL_FN_CTX_new() takes a maximum number of limbs in the last + * parameter, so we must ensure that we get that number right. */ if (!TEST_ptr(ctx = OSSL_FN_CTX_new(NULL, 1, 2, 4096 / OSSL_FN_BITS))) { ret = 0; @@ -174,8 +174,8 @@ static int test_secure_ctx(void) /* * Make a CTX that is likely to contain two 2048-bit OSSL_FN and one frame * (let's overestimate its size to 128 bytes). - * Note that OSSL_FN_CTX_new() takes a size in bytes, so we must ensure that - * we get that number right. + * Note that OSSL_FN_CTX_new() takes a maximum number of limbs in the last + * parameter, so we must ensure that we get that number right. */ if (!TEST_ptr(ctx = OSSL_FN_CTX_secure_new(NULL, 1, 2, 2048 / OSSL_FN_BITS))) { ret = 0; @@ -205,6 +205,138 @@ end: return ret; } +static int test_ctx_peak_used(void) +{ + int ret = 1; + OSSL_FN_CTX *ctx = NULL; + OSSL_FN *f = NULL; + const void *token1 = NULL; + const void *token2 = NULL; + size_t frames, numbers, limbs; + size_t limbs_2048 = 2048 / 8 / OSSL_FN_BYTES; + size_t limbs_4096 = 4096 / 8 / OSSL_FN_BYTES; + + if (!TEST_ptr(ctx = OSSL_FN_CTX_new(NULL, 2, 4, 256))) { + ret = 0; + goto end; + } + + /* + * Fresh context. + */ + OSSL_FN_CTX_peak_usage(ctx, &frames, &numbers, &limbs); + if (!TEST_size_t_eq(frames, 0) + || !TEST_size_t_eq(numbers, 0) + || !TEST_size_t_eq(limbs, 0)) + ret = 0; + + /* + * NULL context: all out parameters set to 0. + */ + OSSL_FN_CTX_peak_usage(NULL, &frames, &numbers, &limbs); + if (!TEST_size_t_eq(frames, 0) + || !TEST_size_t_eq(numbers, 0) + || !TEST_size_t_eq(limbs, 0)) + ret = 0; + + /* + * NULL out parameters are tolerated. + */ + OSSL_FN_CTX_peak_usage(ctx, NULL, NULL, NULL); + + /* + * Start frame 1. + */ + if (!TEST_ptr(token1 = OSSL_FN_CTX_start(ctx))) { + ret = 0; + goto end; + } + OSSL_FN_CTX_peak_usage(ctx, &frames, &numbers, &limbs); + if (!TEST_size_t_eq(frames, 1) + || !TEST_size_t_eq(numbers, 0) + || !TEST_size_t_eq(limbs, 0)) + ret = 0; + + /* + * Allocate one number in frame 1. + */ + if (!TEST_ptr(f = OSSL_FN_CTX_get_bits(ctx, 2048))) + ret = 0; + OSSL_FN_CTX_peak_usage(ctx, &frames, &numbers, &limbs); + if (!TEST_size_t_eq(frames, 1) + || !TEST_size_t_eq(numbers, 1) + || !TEST_size_t_eq(limbs, limbs_2048)) + ret = 0; + + /* + * Start frame 2 (nested inside frame 1). + */ + if (!TEST_ptr(token2 = OSSL_FN_CTX_start(ctx))) { + ret = 0; + goto end; + } + OSSL_FN_CTX_peak_usage(ctx, &frames, &numbers, &limbs); + if (!TEST_size_t_eq(frames, 2) + || !TEST_size_t_eq(numbers, 1) + || !TEST_size_t_eq(limbs, limbs_2048)) + ret = 0; + + /* + * Allocate one number in frame 2. + */ + if (!TEST_ptr(f = OSSL_FN_CTX_get_bits(ctx, 4096))) + ret = 0; + OSSL_FN_CTX_peak_usage(ctx, &frames, &numbers, &limbs); + if (!TEST_size_t_eq(frames, 2) + || !TEST_size_t_eq(numbers, 2) + || !TEST_size_t_eq(limbs, limbs_2048 + limbs_4096)) + ret = 0; + + /* + * Allocate a second number in frame 2. + */ + if (!TEST_ptr(f = OSSL_FN_CTX_get_bits(ctx, 2048))) + ret = 0; + OSSL_FN_CTX_peak_usage(ctx, &frames, &numbers, &limbs); + if (!TEST_size_t_eq(frames, 2) + || !TEST_size_t_eq(numbers, 3) + || !TEST_size_t_eq(limbs, limbs_2048 + limbs_4096 + limbs_2048)) + ret = 0; + + if (!TEST_true(OSSL_FN_CTX_end(ctx, token2))) { + ret = 0; + goto end; + } + + /* + * After ending frame 2: peaks must not decrease. + */ + OSSL_FN_CTX_peak_usage(ctx, &frames, &numbers, &limbs); + if (!TEST_size_t_eq(frames, 2) + || !TEST_size_t_eq(numbers, 3) + || !TEST_size_t_eq(limbs, limbs_2048 + limbs_4096 + limbs_2048)) + ret = 0; + + if (!TEST_true(OSSL_FN_CTX_end(ctx, token1))) { + ret = 0; + goto end; + } + + /* + * After ending frame 1: peaks still preserved. + */ + OSSL_FN_CTX_peak_usage(ctx, &frames, &numbers, &limbs); + if (!TEST_size_t_eq(frames, 2) + || !TEST_size_t_eq(numbers, 3) + || !TEST_size_t_eq(limbs, limbs_2048 + limbs_4096 + limbs_2048)) + ret = 0; + +end: + OSSL_FN_CTX_free(ctx); + + return ret; +} + int setup_tests(void) { ADD_TEST(test_struct); @@ -212,6 +344,7 @@ int setup_tests(void) ADD_TEST(test_secure_alloc); ADD_TEST(test_ctx); ADD_TEST(test_secure_ctx); + ADD_TEST(test_ctx_peak_used); return 1; } From 5678648723973482d09c5efd87f1f10c4def1319 Mon Sep 17 00:00:00 2001 From: Richard Levitte Date: Tue, 9 Jun 2026 15:06:55 +0200 Subject: [PATCH 34/69] Expose OSSL_FN_CTX internals via fn_local.h Move struct ossl_fn_ctx_st and struct ossl_fn_ctx_frame_st from fn_ctx.c to fn_local.h, making them accessible to internal code in the bn/ directory and elsewhere. Also expose ossl_fn_ctx_calculate_arena_size() as an inline helper so callers can determine the required arena size without duplicating the formula. This is groundwork for BN_CTX integration. Assisted-by: Pi:moonshotai/kimi-k2.6 Signed-off-by: Richard Levitte Reviewed-by: Igor Ustinov Reviewed-by: Tomas Mraz MergeDate: Sun Jun 14 08:40:42 2026 (Merged from https://github.com/openssl/openssl/pull/31431) --- crypto/fn/fn_ctx.c | 73 ++----------------------------------------- crypto/fn/fn_local.h | 74 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 76 insertions(+), 71 deletions(-) diff --git a/crypto/fn/fn_ctx.c b/crypto/fn/fn_ctx.c index c12c97ce50..42cc9172ea 100644 --- a/crypto/fn/fn_ctx.c +++ b/crypto/fn/fn_ctx.c @@ -24,79 +24,10 @@ * it when it's done. */ -struct ossl_fn_ctx_st { - /* - * Pointer to the last OSSL_FN_CTX_start() location (a simple pointer into - * the memory area). See the struct ossl_fn_ctx_frame_st definition below - * for details. - */ - struct ossl_fn_ctx_frame_st *last_frame; - - /* - * Flags - */ - unsigned int is_securely_allocated : 1; - - /* - * Current and peak usage tracking, by allocation components. - * The |n_*| fields hold the currently active counts; the |peak_n_*| - * fields hold the maximum each count has ever reached simultaneously. - * This allows callers to determine suitable arena parameters for a - * given workload without precise up-front prediction. - */ - size_t n_frames; - size_t n_numbers; - size_t n_limbs; - size_t peak_n_frames; - size_t peak_n_numbers; - size_t peak_n_limbs; - - /* - * The arena itself. - */ - size_t msize; /* Size of the arena, in bytes */ - unsigned char memory[]; -}; - -struct ossl_fn_ctx_frame_st { - /* - * Pointer back to the whole arena where the frame is located, - * for |last_frame| bookkeeping. - */ - struct ossl_fn_ctx_st *arena; - /* - * Pointer to the previous frame in the arena, allowing OSSL_FN_CTX_end() - * to do its job. - */ - struct ossl_fn_ctx_frame_st *previous_frame; - /* - * Tracking for peak usage instrumentation. These count the OSSL_FN - * instances and total limbs allocated within this frame. - */ - size_t n_numbers; - size_t n_limbs; - /* - * Every time OSSL_FN_CTX_get() is called, the current value of - * |free_memory| is returned, and it's updated by incrementing it - * by the number of bytes given by OSSL_FN_CTX_get(). - * The available number of bytes is limited by what's left in the arena. - */ - unsigned char *free_memory; /* Pointer to the free area of the frame */ - size_t msize; /* Size of the frame, in bytes */ - unsigned char memory[]; -}; - -static size_t calculate_arena_size(size_t max_n_frames, size_t max_n_numbers, size_t max_n_limbs) -{ - return max_n_frames * sizeof(struct ossl_fn_ctx_frame_st) - + max_n_numbers * sizeof(OSSL_FN) - + max_n_limbs * OSSL_FN_BYTES; -} - OSSL_FN_CTX *OSSL_FN_CTX_new(OSSL_LIB_CTX *libctx, size_t max_n_frames, size_t max_n_numbers, size_t max_n_limbs) { - size_t arena_size = calculate_arena_size(max_n_frames, max_n_numbers, max_n_limbs); + size_t arena_size = ossl_fn_ctx_calculate_arena_size(max_n_frames, max_n_numbers, max_n_limbs); OSSL_FN_CTX *ctx = OPENSSL_zalloc(sizeof(OSSL_FN_CTX) + arena_size); if (ctx != NULL) @@ -108,7 +39,7 @@ OSSL_FN_CTX *OSSL_FN_CTX_new(OSSL_LIB_CTX *libctx, size_t max_n_frames, OSSL_FN_CTX *OSSL_FN_CTX_secure_new(OSSL_LIB_CTX *libctx, size_t max_n_frames, size_t max_n_numbers, size_t max_n_limbs) { - size_t arena_size = calculate_arena_size(max_n_frames, max_n_numbers, max_n_limbs); + size_t arena_size = ossl_fn_ctx_calculate_arena_size(max_n_frames, max_n_numbers, max_n_limbs); OSSL_FN_CTX *ctx = OPENSSL_secure_zalloc(sizeof(OSSL_FN_CTX) + arena_size); if (ctx != NULL) { diff --git a/crypto/fn/fn_local.h b/crypto/fn/fn_local.h index fdc2218ad1..0dace59729 100644 --- a/crypto/fn/fn_local.h +++ b/crypto/fn/fn_local.h @@ -113,4 +113,78 @@ static ossl_inline OSSL_FN *ossl_fn_copy_internal(OSSL_FN *dest, return dest; } +/* OSSL_FN_CTX internals */ + +struct ossl_fn_ctx_st { + /* + * Pointer to the last OSSL_FN_CTX_start() location (a simple pointer into + * the memory area). See the struct ossl_fn_ctx_frame_st definition below + * for details. + */ + struct ossl_fn_ctx_frame_st *last_frame; + + /* + * Flags + */ + unsigned int is_securely_allocated : 1; + + /* + * Current and peak usage tracking, by allocation components. + * The |n_*| fields hold the currently active counts; the |peak_n_*| + * fields hold the maximum each count has ever reached simultaneously. + * This allows callers to determine suitable arena parameters for a + * given workload without precise up-front prediction. + */ + size_t n_frames; + size_t n_numbers; + size_t n_limbs; + size_t peak_n_frames; + size_t peak_n_numbers; + size_t peak_n_limbs; + + /* + * The arena itself. + */ + size_t msize; /* Size of the arena, in bytes */ + unsigned char memory[]; +}; + +struct ossl_fn_ctx_frame_st { + /* + * Pointer back to the whole arena where the frame is located, + * for |last_frame| bookkeeping. + */ + struct ossl_fn_ctx_st *arena; + /* + * Pointer to the previous frame in the arena, allowing OSSL_FN_CTX_end() + * to do its job. + */ + struct ossl_fn_ctx_frame_st *previous_frame; + /* + * Tracking for peak usage instrumentation. These count the OSSL_FN + * instances and total limbs allocated within this frame. + */ + size_t n_numbers; + size_t n_limbs; + /* + * Every time OSSL_FN_CTX_get() is called, the current value of + * |free_memory| is returned, and it's updated by incrementing it + * by the number of bytes given by OSSL_FN_CTX_get(). + * The available number of bytes is limited by what's left in the arena. + */ + unsigned char *free_memory; /* Pointer to the free area of the frame */ + size_t msize; /* Size of the frame, in bytes */ + unsigned char memory[]; +}; + +static ossl_inline size_t ossl_fn_ctx_calculate_arena_size(size_t max_n_frames, + size_t max_n_numbers, size_t max_n_limbs) +{ + return max_n_frames * sizeof(struct ossl_fn_ctx_frame_st) + + max_n_numbers * sizeof(OSSL_FN) + + max_n_limbs * OSSL_FN_BYTES; +} + +/* end OSSL_FN_CTX internals */ + #endif From 0e8b647fdbe320c2ec15f2b764b66755bde2a8a0 Mon Sep 17 00:00:00 2001 From: Richard Levitte Date: Tue, 9 Jun 2026 15:12:18 +0200 Subject: [PATCH 35/69] Add OSSL_FN_CTX integration with BN_CTX Add an OSSL_FN_CTX * pointer to struct bignum_ctx, allowing a BN_CTX to cache an OSSL_FN_CTX for use by BIGNUM wrapper functions. The pointer is freed automatically when BN_CTX_free() is called. Also add bn_ctx_acquire_ossl_fn_ctx() and bn_ctx_release_ossl_fn_ctx(): - acquire creates (or reuses if large enough) an OSSL_FN_CTX inside the BN_CTX, sizing it according to the caller's needs. - release checks that no frames remain in the cached OSSL_FN_CTX. The acquire function respects BN_FLG_SECURE: if the BN_CTX was created with BN_CTX_secure_new(), the OSSL_FN_CTX is also allocated in secure memory. Assisted-by: Pi:moonshotai/kimi-k2.6 Signed-off-by: Richard Levitte Reviewed-by: Igor Ustinov Reviewed-by: Tomas Mraz MergeDate: Sun Jun 14 08:40:44 2026 (Merged from https://github.com/openssl/openssl/pull/31431) --- crypto/bn/bn_ctx.c | 46 +++++++++++++++++++++ include/crypto/bn.h | 9 +++++ test/bn_internal_test.c | 88 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 143 insertions(+) diff --git a/crypto/bn/bn_ctx.c b/crypto/bn/bn_ctx.c index 201b356561..785c3cb413 100644 --- a/crypto/bn/bn_ctx.c +++ b/crypto/bn/bn_ctx.c @@ -75,6 +75,8 @@ struct bignum_ctx { int flags; /* The library context */ OSSL_LIB_CTX *libctx; + /* OSSL_FN_CTX for OSSL_FN wrapper functions */ + OSSL_FN_CTX *fn_ctx; }; #ifndef FIPS_MODULE @@ -179,6 +181,7 @@ void BN_CTX_free(BN_CTX *ctx) #endif BN_STACK_finish(&ctx->stack); BN_POOL_finish(&ctx->pool); + OSSL_FN_CTX_free(ctx->fn_ctx); OPENSSL_free(ctx); } @@ -240,6 +243,49 @@ BIGNUM *BN_CTX_get(BN_CTX *ctx) return ret; } +OSSL_FN_CTX *bn_ctx_acquire_ossl_fn_ctx(BN_CTX *ctx, size_t max_n_frames, + size_t max_n_numbers, size_t max_n_limbs) +{ + size_t needed; + + if (ctx == NULL) + return NULL; + + needed = ossl_fn_ctx_calculate_arena_size(max_n_frames, max_n_numbers, + max_n_limbs); + + if (ctx->fn_ctx != NULL) { + if (ctx->fn_ctx->msize >= needed) { + /* + * Existing context is large enough. Ensure no frames are + * outstanding (callers are expected to have ended them). + */ + assert(ctx->fn_ctx->last_frame == NULL); + return ctx->fn_ctx; + } + /* Too small, free and recreate */ + OSSL_FN_CTX_free(ctx->fn_ctx); + ctx->fn_ctx = NULL; + } + + if (ctx->flags & BN_FLG_SECURE) + ctx->fn_ctx = OSSL_FN_CTX_secure_new(ctx->libctx, max_n_frames, + max_n_numbers, max_n_limbs); + else + ctx->fn_ctx = OSSL_FN_CTX_new(ctx->libctx, max_n_frames, + max_n_numbers, max_n_limbs); + + return ctx->fn_ctx; +} + +void bn_ctx_release_ossl_fn_ctx(BN_CTX *ctx) +{ + if (ctx == NULL || ctx->fn_ctx == NULL) + return; + + assert(ctx->fn_ctx->last_frame == NULL); +} + OSSL_LIB_CTX *ossl_bn_get_libctx(BN_CTX *ctx) { if (ctx == NULL) diff --git a/include/crypto/bn.h b/include/crypto/bn.h index fa35e56cd9..915e10c688 100644 --- a/include/crypto/bn.h +++ b/include/crypto/bn.h @@ -126,6 +126,15 @@ int ossl_bn_rsa_fips186_5_derive_prime(BIGNUM *Y, BIGNUM *X, const BIGNUM *Xin, OSSL_LIB_CTX *ossl_bn_get_libctx(BN_CTX *ctx); +/* + * bn_ctx_acquire_ossl_fn_ctx() and bn_ctx_release_ossl_fn_ctx() work + * in tandem. They manage an OSSL_FN_CTX that is cached inside a BN_CTX + * for use by BIGNUM wrapper functions that delegate to OSSL_FN. + */ +OSSL_FN_CTX *bn_ctx_acquire_ossl_fn_ctx(BN_CTX *ctx, size_t max_n_frames, + size_t max_n_numbers, size_t max_n_limbs); +void bn_ctx_release_ossl_fn_ctx(BN_CTX *ctx); + extern const BIGNUM ossl_bn_inv_sqrt_2; #if defined(OPENSSL_SYS_LINUX) && !defined(FIPS_MODULE) && defined(__s390x__) \ diff --git a/test/bn_internal_test.c b/test/bn_internal_test.c index 43960937a6..df4876512b 100644 --- a/test/bn_internal_test.c +++ b/test/bn_internal_test.c @@ -21,6 +21,8 @@ #include "testutil.h" #include "bn_prime.h" #include "crypto/bn.h" +#include "crypto/fn.h" +#include "crypto/fn_intern.h" static BN_CTX *ctx; @@ -86,6 +88,91 @@ err: return ret; } +static int test_bn_ctx_fn_ctx(void) +{ + int ret = 1; + BN_CTX *bnctx = NULL; + OSSL_FN_CTX *fnctx = NULL; + OSSL_FN *fn = NULL; + const void *token = NULL; + + /* Test non-secure BN_CTX */ + if (!TEST_ptr(bnctx = BN_CTX_new())) + return 0; + + /* Acquire should create a new OSSL_FN_CTX */ + if (!TEST_ptr(fnctx = bn_ctx_acquire_ossl_fn_ctx(bnctx, 1, 1, 32))) + ret = 0; + + /* The returned pointer should be cached inside BN_CTX */ + if (ret && !TEST_ptr_eq(fnctx, bn_ctx_acquire_ossl_fn_ctx(bnctx, 1, 1, 32))) + ret = 0; + + /* Re-acquire with same size should return the same cached context */ + if (ret && !TEST_ptr_eq(fnctx, bn_ctx_acquire_ossl_fn_ctx(bnctx, 1, 1, 32))) + ret = 0; + + /* Use the OSSL_FN_CTX */ + if (ret) { + if (!TEST_ptr(token = OSSL_FN_CTX_start(fnctx)) + || !TEST_ptr(fn = OSSL_FN_CTX_get_limbs(fnctx, 4)) + || !TEST_true(OSSL_FN_CTX_end(fnctx, token))) + ret = 0; + } + + /* + * Release does NOT free the cached OSSL_FN_CTX; it just asserts + * no frames are outstanding. Re-acquire should return the same + * cached pointer. + */ + bn_ctx_release_ossl_fn_ctx(bnctx); + if (ret && !TEST_ptr_eq(fnctx, bn_ctx_acquire_ossl_fn_ctx(bnctx, 1, 1, 32))) + ret = 0; + + /* + * Re-acquire with a larger size should replace the cached context + * because the old one is too small. (Free + alloc may reuse the + * same address, so only verify the new context satisfies the larger + * request.) + */ + if (ret) { + OSSL_FN_CTX *small = bn_ctx_acquire_ossl_fn_ctx(bnctx, 1, 1, 8); + if (!TEST_ptr(small)) + ret = 0; + else { + OSSL_FN_CTX *large = bn_ctx_acquire_ossl_fn_ctx(bnctx, 1, 1, 64); + + if (!TEST_ptr(large) + || !TEST_ptr(token = OSSL_FN_CTX_start(large)) + || !TEST_ptr(fn = OSSL_FN_CTX_get_limbs(large, 64)) + || !TEST_true(OSSL_FN_CTX_end(large, token))) + ret = 0; + } + } + + BN_CTX_free(bnctx); + + /* Test secure BN_CTX */ + if (ret) { + if (!TEST_ptr(bnctx = BN_CTX_secure_new())) + ret = 0; + else { + fn = NULL; + token = NULL; + fnctx = bn_ctx_acquire_ossl_fn_ctx(bnctx, 1, 1, 8); + if (!TEST_ptr(fnctx) + || !TEST_ptr(token = OSSL_FN_CTX_start(fnctx)) + || !TEST_ptr(fn = OSSL_FN_CTX_get_limbs(fnctx, 1)) + || !TEST_true(ossl_fn_is_securely_allocated(fn)) + || !TEST_true(OSSL_FN_CTX_end(fnctx, token))) + ret = 0; + BN_CTX_free(bnctx); + } + } + + return ret; +} + int setup_tests(void) { if (!TEST_ptr(ctx = BN_CTX_new())) @@ -94,6 +181,7 @@ int setup_tests(void) ADD_TEST(test_is_prime_enhanced); ADD_ALL_TESTS(test_is_composite_enhanced, (int)OSSL_NELEM(composites)); ADD_TEST(test_bn_small_factors); + ADD_TEST(test_bn_ctx_fn_ctx); return 1; } From ac0e2da45e40da66a23d25de5382b286738b9aa6 Mon Sep 17 00:00:00 2001 From: Richard Levitte Date: Tue, 9 Jun 2026 17:41:51 +0200 Subject: [PATCH 36/69] Use BN_CTX cached OSSL_FN_CTX in BN_mul() and BN_sqr() The previous commit added bn_ctx_acquire_ossl_fn_ctx() and bn_ctx_release_ossl_fn_ctx() to cache an OSSL_FN_CTX inside a BN_CTX. However, BN_mul() and BN_sqr() were still creating and freeing their own temporary OSSL_FN_CTX on every call, ignoring the passed-in BN_CTX entirely. Update both functions to acquire the OSSL_FN_CTX from the BN_CTX and release it afterwards, allowing the cached context to be reused across calls. Assisted-by: Pi:moonshotai/kimi-k2.6 Signed-off-by: Richard Levitte Reviewed-by: Igor Ustinov Reviewed-by: Tomas Mraz MergeDate: Sun Jun 14 08:40:47 2026 (Merged from https://github.com/openssl/openssl/pull/31431) --- crypto/bn/bn_mul.c | 9 ++------- crypto/bn/bn_sqr.c | 9 ++------- 2 files changed, 4 insertions(+), 14 deletions(-) diff --git a/crypto/bn/bn_mul.c b/crypto/bn/bn_mul.c index 42a4ce10cd..7e6eddb544 100644 --- a/crypto/bn/bn_mul.c +++ b/crypto/bn/bn_mul.c @@ -37,19 +37,14 @@ int BN_mul(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, BN_CTX *ctx) size_t max = a->dmax + b->dmax; - /* - * Unfortunately, OSSL_FN_CTX and BN_CTX are too wildly different to - * be interchangeable. We must therefore create an OSSL_FN_CTX here. - * (OSSL_FN_CTX is only really useful within OSSL_FN functionality) - */ - OSSL_FN_CTX *fnctx = OSSL_FN_CTX_new(NULL, 1, 1, max); + OSSL_FN_CTX *fnctx = bn_ctx_acquire_ossl_fn_ctx(ctx, 1, 1, max); int ret = OSSL_FN_mul(rf, a->data, b->data, fnctx); bn_release(r, (int)top); if (ret && !BN_is_zero(r)) r->neg = a->neg ^ b->neg; - OSSL_FN_CTX_free(fnctx); + bn_ctx_release_ossl_fn_ctx(ctx); return ret; } diff --git a/crypto/bn/bn_sqr.c b/crypto/bn/bn_sqr.c index 2be5c787f8..98f5aa01a5 100644 --- a/crypto/bn/bn_sqr.c +++ b/crypto/bn/bn_sqr.c @@ -39,17 +39,12 @@ int BN_sqr(BIGNUM *r, const BIGNUM *a, BN_CTX *ctx) size_t max = a->dmax * 2; - /* - * Unfortunately, OSSL_FN_CTX and BN_CTX are too wildly different to - * be interchangeable. We must therefore create an OSSL_FN_CTX here. - * (OSSL_FN_CTX is only really useful within OSSL_FN functionality) - */ - OSSL_FN_CTX *fnctx = OSSL_FN_CTX_new(NULL, 1, 2, max * 4); + OSSL_FN_CTX *fnctx = bn_ctx_acquire_ossl_fn_ctx(ctx, 1, 2, max * 4); int ret = OSSL_FN_sqr(rf, a->data, fnctx); bn_release(r, (int)top); r->neg = 0; - OSSL_FN_CTX_free(fnctx); + bn_ctx_release_ossl_fn_ctx(ctx); return ret; } From 04566a1781a12fe0349eca89b6afe7cfc8bdbac9 Mon Sep 17 00:00:00 2001 From: Tomas Mraz Date: Fri, 19 Jun 2026 10:54:06 +0200 Subject: [PATCH 37/69] Check result of acquiring OSSL_FN or OSSL_FN_CTX These calls might return NULL because they allocate memory. Reviewed-by: Igor Ustinov Reviewed-by: Daniel Kubec MergeDate: Fri Jun 26 14:09:33 2026 (Merged from https://github.com/openssl/openssl/pull/31613) --- crypto/bn/bn_add.c | 6 ++++++ crypto/bn/bn_mul.c | 7 +++++++ crypto/bn/bn_sqr.c | 7 +++++++ 3 files changed, 20 insertions(+) diff --git a/crypto/bn/bn_add.c b/crypto/bn/bn_add.c index c62ab63521..b7fd84af80 100644 --- a/crypto/bn/bn_add.c +++ b/crypto/bn/bn_add.c @@ -152,6 +152,9 @@ int BN_uadd(BIGNUM *r, const BIGNUM *a, const BIGNUM *b) top++; OSSL_FN *rf = bn_acquire_ossl_fn(r, (int)top); + if (rf == NULL) + return 0; + int ret = OSSL_FN_add(rf, a->data, b->data); bn_release(r, (int)top); @@ -224,6 +227,9 @@ int BN_usub(BIGNUM *r, const BIGNUM *a, const BIGNUM *b) size_t top = calculate_max_top(a, b); OSSL_FN *rf = bn_acquire_ossl_fn(r, (int)top); + if (rf == NULL) + return 0; + int ret = OSSL_FN_sub(rf, a->data, b->data); bn_release(r, (int)top); diff --git a/crypto/bn/bn_mul.c b/crypto/bn/bn_mul.c index 7e6eddb544..5ecbf6ad4b 100644 --- a/crypto/bn/bn_mul.c +++ b/crypto/bn/bn_mul.c @@ -34,10 +34,17 @@ int BN_mul(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, BN_CTX *ctx) */ size_t top = a->top + b->top; OSSL_FN *rf = bn_acquire_ossl_fn(r, (int)top); + if (rf == NULL) + return 0; size_t max = a->dmax + b->dmax; OSSL_FN_CTX *fnctx = bn_ctx_acquire_ossl_fn_ctx(ctx, 1, 1, max); + if (fnctx == NULL) { + bn_release(r, r->top); + return 0; + } + int ret = OSSL_FN_mul(rf, a->data, b->data, fnctx); bn_release(r, (int)top); diff --git a/crypto/bn/bn_sqr.c b/crypto/bn/bn_sqr.c index 98f5aa01a5..76fc69f8dd 100644 --- a/crypto/bn/bn_sqr.c +++ b/crypto/bn/bn_sqr.c @@ -36,10 +36,17 @@ int BN_sqr(BIGNUM *r, const BIGNUM *a, BN_CTX *ctx) */ size_t top = a->top * 2; OSSL_FN *rf = bn_acquire_ossl_fn(r, (int)top); + if (rf == NULL) + return 0; size_t max = a->dmax * 2; OSSL_FN_CTX *fnctx = bn_ctx_acquire_ossl_fn_ctx(ctx, 1, 2, max * 4); + if (fnctx == NULL) { + bn_release(r, r->top); + return 0; + } + int ret = OSSL_FN_sqr(rf, a->data, fnctx); bn_release(r, (int)top); r->neg = 0; From 0b478aba2c8f3314965734509d4295b538ce80fb Mon Sep 17 00:00:00 2001 From: Richard Levitte Date: Thu, 11 Jun 2026 13:34:23 +0200 Subject: [PATCH 38/69] OSSL_FN: Add basic shift and compare functions The following functions are added: - OSSL_FN_num_bits - OSSL_FN_cmp - OSSL_FN_lshift - OSSL_FN_lshift1 Assisted-by: Pi:openai/gpt-5.5 Signed-off-by: Richard Levitte Reviewed-by: Igor Ustinov Reviewed-by: Tomas Mraz MergeDate: Fri Jun 26 14:23:17 2026 (Merged from https://github.com/openssl/openssl/pull/31460) --- crypto/err/openssl.txt | 1 + crypto/fn/build.info | 2 +- crypto/fn/fn_err.c | 2 + crypto/fn/fn_lib.c | 79 ++++++++++++++ crypto/fn/fn_shift.c | 90 ++++++++++++++++ include/crypto/fn.h | 36 +++++++ include/crypto/fnerr.h | 1 + test/fn_api_test.c | 230 +++++++++++++++++++++++++++++++++++++++++ 8 files changed, 440 insertions(+), 1 deletion(-) create mode 100644 crypto/fn/fn_shift.c diff --git a/crypto/err/openssl.txt b/crypto/err/openssl.txt index 7753ba5621..be04fac74e 100644 --- a/crypto/err/openssl.txt +++ b/crypto/err/openssl.txt @@ -888,6 +888,7 @@ OSSL_ENCODER_R_ENCODER_NOT_FOUND:101:encoder not found OSSL_ENCODER_R_INCORRECT_PROPERTY_QUERY:100:incorrect property query OSSL_ENCODER_R_MISSING_GET_PARAMS:102:missing get params OSSL_ENCODER_R_UNKNOWN_PARAMETER_NAME:104:unknown parameter name +OSSL_FN_R_INVALID_SHIFT:102:invalid shift OSSL_FN_R_RESULT_ARG_TOO_SMALL:100:result arg too small OSSL_STORE_R_AMBIGUOUS_CONTENT_TYPE:107:ambiguous content type OSSL_STORE_R_BAD_PASSWORD_READ:115:bad password read diff --git a/crypto/fn/build.info b/crypto/fn/build.info index b836ab4321..5af2c86e37 100644 --- a/crypto/fn/build.info +++ b/crypto/fn/build.info @@ -2,7 +2,7 @@ $LIBCRYPTO=../../libcrypto $LIBFIPS=../../providers/libfips.a LIBS=$LIBCRYPTO -$COMMON=fn_err.c fn_lib.c fn_ctx.c fn_intern.c fn_addsub.c fn_mul.c fn_sqr.c +$COMMON=fn_err.c fn_lib.c fn_ctx.c fn_intern.c fn_addsub.c fn_shift.c fn_mul.c fn_sqr.c SOURCE[$LIBCRYPTO]=$COMMON SOURCE[$LIBFIPS]=$COMMON diff --git a/crypto/fn/fn_err.c b/crypto/fn/fn_err.c index bf6c147820..443d225944 100644 --- a/crypto/fn/fn_err.c +++ b/crypto/fn/fn_err.c @@ -14,6 +14,8 @@ #ifndef OPENSSL_NO_ERR static const ERR_STRING_DATA OSSL_FN_str_reasons[] = { + { ERR_PACK(ERR_LIB_OSSL_FN, 0, OSSL_FN_R_INVALID_SHIFT), + "invalid shift" }, { ERR_PACK(ERR_LIB_OSSL_FN, 0, OSSL_FN_R_RESULT_ARG_TOO_SMALL), "result arg too small" }, { 0, NULL } diff --git a/crypto/fn/fn_lib.c b/crypto/fn/fn_lib.c index c2c3305a66..c9ffb9323f 100644 --- a/crypto/fn/fn_lib.c +++ b/crypto/fn/fn_lib.c @@ -15,6 +15,7 @@ #include "internal/common.h" #include "crypto/fnerr.h" #include "fn_local.h" +#include "internal/constant_time.h" static OSSL_FN *ossl_fn_new_internal(size_t limbs, bool securely) { @@ -105,6 +106,84 @@ void OSSL_FN_clear(OSSL_FN *f) OPENSSL_cleanse(f->d, limbssize); } +static size_t ossl_fn_num_bits_word(OSSL_FN_ULONG l) +{ + OSSL_FN_ULONG x, mask; + size_t bits = (size_t)constant_time_select_int( + (unsigned int)constant_time_is_zero_bn(l), 0, 1); + +#if OSSL_FN_BITS > 32 + x = l >> 32; + mask = ~constant_time_is_zero_bn(x); + bits += 32 & (size_t)mask; + l ^= (x ^ l) & mask; +#endif + + x = l >> 16; + mask = ~constant_time_is_zero_bn(x); + bits += 16 & (size_t)mask; + l ^= (x ^ l) & mask; + + x = l >> 8; + mask = ~constant_time_is_zero_bn(x); + bits += 8 & (size_t)mask; + l ^= (x ^ l) & mask; + + x = l >> 4; + mask = ~constant_time_is_zero_bn(x); + bits += 4 & (size_t)mask; + l ^= (x ^ l) & mask; + + x = l >> 2; + mask = ~constant_time_is_zero_bn(x); + bits += 2 & (size_t)mask; + l ^= (x ^ l) & mask; + + x = l >> 1; + mask = ~constant_time_is_zero_bn(x); + bits += 1 & (size_t)mask; + + return bits; +} + +size_t OSSL_FN_num_bits(const OSSL_FN *a) +{ + size_t i; + size_t dsize = (size_t)a->dsize; + size_t ret = 0; + + for (i = 0; i < dsize; i++) { + size_t limb_bits = ossl_fn_num_bits_word(a->d[i]); + size_t bits = i * OSSL_FN_BITS + limb_bits; + size_t mask = (size_t)~constant_time_is_zero_bn(a->d[i]); + + ret = constant_time_select_s(mask, bits, ret); + } + + return ret; +} + +int OSSL_FN_cmp(const OSSL_FN *a, const OSSL_FN *b) +{ + size_t i; + size_t asize = (size_t)a->dsize; + size_t bsize = (size_t)b->dsize; + size_t max = asize > bsize ? asize : bsize; + int res = 0; + + for (i = 0; i < max; i++) { + OSSL_FN_ULONG aw = i < asize ? a->d[i] : 0; + OSSL_FN_ULONG bw = i < bsize ? b->d[i] : 0; + + res = constant_time_select_int( + (unsigned int)constant_time_lt_bn(aw, bw), -1, res); + res = constant_time_select_int( + (unsigned int)constant_time_lt_bn(bw, aw), 1, res); + } + + return res; +} + OSSL_FN *OSSL_FN_copy(OSSL_FN *a, const OSSL_FN *b) { if (ossl_unlikely(a == b)) diff --git a/crypto/fn/fn_shift.c b/crypto/fn/fn_shift.c new file mode 100644 index 0000000000..f8e7a9cbae --- /dev/null +++ b/crypto/fn/fn_shift.c @@ -0,0 +1,90 @@ +/* + * Copyright 2026 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#include +#include +#include "crypto/fnerr.h" +#include "fn_local.h" + +/* + * In respect to shift factor the execution time is invariant of + * |n % OSSL_FN_BITS|, but not |n / OSSL_FN_BITS|. Or in other words + * pre-condition for constant-time-ness is |n < OSSL_FN_BITS| or + * |n / OSSL_FN_BITS| being non-secret. + */ +int OSSL_FN_lshift(OSSL_FN *r, const OSSL_FN *a, int n) +{ + size_t i, nw; + unsigned int lb, rb; + const OSSL_FN_ULONG *ap = a->d; + OSSL_FN_ULONG *rp = r->d; + size_t rl = (size_t)r->dsize; + size_t al = (size_t)a->dsize; + + if (n < 0) { + ERR_raise(ERR_LIB_OSSL_FN, OSSL_FN_R_INVALID_SHIFT); + return 0; + } + + nw = (size_t)n / OSSL_FN_BITS; + if (nw >= rl) { + memset(rp, 0, sizeof(*rp) * rl); + return 1; + } + + lb = (unsigned int)n % OSSL_FN_BITS; + rb = OSSL_FN_BITS - lb; + + /* + * Work from the high end to support r == a. Each result limb only + * depends on the corresponding source limb and the limb just below it, + * neither of which has been overwritten yet when walking downward. + */ + for (i = rl; i > 0; i--) { + size_t r_idx = i - 1; + OSSL_FN_ULONG limb = 0; + + if (r_idx >= nw) { + size_t src_idx = r_idx - nw; + + if (src_idx < al) + limb = (ap[src_idx] << lb) & OSSL_FN_MASK; + if (lb != 0 && src_idx > 0 && src_idx - 1 < al) + limb |= ap[src_idx - 1] >> rb; + } + rp[r_idx] = limb; + } + + return 1; +} + +int OSSL_FN_lshift1(OSSL_FN *r, const OSSL_FN *a) +{ + OSSL_FN_ULONG *rp = r->d; + const OSSL_FN_ULONG *ap = a->d; + OSSL_FN_ULONG t, c = 0; + size_t rl = (size_t)r->dsize; + size_t al = (size_t)a->dsize; + size_t l = (rl < al) ? rl : al; + size_t i; + + for (i = 0; i < l; i++) { + t = ap[i]; + rp[i] = ((t << 1) | c) & OSSL_FN_MASK; + c = t >> (OSSL_FN_BITS - 1); + } + + if (i < rl) { + rp[i++] = c; + for (; i < rl; i++) + rp[i] = 0; + } + + return 1; +} diff --git a/include/crypto/fn.h b/include/crypto/fn.h index 36f0f7430b..f584ea273b 100644 --- a/include/crypto/fn.h +++ b/include/crypto/fn.h @@ -262,6 +262,42 @@ OSSL_FN *OSSL_FN_CTX_get_bits(OSSL_FN_CTX *ctx, size_t bits); * act just like operations on C unsigned integer types, but at a larger scale. */ +/** + * Return the number of significant bits in an OSSL_FN number. + * + * @param[in] a The operand + * @returns The number of significant bits, or zero if a is zero + */ +size_t OSSL_FN_num_bits(const OSSL_FN *a); + +/** + * Compare two OSSL_FN numbers as unsigned integers. + * + * @param[in] a The first operand + * @param[in] b The second operand + * @returns 1 if a > b, -1 if a < b, 0 if a == b + */ +int OSSL_FN_cmp(const OSSL_FN *a, const OSSL_FN *b); + +/** + * Shift an OSSL_FN number left by n bits. Truncates the result to fit in r. + * + * @param[out] r The OSSL_FN for the result + * @param[in] a The operand + * @param[in] n The number of bits to shift + * @returns 1 on success, 0 on error + */ +int OSSL_FN_lshift(OSSL_FN *r, const OSSL_FN *a, int n); + +/** + * Shift an OSSL_FN number left by one bit. Truncates the result to fit in r. + * + * @param[out] r The OSSL_FN for the result + * @param[in] a The operand + * @returns 1 on success, 0 on error + */ +int OSSL_FN_lshift1(OSSL_FN *r, const OSSL_FN *a); + /** * Add two OSSL_FN numbers. * diff --git a/include/crypto/fnerr.h b/include/crypto/fnerr.h index c3aeb32671..54356fd513 100644 --- a/include/crypto/fnerr.h +++ b/include/crypto/fnerr.h @@ -24,6 +24,7 @@ int ossl_err_load_OSSL_FN_strings(void); /* * OSSL_FN reason codes. */ +#define OSSL_FN_R_INVALID_SHIFT 102 #define OSSL_FN_R_RESULT_ARG_TOO_SMALL 100 #ifdef __cplusplus diff --git a/test/fn_api_test.c b/test/fn_api_test.c index d13f3c4cf8..2f09ab93ec 100644 --- a/test/fn_api_test.c +++ b/test/fn_api_test.c @@ -84,6 +84,10 @@ static const OSSL_FN_ULONG num7[] = { #error "OpenSSL doesn't support large numbers on this platform" #endif }; +static const OSSL_FN_ULONG num8[] = { + OSSL_FN_ULONG64_C(0x01234567, 0x89abcdef), + OSSL_FN_ULONG_C(0x00000001), +}; /* * For each test function using predefined numbers, set up an @@ -357,6 +361,52 @@ static const OSSL_FN_ULONG ex_sub_num7_num0[] = { #endif }; +/* $num2 << 1 == 0x02468acf13579bde */ +static const OSSL_FN_ULONG ex_lshift1_num2[] = { + OSSL_FN_ULONG64_C(0x02468acf, 0x13579bde), +}; +/* $num0 << 1 == 0x10000000000000002 */ +static const OSSL_FN_ULONG ex_lshift1_num0[] = { + OSSL_FN_ULONG64_C(0x00000000, 0x00000002), + OSSL_FN_ULONG_C(0x1), +}; +/* $num2 << 4 == 0x123456789abcdef0 */ +static const OSSL_FN_ULONG ex_lshift_num2_4[] = { + OSSL_FN_ULONG64_C(0x12345678, 0x9abcdef0), +}; +#if OSSL_FN_BYTES == 4 +/* $num2 << 32 == 0x0123456789abcdef00000000 */ +static const OSSL_FN_ULONG ex_lshift_num2_limb[] = { + OSSL_FN_ULONG_C(0x00000000), + OSSL_FN_ULONG_C(0x89abcdef), + OSSL_FN_ULONG_C(0x01234567), +}; +#elif OSSL_FN_BYTES == 8 +/* $num2 << 64 == 0x0123456789abcdef0000000000000000 */ +static const OSSL_FN_ULONG ex_lshift_num2_limb[] = { + OSSL_FN_ULONG64_C(0x00000000, 0x00000000), + OSSL_FN_ULONG64_C(0x01234567, 0x89abcdef), +}; +#else +#error "OpenSSL doesn't support large numbers on this platform" +#endif +#if OSSL_FN_BYTES == 4 +/* $num2 << 35 == 0x091a2b3c4d5e6f7800000000 */ +static const OSSL_FN_ULONG ex_lshift_num2_limb_3[] = { + OSSL_FN_ULONG_C(0x00000000), + OSSL_FN_ULONG_C(0x4d5e6f78), + OSSL_FN_ULONG_C(0x091a2b3c), +}; +#elif OSSL_FN_BYTES == 8 +/* $num2 << 67 == 0x091a2b3c4d5e6f780000000000000000 */ +static const OSSL_FN_ULONG ex_lshift_num2_limb_3[] = { + OSSL_FN_ULONG64_C(0x00000000, 0x00000000), + OSSL_FN_ULONG64_C(0x091a2b3c, 0x4d5e6f78), +}; +#else +#error "OpenSSL doesn't support large numbers on this platform" +#endif + static int test_sub_common(struct test_case_st test_case) { const OSSL_FN_ULONG *n1 = test_case.op1; @@ -484,6 +534,182 @@ static int test_sub_truncated(int i) return test_sub_common(test_sub_truncated_cases[i]); } +static int test_num_bits(void) +{ + int ret = 0; + OSSL_FN *zero = NULL, *fn1 = NULL, *fn2 = NULL, *wide = NULL; + + if (!TEST_ptr(zero = OSSL_FN_new_limbs(2)) + || !TEST_ptr(fn1 = OSSL_FN_new_limbs(2)) + || !TEST_ptr(fn2 = OSSL_FN_new_limbs(2)) + || !TEST_ptr(wide = OSSL_FN_new_limbs(4)) + || !TEST_true(ossl_fn_set_words(fn1, num1, LIMBSOF(num1))) + || !TEST_true(ossl_fn_set_words(fn2, num2, LIMBSOF(num2))) + || !TEST_true(ossl_fn_set_words(wide, num8, LIMBSOF(num8)))) + goto err; + + if (!TEST_size_t_eq(OSSL_FN_num_bits(zero), 0) + || !TEST_size_t_eq(OSSL_FN_num_bits(fn1), 33) + || !TEST_size_t_eq(OSSL_FN_num_bits(fn2), 57) + || !TEST_size_t_eq(OSSL_FN_num_bits(wide), 65)) + goto err; + + ret = 1; +err: + OSSL_FN_free(zero); + OSSL_FN_free(fn1); + OSSL_FN_free(fn2); + OSSL_FN_free(wide); + return ret; +} + +static int test_cmp(void) +{ + int ret = 0; + OSSL_FN *zero = NULL, *fn1 = NULL, *fn1_wide = NULL, *fn2 = NULL; + OSSL_FN *fn2_wide = NULL; + + if (!TEST_ptr(zero = OSSL_FN_new_limbs(2)) + || !TEST_ptr(fn1 = OSSL_FN_new_limbs(2)) + || !TEST_ptr(fn1_wide = OSSL_FN_new_limbs(4)) + || !TEST_ptr(fn2 = OSSL_FN_new_limbs(2)) + || !TEST_ptr(fn2_wide = OSSL_FN_new_limbs(4)) + || !TEST_true(ossl_fn_set_words(fn1, num1, LIMBSOF(num1))) + || !TEST_true(ossl_fn_set_words(fn1_wide, num1, LIMBSOF(num1))) + || !TEST_true(ossl_fn_set_words(fn2, num2, LIMBSOF(num2))) + || !TEST_true(ossl_fn_set_words(fn2_wide, num2, LIMBSOF(num2)))) + goto err; + + if (!TEST_int_eq(OSSL_FN_cmp(zero, zero), 0) + || !TEST_int_eq(OSSL_FN_cmp(fn2, fn2_wide), 0) + || !TEST_int_eq(OSSL_FN_cmp(fn2_wide, fn2), 0) + || !TEST_int_eq(OSSL_FN_cmp(fn2, fn1), 1) + || !TEST_int_eq(OSSL_FN_cmp(fn1, fn2), -1) + || !TEST_int_eq(OSSL_FN_cmp(fn2_wide, fn1), 1) + || !TEST_int_eq(OSSL_FN_cmp(fn1, fn2_wide), -1) + || !TEST_int_eq(OSSL_FN_cmp(fn2, fn1_wide), 1) + || !TEST_int_eq(OSSL_FN_cmp(fn1_wide, fn2), -1) + || !TEST_int_eq(OSSL_FN_cmp(zero, fn1), -1) + || !TEST_int_eq(OSSL_FN_cmp(fn1, zero), 1)) + goto err; + + ret = 1; +err: + OSSL_FN_free(zero); + OSSL_FN_free(fn1); + OSSL_FN_free(fn1_wide); + OSSL_FN_free(fn2); + OSSL_FN_free(fn2_wide); + return ret; +} + +static int test_lshift_common(int i, int use_lshift1) +{ + const OSSL_FN_ULONG *a_words = NULL; + const OSSL_FN_ULONG *ex_words = NULL; + OSSL_FN *a = NULL, *r = NULL; + size_t a_limbs = 0, a_live_limbs = 0, r_limbs = 0, check_limbs = 0; + int shift = 0, ret = 0; + const OSSL_FN_ULONG *u = NULL; + + switch (i) { + case 0: + a_words = num2; + a_limbs = LIMBSOF(num2); + a_live_limbs = LIMBSOF(num2); + r_limbs = LIMBSOF(ex_lshift1_num2) + 2; + ex_words = ex_lshift1_num2; + check_limbs = LIMBSOF(ex_lshift1_num2); + shift = 1; + break; + case 1: + a_words = num0; + a_limbs = LIMBSOF(num0); + a_live_limbs = LIMBSOF(num0); + r_limbs = LIMBSOF(ex_lshift1_num0) + 2; + ex_words = ex_lshift1_num0; + check_limbs = LIMBSOF(ex_lshift1_num0); + shift = 1; + break; + case 2: + a_words = num2; + a_limbs = LIMBSOF(num2); + a_live_limbs = LIMBSOF(num2); + r_limbs = LIMBSOF(ex_lshift_num2_4) + 2; + ex_words = ex_lshift_num2_4; + check_limbs = LIMBSOF(ex_lshift_num2_4); + shift = 4; + break; + case 3: + a_words = num2; + a_limbs = LIMBSOF(num2); + a_live_limbs = LIMBSOF(num2) + 2; + r_limbs = LIMBSOF(ex_lshift_num2_limb) + 2; + ex_words = ex_lshift_num2_limb; + check_limbs = LIMBSOF(ex_lshift_num2_limb); + shift = OSSL_FN_BYTES * 8; + break; + case 4: + a_words = num2; + a_limbs = LIMBSOF(num2); + a_live_limbs = LIMBSOF(num2); + r_limbs = LIMBSOF(ex_lshift1_num2) - 1; + ex_words = ex_lshift1_num2; + check_limbs = r_limbs; + shift = 1; + break; + case 5: + a_words = num2; + a_limbs = LIMBSOF(num2); + a_live_limbs = LIMBSOF(num2); + r_limbs = LIMBSOF(ex_lshift_num2_limb_3) + 2; + ex_words = ex_lshift_num2_limb_3; + check_limbs = LIMBSOF(ex_lshift_num2_limb_3); + shift = OSSL_FN_BYTES * 8 + 3; + break; + default: + return 0; + } + + if (!TEST_ptr(a = OSSL_FN_new_limbs(a_live_limbs)) + || !TEST_ptr(r = OSSL_FN_new_limbs(r_limbs)) + || !TEST_true(ossl_fn_set_words(a, a_words, a_limbs)) + || !TEST_true(pollute(r, 0, r_limbs))) + goto err; + + if (use_lshift1) { + if (!TEST_int_eq(shift, 1) + || !TEST_true(OSSL_FN_lshift1(r, a))) + goto err; + } else { + if (!TEST_true(OSSL_FN_lshift(r, a, shift))) + goto err; + } + + if (!TEST_ptr(u = ossl_fn_get_words(r)) + || !TEST_mem_eq(u, check_limbs * OSSL_FN_BYTES, + ex_words, check_limbs * OSSL_FN_BYTES) + || !TEST_true(check_limbs_value(r, check_limbs, r_limbs, + EXTENDED_LIMB_ZERO))) + goto err; + + ret = 1; +err: + OSSL_FN_free(a); + OSSL_FN_free(r); + return ret; +} + +static int test_lshift1(int i) +{ + return test_lshift_common(i, 1); +} + +static int test_lshift(int i) +{ + return test_lshift_common(i, 0); +} + /* A set of expected results, also in OSSL_FN_ULONG array form */ static const OSSL_FN_ULONG ex_mul_num0_num0[] = { OSSL_FN_ULONG64_C(0x00000000, 0x00000001), @@ -1016,6 +1242,10 @@ int setup_tests(void) ADD_ALL_TESTS(test_add_truncated, 17); ADD_ALL_TESTS(test_sub, 18); ADD_ALL_TESTS(test_sub_truncated, 18); + ADD_TEST(test_num_bits); + ADD_TEST(test_cmp); + ADD_ALL_TESTS(test_lshift1, 2); + ADD_ALL_TESTS(test_lshift, 6); ADD_ALL_TESTS(test_mul_feature_r_is_operand, 4); ADD_ALL_TESTS(test_mul, OSSL_NELEM(test_mul_cases)); ADD_ALL_TESTS(test_mul_truncated, OSSL_NELEM(test_mul_truncate_cases)); From d07d760f8cdbee7108b34b23c02d933044e8d882 Mon Sep 17 00:00:00 2001 From: Richard Levitte Date: Thu, 11 Jun 2026 16:43:03 +0200 Subject: [PATCH 39/69] OSSL_FN: Wrap BN shift and compare functions around OSSL_FN functions Assisted-by: Pi:openai/gpt-5.5 Signed-off-by: Richard Levitte Reviewed-by: Igor Ustinov Reviewed-by: Tomas Mraz MergeDate: Fri Jun 26 14:23:18 2026 (Merged from https://github.com/openssl/openssl/pull/31460) --- crypto/bn/bn_lib.c | 133 +++++++++++++++++++++++++------------------ crypto/bn/bn_shift.c | 75 ++++++++++++++++-------- 2 files changed, 129 insertions(+), 79 deletions(-) diff --git a/crypto/bn/bn_lib.c b/crypto/bn/bn_lib.c index 33ada652e5..b6b0722f5c 100644 --- a/crypto/bn/bn_lib.c +++ b/crypto/bn/bn_lib.c @@ -183,26 +183,34 @@ static ossl_inline int bn_num_bits_consttime(const BIGNUM *a) int BN_num_bits(const BIGNUM *a) { - int i = a->top - 1; bn_check_top(a); - if (a->flags & BN_FLG_CONSTTIME) { - /* - * We assume that BIGNUMs flagged as CONSTTIME have also been expanded - * so that a->dmax is not leaking secret information. - * - * In other words, it's the caller's responsibility to ensure `a` has - * been preallocated in advance to a public length if we hit this - * branch. - * - */ - return bn_num_bits_consttime(a); + /* TODO(FIXNUM): TO BE REMOVED */ + if (a->data == NULL) { + int i = a->top - 1; + + if (a->flags & BN_FLG_CONSTTIME) { + /* + * We assume that BIGNUMs flagged as CONSTTIME have also been expanded + * so that a->dmax is not leaking secret information. + * + * In other words, it's the caller's responsibility to ensure `a` has + * been preallocated in advance to a public length if we hit this + * branch. + * + */ + return bn_num_bits_consttime(a); + } + + if (ossl_unlikely(BN_is_zero(a))) + return 0; + + return ((i * BN_BITS2) + BN_num_bits_word(a->d[i])); } - if (ossl_unlikely(BN_is_zero(a))) - return 0; + size_t bits = OSSL_FN_num_bits(a->data); - return ((i * BN_BITS2) + BN_num_bits_word(a->d[i])); + return bits > INT_MAX ? INT_MAX : (int)bits; } static void bn_free_d(BIGNUM *a, bool clear) @@ -736,46 +744,49 @@ int BN_signed_bn2native(const BIGNUM *a, unsigned char *to, int tolen) int BN_ucmp(const BIGNUM *a, const BIGNUM *b) { - int i; - BN_ULONG t1, t2, *ap, *bp; - - ap = a->d; - bp = b->d; - - if (BN_get_flags(a, BN_FLG_CONSTTIME) - && a->top == b->top) { - int res = 0; - - for (i = 0; i < b->top; i++) { - res = constant_time_select_int((int)constant_time_lt_bn(ap[i], bp[i]), - -1, res); - res = constant_time_select_int((int)constant_time_lt_bn(bp[i], ap[i]), - 1, res); - } - return res; - } - bn_check_top(a); bn_check_top(b); - i = a->top - b->top; - if (i != 0) - return i; + /* TODO(FIXNUM): TO BE REMOVED */ + if (a->data == NULL || b->data == NULL) { + int i; + BN_ULONG t1, t2, *ap, *bp; - for (i = a->top - 1; i >= 0; i--) { - t1 = ap[i]; - t2 = bp[i]; - if (t1 != t2) - return ((t1 > t2) ? 1 : -1); + ap = a->d; + bp = b->d; + + if (BN_get_flags(a, BN_FLG_CONSTTIME) + && a->top == b->top) { + int res = 0; + + for (i = 0; i < b->top; i++) { + res = constant_time_select_int((int)constant_time_lt_bn(ap[i], bp[i]), + -1, res); + res = constant_time_select_int((int)constant_time_lt_bn(bp[i], ap[i]), + 1, res); + } + return res; + } + + i = a->top - b->top; + if (i != 0) + return i; + + for (i = a->top - 1; i >= 0; i--) { + t1 = ap[i]; + t2 = bp[i]; + if (t1 != t2) + return ((t1 > t2) ? 1 : -1); + } + return 0; } - return 0; + + return OSSL_FN_cmp(a->data, b->data); } int BN_cmp(const BIGNUM *a, const BIGNUM *b) { - int i; int gt, lt; - BN_ULONG t1, t2; if ((a == NULL) || (b == NULL)) { if (a != NULL) @@ -803,17 +814,31 @@ int BN_cmp(const BIGNUM *a, const BIGNUM *b) lt = 1; } - if (a->top > b->top) - return gt; - if (a->top < b->top) - return lt; - for (i = a->top - 1; i >= 0; i--) { - t1 = a->d[i]; - t2 = b->d[i]; - if (t1 > t2) + /* TODO(FIXNUM): TO BE REMOVED */ + if (a->data == NULL || b->data == NULL) { + int i; + BN_ULONG t1, t2; + + if (a->top > b->top) return gt; - if (t1 < t2) + if (a->top < b->top) return lt; + for (i = a->top - 1; i >= 0; i--) { + t1 = a->d[i]; + t2 = b->d[i]; + if (t1 > t2) + return gt; + if (t1 < t2) + return lt; + } + return 0; + } + + switch (OSSL_FN_cmp(a->data, b->data)) { + case 1: + return gt; + case -1: + return lt; } return 0; } diff --git a/crypto/bn/bn_shift.c b/crypto/bn/bn_shift.c index 2e6f7c7401..cbecbbbc88 100644 --- a/crypto/bn/bn_shift.c +++ b/crypto/bn/bn_shift.c @@ -13,33 +13,44 @@ int BN_lshift1(BIGNUM *r, const BIGNUM *a) { - register BN_ULONG *ap, *rp, t, c; - int i; - bn_check_top(r); bn_check_top(a); - if (r != a) { - r->neg = a->neg; - if (bn_wexpand(r, a->top + 1) == NULL) - return 0; - bn_set_top(r, a->top); - } else { - if (bn_wexpand(r, a->top + 1) == NULL) - return 0; + /* TODO(FIXNUM): TO BE REMOVED */ + if (r->data == NULL || a->data == NULL) { + register BN_ULONG *ap, *rp, t, c; + int i; + + if (r != a) { + r->neg = a->neg; + if (bn_wexpand(r, a->top + 1) == NULL) + return 0; + bn_set_top(r, a->top); + } else { + if (bn_wexpand(r, a->top + 1) == NULL) + return 0; + } + ap = a->d; + rp = r->d; + c = 0; + for (i = 0; i < a->top; i++) { + t = *(ap++); + *(rp++) = ((t << 1) | c) & BN_MASK2; + c = t >> (BN_BITS2 - 1); + } + *rp = c; + bn_set_top(r, r->top + (int)c); + bn_check_top(r); + return 1; } - ap = a->d; - rp = r->d; - c = 0; - for (i = 0; i < a->top; i++) { - t = *(ap++); - *(rp++) = ((t << 1) | c) & BN_MASK2; - c = t >> (BN_BITS2 - 1); - } - *rp = c; - bn_set_top(r, r->top + (int)c); - bn_check_top(r); - return 1; + + size_t top = a->top + 1; + OSSL_FN *rf = bn_acquire_ossl_fn(r, (int)top); + int ret = OSSL_FN_lshift1(rf, a->data); + bn_release(r, (int)top); + + BN_set_negative(r, ret && a->neg); + return ret; } int BN_rshift1(BIGNUM *r, const BIGNUM *a) @@ -86,11 +97,25 @@ int BN_lshift(BIGNUM *r, const BIGNUM *a, int n) return 0; } - ret = bn_lshift_fixed_top(r, a, n); + /* TODO(FIXNUM): TO BE REMOVED */ + if (r->data == NULL || a->data == NULL) { + ret = bn_lshift_fixed_top(r, a, n); + + bn_correct_top(r); + bn_check_top(r); + + return ret; + } - bn_correct_top(r); bn_check_top(r); + bn_check_top(a); + size_t top = a->top + n / BN_BITS2 + 1; + OSSL_FN *rf = bn_acquire_ossl_fn(r, (int)top); + ret = OSSL_FN_lshift(rf, a->data, n); + bn_release(r, (int)top); + + BN_set_negative(r, ret && a->neg); return ret; } From e3a6ede280fb9d13528ec0fe81bf17b7c66239f7 Mon Sep 17 00:00:00 2001 From: Igor Ustinov Date: Sat, 27 Jun 2026 08:40:57 +0200 Subject: [PATCH 40/69] Check result of acquiring OSSL_FN These calls might return NULL because they allocate memory. Reviewed-by: Tomas Mraz Reviewed-by: Richard Levitte MergeDate: Tue Jun 30 06:45:42 2026 (Merged from https://github.com/openssl/openssl/pull/31754) --- crypto/bn/bn_shift.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/crypto/bn/bn_shift.c b/crypto/bn/bn_shift.c index cbecbbbc88..2fdb5fc9f0 100644 --- a/crypto/bn/bn_shift.c +++ b/crypto/bn/bn_shift.c @@ -46,6 +46,8 @@ int BN_lshift1(BIGNUM *r, const BIGNUM *a) size_t top = a->top + 1; OSSL_FN *rf = bn_acquire_ossl_fn(r, (int)top); + if (rf == NULL) + return 0; int ret = OSSL_FN_lshift1(rf, a->data); bn_release(r, (int)top); @@ -112,6 +114,8 @@ int BN_lshift(BIGNUM *r, const BIGNUM *a, int n) size_t top = a->top + n / BN_BITS2 + 1; OSSL_FN *rf = bn_acquire_ossl_fn(r, (int)top); + if (rf == NULL) + return 0; ret = OSSL_FN_lshift(rf, a->data, n); bn_release(r, (int)top); From 910c2fcfc0ffa5cf16f60a2b440745d0acb9493d Mon Sep 17 00:00:00 2001 From: Richard Levitte Date: Fri, 3 Jul 2026 18:05:21 +0200 Subject: [PATCH 41/69] Decouple BIGNUM from OSSL_FN in the design doc Reflect the decision (openssl/project#2018) to stop wrapping BN_ operator functions around OSSL_FN_ operator functions: BN functions keep their current behaviour, and BIGNUM<->OSSL_FN conversion happens at top-level crypto call sites. Also drop the "Dropping top from BIGNUM" section and the stale TODO(FIXNUM) field-removal comments, since `top` stays in BIGNUM. Refs: https://github.com/openssl/project/issues/2019 Assisted-by: Pi:z-ai/glm-5.2 Assisted-by: Pi:openai/gpt-5.5 Signed-off-by: Richard Levitte Reviewed-by: Tomas Mraz Reviewed-by: Matt Caswell MergeDate: Thu Jul 9 10:54:20 2026 (Merged from https://github.com/openssl/openssl/pull/31847) --- crypto/bn/bn_intern.c | 1 - crypto/bn/bn_local.h | 7 - doc/designs/fixed-size-large-numbers.md | 216 +++++++----------------- 3 files changed, 64 insertions(+), 160 deletions(-) diff --git a/crypto/bn/bn_intern.c b/crypto/bn/bn_intern.c index dcd9e8b3db..89e0b5a60a 100644 --- a/crypto/bn/bn_intern.c +++ b/crypto/bn/bn_intern.c @@ -193,7 +193,6 @@ int bn_set_words(BIGNUM *a, const BN_ULONG *words, int num_words) /* TODO(FIXNUM): In the future, we'll use an OSSL_FN function on a->data */ memcpy(a->d, words, sizeof(BN_ULONG) * num_words); - /* TODO(FIXNUM): The following two lines are TO BE REMOVED */ bn_set_top(a, num_words); bn_correct_top(a); return 1; diff --git a/crypto/bn/bn_local.h b/crypto/bn/bn_local.h index d17c9d8fb6..83ebc5ea94 100644 --- a/crypto/bn/bn_local.h +++ b/crypto/bn/bn_local.h @@ -136,13 +136,6 @@ struct bignum_st { /* Some of these flags are replicated in OSSL_FN, some are not */ int flags; - /* - * TODO(FIXNUM) The fields that follow ARE TO BE REMOVED when all relevant - * BN_ functions have transitioned to be wrappers around OSSL_FN_ functions. - * All of this is maintained by bn_expand and BIGNUM allocators and - * deallocators. - */ - BN_ULONG *d; /* Pointer to |data->d| */ int top; /* Index of last used d +1. */ /* The next are internal book keeping for bn_expand. */ diff --git a/doc/designs/fixed-size-large-numbers.md b/doc/designs/fixed-size-large-numbers.md index 82c87a38a2..e6f059cd80 100644 --- a/doc/designs/fixed-size-large-numbers.md +++ b/doc/designs/fixed-size-large-numbers.md @@ -11,9 +11,7 @@ Fixed size large numbers In this design, we explore and define how OpenSSL's `BIGNUM` library can be remodelled for constant-size calculations. Furthermore, we explore and define a fixed size large number library, which never changes the in-memory -size of a number once it has been allocated. Finally, we define how `BIGNUM` -functions with corresponding fixed size large number functions can be remade -into wrappers around the latter. +size of a number once it has been allocated.

@@ -30,10 +28,8 @@ into wrappers around the latter. - [The `OSSL_FN_CTX` type, without frames][] - [The `BIGNUM` type][] - [Mutability][] - - [Dropping `top` from `BIGNUM`][] - [Memory functionality for `OSSL_FN`][] - [Memory functionality for `OSSL_FN_CTX`][] - - [Wrapping an `OSSL_FN` function with a `BIGNUM` function][] - [Failures][] - [Repurposing existing code][] - [How to apply `OSSL_FN`][] @@ -100,14 +96,13 @@ The included sub-goals are: size adjustments of the large numbers once their individual size has been established * To define that large number type and API in such a way it's compatible - with and can be used by the `BIGNUM` API through easy transition to the - new type. + with the `BIGNUM` type, so that a `BIGNUM` may use an `OSSL_FN` as its + backing storage and selected call sites may acquire an `OSSL_FN` view of + a `BIGNUM`. * To ensure that the new large number API is constant-size * To repurpose as much as possible of our current `BIGNUM` code for the new large number API, especially our assembler code (with the assumption that everything that doesn't change the `BIGNUM` sizes can be repurposed as is) -* To replace the public `BIGNUM` API that has been repurposed as wrappers - around the new large number API * To replace all security critical large number calculations so that they are not just constant-size in themselves, but that the whole set of calculations remains constant-size, within OpenSSL code @@ -147,14 +142,26 @@ separate yet castable back and forth. To allow a stricter or more explicit way to remedy the flexibility of the C language, this design therefore defines a `OSSL_FN` which is separate from the `BIGNUM`, yet compatible with BIGNUM insofar that the `BIGNUM` type -wraps around the `OSSL_FN` type, and `BIGNUM` functions wrap around -corresponding `OSSL_FN` functions when there are any. +wraps around the `OSSL_FN` type. -The idea is that a `BIGNUM` (`BN_`) function may call an `OSSL_FN` function, -but not the other way around, i.e. when an `OSSL_FN` function is called, an -"`OSSL_FN` only" bubble is entered, and such a function must therefore only -in turn call other `OSSL_FN` functions for large number operations, rather -than `BIGNUM` functions. +The compatibility is primarily at the storage and acquisition boundary. A +`BIGNUM` may use an `OSSL_FN` as its backing storage, and selected internal +crypto call sites that already receive `BIGNUM` values may acquire the +embedded `OSSL_FN` and perform security-critical calculations with `OSSL_FN` +functions. + +This does not mean that ordinary `BIGNUM` (`BN_`) operation functions are +wrappers around corresponding `OSSL_FN` operation functions. `BN_` +functions retain their dynamic `BIGNUM` semantics. Conversely, once +execution has entered an `OSSL_FN` operation, that operation must remain +inside the "`OSSL_FN` only" bubble and must not call functions that take +`BIGNUM` arguments. + +This restriction does not apply to low-level helpers that operate only on +`BN_ULONG` arrays or primitive limb values, such as existing `bn_` word +functions. `BN_ULONG` and `OSSL_FN_ULONG` are compatible, so such helpers +may be reused by `OSSL_FN` code as long as they do not allocate, resize, or +otherwise operate on `BIGNUM` objects. The overall design also defines new associated types to replace their `BIGNUM` counterparts: `OSSL_FN_CTX`, `OSSL_FN_BLINDING`, `OSSL_FN_MONT_CTX`, @@ -175,8 +182,9 @@ The `OSSL_FN` type The `OSSL_FN` type would be a structure derived from the existing `BIGNUM` type, retaining a minimum amount of data. Just as was previously with -`BIGNUM`, the absolute value of the number is stored in a `BN_ULONG` array, -and a flag indicates if the number is positive or negative. +`BIGNUM`, the absolute value of the number is stored in a `BN_ULONG` array. +`OSSL_FN` itself is unsigned; sign handling remains with `BIGNUM` when +`BIGNUM` values are used as carriers. ```c typedef struct ossl_fn_st OSSL_FN; @@ -186,10 +194,6 @@ struct ossl_fn_st { unsigned int is_dynamically_allocated : 1; /* Flag: alloced with OSSL_FN_secure_new() */ unsigned int is_securely_allocated : 1; - /* Flag: the caller holds a pointer to this OSSL_FN as well as the BIGNUM that wraps it */ - unsigned int is_acquired : 1; - /* Flag: the number is negative */ - unsigned int is_negative : 1; /* * The d array, with its size in number of BN_ULONG. @@ -200,11 +204,6 @@ struct ossl_fn_st { }; ``` -To be noted is that current cryptosystems never use negative numbers, so -it's possible that the `is_negative` flag will never be used. Therefore, it -is possible that it will never exist in actual implementation. It is -retained in this design, though, to keep that option open. - The `OSSL_FN_CTX` type ---------------------- @@ -342,19 +341,30 @@ The `BIGNUM` type [The `BIGNUM` type]: #the-bignum-type -The `BIGNUM` type is changed to include a `OSSL_FN` for its data, and other -fields that are only of interest for `BIGNUM`s: +The `BIGNUM` type is changed to include a `OSSL_FN` for its data, while +retaining the fields that support the dynamic `BIGNUM` semantics: ```c struct bignum_st { OSSL_FN *data; /* Some of these flags are replicated in OSSL_FN, some are not */ int flags; + + BN_ULONG *d; /* Pointer to |data->d| */ + int top; /* Index of last used d +1. */ + int dmax; /* Copy of |data->dsize| */ + int neg; /* One if the number is negative */ }; ``` -When structured this way, it's easy to get an `OSSL_FN` out of a `BIGNUM`, -as well as to wrap an `OSSL_FN` in a `BIGNUM`: +In normal public use, `data` is non-NULL and `d` points at `data->d`. +Certain internal or otherwise special `BIGNUM`s may still have `data` set to +NULL, in which case `d` points directly at a `BN_ULONG` array. Such cases +must not be forced to grow an `OSSL_FN` backing object solely to fit this +structure. How `OSSL_FN` code should use the `BN_ULONG` data from such +`BIGNUM`s remains an implementation detail. + +When structured this way, it's easy to get an `OSSL_FN` out of a `BIGNUM`: ```c /* @@ -365,49 +375,20 @@ as well as to wrap an `OSSL_FN` in a `BIGNUM`: */ OSSL_FN *BN_acquire_fn(BIGNUM *a, size_t bits) { - if (a->data->is_acquired) - return NULL; /* only one acquisition at a time */ if ((bn_expand(a, bits)) <= 0) return NULL; - a->data->is_acquired = 1; + /* Implementation may do further acquisition bookkeeping here. */ return a->data; } void BN_release_fn(BIGNUM *a) { - a->data->is_acquired = 0; + /* Implementation may do further release bookkeeping here. */ } ``` -Note that these functions are not designed to be thread-safe, nor do they -support multiple suímultaneous acquisitions. By design, holding pointers to -a `BIGNUM` and its wrapped `OSSL_FN` at the same time should only happen in -a very short term. - -If there's a need, it would also be possible to wrap an `OSSL_FN` with a -`BIGNUM`: - -``` C -/* - * When wrapping an OSSL_FN in a BIGNUM, the OSSL_FN is considered acquired - * until the caller decides to release it. - */ -BIGNUM *BN_wrap_fn(OSSL_FN *a) -{ - BIGNUM *r = OPENSSL_zalloc(sizeof(BIGNUM)); - - if (r != NULL) { - r->data = a; - r->flags |= (a->is_dynamically_allocated ? BN_FLG_MALLOCED); - r->flags |= (a->is_securely_allocated ? BN_FLG_SECURE); - a->is_acquired = 1; - } - - return r; -} -``` - -This should be avoided, but we retain this possibility just in case its use -is unavoidable. +Note that these functions are not designed to be thread-safe. By design, +holding pointers to a `BIGNUM` and its wrapped `OSSL_FN` at the same time +should only happen in a very short term. Mutability ---------- @@ -416,32 +397,19 @@ Mutability The understanding is that within a `OSSL_FN` API, `dsize` is immutable as soon as a `OSSL_FN` has been allocated to its target size, except for when -the `OSSL_FN` instance is freed. However, when accessed through the `BIGNUM` -type (i.e. by the `BIGNUM` API), the `OSSL_FN` size may be reallocated to -allow a larger size than initially allocated, and `dsize` may be modified -accordingly. +the `OSSL_FN` instance is freed. + +When accessed through the `BIGNUM` type (i.e. by the `BIGNUM` API), the +`OSSL_FN` size may be reallocated to allow a larger size than initially +allocated, and `dsize` may be modified accordingly. The exception is an +acquired `OSSL_FN` view. Once a caller has acquired the backing `OSSL_FN` +from a `BIGNUM`, that backing size must be treated as immutable until +release. The owning `BIGNUM` must not simultaneously be used through `BN_` +operations that could resize or otherwise reinterpret the same storage. The `OSSL_FN_CTX` API is much more strict. The size of an `OSSL_FN_CTX` instance is immutable after it has been allocated, except when it is freed. -In the case where an `OSSL_FN` is "acquired" (i.e. the calling code holds a -pointer to a `OSSL_FN` and to a `BIGNUM` that wraps it), `BIGNUM` must -consider the `OSSL_FN` size as immutable. - -Dropping `top` from `BIGNUM` ----------------------------- - -[Dropping `top` from `BIGNUM`]: #dropping-top-from-bignum - -With this design, the `top` field is dropped, meaning that a `BIGNUM` will -no longer be able to diminish its memory footprint. The reason is that the -`OSSL_FN` functionality would need to update it, but that runs counter to -the ideas behind the `OSSL_FN` functionality in terms of mutability. - -This may come at a performance cost for users calling the `BIGNUM` -API. However, it's our judgement that this is acceptable to get better -overall safety. - Memory functionality for `OSSL_FN` ---------------------------------- @@ -483,62 +451,6 @@ int OSSL_FN_CTX_start(OSSL_FN_CTX *ctx); int OSSL_FN_CTX_end(OSSL_FN_CTX *ctx); ``` -Wrapping an `OSSL_FN` function with a `BIGNUM` function -------------------------------------------------------- - -[Wrapping an `OSSL_FN` function with a `BIGNUM` function]: #wrapping-an-ossl_fn-function-with-a-bignum-function - -This is one example of what that would look like. This assumes that there is -a function `OSSL_FN_add()`: - -```c -int OSSL_FN_add(OSSL_FN *r, const OSSL_FN *a, const OSSL_FN *b) -{ - /* - * Code from the current BN_add() goes here, without the part that touches - * top and dmax (top doesn't exist in this design, but it does exist in - * current OpenSSL code) - */ -} - -int BN_add(BIGNUM *r, BIGNUM *a, BIGNUM *b) -{ - int ret; - - if (!r->data.is_acquired) { - size_t max_size = a->data.dsize; /* number of sizeof(BN_ULONG) limbs */ - BN_ULONG n = a->data->d[max_size-1]; - - if (b->data.dsize > max_size) { - max_size = b->data->dsize; - n = b->data->d[max_size-1]; - } - - /* - * If the highest limb in the biggest number is non-zero and they are - * both positive or both negative, it's assumed that the resulting - * bignum may grow by one limb. - */ - if (n != 0 && a->data->is_negative == b->data->is_negative) - max_size++; - - if ((ret = bn_expand(r, max_size * BN_BITS2)) <= 0) - return ret; - } - - /* - * It's not necessary to "acquire" the OSSL_FNs here, because it's - * assumed that the call of OSSL_FN_add() enters a "OSSL_FN only" bubble. - */ - ret = OSSL_FN_add(r->data, a->data, b->data); - - return ret; -} -``` - -*(This is not perfect and tested code, it's just an example. Actual code -should be more perfect, and of course, tested)* - Failures -------- @@ -562,12 +474,14 @@ separately, and are already essentially operating on fixed size numbers. This design assumes that such functions can be repurposed for `OSSL_FN` functionality with zero change, apart from function name changes. -Furthermore, this design assumes that the remaining functions, which do -manipulate the size of the `BIGNUM`, or are public facing `BIGNUM` -functions, can be rewritten in the same way as [the `BN_add()` example -above](#wrapping-an-ossl_fn-function-with-a-bignum-function), thereby -functionally separating the dynamic properties of `BIGNUM`s from the less -dynamic properties of `OSSL_FN`s. +Furthermore, the remaining functions, which do manipulate the size of the +`BIGNUM`, or are public facing `BIGNUM` functions, retain their current +`BIGNUM` functionality, including size manipulation within the `BIGNUM` +"bubble". They are not wrapped around `OSSL_FN` functions; conversion +between `BIGNUM` and `OSSL_FN` happens at top-level crypto call sites, +where the embedded `OSSL_FN` is acquired and passed to `OSSL_FN` +functions, during whose execution the `OSSL_FN` size is immutable (see +[Mutability][]). How to apply `OSSL_FN` ====================== @@ -663,9 +577,7 @@ fixed number size. It should also prove interesting to collect timing statistics for a set of operations using `BIGNUM` in previous OpenSSL versions and compare them with similar timing statistics using `BIGNUM` when reimplemented according to this -design. It is *assumed* that the new statistics will show a higher degree -of constant time, [due to `top` being dropped](#dropping-top-from-bignum), -even though not as much as pure `OSSL_FN` operations. +design. Appendix ======== From 3b2c8afdc1166fa24150d4d597d579ddf054cd34 Mon Sep 17 00:00:00 2001 From: Richard Levitte Date: Tue, 7 Jul 2026 16:01:35 +0200 Subject: [PATCH 42/69] OSSL_FN: unwrap the BIGNUM 'add' and 'sub' functions Restore the top-aware BN_add/BN_sub/BN_uadd/BN_usub implementations to their pre-wrap form, removing the OSSL_FN call-site wrapping introduced in: e3ae863a2d ("OSSL_FN: Wrap BIGNUM 'add' and 'sub' functions around OSSL_FN functions") This also reverts the in-body tuning that landed on top of that wrapping: 3eb0b45e63 ("Use top to size BN add/sub results") cbc3f0b448 ("Check result of acquiring OSSL_FN or OSSL_FN_CTX") (only the BN_add/BN_sub portions of cbc3f0b448 are affected). The conversion helpers bn_acquire_ossl_fn()/bn_release() and the foundational BN_MAX_WORDS hardening in bn_lib.c/bn_local.h are left in place; BN->OSSL_FN conversion moves to top-level crypto call sites instead. Issue: https://github.com/openssl/project/issues/2020 Assisted-by: Pi:z-ai/glm-5.2 Signed-off-by: Richard Levitte Reviewed-by: Igor Ustinov Reviewed-by: Tomas Mraz MergeDate: Thu Jul 9 15:34:20 2026 (Merged from https://github.com/openssl/openssl/pull/31884) --- crypto/bn/bn_add.c | 76 +++------------------------------------------- 1 file changed, 4 insertions(+), 72 deletions(-) diff --git a/crypto/bn/bn_add.c b/crypto/bn/bn_add.c index b7fd84af80..1784091b01 100644 --- a/crypto/bn/bn_add.c +++ b/crypto/bn/bn_add.c @@ -10,16 +10,6 @@ #include "internal/cryptlib.h" #include "bn_local.h" -static size_t calculate_max_top(const BIGNUM *a, const BIGNUM *b) -{ - return (a->top > b->top) ? a->top : b->top; -} - -static bool is_highest_bit_set(const BIGNUM *a) -{ - return a->top > 0 && (a->d[a->top - 1] & OSSL_FN_HIGH_BIT_MASK) != 0; -} - /* signed add of b to a. */ int BN_add(BIGNUM *r, const BIGNUM *a, const BIGNUM *b) { @@ -82,9 +72,8 @@ int BN_sub(BIGNUM *r, const BIGNUM *a, const BIGNUM *b) return ret; } -/* TODO(FIXNUM): TO BE REMOVED */ -/* pure BIGNUM unsigned add of b to a, r can be equal to a or b. */ -static int bn_uadd_legacy(BIGNUM *r, const BIGNUM *a, const BIGNUM *b) +/* unsigned add of b to a, r can be equal to a or b. */ +int BN_uadd(BIGNUM *r, const BIGNUM *a, const BIGNUM *b) { int max, min, dif; const BN_ULONG *ap, *bp; @@ -132,38 +121,8 @@ static int bn_uadd_legacy(BIGNUM *r, const BIGNUM *a, const BIGNUM *b) return 1; } -/* unsigned add of b to a, r can be equal to a or b. */ -int BN_uadd(BIGNUM *r, const BIGNUM *a, const BIGNUM *b) -{ - /* TODO(FIXNUM): TO BE REMOVED */ - if (r->data == NULL || a->data == NULL || b->data == NULL) - return bn_uadd_legacy(r, a, b); - - bn_check_top(a); - bn_check_top(b); - - size_t top = calculate_max_top(a, b); - - /* - * If either operands have the highest bit set the result may become - * one limb larger. - */ - if (is_highest_bit_set(a) || is_highest_bit_set(b)) - top++; - - OSSL_FN *rf = bn_acquire_ossl_fn(r, (int)top); - if (rf == NULL) - return 0; - - int ret = OSSL_FN_add(rf, a->data, b->data); - bn_release(r, (int)top); - - return ret; -} - -/* TODO(FIXNUM): TO BE REMOVED */ -/* pure BIGNUM unsigned subtraction of b from a, a must be larger than b. */ -static int bn_usub_legacy(BIGNUM *r, const BIGNUM *a, const BIGNUM *b) +/* unsigned subtraction of b from a, a must be larger than b. */ +int BN_usub(BIGNUM *r, const BIGNUM *a, const BIGNUM *b) { int max, min, dif; BN_ULONG t1, t2, borrow, *rp; @@ -208,30 +167,3 @@ static int bn_usub_legacy(BIGNUM *r, const BIGNUM *a, const BIGNUM *b) return 1; } - -/* unsigned subtraction of b from a, a must be larger than b. */ -int BN_usub(BIGNUM *r, const BIGNUM *a, const BIGNUM *b) -{ - /* TODO(FIXNUM): TO BE REMOVED */ - if (r->data == NULL || a->data == NULL || b->data == NULL) - return bn_usub_legacy(r, a, b); - - bn_check_top(a); - bn_check_top(b); - - if (a->top < b->top) { /* hmm... should not be happening */ - ERR_raise(ERR_LIB_BN, BN_R_ARG2_LT_ARG3); - return 0; - } - - size_t top = calculate_max_top(a, b); - - OSSL_FN *rf = bn_acquire_ossl_fn(r, (int)top); - if (rf == NULL) - return 0; - - int ret = OSSL_FN_sub(rf, a->data, b->data); - bn_release(r, (int)top); - - return ret; -} From d8f17e7d37a67dcd15bc6a7de5d3411e781985cc Mon Sep 17 00:00:00 2001 From: Richard Levitte Date: Tue, 7 Jul 2026 16:01:36 +0200 Subject: [PATCH 43/69] OSSL_FN: unwrap the BIGNUM 'mul' function Restore the top-aware BN_mul implementation to its pre-wrap form, removing the OSSL_FN call-site wrapping introduced in: 8f77f825fa ("OSSL_FN: Wrap BIGNUM the 'mul' function around the OSSL_FN 'mul' function") This also reverts the in-body tuning that landed on top of that wrapping: 06bc8339d9 ("Acquire BN_mul result before ctx sizing") a7b662c282 ("Use BN_CTX cached OSSL_FN_CTX in BN_mul() and BN_sqr()") cbc3f0b448 ("Check result of acquiring OSSL_FN or OSSL_FN_CTX") (only the BN_mul portions of a7b662c282 and cbc3f0b448 are affected). The conversion helpers bn_acquire_ossl_fn()/bn_release() and the foundational BN_MAX_WORDS hardening in bn_lib.c/bn_local.h are left in place; BN->OSSL_FN conversion moves to top-level crypto call sites instead. Issue: https://github.com/openssl/project/issues/2020 Assisted-by: Pi:z-ai/glm-5.2 Signed-off-by: Richard Levitte Reviewed-by: Igor Ustinov Reviewed-by: Tomas Mraz MergeDate: Thu Jul 9 15:34:22 2026 (Merged from https://github.com/openssl/openssl/pull/31884) --- crypto/bn/bn_mul.c | 38 ++------------------------------------ 1 file changed, 2 insertions(+), 36 deletions(-) diff --git a/crypto/bn/bn_mul.c b/crypto/bn/bn_mul.c index 5ecbf6ad4b..d887c23225 100644 --- a/crypto/bn/bn_mul.c +++ b/crypto/bn/bn_mul.c @@ -13,45 +13,11 @@ int BN_mul(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, BN_CTX *ctx) { - /* TODO(FIXNUM): TO BE REMOVED */ - if (r->data == NULL || a->data == NULL || b->data == NULL) { - int ret = bn_mul_fixed_top(r, a, b, ctx); + int ret = bn_mul_fixed_top(r, a, b, ctx); - bn_correct_top(r); - bn_check_top(r); - - return ret; - } - - bn_check_top(a); - bn_check_top(b); + bn_correct_top(r); bn_check_top(r); - /* - * Acquiring rf may make r larger. - * If r == a, then a will also become larger. Therefore, max must - * be calculated after rf has been acquired. - */ - size_t top = a->top + b->top; - OSSL_FN *rf = bn_acquire_ossl_fn(r, (int)top); - if (rf == NULL) - return 0; - - size_t max = a->dmax + b->dmax; - - OSSL_FN_CTX *fnctx = bn_ctx_acquire_ossl_fn_ctx(ctx, 1, 1, max); - if (fnctx == NULL) { - bn_release(r, r->top); - return 0; - } - - int ret = OSSL_FN_mul(rf, a->data, b->data, fnctx); - bn_release(r, (int)top); - - if (ret && !BN_is_zero(r)) - r->neg = a->neg ^ b->neg; - - bn_ctx_release_ossl_fn_ctx(ctx); return ret; } From ebc87a83dcf2b6aae786ce79940a935ef7e7cfd8 Mon Sep 17 00:00:00 2001 From: Richard Levitte Date: Tue, 7 Jul 2026 16:01:36 +0200 Subject: [PATCH 44/69] OSSL_FN: unwrap the BIGNUM 'sqr' function Restore the top-aware BN_sqr implementation to its pre-wrap form, removing the OSSL_FN call-site wrapping introduced in: f52bf9d167 ("OSSL_FN: Wrap the BIGNUM 'sqr' function around the OSSL_FN 'sqr' function") This also reverts the in-body tuning that landed on top of that wrapping: 1763d6aff3 ("Acquire BN_sqr result before ctx sizing") a7b662c282 ("Use BN_CTX cached OSSL_FN_CTX in BN_mul() and BN_sqr()") cbc3f0b448 ("Check result of acquiring OSSL_FN or OSSL_FN_CTX") (only the BN_sqr portions of a7b662c282 and cbc3f0b448 are affected). The conversion helpers bn_acquire_ossl_fn()/bn_release() and the foundational BN_MAX_WORDS hardening in bn_lib.c/bn_local.h are left in place; BN->OSSL_FN conversion moves to top-level crypto call sites instead. Issue: https://github.com/openssl/project/issues/2020 Assisted-by: Pi:z-ai/glm-5.2 Signed-off-by: Richard Levitte Reviewed-by: Igor Ustinov Reviewed-by: Tomas Mraz MergeDate: Thu Jul 9 15:34:24 2026 (Merged from https://github.com/openssl/openssl/pull/31884) --- crypto/bn/bn_sqr.c | 35 ++--------------------------------- 1 file changed, 2 insertions(+), 33 deletions(-) diff --git a/crypto/bn/bn_sqr.c b/crypto/bn/bn_sqr.c index 76fc69f8dd..1eb9e4c9ab 100644 --- a/crypto/bn/bn_sqr.c +++ b/crypto/bn/bn_sqr.c @@ -16,42 +16,11 @@ */ int BN_sqr(BIGNUM *r, const BIGNUM *a, BN_CTX *ctx) { - /* TODO(FIXNUM): TO BE REMOVED */ - if (r->data == NULL || a->data == NULL) { - int ret = bn_sqr_fixed_top(r, a, ctx); + int ret = bn_sqr_fixed_top(r, a, ctx); - bn_correct_top(r); - bn_check_top(r); - - return ret; - } - - bn_check_top(a); + bn_correct_top(r); bn_check_top(r); - /* - * Acquiring rf may make r larger. - * If r == a, then a will also become larger. Therefore, max must - * be calculated after rf has been acquired. - */ - size_t top = a->top * 2; - OSSL_FN *rf = bn_acquire_ossl_fn(r, (int)top); - if (rf == NULL) - return 0; - - size_t max = a->dmax * 2; - - OSSL_FN_CTX *fnctx = bn_ctx_acquire_ossl_fn_ctx(ctx, 1, 2, max * 4); - if (fnctx == NULL) { - bn_release(r, r->top); - return 0; - } - - int ret = OSSL_FN_sqr(rf, a->data, fnctx); - bn_release(r, (int)top); - r->neg = 0; - - bn_ctx_release_ossl_fn_ctx(ctx); return ret; } From 9a90994e395dfbbffce12f73b7fc8010b0228e7b Mon Sep 17 00:00:00 2001 From: Richard Levitte Date: Tue, 7 Jul 2026 16:02:54 +0200 Subject: [PATCH 45/69] OSSL_FN: unwrap the BIGNUM shift and compare functions Restore the top-aware implementations of BN_num_bits, BN_ucmp, BN_cmp, BN_lshift1, and BN_lshift to their pre-wrap form, removing the OSSL_FN call-site wrapping (the dual-path `if (a->data == NULL) { legacy } else { OSSL_FN_* }` branches, each marked TODO(FIXNUM): TO BE REMOVED) introduced in: 5072424737 ("OSSL_FN: Wrap BN shift and compare functions around OSSL_FN functions") This also reverts the in-body tuning that landed on top of that wrapping: 1a87fdb411 ("Check result of acquiring OSSL_FN") The foundational BN_MAX_WORDS bound in bn_expand_internal (bn_lib.c) and the bn_check_top dmax assert (bn_local.h), both from e3ae863a2d, are preserved -- restoring bn_lib.c to 5072424737^ keeps them, since they predate the shift/compare wrapper and were never modified by it. The conversion helpers bn_acquire_ossl_fn()/bn_release() are left in place; BN->OSSL_FN conversion moves to top-level crypto call sites instead. Issue: https://github.com/openssl/project/issues/2020 Assisted-by: Pi:z-ai/glm-5.2 Signed-off-by: Richard Levitte Reviewed-by: Igor Ustinov Reviewed-by: Tomas Mraz MergeDate: Thu Jul 9 15:34:26 2026 (Merged from https://github.com/openssl/openssl/pull/31884) --- crypto/bn/bn_lib.c | 133 ++++++++++++++++++------------------------- crypto/bn/bn_shift.c | 79 ++++++++----------------- 2 files changed, 79 insertions(+), 133 deletions(-) diff --git a/crypto/bn/bn_lib.c b/crypto/bn/bn_lib.c index b6b0722f5c..33ada652e5 100644 --- a/crypto/bn/bn_lib.c +++ b/crypto/bn/bn_lib.c @@ -183,34 +183,26 @@ static ossl_inline int bn_num_bits_consttime(const BIGNUM *a) int BN_num_bits(const BIGNUM *a) { + int i = a->top - 1; bn_check_top(a); - /* TODO(FIXNUM): TO BE REMOVED */ - if (a->data == NULL) { - int i = a->top - 1; - - if (a->flags & BN_FLG_CONSTTIME) { - /* - * We assume that BIGNUMs flagged as CONSTTIME have also been expanded - * so that a->dmax is not leaking secret information. - * - * In other words, it's the caller's responsibility to ensure `a` has - * been preallocated in advance to a public length if we hit this - * branch. - * - */ - return bn_num_bits_consttime(a); - } - - if (ossl_unlikely(BN_is_zero(a))) - return 0; - - return ((i * BN_BITS2) + BN_num_bits_word(a->d[i])); + if (a->flags & BN_FLG_CONSTTIME) { + /* + * We assume that BIGNUMs flagged as CONSTTIME have also been expanded + * so that a->dmax is not leaking secret information. + * + * In other words, it's the caller's responsibility to ensure `a` has + * been preallocated in advance to a public length if we hit this + * branch. + * + */ + return bn_num_bits_consttime(a); } - size_t bits = OSSL_FN_num_bits(a->data); + if (ossl_unlikely(BN_is_zero(a))) + return 0; - return bits > INT_MAX ? INT_MAX : (int)bits; + return ((i * BN_BITS2) + BN_num_bits_word(a->d[i])); } static void bn_free_d(BIGNUM *a, bool clear) @@ -744,49 +736,46 @@ int BN_signed_bn2native(const BIGNUM *a, unsigned char *to, int tolen) int BN_ucmp(const BIGNUM *a, const BIGNUM *b) { + int i; + BN_ULONG t1, t2, *ap, *bp; + + ap = a->d; + bp = b->d; + + if (BN_get_flags(a, BN_FLG_CONSTTIME) + && a->top == b->top) { + int res = 0; + + for (i = 0; i < b->top; i++) { + res = constant_time_select_int((int)constant_time_lt_bn(ap[i], bp[i]), + -1, res); + res = constant_time_select_int((int)constant_time_lt_bn(bp[i], ap[i]), + 1, res); + } + return res; + } + bn_check_top(a); bn_check_top(b); - /* TODO(FIXNUM): TO BE REMOVED */ - if (a->data == NULL || b->data == NULL) { - int i; - BN_ULONG t1, t2, *ap, *bp; + i = a->top - b->top; + if (i != 0) + return i; - ap = a->d; - bp = b->d; - - if (BN_get_flags(a, BN_FLG_CONSTTIME) - && a->top == b->top) { - int res = 0; - - for (i = 0; i < b->top; i++) { - res = constant_time_select_int((int)constant_time_lt_bn(ap[i], bp[i]), - -1, res); - res = constant_time_select_int((int)constant_time_lt_bn(bp[i], ap[i]), - 1, res); - } - return res; - } - - i = a->top - b->top; - if (i != 0) - return i; - - for (i = a->top - 1; i >= 0; i--) { - t1 = ap[i]; - t2 = bp[i]; - if (t1 != t2) - return ((t1 > t2) ? 1 : -1); - } - return 0; + for (i = a->top - 1; i >= 0; i--) { + t1 = ap[i]; + t2 = bp[i]; + if (t1 != t2) + return ((t1 > t2) ? 1 : -1); } - - return OSSL_FN_cmp(a->data, b->data); + return 0; } int BN_cmp(const BIGNUM *a, const BIGNUM *b) { + int i; int gt, lt; + BN_ULONG t1, t2; if ((a == NULL) || (b == NULL)) { if (a != NULL) @@ -814,31 +803,17 @@ int BN_cmp(const BIGNUM *a, const BIGNUM *b) lt = 1; } - /* TODO(FIXNUM): TO BE REMOVED */ - if (a->data == NULL || b->data == NULL) { - int i; - BN_ULONG t1, t2; - - if (a->top > b->top) - return gt; - if (a->top < b->top) - return lt; - for (i = a->top - 1; i >= 0; i--) { - t1 = a->d[i]; - t2 = b->d[i]; - if (t1 > t2) - return gt; - if (t1 < t2) - return lt; - } - return 0; - } - - switch (OSSL_FN_cmp(a->data, b->data)) { - case 1: + if (a->top > b->top) return gt; - case -1: + if (a->top < b->top) return lt; + for (i = a->top - 1; i >= 0; i--) { + t1 = a->d[i]; + t2 = b->d[i]; + if (t1 > t2) + return gt; + if (t1 < t2) + return lt; } return 0; } diff --git a/crypto/bn/bn_shift.c b/crypto/bn/bn_shift.c index 2fdb5fc9f0..2e6f7c7401 100644 --- a/crypto/bn/bn_shift.c +++ b/crypto/bn/bn_shift.c @@ -13,46 +13,33 @@ int BN_lshift1(BIGNUM *r, const BIGNUM *a) { + register BN_ULONG *ap, *rp, t, c; + int i; + bn_check_top(r); bn_check_top(a); - /* TODO(FIXNUM): TO BE REMOVED */ - if (r->data == NULL || a->data == NULL) { - register BN_ULONG *ap, *rp, t, c; - int i; - - if (r != a) { - r->neg = a->neg; - if (bn_wexpand(r, a->top + 1) == NULL) - return 0; - bn_set_top(r, a->top); - } else { - if (bn_wexpand(r, a->top + 1) == NULL) - return 0; - } - ap = a->d; - rp = r->d; - c = 0; - for (i = 0; i < a->top; i++) { - t = *(ap++); - *(rp++) = ((t << 1) | c) & BN_MASK2; - c = t >> (BN_BITS2 - 1); - } - *rp = c; - bn_set_top(r, r->top + (int)c); - bn_check_top(r); - return 1; + if (r != a) { + r->neg = a->neg; + if (bn_wexpand(r, a->top + 1) == NULL) + return 0; + bn_set_top(r, a->top); + } else { + if (bn_wexpand(r, a->top + 1) == NULL) + return 0; } - - size_t top = a->top + 1; - OSSL_FN *rf = bn_acquire_ossl_fn(r, (int)top); - if (rf == NULL) - return 0; - int ret = OSSL_FN_lshift1(rf, a->data); - bn_release(r, (int)top); - - BN_set_negative(r, ret && a->neg); - return ret; + ap = a->d; + rp = r->d; + c = 0; + for (i = 0; i < a->top; i++) { + t = *(ap++); + *(rp++) = ((t << 1) | c) & BN_MASK2; + c = t >> (BN_BITS2 - 1); + } + *rp = c; + bn_set_top(r, r->top + (int)c); + bn_check_top(r); + return 1; } int BN_rshift1(BIGNUM *r, const BIGNUM *a) @@ -99,27 +86,11 @@ int BN_lshift(BIGNUM *r, const BIGNUM *a, int n) return 0; } - /* TODO(FIXNUM): TO BE REMOVED */ - if (r->data == NULL || a->data == NULL) { - ret = bn_lshift_fixed_top(r, a, n); - - bn_correct_top(r); - bn_check_top(r); - - return ret; - } + ret = bn_lshift_fixed_top(r, a, n); + bn_correct_top(r); bn_check_top(r); - bn_check_top(a); - size_t top = a->top + n / BN_BITS2 + 1; - OSSL_FN *rf = bn_acquire_ossl_fn(r, (int)top); - if (rf == NULL) - return 0; - ret = OSSL_FN_lshift(rf, a->data, n); - bn_release(r, (int)top); - - BN_set_negative(r, ret && a->neg); return ret; } From 312250036e1a0f268559ee40d536c8999c807d94 Mon Sep 17 00:00:00 2001 From: Richard Levitte Date: Tue, 7 Jul 2026 14:08:15 +0200 Subject: [PATCH 46/69] OSSL_FN: Expose BN OSSL_FN acquire helpers Move the BIGNUM to OSSL_FN acquire/release helpers out of bn_local.h and declare them in the internal BN header. This makes them available to call sites that need to operate temporarily on the fixed-width representation. Assisted-by: Pi:openai/gpt-5.5 Signed-off-by: Richard Levitte Reviewed-by: Igor Ustinov Reviewed-by: Tomas Mraz MergeDate: Sun Jul 12 08:37:00 2026 (Merged from https://github.com/openssl/openssl/pull/31881) --- crypto/bn/bn_lib.c | 27 ++++++++++++++++++++++ crypto/bn/bn_local.h | 54 -------------------------------------------- include/crypto/bn.h | 31 +++++++++++++++++++++++++ 3 files changed, 58 insertions(+), 54 deletions(-) diff --git a/crypto/bn/bn_lib.c b/crypto/bn/bn_lib.c index 33ada652e5..6c3a6d3df6 100644 --- a/crypto/bn/bn_lib.c +++ b/crypto/bn/bn_lib.c @@ -333,6 +333,33 @@ BIGNUM *bn_expand2(BIGNUM *b, int words) return b; } +OSSL_FN *bn_acquire_ossl_fn(BIGNUM *b, int limbs) +{ + if (ossl_unlikely(b == NULL)) + return NULL; + + if (bn_wexpand(b, limbs) == NULL) + return NULL; + /* TODO(FIXNUM): should we add a flag bit for this in b->flags ? */ + return b->data; +} + +void bn_release(BIGNUM *b, int limbs) +{ + if (ossl_unlikely(b == NULL || b->data == NULL)) + return; + + int fixed_top = (b->flags & BN_FLG_FIXED_TOP) != 0; + + bn_set_top(b, limbs); + + /* Don't correct top if BN_FLG_FIXED_TOP was set */ + if (fixed_top) + return; + + bn_correct_top(b); +} + BIGNUM *BN_dup(const BIGNUM *a) { BIGNUM *t; diff --git a/crypto/bn/bn_local.h b/crypto/bn/bn_local.h index 83ebc5ea94..d6813efed7 100644 --- a/crypto/bn/bn_local.h +++ b/crypto/bn/bn_local.h @@ -710,58 +710,4 @@ static ossl_inline int bn_set_top(BIGNUM *b, int newtop) return b->top; } -/* - * bn_acquire_ossl_fn() and bn_release() work in tandem, and are - * most useful in OSSL_FN_ wrapper functions, specifically with the - * BIGNUM in which an operation result is written. - */ - -/** - * Acquire the OSSL_FN from a BIGNUM. The BIGNUM should no longer be - * used until bn_release() is called. - * - * @param[in] b The BIGNUM instance to get an OSSL_FN from - * @param[in] limbs The minimum number of limbs 'b' should be expanded to. - * Note that this doesn't set 'top', that's done by - * bn_release(). - * @returns the OSSL_FN instance of the BIGNUM, if there is one - * @pre b and b->data must not be NULL - */ -static ossl_inline OSSL_FN *bn_acquire_ossl_fn(BIGNUM *b, int limbs) -{ - if (ossl_unlikely(b == NULL || b->data == NULL)) - return NULL; - - if (bn_wexpand(b, limbs) == NULL) - return NULL; - /* TODO(FIXNUM): should we add a flag bit for this in b->flags ? */ - return b->data; -} - -/** - * Release the BIGNUM from which the OSSL_FN was acquired. This will - * adjust the BIGNUM to what was done with its OSSL_FN, and the BIGNUM - * can again be used with BN_ functions. - * - * @param[in] b The BIGNUM instance to release - * @param[in] limbs The maximum number of significant limbs. This sets - * 'top'. - * @pre b and b->data must not be NULL - */ -static ossl_inline void bn_release(BIGNUM *b, int limbs) -{ - if (ossl_unlikely(b == NULL || b->data == NULL)) - return; - - int fixed_top = (b->flags & BN_FLG_FIXED_TOP) != 0; - - bn_set_top(b, limbs); - - /* Don't correct top if BN_FLG_FIXED_TOP was set */ - if (fixed_top) - return; - - bn_correct_top(b); -} - #endif diff --git a/include/crypto/bn.h b/include/crypto/bn.h index 915e10c688..5577f0150b 100644 --- a/include/crypto/bn.h +++ b/include/crypto/bn.h @@ -20,6 +20,37 @@ BIGNUM *bn_expand2(BIGNUM *a, int words); void bn_correct_top(BIGNUM *a); +/* + * bn_acquire_ossl_fn() and bn_release() work in tandem, and are + * most useful at call sites that temporarily operate on a BIGNUM's + * fixed-width OSSL_FN representation. + */ + +/** + * Acquire the OSSL_FN from a BIGNUM. The BIGNUM should no longer be + * used until bn_release() is called. + * + * @param[in] b The BIGNUM instance to get an OSSL_FN from + * @param[in] limbs The minimum number of limbs 'b' should be expanded to. + * Note that this doesn't set 'top', that's done by + * bn_release(). + * @returns the OSSL_FN instance of the BIGNUM, if there is one + * @pre b must not be NULL + */ +OSSL_FN *bn_acquire_ossl_fn(BIGNUM *b, int limbs); + +/** + * Release the BIGNUM from which the OSSL_FN was acquired. This will + * adjust the BIGNUM to what was done with its OSSL_FN, and the BIGNUM + * can again be used with BN_ functions. + * + * @param[in] b The BIGNUM instance to release + * @param[in] limbs The maximum number of significant limbs. This sets + * 'top'. + * @pre b and b->data must not be NULL + */ +void bn_release(BIGNUM *b, int limbs); + /* * Determine the modified width-(w+1) Non-Adjacent Form (wNAF) of 'scalar'. * This is an array r[] of values that are either zero or odd with an From 0df3c5e1de3676d6b9a8028d5f901c121a4069df Mon Sep 17 00:00:00 2001 From: Richard Levitte Date: Thu, 9 Jul 2026 12:39:10 +0200 Subject: [PATCH 47/69] OSSL_FN: Add read-only BIGNUM OSSL_FN accessor Add bn_get_ossl_fn(), a read-only counterpart to bn_acquire_ossl_fn(). Unlike the latter, it neither acquires nor resizes the BIGNUM: the BIGNUM stays usable with BN_ functions, no bn_release() is needed, and the returned OSSL_FN keeps the BIGNUM's current allocated width. This suits read-only operands at OSSL_FN call sites. Assisted-by: Pi:openai/gpt-5.5 Signed-off-by: Richard Levitte Reviewed-by: Igor Ustinov Reviewed-by: Tomas Mraz MergeDate: Sun Jul 12 08:37:02 2026 (Merged from https://github.com/openssl/openssl/pull/31881) --- crypto/bn/bn_lib.c | 8 ++++++++ include/crypto/bn.h | 14 ++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/crypto/bn/bn_lib.c b/crypto/bn/bn_lib.c index 6c3a6d3df6..e3ed1b29ea 100644 --- a/crypto/bn/bn_lib.c +++ b/crypto/bn/bn_lib.c @@ -360,6 +360,14 @@ void bn_release(BIGNUM *b, int limbs) bn_correct_top(b); } +OSSL_FN *bn_get_ossl_fn(const BIGNUM *bn) +{ + if (ossl_unlikely(bn == NULL)) + return NULL; + + return bn->data; +} + BIGNUM *BN_dup(const BIGNUM *a) { BIGNUM *t; diff --git a/include/crypto/bn.h b/include/crypto/bn.h index 5577f0150b..8506958342 100644 --- a/include/crypto/bn.h +++ b/include/crypto/bn.h @@ -51,6 +51,20 @@ OSSL_FN *bn_acquire_ossl_fn(BIGNUM *b, int limbs); */ void bn_release(BIGNUM *b, int limbs); +/** + * Get the OSSL_FN from a BIGNUM for read-only access. Unlike + * bn_acquire_ossl_fn(), this does not acquire or resize the BIGNUM: + * the BIGNUM remains fully usable with BN_ functions, no bn_release() + * call is needed, and the returned OSSL_FN keeps the BIGNUM's current + * allocated width without any expansion. Use this for read-only + * operands; use bn_acquire_ossl_fn() for writable results. + * + * @param[in] bn The BIGNUM instance to get an OSSL_FN from + * @returns the OSSL_FN instance of the BIGNUM, or NULL if it has none + * @pre bn must not be NULL + */ +OSSL_FN *bn_get_ossl_fn(const BIGNUM *bn); + /* * Determine the modified width-(w+1) Non-Adjacent Form (wNAF) of 'scalar'. * This is an array r[] of values that are either zero or odd with an From 5c2f95c4b0eea4057a2712547856fb1a5f2fa72d Mon Sep 17 00:00:00 2001 From: Richard Levitte Date: Thu, 9 Jul 2026 13:40:16 +0200 Subject: [PATCH 48/69] OSSL_FN: Add OSSL_FN stanza arithmetic test Add fntest as a stanza-driven arithmetic test for the OSSL_FN operations currently available in this branch. The test reuses the existing BN input files and reports known but unsupported stanza types as skipped. Wire the new test program into the build and add a test_fn recipe for sum, multiplication, square, and left-shift coverage. Assisted-by: Pi:openai/gpt-5.5 Assisted-by: Pi:z-ai/glm-5.2 Signed-off-by: Richard Levitte Resolves: https://github.com/openssl/project/issues/2021 Reviewed-by: Igor Ustinov Reviewed-by: Tomas Mraz MergeDate: Sun Jul 12 08:37:03 2026 (Merged from https://github.com/openssl/openssl/pull/31881) --- test/build.info | 5 + test/fntest.c | 436 ++++++++++++++++++++++++++++++++++ test/recipes/11-test_fn.t | 22 ++ test/recipes/11-test_fn_api.t | 5 - 4 files changed, 463 insertions(+), 5 deletions(-) create mode 100644 test/fntest.c create mode 100644 test/recipes/11-test_fn.t diff --git a/test/build.info b/test/build.info index 85b768b758..9f824d1d73 100644 --- a/test/build.info +++ b/test/build.info @@ -1137,6 +1137,11 @@ IF[{- !$disabled{tests} -}] INCLUDE[fn_api_test]=.. ../include ../crypto/fn ../apps/include DEPEND[fn_api_test]=../libcrypto.a libtestutil.a + PROGRAMS{noinst}=fntest + SOURCE[fntest]=fntest.c + INCLUDE[fntest]=.. ../include ../crypto/fn ../apps/include + DEPEND[fntest]=../libcrypto.a libtestutil.a + SOURCE[bn_internal_test]=bn_internal_test.c INCLUDE[bn_internal_test]=.. ../include ../crypto/bn ../apps/include DEPEND[bn_internal_test]=../libcrypto.a libtestutil.a diff --git a/test/fntest.c b/test/fntest.c new file mode 100644 index 0000000000..72f4b5aae0 --- /dev/null +++ b/test/fntest.c @@ -0,0 +1,436 @@ +/* + * Copyright 2026 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#include +#include +#include +#include +#include +#include "crypto/bn.h" +#include "crypto/fn.h" +#include "crypto/fn_intern.h" +#include "internal/nelem.h" +#include "testutil.h" + +/* + * This is a stanza-driven arithmetic test for OSSL_FN. Non-stanza API tests + * belong in fn_api_test. + */ + +typedef struct filetest_st { + const char *name; + int (*func)(STANZA *s); + int skipped; +} FILETEST; + +static const char *findattr(STANZA *s, const char *key) +{ + int i = s->numpairs; + PAIR *pp = s->pairs; + + for (; --i >= 0; pp++) + if (OPENSSL_strcasecmp(pp->key, key) == 0) + return pp->value; + return NULL; +} + +static int parseBN(BIGNUM **out, const char *in) +{ + *out = NULL; + return BN_hex2bn(out, in); +} + +static BIGNUM *getBN(STANZA *s, const char *attribute) +{ + const char *hex; + BIGNUM *ret = NULL; + + if ((hex = findattr(s, attribute)) == NULL) { + TEST_error("%s:%d: Can't find %s", s->test_file, s->start, attribute); + return NULL; + } + + if (parseBN(&ret, hex) != (int)strlen(hex)) { + TEST_error("Could not decode '%s'", hex); + BN_free(ret); + return NULL; + } + return ret; +} + +static int getint(STANZA *s, int *out, const char *attribute) +{ + BIGNUM *ret; + BN_ULONG word; + int st = 0; + + if (!TEST_ptr(ret = getBN(s, attribute)) + || !TEST_uint64_t_le(word = BN_get_word(ret), INT_MAX)) + goto err; + + *out = (int)word; + st = 1; +err: + BN_free(ret); + return st; +} + +static int equalBN(const char *op, const BIGNUM *expected, const BIGNUM *actual) +{ + if (!TEST_BN_eq(expected, actual)) { + TEST_error("unexpected %s value", op); + return 0; + } + return 1; +} + +/* + * Number of limbs needed to hold bn's value, equivalent to the (properly + * adjusted) BIGNUM 'top' field, which is not directly accessible here. + */ +static int limbs(const BIGNUM *bn) +{ + int ret = (BN_num_bits(bn) + BN_BITS2 - 1) / BN_BITS2; + + return ret > 0 ? ret : 1; +} + +static int set_result_addsub(OSSL_FN *r, OSSL_FN *a, int a_neg, + OSSL_FN *b, int b_neg, int *neg) +{ + int cmp; + + *neg = 0; + if (a_neg == b_neg) { + *neg = a_neg; + return OSSL_FN_add(r, a, b); + } + + cmp = OSSL_FN_cmp(a, b); + if (cmp >= 0) { + *neg = a_neg; + return OSSL_FN_sub(r, a, b); + } + + *neg = b_neg; + return OSSL_FN_sub(r, b, a); +} + +static int file_sum(STANZA *s) +{ + BIGNUM *a = NULL, *b = NULL, *sum = NULL, *ret = NULL; + OSSL_FN *af = NULL, *bf = NULL, *rf = NULL; + int a_neg = 0, b_neg = 0, r_neg = 0, st = 0; + int r_acq = 0; + int nlimbs = 0; + + if (!TEST_ptr(a = getBN(s, "A")) + || !TEST_ptr(b = getBN(s, "B")) + || !TEST_ptr(sum = getBN(s, "Sum")) + || !TEST_ptr(ret = BN_new())) + goto err; + + a_neg = BN_is_negative(a); + b_neg = BN_is_negative(b); + nlimbs = limbs(sum); + + if (!TEST_ptr(af = bn_get_ossl_fn(a)) + || !TEST_ptr(bf = bn_get_ossl_fn(b)) + || !TEST_ptr(rf = bn_acquire_ossl_fn(ret, nlimbs))) + goto err; + r_acq = 1; + + if (!TEST_true(set_result_addsub(rf, af, a_neg, bf, b_neg, &r_neg))) + goto err; + bn_release(ret, nlimbs); + BN_set_negative(ret, r_neg); + r_acq = 0; + if (!equalBN("A + B", sum, ret)) + goto err; + + st = 1; +err: + if (r_acq) + bn_release(ret, nlimbs); + BN_free(a); + BN_free(b); + BN_free(sum); + BN_free(ret); + return st; +} + +static OSSL_FN_CTX *new_mul_ctx(int nlimbs) +{ + return OSSL_FN_CTX_new(NULL, 1, 1, nlimbs * 2); +} + +static int file_product(STANZA *s) +{ + BIGNUM *a = NULL, *b = NULL, *product = NULL, *ret = NULL; + OSSL_FN *af = NULL, *bf = NULL, *rf = NULL; + OSSL_FN_CTX *ctx = NULL; + int a_neg = 0, b_neg = 0, r_neg = 0, st = 0; + int r_acq = 0; + int nlimbs = 0; + + if (!TEST_ptr(a = getBN(s, "A")) + || !TEST_ptr(b = getBN(s, "B")) + || !TEST_ptr(product = getBN(s, "Product")) + || !TEST_ptr(ret = BN_new())) + goto err; + + a_neg = BN_is_negative(a); + b_neg = BN_is_negative(b); + r_neg = a_neg ^ b_neg; + nlimbs = limbs(product); + + if (!TEST_ptr(af = bn_get_ossl_fn(a)) + || !TEST_ptr(bf = bn_get_ossl_fn(b)) + || !TEST_ptr(rf = bn_acquire_ossl_fn(ret, nlimbs))) + goto err; + r_acq = 1; + if (!TEST_ptr(ctx = new_mul_ctx(nlimbs))) + goto err; + + if (!TEST_true(OSSL_FN_mul(rf, af, bf, ctx))) + goto err; + bn_release(ret, nlimbs); + BN_set_negative(ret, r_neg); + r_acq = 0; + if (!equalBN("A * B", product, ret)) + goto err; + + st = 1; +err: + if (r_acq) + bn_release(ret, nlimbs); + OSSL_FN_CTX_free(ctx); + BN_free(a); + BN_free(b); + BN_free(product); + BN_free(ret); + return st; +} + +static OSSL_FN_CTX *new_sqr_ctx(int nlimbs) +{ + return OSSL_FN_CTX_new(NULL, 1, 2, nlimbs * 4); +} + +static int file_square(STANZA *s) +{ + BIGNUM *a = NULL, *square = NULL, *ret = NULL; + OSSL_FN *af = NULL, *rf = NULL; + OSSL_FN_CTX *ctx = NULL; + int st = 0; + int r_acq = 0; + int nlimbs = 0; + + if (!TEST_ptr(a = getBN(s, "A")) + || !TEST_ptr(square = getBN(s, "Square")) + || !TEST_ptr(ret = BN_new())) + goto err; + + nlimbs = limbs(square); + + if (!TEST_ptr(af = bn_get_ossl_fn(a)) + || !TEST_ptr(rf = bn_acquire_ossl_fn(ret, nlimbs))) + goto err; + r_acq = 1; + if (!TEST_ptr(ctx = new_sqr_ctx(nlimbs))) + goto err; + + if (!TEST_true(OSSL_FN_sqr(rf, af, ctx))) + goto err; + bn_release(ret, nlimbs); + BN_set_negative(ret, 0); + r_acq = 0; + if (!equalBN("A^2", square, ret)) + goto err; + + st = 1; +err: + if (r_acq) + bn_release(ret, nlimbs); + OSSL_FN_CTX_free(ctx); + BN_free(a); + BN_free(square); + BN_free(ret); + return st; +} + +static int file_lshift1(STANZA *s) +{ + BIGNUM *a = NULL, *lshift1 = NULL, *ret = NULL; + OSSL_FN *af = NULL, *rf = NULL; + int a_neg = 0, st = 0; + int r_acq = 0; + int nlimbs = 0; + + if (!TEST_ptr(a = getBN(s, "A")) + || !TEST_ptr(lshift1 = getBN(s, "LShift1")) + || !TEST_ptr(ret = BN_new())) + goto err; + + a_neg = BN_is_negative(a); + nlimbs = limbs(lshift1); + + if (!TEST_ptr(af = bn_get_ossl_fn(a)) + || !TEST_ptr(rf = bn_acquire_ossl_fn(ret, nlimbs))) + goto err; + r_acq = 1; + + if (!TEST_true(OSSL_FN_lshift1(rf, af))) + goto err; + bn_release(ret, nlimbs); + BN_set_negative(ret, a_neg); + r_acq = 0; + if (!equalBN("A << 1", lshift1, ret)) + goto err; + + st = 1; +err: + if (r_acq) + bn_release(ret, nlimbs); + BN_free(a); + BN_free(lshift1); + BN_free(ret); + return st; +} + +static int file_lshift(STANZA *s) +{ + BIGNUM *a = NULL, *lshift = NULL, *ret = NULL; + OSSL_FN *af = NULL, *rf = NULL; + int a_neg = 0, n = 0, st = 0; + int r_acq = 0; + int nlimbs = 0; + + if (!TEST_ptr(a = getBN(s, "A")) + || !TEST_ptr(lshift = getBN(s, "LShift")) + || !TEST_ptr(ret = BN_new()) + || !getint(s, &n, "N")) + goto err; + + a_neg = BN_is_negative(a); + nlimbs = limbs(lshift); + + if (!TEST_ptr(af = bn_get_ossl_fn(a)) + || !TEST_ptr(rf = bn_acquire_ossl_fn(ret, nlimbs))) + goto err; + r_acq = 1; + + if (!TEST_true(OSSL_FN_lshift(rf, af, n))) + goto err; + bn_release(ret, nlimbs); + BN_set_negative(ret, a_neg); + r_acq = 0; + if (!equalBN("A << N", lshift, ret)) + goto err; + + st = 1; +err: + if (r_acq) + bn_release(ret, nlimbs); + BN_free(a); + BN_free(lshift); + BN_free(ret); + return st; +} + +static FILETEST filetests[] = { + { "Sum", file_sum, 0 }, + { "LShift1", file_lshift1, 0 }, + { "LShift", file_lshift, 0 }, + { "RShift", NULL, 0 }, + { "Square", file_square, 0 }, + { "Product", file_product, 0 }, + { "Quotient", NULL, 0 }, + { "ModMul", NULL, 0 }, + { "ModSqr", NULL, 0 }, + { "ModExp", NULL, 0 }, + { "Exp", NULL, 0 }, + { "ModSqrt", NULL, 0 }, + { "GCD", NULL, 0 }, +}; + +static int file_test_run(STANZA *s) +{ + const FILETEST *tp = filetests; + size_t i; + + for (i = 0; i < OSSL_NELEM(filetests); i++, tp++) { + if (findattr(s, tp->name) != NULL) { + if (tp->func == NULL) { + filetests[i].skipped++; + return 1; + } + if (!tp->func(s)) { + TEST_info("%s:%d: Failed %s test", + s->test_file, s->start, tp->name); + return 0; + } + return 1; + } + } + + TEST_info("%s:%d: Unknown test, skipped", s->test_file, s->start); + return 1; +} + +static int run_file_tests(int i) +{ + STANZA *s = NULL; + char *testfile = test_get_argument(i); + int c; + size_t j; + + for (j = 0; j < OSSL_NELEM(filetests); j++) + filetests[j].skipped = 0; + + if (!TEST_ptr(s = OPENSSL_zalloc(sizeof(*s)))) + return 0; + if (!test_start_file(s, testfile)) { + OPENSSL_free(s); + return 0; + } + + while (!BIO_eof(s->fp) && test_readstanza(s)) { + if (s->numpairs == 0) + continue; + if (!file_test_run(s)) + s->errors++; + s->numtests++; + test_clearstanza(s); + } + test_end_file(s); + + for (j = 0; j < OSSL_NELEM(filetests); j++) + if (filetests[j].skipped > 0) + TEST_info("%s: skipped %d unsupported %s stanzas", + testfile, filetests[j].skipped, filetests[j].name); + + c = s->errors; + OPENSSL_free(s); + + return c == 0; +} + +OPT_TEST_DECLARE_USAGE("file...\n") + +int setup_tests(void) +{ + size_t n = test_get_argument_count(); + + if (!TEST_size_t_gt(n, 0)) + return 0; + + ADD_ALL_TESTS(run_file_tests, (int)n); + return 1; +} diff --git a/test/recipes/11-test_fn.t b/test/recipes/11-test_fn.t new file mode 100644 index 0000000000..1eff2e7640 --- /dev/null +++ b/test/recipes/11-test_fn.t @@ -0,0 +1,22 @@ +#! /usr/bin/env perl +# Copyright 2026 The OpenSSL Project Authors. All Rights Reserved. +# +# Licensed under the Apache License 2.0 (the "License"). You may not use +# this file except in compliance with the License. You can obtain a copy +# in the file LICENSE in the source distribution or at +# https://www.openssl.org/source/license.html + +use strict; +use warnings; + +use OpenSSL::Test qw/:DEFAULT srctop_file/; +setup("test_fn"); + +my @files = qw( bnmul.txt bnshift.txt bnsum.txt ); + +plan tests => scalar(@files); + +foreach my $f (@files) { + ok(run(test(["fntest", srctop_file("test", "recipes", "10-test_bn_data", $f)])), + "running fntest $f"); +} diff --git a/test/recipes/11-test_fn_api.t b/test/recipes/11-test_fn_api.t index 0bec5d2a83..293cd64822 100644 --- a/test/recipes/11-test_fn_api.t +++ b/test/recipes/11-test_fn_api.t @@ -9,11 +9,6 @@ use strict; use OpenSSL::Test; # get 'plan' use OpenSSL::Test::Simple; -use OpenSSL::Test::Utils; - setup("test_fn_api"); -plan skip_all => "This test is unsupported in a shared library build on Windows" - if $^O eq 'MSWin32' && !disabled("shared"); - simple_test("test_fn_api", "fn_api_test"); From 3923fd51b1e6d4f5d56800bb19bec7509729df5e Mon Sep 17 00:00:00 2001 From: Richard Levitte Date: Wed, 8 Jul 2026 17:53:29 +0200 Subject: [PATCH 49/69] OSSL_FN: unwrap BN_CTX's wrapping of OSSL_FN_CTX The BN_CTX -> OSSL_FN_CTX acquisition machinery (bn_ctx_acquire_ossl_fn_ctx / bn_ctx_release_ossl_fn_ctx and the fn_ctx field on struct bignum_ctx) existed only to serve the BN_* arithmetic wrappers that delegated to OSSL_FN. Those wrappers were removed in previous commits, leaving the machinery orphaned except for the self-test that exercised it; OSSL_FN consumers obtain their OSSL_FN_CTX directly via OSSL_FN_CTX_new() / OSSL_FN_CTX_secure_new(). Remove the wrapping machinery and its dedicated test (test_bn_ctx_fn_ctx) by reverting: e3213b0c03 ("Add OSSL_FN_CTX integration with BN_CTX") Assisted-by: Pi:z-ai/glm-5.2 Signed-off-by: Richard Levitte Reviewed-by: Dmitry Belyavskiy Reviewed-by: Igor Ustinov MergeDate: Tue Jul 14 11:06:24 2026 (Merged from https://github.com/openssl/openssl/pull/31895) --- crypto/bn/bn_ctx.c | 46 --------------------- include/crypto/bn.h | 9 ----- test/bn_internal_test.c | 88 ----------------------------------------- 3 files changed, 143 deletions(-) diff --git a/crypto/bn/bn_ctx.c b/crypto/bn/bn_ctx.c index 785c3cb413..201b356561 100644 --- a/crypto/bn/bn_ctx.c +++ b/crypto/bn/bn_ctx.c @@ -75,8 +75,6 @@ struct bignum_ctx { int flags; /* The library context */ OSSL_LIB_CTX *libctx; - /* OSSL_FN_CTX for OSSL_FN wrapper functions */ - OSSL_FN_CTX *fn_ctx; }; #ifndef FIPS_MODULE @@ -181,7 +179,6 @@ void BN_CTX_free(BN_CTX *ctx) #endif BN_STACK_finish(&ctx->stack); BN_POOL_finish(&ctx->pool); - OSSL_FN_CTX_free(ctx->fn_ctx); OPENSSL_free(ctx); } @@ -243,49 +240,6 @@ BIGNUM *BN_CTX_get(BN_CTX *ctx) return ret; } -OSSL_FN_CTX *bn_ctx_acquire_ossl_fn_ctx(BN_CTX *ctx, size_t max_n_frames, - size_t max_n_numbers, size_t max_n_limbs) -{ - size_t needed; - - if (ctx == NULL) - return NULL; - - needed = ossl_fn_ctx_calculate_arena_size(max_n_frames, max_n_numbers, - max_n_limbs); - - if (ctx->fn_ctx != NULL) { - if (ctx->fn_ctx->msize >= needed) { - /* - * Existing context is large enough. Ensure no frames are - * outstanding (callers are expected to have ended them). - */ - assert(ctx->fn_ctx->last_frame == NULL); - return ctx->fn_ctx; - } - /* Too small, free and recreate */ - OSSL_FN_CTX_free(ctx->fn_ctx); - ctx->fn_ctx = NULL; - } - - if (ctx->flags & BN_FLG_SECURE) - ctx->fn_ctx = OSSL_FN_CTX_secure_new(ctx->libctx, max_n_frames, - max_n_numbers, max_n_limbs); - else - ctx->fn_ctx = OSSL_FN_CTX_new(ctx->libctx, max_n_frames, - max_n_numbers, max_n_limbs); - - return ctx->fn_ctx; -} - -void bn_ctx_release_ossl_fn_ctx(BN_CTX *ctx) -{ - if (ctx == NULL || ctx->fn_ctx == NULL) - return; - - assert(ctx->fn_ctx->last_frame == NULL); -} - OSSL_LIB_CTX *ossl_bn_get_libctx(BN_CTX *ctx) { if (ctx == NULL) diff --git a/include/crypto/bn.h b/include/crypto/bn.h index 8506958342..8e63b3a844 100644 --- a/include/crypto/bn.h +++ b/include/crypto/bn.h @@ -171,15 +171,6 @@ int ossl_bn_rsa_fips186_5_derive_prime(BIGNUM *Y, BIGNUM *X, const BIGNUM *Xin, OSSL_LIB_CTX *ossl_bn_get_libctx(BN_CTX *ctx); -/* - * bn_ctx_acquire_ossl_fn_ctx() and bn_ctx_release_ossl_fn_ctx() work - * in tandem. They manage an OSSL_FN_CTX that is cached inside a BN_CTX - * for use by BIGNUM wrapper functions that delegate to OSSL_FN. - */ -OSSL_FN_CTX *bn_ctx_acquire_ossl_fn_ctx(BN_CTX *ctx, size_t max_n_frames, - size_t max_n_numbers, size_t max_n_limbs); -void bn_ctx_release_ossl_fn_ctx(BN_CTX *ctx); - extern const BIGNUM ossl_bn_inv_sqrt_2; #if defined(OPENSSL_SYS_LINUX) && !defined(FIPS_MODULE) && defined(__s390x__) \ diff --git a/test/bn_internal_test.c b/test/bn_internal_test.c index df4876512b..43960937a6 100644 --- a/test/bn_internal_test.c +++ b/test/bn_internal_test.c @@ -21,8 +21,6 @@ #include "testutil.h" #include "bn_prime.h" #include "crypto/bn.h" -#include "crypto/fn.h" -#include "crypto/fn_intern.h" static BN_CTX *ctx; @@ -88,91 +86,6 @@ err: return ret; } -static int test_bn_ctx_fn_ctx(void) -{ - int ret = 1; - BN_CTX *bnctx = NULL; - OSSL_FN_CTX *fnctx = NULL; - OSSL_FN *fn = NULL; - const void *token = NULL; - - /* Test non-secure BN_CTX */ - if (!TEST_ptr(bnctx = BN_CTX_new())) - return 0; - - /* Acquire should create a new OSSL_FN_CTX */ - if (!TEST_ptr(fnctx = bn_ctx_acquire_ossl_fn_ctx(bnctx, 1, 1, 32))) - ret = 0; - - /* The returned pointer should be cached inside BN_CTX */ - if (ret && !TEST_ptr_eq(fnctx, bn_ctx_acquire_ossl_fn_ctx(bnctx, 1, 1, 32))) - ret = 0; - - /* Re-acquire with same size should return the same cached context */ - if (ret && !TEST_ptr_eq(fnctx, bn_ctx_acquire_ossl_fn_ctx(bnctx, 1, 1, 32))) - ret = 0; - - /* Use the OSSL_FN_CTX */ - if (ret) { - if (!TEST_ptr(token = OSSL_FN_CTX_start(fnctx)) - || !TEST_ptr(fn = OSSL_FN_CTX_get_limbs(fnctx, 4)) - || !TEST_true(OSSL_FN_CTX_end(fnctx, token))) - ret = 0; - } - - /* - * Release does NOT free the cached OSSL_FN_CTX; it just asserts - * no frames are outstanding. Re-acquire should return the same - * cached pointer. - */ - bn_ctx_release_ossl_fn_ctx(bnctx); - if (ret && !TEST_ptr_eq(fnctx, bn_ctx_acquire_ossl_fn_ctx(bnctx, 1, 1, 32))) - ret = 0; - - /* - * Re-acquire with a larger size should replace the cached context - * because the old one is too small. (Free + alloc may reuse the - * same address, so only verify the new context satisfies the larger - * request.) - */ - if (ret) { - OSSL_FN_CTX *small = bn_ctx_acquire_ossl_fn_ctx(bnctx, 1, 1, 8); - if (!TEST_ptr(small)) - ret = 0; - else { - OSSL_FN_CTX *large = bn_ctx_acquire_ossl_fn_ctx(bnctx, 1, 1, 64); - - if (!TEST_ptr(large) - || !TEST_ptr(token = OSSL_FN_CTX_start(large)) - || !TEST_ptr(fn = OSSL_FN_CTX_get_limbs(large, 64)) - || !TEST_true(OSSL_FN_CTX_end(large, token))) - ret = 0; - } - } - - BN_CTX_free(bnctx); - - /* Test secure BN_CTX */ - if (ret) { - if (!TEST_ptr(bnctx = BN_CTX_secure_new())) - ret = 0; - else { - fn = NULL; - token = NULL; - fnctx = bn_ctx_acquire_ossl_fn_ctx(bnctx, 1, 1, 8); - if (!TEST_ptr(fnctx) - || !TEST_ptr(token = OSSL_FN_CTX_start(fnctx)) - || !TEST_ptr(fn = OSSL_FN_CTX_get_limbs(fnctx, 1)) - || !TEST_true(ossl_fn_is_securely_allocated(fn)) - || !TEST_true(OSSL_FN_CTX_end(fnctx, token))) - ret = 0; - BN_CTX_free(bnctx); - } - } - - return ret; -} - int setup_tests(void) { if (!TEST_ptr(ctx = BN_CTX_new())) @@ -181,7 +94,6 @@ int setup_tests(void) ADD_TEST(test_is_prime_enhanced); ADD_ALL_TESTS(test_is_composite_enhanced, (int)OSSL_NELEM(composites)); ADD_TEST(test_bn_small_factors); - ADD_TEST(test_bn_ctx_fn_ctx); return 1; } From 9ff9bf1c0ab2eb16b45aa0550df2f2b3a74b323a Mon Sep 17 00:00:00 2001 From: Richard Levitte Date: Tue, 30 Jun 2026 15:10:58 +0200 Subject: [PATCH 50/69] OSSL_FN: Size contexts in bytes OSSL_FN_CTX callers currently describe the arena in frames, numbers and limbs. That works for a single operation, but it makes higher level sizing awkward because each caller has to keep redoing the same conversion. Add an overflow-checked OSSL_FN_CTX_size() helper that returns the arena payload size, plus byte-sized constructors for normal and secure contexts. The existing frame/number/limb constructors become wrappers around it so current callers keep working while newer code can compose byte sizes directly. The old internal ossl_fn_ctx_calculate_arena_size() inline is replaced by the public, overflow-checked helper. Add per-operation ctx-size helpers OSSL_FN_mul_ctx_size() and OSSL_FN_sqr_ctx_size(), which fold in the aliasing and destination-width considerations of OSSL_FN_mul() / OSSL_FN_sqr(). Assisted-by: Pi:openai/gpt-5.5 Assisted-by: Pi:z-ai/glm-5.2 Signed-off-by: Richard Levitte Reviewed-by: Igor Ustinov Reviewed-by: Tomas Mraz MergeDate: Wed Jul 15 13:04:48 2026 (Merged from https://github.com/openssl/openssl/pull/31794) --- crypto/fn/fn_ctx.c | 88 ++++++++++++++++++++++++++++++--- crypto/fn/fn_local.h | 8 --- crypto/fn/fn_mul.c | 13 +++++ crypto/fn/fn_sqr.c | 19 +++++++ include/crypto/fn.h | 74 ++++++++++++++++++++++++++- test/fn_internal_test.c | 107 ++++++++++++++++++++++++++++++++++++++++ 6 files changed, 293 insertions(+), 16 deletions(-) diff --git a/crypto/fn/fn_ctx.c b/crypto/fn/fn_ctx.c index 42cc9172ea..fc510e03fd 100644 --- a/crypto/fn/fn_ctx.c +++ b/crypto/fn/fn_ctx.c @@ -9,9 +9,13 @@ #include #include +#include "internal/safe_math.h" #include "crypto/fn.h" #include "fn_local.h" +OSSL_SAFE_MATH_ADDU(size_t, size_t, OSSL_SAFE_MATH_MAXU(size_t)) +OSSL_SAFE_MATH_MULU(size_t, size_t, OSSL_SAFE_MATH_MAXU(size_t)) + /* * An OSSL_FN_CTX is a large pre-allocated chunk of memory that can be used * to quickly allocate OSSL_FN instances. The organization of memory is as @@ -24,14 +28,68 @@ * it when it's done. */ +size_t OSSL_FN_CTX_size(size_t max_n_frames, size_t max_n_numbers, + size_t max_n_limbs) +{ + int err = 0; + size_t frames, numbers, limbs, total; + + /* + * A context always needs at least one frame, since every use of an + * OSSL_FN_CTX calls OSSL_FN_CTX_start(), which carves out a frame. + */ + if (max_n_frames == 0) + return 0; + /* + * Number-header and limb budgets must both be present or both absent. + * OSSL_FN_CTX_get_limbs() allocates an OSSL_FN header and its limbs + * together, so a context with one budget but not the other can never + * produce a usable number. + */ + if ((max_n_numbers == 0) != (max_n_limbs == 0)) + return 0; + + frames = safe_mul_size_t(max_n_frames, + sizeof(struct ossl_fn_ctx_frame_st), &err); + numbers = safe_mul_size_t(max_n_numbers, sizeof(OSSL_FN), &err); + limbs = safe_mul_size_t(max_n_limbs, OSSL_FN_BYTES, &err); + total = safe_add_size_t(frames, numbers, &err); + total = safe_add_size_t(total, limbs, &err); + + return err == 0 ? total : 0; +} + OSSL_FN_CTX *OSSL_FN_CTX_new(OSSL_LIB_CTX *libctx, size_t max_n_frames, size_t max_n_numbers, size_t max_n_limbs) { - size_t arena_size = ossl_fn_ctx_calculate_arena_size(max_n_frames, max_n_numbers, max_n_limbs); - OSSL_FN_CTX *ctx = OPENSSL_zalloc(sizeof(OSSL_FN_CTX) + arena_size); + return OSSL_FN_CTX_new_size(libctx, + OSSL_FN_CTX_size(max_n_frames, max_n_numbers, max_n_limbs)); +} + +OSSL_FN_CTX *OSSL_FN_CTX_new_size(OSSL_LIB_CTX *libctx, size_t size) +{ + size_t total_size; + OSSL_FN_CTX *ctx; + + int err = 0; + + /* + * A size of 0 is the error return of OSSL_FN_CTX_size() (and the + * per-operation ctx-size helpers). Treat it as an error here too, so a + * caller does not get back a context with a zero-size arena that it + * would then hand to an operation expecting usable scratch space. + */ + if (size == 0) + return NULL; + + total_size = safe_add_size_t(sizeof(*ctx), size, &err); + if (err != 0) + return NULL; + + ctx = OPENSSL_zalloc(total_size); if (ctx != NULL) - ctx->msize = arena_size; + ctx->msize = size; return ctx; } @@ -39,11 +97,29 @@ OSSL_FN_CTX *OSSL_FN_CTX_new(OSSL_LIB_CTX *libctx, size_t max_n_frames, OSSL_FN_CTX *OSSL_FN_CTX_secure_new(OSSL_LIB_CTX *libctx, size_t max_n_frames, size_t max_n_numbers, size_t max_n_limbs) { - size_t arena_size = ossl_fn_ctx_calculate_arena_size(max_n_frames, max_n_numbers, max_n_limbs); - OSSL_FN_CTX *ctx = OPENSSL_secure_zalloc(sizeof(OSSL_FN_CTX) + arena_size); + return OSSL_FN_CTX_secure_new_size(libctx, + OSSL_FN_CTX_size(max_n_frames, max_n_numbers, max_n_limbs)); +} + +OSSL_FN_CTX *OSSL_FN_CTX_secure_new_size(OSSL_LIB_CTX *libctx, size_t size) +{ + size_t total_size; + OSSL_FN_CTX *ctx; + + int err = 0; + + /* As in OSSL_FN_CTX_new_size(), a size of 0 is an error. */ + if (size == 0) + return NULL; + + total_size = safe_add_size_t(sizeof(*ctx), size, &err); + if (err != 0) + return NULL; + + ctx = OPENSSL_secure_zalloc(total_size); if (ctx != NULL) { - ctx->msize = arena_size; + ctx->msize = size; ctx->is_securely_allocated = 1; } diff --git a/crypto/fn/fn_local.h b/crypto/fn/fn_local.h index 0dace59729..3cb6fc05ad 100644 --- a/crypto/fn/fn_local.h +++ b/crypto/fn/fn_local.h @@ -177,14 +177,6 @@ struct ossl_fn_ctx_frame_st { unsigned char memory[]; }; -static ossl_inline size_t ossl_fn_ctx_calculate_arena_size(size_t max_n_frames, - size_t max_n_numbers, size_t max_n_limbs) -{ - return max_n_frames * sizeof(struct ossl_fn_ctx_frame_st) - + max_n_numbers * sizeof(OSSL_FN) - + max_n_limbs * OSSL_FN_BYTES; -} - /* end OSSL_FN_CTX internals */ #endif diff --git a/crypto/fn/fn_mul.c b/crypto/fn/fn_mul.c index 8322fe9f35..4b5b50e83b 100644 --- a/crypto/fn/fn_mul.c +++ b/crypto/fn/fn_mul.c @@ -14,6 +14,19 @@ #include "../bn/bn_local.h" /* For using the low level bignum functions */ #include "fn_local.h" +size_t OSSL_FN_mul_ctx_size(const OSSL_FN *r, const OSSL_FN *a, + const OSSL_FN *b) +{ + size_t limbs = 0; + + if (r == NULL || a == NULL || b == NULL) + return 0; + if (r == a || r == b) + limbs = r->dsize; + + return OSSL_FN_CTX_size(1, limbs == 0 ? 0 : 1, limbs); +} + int OSSL_FN_mul(OSSL_FN *r, const OSSL_FN *a, const OSSL_FN *b, OSSL_FN_CTX *ctx) { size_t al = (size_t)a->dsize; diff --git a/crypto/fn/fn_sqr.c b/crypto/fn/fn_sqr.c index 423f49ffff..698d33c286 100644 --- a/crypto/fn/fn_sqr.c +++ b/crypto/fn/fn_sqr.c @@ -9,11 +9,30 @@ #include #include +#include "internal/safe_math.h" #include "crypto/cryptlib.h" #include "crypto/fnerr.h" #include "../bn/bn_local.h" /* For using the low level bignum functions */ #include "fn_local.h" +OSSL_SAFE_MATH_MULU(size_t, size_t, OSSL_SAFE_MATH_MAXU(size_t)) + +size_t OSSL_FN_sqr_ctx_size(const OSSL_FN *r, const OSSL_FN *a) +{ + size_t max, limbs, n_numbers = 1; + + if (r == NULL || a == NULL) + return 0; + int err = 0; + + max = safe_mul_size_t(2, a->dsize, &err); + if ((size_t)r->dsize < max) + n_numbers++; + limbs = safe_mul_size_t(n_numbers, max, &err); + + return err == 0 ? OSSL_FN_CTX_size(1, n_numbers, limbs) : 0; +} + int OSSL_FN_sqr(OSSL_FN *r, const OSSL_FN *a, OSSL_FN_CTX *ctx) { const void *token = OSSL_FN_CTX_start(ctx); diff --git a/include/crypto/fn.h b/include/crypto/fn.h index f584ea273b..f5229fe58e 100644 --- a/include/crypto/fn.h +++ b/include/crypto/fn.h @@ -151,6 +151,27 @@ OSSL_FN *OSSL_FN_copy(OSSL_FN *a, const OSSL_FN *b); */ OSSL_FN *OSSL_FN_copy_truncate(OSSL_FN *a, const OSSL_FN *b); +/** + * Calculate the arena payload size for an OSSL_FN_CTX. + * + * @param[in] max_n_frames Maximum number of simultaneously active frames. + * This indicates the expected depth of call stack + * that the resulting OSSL_FN_CTX will be used in. + * Must be at least 1. + * @param[in] max_n_numbers Maximum number of simultaneously active OSSL_FN. + * Must be 0 if and only if @p max_n_limbs is 0. + * @param[in] max_n_limbs Maximum number of simultaneously active OSSL_FN + * limbs. Must be 0 if and only if + * @p max_n_numbers is 0. + * @returns The arena payload size, in bytes. + * @retval 0 on arithmetic overflow or invalid argument. + * + * The returned size is the value to pass to OSSL_FN_CTX_new_size() or + * OSSL_FN_CTX_secure_new_size(). It does not include sizeof(OSSL_FN_CTX). + */ +size_t OSSL_FN_CTX_size(size_t max_n_frames, size_t max_n_numbers, + size_t max_n_limbs); + /** * Allocate a new OSSL_FN_CTX, given a set of input numbers. * @@ -162,18 +183,41 @@ OSSL_FN *OSSL_FN_copy_truncate(OSSL_FN *a, const OSSL_FN *b); * @param[in] max_n_limbs Maximum number of simultaneously active OSSL_FN * limbs. * @returns An allocated OSSL_FN_CTX, or NULL on error. - **/ + */ OSSL_FN_CTX *OSSL_FN_CTX_new(OSSL_LIB_CTX *libctx, size_t max_n_frames, size_t max_n_numbers, size_t max_n_limbs); +/** + * Allocate a new OSSL_FN_CTX with a given arena payload size. + * + * @param[in] libctx OpenSSL library context (currently unused) + * @param[in] size Arena payload size in bytes, typically from + * OSSL_FN_CTX_size(). A size of 0 is the error + * return of OSSL_FN_CTX_size() and is treated as + * an error here too. + * @returns An allocated OSSL_FN_CTX, or NULL on error. + */ +OSSL_FN_CTX *OSSL_FN_CTX_new_size(OSSL_LIB_CTX *libctx, size_t size); + /** * Allocate a new OSSL_FN_CTX in secure memory, given a set of input numbers. * Other than allocating in secure memory, this function does exactly the same * thing as OSSL_FN_CTX_new(). - **/ + */ OSSL_FN_CTX *OSSL_FN_CTX_secure_new(OSSL_LIB_CTX *libctx, size_t max_n_frames, size_t max_n_numbers, size_t max_n_limbs); +/** + * Allocate a new OSSL_FN_CTX in secure memory with a given arena payload size. + * + * @param[in] libctx OpenSSL library context (currently unused) + * @param[in] size Arena payload size in bytes, typically from + * OSSL_FN_CTX_size(). A size of 0 is treated as + * an error, as in OSSL_FN_CTX_new_size(). + * @returns An allocated OSSL_FN_CTX, or NULL on error. + */ +OSSL_FN_CTX *OSSL_FN_CTX_secure_new_size(OSSL_LIB_CTX *libctx, size_t size); + /** * Report the peak number of frames, numbers, and limbs that were * simultaneously active during the lifetime of the OSSL_FN_CTX. @@ -353,6 +397,20 @@ int OSSL_FN_sub_word(OSSL_FN *a, const OSSL_FN_ULONG *w); int OSSL_FN_mul(OSSL_FN *r, const OSSL_FN *a, const OSSL_FN *b, OSSL_FN_CTX *ctx); +/** + * Calculate the arena payload size that OSSL_FN_mul() needs. + * + * @param[in] r The OSSL_FN for the result + * @param[in] a The first operand + * @param[in] b The second operand + * @returns The arena payload size, in bytes. + * @retval 0 on arithmetic overflow or invalid input. + * + * The returned size includes any frame budget needed by OSSL_FN_mul(). + */ +size_t OSSL_FN_mul_ctx_size(const OSSL_FN *r, const OSSL_FN *a, + const OSSL_FN *b); + /** * Calculate the square of one OSSL_FN number. Truncates the result to fit in r. * @@ -368,6 +426,18 @@ int OSSL_FN_mul(OSSL_FN *r, const OSSL_FN *a, const OSSL_FN *b, */ int OSSL_FN_sqr(OSSL_FN *r, const OSSL_FN *a, OSSL_FN_CTX *ctx); +/** + * Calculate the arena payload size that OSSL_FN_sqr() needs. + * + * @param[in] r The OSSL_FN for the result + * @param[in] a The operand + * @returns The arena payload size, in bytes. + * @retval 0 on arithmetic overflow or invalid input. + * + * The returned size includes any frame budget needed by OSSL_FN_sqr(). + */ +size_t OSSL_FN_sqr_ctx_size(const OSSL_FN *r, const OSSL_FN *a); + #ifdef __cplusplus } #endif diff --git a/test/fn_internal_test.c b/test/fn_internal_test.c index a08a9fe1c5..b6b316a445 100644 --- a/test/fn_internal_test.c +++ b/test/fn_internal_test.c @@ -164,6 +164,71 @@ end: return ret; } +static int test_ctx_size(void) +{ + int ret = 1; + OSSL_FN_CTX *ctx = NULL; + OSSL_FN *f = NULL; + const void *token = NULL; + size_t size = OSSL_FN_CTX_size(1, 2, 4096 / OSSL_FN_BITS); + + if (!TEST_size_t_ne(size, 0) + || !TEST_ptr(ctx = OSSL_FN_CTX_new_size(NULL, size))) { + ret = 0; + goto end; + } + + if (!TEST_ptr(token = OSSL_FN_CTX_start(ctx))) { + ret = 0; + goto end; + } + + if (!TEST_ptr(f = OSSL_FN_CTX_get_bits(ctx, 2048)) + || !TEST_false(ossl_fn_is_dynamically_allocated(f)) + || !TEST_false(ossl_fn_is_securely_allocated(f)) + || !TEST_ptr(f = OSSL_FN_CTX_get_bits(ctx, 2048)) + || !TEST_ptr_null(f = OSSL_FN_CTX_get_bits(ctx, 2048))) + ret = 0; + + if (!TEST_true(OSSL_FN_CTX_end(ctx, token))) + ret = 0; + +end: + OSSL_FN_CTX_free(ctx); + + /* + * Force each term of OSSL_FN_CTX_size() to overflow in turn, + * keeping the others at a minimal valid context (1 frame, 1 + * number, 1 limb) so only the overflowing term is unrealistic. + */ + if (!TEST_size_t_eq(OSSL_FN_CTX_size(SIZE_MAX, 1, 1), 0)) + ret = 0; + if (!TEST_size_t_eq(OSSL_FN_CTX_size(1, SIZE_MAX, 1), 0)) + ret = 0; + if (!TEST_size_t_eq(OSSL_FN_CTX_size(1, 1, SIZE_MAX), 0)) + ret = 0; + /* A context must have at least one frame. */ + if (!TEST_size_t_eq(OSSL_FN_CTX_size(0, 1, 1), 0)) + ret = 0; + /* + * Numbers and limbs must both be present or both absent: a context + * with one budget but not the other can never allocate a usable + * number, since OSSL_FN_CTX_get_limbs() allocates the OSSL_FN header + * and its limbs together. + */ + if (!TEST_size_t_eq(OSSL_FN_CTX_size(1, 0, 1), 0)) + ret = 0; + if (!TEST_size_t_eq(OSSL_FN_CTX_size(1, 1, 0), 0)) + ret = 0; + if (!TEST_ptr_null(OSSL_FN_CTX_new_size(NULL, SIZE_MAX))) + ret = 0; + /* A size of 0 is the error return of OSSL_FN_CTX_size(). */ + if (!TEST_ptr_null(OSSL_FN_CTX_new_size(NULL, 0))) + ret = 0; + + return ret; +} + static int test_secure_ctx(void) { int ret = 1; @@ -205,6 +270,46 @@ end: return ret; } +static int test_secure_ctx_size(void) +{ + int ret = 1; + OSSL_FN_CTX *ctx = NULL; + OSSL_FN *f = NULL; + const void *token = NULL; + size_t size = OSSL_FN_CTX_size(1, 1, 2048 / OSSL_FN_BITS); + + if (!TEST_size_t_ne(size, 0) + || !TEST_ptr(ctx = OSSL_FN_CTX_secure_new_size(NULL, size))) { + ret = 0; + goto end; + } + + if (!TEST_ptr(token = OSSL_FN_CTX_start(ctx))) { + ret = 0; + goto end; + } + + if (!TEST_ptr(f = OSSL_FN_CTX_get_bits(ctx, 2048)) + || !TEST_false(ossl_fn_is_dynamically_allocated(f)) + || !TEST_true(ossl_fn_is_securely_allocated(f)) + || !TEST_ptr_null(f = OSSL_FN_CTX_get_bits(ctx, 2048))) + ret = 0; + + if (!TEST_true(OSSL_FN_CTX_end(ctx, token))) + ret = 0; + +end: + OSSL_FN_CTX_free(ctx); + + if (!TEST_ptr_null(OSSL_FN_CTX_secure_new_size(NULL, SIZE_MAX))) + ret = 0; + /* A size of 0 is the error return of OSSL_FN_CTX_size(). */ + if (!TEST_ptr_null(OSSL_FN_CTX_secure_new_size(NULL, 0))) + ret = 0; + + return ret; +} + static int test_ctx_peak_used(void) { int ret = 1; @@ -343,7 +448,9 @@ int setup_tests(void) ADD_TEST(test_alloc); ADD_TEST(test_secure_alloc); ADD_TEST(test_ctx); + ADD_TEST(test_ctx_size); ADD_TEST(test_secure_ctx); + ADD_TEST(test_secure_ctx_size); ADD_TEST(test_ctx_peak_used); return 1; From 496092d36f67f14bdbf101d829bd728850b13b78 Mon Sep 17 00:00:00 2001 From: Richard Levitte Date: Wed, 8 Jul 2026 18:44:12 +0200 Subject: [PATCH 51/69] OSSL_FN: use ctx-size helpers in fntest The mul and sqr tests in test/fntest.c sized their OSSL_FN_CTX arenas by hand, passing fixed frame/number/limb counts to OSSL_FN_CTX_new(). Switch them to OSSL_FN_CTX_new_size() driven by OSSL_FN_mul_ctx_size() / OSSL_FN_sqr_ctx_size(), passing the actual result and operand OSSL_FNs so the per-op helpers can account for aliasing and destination width. This gives the ctx-size helpers real callers in the tree and makes the test sizing match what OSSL_FN_mul() / OSSL_FN_sqr() actually need instead of the previous oversized estimates. Assisted-by: Pi:z-ai/glm-5.2 Signed-off-by: Richard Levitte Assisted-by: Pi:openai/gpt-5.5 Reviewed-by: Igor Ustinov Reviewed-by: Tomas Mraz MergeDate: Wed Jul 15 13:04:50 2026 (Merged from https://github.com/openssl/openssl/pull/31794) --- test/fntest.c | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/test/fntest.c b/test/fntest.c index 72f4b5aae0..a1f9ae88e5 100644 --- a/test/fntest.c +++ b/test/fntest.c @@ -165,11 +165,6 @@ err: return st; } -static OSSL_FN_CTX *new_mul_ctx(int nlimbs) -{ - return OSSL_FN_CTX_new(NULL, 1, 1, nlimbs * 2); -} - static int file_product(STANZA *s) { BIGNUM *a = NULL, *b = NULL, *product = NULL, *ret = NULL; @@ -195,7 +190,8 @@ static int file_product(STANZA *s) || !TEST_ptr(rf = bn_acquire_ossl_fn(ret, nlimbs))) goto err; r_acq = 1; - if (!TEST_ptr(ctx = new_mul_ctx(nlimbs))) + if (!TEST_ptr(ctx = OSSL_FN_CTX_new_size(NULL, + OSSL_FN_mul_ctx_size(rf, af, bf)))) goto err; if (!TEST_true(OSSL_FN_mul(rf, af, bf, ctx))) @@ -218,11 +214,6 @@ err: return st; } -static OSSL_FN_CTX *new_sqr_ctx(int nlimbs) -{ - return OSSL_FN_CTX_new(NULL, 1, 2, nlimbs * 4); -} - static int file_square(STANZA *s) { BIGNUM *a = NULL, *square = NULL, *ret = NULL; @@ -243,7 +234,8 @@ static int file_square(STANZA *s) || !TEST_ptr(rf = bn_acquire_ossl_fn(ret, nlimbs))) goto err; r_acq = 1; - if (!TEST_ptr(ctx = new_sqr_ctx(nlimbs))) + if (!TEST_ptr(ctx = OSSL_FN_CTX_new_size(NULL, + OSSL_FN_sqr_ctx_size(rf, af)))) goto err; if (!TEST_true(OSSL_FN_sqr(rf, af, ctx))) From 12929d385257f192265e094825ff8d253eb2e270 Mon Sep 17 00:00:00 2001 From: Richard Levitte Date: Tue, 14 Apr 2026 13:28:05 +0200 Subject: [PATCH 52/69] OSSL_FN: Add the 'div' and 'mod' functions OSSL_FN_div() divides two numbers, and calculates the quotient and the remainder. The result OSSL_FNs may be of any size, and if they're smaller than the results of dividing the operands, the results are truncated to that size. OSSL_FN_mod() is a very simple function that wraps around OSSL_FN_div() and only returns the remainder. Related-to: doc/designs/fixed-size-large-numbers.md Issue: https://github.com/openssl/project/issues/1852 Assisted-by: Pi:openai/gpt-5.5 Assisted-by: Pi:z-ai/glm-5.2 Signed-off-by: Richard Levitte Reviewed-by: Jakub Zelenka Reviewed-by: Igor Ustinov Reviewed-by: Tomas Mraz MergeDate: Thu Jul 23 14:13:58 2026 (Merged from https://github.com/openssl/openssl/pull/30822) --- crypto/err/openssl.txt | 1 + crypto/fn/build.info | 3 +- crypto/fn/fn_div.c | 366 ++++++++++++++++ crypto/fn/fn_err.c | 3 +- include/crypto/fn.h | 38 ++ include/crypto/fnerr.h | 3 +- test/fn_api_test.c | 964 ++++++++++++++++++++++++++++++++++------- 7 files changed, 1229 insertions(+), 149 deletions(-) create mode 100644 crypto/fn/fn_div.c diff --git a/crypto/err/openssl.txt b/crypto/err/openssl.txt index be04fac74e..5770a1d481 100644 --- a/crypto/err/openssl.txt +++ b/crypto/err/openssl.txt @@ -888,6 +888,7 @@ OSSL_ENCODER_R_ENCODER_NOT_FOUND:101:encoder not found OSSL_ENCODER_R_INCORRECT_PROPERTY_QUERY:100:incorrect property query OSSL_ENCODER_R_MISSING_GET_PARAMS:102:missing get params OSSL_ENCODER_R_UNKNOWN_PARAMETER_NAME:104:unknown parameter name +OSSL_FN_R_DIV_BY_ZERO:101:div by zero OSSL_FN_R_INVALID_SHIFT:102:invalid shift OSSL_FN_R_RESULT_ARG_TOO_SMALL:100:result arg too small OSSL_STORE_R_AMBIGUOUS_CONTENT_TYPE:107:ambiguous content type diff --git a/crypto/fn/build.info b/crypto/fn/build.info index 5af2c86e37..3581027748 100644 --- a/crypto/fn/build.info +++ b/crypto/fn/build.info @@ -2,7 +2,8 @@ $LIBCRYPTO=../../libcrypto $LIBFIPS=../../providers/libfips.a LIBS=$LIBCRYPTO -$COMMON=fn_err.c fn_lib.c fn_ctx.c fn_intern.c fn_addsub.c fn_shift.c fn_mul.c fn_sqr.c +$COMMON=fn_err.c fn_lib.c fn_ctx.c fn_intern.c fn_addsub.c fn_shift.c fn_mul.c \ + fn_sqr.c fn_div.c SOURCE[$LIBCRYPTO]=$COMMON SOURCE[$LIBFIPS]=$COMMON diff --git a/crypto/fn/fn_div.c b/crypto/fn/fn_div.c new file mode 100644 index 0000000000..97f2429092 --- /dev/null +++ b/crypto/fn/fn_div.c @@ -0,0 +1,366 @@ +/* + * Copyright 2026 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#include +#include +#include "crypto/cryptlib.h" +#include "crypto/fnerr.h" +#include "../bn/bn_local.h" /* For using the low level bignum functions */ +#include "fn_local.h" + +#if !defined(OPENSSL_NO_ASM) && !defined(OPENSSL_NO_INLINE_ASM) \ + && !defined(PEDANTIC) && !defined(BN_DIV3W) +#if defined(__GNUC__) && __GNUC__ >= 2 +#if defined(__i386) || defined(__i386__) +/*- + * There were two reasons for implementing this template: + * - GNU C generates a call to a function (__udivdi3 to be exact) + * in reply to ((((BN_ULLONG)n0)< */ +#endif /* __GNUC__ */ +#endif /* OPENSSL_NO_ASM */ + +/* + * Copy src to dst and align it to the left using lshift. + * lshift is assumed to be less than OSSL_FN_BITS. + */ +static inline void copy_align_left(OSSL_FN *dst, const OSSL_FN *src, OSSL_FN_ULONG lshift) +{ + OSSL_FN_ULONG rshift = OSSL_FN_BITS - lshift; + OSSL_FN_ULONG rmask; + OSSL_FN_ULONG m; + const OSSL_FN_ULONG *s = src->d; + size_t sl = src->dsize; + OSSL_FN_ULONG *d = dst->d; + size_t dl = dst->dsize; + size_t l = (dl < sl) ? dl : sl; + size_t i; + + rshift %= OSSL_FN_BITS; + + /* rmask = 0 - (rshift != 0) */ + rmask = (OSSL_FN_ULONG)0 - rshift; + rmask |= rmask >> 8; + + /* src and dst may be the same, that's why this loop is made this way */ + for (i = 0, m = 0; i < l; i++) { + OSSL_FN_ULONG tmp = s[i]; + d[i] = ((tmp << lshift) | m) & OSSL_FN_MASK; + m = (tmp >> rshift) & rmask; + } + + for (; i < dl; i++) { + d[i] = m; + m = 0; + } +} + +/* + * Copy src to dst and align it to the right using rshift. + * rshift is assumed to be less than OSSL_FN_BITS. + */ +static inline void copy_align_right(OSSL_FN *dst, const OSSL_FN *src, OSSL_FN_ULONG rshift) +{ + OSSL_FN_ULONG lshift = OSSL_FN_BITS - rshift; + OSSL_FN_ULONG lmask; + const OSSL_FN_ULONG *s = src->d; + size_t sl = src->dsize; + OSSL_FN_ULONG *d = dst->d; + size_t dl = dst->dsize; + size_t i; + size_t l = (dl < sl) ? dl : sl; + + lshift %= OSSL_FN_BITS; + + /* lmask = 0 - (lshift != 0) */ + lmask = (OSSL_FN_ULONG)0 - lshift; + lmask |= lmask >> 8; + + /* Just to be safe */ + for (i = dl; i-- > l;) + d[i] = 0; + + /* + * m is a set of bits passed to the next limb down when shifting, + * and needs proper bootstrapping: if the source is larger than the + * destination, we must consider one source limb beyond the destination + * size. If not, m is simply starts with zero. + */ + OSSL_FN_ULONG m = (dl < sl) ? (s[dl] << lshift) & lmask : 0; + + /* src and dst may be the same, that's why this loop is made this way */ + for (i = l; i-- > 0;) { + OSSL_FN_ULONG tmp = s[i]; + d[i] = m | ((tmp >> rshift) & OSSL_FN_MASK); + m = (tmp << lshift) & lmask; + } +} + +static inline OSSL_FN_ULONG div_words(OSSL_FN_ULONG *wnumtop, OSSL_FN_ULONG *wnum, + OSSL_FN_ULONG d1, OSSL_FN_ULONG d0) +{ +#if defined(BN_DIV3W) + return bn_div_3_words(wnumtop, d1, d0); +#else + OSSL_FN_ULONG n0 = wnumtop[0], n1 = wnumtop[-1], quo = 0, rem = 0; + + if (n0 == d0) + quo = OSSL_FN_MASK; + else { /* n0 < d0 */ + OSSL_FN_ULONG n2 = (wnumtop == wnum) ? 0 : wnumtop[-2]; +#ifdef BN_LLONG + BN_ULLONG t2; + +#if defined(BN_LLONG) && defined(BN_DIV2W) && !defined(bn_div_words) + quo = (OSSL_FN_ULONG)(((((BN_ULLONG)n0) << OSSL_FN_BITS) | n1) / d0); +#else + quo = bn_div_words(n0, n1, d0); +#endif + +#ifndef REMAINDER_IS_ALREADY_CALCULATED + /* + * rem doesn't have to be BN_ULLONG. The least we + * know it's less that d0, isn't it? + */ + rem = (n1 - quo * d0) & BN_MASK2; +#endif + t2 = (BN_ULLONG)d1 * quo; + + for (;;) { + if (t2 <= ((((BN_ULLONG)rem) << OSSL_FN_BITS) | n2)) + break; + quo--; + rem += d0; + if (rem < d0) + break; /* don't let rem overflow */ + t2 -= d1; + } +#else /* !BN_LLONG */ + OSSL_FN_ULONG t2l, t2h; + + quo = bn_div_words(n0, n1, d0); +#ifndef REMAINDER_IS_ALREADY_CALCULATED + rem = (n1 - quo * d0) & OSSL_FN_MASK; +#endif + +#if defined(BN_UMULT_LOHI) + BN_UMULT_LOHI(t2l, t2h, d1, quo); +#elif defined(BN_UMULT_HIGH) + t2l = d1 * quo; + t2h = BN_UMULT_HIGH(d1, quo); +#else + { + OSSL_FN_ULONG ql, qh; + t2l = LBITS(d1); + t2h = HBITS(d1); + ql = LBITS(quo); + qh = HBITS(quo); + mul64(t2l, t2h, ql, qh); /* t2=(BN_ULLONG)d1*q; */ + } +#endif + + for (;;) { + if ((t2h < rem) || ((t2h == rem) && (t2l <= n2))) + break; + quo--; + rem += d0; + if (rem < d0) + break; /* don't let rem overflow */ + if (t2l < d1) + t2h--; + t2l -= d1; + } +#endif /* !BN_LLONG */ + } + + return quo; +#endif /* !BN_DIV3W */ +} + +/* Trivia: this function implements Knuth's algorithm D */ +int OSSL_FN_div(OSSL_FN *q, OSSL_FN *r, const OSSL_FN *n, const OSSL_FN *d, OSSL_FN_CTX *ctx) +{ + const void *token = OSSL_FN_CTX_start(ctx); + if (token == NULL) + return 0; + + size_t nl = n->dsize; + size_t dl = d->dsize; + size_t ql = (q == NULL) ? 0 : q->dsize; + + /* + * We need to figure out the significant size of |d|, to avoid division by + * zero if the highest limb(s) are zero. + * + * This doesn't quite give a sense that division can be constant time. + * However, in the use cases where constant time is interesting (cryptosystems), + * it can be argued that the denominator would have a constant enough size + * within each cryptosystem (and size therein), so it's assumed that time + * will be constant because of that. + */ + while (dl > 0 && d->d[dl - 1] == 0) + dl--; + + if (dl == 0) { + ERR_raise(ERR_LIB_OSSL_FN, OSSL_FN_R_DIV_BY_ZERO); + goto err; + } + + /* + * Because some assembler language instructions have those requirements, + * the denominator need to be shifted "left" so the top bit is always 1. + * To ensure that we still get correct results, the numerator will have + * to be shifted left as many bits. The resulting quotient will end up + * correct, but the remainder will have to be shifted "right" before the + * end of this function. + */ + OSSL_FN_ULONG norm_shift = OSSL_FN_BITS - BN_num_bits_word(d->d[dl - 1]); + + /* + * Store a copy the numerator in snum, padded with extra zeros if nl <= dl + * eventually, this will contain the remainder. Because it may be shifted + * up to almost a full limb to the left (worst case scenario), an extra limb + * need to be allocated. + */ + size_t snuml = ((nl <= dl) ? dl : nl) + 1; + OSSL_FN *snum = OSSL_FN_CTX_get_limbs(ctx, snuml); + if (!ossl_assert(snuml <= INT_MAX && snum != NULL)) + goto err; + copy_align_left(snum, n, norm_shift); + + /* + * Store a copy of the denominator in sdiv, shifted left so that its top bit + * is always 1. This is necessary to avoid gnarly arithmetic exceptions when + * the denominator's highest limb is a very small number. + */ + size_t sdivl = dl; + OSSL_FN *sdiv = OSSL_FN_CTX_get_limbs(ctx, sdivl); + if (!ossl_assert(sdivl <= INT_MAX && sdiv != NULL)) + goto err; + copy_align_left(sdiv, d, norm_shift); + + /* + * The number of times we will iterate to perform division, i.e. + * how often we will "shift" the divisor "window" over the numerator. + * This also determines the size of the result. + * + * For the math oriented: + * + * snuml - sdivl = ((nl <= dl) ? dl : nl) + 1 - dl + * => snuml - sdivl = ((nl <= dl) ? 0 : nl - dl) + 1 + * => snuml - sdivl = (nl <= dl) ? 1 : nl - dl + 1 + */ + size_t loop = snuml - sdivl; + + /* + * Set up the quotient. It will be stored directly in |q| if it has + * enough space, otherwise temporary storage is allocated. + */ + OSSL_FN *res = (ql < loop) ? OSSL_FN_CTX_get_limbs(ctx, loop) : q; + if (!ossl_assert(res != NULL)) + goto err; + + /* Position of the next quotient limb to be calculated, plus one */ + OSSL_FN_ULONG *resp = &(res->d[loop]); + + /* Intermediary storage */ + OSSL_FN *tmp = OSSL_FN_CTX_get_limbs(ctx, sdivl + 1); + if (!ossl_assert(tmp != NULL)) + goto err; + + /* Set up the "window" position in snum. */ + OSSL_FN_ULONG *wnum = &(snum->d[loop]); + OSSL_FN_ULONG *wnumtop = &(snum->d[snuml - 1]); + + /* Get the top 2 words of the denominator */ + OSSL_FN_ULONG d0 = sdiv->d[sdivl - 1]; + OSSL_FN_ULONG d1 = (sdivl == 1) ? 0 : sdiv->d[sdivl - 2]; + + size_t i; + + /* If res is larger than the expected result, zero the limbs above */ + for (i = res->dsize; i > loop;) + res->d[--i] = 0; + for (i = 0; i < loop; i++, wnumtop--) { + OSSL_FN_ULONG quo, l0; + /* + * the first part of the loop uses the top two words of snum and sdiv + * to calculate a OSSL_FN_ULONG quo such that | wnum - d * q | < d + */ + quo = div_words(wnumtop, wnum, d1, d0); + + l0 = bn_mul_words(tmp->d, sdiv->d, (int)sdivl, quo); + tmp->d[sdivl] = l0; + wnum--; + + /* + * ignore top values of the bignums just sub the two OSSL_FN_ULONG + * arrays with bn_sub_words + */ + l0 = bn_sub_words(wnum, wnum, tmp->d, (int)sdivl + 1); + quo -= l0; + + /* + * Note: As we have considered only the leading two OSSL_FN_ULONGs + * in the calculation of q, d * q might be greater than wnum + * (but then (q-1) * d is less than or equal to wnum) + */ + size_t j; + for (l0 = 0 - l0, j = 0; j < sdivl; j++) + tmp->d[j] = sdiv->d[j] & l0; + l0 = bn_add_words(wnum, wnum, tmp->d, (int)sdivl); + (*wnumtop) += l0; + assert((*wnumtop) == 0); + + /* store part of the result */ + *--resp = quo; + } + /* snum holds remainder, it's as wide as divisor */ + if (r != NULL) + copy_align_right(r, snum, norm_shift); + /* res holds the quotient for a total of loop limbs, and is separate from q if ql < loop */ + if (q != NULL && q != res && OSSL_FN_copy_truncate(q, res) == 0) + goto err; + + OSSL_FN_CTX_end(ctx, token); + return 1; +err: + OSSL_FN_CTX_end(ctx, token); + return 0; +} diff --git a/crypto/fn/fn_err.c b/crypto/fn/fn_err.c index 443d225944..997f60668f 100644 --- a/crypto/fn/fn_err.c +++ b/crypto/fn/fn_err.c @@ -1,6 +1,6 @@ /* * Generated by util/mkerr.pl DO NOT EDIT - * Copyright 1995-2025 The OpenSSL Project Authors. All Rights Reserved. + * Copyright 1995-2026 The OpenSSL Project Authors. All Rights Reserved. * * Licensed under the Apache License 2.0 (the "License"). You may not use * this file except in compliance with the License. You can obtain a copy @@ -14,6 +14,7 @@ #ifndef OPENSSL_NO_ERR static const ERR_STRING_DATA OSSL_FN_str_reasons[] = { + { ERR_PACK(ERR_LIB_OSSL_FN, 0, OSSL_FN_R_DIV_BY_ZERO), "div by zero" }, { ERR_PACK(ERR_LIB_OSSL_FN, 0, OSSL_FN_R_INVALID_SHIFT), "invalid shift" }, { ERR_PACK(ERR_LIB_OSSL_FN, 0, OSSL_FN_R_RESULT_ARG_TOO_SMALL), diff --git a/include/crypto/fn.h b/include/crypto/fn.h index f5229fe58e..e375741ea3 100644 --- a/include/crypto/fn.h +++ b/include/crypto/fn.h @@ -411,6 +411,44 @@ int OSSL_FN_mul(OSSL_FN *r, const OSSL_FN *a, const OSSL_FN *b, size_t OSSL_FN_mul_ctx_size(const OSSL_FN *r, const OSSL_FN *a, const OSSL_FN *b); +/** + * Divide two OSSL_FN numbers. Truncates the result to fit in q and r. + * + * @param[out] q The OSSL_FN for the quotient + * @param[out] r The OSSL_FN for the remainder + * @param[in] n The first operand (numerator) + * @param[in] d The second operand (denominator) + * @param[in] ctx A context to get temporary OSSL_FN + * instances from. + * @returns 1 on success, 0 on error + * + * @note This function currently requires that the OSSL_FN_CTX has free + * space for 1 frame, 4 numbers, and 4 * max(n->dsize, d->dsize) + 2 limbs. + * Note that this provides an upper bound. Actual use of the arena may be + * smaller - see OSSL_FN_div_ctx_size() for an exact, conditional value. + */ +int OSSL_FN_div(OSSL_FN *q, OSSL_FN *r, const OSSL_FN *n, const OSSL_FN *d, + OSSL_FN_CTX *ctx); + +/** + * Calculate modulo of two OSSL_FN numbers. Truncates the result to fit in r. + * + * @param[out] r The OSSL_FN for the remainder + * @param[in] n The first operand (numerator) + * @param[in] d The second operand (denominator) + * @param[in] ctx A context to get temporary OSSL_FN + * instances from. + * @returns 1 on success, 0 on error + * + * @note This function has the same requirements on ctx as OSSL_FN_div(). + * It is equivalent to OSSL_FN_div(NULL, r, n, d, ctx). + */ +static inline int OSSL_FN_mod(OSSL_FN *r, const OSSL_FN *n, const OSSL_FN *d, + OSSL_FN_CTX *ctx) +{ + return OSSL_FN_div(NULL, r, n, d, ctx); +} + /** * Calculate the square of one OSSL_FN number. Truncates the result to fit in r. * diff --git a/include/crypto/fnerr.h b/include/crypto/fnerr.h index 54356fd513..e8a3b178e3 100644 --- a/include/crypto/fnerr.h +++ b/include/crypto/fnerr.h @@ -1,6 +1,6 @@ /* * Generated by util/mkerr.pl DO NOT EDIT - * Copyright 2020-2025 The OpenSSL Project Authors. All Rights Reserved. + * Copyright 2020-2026 The OpenSSL Project Authors. All Rights Reserved. * * Licensed under the Apache License 2.0 (the "License"). You may not use * this file except in compliance with the License. You can obtain a copy @@ -24,6 +24,7 @@ int ossl_err_load_OSSL_FN_strings(void); /* * OSSL_FN reason codes. */ +#define OSSL_FN_R_DIV_BY_ZERO 101 #define OSSL_FN_R_INVALID_SHIFT 102 #define OSSL_FN_R_RESULT_ARG_TOO_SMALL 100 diff --git a/test/fn_api_test.c b/test/fn_api_test.c index 2f09ab93ec..5903a66470 100644 --- a/test/fn_api_test.c +++ b/test/fn_api_test.c @@ -16,8 +16,10 @@ */ #include +#include #include "crypto/fn.h" #include "crypto/fn_intern.h" +#include "crypto/fnerr.h" #include "testutil.h" /* @@ -61,18 +63,27 @@ static int check_limbs_value(const OSSL_FN *f, size_t start, size_t end, } /* A set of numbers on OSSL_FN_ULONG array form */ +/* $num0 = 0x8000000000000001 */ static const OSSL_FN_ULONG num0[] = { OSSL_FN_ULONG64_C(0x80000000, 0x00000001) }; +/* $num1 = 0x0000000180000000 */ static const OSSL_FN_ULONG num1[] = { OSSL_FN_ULONG64_C(0x00000001, 0x80000000) }; +/* $num2 = 0x0123456789abcdef */ static const OSSL_FN_ULONG num2[] = { OSSL_FN_ULONG64_C(0x01234567, 0x89abcdef) }; +/* $num3 = 0x76543210fedcba98 */ static const OSSL_FN_ULONG num3[] = { OSSL_FN_ULONG64_C(0xfedcba98, 0x76543210) }; /* Numbers for edge cases */ +/* $num4 = 0x0000000000000000 */ static const OSSL_FN_ULONG num4[] = { OSSL_FN_ULONG64_C(0x00000000, 0x00000000) }; +/* $num5 = 0xffffffffffffffff */ static const OSSL_FN_ULONG num5[] = { OSSL_FN_ULONG64_C(0xffffffff, 0xffffffff) }; +/* $num6 = 0x10000000000000000000000000000000 */ static const OSSL_FN_ULONG num6[] = { OSSL_FN_ULONG64_C(0x00000000, 0x00000000), OSSL_FN_ULONG64_C(0x10000000, 0x00000000), }; +/* [32-bit] $num7 = 0xffffffff00000000000000000000000000000000 */ +/* [64-bit] $num7 = 0xffffffffffffffff00000000000000000000000000000000 */ static const OSSL_FN_ULONG num7[] = { OSSL_FN_ULONG64_C(0x00000000, 0x00000000), OSSL_FN_ULONG64_C(0x00000000, 0x00000000), @@ -98,38 +109,47 @@ static const OSSL_FN_ULONG num8[] = { */ #define LIMBSOF(num) ((sizeof(num) + OSSL_FN_BYTES - 1) / OSSL_FN_BYTES) struct test_case_st { - /* Two operands and expected full result */ + /* Two operands and expected full result (possibly two numbers) */ const OSSL_FN_ULONG *op1; size_t op1_size; const OSSL_FN_ULONG *op2; size_t op2_size; - const OSSL_FN_ULONG *ex; - size_t ex_size; + const OSSL_FN_ULONG *ex1; + size_t ex1_size; + const OSSL_FN_ULONG *ex2; + size_t ex2_size; /* Setup sizes for creating OSSL_FNs */ size_t op1_live_size; size_t op2_live_size; - size_t res_live_size; + size_t res1_live_size; + size_t res2_live_size; - /* Number of limbs to compare the result's OSSL_FN_ULONG array against ex */ - size_t check_size; + /* Number of limbs to compare the result's OSSL_FN_ULONG array against ex1 and ex2 */ + size_t check1_size; + size_t check2_size; - /* When the result is larger than check_size, the expected extended value */ - OSSL_FN_ULONG extended_limb_value; + /* When the result is larger than check1_size or check2_size, the expected extended value */ + OSSL_FN_ULONG extended_limb_value1; + OSSL_FN_ULONG extended_limb_value2; #define EXTENDED_LIMB_ZERO ((OSSL_FN_ULONG)0) #define EXTENDED_LIMB_MINUS_ONE ((OSSL_FN_ULONG)-1) }; +/* $num0 + $num0 == 0x10000000000000002 */ static const OSSL_FN_ULONG ex_add_num0_num0[] = { OSSL_FN_ULONG64_C(0x00000000, 0x00000002), OSSL_FN_ULONG_C(0x1), }; +/* $num0 + $num1 == 0x8000000180000001 */ static const OSSL_FN_ULONG ex_add_num0_num1[] = { OSSL_FN_ULONG64_C(0x80000001, 0x80000001), }; +/* $num0 + $num2 == 0x8123456789abcdf0 */ static const OSSL_FN_ULONG ex_add_num0_num2[] = { OSSL_FN_ULONG64_C(0x81234567, 0x89abcdf0), }; +/* $num0 + $num3 == 0x17edcba9876543211 */ static const OSSL_FN_ULONG ex_add_num0_num3[] = { OSSL_FN_ULONG64_C(0x7edcba98, 0x76543211), OSSL_FN_ULONG_C(0x1), @@ -171,12 +191,12 @@ static int test_add_common(struct test_case_st test_case) size_t n1_limbs = test_case.op1_size; const OSSL_FN_ULONG *n2 = test_case.op2; size_t n2_limbs = test_case.op2_size; - const OSSL_FN_ULONG *ex = test_case.ex; + const OSSL_FN_ULONG *ex = test_case.ex1; size_t n1_new_limbs = test_case.op1_live_size; size_t n2_new_limbs = test_case.op2_live_size; - size_t res_limbs = test_case.res_live_size; - size_t check_limbs = test_case.check_size; - OSSL_FN_ULONG extended_value = test_case.extended_limb_value; + size_t res_limbs = test_case.res1_live_size; + size_t check_limbs = test_case.check1_size; + OSSL_FN_ULONG extended_value = test_case.extended_limb_value1; int ret = 1; OSSL_FN *fn1 = NULL, *fn2 = NULL, *res = NULL; const OSSL_FN_ULONG *u = NULL; @@ -210,19 +230,24 @@ end: return ret; } -#define ADD_CASE(i, op1, op2, ex) \ - { \ - /* op1 */ op1, \ - /* op1_size */ LIMBSOF(op1), \ - /* op2 */ op2, \ - /* op2_size */ LIMBSOF(op2), \ - /* ex */ ex, \ - /* ex_size */ LIMBSOF(ex), \ - /* op1_live_size */ LIMBSOF(op1) + 1, \ - /* op2_live_size */ LIMBSOF(op2) + 2, \ - /* res_live_size */ LIMBSOF(ex) + 3, \ - /* check_size */ LIMBSOF(ex), \ - /* extended_limb_value */ EXTENDED_LIMB_ZERO, \ +#define ADD_CASE(i, op1, op2, ex) \ + { \ + /* op1 */ op1, \ + /* op1_size */ LIMBSOF(op1), \ + /* op2 */ op2, \ + /* op2_size */ LIMBSOF(op2), \ + /* ex1 */ ex, \ + /* ex1_size */ LIMBSOF(ex), \ + /* ex2 */ NULL, \ + /* ex2_size */ 0, \ + /* op1_live_size */ LIMBSOF(op1) + 1, \ + /* op2_live_size */ LIMBSOF(op2) + 2, \ + /* res1_live_size */ LIMBSOF(ex) + 3, \ + /* res2_live_size */ 0, \ + /* check1_size */ LIMBSOF(ex), \ + /* check2_size */ 0, \ + /* extended_limb_value1 */ EXTENDED_LIMB_ZERO, \ + /* extended_limb_value2 */ 0, \ } static struct test_case_st test_add_cases[] = { @@ -250,19 +275,24 @@ static int test_add(int i) return test_add_common(test_add_cases[i]); } -#define ADD_TRUNCATED_CASE(i, op1, op2, ex) \ - { \ - /* op1 */ op1, \ - /* op1_size */ LIMBSOF(op1), \ - /* op2 */ op2, \ - /* op2_size */ LIMBSOF(op2), \ - /* ex */ ex, \ - /* ex_size */ LIMBSOF(ex), \ - /* op1_live_size */ LIMBSOF(op1) + 1, \ - /* op2_live_size */ LIMBSOF(op2) + 2, \ - /* res_live_size */ LIMBSOF(ex) - 1, \ - /* check_size */ LIMBSOF(ex) - 1, \ - /* extended_limb_value */ EXTENDED_LIMB_ZERO, \ +#define ADD_TRUNCATED_CASE(i, op1, op2, ex) \ + { \ + /* op1 */ op1, \ + /* op1_size */ LIMBSOF(op1), \ + /* op2 */ op2, \ + /* op2_size */ LIMBSOF(op2), \ + /* ex1 */ ex, \ + /* ex1_size */ LIMBSOF(ex), \ + /* ex2 */ NULL, \ + /* ex2_size */ 0, \ + /* op1_live_size */ LIMBSOF(op1) + 1, \ + /* op2_live_size */ LIMBSOF(op2) + 2, \ + /* res1_live_size */ LIMBSOF(ex) - 1, \ + /* res2_live_size */ 0, \ + /* check1_size */ LIMBSOF(ex) - 1, \ + /* check2_size */ 0, \ + /* extended_limb_value1 */ EXTENDED_LIMB_ZERO, \ + /* extended_limb_value2 */ 0, \ } static struct test_case_st test_add_truncated_cases[] = { @@ -413,12 +443,12 @@ static int test_sub_common(struct test_case_st test_case) size_t n1_limbs = test_case.op1_size; const OSSL_FN_ULONG *n2 = test_case.op2; size_t n2_limbs = test_case.op2_size; - const OSSL_FN_ULONG *ex = test_case.ex; + const OSSL_FN_ULONG *ex = test_case.ex1; size_t n1_new_limbs = test_case.op1_live_size; size_t n2_new_limbs = test_case.op2_live_size; - size_t res_limbs = test_case.res_live_size; - size_t check_limbs = test_case.check_size; - OSSL_FN_ULONG extended_value = test_case.extended_limb_value; + size_t res_limbs = test_case.res1_live_size; + size_t check_limbs = test_case.check1_size; + OSSL_FN_ULONG extended_value = test_case.extended_limb_value1; int ret = 1; OSSL_FN *fn1 = NULL, *fn2 = NULL, *res = NULL; const OSSL_FN_ULONG *u = NULL; @@ -458,13 +488,18 @@ end: /* op1_size */ LIMBSOF(op1), \ /* op2 */ op2, \ /* op2_size */ LIMBSOF(op2), \ - /* ex */ ex, \ - /* ex_size */ LIMBSOF(ex), \ + /* ex1 */ ex, \ + /* ex1_size */ LIMBSOF(ex), \ + /* ex2 */ NULL, \ + /* ex2_size */ 0, \ /* op1_live_size */ LIMBSOF(op1) + 1, \ /* op2_live_size */ LIMBSOF(op2) + 2, \ - /* res_live_size */ LIMBSOF(ex) + 3, \ - /* check_size */ LIMBSOF(ex), \ - /* extended_limb_value */ (ext), \ + /* res1_live_size */ LIMBSOF(ex) + 3, \ + /* res2_live_size */ 0, \ + /* check1_size */ LIMBSOF(ex), \ + /* check2_size */ 0, \ + /* extended_limb_value1 */ (ext), \ + /* extended_limb_value2 */ 0, \ } static struct test_case_st test_sub_cases[] = { @@ -493,19 +528,24 @@ static int test_sub(int i) return test_sub_common(test_sub_cases[i]); } -#define SUB_TRUNCATED_CASE(i, op1, op2, ex) \ - { \ - /* op1 */ op1, \ - /* op1_size */ LIMBSOF(op1), \ - /* op2 */ op2, \ - /* op2_size */ LIMBSOF(op2), \ - /* ex */ ex, \ - /* ex_size */ LIMBSOF(ex), \ - /* op1_live_size */ LIMBSOF(op1) + 1, \ - /* op2_live_size */ LIMBSOF(op2) + 2, \ - /* res_live_size */ LIMBSOF(ex) - 1, \ - /* check_size */ LIMBSOF(ex) - 1, \ - /* extended_limb_value */ EXTENDED_LIMB_ZERO, \ +#define SUB_TRUNCATED_CASE(i, op1, op2, ex) \ + { \ + /* op1 */ op1, \ + /* op1_size */ LIMBSOF(op1), \ + /* op2 */ op2, \ + /* op2_size */ LIMBSOF(op2), \ + /* ex1 */ ex, \ + /* ex1_size */ LIMBSOF(ex), \ + /* ex2 */ NULL, \ + /* ex2_size */ 0, \ + /* op1_live_size */ LIMBSOF(op1) + 1, \ + /* op2_live_size */ LIMBSOF(op2) + 2, \ + /* res1_live_size */ LIMBSOF(ex) - 1, \ + /* res2_live_size */ 0, \ + /* check1_size */ LIMBSOF(ex) - 1, \ + /* check2_size */ 0, \ + /* extended_limb_value1 */ EXTENDED_LIMB_ZERO, \ + /* extended_limb_value2 */ 0, \ } static struct test_case_st test_sub_truncated_cases[] = { @@ -760,6 +800,7 @@ static const OSSL_FN_ULONG ex_mul_num5_num5[] = { OSSL_FN_ULONG64_C(0x00000000, 0x00000001), OSSL_FN_ULONG64_C(0xFFFFFFFF, 0xFFFFFFFE), }; +/* $num6 * $num6 == 0x0100000000000000000000000000000000000000000000000000000000000000 */ static const OSSL_FN_ULONG ex_mul_num6_num6[] = { OSSL_FN_ULONG64_C(0x00000000, 0x00000000), OSSL_FN_ULONG64_C(0x00000000, 0x00000000), @@ -880,12 +921,12 @@ static int test_mul_common(struct test_case_st test_case) size_t n1_limbs = test_case.op1_size; const OSSL_FN_ULONG *n2 = test_case.op2; size_t n2_limbs = test_case.op2_size; - const OSSL_FN_ULONG *ex = test_case.ex; + const OSSL_FN_ULONG *ex = test_case.ex1; size_t n1_new_limbs = test_case.op1_live_size; size_t n2_new_limbs = test_case.op2_live_size; - size_t res_limbs = test_case.res_live_size; - size_t check_limbs = test_case.check_size; - OSSL_FN_ULONG extended_value = test_case.extended_limb_value; + size_t res_limbs = test_case.res1_live_size; + size_t check_limbs = test_case.check1_size; + OSSL_FN_ULONG extended_value = test_case.extended_limb_value1; OSSL_FN *fn1 = NULL, *fn2 = NULL, *res = NULL; const OSSL_FN_ULONG *u = NULL; @@ -922,19 +963,24 @@ end: } /* i should be set to match the iteration number that's displayed when testing */ -#define MUL_CASE(i, op1, op2, ex) \ - { \ - /* op1 */ op1, \ - /* op1_size */ LIMBSOF(op1), \ - /* op2 */ op2, \ - /* op2_size */ LIMBSOF(op2), \ - /* ex */ ex, \ - /* ex_size */ LIMBSOF(ex), \ - /* op1_live_size */ LIMBSOF(op1) + 1, \ - /* op2_live_size */ LIMBSOF(op2) + 2, \ - /* res_live_size */ LIMBSOF(op1) + LIMBSOF(op2) + ((i - 1) % 4), \ - /* check_size */ LIMBSOF(ex), \ - /* extended_limb_value */ EXTENDED_LIMB_ZERO, \ +#define MUL_CASE(i, op1, op2, ex) \ + { \ + /* op1 */ op1, \ + /* op1_size */ LIMBSOF(op1), \ + /* op2 */ op2, \ + /* op2_size */ LIMBSOF(op2), \ + /* ex1 */ ex, \ + /* ex1_size */ LIMBSOF(ex), \ + /* ex2 */ ex, \ + /* ex2_size */ 0, \ + /* op1_live_size */ LIMBSOF(op1) + 1, \ + /* op2_live_size */ LIMBSOF(op2) + 2, \ + /* res1_live_size */ LIMBSOF(op1) + LIMBSOF(op2) + ((i - 1) % 4), \ + /* res2_live_size */ 0, \ + /* check1_size */ LIMBSOF(ex), \ + /* check2_size */ 0, \ + /* extended_limb_value1 */ EXTENDED_LIMB_ZERO, \ + /* extended_limb_value2 */ 0, \ } static struct test_case_st test_mul_cases[] = { @@ -967,34 +1013,44 @@ static int test_mul(int i) } /* i should be set to match the iteration number that's displayed when testing */ -#define MUL_TRUNCATED_CASE(i, op1, op2, ex) \ - { \ - /* op1 */ op1, \ - /* op1_size */ LIMBSOF(op1), \ - /* op2 */ op2, \ - /* op2_size */ LIMBSOF(op2), \ - /* ex */ ex, \ - /* ex_size */ LIMBSOF(ex), \ - /* op1_live_size */ LIMBSOF(op1) + 1, \ - /* op2_live_size */ LIMBSOF(op2) + 2, \ - /* res_live_size */ LIMBSOF(ex) / 2, \ - /* check_size */ LIMBSOF(ex) / 2, \ - /* extended_limb_value */ EXTENDED_LIMB_ZERO, \ +#define MUL_TRUNCATED_CASE(i, op1, op2, ex) \ + { \ + /* op1 */ op1, \ + /* op1_size */ LIMBSOF(op1), \ + /* op2 */ op2, \ + /* op2_size */ LIMBSOF(op2), \ + /* ex1 */ ex, \ + /* ex1_size */ LIMBSOF(ex), \ + /* ex2 */ NULL, \ + /* ex2_size */ 0, \ + /* op1_live_size */ LIMBSOF(op1) + 1, \ + /* op2_live_size */ LIMBSOF(op2) + 2, \ + /* res1_live_size */ LIMBSOF(ex) / 2, \ + /* res2_live_size */ 0, \ + /* check1_size */ LIMBSOF(ex) / 2, \ + /* check2_size */ 0, \ + /* extended_limb_value1 */ EXTENDED_LIMB_ZERO, \ + /* extended_limb_value2 */ 0, \ } /* A special case, where the truncation is set to the size of ex minus 64 bits */ -#define MUL_TRUNCATED_SPECIAL_CASE1(i, op1, op2, ex) \ - { \ - /* op1 */ op1, \ - /* op1_size */ LIMBSOF(op1), \ - /* op2 */ op2, \ - /* op2_size */ LIMBSOF(op2), \ - /* ex */ ex, \ - /* ex_size */ LIMBSOF(ex), \ - /* op1_live_size */ LIMBSOF(op1) + 1, \ - /* op2_live_size */ LIMBSOF(op2) + 2, \ - /* res_live_size */ LIMBSOF(ex) - 8 / OSSL_FN_BYTES, \ - /* check_size */ LIMBSOF(ex) - 8 / OSSL_FN_BYTES, \ - /* extended_limb_value */ EXTENDED_LIMB_ZERO, \ +#define MUL_TRUNCATED_SPECIAL_CASE1(i, op1, op2, ex) \ + { \ + /* op1 */ op1, \ + /* op1_size */ LIMBSOF(op1), \ + /* op2 */ op2, \ + /* op2_size */ LIMBSOF(op2), \ + /* ex1 */ ex, \ + /* ex1_size */ LIMBSOF(ex), \ + /* ex2 */ NULL, \ + /* ex2_size */ 0, \ + /* op1_live_size */ LIMBSOF(op1) + 1, \ + /* op2_live_size */ LIMBSOF(op2) + 2, \ + /* res1_live_size */ LIMBSOF(ex) - 8 / OSSL_FN_BYTES, \ + /* res2_live_size */ 0, \ + /* check1_size */ LIMBSOF(ex) - 8 / OSSL_FN_BYTES, \ + /* check2_size */ 0, \ + /* extended_limb_value1 */ EXTENDED_LIMB_ZERO, \ + /* extended_limb_value2 */ 0, \ } static struct test_case_st test_mul_truncate_cases[] = { @@ -1116,11 +1172,11 @@ static int test_sqr_common(struct test_case_st test_case) int ret = 1; const OSSL_FN_ULONG *n1 = test_case.op1; size_t n1_limbs = test_case.op1_size; - const OSSL_FN_ULONG *ex = test_case.ex; + const OSSL_FN_ULONG *ex = test_case.ex1; size_t n1_new_limbs = test_case.op1_live_size; - size_t res_limbs = test_case.res_live_size; - size_t check_limbs = test_case.check_size; - OSSL_FN_ULONG extended_value = test_case.extended_limb_value; + size_t res_limbs = test_case.res1_live_size; + size_t check_limbs = test_case.check1_size; + OSSL_FN_ULONG extended_value = test_case.extended_limb_value1; OSSL_FN *fn1 = NULL, *res = NULL; const OSSL_FN_ULONG *u = NULL; @@ -1154,19 +1210,24 @@ end: } /* i should be set to match the iteration number that's displayed when testing */ -#define SQR_CASE(i, op1, ex) \ - { \ - /* op1 */ op1, \ - /* op1_size */ LIMBSOF(op1), \ - /* op2 */ NULL, \ - /* op2_size */ 0, \ - /* ex */ ex, \ - /* ex_size */ LIMBSOF(ex), \ - /* op1_live_size */ LIMBSOF(op1) + 1, \ - /* op2_live_size */ 0, \ - /* res_live_size */ LIMBSOF(op1) * 2 + ((i - 1) % 4), \ - /* check_size */ LIMBSOF(ex), \ - /* extended_limb_value */ EXTENDED_LIMB_ZERO, \ +#define SQR_CASE(i, op1, ex) \ + { \ + /* op1 */ op1, \ + /* op1_size */ LIMBSOF(op1), \ + /* op2 */ NULL, \ + /* op2_size */ 0, \ + /* ex1 */ ex, \ + /* ex1_size */ LIMBSOF(ex), \ + /* ex2 */ NULL, \ + /* ex2_size */ 0, \ + /* op1_live_size */ LIMBSOF(op1) + 1, \ + /* op2_live_size */ 0, \ + /* res1_live_size */ LIMBSOF(op1) * 2 + ((i - 1) % 4), \ + /* res2_live_size */ 0, \ + /* check_size */ LIMBSOF(ex), \ + /* check_size */ 0, \ + /* extended_limb_value */ EXTENDED_LIMB_ZERO, \ + /* extended_limb_value */ 0, \ } static struct test_case_st test_sqr_cases[] = { @@ -1188,34 +1249,44 @@ static int test_sqr(int i) } /* i should be set to match the iteration number that's displayed when testing */ -#define SQR_TRUNCATED_CASE(i, op1, ex) \ - { \ - /* op1 */ op1, \ - /* op1_size */ LIMBSOF(op1), \ - /* op2 */ NULL, \ - /* op2_size */ 0, \ - /* ex */ ex, \ - /* ex_size */ LIMBSOF(ex), \ - /* op1_live_size */ LIMBSOF(op1) + 1, \ - /* op2_live_size */ 0, \ - /* res_live_size */ LIMBSOF(ex) / 2, \ - /* check_size */ LIMBSOF(ex) / 2, \ - /* extended_limb_value */ EXTENDED_LIMB_ZERO, \ +#define SQR_TRUNCATED_CASE(i, op1, ex) \ + { \ + /* op1 */ op1, \ + /* op1_size */ LIMBSOF(op1), \ + /* op2 */ NULL, \ + /* op2_size */ 0, \ + /* ex1 */ ex, \ + /* ex1_size */ LIMBSOF(ex), \ + /* ex2 */ NULL, \ + /* ex2_size */ 0, \ + /* op1_live_size */ LIMBSOF(op1) + 1, \ + /* op2_live_size */ 0, \ + /* res1_live_size */ LIMBSOF(ex) / 2, \ + /* res2_live_size */ 0, \ + /* check1_size */ LIMBSOF(ex) / 2, \ + /* check2_size */ 0, \ + /* extended_limb_value1 */ EXTENDED_LIMB_ZERO, \ + /* extended_limb_value2 */ 0, \ } /* A special case, where the truncation is set to the size of ex minus 64 bits */ -#define SQR_TRUNCATED_SPECIAL_CASE1(i, op1, ex) \ - { \ - /* op1 */ op1, \ - /* op1_size */ LIMBSOF(op1), \ - /* op2 */ NULL, \ - /* op2_size */ 0, \ - /* ex */ ex, \ - /* ex_size */ LIMBSOF(ex), \ - /* op1_live_size */ LIMBSOF(op1) + 1, \ - /* op2_live_size */ 0, \ - /* res_live_size */ LIMBSOF(ex) - 8 / OSSL_FN_BYTES, \ - /* check_size */ LIMBSOF(ex) - 8 / OSSL_FN_BYTES, \ - /* extended_limb_value */ EXTENDED_LIMB_ZERO, \ +#define SQR_TRUNCATED_SPECIAL_CASE1(i, op1, ex) \ + { \ + /* op1 */ op1, \ + /* op1_size */ LIMBSOF(op1), \ + /* op2 */ NULL, \ + /* op2_size */ 0, \ + /* ex1 */ ex, \ + /* ex1_size */ LIMBSOF(ex), \ + /* ex2 */ NULL, \ + /* ex2_size */ 0, \ + /* op1_live_size */ LIMBSOF(op1) + 1, \ + /* op2_live_size */ 0, \ + /* res1_live_size */ LIMBSOF(ex) - 8 / OSSL_FN_BYTES, \ + /* res2_live_size */ 0, \ + /* check1_size */ LIMBSOF(ex) - 8 / OSSL_FN_BYTES, \ + /* check2_size */ 0, \ + /* extended_limb_value1 */ EXTENDED_LIMB_ZERO, \ + /* extended_limb_value2 */ 0, \ } static struct test_case_st test_sqr_truncate_cases[] = { @@ -1236,6 +1307,597 @@ static int test_sqr_truncated(int i) return test_sqr_common(test_sqr_truncate_cases[i]); } +/* A set of expected results, also in OSSL_FN_ULONG array form */ +/* : $num0 / $num0 == 1 */ +static const OSSL_FN_ULONG ex_div_num0_num0[] = { + OSSL_FN_ULONG64_C(0x00000000, 0x00000001), +}; +/* : $num0 % $num0 == 0 */ +static const OSSL_FN_ULONG ex_rem_num0_num0[] = { + OSSL_FN_ULONG64_C(0x00000000, 0x00000000), +}; +/* : $num0 / $num1 == 0x55555555 */ +static const OSSL_FN_ULONG ex_div_num0_num1[] = { + OSSL_FN_ULONG64_C(0x00000000, 0x55555555), +}; +/* : $num0 % $num1 == 0x80000001 */ +static const OSSL_FN_ULONG ex_rem_num0_num1[] = { + OSSL_FN_ULONG64_C(0x00000000, 0x80000001), +}; +/* : $num0 / $num2 == 0x70 */ +static const OSSL_FN_ULONG ex_div_num0_num2[] = { + OSSL_FN_ULONG64_C(0x00000000, 0x00000070), +}; +/* : $num0 % $num2 == 0x91a2b3 c4d5e771 */ +static const OSSL_FN_ULONG ex_rem_num0_num2[] = { + OSSL_FN_ULONG64_C(0x0091A2B3, 0xC4D5E771), +}; +/* : $num0 / $num3 == 1 */ +static const OSSL_FN_ULONG ex_div_num0_num3[] = { + OSSL_FN_ULONG64_C(0x00000000, 0x00000000), +}; +/* : $num0 % $num3 == 0x9abcdef 01234569 */ +static const OSSL_FN_ULONG ex_rem_num0_num3[] = { + OSSL_FN_ULONG64_C(0x80000000, 0x00000001), +}; +/* : $num1 / $num0 == 0 */ +static const OSSL_FN_ULONG ex_div_num1_num0[] = { + OSSL_FN_ULONG64_C(0x00000000, 0x00000000), +}; +/* : $num1 % $num0 == 0x180000000 */ +static const OSSL_FN_ULONG ex_rem_num1_num0[] = { + OSSL_FN_ULONG64_C(0x00000001, 0x80000000), +}; +/* : $num1 / $num1 == 1 */ +static const OSSL_FN_ULONG ex_div_num1_num1[] = { + OSSL_FN_ULONG64_C(0x00000000, 0x00000001), +}; +/* : $num1 % $num1 == 0 */ +static const OSSL_FN_ULONG ex_rem_num1_num1[] = { + OSSL_FN_ULONG64_C(0x00000000, 0x00000000), +}; +/* : $num1 / $num2 == 0 */ +static const OSSL_FN_ULONG ex_div_num1_num2[] = { + OSSL_FN_ULONG64_C(0x00000000, 0x00000000), +}; +/* : $num1 % $num2 == 0x180000000 */ +static const OSSL_FN_ULONG ex_rem_num1_num2[] = { + OSSL_FN_ULONG64_C(0x00000001, 0x80000000), +}; +/* : $num1 / $num3 == 0 */ +static const OSSL_FN_ULONG ex_div_num1_num3[] = { + OSSL_FN_ULONG64_C(0x00000000, 0x00000000), +}; +/* : $num1 % $num3 == 0x180000000 */ +static const OSSL_FN_ULONG ex_rem_num1_num3[] = { + OSSL_FN_ULONG64_C(0x00000001, 0x80000000), +}; +/* : $num2 / $num0 == 0 */ +static const OSSL_FN_ULONG ex_div_num2_num0[] = { + OSSL_FN_ULONG64_C(0x00000000, 0x00000000), +}; +/* : $num2 % $num0 == 0X123456789abcdef */ +static const OSSL_FN_ULONG ex_rem_num2_num0[] = { + OSSL_FN_ULONG64_C(0X01234567, 0x89ABCDEF), +}; +/* : $num2 / $num1 == 0xc22e45 */ +static const OSSL_FN_ULONG ex_div_num2_num1[] = { + OSSL_FN_ULONG64_C(0x00000000, 0x00C22E45), +}; +/* : $num2 % $num1 == 0x9abcdef */ +static const OSSL_FN_ULONG ex_rem_num2_num1[] = { + OSSL_FN_ULONG64_C(0x00000000, 0x09ABCDEF), +}; +/* : $num2 / $num2 == 1 */ +static const OSSL_FN_ULONG ex_div_num2_num2[] = { + OSSL_FN_ULONG64_C(0x00000000, 0x00000001), +}; +/* : $num2 % $num2 == 0 */ +static const OSSL_FN_ULONG ex_rem_num2_num2[] = { + OSSL_FN_ULONG64_C(0x00000000, 0x00000000), +}; +/* : $num2 / $num3 == 0 */ +static const OSSL_FN_ULONG ex_div_num2_num3[] = { + OSSL_FN_ULONG64_C(0x00000000, 0x00000000), +}; +/* : $num2 % $num3 == 0X0123456789abcdef */ +static const OSSL_FN_ULONG ex_rem_num2_num3[] = { + OSSL_FN_ULONG64_C(0X01234567, 0x89ABCDEF), +}; +/* : $num3 / $num0 == 1 */ +static const OSSL_FN_ULONG ex_div_num3_num0[] = { + OSSL_FN_ULONG64_C(0x00000000, 0x00000001), +}; +/* : $num3 % $num0 == 0x7edcba987654320f */ +static const OSSL_FN_ULONG ex_rem_num3_num0[] = { + OSSL_FN_ULONG64_C(0x7edcba98, 0x7654320f), +}; +/* : $num3 / $num1 == 0xa9e87c65 */ +static const OSSL_FN_ULONG ex_div_num3_num1[] = { + OSSL_FN_ULONG64_C(0x00000000, 0xa9e87c65), +}; +/* : $num3 % $num1 == 0x00000000f6543210 */ +static const OSSL_FN_ULONG ex_rem_num3_num1[] = { + OSSL_FN_ULONG64_C(0x00000000, 0xf6543210), +}; +/* : $num3 / $num2 == 0xe0 */ +static const OSSL_FN_ULONG ex_div_num3_num2[] = { + OSSL_FN_ULONG64_C(0x00000000, 0x000000e0), +}; +/* : $num3 % $num2 == 0xf0 */ +static const OSSL_FN_ULONG ex_rem_num3_num2[] = { + OSSL_FN_ULONG64_C(0x00000000, 0x000000f0), +}; +/* : $num3 / $num3 == 1 */ +static const OSSL_FN_ULONG ex_div_num3_num3[] = { + OSSL_FN_ULONG64_C(0x00000000, 0x00000001), +}; +/* : $num3 % $num3 == o */ +static const OSSL_FN_ULONG ex_rem_num3_num3[] = { + OSSL_FN_ULONG64_C(0x00000000, 0x00000000), +}; +/* Expected results for edge cases */ +/* $num5 / $num5 == 1 */ +static const OSSL_FN_ULONG ex_div_num5_num5[] = { + OSSL_FN_ULONG64_C(0x00000000, 0x00000001), +}; +/* $num5 % $num5 == 0 */ +static const OSSL_FN_ULONG ex_rem_num5_num5[] = { + OSSL_FN_ULONG64_C(0x00000000, 0x00000000), +}; +/* $num6 / $num6 == 1 */ +static const OSSL_FN_ULONG ex_div_num6_num6[] = { + OSSL_FN_ULONG64_C(0x00000000, 0x00000001), + OSSL_FN_ULONG64_C(0x00000000, 0x00000000), +}; +/* $num6 % $num6 == 0 */ +static const OSSL_FN_ULONG ex_rem_num6_num6[] = { + OSSL_FN_ULONG64_C(0x00000000, 0x00000000), + OSSL_FN_ULONG64_C(0x00000000, 0x00000000), +}; + +static int test_div_common(struct test_case_st test_case) +{ + int ret = 1; + const OSSL_FN_ULONG *n = test_case.op1; + size_t n_limbs = test_case.op1_size; + const OSSL_FN_ULONG *d = test_case.op2; + size_t d_limbs = test_case.op2_size; + const OSSL_FN_ULONG *ex_q = test_case.ex1; + const OSSL_FN_ULONG *ex_r = test_case.ex2; + size_t n_new_limbs = test_case.op1_live_size; + size_t d_new_limbs = test_case.op2_live_size; + size_t q_limbs = test_case.res1_live_size; + size_t r_limbs = test_case.res2_live_size; + size_t check_q_limbs = test_case.check1_size; + size_t check_r_limbs = test_case.check2_size; + OSSL_FN_ULONG extended_q = test_case.extended_limb_value1; + OSSL_FN_ULONG extended_r = test_case.extended_limb_value2; + OSSL_FN *fn = NULL, *fd = NULL, *fq = NULL, *fr = NULL; + const OSSL_FN_ULONG *u = NULL; + /* Calculate total number of limbs for OSSL_FN_CTX */ + size_t ctx_numcopy_limbs = ((n_new_limbs <= d_new_limbs) ? d_new_limbs : n_new_limbs) + 1; + size_t ctx_divcopy_limbs = d_new_limbs; + size_t ctx_tmp_limbs = d_new_limbs + 1; + size_t ctx_res_limbs = n_new_limbs; + size_t ctx_max_limbs = ctx_numcopy_limbs + ctx_divcopy_limbs + ctx_res_limbs + ctx_tmp_limbs; + + OSSL_FN_CTX *ctx = NULL; + if (!TEST_ptr(ctx = OSSL_FN_CTX_new(NULL, 1, 4, ctx_max_limbs)) + || !TEST_ptr(fn = OSSL_FN_new_limbs(n_new_limbs)) + || !TEST_ptr(fd = OSSL_FN_new_limbs(d_new_limbs)) + || !TEST_true(ossl_fn_set_words(fn, n, n_limbs)) + || !TEST_true(ossl_fn_set_words(fd, d, d_limbs)) + || !TEST_ptr(fq = OSSL_FN_new_limbs(q_limbs)) + || !TEST_ptr(fr = OSSL_FN_new_limbs(r_limbs))) { + ret = 0; + /* There's no way to continue tests in this case */ + goto end; + } + + /* To test that OSSL_FN_div() does a complete job, 'res' is pre-polluted */ + + if (!TEST_true(pollute(fq, 0, q_limbs)) + || !TEST_true(pollute(fr, 0, r_limbs)) + || !TEST_true(OSSL_FN_div(fq, fr, fn, fd, ctx)) + || !TEST_ptr(u = ossl_fn_get_words(fq)) + || !TEST_mem_eq(u, check_q_limbs * OSSL_FN_BYTES, + ex_q, check_q_limbs * OSSL_FN_BYTES) + || !TEST_ptr(u = ossl_fn_get_words(fr)) + || !TEST_mem_eq(u, check_r_limbs * OSSL_FN_BYTES, + ex_r, check_r_limbs * OSSL_FN_BYTES) + || !TEST_true(check_limbs_value(fq, check_q_limbs, q_limbs, extended_q)) + || !TEST_true(check_limbs_value(fr, check_r_limbs, r_limbs, extended_r))) + ret = 0; + +end: + OSSL_FN_CTX_free(ctx); + OSSL_FN_free(fn); + OSSL_FN_free(fd); + OSSL_FN_free(fq); + OSSL_FN_free(fr); + + return ret; +} + +/* i should be set to match the iteration number that's displayed when testing */ +#define DIV_CASE(i, op1, op2, ex_q, ex_r) \ + { \ + /* op1 */ op1, \ + /* op1_size */ LIMBSOF(op1), \ + /* op2 */ op2, \ + /* op2_size */ LIMBSOF(op2), \ + /* ex1 */ ex_q, \ + /* ex1_size */ LIMBSOF(ex_q), \ + /* ex2 */ ex_r, \ + /* ex2_size */ LIMBSOF(ex_r), \ + /* op1_live_size */ LIMBSOF(op1) + 1, \ + /* op2_live_size */ LIMBSOF(op2) + 2, \ + /* res1_live_size */ LIMBSOF(op1) + ((i - 1) % 4), \ + /* res2_live_size */ LIMBSOF(op1) + ((i - 1) % 4), \ + /* check1_size */ LIMBSOF(ex_q), \ + /* check2_size */ LIMBSOF(ex_r), \ + /* extended_limb_value1 */ EXTENDED_LIMB_ZERO, \ + /* extended_limb_value2 */ EXTENDED_LIMB_ZERO, \ + } + +static struct test_case_st test_div_cases[] = { + DIV_CASE(1, num0, num0, ex_div_num0_num0, ex_rem_num0_num0), + DIV_CASE(2, num0, num1, ex_div_num0_num1, ex_rem_num0_num1), + DIV_CASE(3, num0, num2, ex_div_num0_num2, ex_rem_num0_num2), + DIV_CASE(4, num0, num3, ex_div_num0_num3, ex_rem_num0_num3), + DIV_CASE(5, num1, num0, ex_div_num1_num0, ex_rem_num1_num0), + DIV_CASE(6, num1, num1, ex_div_num1_num1, ex_rem_num1_num1), + DIV_CASE(7, num1, num2, ex_div_num1_num2, ex_rem_num1_num2), + DIV_CASE(8, num1, num3, ex_div_num1_num3, ex_rem_num1_num3), + DIV_CASE(9, num2, num0, ex_div_num2_num0, ex_rem_num2_num0), + DIV_CASE(10, num2, num1, ex_div_num2_num1, ex_rem_num2_num1), + DIV_CASE(11, num2, num2, ex_div_num2_num2, ex_rem_num2_num2), + DIV_CASE(12, num2, num3, ex_div_num2_num3, ex_rem_num2_num3), + DIV_CASE(13, num3, num0, ex_div_num3_num0, ex_rem_num3_num0), + DIV_CASE(14, num3, num1, ex_div_num3_num1, ex_rem_num3_num1), + DIV_CASE(15, num3, num2, ex_div_num3_num2, ex_rem_num3_num2), + DIV_CASE(16, num3, num3, ex_div_num3_num3, ex_rem_num3_num3), + + /* Edge cases */ + DIV_CASE(17, num5, num5, ex_div_num5_num5, ex_rem_num5_num5), + DIV_CASE(18, num6, num6, ex_div_num6_num6, ex_rem_num6_num6), +}; + +static int test_div(int i) +{ + return test_div_common(test_div_cases[i]); +} + +/* i should be set to match the iteration number that's displayed when testing */ +#define DIV_TRUNCATED_CASE(i, op1, op2, ex_q, ex_r) \ + { \ + /* op1 */ op1, \ + /* op1_size */ LIMBSOF(op1), \ + /* op2 */ op2, \ + /* op2_size */ LIMBSOF(op2), \ + /* ex1 */ ex_q, \ + /* ex1_size */ LIMBSOF(ex_q), \ + /* ex2 */ ex_r, \ + /* ex2_size */ LIMBSOF(ex_r), \ + /* op1_live_size */ LIMBSOF(op1) + 1, \ + /* op2_live_size */ LIMBSOF(op2) + 2, \ + /* res1_live_size */ LIMBSOF(ex_q) / 2, \ + /* res2_live_size */ LIMBSOF(ex_r) / 2, \ + /* check1_size */ LIMBSOF(ex_q) / 2, \ + /* check2_size */ LIMBSOF(ex_r) / 2, \ + /* extended_limb_value1 */ EXTENDED_LIMB_ZERO, \ + /* extended_limb_value2 */ EXTENDED_LIMB_ZERO, \ + } + +static struct test_case_st test_div_truncate_cases[] = { + DIV_TRUNCATED_CASE(1, num0, num0, ex_div_num0_num0, ex_rem_num0_num0), + DIV_TRUNCATED_CASE(2, num0, num1, ex_div_num0_num1, ex_rem_num0_num1), + DIV_TRUNCATED_CASE(3, num0, num2, ex_div_num0_num2, ex_rem_num0_num2), + DIV_TRUNCATED_CASE(4, num0, num3, ex_div_num0_num3, ex_rem_num0_num3), + DIV_TRUNCATED_CASE(5, num1, num0, ex_div_num1_num0, ex_rem_num1_num0), + DIV_TRUNCATED_CASE(6, num1, num1, ex_div_num1_num1, ex_rem_num1_num1), + DIV_TRUNCATED_CASE(7, num1, num2, ex_div_num1_num2, ex_rem_num1_num2), + DIV_TRUNCATED_CASE(8, num1, num3, ex_div_num1_num3, ex_rem_num1_num3), + DIV_TRUNCATED_CASE(9, num2, num0, ex_div_num2_num0, ex_rem_num2_num0), + DIV_TRUNCATED_CASE(10, num2, num1, ex_div_num2_num1, ex_rem_num2_num1), + DIV_TRUNCATED_CASE(11, num2, num2, ex_div_num2_num2, ex_rem_num2_num2), + DIV_TRUNCATED_CASE(12, num2, num3, ex_div_num2_num3, ex_rem_num2_num3), + DIV_TRUNCATED_CASE(13, num3, num0, ex_div_num3_num0, ex_rem_num3_num0), + DIV_TRUNCATED_CASE(14, num3, num1, ex_div_num3_num1, ex_rem_num3_num1), + DIV_TRUNCATED_CASE(15, num3, num2, ex_div_num3_num2, ex_rem_num3_num2), + DIV_TRUNCATED_CASE(16, num3, num3, ex_div_num3_num3, ex_rem_num3_num3), + + /* Edge cases */ + DIV_TRUNCATED_CASE(17, num5, num5, ex_div_num5_num5, ex_rem_num5_num5), + DIV_TRUNCATED_CASE(18, num6, num6, ex_div_num6_num6, ex_rem_num6_num6), +}; + +static int test_div_truncated(int i) +{ + return test_div_common(test_div_truncate_cases[i]); +} + +/* + * The modulo tests are a bit silly, 'cause we know that OSSL_FN_mod() + * simply calls OSSL_FN_div() with NULL for the quotient. Still, these + * tests ensure that calling OSSL_FN_div() like that works without flaws. + */ +static int test_mod_common(struct test_case_st test_case) +{ + int ret = 1; + const OSSL_FN_ULONG *n = test_case.op1; + size_t n_limbs = test_case.op1_size; + const OSSL_FN_ULONG *d = test_case.op2; + size_t d_limbs = test_case.op2_size; + const OSSL_FN_ULONG *ex = test_case.ex1; + size_t n_new_limbs = test_case.op1_live_size; + size_t d_new_limbs = test_case.op2_live_size; + size_t res_limbs = test_case.res1_live_size; + size_t check_res_limbs = test_case.check1_size; + OSSL_FN_ULONG extended_res = test_case.extended_limb_value1; + OSSL_FN *fn = NULL, *fd = NULL, *fres = NULL; + const OSSL_FN_ULONG *u = NULL; + /* Calculate total number of limbs for OSSL_FN_CTX */ + size_t ctx_numcopy_limbs = ((n_new_limbs <= d_new_limbs) ? d_new_limbs : n_new_limbs) + 1; + size_t ctx_divcopy_limbs = d_new_limbs; + size_t ctx_tmp_limbs = d_new_limbs + 1; + size_t ctx_res_limbs = n_new_limbs; + size_t ctx_max_limbs = ctx_numcopy_limbs + ctx_divcopy_limbs + ctx_res_limbs + ctx_tmp_limbs; + + OSSL_FN_CTX *ctx = NULL; + if (!TEST_ptr(ctx = OSSL_FN_CTX_new(NULL, 1, 4, ctx_max_limbs)) + || !TEST_ptr(fn = OSSL_FN_new_limbs(n_new_limbs)) + || !TEST_ptr(fd = OSSL_FN_new_limbs(d_new_limbs)) + || !TEST_true(ossl_fn_set_words(fn, n, n_limbs)) + || !TEST_true(ossl_fn_set_words(fd, d, d_limbs)) + || !TEST_ptr(fres = OSSL_FN_new_limbs(res_limbs))) { + ret = 0; + /* There's no way to continue tests in this case */ + goto end; + } + + /* To test that OSSL_FN_mod() does a complete job, 'res' is pre-polluted */ + + if (!TEST_true(pollute(fres, 0, res_limbs)) + || !TEST_true(OSSL_FN_mod(fres, fn, fd, ctx)) + || !TEST_ptr(u = ossl_fn_get_words(fres)) + || !TEST_mem_eq(u, check_res_limbs * OSSL_FN_BYTES, + ex, check_res_limbs * OSSL_FN_BYTES) + || !TEST_true(check_limbs_value(fres, check_res_limbs, res_limbs, extended_res))) + ret = 0; + +end: + OSSL_FN_CTX_free(ctx); + OSSL_FN_free(fn); + OSSL_FN_free(fd); + OSSL_FN_free(fres); + + return ret; +} + +/* i should be set to match the iteration number that's displayed when testing */ +#define MOD_CASE(i, op1, op2, ex) \ + { \ + /* op1 */ op1, \ + /* op1_size */ LIMBSOF(op1), \ + /* op2 */ op2, \ + /* op2_size */ LIMBSOF(op2), \ + /* ex1 */ ex, \ + /* ex1_size */ LIMBSOF(ex), \ + /* ex2 */ NULL, \ + /* ex2_size */ 0, \ + /* op1_live_size */ LIMBSOF(op1) + 1, \ + /* op2_live_size */ LIMBSOF(op2) + 2, \ + /* res1_live_size */ LIMBSOF(op1) + ((i - 1) % 4), \ + /* res2_live_size */ LIMBSOF(op1) + ((i - 1) % 4), \ + /* check1_size */ LIMBSOF(ex), \ + /* check2_size */ 0, \ + /* extended_limb_value1 */ EXTENDED_LIMB_ZERO, \ + /* extended_limb_value2 */ 0, \ + } + +static struct test_case_st test_mod_cases[] = { + MOD_CASE(1, num0, num0, ex_rem_num0_num0), + MOD_CASE(2, num0, num1, ex_rem_num0_num1), + MOD_CASE(3, num0, num2, ex_rem_num0_num2), + MOD_CASE(4, num0, num3, ex_rem_num0_num3), + MOD_CASE(5, num1, num0, ex_rem_num1_num0), + MOD_CASE(6, num1, num1, ex_rem_num1_num1), + MOD_CASE(7, num1, num2, ex_rem_num1_num2), + MOD_CASE(8, num1, num3, ex_rem_num1_num3), + MOD_CASE(9, num2, num0, ex_rem_num2_num0), + MOD_CASE(10, num2, num1, ex_rem_num2_num1), + MOD_CASE(11, num2, num2, ex_rem_num2_num2), + MOD_CASE(12, num2, num3, ex_rem_num2_num3), + MOD_CASE(13, num3, num0, ex_rem_num3_num0), + MOD_CASE(14, num3, num1, ex_rem_num3_num1), + MOD_CASE(15, num3, num2, ex_rem_num3_num2), + MOD_CASE(16, num3, num3, ex_rem_num3_num3), + + /* Edge cases */ + MOD_CASE(17, num5, num5, ex_rem_num5_num5), + MOD_CASE(18, num6, num6, ex_rem_num6_num6), +}; + +static int test_mod(int i) +{ + return test_mod_common(test_mod_cases[i]); +} + +/* i should be set to match the iteration number that's displayed when testing */ +#define MOD_TRUNCATED_CASE(i, op1, op2, ex) \ + { \ + /* op1 */ op1, \ + /* op1_size */ LIMBSOF(op1), \ + /* op2 */ op2, \ + /* op2_size */ LIMBSOF(op2), \ + /* ex1 */ ex, \ + /* ex1_size */ LIMBSOF(ex), \ + /* ex2 */ NULL, \ + /* ex2_size */ 0, \ + /* op1_live_size */ LIMBSOF(op1) + 1, \ + /* op2_live_size */ LIMBSOF(op2) + 2, \ + /* res1_live_size */ LIMBSOF(ex) / 2, \ + /* res2_live_size */ 0, \ + /* check1_size */ LIMBSOF(ex) / 2, \ + /* check2_size */ 0, \ + /* extended_limb_value1 */ EXTENDED_LIMB_ZERO, \ + /* extended_limb_value2 */ 0, \ + } + +static struct test_case_st test_mod_truncate_cases[] = { + MOD_TRUNCATED_CASE(1, num0, num0, ex_rem_num0_num0), + MOD_TRUNCATED_CASE(2, num0, num1, ex_rem_num0_num1), + MOD_TRUNCATED_CASE(3, num0, num2, ex_rem_num0_num2), + MOD_TRUNCATED_CASE(4, num0, num3, ex_rem_num0_num3), + MOD_TRUNCATED_CASE(5, num1, num0, ex_rem_num1_num0), + MOD_TRUNCATED_CASE(6, num1, num1, ex_rem_num1_num1), + MOD_TRUNCATED_CASE(7, num1, num2, ex_rem_num1_num2), + MOD_TRUNCATED_CASE(8, num1, num3, ex_rem_num1_num3), + MOD_TRUNCATED_CASE(9, num2, num0, ex_rem_num2_num0), + MOD_TRUNCATED_CASE(10, num2, num1, ex_rem_num2_num1), + MOD_TRUNCATED_CASE(11, num2, num2, ex_rem_num2_num2), + MOD_TRUNCATED_CASE(12, num2, num3, ex_rem_num2_num3), + MOD_TRUNCATED_CASE(13, num3, num0, ex_rem_num3_num0), + MOD_TRUNCATED_CASE(14, num3, num1, ex_rem_num3_num1), + MOD_TRUNCATED_CASE(15, num3, num2, ex_rem_num3_num2), + MOD_TRUNCATED_CASE(16, num3, num3, ex_rem_num3_num3), + + /* Edge cases */ + MOD_TRUNCATED_CASE(17, num5, num5, ex_rem_num5_num5), + MOD_TRUNCATED_CASE(18, num6, num6, ex_rem_num6_num6), +}; + +static int test_mod_truncated(int i) +{ + return test_mod_common(test_mod_truncate_cases[i]); +} + +static int check_div_by_zero_error(void) +{ + unsigned long err = ERR_get_error(); + + return TEST_ulong_ne(err, 0) + && TEST_int_eq(ERR_GET_LIB(err), ERR_LIB_OSSL_FN) + && TEST_int_eq(ERR_GET_REASON(err), OSSL_FN_R_DIV_BY_ZERO); +} + +static int test_div_by_zero_common(int test_mod) +{ + int ret = 1; + OSSL_FN *fn = NULL, *fd = NULL, *fq = NULL, *fr = NULL; + OSSL_FN_CTX *ctx = NULL; + size_t n_new_limbs = LIMBSOF(num0) + 1; + size_t d_new_limbs = LIMBSOF(num4) + 2; + size_t q_limbs = LIMBSOF(num0) + 1; + size_t r_limbs = LIMBSOF(num0) + 1; + size_t ctx_numcopy_limbs = ((n_new_limbs <= d_new_limbs) ? d_new_limbs : n_new_limbs) + 1; + size_t ctx_divcopy_limbs = d_new_limbs; + size_t ctx_tmp_limbs = d_new_limbs + 1; + size_t ctx_res_limbs = n_new_limbs; + size_t ctx_max_limbs = ctx_numcopy_limbs + ctx_divcopy_limbs + ctx_res_limbs + ctx_tmp_limbs; + + if (!TEST_ptr(ctx = OSSL_FN_CTX_new(NULL, 1, 4, ctx_max_limbs)) + || !TEST_ptr(fn = OSSL_FN_new_limbs(n_new_limbs)) + || !TEST_ptr(fd = OSSL_FN_new_limbs(d_new_limbs)) + || !TEST_ptr(fq = OSSL_FN_new_limbs(q_limbs)) + || !TEST_ptr(fr = OSSL_FN_new_limbs(r_limbs)) + || !TEST_true(ossl_fn_set_words(fn, num0, LIMBSOF(num0)))) { + ret = 0; + goto end; + } + + ERR_clear_error(); + if (test_mod) { + if (!TEST_false(OSSL_FN_mod(fr, fn, fd, ctx)) + || !TEST_true(check_div_by_zero_error())) + ret = 0; + } else { + if (!TEST_false(OSSL_FN_div(fq, fr, fn, fd, ctx)) + || !TEST_true(check_div_by_zero_error())) + ret = 0; + } + +end: + OSSL_FN_CTX_free(ctx); + OSSL_FN_free(fn); + OSSL_FN_free(fd); + OSSL_FN_free(fq); + OSSL_FN_free(fr); + + return ret; +} + +static int test_div_by_zero(void) +{ + return test_div_by_zero_common(0); +} + +static int test_mod_by_zero(void) +{ + return test_div_by_zero_common(1); +} + +/* + * Test OSSL_FN_div() with r == NULL, i.e. quotient only. + * Reuses test_div_cases since the expected quotient is the same. + */ +static int test_div_quotient_only_common(struct test_case_st test_case) +{ + int ret = 1; + const OSSL_FN_ULONG *n = test_case.op1; + size_t n_limbs = test_case.op1_size; + const OSSL_FN_ULONG *d = test_case.op2; + size_t d_limbs = test_case.op2_size; + const OSSL_FN_ULONG *ex_q = test_case.ex1; + size_t n_new_limbs = test_case.op1_live_size; + size_t d_new_limbs = test_case.op2_live_size; + size_t q_limbs = test_case.res1_live_size; + size_t check_q_limbs = test_case.check1_size; + OSSL_FN_ULONG extended_q = test_case.extended_limb_value1; + OSSL_FN *fn = NULL, *fd = NULL, *fq = NULL; + const OSSL_FN_ULONG *u = NULL; + + OSSL_FN_CTX *ctx = NULL; + if (!TEST_ptr(fn = OSSL_FN_new_limbs(n_new_limbs)) + || !TEST_ptr(fd = OSSL_FN_new_limbs(d_new_limbs)) + || !TEST_true(ossl_fn_set_words(fn, n, n_limbs)) + || !TEST_true(ossl_fn_set_words(fd, d, d_limbs)) + || !TEST_ptr(fq = OSSL_FN_new_limbs(q_limbs)) + || !TEST_ptr(ctx = OSSL_FN_CTX_new_size(NULL, + OSSL_FN_div_ctx_size(fq, NULL, fn, fd)))) { + ret = 0; + goto end; + } + + if (!TEST_true(pollute(fq, 0, q_limbs)) + || !TEST_true(OSSL_FN_div(fq, NULL, fn, fd, ctx)) + || !TEST_ptr(u = ossl_fn_get_words(fq)) + || !TEST_mem_eq(u, check_q_limbs * OSSL_FN_BYTES, + ex_q, check_q_limbs * OSSL_FN_BYTES) + || !TEST_true(check_limbs_value(fq, check_q_limbs, q_limbs, extended_q))) + ret = 0; + +end: + OSSL_FN_CTX_free(ctx); + OSSL_FN_free(fn); + OSSL_FN_free(fd); + OSSL_FN_free(fq); + + return ret; +} + +static int test_div_quotient_only(int i) +{ + return test_div_quotient_only_common(test_div_cases[i]); +} + +static int test_div_quotient_only_truncated(int i) +{ + return test_div_quotient_only_common(test_div_truncate_cases[i]); +} + int setup_tests(void) { ADD_ALL_TESTS(test_add, 17); @@ -1252,6 +1914,16 @@ int setup_tests(void) ADD_ALL_TESTS(test_sqr_feature_r_is_operand, 2); ADD_ALL_TESTS(test_sqr, OSSL_NELEM(test_sqr_cases)); ADD_ALL_TESTS(test_sqr_truncated, OSSL_NELEM(test_sqr_truncate_cases)); + ADD_ALL_TESTS(test_div, OSSL_NELEM(test_div_cases)); + ADD_ALL_TESTS(test_div_truncated, OSSL_NELEM(test_div_truncate_cases)); + ADD_TEST(test_div_by_zero); + ADD_ALL_TESTS(test_mod, OSSL_NELEM(test_mod_cases)); + ADD_ALL_TESTS(test_mod_truncated, OSSL_NELEM(test_mod_truncate_cases)); + ADD_TEST(test_mod_by_zero); + ADD_ALL_TESTS(test_div_quotient_only, + OSSL_NELEM(test_div_cases)); + ADD_ALL_TESTS(test_div_quotient_only_truncated, + OSSL_NELEM(test_div_truncate_cases)); return 1; } From b5aa70d2c1eadb82608fcfd44f00bbcdff53cc28 Mon Sep 17 00:00:00 2001 From: Richard Levitte Date: Thu, 9 Jul 2026 11:07:12 +0200 Subject: [PATCH 53/69] OSSL_FN: Add division context sizing Add OSSL_FN_div_ctx_size() and make OSSL_FN_mod_ctx_size() a thin inline wrapper around it. The sizing remains conservative: it uses allocated operand widths and does not duplicate the runtime scan that trims the denominator to its highest non-zero limb. Document both helpers with Doxygen comments matching the mul/sqr ctx_size helpers. Related-to: doc/designs/fixed-size-large-numbers.md Issue: https://github.com/openssl/project/issues/1852 Assisted-by: Pi:openai/gpt-5.5 Assisted-by: Pi:z-ai/glm-5.2 Signed-off-by: Richard Levitte Reviewed-by: Jakub Zelenka Reviewed-by: Igor Ustinov Reviewed-by: Tomas Mraz MergeDate: Thu Jul 23 14:14:00 2026 (Merged from https://github.com/openssl/openssl/pull/30822) --- crypto/fn/fn_div.c | 29 +++++++++++++++++++++++++++++ include/crypto/fn.h | 37 +++++++++++++++++++++++++++++++++++++ 2 files changed, 66 insertions(+) diff --git a/crypto/fn/fn_div.c b/crypto/fn/fn_div.c index 97f2429092..9e0f67d20d 100644 --- a/crypto/fn/fn_div.c +++ b/crypto/fn/fn_div.c @@ -9,11 +9,14 @@ #include #include +#include "internal/safe_math.h" #include "crypto/cryptlib.h" #include "crypto/fnerr.h" #include "../bn/bn_local.h" /* For using the low level bignum functions */ #include "fn_local.h" +OSSL_SAFE_MATH_ADDU(size_t, size_t, OSSL_SAFE_MATH_MAXU(size_t)) + #if !defined(OPENSSL_NO_ASM) && !defined(OPENSSL_NO_INLINE_ASM) \ && !defined(PEDANTIC) && !defined(BN_DIV3W) #if defined(__GNUC__) && __GNUC__ >= 2 @@ -213,6 +216,32 @@ static inline OSSL_FN_ULONG div_words(OSSL_FN_ULONG *wnumtop, OSSL_FN_ULONG *wnu #endif /* !BN_DIV3W */ } +size_t OSSL_FN_div_ctx_size(const OSSL_FN *q, const OSSL_FN *r, + const OSSL_FN *n, const OSSL_FN *d) +{ + if ((q == NULL && r == NULL) || n == NULL || d == NULL) + return 0; + + size_t nl = n->dsize; + size_t dl = d->dsize; + size_t snuml, tmp; + int err = 0; + + snuml = safe_add_size_t(nl > dl ? nl : dl, 1, &err); + tmp = safe_add_size_t(dl, 1, &err); + + size_t max_ql = nl == 0 ? 1 : nl; + size_t ql = (q == NULL || (size_t)q->dsize < max_ql) ? max_ql : 0; + size_t max_n_numbers = 3 + (ql != 0); + size_t max_n_limbs; + + max_n_limbs = safe_add_size_t(snuml, dl, &err); + max_n_limbs = safe_add_size_t(max_n_limbs, tmp, &err); + max_n_limbs = safe_add_size_t(max_n_limbs, ql, &err); + + return err == 0 ? OSSL_FN_CTX_size(1, max_n_numbers, max_n_limbs) : 0; +} + /* Trivia: this function implements Knuth's algorithm D */ int OSSL_FN_div(OSSL_FN *q, OSSL_FN *r, const OSSL_FN *n, const OSSL_FN *d, OSSL_FN_CTX *ctx) { diff --git a/include/crypto/fn.h b/include/crypto/fn.h index e375741ea3..f469245207 100644 --- a/include/crypto/fn.h +++ b/include/crypto/fn.h @@ -430,6 +430,24 @@ size_t OSSL_FN_mul_ctx_size(const OSSL_FN *r, const OSSL_FN *a, int OSSL_FN_div(OSSL_FN *q, OSSL_FN *r, const OSSL_FN *n, const OSSL_FN *d, OSSL_FN_CTX *ctx); +/** + * Calculate the arena payload size that OSSL_FN_div() needs. + * + * @param[in] q The OSSL_FN for the quotient, or NULL when + * only the remainder is of interest. + * @param[in] r The OSSL_FN for the remainder + * @param[in] n The first operand (numerator) + * @param[in] d The second operand (denominator) + * @returns The arena payload size, in bytes. + * @retval 0 on arithmetic overflow or invalid input. + * + * The returned size includes any frame budget needed by OSSL_FN_div(). + * When q is NULL, the size is computed for the modulo case, i.e. as if + * only the remainder is produced. + */ +size_t OSSL_FN_div_ctx_size(const OSSL_FN *q, const OSSL_FN *r, + const OSSL_FN *n, const OSSL_FN *d); + /** * Calculate modulo of two OSSL_FN numbers. Truncates the result to fit in r. * @@ -449,6 +467,25 @@ static inline int OSSL_FN_mod(OSSL_FN *r, const OSSL_FN *n, const OSSL_FN *d, return OSSL_FN_div(NULL, r, n, d, ctx); } +/** + * Calculate the arena payload size that OSSL_FN_mod() needs. + * + * @param[in] r The OSSL_FN for the remainder + * @param[in] n The first operand (numerator) + * @param[in] d The second operand (denominator) + * @returns The arena payload size, in bytes. + * @retval 0 on arithmetic overflow or invalid input. + * + * The returned size includes any frame budget needed by OSSL_FN_mod(). + * This is a thin wrapper around OSSL_FN_div_ctx_size() with a NULL + * quotient, since OSSL_FN_mod() is itself a wrapper around OSSL_FN_div(). + */ +static inline size_t OSSL_FN_mod_ctx_size(const OSSL_FN *r, + const OSSL_FN *n, const OSSL_FN *d) +{ + return OSSL_FN_div_ctx_size(NULL, r, n, d); +} + /** * Calculate the square of one OSSL_FN number. Truncates the result to fit in r. * From 7593990ddf3e353e65d443d0759097bbfdc888fb Mon Sep 17 00:00:00 2001 From: Richard Levitte Date: Thu, 9 Jul 2026 11:22:29 +0200 Subject: [PATCH 54/69] OSSL_FN: Add div and mod stanza tests Teach fntest to run the existing quotient/remainder stanzas through OSSL_FN_div(), and additionally check the remainder against OSSL_FN_mod(). fntest now runs all recognized stanzas from each data file, so 11-test_fn.t passes the files directly without any per-stanza filtering. Also include crypto/fn.h before crypto/bn.h in fntest so the OSSL_FN typedef is visible where bn.h uses it. Related-to: doc/designs/fixed-size-large-numbers.md Issue: https://github.com/openssl/project/issues/1852 Assisted-by: Pi:openai/gpt-5.5 Assisted-by: Pi:z-ai/glm-5.2 Signed-off-by: Richard Levitte Reviewed-by: Jakub Zelenka Reviewed-by: Igor Ustinov Reviewed-by: Tomas Mraz MergeDate: Thu Jul 23 14:14:03 2026 (Merged from https://github.com/openssl/openssl/pull/30822) --- test/fntest.c | 90 +++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 88 insertions(+), 2 deletions(-) diff --git a/test/fntest.c b/test/fntest.c index a1f9ae88e5..54a07cccd1 100644 --- a/test/fntest.c +++ b/test/fntest.c @@ -12,8 +12,8 @@ #include #include #include -#include "crypto/bn.h" #include "crypto/fn.h" +#include "crypto/bn.h" #include "crypto/fn_intern.h" #include "internal/nelem.h" #include "testutil.h" @@ -257,6 +257,92 @@ err: return st; } +static int file_quotient(STANZA *s) +{ + BIGNUM *a = NULL, *b = NULL, *quotient = NULL, *remainder = NULL; + BIGNUM *qret = NULL, *rret = NULL, *mret = NULL; + OSSL_FN *af = NULL, *bf = NULL, *qf = NULL, *rf = NULL, *mf = NULL; + OSSL_FN_CTX *ctx = NULL, *mod_ctx = NULL; + int a_neg = 0, b_neg = 0, q_neg = 0, r_neg = 0, st = 0; + int q_acq = 0, r_acq = 0, m_acq = 0; + int q_limbs = 0, r_limbs = 0; + + if (!TEST_ptr(a = getBN(s, "A")) + || !TEST_ptr(b = getBN(s, "B")) + || !TEST_ptr(quotient = getBN(s, "Quotient")) + || !TEST_ptr(remainder = getBN(s, "Remainder")) + || !TEST_ptr(qret = BN_new()) + || !TEST_ptr(rret = BN_new()) + || !TEST_ptr(mret = BN_new())) + goto err; + + a_neg = BN_is_negative(a); + b_neg = BN_is_negative(b); + q_neg = a_neg ^ b_neg; + r_neg = a_neg; + q_limbs = limbs(quotient); + r_limbs = limbs(remainder); + + if (!TEST_ptr(af = bn_get_ossl_fn(a)) + || !TEST_ptr(bf = bn_get_ossl_fn(b)) + || !TEST_ptr(qf = bn_acquire_ossl_fn(qret, q_limbs))) + goto err; + q_acq = 1; + if (!TEST_ptr(rf = bn_acquire_ossl_fn(rret, r_limbs))) + goto err; + r_acq = 1; + if (!TEST_ptr(mf = bn_acquire_ossl_fn(mret, r_limbs))) + goto err; + m_acq = 1; + if (!TEST_ptr(ctx = OSSL_FN_CTX_new_size(NULL, + OSSL_FN_div_ctx_size(qf, rf, af, bf))) + || !TEST_ptr(mod_ctx = OSSL_FN_CTX_new_size(NULL, + OSSL_FN_mod_ctx_size(mf, af, bf)))) + goto err; + + if (!TEST_true(OSSL_FN_div(qf, rf, af, bf, ctx))) + goto err; + bn_release(qret, q_limbs); + if (!BN_is_zero(qret)) + BN_set_negative(qret, q_neg); + q_acq = 0; + bn_release(rret, r_limbs); + if (!BN_is_zero(rret)) + BN_set_negative(rret, r_neg); + r_acq = 0; + if (!equalBN("A / B", quotient, qret) + || !equalBN("A % B", remainder, rret)) + goto err; + + if (!TEST_true(OSSL_FN_mod(mf, af, bf, mod_ctx))) + goto err; + bn_release(mret, r_limbs); + if (!BN_is_zero(mret)) + BN_set_negative(mret, r_neg); + m_acq = 0; + if (!equalBN("A % B (mod)", remainder, mret)) + goto err; + + st = 1; +err: + if (m_acq) + bn_release(mret, r_limbs); + if (r_acq) + bn_release(rret, r_limbs); + if (q_acq) + bn_release(qret, q_limbs); + OSSL_FN_CTX_free(mod_ctx); + OSSL_FN_CTX_free(ctx); + BN_free(a); + BN_free(b); + BN_free(quotient); + BN_free(remainder); + BN_free(qret); + BN_free(rret); + BN_free(mret); + return st; +} + static int file_lshift1(STANZA *s) { BIGNUM *a = NULL, *lshift1 = NULL, *ret = NULL; @@ -343,7 +429,7 @@ static FILETEST filetests[] = { { "RShift", NULL, 0 }, { "Square", file_square, 0 }, { "Product", file_product, 0 }, - { "Quotient", NULL, 0 }, + { "Quotient", file_quotient, 0 }, { "ModMul", NULL, 0 }, { "ModSqr", NULL, 0 }, { "ModExp", NULL, 0 }, From c6866fa3d38f36e5467d215eb3323fe39311db8c Mon Sep 17 00:00:00 2001 From: Richard Levitte Date: Thu, 2 Jul 2026 15:22:20 +0200 Subject: [PATCH 55/69] OSSL_FN: Add OSSL_FN right shifts Add fixed-size right-shift operations for OSSL_FN values and cover them with direct API tests. The tests exercise bit and limb shifts, wider and narrower destinations, aliasing, and invalid negative shift counts. Related-to: doc/designs/fixed-size-large-numbers.md Issue: https://github.com/openssl/project/issues/2015 Assisted-by: Pi:openai/gpt-5.5 Assisted-by: Pi:z-ai/glm-5.2 Signed-off-by: Richard Levitte Reviewed-by: Igor Ustinov Reviewed-by: Tomas Mraz MergeDate: Thu Jul 23 14:15:39 2026 (Merged from https://github.com/openssl/openssl/pull/31830) --- crypto/fn/fn_shift.c | 71 +++++++++++++ include/crypto/fn.h | 19 ++++ test/fn_api_test.c | 236 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 326 insertions(+) diff --git a/crypto/fn/fn_shift.c b/crypto/fn/fn_shift.c index f8e7a9cbae..fe0dfa5d2c 100644 --- a/crypto/fn/fn_shift.c +++ b/crypto/fn/fn_shift.c @@ -88,3 +88,74 @@ int OSSL_FN_lshift1(OSSL_FN *r, const OSSL_FN *a) return 1; } + +/* + * In respect to shift factor the execution time is invariant of + * |n % OSSL_FN_BITS|, but not |n / OSSL_FN_BITS|. Or in other words + * pre-condition for constant-time-ness for sufficiently[!] zero-padded + * inputs is |n < OSSL_FN_BITS| or |n / OSSL_FN_BITS| being non-secret. + */ +int OSSL_FN_rshift(OSSL_FN *r, const OSSL_FN *a, int n) +{ + size_t i, nw; + unsigned int lb, rb; + const OSSL_FN_ULONG *ap = a->d; + OSSL_FN_ULONG *rp = r->d; + size_t rl = (size_t)r->dsize; + size_t al = (size_t)a->dsize; + + if (n < 0) { + ERR_raise(ERR_LIB_OSSL_FN, OSSL_FN_R_INVALID_SHIFT); + return 0; + } + + nw = (size_t)n / OSSL_FN_BITS; + rb = (unsigned int)n % OSSL_FN_BITS; + lb = OSSL_FN_BITS - rb; + + /* + * Work from the low end to support r == a. Each result limb only + * depends on the corresponding source limb and the limb just above it, + * neither of which has been overwritten yet when walking upward. + */ + for (i = 0; i < rl; i++) { + size_t src_idx = i + nw; + OSSL_FN_ULONG limb = 0; + + if (src_idx < al) { + limb = ap[src_idx] >> rb; + if (rb != 0 && src_idx + 1 < al) + limb |= (ap[src_idx + 1] << lb) & OSSL_FN_MASK; + } + rp[i] = limb; + } + + return 1; +} + +int OSSL_FN_rshift1(OSSL_FN *r, const OSSL_FN *a) +{ + OSSL_FN_ULONG *rp = r->d; + const OSSL_FN_ULONG *ap = a->d; + size_t rl = (size_t)r->dsize; + size_t al = (size_t)a->dsize; + size_t i; + + /* + * Work from the low end to support r == a. Each result limb only + * depends on the corresponding source limb and the limb just above it, + * neither of which has been overwritten yet when walking upward. + */ + for (i = 0; i < rl; i++) { + OSSL_FN_ULONG limb = 0; + + if (i < al) { + limb = ap[i] >> 1; + if (i + 1 < al) + limb |= (ap[i + 1] << (OSSL_FN_BITS - 1)) & OSSL_FN_MASK; + } + rp[i] = limb; + } + + return 1; +} diff --git a/include/crypto/fn.h b/include/crypto/fn.h index f469245207..c8b7814e18 100644 --- a/include/crypto/fn.h +++ b/include/crypto/fn.h @@ -342,6 +342,25 @@ int OSSL_FN_lshift(OSSL_FN *r, const OSSL_FN *a, int n); */ int OSSL_FN_lshift1(OSSL_FN *r, const OSSL_FN *a); +/** + * Shift an OSSL_FN number right by n bits. Truncates the result to fit in r. + * + * @param[out] r The OSSL_FN for the result + * @param[in] a The operand + * @param[in] n The number of bits to shift + * @returns 1 on success, 0 on error + */ +int OSSL_FN_rshift(OSSL_FN *r, const OSSL_FN *a, int n); + +/** + * Shift an OSSL_FN number right by one bit. Truncates the result to fit in r. + * + * @param[out] r The OSSL_FN for the result + * @param[in] a The operand + * @returns 1 on success, 0 on error + */ +int OSSL_FN_rshift1(OSSL_FN *r, const OSSL_FN *a); + /** * Add two OSSL_FN numbers. * diff --git a/test/fn_api_test.c b/test/fn_api_test.c index 5903a66470..746b32ee9b 100644 --- a/test/fn_api_test.c +++ b/test/fn_api_test.c @@ -437,6 +437,64 @@ static const OSSL_FN_ULONG ex_lshift_num2_limb_3[] = { #error "OpenSSL doesn't support large numbers on this platform" #endif +/* $num2 >> 1 == 0x0091a2b3c4d5e6f7 */ +static const OSSL_FN_ULONG ex_rshift1_num2[] = { + OSSL_FN_ULONG64_C(0x0091a2b3, 0xc4d5e6f7), +}; +/* $num8 >> 1 == 0x000000008091a2b3c4d5e6f7 */ +static const OSSL_FN_ULONG ex_rshift1_num8[] = { + OSSL_FN_ULONG64_C(0x8091a2b3, 0xc4d5e6f7), +}; +/* $num2 >> 4 == 0x00123456789abcde */ +static const OSSL_FN_ULONG ex_rshift_num2_4[] = { + OSSL_FN_ULONG64_C(0x00123456, 0x789abcde), +}; +#if OSSL_FN_BYTES == 4 +/* $num8 >> 32 == 0x0000000101234567 */ +static const OSSL_FN_ULONG ex_rshift_num8_limb[] = { + OSSL_FN_ULONG_C(0x01234567), + OSSL_FN_ULONG_C(0x00000001), +}; +#elif OSSL_FN_BYTES == 8 +/* $num8 >> 64 == 0x0000000000000001 */ +static const OSSL_FN_ULONG ex_rshift_num8_limb[] = { + OSSL_FN_ULONG64_C(0x00000000, 0x00000001), +}; +#else +#error "OpenSSL doesn't support large numbers on this platform" +#endif +#if OSSL_FN_BYTES == 4 +/* $num8 >> 35 == 0x00000000202468ac */ +static const OSSL_FN_ULONG ex_rshift_num8_limb_3[] = { + OSSL_FN_ULONG_C(0x202468ac), +}; +#elif OSSL_FN_BYTES == 8 +/* $num8 >> 67 == 0x0000000000000000 */ +static const OSSL_FN_ULONG ex_rshift_num8_limb_3[] = { + OSSL_FN_ULONG64_C(0x00000000, 0x00000000), +}; +#else +#error "OpenSSL doesn't support large numbers on this platform" +#endif +#if OSSL_FN_BYTES == 4 +/* $num2 >> 32 == 0x01234567 */ +static const OSSL_FN_ULONG ex_rshift_num2_limb[] = { + OSSL_FN_ULONG_C(0x01234567), + OSSL_FN_ULONG_C(0x00000000), +}; +#elif OSSL_FN_BYTES == 8 +/* $num2 >> 64 == 0x0000000000000000 */ +static const OSSL_FN_ULONG ex_rshift_num2_limb[] = { + OSSL_FN_ULONG64_C(0x00000000, 0x00000000), +}; +#else +#error "OpenSSL doesn't support large numbers on this platform" +#endif +/* Expected all-zero result for shifts beyond the operand's width. */ +static const OSSL_FN_ULONG ex_rshift_zero[] = { + OSSL_FN_ULONG64_C(0x00000000, 0x00000000), +}; + static int test_sub_common(struct test_case_st test_case) { const OSSL_FN_ULONG *n1 = test_case.op1; @@ -750,6 +808,180 @@ static int test_lshift(int i) return test_lshift_common(i, 0); } +static int test_rshift_common(int i, int use_rshift1, int alias) +{ + const OSSL_FN_ULONG *a_words = NULL; + const OSSL_FN_ULONG *ex_words = NULL; + OSSL_FN *a = NULL, *r = NULL; + size_t a_limbs = 0, a_live_limbs = 0, r_limbs = 0, check_limbs = 0; + int shift = 0, ret = 0; + const OSSL_FN_ULONG *u = NULL; + + switch (i) { + case 0: + a_words = num2; + a_limbs = LIMBSOF(num2); + a_live_limbs = LIMBSOF(num2); + r_limbs = LIMBSOF(ex_rshift1_num2) + 2; + ex_words = ex_rshift1_num2; + check_limbs = LIMBSOF(ex_rshift1_num2); + shift = 1; + break; + case 1: + a_words = num8; + a_limbs = LIMBSOF(num8); + a_live_limbs = LIMBSOF(num8); + r_limbs = LIMBSOF(ex_rshift1_num8) + 2; + ex_words = ex_rshift1_num8; + check_limbs = LIMBSOF(ex_rshift1_num8); + shift = 1; + break; + case 2: + a_words = num2; + a_limbs = LIMBSOF(num2); + a_live_limbs = LIMBSOF(num2); + r_limbs = LIMBSOF(ex_rshift_num2_4) + 2; + ex_words = ex_rshift_num2_4; + check_limbs = LIMBSOF(ex_rshift_num2_4); + shift = 4; + break; + case 3: + a_words = num8; + a_limbs = LIMBSOF(num8); + a_live_limbs = LIMBSOF(num8); + r_limbs = LIMBSOF(ex_rshift_num8_limb) + 2; + ex_words = ex_rshift_num8_limb; + check_limbs = LIMBSOF(ex_rshift_num8_limb); + shift = OSSL_FN_BYTES * 8; + break; + case 4: + a_words = num8; + a_limbs = LIMBSOF(num8); + a_live_limbs = LIMBSOF(num8); + r_limbs = LIMBSOF(ex_rshift_num8_limb_3) + 2; + ex_words = ex_rshift_num8_limb_3; + check_limbs = LIMBSOF(ex_rshift_num8_limb_3); + shift = OSSL_FN_BYTES * 8 + 3; + break; + case 5: + a_words = num2; + a_limbs = LIMBSOF(num2); + a_live_limbs = LIMBSOF(num2); + r_limbs = LIMBSOF(ex_rshift_num2_limb) + 2; + ex_words = ex_rshift_num2_limb; + check_limbs = LIMBSOF(ex_rshift_num2_limb); + shift = OSSL_FN_BYTES * 8; + break; + case 6: + a_words = num8; + a_limbs = LIMBSOF(num8); + a_live_limbs = LIMBSOF(num8); + r_limbs = LIMBSOF(num8) - 1; + ex_words = num8; + check_limbs = r_limbs; + shift = 0; + break; + case 7: + /* Shifting by more than the operand's width must yield zero. */ + a_words = num2; + a_limbs = LIMBSOF(num2); + a_live_limbs = LIMBSOF(num2); + r_limbs = LIMBSOF(num2) + 2; + ex_words = ex_rshift_zero; + check_limbs = LIMBSOF(num2); + shift = OSSL_FN_BYTES * 8 * (LIMBSOF(num2) + 1); + break; + case 8: + /* Exact-fit destination (no padding) with a non-zero shift. */ + a_words = num2; + a_limbs = LIMBSOF(num2); + a_live_limbs = LIMBSOF(num2); + r_limbs = LIMBSOF(ex_rshift_num2_4); + ex_words = ex_rshift_num2_4; + check_limbs = LIMBSOF(ex_rshift_num2_4); + shift = 4; + break; + default: + return 0; + } + + if (!TEST_ptr(a = OSSL_FN_new_limbs(a_live_limbs)) + || !TEST_true(ossl_fn_set_words(a, a_words, a_limbs))) + goto err; + + if (alias) { + r = a; + } else if (!TEST_ptr(r = OSSL_FN_new_limbs(r_limbs)) + || !TEST_true(pollute(r, 0, r_limbs))) { + goto err; + } + + if (use_rshift1) { + if (!TEST_int_eq(shift, 1) + || !TEST_true(OSSL_FN_rshift1(r, a))) + goto err; + } else { + if (!TEST_true(OSSL_FN_rshift(r, a, shift))) + goto err; + } + + if (!TEST_ptr(u = ossl_fn_get_words(r)) + || !TEST_mem_eq(u, check_limbs * OSSL_FN_BYTES, + ex_words, check_limbs * OSSL_FN_BYTES) + || !TEST_true(check_limbs_value(r, check_limbs, r_limbs, + EXTENDED_LIMB_ZERO))) + goto err; + + ret = 1; +err: + if (!alias) + OSSL_FN_free(r); + OSSL_FN_free(a); + return ret; +} + +static int test_rshift1(int i) +{ + return test_rshift_common(i, 1, 0); +} + +static int test_rshift(int i) +{ + return test_rshift_common(i, 0, 0); +} + +/* + * In-place (r == a) coverage: rshift1 (case 0), rshift by 1 (case 1), + * by 4 (case 2), and by a full limb width (case 3). The low-to-high + * walk makes in-place safe for any shift, so this exercises the + * multi-limb carry path under aliasing beyond shift-by-1. + */ +static int test_rshift_alias(int i) +{ + return test_rshift_common(i, i == 0, 1); +} + +static int test_rshift_invalid_shift(void) +{ + OSSL_FN *a = NULL, *r = NULL; + int ret = 0; + + if (!TEST_ptr(a = OSSL_FN_new_limbs(LIMBSOF(num2))) + || !TEST_ptr(r = OSSL_FN_new_limbs(LIMBSOF(num2))) + || !TEST_true(ossl_fn_set_words(a, num2, LIMBSOF(num2)))) + goto err; + + if (!TEST_false(OSSL_FN_rshift(r, a, -1))) + goto err; + + ERR_clear_error(); + ret = 1; +err: + OSSL_FN_free(a); + OSSL_FN_free(r); + return ret; +} + /* A set of expected results, also in OSSL_FN_ULONG array form */ static const OSSL_FN_ULONG ex_mul_num0_num0[] = { OSSL_FN_ULONG64_C(0x00000000, 0x00000001), @@ -1908,6 +2140,10 @@ int setup_tests(void) ADD_TEST(test_cmp); ADD_ALL_TESTS(test_lshift1, 2); ADD_ALL_TESTS(test_lshift, 6); + ADD_ALL_TESTS(test_rshift1, 2); + ADD_ALL_TESTS(test_rshift, 9); + ADD_ALL_TESTS(test_rshift_alias, 4); + ADD_TEST(test_rshift_invalid_shift); ADD_ALL_TESTS(test_mul_feature_r_is_operand, 4); ADD_ALL_TESTS(test_mul, OSSL_NELEM(test_mul_cases)); ADD_ALL_TESTS(test_mul_truncated, OSSL_NELEM(test_mul_truncate_cases)); From 10d074a0416c6a57051f5b255ed41d43b27a0667 Mon Sep 17 00:00:00 2001 From: Richard Levitte Date: Thu, 9 Jul 2026 12:40:06 +0200 Subject: [PATCH 56/69] OSSL_FN: Add OSSL_FN right-shift tests to fntest The new file_rshift() handler is driven by the RShift stanzas already in bnshift.txt, so no dedicated data file is added. The N == 1 OSSL_FN_rshift1 cross-check and the file_lshift() round-trip mirror bntest.c. Issue: https://github.com/openssl/project/issues/2015 Assisted-by: Pi:z-ai/glm-5.2 Signed-off-by: Richard Levitte Reviewed-by: Igor Ustinov Reviewed-by: Tomas Mraz MergeDate: Thu Jul 23 14:15:41 2026 (Merged from https://github.com/openssl/openssl/pull/31830) --- test/fntest.c | 71 +++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 69 insertions(+), 2 deletions(-) diff --git a/test/fntest.c b/test/fntest.c index 54a07cccd1..5eace7cedd 100644 --- a/test/fntest.c +++ b/test/fntest.c @@ -385,7 +385,7 @@ err: static int file_lshift(STANZA *s) { BIGNUM *a = NULL, *lshift = NULL, *ret = NULL; - OSSL_FN *af = NULL, *rf = NULL; + OSSL_FN *af = NULL, *lf = NULL, *rf = NULL; int a_neg = 0, n = 0, st = 0; int r_acq = 0; int nlimbs = 0; @@ -400,6 +400,7 @@ static int file_lshift(STANZA *s) nlimbs = limbs(lshift); if (!TEST_ptr(af = bn_get_ossl_fn(a)) + || !TEST_ptr(lf = bn_get_ossl_fn(lshift)) || !TEST_ptr(rf = bn_acquire_ossl_fn(ret, nlimbs))) goto err; r_acq = 1; @@ -412,6 +413,18 @@ static int file_lshift(STANZA *s) if (!equalBN("A << N", lshift, ret)) goto err; + /* Round-trip: shift the result back and recover A */ + if (!TEST_ptr(rf = bn_acquire_ossl_fn(ret, nlimbs))) + goto err; + r_acq = 1; + if (!TEST_true(OSSL_FN_rshift(rf, lf, n))) + goto err; + bn_release(ret, nlimbs); + BN_set_negative(ret, a_neg && !BN_is_zero(ret)); + r_acq = 0; + if (!equalBN("A >> N", a, ret)) + goto err; + st = 1; err: if (r_acq) @@ -422,11 +435,65 @@ err: return st; } +static int file_rshift(STANZA *s) +{ + BIGNUM *a = NULL, *rshift = NULL, *ret = NULL; + OSSL_FN *af = NULL, *rf = NULL; + int a_neg = 0, n = 0, st = 0; + int r_acq = 0; + int nlimbs = 0; + + if (!TEST_ptr(a = getBN(s, "A")) + || !TEST_ptr(rshift = getBN(s, "RShift")) + || !TEST_ptr(ret = BN_new()) + || !getint(s, &n, "N")) + goto err; + + a_neg = BN_is_negative(a); + nlimbs = limbs(rshift); + + if (!TEST_ptr(af = bn_get_ossl_fn(a)) + || !TEST_ptr(rf = bn_acquire_ossl_fn(ret, nlimbs))) + goto err; + r_acq = 1; + + if (!TEST_true(OSSL_FN_rshift(rf, af, n))) + goto err; + bn_release(ret, nlimbs); + BN_set_negative(ret, a_neg && !BN_is_zero(ret)); + r_acq = 0; + if (!equalBN("A >> N", rshift, ret)) + goto err; + + /* If N == 1, try with rshift1 as well */ + if (n == 1) { + if (!TEST_ptr(rf = bn_acquire_ossl_fn(ret, nlimbs))) + goto err; + r_acq = 1; + if (!TEST_true(OSSL_FN_rshift1(rf, af))) + goto err; + bn_release(ret, nlimbs); + BN_set_negative(ret, a_neg && !BN_is_zero(ret)); + r_acq = 0; + if (!equalBN("A >> 1 (rshift1)", rshift, ret)) + goto err; + } + + st = 1; +err: + if (r_acq) + bn_release(ret, nlimbs); + BN_free(a); + BN_free(rshift); + BN_free(ret); + return st; +} + static FILETEST filetests[] = { { "Sum", file_sum, 0 }, { "LShift1", file_lshift1, 0 }, { "LShift", file_lshift, 0 }, - { "RShift", NULL, 0 }, + { "RShift", file_rshift, 0 }, { "Square", file_square, 0 }, { "Product", file_product, 0 }, { "Quotient", file_quotient, 0 }, From ed9ea9710dfd148473535f554031c63ac6d90b77 Mon Sep 17 00:00:00 2001 From: Richard Levitte Date: Thu, 16 Jul 2026 12:01:16 +0200 Subject: [PATCH 57/69] OSSL_FN: Add lshift1 round-trip checks to fntest file_lshift1() now mirrors bntest.c's file_lshift1() where OSSL_FN primitives allow: it cross-checks LShift1 against A + A and A * 2, then round-trips LShift1 >> 1 back to A with OSSL_FN_rshift1. The LShift1 / 2, LShift1 % 2, and set-LSB rshift1-flooring checks from bntest.c are deferred to a future commit: they need OSSL_FN_div() and OSSL_FN_set_bit(), neither of which exists yet. Issue: https://github.com/openssl/project/issues/2015 Assisted-by: Pi:z-ai/glm-5.2 Signed-off-by: Richard Levitte Reviewed-by: Igor Ustinov Reviewed-by: Tomas Mraz MergeDate: Thu Jul 23 14:15:42 2026 (Merged from https://github.com/openssl/openssl/pull/31830) --- test/fntest.c | 81 +++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 79 insertions(+), 2 deletions(-) diff --git a/test/fntest.c b/test/fntest.c index 5eace7cedd..4f32e33390 100644 --- a/test/fntest.c +++ b/test/fntest.c @@ -345,25 +345,65 @@ err: static int file_lshift1(STANZA *s) { - BIGNUM *a = NULL, *lshift1 = NULL, *ret = NULL; - OSSL_FN *af = NULL, *rf = NULL; + BIGNUM *a = NULL, *lshift1 = NULL, *two = NULL, *ret = NULL; + OSSL_FN *af = NULL, *lf = NULL, *tf = NULL, *rf = NULL; + OSSL_FN_CTX *ctx = NULL; int a_neg = 0, st = 0; int r_acq = 0; int nlimbs = 0; if (!TEST_ptr(a = getBN(s, "A")) || !TEST_ptr(lshift1 = getBN(s, "LShift1")) + || !TEST_ptr(two = BN_new()) || !TEST_ptr(ret = BN_new())) goto err; a_neg = BN_is_negative(a); nlimbs = limbs(lshift1); + BN_set_word(two, 2); if (!TEST_ptr(af = bn_get_ossl_fn(a)) + || !TEST_ptr(lf = bn_get_ossl_fn(lshift1)) + || !TEST_ptr(tf = bn_get_ossl_fn(two)) || !TEST_ptr(rf = bn_acquire_ossl_fn(ret, nlimbs))) goto err; r_acq = 1; + if (!TEST_ptr(ctx = OSSL_FN_CTX_new_size(NULL, + OSSL_FN_mul_ctx_size(rf, af, tf)))) + goto err; + /* A + A == LShift1 */ + if (!TEST_true(OSSL_FN_add(rf, af, af))) + goto err; + bn_release(ret, nlimbs); + BN_set_negative(ret, a_neg && !BN_is_zero(ret)); + r_acq = 0; + if (!equalBN("A + A", lshift1, ret)) + goto err; + + /* A * 2 == LShift1 */ + if (!TEST_ptr(rf = bn_acquire_ossl_fn(ret, nlimbs))) + goto err; + r_acq = 1; + if (!TEST_true(OSSL_FN_mul(rf, af, tf, ctx))) + goto err; + bn_release(ret, nlimbs); + BN_set_negative(ret, a_neg && !BN_is_zero(ret)); + r_acq = 0; + if (!equalBN("A * 2", lshift1, ret)) + goto err; + + /* + * TODO(FIXNUM): bntest.c also checks the division/modulus identities + * LShift1 / 2 == A ("LShift1 / 2") + * LShift1 % 2 == 0 ("LShift1 % 2") + * using BN_div(). These cannot be ported yet: there is no OSSL_FN_div(). + */ + + /* A << 1 == LShift1 */ + if (!TEST_ptr(rf = bn_acquire_ossl_fn(ret, nlimbs))) + goto err; + r_acq = 1; if (!TEST_true(OSSL_FN_lshift1(rf, af))) goto err; bn_release(ret, nlimbs); @@ -372,12 +412,49 @@ static int file_lshift1(STANZA *s) if (!equalBN("A << 1", lshift1, ret)) goto err; + /* + * Round-trip: LShift1 >> 1 == A, done twice to match bntest.c's + * double-check structure. + * + * TODO(FIXNUM): bntest.c's second iteration forces the LSB of LShift1 + * to 1 (BN_set_bit(lshift1, 0)) and then checks + * (LShift1 | 1) / 2 == A ("(LShift1 | 1) / 2") + * (LShift | 1) >> 1 == A ("(LShift | 1) >> 1") + * to exercise rshift1's flooring of an odd operand. This cannot be + * ported yet: there is no OSSL_FN_set_bit(), and the division variant + * also needs OSSL_FN_div(). For now we just repeat the even case to + * preserve the two-iteration shape. + */ + if (!TEST_ptr(rf = bn_acquire_ossl_fn(ret, nlimbs))) + goto err; + r_acq = 1; + if (!TEST_true(OSSL_FN_rshift1(rf, lf))) + goto err; + bn_release(ret, nlimbs); + BN_set_negative(ret, a_neg && !BN_is_zero(ret)); + r_acq = 0; + if (!equalBN("LShift >> 1", a, ret)) + goto err; + + if (!TEST_ptr(rf = bn_acquire_ossl_fn(ret, nlimbs))) + goto err; + r_acq = 1; + if (!TEST_true(OSSL_FN_rshift1(rf, lf))) + goto err; + bn_release(ret, nlimbs); + BN_set_negative(ret, a_neg && !BN_is_zero(ret)); + r_acq = 0; + if (!equalBN("LShift >> 1", a, ret)) + goto err; + st = 1; err: if (r_acq) bn_release(ret, nlimbs); + OSSL_FN_CTX_free(ctx); BN_free(a); BN_free(lshift1); + BN_free(two); BN_free(ret); return st; } From 60551b673b2b8b89a539aa4d8187ed94946195c4 Mon Sep 17 00:00:00 2001 From: Richard Levitte Date: Mon, 13 Jul 2026 20:44:46 +0200 Subject: [PATCH 58/69] OSSL_FN: Add OSSL_FN_is_bit_set() Add OSSL_FN_is_bit_set(), the OSSL_FN counterpart of BN_is_bit_set(). The leak profile matches the BN counterpart: control flow branches only on the operand's public width (dsize), not on limb values. Assisted-by: Pi:z-ai/glm-5.2 Signed-off-by: Richard Levitte Reviewed-by: Igor Ustinov Reviewed-by: Tomas Mraz MergeDate: Thu Jul 23 14:17:09 2026 (Merged from https://github.com/openssl/openssl/pull/31959) --- crypto/fn/fn_lib.c | 19 +++++++++++++++++++ include/crypto/fn.h | 14 ++++++++++++++ 2 files changed, 33 insertions(+) diff --git a/crypto/fn/fn_lib.c b/crypto/fn/fn_lib.c index c9ffb9323f..d50ca1d85b 100644 --- a/crypto/fn/fn_lib.c +++ b/crypto/fn/fn_lib.c @@ -184,6 +184,25 @@ int OSSL_FN_cmp(const OSSL_FN *a, const OSSL_FN *b) return res; } +/*- + * Returns bit |n| of |a|. An out-of-range index (n < 0 or n >= the + * operand's width in bits) reads as 0. The only control flow branches on + * the operand's public width (dsize); the returned value is the bit itself, + * which is the information the caller asked for. + */ +int OSSL_FN_is_bit_set(const OSSL_FN *a, int n) +{ + size_t limb, off; + + if (n < 0) + return 0; + limb = (size_t)n / OSSL_FN_BITS; + off = (size_t)n % OSSL_FN_BITS; + if (limb >= (size_t)a->dsize) + return 0; + return (a->d[limb] >> off) & OSSL_FN_ULONG_C(1); +} + OSSL_FN *OSSL_FN_copy(OSSL_FN *a, const OSSL_FN *b) { if (ossl_unlikely(a == b)) diff --git a/include/crypto/fn.h b/include/crypto/fn.h index c8b7814e18..9a19d80f61 100644 --- a/include/crypto/fn.h +++ b/include/crypto/fn.h @@ -323,6 +323,20 @@ size_t OSSL_FN_num_bits(const OSSL_FN *a); */ int OSSL_FN_cmp(const OSSL_FN *a, const OSSL_FN *b); +/** + * Test whether bit @p n is set in @p a. + * + * @param[in] a The operand + * @param[in] n The bit index (0 = least significant) + * @returns 1 if bit @p n of @p a is set, 0 otherwise. + * + * @note An out-of-range index (n < 0 or n >= the operand's width in bits) + * reads as 0. The only control flow branches on the operand's public + * width (its dsize), not on limb values; the returned value is the bit + * itself, which is the information the caller asked for. + */ +int OSSL_FN_is_bit_set(const OSSL_FN *a, int n); + /** * Shift an OSSL_FN number left by n bits. Truncates the result to fit in r. * From 97618c446fb647f1b3c8c865133fc291419a47b3 Mon Sep 17 00:00:00 2001 From: Richard Levitte Date: Mon, 13 Jul 2026 22:05:12 +0200 Subject: [PATCH 59/69] OSSL_FN: Add introspection helpers is_word, is_zero, is_one, is_odd The OSSL_FN counterparts of the small BN predicates that the modular-square-root operation (and other upcoming operations) lean on: - OSSL_FN_is_word() mirrors BN_is_word() and BN_abs_is_word(), which collapse into one here since OSSL_FN is unsigned (no sign to ignore); a separate OSSL_FN_abs_is_word is therefore not added. - OSSL_FN_is_zero() and OSSL_FN_is_one() are kept as named predicates for readability at call sites rather than written inline. - OSSL_FN_is_odd() mirrors BN_is_odd(). The leak profile matches the BN counterparts: control flow branches only on the operand's public width (dsize), not on limb values; limb values are combined with constant-time selects, as in OSSL_FN_cmp() and the fixed-top BN helpers. Assisted-by: Pi:z-ai/glm-5.2 Signed-off-by: Richard Levitte Reviewed-by: Igor Ustinov Reviewed-by: Tomas Mraz MergeDate: Thu Jul 23 14:17:10 2026 (Merged from https://github.com/openssl/openssl/pull/31959) --- crypto/fn/fn_lib.c | 56 +++++++++++++++++++++++ include/crypto/fn.h | 49 ++++++++++++++++++++ test/fn_api_test.c | 109 ++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 214 insertions(+) diff --git a/crypto/fn/fn_lib.c b/crypto/fn/fn_lib.c index d50ca1d85b..44687a42bf 100644 --- a/crypto/fn/fn_lib.c +++ b/crypto/fn/fn_lib.c @@ -203,6 +203,62 @@ int OSSL_FN_is_bit_set(const OSSL_FN *a, int n) return (a->d[limb] >> off) & OSSL_FN_ULONG_C(1); } +/*- + * Returns 1 if the unsigned value of |a| equals the single-limb word |w|. + * Control flow branches only on the operand's public width (dsize); limb + * values are combined with constant-time selects, so the number of limbs + * inspected depends only on the public width, not on the operand's value. + * The returned value is the equality test the caller asked for. + */ +int OSSL_FN_is_word(const OSSL_FN *a, OSSL_FN_ULONG w) +{ + size_t i; + size_t dsize = (size_t)a->dsize; + int res; + + if (dsize == 0) + return w == 0; + + res = constant_time_select_int( + (unsigned int)constant_time_eq_bn(a->d[0], w), 1, 0); + for (i = 1; i < dsize; i++) + res = constant_time_select_int( + (unsigned int)constant_time_is_zero_bn(a->d[i]), res, 0); + return res; +} + +/*- + * Equivalent to OSSL_FN_is_word(a, 0), kept as a named predicate for + * readability at call sites. Leak profile as for OSSL_FN_is_word(): + * branches only on the operand's public width (dsize). + */ +int OSSL_FN_is_zero(const OSSL_FN *a) +{ + return OSSL_FN_is_word(a, 0); +} + +/*- + * Equivalent to OSSL_FN_is_word(a, 1), kept as a named predicate for + * readability at call sites. Leak profile as for OSSL_FN_is_word(): + * branches only on the operand's public width (dsize). + */ +int OSSL_FN_is_one(const OSSL_FN *a) +{ + return OSSL_FN_is_word(a, 1); +} + +/*- + * Returns the least significant bit of |a|, which is the information the + * caller asked for. The only control flow branches on the operand's public + * width (dsize), not on limb values. + */ +int OSSL_FN_is_odd(const OSSL_FN *a) +{ + if (a->dsize <= 0) + return 0; + return (int)(a->d[0] & OSSL_FN_ULONG_C(1)); +} + OSSL_FN *OSSL_FN_copy(OSSL_FN *a, const OSSL_FN *b) { if (ossl_unlikely(a == b)) diff --git a/include/crypto/fn.h b/include/crypto/fn.h index 9a19d80f61..97badc09e2 100644 --- a/include/crypto/fn.h +++ b/include/crypto/fn.h @@ -337,6 +337,55 @@ int OSSL_FN_cmp(const OSSL_FN *a, const OSSL_FN *b); */ int OSSL_FN_is_bit_set(const OSSL_FN *a, int n); +/** + * Test whether the unsigned value of @p a equals the single-limb word @p w. + * + * @param[in] a The operand + * @param[in] w The OSSL_FN_ULONG word to compare against + * @returns 1 if the unsigned value of @p a equals @p w, 0 otherwise + * + * @note Control flow branches only on the operand's public width (its dsize), + * not on limb values; the returned value is the equality test the caller + * asked for. + */ +int OSSL_FN_is_word(const OSSL_FN *a, OSSL_FN_ULONG w); + +/** + * Test whether @p a is zero. + * + * @param[in] a The operand + * @returns 1 if @p a is zero, 0 otherwise + * + * @note Equivalent to OSSL_FN_is_word(a, 0), provided as a named predicate for + * readability at call sites. Leak profile as for OSSL_FN_is_word(): + * branches only on the operand's public width (its dsize). + */ +int OSSL_FN_is_zero(const OSSL_FN *a); + +/** + * Test whether @p a is one. + * + * @param[in] a The operand + * @returns 1 if @p a is one, 0 otherwise + * + * @note Equivalent to OSSL_FN_is_word(a, 1), provided as a named predicate for + * readability at call sites. Leak profile as for OSSL_FN_is_word(): + * branches only on the operand's public width (its dsize). + */ +int OSSL_FN_is_one(const OSSL_FN *a); + +/** + * Test whether @p a is odd. + * + * @param[in] a The operand + * @returns the least significant bit of @p a (1 if odd, 0 if even) + * + * @note The only control flow branches on the operand's public width (its + * dsize), not on limb values; the returned value is the bit itself, + * which is the information the caller asked for. + */ +int OSSL_FN_is_odd(const OSSL_FN *a); + /** * Shift an OSSL_FN number left by n bits. Truncates the result to fit in r. * diff --git a/test/fn_api_test.c b/test/fn_api_test.c index 746b32ee9b..f6dcba0a2d 100644 --- a/test/fn_api_test.c +++ b/test/fn_api_test.c @@ -701,6 +701,114 @@ err: return ret; } +/*- + * Focused tests for the OSSL_FN introspection predicates: is_word, is_zero, + * is_one, is_odd. Covers plain values, fixed-top zero-padding (a value + * whose high limbs are zero limbs by dsize rather than by trimming), and the + * dsize == 0 (zero-limb) degenerate case. + */ +static int test_introspection(void) +{ + int ret = 0; + OSSL_FN *z = NULL; /* dsize 2, value 0 */ + OSSL_FN *z_wide = NULL; /* dsize 4, value 0 (fixed-top zero padding) */ + OSSL_FN *z_empty = NULL; /* dsize 0, value 0 */ + OSSL_FN *one = NULL; /* dsize 2, value 1 */ + OSSL_FN *one_wide = NULL; /* dsize 4, value 1 (fixed-top zero padding) */ + OSSL_FN *w5 = NULL; /* dsize 2, value 5 */ + OSSL_FN *w5_wide = NULL; /* dsize 4, value 5 (fixed-top zero padding) */ + OSSL_FN *even = NULL; /* dsize 2, value 0x...76543210 (even) */ + OSSL_FN *odd = NULL; /* dsize 2, value 0x...01234567 (odd) */ + OSSL_FN *two_limbs = NULL; /* dsize 2, value 0x...76543210 fedcba98 (nonzero high limb) */ + OSSL_FN_ULONG one_word = OSSL_FN_ULONG_C(1); + OSSL_FN_ULONG five_word = OSSL_FN_ULONG_C(5); + OSSL_FN_ULONG even_word = OSSL_FN_ULONG_C(0x76543210); + OSSL_FN_ULONG odd_word = OSSL_FN_ULONG_C(0x01234567); + const OSSL_FN_ULONG two_limbs_words[] = { + OSSL_FN_ULONG_C(0x76543210), + OSSL_FN_ULONG_C(0xfedcba98) + }; + + if (!TEST_ptr(z = OSSL_FN_new_limbs(2)) + || !TEST_ptr(z_wide = OSSL_FN_new_limbs(4)) + || !TEST_ptr(z_empty = OSSL_FN_new_limbs(0)) + || !TEST_ptr(one = OSSL_FN_new_limbs(2)) + || !TEST_ptr(one_wide = OSSL_FN_new_limbs(4)) + || !TEST_ptr(w5 = OSSL_FN_new_limbs(2)) + || !TEST_ptr(w5_wide = OSSL_FN_new_limbs(4)) + || !TEST_ptr(even = OSSL_FN_new_limbs(2)) + || !TEST_ptr(odd = OSSL_FN_new_limbs(2)) + || !TEST_ptr(two_limbs = OSSL_FN_new_limbs(2))) + goto err; + + /* All fresh allocations are zero-initialised, so z, z_wide, z_empty are 0. */ + if (!TEST_true(ossl_fn_set_words(one, &one_word, 1)) + || !TEST_true(ossl_fn_set_words(one_wide, &one_word, 1)) + || !TEST_true(ossl_fn_set_words(w5, &five_word, 1)) + || !TEST_true(ossl_fn_set_words(w5_wide, &five_word, 1)) + || !TEST_true(ossl_fn_set_words(even, &even_word, 1)) + || !TEST_true(ossl_fn_set_words(odd, &odd_word, 1)) + || !TEST_true(ossl_fn_set_words(two_limbs, two_limbs_words, + LIMBSOF(two_limbs_words)))) + goto err; + + /* OSSL_FN_is_zero */ + if (!TEST_int_eq(OSSL_FN_is_zero(z), 1) + || !TEST_int_eq(OSSL_FN_is_zero(z_wide), 1) /* fixed-top zero padding */ + || !TEST_int_eq(OSSL_FN_is_zero(z_empty), 1) /* dsize == 0 */ + || !TEST_int_eq(OSSL_FN_is_zero(one), 0) + || !TEST_int_eq(OSSL_FN_is_zero(w5_wide), 0)) + goto err; + + /* OSSL_FN_is_one */ + if (!TEST_int_eq(OSSL_FN_is_one(one), 1) + || !TEST_int_eq(OSSL_FN_is_one(one_wide), 1) /* fixed-top zero padding */ + || !TEST_int_eq(OSSL_FN_is_one(z), 0) + || !TEST_int_eq(OSSL_FN_is_one(w5), 0) + || !TEST_int_eq(OSSL_FN_is_one(z_empty), 0)) + goto err; + + /* OSSL_FN_is_word -- value equality against a single-limb word */ + if (!TEST_int_eq(OSSL_FN_is_word(z, 0), 1) + || !TEST_int_eq(OSSL_FN_is_word(z_wide, 0), 1) /* fixed-top zero padding */ + || !TEST_int_eq(OSSL_FN_is_word(z_empty, 0), 1) + || !TEST_int_eq(OSSL_FN_is_word(z, 1), 0) + || !TEST_int_eq(OSSL_FN_is_word(one, 1), 1) + || !TEST_int_eq(OSSL_FN_is_word(one_wide, 1), 1) /* fixed-top zero padding */ + || !TEST_int_eq(OSSL_FN_is_word(one, 0), 0) + || !TEST_int_eq(OSSL_FN_is_word(w5, 5), 1) + || !TEST_int_eq(OSSL_FN_is_word(w5_wide, 5), 1) /* fixed-top zero padding */ + || !TEST_int_eq(OSSL_FN_is_word(w5, 1), 0) + /* A value whose high limb is nonzero is not equal to a single word. */ + || !TEST_int_eq(OSSL_FN_is_word(two_limbs, even_word), 0) + || !TEST_int_eq(OSSL_FN_is_word(two_limbs, 0), 0)) + goto err; + + /* OSSL_FN_is_odd */ + if (!TEST_int_eq(OSSL_FN_is_odd(one), 1) + || !TEST_int_eq(OSSL_FN_is_odd(odd), 1) + || !TEST_int_eq(OSSL_FN_is_odd(w5), 1) + || !TEST_int_eq(OSSL_FN_is_odd(z), 0) + || !TEST_int_eq(OSSL_FN_is_odd(z_wide), 0) + || !TEST_int_eq(OSSL_FN_is_odd(z_empty), 0) + || !TEST_int_eq(OSSL_FN_is_odd(even), 0)) + goto err; + + ret = 1; +err: + OSSL_FN_free(z); + OSSL_FN_free(z_wide); + OSSL_FN_free(z_empty); + OSSL_FN_free(one); + OSSL_FN_free(one_wide); + OSSL_FN_free(w5); + OSSL_FN_free(w5_wide); + OSSL_FN_free(even); + OSSL_FN_free(odd); + OSSL_FN_free(two_limbs); + return ret; +} + static int test_lshift_common(int i, int use_lshift1) { const OSSL_FN_ULONG *a_words = NULL; @@ -2138,6 +2246,7 @@ int setup_tests(void) ADD_ALL_TESTS(test_sub_truncated, 18); ADD_TEST(test_num_bits); ADD_TEST(test_cmp); + ADD_TEST(test_introspection); ADD_ALL_TESTS(test_lshift1, 2); ADD_ALL_TESTS(test_lshift, 6); ADD_ALL_TESTS(test_rshift1, 2); From 9cc605f48ea95c483deca19f026d5d0ca343fd33 Mon Sep 17 00:00:00 2001 From: Richard Levitte Date: Mon, 13 Jul 2026 22:23:37 +0200 Subject: [PATCH 60/69] OSSL_FN: Implement OSSL_FN_add_word / OSSL_FN_sub_word The declarations of OSSL_FN_add_word() / OSSL_FN_sub_word() have been in include/crypto/fn.h since the initial 'add'/'sub' commit, but no implementation ever landed -- the symbols were simply absent, with no caller noticing. This adds them next to OSSL_FN_add() / OSSL_FN_sub(). While here, correct the signature: the word argument was declared 'const OSSL_FN_ULONG *w' (a pointer), which matches no BN counterpart; it is now 'OSSL_FN_ULONG w' by value, mirroring BN_add_word() / BN_sub_word(). Safe because there was no implementation and no caller. These are the OSSL_FN counterparts of BN_add_word() / BN_sub_word(). The fixed-size unsigned semantics diverge where the BN counterpart grows the BIGNUM (bn_wexpand) or records a sign (a->neg, storing w - a): OSSL_FN instead truncates a carry/borrow past the last limb, and a borrow off the top yields the 2's-complement wrap-around. Both are non-constant-time, matching BN_add_word()/BN_sub_word(): the carry/borrow loop stops early once exhausted, so the number of limbs touched depends on the operand's value. Tests cross-check every case against OSSL_FN_add() / OSSL_FN_sub() with a single-limb operand. Verified on both 64-bit (linux-x86_64) and 32-bit (linux-x86) limb widths. Assisted-by: Pi:z-ai/glm-5.2 Signed-off-by: Richard Levitte Reviewed-by: Igor Ustinov Reviewed-by: Tomas Mraz MergeDate: Thu Jul 23 14:17:12 2026 (Merged from https://github.com/openssl/openssl/pull/31959) --- crypto/fn/fn_addsub.c | 60 ++++++++++++++++++++++ include/crypto/fn.h | 4 +- test/fn_api_test.c | 114 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 176 insertions(+), 2 deletions(-) diff --git a/crypto/fn/fn_addsub.c b/crypto/fn/fn_addsub.c index 85286a5439..2e47623340 100644 --- a/crypto/fn/fn_addsub.c +++ b/crypto/fn/fn_addsub.c @@ -90,6 +90,34 @@ int OSSL_FN_add(OSSL_FN *r, const OSSL_FN *a, const OSSL_FN *b) return 1; } +/*- + * Adds the single-limb word |w| to |a| in place, propagating the carry + * through |a|'s limbs and truncating any carry out past a->dsize (OSSL_FN is + * fixed-size, so a carry past the last limb is discarded rather than grown + * into). The degenerate w == 0 case is a no-op. + * + * Not constant-time: the carry-propagation loop stops early once the carry + * is exhausted, so the number of limbs touched depends on the operand's + * value. + */ +int OSSL_FN_add_word(OSSL_FN *a, OSSL_FN_ULONG w) +{ + size_t i; + size_t dsize = (size_t)a->dsize; + + if (w == 0) + return 1; + + for (i = 0; i < dsize && w != 0; i++) { + OSSL_FN_ULONG l = (a->d[i] + w) & OSSL_FN_MASK; + + a->d[i] = l; + w = (w > l); + } + /* Any remaining carry out past dsize is truncated. */ + return 1; +} + /* unsigned subtraction of b from a */ int OSSL_FN_sub(OSSL_FN *r, const OSSL_FN *a, const OSSL_FN *b) { @@ -160,3 +188,35 @@ int OSSL_FN_sub(OSSL_FN *r, const OSSL_FN *a, const OSSL_FN *b) return 1; } + +/*- + * Subtracts the single-limb word |w| from |a| in place, propagating the + * borrow through |a|'s limbs. If the borrow runs past a->dsize (i.e. the + * unsigned value of |a| is less than |w|), the result is the 2's-complement + * wrap-around truncated to dsize, per OSSL_FN's fixed-size unsigned + * semantics: there is no sign to record, so the wrapped value is kept. The + * degenerate w == 0 case is a no-op. + * + * Not constant-time: the borrow-propagation loop returns early once the + * borrow is repaid, so the number of limbs touched depends on the operand's + * value. + */ +int OSSL_FN_sub_word(OSSL_FN *a, OSSL_FN_ULONG w) +{ + size_t i; + size_t dsize = (size_t)a->dsize; + + if (w == 0) + return 1; + + for (i = 0; i < dsize; i++) { + if (a->d[i] >= w) { + a->d[i] -= w; + return 1; /* borrow repaid */ + } + a->d[i] = (a->d[i] - w) & OSSL_FN_MASK; + w = 1; + } + /* Borrow out past dsize is truncated (2's complement). */ + return 1; +} diff --git a/include/crypto/fn.h b/include/crypto/fn.h index 97badc09e2..ad15fbeeaa 100644 --- a/include/crypto/fn.h +++ b/include/crypto/fn.h @@ -441,7 +441,7 @@ int OSSL_FN_add(OSSL_FN *r, const OSSL_FN *a, const OSSL_FN *b); * @param[in] w The OSSL_FN_ULONG word * @returns 1 on success, 0 on error */ -int OSSL_FN_add_word(OSSL_FN *a, const OSSL_FN_ULONG *w); +int OSSL_FN_add_word(OSSL_FN *a, OSSL_FN_ULONG w); /** * Subtract two OSSL_FN numbers. @@ -460,7 +460,7 @@ int OSSL_FN_sub(OSSL_FN *r, const OSSL_FN *a, const OSSL_FN *b); * @param[in] w The OSSL_FN_ULONG word * @returns 1 on success, 0 on error */ -int OSSL_FN_sub_word(OSSL_FN *a, const OSSL_FN_ULONG *w); +int OSSL_FN_sub_word(OSSL_FN *a, OSSL_FN_ULONG w); /** * Multiply two OSSL_FN numbers. Truncates the result to fit in r. diff --git a/test/fn_api_test.c b/test/fn_api_test.c index f6dcba0a2d..519dbaabfc 100644 --- a/test/fn_api_test.c +++ b/test/fn_api_test.c @@ -809,6 +809,118 @@ err: return ret; } +/*- + * Focused tests for OSSL_FN_add_word() / OSSL_FN_sub_word(). Each case is + * cross-checked against OSSL_FN_add() / OSSL_FN_sub() with a single-limb + * operand, an independent oracle that exercises the exact fixed-size + * truncation / 2's-complement semantics the word variants must match. + * + * OSSL_FN_add_word()/OSSL_FN_sub_word() take the word by value; the earlier + * pointer-typed declaration had no implementation and no callers, and is + * corrected together with the implementation landing here. + */ +struct word_op_case_st { + const OSSL_FN_ULONG *a_words; + size_t a_limbs; /* significant limbs of a */ + size_t a_dsize; /* allocated dsize (>= a_limbs; exercises padding) */ + OSSL_FN_ULONG w; +}; + +static const OSSL_FN_ULONG w_zero[] = { OSSL_FN_ULONG_C(0) }; +static const OSSL_FN_ULONG w_5[] = { OSSL_FN_ULONG_C(5) }; +static const OSSL_FN_ULONG w_01234567[] = { OSSL_FN_ULONG_C(0x01234567) }; +static const OSSL_FN_ULONG w_FFFFFFFF[] = { OSSL_FN_ULONG_C(0xffffffff) }; +static const OSSL_FN_ULONG w_FFFFFFFE[] = { OSSL_FN_ULONG_C(0xfffffffe) }; +static const OSSL_FN_ULONG w_7FFFFFFF[] = { OSSL_FN_ULONG_C(0x7fffffff) }; +static const OSSL_FN_ULONG w_0_1[] = { OSSL_FN_ULONG_C(0), OSSL_FN_ULONG_C(1) }; +static const OSSL_FN_ULONG w_0_0[] = { OSSL_FN_ULONG_C(0), OSSL_FN_ULONG_C(0) }; +static const OSSL_FN_ULONG w_FF_FF[] = { OSSL_FN_ULONG_C(0xffffffff), + OSSL_FN_ULONG_C(0xffffffff) }; +static const OSSL_FN_ULONG w_FE_FF[] = { OSSL_FN_ULONG_C(0xfffffffe), + OSSL_FN_ULONG_C(0xffffffff) }; +static const OSSL_FN_ULONG w_67_89[] = { OSSL_FN_ULONG_C(0x01234567), + OSSL_FN_ULONG_C(0x89abcdef) }; + +static const struct word_op_case_st add_word_cases[] = { + { w_zero, 1, 2, OSSL_FN_ULONG_C(5) }, /* a == 0 */ + { w_01234567, 1, 2, OSSL_FN_ULONG_C(1) }, /* no carry */ + { w_FFFFFFFF, 1, 2, OSSL_FN_ULONG_C(1) }, /* carry into next limb */ + { w_FF_FF, 2, 2, OSSL_FN_ULONG_C(1) }, /* carry out truncated */ + { w_FE_FF, 2, 2, OSSL_FN_ULONG_C(2) }, /* carry propagates one limb */ + { w_67_89, 2, 2, OSSL_FN_ULONG_C(0) }, /* w == 0 noop */ + { w_FFFFFFFF, 1, 1, OSSL_FN_ULONG_C(1) }, /* dsize 1, carry truncated */ + { w_7FFFFFFF, 1, 1, OSSL_FN_ULONG_C(0x7fffffff) }, /* no carry, near boundary */ +}; + +static const struct word_op_case_st sub_word_cases[] = { + { w_zero, 1, 2, OSSL_FN_ULONG_C(5) }, /* borrow out -> 2's complement */ + { w_01234567, 1, 2, OSSL_FN_ULONG_C(1) }, /* no borrow */ + { w_0_1, 2, 2, OSSL_FN_ULONG_C(1) }, /* borrow repaid at limb 1 */ + { w_0_0, 2, 2, OSSL_FN_ULONG_C(1) }, /* borrow out truncated */ + { w_67_89, 2, 2, OSSL_FN_ULONG_C(0) }, /* w == 0 noop */ + { w_zero, 1, 1, OSSL_FN_ULONG_C(1) }, /* dsize 1, borrow truncated */ + { w_5, 1, 1, OSSL_FN_ULONG_C(5) }, /* exact, no borrow */ + { w_FFFFFFFE, 1, 2, OSSL_FN_ULONG_C(0xffffffff) }, /* borrow through to limb 1 */ +}; + +/* + * Cross-check OSSL_FN__word(a, w) against OSSL_FN_(r, a_ref, b) where + * b is a single-limb operand holding w. The two-limb/general operation and + * the word variant must agree on the full dsize, including truncation and + * 2's-complement wrap behaviour. + */ +static int test_word_op_common(int i, + const struct word_op_case_st *cases, size_t ncases, + int (*word_op)(OSSL_FN *, OSSL_FN_ULONG), + int (*ref_op)(OSSL_FN *, const OSSL_FN *, + const OSSL_FN *)) +{ + const struct word_op_case_st *tc = &cases[i]; + OSSL_FN *a = NULL, *a_ref = NULL, *b = NULL, *res = NULL; + const OSSL_FN_ULONG *u = NULL, *r = NULL; + int ret = 0; + + if (!TEST_ptr(a = OSSL_FN_new_limbs(tc->a_dsize)) + || !TEST_ptr(a_ref = OSSL_FN_new_limbs(tc->a_dsize)) + || !TEST_ptr(b = OSSL_FN_new_limbs(1)) + || !TEST_ptr(res = OSSL_FN_new_limbs(tc->a_dsize)) + || !TEST_true(ossl_fn_set_words(a, tc->a_words, tc->a_limbs)) + || !TEST_true(ossl_fn_set_words(a_ref, tc->a_words, tc->a_limbs)) + || !TEST_true(ossl_fn_set_words(b, &tc->w, 1)) + || !TEST_true(pollute(res, 0, tc->a_dsize))) + goto err; + + if (!TEST_true(word_op(a, tc->w)) + || !TEST_true(ref_op(res, a_ref, b))) + goto err; + + u = ossl_fn_get_words(a); + r = ossl_fn_get_words(res); + if (!TEST_mem_eq(u, tc->a_dsize * OSSL_FN_BYTES, + r, tc->a_dsize * OSSL_FN_BYTES)) + goto err; + + ret = 1; +err: + OSSL_FN_free(a); + OSSL_FN_free(a_ref); + OSSL_FN_free(b); + OSSL_FN_free(res); + return ret; +} + +static int test_add_word(int i) +{ + return test_word_op_common(i, add_word_cases, OSSL_NELEM(add_word_cases), + OSSL_FN_add_word, OSSL_FN_add); +} + +static int test_sub_word(int i) +{ + return test_word_op_common(i, sub_word_cases, OSSL_NELEM(sub_word_cases), + OSSL_FN_sub_word, OSSL_FN_sub); +} + static int test_lshift_common(int i, int use_lshift1) { const OSSL_FN_ULONG *a_words = NULL; @@ -2247,6 +2359,8 @@ int setup_tests(void) ADD_TEST(test_num_bits); ADD_TEST(test_cmp); ADD_TEST(test_introspection); + ADD_ALL_TESTS(test_add_word, OSSL_NELEM(add_word_cases)); + ADD_ALL_TESTS(test_sub_word, OSSL_NELEM(sub_word_cases)); ADD_ALL_TESTS(test_lshift1, 2); ADD_ALL_TESTS(test_lshift, 6); ADD_ALL_TESTS(test_rshift1, 2); From d0e86cb69ea8ac2f69201f0c710b371a707afb39 Mon Sep 17 00:00:00 2001 From: Richard Levitte Date: Mon, 13 Jul 2026 22:33:03 +0200 Subject: [PATCH 61/69] OSSL_FN: Add assignment helpers set_word, one, zero The OSSL_FN counterparts of the small BN assignment helpers that the modular-square-root operation (and other upcoming operations) lean on: OSSL_FN_set_word(), OSSL_FN_one(), and OSSL_FN_zero() mirror BN_set_word(), BN_one(), and BN_zero(). The fixed-size semantics diverge where BN_set_word() grows the BIGNUM (bn_wexpand(a, 1)) to guarantee room: OSSL_FN cannot grow, so a zero-width destination fails with OSSL_FN_R_RESULT_ARG_TOO_SMALL instead. OSSL_FN_set_word() is constant-time with respect to w's value, unlike BN_set_word() (which sets a->top = (w ? 1 : 0)); OSSL_FN has no top, so the full dsize array always holds the value and the only branch is on the public width. OSSL_FN_zero() is a plain value assignment, not a secure wipe; OSSL_FN_clear() (OPENSSL_cleanse()) is the secure-wipe counterpart, mirroring the BN_zero() / BN_clear() split. Tests cross-check set_word against the internal ossl_fn_set_words() and cover the dsize == 0 error path. Verified on both 64-bit (linux-x86_64) and 32-bit (linux-x86) limb widths. Assisted-by: Pi:z-ai/glm-5.2 Signed-off-by: Richard Levitte Reviewed-by: Igor Ustinov Reviewed-by: Tomas Mraz MergeDate: Thu Jul 23 14:17:14 2026 (Merged from https://github.com/openssl/openssl/pull/31959) --- crypto/fn/fn_lib.c | 48 ++++++++++++++++++ include/crypto/fn.h | 42 ++++++++++++++++ test/fn_api_test.c | 118 ++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 208 insertions(+) diff --git a/crypto/fn/fn_lib.c b/crypto/fn/fn_lib.c index 44687a42bf..08b78f6c02 100644 --- a/crypto/fn/fn_lib.c +++ b/crypto/fn/fn_lib.c @@ -106,6 +106,54 @@ void OSSL_FN_clear(OSSL_FN *f) OPENSSL_cleanse(f->d, limbssize); } +/*- + * Sets a->d[0] to |w| and zeroes the remaining limbs, so the full dsize + * array reflects the value |w|. OSSL_FN is fixed-size: if a->dsize is 0 + * there is no limb to write and the call fails with + * OSSL_FN_R_RESULT_ARG_TOO_SMALL (the same reason ossl_fn_set_words() raises + * for an undersized destination). + * + * Constant-time with respect to |w|'s value: there is no value-dependent + * control flow, since the full dsize array always holds the value. The only + * branch is on the operand's public width (dsize). + */ +int OSSL_FN_set_word(OSSL_FN *a, OSSL_FN_ULONG w) +{ + size_t dsize = (size_t)a->dsize; + + if (ossl_unlikely(dsize < 1)) { + ERR_raise(ERR_LIB_OSSL_FN, OSSL_FN_R_RESULT_ARG_TOO_SMALL); + return 0; + } + + a->d[0] = w; + if (dsize > 1) + memset(&a->d[1], 0, sizeof(OSSL_FN_ULONG) * (dsize - 1)); + return 1; +} + +/*- + * Equivalent to OSSL_FN_set_word(a, 1). Kept as a named function rather + * than a macro or static inline, consistent with the rest of + * crypto/fn/fn_lib.c. Leak profile as for OSSL_FN_set_word(). + */ +int OSSL_FN_one(OSSL_FN *a) +{ + return OSSL_FN_set_word(a, OSSL_FN_ULONG_C(1)); +} + +/*- + * Equivalent to OSSL_FN_set_word(a, 0). This is a plain value assignment, + * not a secure wipe: the compiler may optimise the writes away if the value + * is not subsequently observed. Use OSSL_FN_clear() (which calls + * OPENSSL_cleanse()) when the limbs may hold secret data and must be wiped + * irreversibly. Leak profile as for OSSL_FN_set_word(). + */ +int OSSL_FN_zero(OSSL_FN *a) +{ + return OSSL_FN_set_word(a, OSSL_FN_ULONG_C(0)); +} + static size_t ossl_fn_num_bits_word(OSSL_FN_ULONG l) { OSSL_FN_ULONG x, mask; diff --git a/include/crypto/fn.h b/include/crypto/fn.h index ad15fbeeaa..15aed809c4 100644 --- a/include/crypto/fn.h +++ b/include/crypto/fn.h @@ -129,6 +129,48 @@ void OSSL_FN_clear_free(OSSL_FN *f); */ void OSSL_FN_clear(OSSL_FN *f); +/** + * Set an OSSL_FN to a single-limb word value. + * + * @param[out] a The destination OSSL_FN + * @param[in] w The OSSL_FN_ULONG word + * @returns 1 on success, 0 on error + * + * @note Sets a->d[0] to @p w and zeroes the remaining limbs, so the full + * dsize array reflects the value @p w. If a->dsize is 0 there is no + * limb to write and the call fails with + * OSSL_FN_R_RESULT_ARG_TOO_SMALL (OSSL_FN is fixed-size, so the + * destination cannot be grown). The operation is constant-time with + * respect to @p w's value; the only branch is on the operand's public + * width (dsize). + */ +int OSSL_FN_set_word(OSSL_FN *a, OSSL_FN_ULONG w); + +/** + * Set an OSSL_FN to one. + * + * @param[out] a The destination OSSL_FN + * @returns 1 on success, 0 on error + * + * @note Equivalent to OSSL_FN_set_word(a, 1), provided as a named function + * for readability at call sites. Leak profile as for + * OSSL_FN_set_word(). + */ +int OSSL_FN_one(OSSL_FN *a); + +/** + * Set an OSSL_FN to zero. + * + * @param[out] a The destination OSSL_FN + * @returns 1 on success, 0 on error + * + * @note This is a plain value assignment, not a secure wipe; use + * OSSL_FN_clear() when the limbs may hold secret data and must be wiped + * irreversibly. Equivalent to OSSL_FN_set_word(a, 0). Leak profile as + * for OSSL_FN_set_word(). + */ +int OSSL_FN_zero(OSSL_FN *a); + /** * Copy the contents of one OSSL_FN instance to another. * diff --git a/test/fn_api_test.c b/test/fn_api_test.c index 519dbaabfc..0fea379a56 100644 --- a/test/fn_api_test.c +++ b/test/fn_api_test.c @@ -921,6 +921,121 @@ static int test_sub_word(int i) OSSL_FN_sub_word, OSSL_FN_sub); } +/*- + * Focused tests for the assignment helpers: OSSL_FN_set_word(), OSSL_FN_one(), + * OSSL_FN_zero(). set_word is cross-checked against the internal + * ossl_fn_set_words() (an independent setter) and pollutes the destination + * first so that zeroing of high limbs is verified rather than assumed. + */ +struct set_word_case_st { + size_t dsize; /* allocated dsize */ + OSSL_FN_ULONG w; + int expect_err; /* 1 if the call should fail (dsize == 0) */ +}; + +static const struct set_word_case_st set_word_cases[] = { + { 1, OSSL_FN_ULONG_C(5), 0 }, /* minimal dsize */ + { 1, OSSL_FN_ULONG_C(0), 0 }, /* zero, minimal dsize */ + { 4, OSSL_FN_ULONG_C(0x01234567), 0 }, /* high limbs must be zeroed */ + { 4, OSSL_FN_ULONG_C(0), 0 }, /* zero, high limbs zeroed */ + { 2, OSSL_FN_ULONG_C(0xffffffff), 0 }, /* all-ones word */ + { 0, OSSL_FN_ULONG_C(5), 1 }, /* dsize 0 -> error */ +}; + +static int test_set_word(int i) +{ + const struct set_word_case_st *tc = &set_word_cases[i]; + OSSL_FN *a = NULL, *ref = NULL; + const OSSL_FN_ULONG *u = NULL, *r = NULL; + int ret = 0; + + if (!TEST_ptr(a = OSSL_FN_new_limbs(tc->dsize)) + || !TEST_ptr(ref = OSSL_FN_new_limbs(tc->dsize))) + goto err; + + /* Pollute both so that zeroing of untouched limbs is detectable. */ + if (tc->dsize > 0) { + if (!TEST_true(pollute(a, 0, tc->dsize)) + || !TEST_true(pollute(ref, 0, tc->dsize))) + goto err; + } + + if (tc->expect_err) { + if (!TEST_false(OSSL_FN_set_word(a, tc->w))) + goto err; + /* ossl_fn_set_words() with 1 limb also fails on dsize 0. */ + if (!TEST_false(ossl_fn_set_words(ref, &tc->w, 1))) + goto err; + ret = 1; + goto err; + } + + if (!TEST_true(OSSL_FN_set_word(a, tc->w)) + || !TEST_true(ossl_fn_set_words(ref, &tc->w, 1))) + goto err; + + u = ossl_fn_get_words(a); + r = ossl_fn_get_words(ref); + if (!TEST_mem_eq(u, tc->dsize * OSSL_FN_BYTES, + r, tc->dsize * OSSL_FN_BYTES)) + goto err; + /* High limbs beyond limb 1 must be zero. */ + if (tc->dsize > 1 + && !TEST_true(check_limbs_value(a, 1, tc->dsize, 0))) + goto err; + + ret = 1; +err: + OSSL_FN_free(a); + OSSL_FN_free(ref); + return ret; +} + +static int test_one(void) +{ + int ret = 0; + OSSL_FN *a = NULL; + const OSSL_FN_ULONG *u = NULL; + size_t dsize = 4; + + if (!TEST_ptr(a = OSSL_FN_new_limbs(dsize)) + || !TEST_true(pollute(a, 0, dsize)) + || !TEST_true(OSSL_FN_one(a))) + goto err; + + u = ossl_fn_get_words(a); + if (!TEST_int_eq((int)u[0], 1) + || !TEST_true(check_limbs_value(a, 1, dsize, 0))) + goto err; + + ret = 1; +err: + OSSL_FN_free(a); + return ret; +} + +static int test_zero(void) +{ + int ret = 0; + OSSL_FN *a = NULL; + size_t dsize = 4; + + if (!TEST_ptr(a = OSSL_FN_new_limbs(dsize)) + || !TEST_true(pollute(a, 0, dsize)) + || !TEST_true(OSSL_FN_zero(a))) + goto err; + + /* OSSL_FN_is_zero() (added in the introspection commit) reads the result. */ + if (!TEST_int_eq(OSSL_FN_is_zero(a), 1) + || !TEST_true(check_limbs_value(a, 0, dsize, 0))) + goto err; + + ret = 1; +err: + OSSL_FN_free(a); + return ret; +} + static int test_lshift_common(int i, int use_lshift1) { const OSSL_FN_ULONG *a_words = NULL; @@ -2361,6 +2476,9 @@ int setup_tests(void) ADD_TEST(test_introspection); ADD_ALL_TESTS(test_add_word, OSSL_NELEM(add_word_cases)); ADD_ALL_TESTS(test_sub_word, OSSL_NELEM(sub_word_cases)); + ADD_ALL_TESTS(test_set_word, OSSL_NELEM(set_word_cases)); + ADD_TEST(test_one); + ADD_TEST(test_zero); ADD_ALL_TESTS(test_lshift1, 2); ADD_ALL_TESTS(test_lshift, 6); ADD_ALL_TESTS(test_rshift1, 2); From 1588f1f3eb9a454340ef1b64bdcde78684acf195 Mon Sep 17 00:00:00 2001 From: Richard Levitte Date: Tue, 14 Jul 2026 09:48:01 +0200 Subject: [PATCH 62/69] OSSL_FN: Add random-number functions rand / priv_rand / range Add OSSL_FN_rand(), OSSL_FN_priv_rand(), OSSL_FN_rand_range(), and OSSL_FN_priv_rand_range(), the OSSL_FN counterparts of the BN_rand_ex() / BN_priv_rand_ex() / BN_rand_range_ex() / BN_priv_rand_range_ex() family from crypto/bn/bn_rand.c -- the first OSSL_FN random-number helpers. The BN counterparts take a BN_CTX only to recover the library context (via ossl_bn_get_libctx()); the OSSL_FN peers take an OSSL_LIB_CTX directly, and per the OSSL_FN naming convention the BN _ex / _ex{n} suffixes are dropped. ossl_fn_rand() departs from the BN counterpart's byte-buffer mechanics: bnrand() draws into a heap big-endian buffer and shapes via BN_bin2bn(), whereas OSSL_FN limbs are fixed-size, so random bytes are drawn straight into rnd->d and the top/bottom/mask shaping is done as limb value operations (endian-neutral). A destination too small for |bits| is an error (OSSL_FN_R_RESULT_ARG_TOO_SMALL), not an implicit expansion. The range variants port bnrand_range() faithfully; the range->neg rejection is dropped (OSSL_FN is unsigned). The leak profile matches the BN counterpart: control flow branches on bits/top/bottom (caller-chosen, public) and the byte-draw return value, never on the random bytes themselves; the range loop count leaks the magnitude of |range| and the rejection probability. The TESTING mangle variant (BN_bntest_rand) is deferred; a TODO(FIXNUM) marks the spot. New error reasons: OSSL_FN_R_BITS_TOO_SMALL, OSSL_FN_R_INVALID_RANGE, OSSL_FN_R_TOO_MANY_ITERATIONS. Tests are property-based (random values cannot be value-compared) and verify the bit-width, top/bottom constraints, zero-padding, and 0 <= r < range, on both 64-bit and 32-bit limb widths. Assisted-by: Pi:z-ai/glm-5.2 Signed-off-by: Richard Levitte Reviewed-by: Igor Ustinov Reviewed-by: Tomas Mraz MergeDate: Thu Jul 23 14:17:16 2026 (Merged from https://github.com/openssl/openssl/pull/31959) --- crypto/err/openssl.txt | 3 + crypto/fn/build.info | 2 +- crypto/fn/fn_err.c | 6 + crypto/fn/fn_rand.c | 245 ++++++++++++++++++++++++++++++++++++ include/crypto/fn.h | 96 ++++++++++++++ include/crypto/fnerr.h | 3 + test/fn_api_test.c | 276 +++++++++++++++++++++++++++++++++++++++++ 7 files changed, 630 insertions(+), 1 deletion(-) create mode 100644 crypto/fn/fn_rand.c diff --git a/crypto/err/openssl.txt b/crypto/err/openssl.txt index 5770a1d481..099fd75f9e 100644 --- a/crypto/err/openssl.txt +++ b/crypto/err/openssl.txt @@ -889,8 +889,11 @@ OSSL_ENCODER_R_INCORRECT_PROPERTY_QUERY:100:incorrect property query OSSL_ENCODER_R_MISSING_GET_PARAMS:102:missing get params OSSL_ENCODER_R_UNKNOWN_PARAMETER_NAME:104:unknown parameter name OSSL_FN_R_DIV_BY_ZERO:101:div by zero +OSSL_FN_R_BITS_TOO_SMALL:105:bits too small +OSSL_FN_R_INVALID_RANGE:106:invalid range OSSL_FN_R_INVALID_SHIFT:102:invalid shift OSSL_FN_R_RESULT_ARG_TOO_SMALL:100:result arg too small +OSSL_FN_R_TOO_MANY_ITERATIONS:107:too many iterations OSSL_STORE_R_AMBIGUOUS_CONTENT_TYPE:107:ambiguous content type OSSL_STORE_R_BAD_PASSWORD_READ:115:bad password read OSSL_STORE_R_ERROR_VERIFYING_PKCS12_MAC:113:error verifying pkcs12 mac diff --git a/crypto/fn/build.info b/crypto/fn/build.info index 3581027748..860cc40134 100644 --- a/crypto/fn/build.info +++ b/crypto/fn/build.info @@ -3,7 +3,7 @@ $LIBFIPS=../../providers/libfips.a LIBS=$LIBCRYPTO $COMMON=fn_err.c fn_lib.c fn_ctx.c fn_intern.c fn_addsub.c fn_shift.c fn_mul.c \ - fn_sqr.c fn_div.c + fn_sqr.c fn_div.c fn_rand.c SOURCE[$LIBCRYPTO]=$COMMON SOURCE[$LIBFIPS]=$COMMON diff --git a/crypto/fn/fn_err.c b/crypto/fn/fn_err.c index 997f60668f..d5c81adca6 100644 --- a/crypto/fn/fn_err.c +++ b/crypto/fn/fn_err.c @@ -15,10 +15,16 @@ static const ERR_STRING_DATA OSSL_FN_str_reasons[] = { { ERR_PACK(ERR_LIB_OSSL_FN, 0, OSSL_FN_R_DIV_BY_ZERO), "div by zero" }, + { ERR_PACK(ERR_LIB_OSSL_FN, 0, OSSL_FN_R_INVALID_RANGE), + "invalid range" }, { ERR_PACK(ERR_LIB_OSSL_FN, 0, OSSL_FN_R_INVALID_SHIFT), "invalid shift" }, { ERR_PACK(ERR_LIB_OSSL_FN, 0, OSSL_FN_R_RESULT_ARG_TOO_SMALL), "result arg too small" }, + { ERR_PACK(ERR_LIB_OSSL_FN, 0, OSSL_FN_R_BITS_TOO_SMALL), + "bits too small" }, + { ERR_PACK(ERR_LIB_OSSL_FN, 0, OSSL_FN_R_TOO_MANY_ITERATIONS), + "too many iterations" }, { 0, NULL } }; diff --git a/crypto/fn/fn_rand.c b/crypto/fn/fn_rand.c new file mode 100644 index 0000000000..4710357c9f --- /dev/null +++ b/crypto/fn/fn_rand.c @@ -0,0 +1,245 @@ +/* + * Copyright 2026 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#include +#include +#include "crypto/fnerr.h" +#include "fn_local.h" + +/* + * Internal flag selecting which DRBG pool the bytes are drawn from. + * NORMAL routes through RAND_bytes_ex(), PRIVATE through + * RAND_priv_bytes_ex() (a non-forward-linkable source). The same shaping + * code feeds either pool; the flag selects which one, mirroring the + * public/private split exposed by the OSSL_FN_rand() / OSSL_FN_priv_rand() + * entry points. + */ +enum ossl_fn_rand_flag { + NORMAL = 0, + PRIVATE +}; + +/* Set bit |pos| (0 = least significant) of |a|, by absolute position. */ +static void ossl_fn_set_bit(OSSL_FN *a, size_t pos) +{ + a->d[pos / OSSL_FN_BITS] |= OSSL_FN_ULONG_C(1) << (pos % OSSL_FN_BITS); +} + +/*- + * ossl_fn_rand() fills |rnd| with |bits| random bits, shaping the top and + * bottom bits per the |top|/|bottom| requests. The random bytes are drawn + * directly into rnd->d's byte image (a whole number of limbs, so the result + * is a random value regardless of the machine's byte order), and the + * top/bottom/mask shaping is done directly on rnd->d's limbs as value + * operations -- set bit |bits|-1 for TOP_ONE, bits |bits|-1 and |bits|-2 + * for TOP_TWO, clear the high bits of the top limb at |bits| and above, + * set bit 0 for BOTTOM_ODD. No intermediate byte buffer is needed, since + * OSSL_FN's limbs are fixed-size. + * + * A destination too small for |bits| is an error + * (OSSL_FN_R_RESULT_ARG_TOO_SMALL), not an implicit expansion. + * + * The leak profile: control flow branches on |bits|, |top|, |bottom| (all + * caller-chosen, public) and on the byte-draw return value, never on the + * random bytes themselves. The result value of OSSL_FN_rand() / + * OSSL_FN_priv_rand() is, of course, the random number the caller asked for. + */ +static int ossl_fn_rand(enum ossl_fn_rand_flag flag, OSSL_FN *rnd, size_t bits, + int top, int bottom, size_t strength, + OSSL_LIB_CTX *libctx) +{ + size_t limbs_needed, top_limb, i; + + if (rnd == NULL) { + ERR_raise(ERR_LIB_OSSL_FN, ERR_R_PASSED_NULL_PARAMETER); + return 0; + } + + if (bits == 0) { + if (top != OSSL_FN_RAND_TOP_ANY || bottom != OSSL_FN_RAND_BOTTOM_ANY) + goto toosmall; + return OSSL_FN_zero(rnd); + } + if (bits == 1 && top > 0) + goto toosmall; + + limbs_needed = bits / OSSL_FN_BITS; + limbs_needed += (bits % OSSL_FN_BITS != 0) ? 1 : 0; + if (limbs_needed > (size_t)rnd->dsize) { + ERR_raise(ERR_LIB_OSSL_FN, OSSL_FN_R_RESULT_ARG_TOO_SMALL); + return 0; + } + top_limb = limbs_needed - 1; + + /* + * Draw random bytes directly into rnd->d's byte image. A whole number + * of limbs is filled so the result is a random value regardless of the + * machine's byte order; the high bits of the top limb beyond |bits| are + * masked off below. The pool is selected by |flag|. + */ + { + size_t fill_bytes = limbs_needed * OSSL_FN_BYTES; + int b = (flag == NORMAL) + ? RAND_bytes_ex(libctx, (unsigned char *)rnd->d, fill_bytes, + (unsigned int)strength) + : RAND_priv_bytes_ex(libctx, (unsigned char *)rnd->d, fill_bytes, + (unsigned int)strength); + + if (b <= 0) + return 0; + } + + /* + * TODO(FIXNUM): a testing variant that mangles the byte buffer to + * generate patterns more likely to trigger library bugs is not wired up + * yet; if an OSSL_FN_bntest_rand() analogue is added for test coverage, + * this is the spot for the mangle step. + */ + + /* Zero any limbs above those the bytes filled. */ + for (i = limbs_needed; i < (size_t)rnd->dsize; i++) + rnd->d[i] = 0; + + /* Clear the high bits of the top limb at |bits| and above. */ + if (bits % OSSL_FN_BITS != 0) + rnd->d[top_limb] &= (OSSL_FN_ULONG_C(1) << (bits % OSSL_FN_BITS)) - 1; + + /* Set the requested top bit(s); |bits| >= 2 is guaranteed for TOP_TWO. */ + if (top >= 0) { + ossl_fn_set_bit(rnd, bits - 1); + if (top) /* OSSL_FN_RAND_TOP_TWO */ + ossl_fn_set_bit(rnd, bits - 2); + } + + /* Set the bottom bit if requested. */ + if (bottom) /* OSSL_FN_RAND_BOTTOM_ODD */ + rnd->d[0] |= OSSL_FN_ULONG_C(1); + + return 1; + +toosmall: + ERR_raise(ERR_LIB_OSSL_FN, OSSL_FN_R_BITS_TOO_SMALL); + return 0; +} + +/* Draw from the public DRBG pool (NORMAL). */ +int OSSL_FN_rand(OSSL_FN *rnd, size_t bits, int top, int bottom, + size_t strength, OSSL_LIB_CTX *libctx) +{ + return ossl_fn_rand(NORMAL, rnd, bits, top, bottom, strength, libctx); +} + +/* Draw from the private DRBG pool (PRIVATE). */ +int OSSL_FN_priv_rand(OSSL_FN *rnd, size_t bits, int top, int bottom, + size_t strength, OSSL_LIB_CTX *libctx) +{ + return ossl_fn_rand(PRIVATE, rnd, bits, top, bottom, strength, libctx); +} + +/*- + * ossl_fn_rand_range() produces 0 <= r < range by rejection sampling. The + * libctx comes directly as an argument, as in ossl_fn_rand(); sign is never + * considered, since OSSL_FN is unsigned. + * + * The leak profile: control flow branches on |range|'s top bit pattern and on + * |r|'s width (both public), and the loop iteration count leaks the magnitude + * of |range| (via OSSL_FN_num_bits) and the rejection probability. + * + * The destination |r| must be sized to hold at least |num_bits(range)| bits. + * The "range = 100..._2" path draws n + 1 bits and is taken only when |r| + * has room for them; an exactly-sized |r| (room for exactly n bits) uses the + * standard n-bit rejection path instead. + */ +static int ossl_fn_rand_range(enum ossl_fn_rand_flag flag, OSSL_FN *r, + const OSSL_FN *range, size_t strength, + OSSL_LIB_CTX *libctx) +{ + size_t n; + int count = 100; + + if (r == NULL) { + ERR_raise(ERR_LIB_OSSL_FN, ERR_R_PASSED_NULL_PARAMETER); + return 0; + } + + if (OSSL_FN_is_zero(range)) { + ERR_raise(ERR_LIB_OSSL_FN, OSSL_FN_R_INVALID_RANGE); + return 0; + } + + n = OSSL_FN_num_bits(range); /* n > 0 */ + + /* OSSL_FN_is_bit_set(range, n - 1) always holds */ + + if (n == 1) { + return OSSL_FN_zero(r); + } else if (!OSSL_FN_is_bit_set(range, (int)(n - 2)) + && !OSSL_FN_is_bit_set(range, (int)(n - 3)) + && n < (size_t)r->dsize * OSSL_FN_BITS) { + /* + * range = 100..._2, so 3*range (= 11..._2) is exactly one bit longer + * than range. This draws n + 1 bits, so it is taken only when |r| has + * room for them; an exactly-sized |r| (room for exactly n bits) falls + * through to the standard n-bit rejection path below. + */ + do { + if (!ossl_fn_rand(flag, r, n + 1, OSSL_FN_RAND_TOP_ANY, + OSSL_FN_RAND_BOTTOM_ANY, strength, libctx)) + return 0; + + /* + * If r < 3*range, use r := r MOD range (which is either r, r - + * range, or r - 2*range). Otherwise, iterate once more. Since + * 3*range = 11..._2, each iteration succeeds with probability >= + * .75. + */ + if (OSSL_FN_cmp(r, range) >= 0) { + if (!OSSL_FN_sub(r, r, range)) + return 0; + if (OSSL_FN_cmp(r, range) >= 0) + if (!OSSL_FN_sub(r, r, range)) + return 0; + } + + if (!--count) { + ERR_raise(ERR_LIB_OSSL_FN, OSSL_FN_R_TOO_MANY_ITERATIONS); + return 0; + } + + } while (OSSL_FN_cmp(r, range) >= 0); + } else { + do { + /* range = 11..._2 or range = 101..._2 */ + if (!ossl_fn_rand(flag, r, n, OSSL_FN_RAND_TOP_ANY, + OSSL_FN_RAND_BOTTOM_ANY, strength, libctx)) + return 0; + + if (!--count) { + ERR_raise(ERR_LIB_OSSL_FN, OSSL_FN_R_TOO_MANY_ITERATIONS); + return 0; + } + } while (OSSL_FN_cmp(r, range) >= 0); + } + + return 1; +} + +/* Draw from the public DRBG pool (NORMAL). */ +int OSSL_FN_rand_range(OSSL_FN *r, const OSSL_FN *range, size_t strength, + OSSL_LIB_CTX *libctx) +{ + return ossl_fn_rand_range(NORMAL, r, range, strength, libctx); +} + +/* Draw from the private DRBG pool (PRIVATE). */ +int OSSL_FN_priv_rand_range(OSSL_FN *r, const OSSL_FN *range, + size_t strength, OSSL_LIB_CTX *libctx) +{ + return ossl_fn_rand_range(PRIVATE, r, range, strength, libctx); +} diff --git a/include/crypto/fn.h b/include/crypto/fn.h index 15aed809c4..64c36f80d4 100644 --- a/include/crypto/fn.h +++ b/include/crypto/fn.h @@ -428,6 +428,102 @@ int OSSL_FN_is_one(const OSSL_FN *a); */ int OSSL_FN_is_odd(const OSSL_FN *a); +/*- + * Top/bottom selectors for OSSL_FN_rand() / OSSL_FN_priv_rand(). These are + * caller-chosen public parameters (not secrets); OSSL_FN_rand() branches on + * them to shape the top and bottom bits of the result. + */ +#define OSSL_FN_RAND_TOP_ANY (-1) +#define OSSL_FN_RAND_TOP_ONE 0 +#define OSSL_FN_RAND_TOP_TWO 1 +#define OSSL_FN_RAND_BOTTOM_ANY 0 +#define OSSL_FN_RAND_BOTTOM_ODD 1 + +/** + * Fill @p rnd with @p bits random bits. + * + * @param[out] rnd The OSSL_FN for the result + * @param[in] bits The number of random bits to generate + * @param[in] top Top-bit selector (OSSL_FN_RAND_TOP_*) + * @param[in] bottom Bottom-bit selector (OSSL_FN_RAND_BOTTOM_*) + * @param[in] strength The private strength of the generated bytes + * @param[in] libctx The OpenSSL library context (for the DRBG) + * @returns 1 on success, 0 on error + * + * Draws from the public DRBG pool via RAND_bytes_ex(). The library context + * is taken directly as @p libctx. The random bytes are drawn straight into + * rnd->d (no intermediate buffer) and the top/bottom/mask constraints are + * applied as limb value operations; a @p rnd too small for @p bits is + * reported as OSSL_FN_R_RESULT_ARG_TOO_SMALL rather than grown. Leak + * profile as for OSSL_FN_priv_rand(). + */ +int OSSL_FN_rand(OSSL_FN *rnd, size_t bits, int top, int bottom, + size_t strength, OSSL_LIB_CTX *libctx); + +/** + * Fill @p rnd with @p bits random bits from the private DRBG pool. + * + * @param[out] rnd The OSSL_FN for the result + * @param[in] bits The number of random bits to generate + * @param[in] top Top-bit selector (OSSL_FN_RAND_TOP_*) + * @param[in] bottom Bottom-bit selector (OSSL_FN_RAND_BOTTOM_*) + * @param[in] strength The private strength of the generated bytes + * @param[in] libctx The OpenSSL library context (for the DRBG) + * @returns 1 on success, 0 on error + * + * Draws from the private (non-forward-linkable) DRBG pool via + * RAND_priv_bytes_ex(). This is the private counterpart of OSSL_FN_rand(); + * the public/private pool selection is exposed as separate functions rather + * than a flag argument. Control flow branches only on @p bits, @p top, + * @p bottom (all caller-chosen, public) and on the byte-draw return value, + * never on the random bytes themselves; the returned value is the random + * number the caller asked for. + * + * @note See ossl_fn_rand() in crypto/fn/fn_rand.c for the byte-to-limb + * shaping mechanics. + */ +int OSSL_FN_priv_rand(OSSL_FN *rnd, size_t bits, int top, int bottom, + size_t strength, OSSL_LIB_CTX *libctx); + +/** + * Generate 0 <= r < range. + * + * @param[out] r The OSSL_FN for the result + * @param[in] range The exclusive upper bound (must be non-zero) + * @param[in] strength The private strength of the generated bytes + * @param[in] libctx The OpenSSL library context (for the DRBG) + * @returns 1 on success, 0 on error + * + * Draws from the public DRBG pool. OSSL_FN is unsigned, so no sign + * rejection is performed. The loop iteration count leaks the magnitude of + * @p range via OSSL_FN_num_bits() and the rejection probability. + * + * The destination @p r must be sized to hold at least + * OSSL_FN_num_bits(@p range) bits. Sizing @p r to hold one extra bit + * (OSSL_FN_num_bits(@p range) + 1) additionally enables the optimized + * "range = 100..._2" path, which draws n + 1 bits; an exactly-sized @p r + * (room for exactly OSSL_FN_num_bits(@p range) bits) uses standard n-bit + * rejection sampling instead. An @p r too small for + * OSSL_FN_num_bits(@p range) bits fails with OSSL_FN_R_RESULT_ARG_TOO_SMALL. + */ +int OSSL_FN_rand_range(OSSL_FN *r, const OSSL_FN *range, size_t strength, + OSSL_LIB_CTX *libctx); + +/** + * Generate 0 <= r < range from the private DRBG pool. + * + * @param[out] r The OSSL_FN for the result + * @param[in] range The exclusive upper bound (must be non-zero) + * @param[in] strength The private strength of the generated bytes + * @param[in] libctx The OpenSSL library context (for the DRBG) + * @returns 1 on success, 0 on error + * + * Draws from the private DRBG pool. Leak profile and destination sizing + * as for OSSL_FN_rand_range(). + */ +int OSSL_FN_priv_rand_range(OSSL_FN *r, const OSSL_FN *range, + size_t strength, OSSL_LIB_CTX *libctx); + /** * Shift an OSSL_FN number left by n bits. Truncates the result to fit in r. * diff --git a/include/crypto/fnerr.h b/include/crypto/fnerr.h index e8a3b178e3..f192256e68 100644 --- a/include/crypto/fnerr.h +++ b/include/crypto/fnerr.h @@ -25,8 +25,11 @@ int ossl_err_load_OSSL_FN_strings(void); * OSSL_FN reason codes. */ #define OSSL_FN_R_DIV_BY_ZERO 101 +#define OSSL_FN_R_BITS_TOO_SMALL 105 +#define OSSL_FN_R_INVALID_RANGE 106 #define OSSL_FN_R_INVALID_SHIFT 102 #define OSSL_FN_R_RESULT_ARG_TOO_SMALL 100 +#define OSSL_FN_R_TOO_MANY_ITERATIONS 107 #ifdef __cplusplus } diff --git a/test/fn_api_test.c b/test/fn_api_test.c index 0fea379a56..5bec9eed2c 100644 --- a/test/fn_api_test.c +++ b/test/fn_api_test.c @@ -108,6 +108,7 @@ static const OSSL_FN_ULONG num8[] = { * All sizes are in number of limbs, the LIMBSOF() macro is there to help */ #define LIMBSOF(num) ((sizeof(num) + OSSL_FN_BYTES - 1) / OSSL_FN_BYTES) +#define OSSL_FN_BITS (OSSL_FN_BYTES * 8) struct test_case_st { /* Two operands and expected full result (possibly two numbers) */ const OSSL_FN_ULONG *op1; @@ -2465,6 +2466,274 @@ static int test_div_quotient_only_truncated(int i) return test_div_quotient_only_common(test_div_truncate_cases[i]); } +/*- + * Focused tests for OSSL_FN_rand() / OSSL_FN_priv_rand() and the range + * variants. Random values cannot be compared against a fixed oracle, so + * these tests verify the mathematical contract the functions guarantee: + * the result fits in |bits|, the |top| and |bottom| bit constraints hold, + * the destination's high limbs are zeroed, and range results satisfy + * 0 <= r < range. The byte-to-limb shaping is exercised through + * non-limb-multiple bit counts and wider-than-needed destinations. + */ +struct rand_bits_case_st { + int bits; + int top; + int bottom; +}; + +static const struct rand_bits_case_st rand_bits_cases[] = { + /* bit counts that are not limb multiples, to stress the top-byte mask */ + { 1, OSSL_FN_RAND_TOP_ANY, OSSL_FN_RAND_BOTTOM_ANY }, + { 1, OSSL_FN_RAND_TOP_ONE, OSSL_FN_RAND_BOTTOM_ANY }, + { 7, OSSL_FN_RAND_TOP_ANY, OSSL_FN_RAND_BOTTOM_ANY }, + { 7, OSSL_FN_RAND_TOP_ONE, OSSL_FN_RAND_BOTTOM_ODD }, + { 7, OSSL_FN_RAND_TOP_TWO, OSSL_FN_RAND_BOTTOM_ODD }, + { OSSL_FN_BITS - 1, OSSL_FN_RAND_TOP_ANY, OSSL_FN_RAND_BOTTOM_ANY }, + { OSSL_FN_BITS - 1, OSSL_FN_RAND_TOP_ONE, OSSL_FN_RAND_BOTTOM_ODD }, + { OSSL_FN_BITS, OSSL_FN_RAND_TOP_ANY, OSSL_FN_RAND_BOTTOM_ANY }, + { OSSL_FN_BITS, OSSL_FN_RAND_TOP_TWO, OSSL_FN_RAND_BOTTOM_ODD }, + { OSSL_FN_BITS + 1, OSSL_FN_RAND_TOP_ANY, OSSL_FN_RAND_BOTTOM_ANY }, + { OSSL_FN_BITS + 1, OSSL_FN_RAND_TOP_ONE, OSSL_FN_RAND_BOTTOM_ANY }, + { 3 * OSSL_FN_BITS, OSSL_FN_RAND_TOP_TWO, OSSL_FN_RAND_BOTTOM_ODD }, +}; + +static int test_rand_bits(int i) +{ + int ret = 0, bits = rand_bits_cases[i].bits; + int top = rand_bits_cases[i].top; + int bottom = rand_bits_cases[i].bottom; + /* Destination sized with one extra limb to check zero-padding above bits. */ + size_t limbs_needed = (bits + OSSL_FN_BITS - 1) / OSSL_FN_BITS; + size_t dst_limbs = limbs_needed + 1; + OSSL_FN *r = NULL; + const OSSL_FN_ULONG *words = NULL; + size_t dsize, j; + + if (!TEST_ptr(r = OSSL_FN_new_limbs(dst_limbs)) + || !TEST_true(pollute(r, 0, dst_limbs)) + /* Use the private pool; the public one is exercised by test_rand below. */ + || !TEST_true(OSSL_FN_priv_rand(r, bits, top, bottom, 0, NULL))) + goto err; + + /* The result must fit in |bits| bits. */ + if (!TEST_size_t_le(OSSL_FN_num_bits(r), (size_t)bits)) + goto err; + + /* top constraint: the requested high bit(s) must be set. */ + if (top == OSSL_FN_RAND_TOP_ONE + && !TEST_int_eq(OSSL_FN_is_bit_set(r, bits - 1), 1)) + goto err; + if (top == OSSL_FN_RAND_TOP_TWO) { + if (!TEST_int_eq(OSSL_FN_is_bit_set(r, bits - 1), 1) + || !TEST_int_eq(OSSL_FN_is_bit_set(r, bits - 2), 1)) + goto err; + } + + /* bottom constraint: the low bit must be set when ODD is requested. */ + if (bottom == OSSL_FN_RAND_BOTTOM_ODD + && !TEST_int_eq(OSSL_FN_is_bit_set(r, 0), 1)) + goto err; + + /* + * Limbs above those needed for |bits| must be zeroed. bytes = + * (bits+7)/8, so limbs covering the bytes are (bytes + BYTES - 1) / BYTES; + * anything above that is padding. + */ + words = ossl_fn_get_words(r); + dsize = ossl_fn_get_dsize(r); + for (j = limbs_needed; j < dsize; j++) + if (!TEST_size_t_eq(words[j], 0)) + goto err; + + ret = 1; +err: + OSSL_FN_free(r); + return ret; +} + +/* The public-pool variant (OSSL_FN_rand) must satisfy the same contract. */ +static int test_rand(int i) +{ + int ret = 0, bits = rand_bits_cases[i].bits; + int top = rand_bits_cases[i].top; + int bottom = rand_bits_cases[i].bottom; + size_t limbs_needed = (bits + OSSL_FN_BITS - 1) / OSSL_FN_BITS; + OSSL_FN *r = NULL; + + if (!TEST_ptr(r = OSSL_FN_new_limbs(limbs_needed)) + || !TEST_true(pollute(r, 0, limbs_needed)) + || !TEST_true(OSSL_FN_rand(r, bits, top, bottom, 0, NULL))) + goto err; + if (!TEST_size_t_le(OSSL_FN_num_bits(r), (size_t)bits)) + goto err; + if (top == OSSL_FN_RAND_TOP_ONE + && !TEST_int_eq(OSSL_FN_is_bit_set(r, bits - 1), 1)) + goto err; + if (top == OSSL_FN_RAND_TOP_TWO + && (!TEST_int_eq(OSSL_FN_is_bit_set(r, bits - 1), 1) + || !TEST_int_eq(OSSL_FN_is_bit_set(r, bits - 2), 1))) + goto err; + if (bottom == OSSL_FN_RAND_BOTTOM_ODD + && !TEST_int_eq(OSSL_FN_is_bit_set(r, 0), 1)) + goto err; + ret = 1; +err: + OSSL_FN_free(r); + return ret; +} + +/* A destination too small for |bits| is an error, not an expansion. */ +static int test_rand_result_too_small(void) +{ + int ret = 0; + OSSL_FN *r = NULL; + + /* bits needs 2 limbs on every platform; one-limb destination is too small. */ + if (!TEST_ptr(r = OSSL_FN_new_limbs(1)) + || !TEST_true(pollute(r, 0, 1)) + || !TEST_false(OSSL_FN_priv_rand(r, 2 * OSSL_FN_BITS, + OSSL_FN_RAND_TOP_ANY, + OSSL_FN_RAND_BOTTOM_ANY, 0, NULL)) + || !TEST_int_eq(ERR_GET_REASON(ERR_get_error()), + OSSL_FN_R_RESULT_ARG_TOO_SMALL)) + goto err; + ret = 1; +err: + OSSL_FN_free(r); + return ret; +} + +/* bits == 0 with top/bottom set, or bits == 1 with top > 0, are BITS_TOO_SMALL errors. */ +static int test_rand_bits_too_small(void) +{ + int ret = 0; + OSSL_FN *r = NULL; + + if (!TEST_ptr(r = OSSL_FN_new_limbs(2))) + goto err; + + ERR_clear_error(); + if (!TEST_false(OSSL_FN_priv_rand(r, 0, OSSL_FN_RAND_TOP_ONE, + OSSL_FN_RAND_BOTTOM_ANY, 0, NULL)) + || !TEST_int_eq(ERR_GET_REASON(ERR_get_error()), + OSSL_FN_R_BITS_TOO_SMALL)) + goto err; + + ERR_clear_error(); + if (!TEST_false(OSSL_FN_priv_rand(r, 1, OSSL_FN_RAND_TOP_TWO, + OSSL_FN_RAND_BOTTOM_ANY, 0, NULL)) + || !TEST_int_eq(ERR_GET_REASON(ERR_get_error()), + OSSL_FN_R_BITS_TOO_SMALL)) + goto err; + + /* bits == 0 with ANY/ANY is the one legal zero-bit case: result is zero. */ + if (!TEST_true(OSSL_FN_priv_rand(r, 0, OSSL_FN_RAND_TOP_ANY, + OSSL_FN_RAND_BOTTOM_ANY, 0, NULL)) + || !TEST_true(OSSL_FN_is_zero(r))) + goto err; + + ret = 1; +err: + OSSL_FN_free(r); + return ret; +} + +/* + * Range variants: 0 <= r < range must hold. Covers both range shapes + * (range = 100..._2 and range = 11..._2 / 101..._2) and the n == 1 case. + */ +static const OSSL_FN_ULONG range_words[][4] = { + { OSSL_FN_ULONG_C(1) }, /* range == 1 */ + { OSSL_FN_ULONG_C(0), OSSL_FN_ULONG_C(1) }, /* 2^BITS: 100..._2 */ + { OSSL_FN_ULONG_C(3) }, /* 11_2 */ + { OSSL_FN_ULONG_C(5) }, /* 101_2 */ + { OSSL_FN_ULONG_C(0), OSSL_FN_ULONG_C(3) }, /* 3 * 2^BITS: 11..._2 */ + { OSSL_FN_ULONG_C(2), OSSL_FN_ULONG_C(1) }, /* 2^BITS + 2: 101..._2 */ +}; + +static int test_rand_range(int i) +{ + int ret = 0; + const OSSL_FN_ULONG *rw = range_words[i]; + size_t range_limbs = OSSL_NELEM(range_words[i]); + OSSL_FN *range = NULL, *r = NULL; + + if (!TEST_ptr(range = OSSL_FN_new_limbs(range_limbs)) + || !TEST_true(ossl_fn_set_words(range, rw, range_limbs)) + || !TEST_ptr(r = OSSL_FN_new_limbs(range_limbs + 1)) + || !TEST_true(pollute(r, 0, range_limbs + 1))) + goto err; + + if (!TEST_true(OSSL_FN_priv_rand_range(r, range, 0, NULL))) + goto err; + + /* 0 <= r < range (OSSL_FN is unsigned, so the lower bound is implicit). */ + if (!TEST_int_lt(OSSL_FN_cmp(r, range), 0)) + goto err; + + ret = 1; +err: + OSSL_FN_free(range); + OSSL_FN_free(r); + return ret; +} + +/* A zero range is rejected as INVALID_RANGE. */ +static int test_rand_range_zero(void) +{ + int ret = 0; + OSSL_FN *range = NULL, *r = NULL; + + if (!TEST_ptr(range = OSSL_FN_new_limbs(2)) + || !TEST_true(OSSL_FN_zero(range)) + || !TEST_ptr(r = OSSL_FN_new_limbs(2)) + || !TEST_true(pollute(r, 0, 2)) + || !TEST_false(OSSL_FN_rand_range(r, range, 0, NULL)) + || !TEST_int_eq(ERR_GET_REASON(ERR_get_error()), + OSSL_FN_R_INVALID_RANGE)) + goto err; + ret = 1; +err: + OSSL_FN_free(range); + OSSL_FN_free(r); + return ret; +} + +/* + * Regression test for an exactly-sized destination with a sparse range + * (range = 100..._2): the optimized path draws n + 1 bits and needs room for + * them, so an |r| sized to hold exactly num_bits(range) bits must fall back to + * standard n-bit rejection sampling rather than fail with + * OSSL_FN_R_RESULT_ARG_TOO_SMALL. + */ +static int test_rand_range_exactly_sized(void) +{ + int ret = 0; + OSSL_FN_ULONG rw[1] = { OSSL_FN_ULONG_C(1) << (OSSL_FN_BITS - 1) }; + OSSL_FN *range = NULL, *r = NULL; + + /* range = 2^(BITS-1) = 100..._2, so num_bits(range) == BITS (1 limb). */ + if (!TEST_ptr(range = OSSL_FN_new_limbs(1)) + || !TEST_true(ossl_fn_set_words(range, rw, 1)) + /* r sized to hold exactly BITS bits: one limb, no slack for n + 1. */ + || !TEST_ptr(r = OSSL_FN_new_limbs(1)) + || !TEST_true(pollute(r, 0, 1))) + goto err; + + if (!TEST_true(OSSL_FN_priv_rand_range(r, range, 0, NULL))) + goto err; + + /* 0 <= r < range. */ + if (!TEST_int_lt(OSSL_FN_cmp(r, range), 0)) + goto err; + + ret = 1; +err: + OSSL_FN_free(range); + OSSL_FN_free(r); + return ret; +} + int setup_tests(void) { ADD_ALL_TESTS(test_add, 17); @@ -2501,6 +2770,13 @@ int setup_tests(void) OSSL_NELEM(test_div_cases)); ADD_ALL_TESTS(test_div_quotient_only_truncated, OSSL_NELEM(test_div_truncate_cases)); + ADD_ALL_TESTS(test_rand_bits, OSSL_NELEM(rand_bits_cases)); + ADD_ALL_TESTS(test_rand, OSSL_NELEM(rand_bits_cases)); + ADD_TEST(test_rand_result_too_small); + ADD_TEST(test_rand_bits_too_small); + ADD_ALL_TESTS(test_rand_range, OSSL_NELEM(range_words)); + ADD_TEST(test_rand_range_zero); + ADD_TEST(test_rand_range_exactly_sized); return 1; } From 82b214d9bc273d75efaffade17472ffab2520f35 Mon Sep 17 00:00:00 2001 From: Richard Levitte Date: Fri, 17 Jul 2026 16:30:40 +0200 Subject: [PATCH 63/69] OSSL_FN: Make RAND top selector count-based Renumber OSSL_FN_RAND_TOP_ANY / _ONE / _TWO from -1 / 0 / 1 to 0 / 1 / 2, so each value is the number of high bits the result is forced to set. This matches the already-count-based OSSL_FN_RAND_BOTTOM_* (0 = unconstrained, 1 = force the low bit), making the whole selector family read the same way. This is a deliberate departure from the BN counterpart: BN_RAND_TOP_* stays -1 / 0 / 1, but OSSL_FN_RAND_TOP_* has no legacy tier and no need for a sentinel, so the values are the counts themselves. Callers that use the symbolic macros are unaffected; only raw-literal callers would notice, and there are none in tree. Assisted-by: Pi:z-ai/glm-5.2 Signed-off-by: Richard Levitte Reviewed-by: Igor Ustinov Reviewed-by: Tomas Mraz MergeDate: Thu Jul 23 14:17:18 2026 (Merged from https://github.com/openssl/openssl/pull/31959) --- crypto/fn/fn_rand.c | 9 +++++---- include/crypto/fn.h | 10 ++++++---- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/crypto/fn/fn_rand.c b/crypto/fn/fn_rand.c index 4710357c9f..369b57d9b0 100644 --- a/crypto/fn/fn_rand.c +++ b/crypto/fn/fn_rand.c @@ -66,7 +66,8 @@ static int ossl_fn_rand(enum ossl_fn_rand_flag flag, OSSL_FN *rnd, size_t bits, goto toosmall; return OSSL_FN_zero(rnd); } - if (bits == 1 && top > 0) + /* TOP_TWO forces two high bits, so it needs at least two bits. */ + if (top == OSSL_FN_RAND_TOP_TWO && bits < 2) goto toosmall; limbs_needed = bits / OSSL_FN_BITS; @@ -111,14 +112,14 @@ static int ossl_fn_rand(enum ossl_fn_rand_flag flag, OSSL_FN *rnd, size_t bits, rnd->d[top_limb] &= (OSSL_FN_ULONG_C(1) << (bits % OSSL_FN_BITS)) - 1; /* Set the requested top bit(s); |bits| >= 2 is guaranteed for TOP_TWO. */ - if (top >= 0) { + if (top != OSSL_FN_RAND_TOP_ANY) { ossl_fn_set_bit(rnd, bits - 1); - if (top) /* OSSL_FN_RAND_TOP_TWO */ + if (top == OSSL_FN_RAND_TOP_TWO) ossl_fn_set_bit(rnd, bits - 2); } /* Set the bottom bit if requested. */ - if (bottom) /* OSSL_FN_RAND_BOTTOM_ODD */ + if (bottom == OSSL_FN_RAND_BOTTOM_ODD) rnd->d[0] |= OSSL_FN_ULONG_C(1); return 1; diff --git a/include/crypto/fn.h b/include/crypto/fn.h index 64c36f80d4..8284b7135b 100644 --- a/include/crypto/fn.h +++ b/include/crypto/fn.h @@ -431,11 +431,13 @@ int OSSL_FN_is_odd(const OSSL_FN *a); /*- * Top/bottom selectors for OSSL_FN_rand() / OSSL_FN_priv_rand(). These are * caller-chosen public parameters (not secrets); OSSL_FN_rand() branches on - * them to shape the top and bottom bits of the result. + * them to shape the top and bottom bits of the result. Each TOP_* value is + * the number of high bits to force to 1 (0 = unconstrained, 1, 2), matching + * the BOTTOM_* numbering (0 = unconstrained, 1 = force the low bit). */ -#define OSSL_FN_RAND_TOP_ANY (-1) -#define OSSL_FN_RAND_TOP_ONE 0 -#define OSSL_FN_RAND_TOP_TWO 1 +#define OSSL_FN_RAND_TOP_ANY 0 +#define OSSL_FN_RAND_TOP_ONE 1 +#define OSSL_FN_RAND_TOP_TWO 2 #define OSSL_FN_RAND_BOTTOM_ANY 0 #define OSSL_FN_RAND_BOTTOM_ODD 1 From ab42643c66dc64933bd93c12506a69e10f8b850f Mon Sep 17 00:00:00 2001 From: Billy Brumley Date: Fri, 17 Jul 2026 02:37:59 -0400 Subject: [PATCH 64/69] [test] bntest: add ModInv file tests Add file_modinv() to bntest.c, driven by a new bnmodinv.txt corpus and wired into 10-test_bn.t. - Positive tests assert equalBN and a mult sanity check - Negative tests assert NULL return plus the BN_R_NO_INVERSE error Corpus covers: - in-range A - out-of-range A - positive and negative A for both of the above - degenerate moduli M = 0 and M = 1 - RFC 4754 sourced KATs - RFC 7091 sourced KATs Assisted-by: Claude:claude-opus-4-8 Reviewed-by: Dmitry Belyavskiy Reviewed-by: Tim Hudson Reviewed-by: Richard Levitte MergeDate: Thu Jul 23 14:20:08 2026 (Merged from https://github.com/openssl/openssl/pull/31985) --- test/bntest.c | 44 + test/recipes/10-test_bn.t | 2 +- test/recipes/10-test_bn_data/bnmodinv.txt | 69180 ++++++++++++++++++++ 3 files changed, 69225 insertions(+), 1 deletion(-) create mode 100644 test/recipes/10-test_bn_data/bnmodinv.txt diff --git a/test/bntest.c b/test/bntest.c index cb5b9278af..bd2727b8aa 100644 --- a/test/bntest.c +++ b/test/bntest.c @@ -1830,6 +1830,49 @@ err: return st; } +static int file_modinv(STANZA *s) +{ + BIGNUM *a = NULL, *m = NULL, *ainv_check = NULL, *ainv = NULL; + int st = 0; + + if (!TEST_ptr(a = getBN(s, "A")) + || !TEST_ptr(m = getBN(s, "M")) + || !TEST_ptr(ainv_check = getBN(s, "ModInv"))) + goto err; + + if (BN_is_negative(ainv_check)) { + /* a negative testcase */ + ERR_set_mark(); + if (!TEST_ptr_null(BN_mod_inverse(NULL, a, m, ctx)) + || !TEST_int_eq(ERR_GET_LIB(ERR_peek_last_error()), ERR_LIB_BN) + || !TEST_int_eq(ERR_GET_REASON(ERR_peek_last_error()), + BN_R_NO_INVERSE)) + goto err; + ERR_pop_to_mark(); + + st = 1; + goto err; + } + + /* the inverse is unique in [1,M) */ + if (!TEST_ptr(ainv = BN_mod_inverse(NULL, a, m, ctx)) + || !equalBN("inv(A) (mod M)", ainv_check, ainv)) + goto err; + + /* verify A * ainv == 1 (mod M) */ + if (!TEST_true(BN_mod_mul(ainv, a, ainv, m, ctx)) + || !TEST_true(BN_is_one(ainv))) + goto err; + + st = 1; +err: + BN_free(a); + BN_free(m); + BN_free(ainv_check); + BN_free(ainv); + return st; +} + static int file_gcd(STANZA *s) { BIGNUM *a = NULL, *b = NULL, *gcd = NULL, *ret = NULL; @@ -3324,6 +3367,7 @@ static int file_test_run(STANZA *s) { "ModExp", file_modexp }, { "Exp", file_exp }, { "ModSqrt", file_modsqrt }, + { "ModInv", file_modinv }, { "GCD", file_gcd }, }; int numtests = OSSL_NELEM(filetests); diff --git a/test/recipes/10-test_bn.t b/test/recipes/10-test_bn.t index bdccce14d3..4a76930f2a 100644 --- a/test/recipes/10-test_bn.t +++ b/test/recipes/10-test_bn.t @@ -16,7 +16,7 @@ use OpenSSL::Test qw/:DEFAULT data_file/; setup("test_bn"); -my @files = qw( bnexp.txt bnmod.txt bnmul.txt bnshift.txt bnsum.txt bngcd.txt ); +my @files = qw( bnexp.txt bnmod.txt bnmodinv.txt bnmul.txt bnshift.txt bnsum.txt bngcd.txt ); plan tests => 1 + scalar(@files); diff --git a/test/recipes/10-test_bn_data/bnmodinv.txt b/test/recipes/10-test_bn_data/bnmodinv.txt new file mode 100644 index 0000000000..6ab0f66d76 --- /dev/null +++ b/test/recipes/10-test_bn_data/bnmodinv.txt @@ -0,0 +1,69180 @@ +# Copyright 2026 The OpenSSL Project Authors. All Rights Reserved. +# +# Licensed under the Apache License 2.0 (the "License"). You may not use +# this file except in compliance with the License. You can obtain a copy +# in the file LICENSE in the source distribution or at +# https://www.openssl.org/source/license.html + +# These test vectors satisfy A * ModInv = 1 (mod M) and 1 <= ModInv < M. +# ModInv = -1 denotes a negative test where A has no inverse mod M. +# This includes the degenerate moduli M = 0 and M = 1. + +Title = ModInv positive tests (manual) + +# I assure you, this is hex +ModInv = 10668 +A = 3 +M = 31337 + +ModInv = ba9b69 +A = -beef +M = c0ffee + +ModInv = d1e25270e36d6cd4f2cc145e216cbd50d8127bc013df4c4a8803cf48d59c2af6 +A = 72ea74f57cde544391e2a4f9e9eef63c9876b67650b6fa310b40a0b7eb47a41e1046a5fc40d212df3c0a724c17d540e5212c6652a920604719bed8c79b568aeb +M = dc315fd52684fba79e577a204de9053b11a5d7a414263fec9eff6ff62188829d + +ModInv = fade56a040340d441acd6f2a3ef1bd0d4290e9dbdee3328c82b41b90fa86ddf8 +A = c5098aead5db1636886be39c8db47c82908a256c632dd41973a1129749e201bf +M = fdcb43c7eb582feebf97ecc44b52cd98fbd5cb03f9e276cba91007cd6a9b070f + +ModInv = 56266432e45a996b832f5cfdb8ff9e55b2d89f028dcff9f5e01431e83a5b1ee7e3024c9cb59 +A = c61e8b534be55c9d300c8de4b559f280cb3e080c647ca41ab4a050aad80d815179c983562eb +M = 7f586b20e780700c327cb4b9125c8653a3930dd74118b6cfc8785561a0ed550161c7bca9c5a + +ModInv = 2d06f3c1b2d5c458d6543e07360ad49f219794289144e5effbb95b2b452dfd075126a697e638e1fda3c13e82176256d6 +A = -bfc018675ff4398180f5a6d286a3afb128f47b3b5333f6ede83b1bd67ee642923634ffe0354678219e68d527c0bb661 +M = cb75ab61fc05aa3f5d842cb32a86f529376d1523a9b888978e35614b51755a419ee04c55396abb1941f271eee30fab47 + +# RFC 4754 8.1 ECDSA-256: kinv = k^-1 mod q +ModInv = afa278945af74b1e295008e03a8984e2e1c69d9bbbc74af14e3ac4e421abfa61 +A = 9e56f509196784d963d1c0a401510ee7ada3dcc5dee04b154bf61af1d5a6dece +M = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551 + +# RFC 4754 8.1 ECDSA-256: sinv = s^-1 mod q +ModInv = 33bdc294e90cfad62a9f2fd1f8741da77c02a573e1b53ba17a60ba904f491952 +A = 86fa3bb4e26cad5bf90b7f81899256ce7594bb1ea0c89212748bff3b3d5b0315 +M = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551 + +# RFC 4754 8.2 ECDSA-384: kinv = k^-1 mod q +ModInv = eb12876bf6191a291aa5780a3887c3bfe7a5c7e321cca674886b1228d9bb3d52918ef19fe5ce67e980bedc1e613d39c0 +A = b4b74e44d71a13d568003d7489908d564c7761e229c58cbfa18950096eb7463b854d7fa992f934d927376285e63414fa +M = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973 + +# RFC 4754 8.2 ECDSA-384: sinv = s^-1 mod q +ModInv = 6efacee8a657f77584c5a039f7e2720d61df84c8fac6fa49a06f6c46e8cda286add7d3b90e1cda479bd899bee14b99d +A = b263a1305e057f984d38726a1b46874109f417bca112674c528262a40a629af1cbb9f516ce0fa7d2ff630863a00e8b9f +M = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973 + +# RFC 4754 8.3 ECDSA-521: kinv = k^-1 mod q +ModInv = e90ef3ce52f8d1e5a4eebd0905f4252400b0ae73b49e3323bce258a55f507d7c45f3a2de3a3ea2e51d934346d71593a80c8c62fe229ddf5d2b64b7af4a08370d32 +A = c1c2b305419f5a41344d7e4359933d734096f556197a9b244342b8b62f46f9373778f9de6b6497b1ef825ff24f42f9b4a4bd7382cfc3378a540b1b7f0c1b956c2f +M = 1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386409 + +# RFC 4754 8.3 ECDSA-521: sinv = s^-1 mod q +ModInv = dda6b883cb36bfcb21d5b0b7d1f4439d3c7797b23a8d7358032d5cc917142e3f6778bd977d8460867853ae9c74ef5e417cfa96f7c937c1418d9343738a1ba878e0 +A = 17705a7030290d1ceb605a9a1bb03ff9cdd521e87a696ec926c8c10c8362df4975367101f67d1cf9bccbf2f3d239534fa509e70aac851ae01aac68d62f866472660 +M = 1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386409 + +# GOST R 34.10 verification step v = e^-1 mod q +# Identical KAT in RFC 7091 S7.3 and RFC 5832 S7.3 +ModInv = 271a4ee429f84ebc423e388964555bb29d3ba53c7bf945e5fac8f381706354c2 +A = 2dfbc1b372d89a1188c09c52e0eec61fce52032ab1022e8e67ece6672b043ee5 +M = 8000000000000000000000000000000150fe8a1892976154c59cfc193accf5b3 + +Title = ModInv negative tests (manual) + +ModInv = -1 +A = 0 +M = 31337 + +ModInv = -1 +A = 31337 +M = 31337 + +ModInv = -1 +A = a +M = c0ffee + +ModInv = -1 +A = 4 +M = 8 + +ModInv = -1 +A = C +M = 8 + +ModInv = -1 +A = 14 +M = 8 + +ModInv = -1 +A = 12a24ee7bdafe19a20fd2f7d27a076b38b132e2f57aa3c724737e398a44f97776 +M = 2df40a1d3a5bebe10a4a29d6e58fb17a2b77ddd8aa8b20f78f08b79956e4b4e6 + +ModInv = -1 +A = 2fee14d4f0c663afa6b45741c0732e6b2b10a4538a1e55dff37 +M = 26e0818494fd1cfe5304d5d017791a634416b43f5e24f62e019 + +ModInv = -1 +A = 31337 +M = 1 + +ModInv = -1 +A = 5 +M = 0 + +Title = ModInv positive tests (auto) + +ModInv = 1 +A = -63 +M = 2 + +ModInv = 1 +A = -61 +M = 2 + +ModInv = 1 +A = -5f +M = 2 + +ModInv = 1 +A = -5d +M = 2 + +ModInv = 1 +A = -5b +M = 2 + +ModInv = 1 +A = -59 +M = 2 + +ModInv = 1 +A = -57 +M = 2 + +ModInv = 1 +A = -55 +M = 2 + +ModInv = 1 +A = -53 +M = 2 + +ModInv = 1 +A = -51 +M = 2 + +ModInv = 1 +A = -4f +M = 2 + +ModInv = 1 +A = -4d +M = 2 + +ModInv = 1 +A = -4b +M = 2 + +ModInv = 1 +A = -49 +M = 2 + +ModInv = 1 +A = -47 +M = 2 + +ModInv = 1 +A = -45 +M = 2 + +ModInv = 1 +A = -43 +M = 2 + +ModInv = 1 +A = -41 +M = 2 + +ModInv = 1 +A = -3f +M = 2 + +ModInv = 1 +A = -3d +M = 2 + +ModInv = 1 +A = -3b +M = 2 + +ModInv = 1 +A = -39 +M = 2 + +ModInv = 1 +A = -37 +M = 2 + +ModInv = 1 +A = -35 +M = 2 + +ModInv = 1 +A = -33 +M = 2 + +ModInv = 1 +A = -31 +M = 2 + +ModInv = 1 +A = -2f +M = 2 + +ModInv = 1 +A = -2d +M = 2 + +ModInv = 1 +A = -2b +M = 2 + +ModInv = 1 +A = -29 +M = 2 + +ModInv = 1 +A = -27 +M = 2 + +ModInv = 1 +A = -25 +M = 2 + +ModInv = 1 +A = -23 +M = 2 + +ModInv = 1 +A = -21 +M = 2 + +ModInv = 1 +A = -1f +M = 2 + +ModInv = 1 +A = -1d +M = 2 + +ModInv = 1 +A = -1b +M = 2 + +ModInv = 1 +A = -19 +M = 2 + +ModInv = 1 +A = -17 +M = 2 + +ModInv = 1 +A = -15 +M = 2 + +ModInv = 1 +A = -13 +M = 2 + +ModInv = 1 +A = -11 +M = 2 + +ModInv = 1 +A = -f +M = 2 + +ModInv = 1 +A = -d +M = 2 + +ModInv = 1 +A = -b +M = 2 + +ModInv = 1 +A = -9 +M = 2 + +ModInv = 1 +A = -7 +M = 2 + +ModInv = 1 +A = -5 +M = 2 + +ModInv = 1 +A = -3 +M = 2 + +ModInv = 1 +A = -1 +M = 2 + +ModInv = 1 +A = 1 +M = 2 + +ModInv = 1 +A = 3 +M = 2 + +ModInv = 1 +A = 5 +M = 2 + +ModInv = 1 +A = 7 +M = 2 + +ModInv = 1 +A = 9 +M = 2 + +ModInv = 1 +A = b +M = 2 + +ModInv = 1 +A = d +M = 2 + +ModInv = 1 +A = f +M = 2 + +ModInv = 1 +A = 11 +M = 2 + +ModInv = 1 +A = 13 +M = 2 + +ModInv = 1 +A = 15 +M = 2 + +ModInv = 1 +A = 17 +M = 2 + +ModInv = 1 +A = 19 +M = 2 + +ModInv = 1 +A = 1b +M = 2 + +ModInv = 1 +A = 1d +M = 2 + +ModInv = 1 +A = 1f +M = 2 + +ModInv = 1 +A = 21 +M = 2 + +ModInv = 1 +A = 23 +M = 2 + +ModInv = 1 +A = 25 +M = 2 + +ModInv = 1 +A = 27 +M = 2 + +ModInv = 1 +A = 29 +M = 2 + +ModInv = 1 +A = 2b +M = 2 + +ModInv = 1 +A = 2d +M = 2 + +ModInv = 1 +A = 2f +M = 2 + +ModInv = 1 +A = 31 +M = 2 + +ModInv = 1 +A = 33 +M = 2 + +ModInv = 1 +A = 35 +M = 2 + +ModInv = 1 +A = 37 +M = 2 + +ModInv = 1 +A = 39 +M = 2 + +ModInv = 1 +A = 3b +M = 2 + +ModInv = 1 +A = 3d +M = 2 + +ModInv = 1 +A = 3f +M = 2 + +ModInv = 1 +A = 41 +M = 2 + +ModInv = 1 +A = 43 +M = 2 + +ModInv = 1 +A = 45 +M = 2 + +ModInv = 1 +A = 47 +M = 2 + +ModInv = 1 +A = 49 +M = 2 + +ModInv = 1 +A = 4b +M = 2 + +ModInv = 1 +A = 4d +M = 2 + +ModInv = 1 +A = 4f +M = 2 + +ModInv = 1 +A = 51 +M = 2 + +ModInv = 1 +A = 53 +M = 2 + +ModInv = 1 +A = 55 +M = 2 + +ModInv = 1 +A = 57 +M = 2 + +ModInv = 1 +A = 59 +M = 2 + +ModInv = 1 +A = 5b +M = 2 + +ModInv = 1 +A = 5d +M = 2 + +ModInv = 1 +A = 5f +M = 2 + +ModInv = 1 +A = 61 +M = 2 + +ModInv = 1 +A = 63 +M = 2 + +ModInv = 2 +A = -64 +M = 3 + +ModInv = 1 +A = -62 +M = 3 + +ModInv = 2 +A = -61 +M = 3 + +ModInv = 1 +A = -5f +M = 3 + +ModInv = 2 +A = -5e +M = 3 + +ModInv = 1 +A = -5c +M = 3 + +ModInv = 2 +A = -5b +M = 3 + +ModInv = 1 +A = -59 +M = 3 + +ModInv = 2 +A = -58 +M = 3 + +ModInv = 1 +A = -56 +M = 3 + +ModInv = 2 +A = -55 +M = 3 + +ModInv = 1 +A = -53 +M = 3 + +ModInv = 2 +A = -52 +M = 3 + +ModInv = 1 +A = -50 +M = 3 + +ModInv = 2 +A = -4f +M = 3 + +ModInv = 1 +A = -4d +M = 3 + +ModInv = 2 +A = -4c +M = 3 + +ModInv = 1 +A = -4a +M = 3 + +ModInv = 2 +A = -49 +M = 3 + +ModInv = 1 +A = -47 +M = 3 + +ModInv = 2 +A = -46 +M = 3 + +ModInv = 1 +A = -44 +M = 3 + +ModInv = 2 +A = -43 +M = 3 + +ModInv = 1 +A = -41 +M = 3 + +ModInv = 2 +A = -40 +M = 3 + +ModInv = 1 +A = -3e +M = 3 + +ModInv = 2 +A = -3d +M = 3 + +ModInv = 1 +A = -3b +M = 3 + +ModInv = 2 +A = -3a +M = 3 + +ModInv = 1 +A = -38 +M = 3 + +ModInv = 2 +A = -37 +M = 3 + +ModInv = 1 +A = -35 +M = 3 + +ModInv = 2 +A = -34 +M = 3 + +ModInv = 1 +A = -32 +M = 3 + +ModInv = 2 +A = -31 +M = 3 + +ModInv = 1 +A = -2f +M = 3 + +ModInv = 2 +A = -2e +M = 3 + +ModInv = 1 +A = -2c +M = 3 + +ModInv = 2 +A = -2b +M = 3 + +ModInv = 1 +A = -29 +M = 3 + +ModInv = 2 +A = -28 +M = 3 + +ModInv = 1 +A = -26 +M = 3 + +ModInv = 2 +A = -25 +M = 3 + +ModInv = 1 +A = -23 +M = 3 + +ModInv = 2 +A = -22 +M = 3 + +ModInv = 1 +A = -20 +M = 3 + +ModInv = 2 +A = -1f +M = 3 + +ModInv = 1 +A = -1d +M = 3 + +ModInv = 2 +A = -1c +M = 3 + +ModInv = 1 +A = -1a +M = 3 + +ModInv = 2 +A = -19 +M = 3 + +ModInv = 1 +A = -17 +M = 3 + +ModInv = 2 +A = -16 +M = 3 + +ModInv = 1 +A = -14 +M = 3 + +ModInv = 2 +A = -13 +M = 3 + +ModInv = 1 +A = -11 +M = 3 + +ModInv = 2 +A = -10 +M = 3 + +ModInv = 1 +A = -e +M = 3 + +ModInv = 2 +A = -d +M = 3 + +ModInv = 1 +A = -b +M = 3 + +ModInv = 2 +A = -a +M = 3 + +ModInv = 1 +A = -8 +M = 3 + +ModInv = 2 +A = -7 +M = 3 + +ModInv = 1 +A = -5 +M = 3 + +ModInv = 2 +A = -4 +M = 3 + +ModInv = 1 +A = -2 +M = 3 + +ModInv = 2 +A = -1 +M = 3 + +ModInv = 1 +A = 1 +M = 3 + +ModInv = 2 +A = 2 +M = 3 + +ModInv = 1 +A = 4 +M = 3 + +ModInv = 2 +A = 5 +M = 3 + +ModInv = 1 +A = 7 +M = 3 + +ModInv = 2 +A = 8 +M = 3 + +ModInv = 1 +A = a +M = 3 + +ModInv = 2 +A = b +M = 3 + +ModInv = 1 +A = d +M = 3 + +ModInv = 2 +A = e +M = 3 + +ModInv = 1 +A = 10 +M = 3 + +ModInv = 2 +A = 11 +M = 3 + +ModInv = 1 +A = 13 +M = 3 + +ModInv = 2 +A = 14 +M = 3 + +ModInv = 1 +A = 16 +M = 3 + +ModInv = 2 +A = 17 +M = 3 + +ModInv = 1 +A = 19 +M = 3 + +ModInv = 2 +A = 1a +M = 3 + +ModInv = 1 +A = 1c +M = 3 + +ModInv = 2 +A = 1d +M = 3 + +ModInv = 1 +A = 1f +M = 3 + +ModInv = 2 +A = 20 +M = 3 + +ModInv = 1 +A = 22 +M = 3 + +ModInv = 2 +A = 23 +M = 3 + +ModInv = 1 +A = 25 +M = 3 + +ModInv = 2 +A = 26 +M = 3 + +ModInv = 1 +A = 28 +M = 3 + +ModInv = 2 +A = 29 +M = 3 + +ModInv = 1 +A = 2b +M = 3 + +ModInv = 2 +A = 2c +M = 3 + +ModInv = 1 +A = 2e +M = 3 + +ModInv = 2 +A = 2f +M = 3 + +ModInv = 1 +A = 31 +M = 3 + +ModInv = 2 +A = 32 +M = 3 + +ModInv = 1 +A = 34 +M = 3 + +ModInv = 2 +A = 35 +M = 3 + +ModInv = 1 +A = 37 +M = 3 + +ModInv = 2 +A = 38 +M = 3 + +ModInv = 1 +A = 3a +M = 3 + +ModInv = 2 +A = 3b +M = 3 + +ModInv = 1 +A = 3d +M = 3 + +ModInv = 2 +A = 3e +M = 3 + +ModInv = 1 +A = 40 +M = 3 + +ModInv = 2 +A = 41 +M = 3 + +ModInv = 1 +A = 43 +M = 3 + +ModInv = 2 +A = 44 +M = 3 + +ModInv = 1 +A = 46 +M = 3 + +ModInv = 2 +A = 47 +M = 3 + +ModInv = 1 +A = 49 +M = 3 + +ModInv = 2 +A = 4a +M = 3 + +ModInv = 1 +A = 4c +M = 3 + +ModInv = 2 +A = 4d +M = 3 + +ModInv = 1 +A = 4f +M = 3 + +ModInv = 2 +A = 50 +M = 3 + +ModInv = 1 +A = 52 +M = 3 + +ModInv = 2 +A = 53 +M = 3 + +ModInv = 1 +A = 55 +M = 3 + +ModInv = 2 +A = 56 +M = 3 + +ModInv = 1 +A = 58 +M = 3 + +ModInv = 2 +A = 59 +M = 3 + +ModInv = 1 +A = 5b +M = 3 + +ModInv = 2 +A = 5c +M = 3 + +ModInv = 1 +A = 5e +M = 3 + +ModInv = 2 +A = 5f +M = 3 + +ModInv = 1 +A = 61 +M = 3 + +ModInv = 2 +A = 62 +M = 3 + +ModInv = 1 +A = -63 +M = 4 + +ModInv = 3 +A = -61 +M = 4 + +ModInv = 1 +A = -5f +M = 4 + +ModInv = 3 +A = -5d +M = 4 + +ModInv = 1 +A = -5b +M = 4 + +ModInv = 3 +A = -59 +M = 4 + +ModInv = 1 +A = -57 +M = 4 + +ModInv = 3 +A = -55 +M = 4 + +ModInv = 1 +A = -53 +M = 4 + +ModInv = 3 +A = -51 +M = 4 + +ModInv = 1 +A = -4f +M = 4 + +ModInv = 3 +A = -4d +M = 4 + +ModInv = 1 +A = -4b +M = 4 + +ModInv = 3 +A = -49 +M = 4 + +ModInv = 1 +A = -47 +M = 4 + +ModInv = 3 +A = -45 +M = 4 + +ModInv = 1 +A = -43 +M = 4 + +ModInv = 3 +A = -41 +M = 4 + +ModInv = 1 +A = -3f +M = 4 + +ModInv = 3 +A = -3d +M = 4 + +ModInv = 1 +A = -3b +M = 4 + +ModInv = 3 +A = -39 +M = 4 + +ModInv = 1 +A = -37 +M = 4 + +ModInv = 3 +A = -35 +M = 4 + +ModInv = 1 +A = -33 +M = 4 + +ModInv = 3 +A = -31 +M = 4 + +ModInv = 1 +A = -2f +M = 4 + +ModInv = 3 +A = -2d +M = 4 + +ModInv = 1 +A = -2b +M = 4 + +ModInv = 3 +A = -29 +M = 4 + +ModInv = 1 +A = -27 +M = 4 + +ModInv = 3 +A = -25 +M = 4 + +ModInv = 1 +A = -23 +M = 4 + +ModInv = 3 +A = -21 +M = 4 + +ModInv = 1 +A = -1f +M = 4 + +ModInv = 3 +A = -1d +M = 4 + +ModInv = 1 +A = -1b +M = 4 + +ModInv = 3 +A = -19 +M = 4 + +ModInv = 1 +A = -17 +M = 4 + +ModInv = 3 +A = -15 +M = 4 + +ModInv = 1 +A = -13 +M = 4 + +ModInv = 3 +A = -11 +M = 4 + +ModInv = 1 +A = -f +M = 4 + +ModInv = 3 +A = -d +M = 4 + +ModInv = 1 +A = -b +M = 4 + +ModInv = 3 +A = -9 +M = 4 + +ModInv = 1 +A = -7 +M = 4 + +ModInv = 3 +A = -5 +M = 4 + +ModInv = 1 +A = -3 +M = 4 + +ModInv = 3 +A = -1 +M = 4 + +ModInv = 1 +A = 1 +M = 4 + +ModInv = 3 +A = 3 +M = 4 + +ModInv = 1 +A = 5 +M = 4 + +ModInv = 3 +A = 7 +M = 4 + +ModInv = 1 +A = 9 +M = 4 + +ModInv = 3 +A = b +M = 4 + +ModInv = 1 +A = d +M = 4 + +ModInv = 3 +A = f +M = 4 + +ModInv = 1 +A = 11 +M = 4 + +ModInv = 3 +A = 13 +M = 4 + +ModInv = 1 +A = 15 +M = 4 + +ModInv = 3 +A = 17 +M = 4 + +ModInv = 1 +A = 19 +M = 4 + +ModInv = 3 +A = 1b +M = 4 + +ModInv = 1 +A = 1d +M = 4 + +ModInv = 3 +A = 1f +M = 4 + +ModInv = 1 +A = 21 +M = 4 + +ModInv = 3 +A = 23 +M = 4 + +ModInv = 1 +A = 25 +M = 4 + +ModInv = 3 +A = 27 +M = 4 + +ModInv = 1 +A = 29 +M = 4 + +ModInv = 3 +A = 2b +M = 4 + +ModInv = 1 +A = 2d +M = 4 + +ModInv = 3 +A = 2f +M = 4 + +ModInv = 1 +A = 31 +M = 4 + +ModInv = 3 +A = 33 +M = 4 + +ModInv = 1 +A = 35 +M = 4 + +ModInv = 3 +A = 37 +M = 4 + +ModInv = 1 +A = 39 +M = 4 + +ModInv = 3 +A = 3b +M = 4 + +ModInv = 1 +A = 3d +M = 4 + +ModInv = 3 +A = 3f +M = 4 + +ModInv = 1 +A = 41 +M = 4 + +ModInv = 3 +A = 43 +M = 4 + +ModInv = 1 +A = 45 +M = 4 + +ModInv = 3 +A = 47 +M = 4 + +ModInv = 1 +A = 49 +M = 4 + +ModInv = 3 +A = 4b +M = 4 + +ModInv = 1 +A = 4d +M = 4 + +ModInv = 3 +A = 4f +M = 4 + +ModInv = 1 +A = 51 +M = 4 + +ModInv = 3 +A = 53 +M = 4 + +ModInv = 1 +A = 55 +M = 4 + +ModInv = 3 +A = 57 +M = 4 + +ModInv = 1 +A = 59 +M = 4 + +ModInv = 3 +A = 5b +M = 4 + +ModInv = 1 +A = 5d +M = 4 + +ModInv = 3 +A = 5f +M = 4 + +ModInv = 1 +A = 61 +M = 4 + +ModInv = 3 +A = 63 +M = 4 + +ModInv = 1 +A = -63 +M = 5 + +ModInv = 3 +A = -62 +M = 5 + +ModInv = 2 +A = -61 +M = 5 + +ModInv = 4 +A = -60 +M = 5 + +ModInv = 1 +A = -5e +M = 5 + +ModInv = 3 +A = -5d +M = 5 + +ModInv = 2 +A = -5c +M = 5 + +ModInv = 4 +A = -5b +M = 5 + +ModInv = 1 +A = -59 +M = 5 + +ModInv = 3 +A = -58 +M = 5 + +ModInv = 2 +A = -57 +M = 5 + +ModInv = 4 +A = -56 +M = 5 + +ModInv = 1 +A = -54 +M = 5 + +ModInv = 3 +A = -53 +M = 5 + +ModInv = 2 +A = -52 +M = 5 + +ModInv = 4 +A = -51 +M = 5 + +ModInv = 1 +A = -4f +M = 5 + +ModInv = 3 +A = -4e +M = 5 + +ModInv = 2 +A = -4d +M = 5 + +ModInv = 4 +A = -4c +M = 5 + +ModInv = 1 +A = -4a +M = 5 + +ModInv = 3 +A = -49 +M = 5 + +ModInv = 2 +A = -48 +M = 5 + +ModInv = 4 +A = -47 +M = 5 + +ModInv = 1 +A = -45 +M = 5 + +ModInv = 3 +A = -44 +M = 5 + +ModInv = 2 +A = -43 +M = 5 + +ModInv = 4 +A = -42 +M = 5 + +ModInv = 1 +A = -40 +M = 5 + +ModInv = 3 +A = -3f +M = 5 + +ModInv = 2 +A = -3e +M = 5 + +ModInv = 4 +A = -3d +M = 5 + +ModInv = 1 +A = -3b +M = 5 + +ModInv = 3 +A = -3a +M = 5 + +ModInv = 2 +A = -39 +M = 5 + +ModInv = 4 +A = -38 +M = 5 + +ModInv = 1 +A = -36 +M = 5 + +ModInv = 3 +A = -35 +M = 5 + +ModInv = 2 +A = -34 +M = 5 + +ModInv = 4 +A = -33 +M = 5 + +ModInv = 1 +A = -31 +M = 5 + +ModInv = 3 +A = -30 +M = 5 + +ModInv = 2 +A = -2f +M = 5 + +ModInv = 4 +A = -2e +M = 5 + +ModInv = 1 +A = -2c +M = 5 + +ModInv = 3 +A = -2b +M = 5 + +ModInv = 2 +A = -2a +M = 5 + +ModInv = 4 +A = -29 +M = 5 + +ModInv = 1 +A = -27 +M = 5 + +ModInv = 3 +A = -26 +M = 5 + +ModInv = 2 +A = -25 +M = 5 + +ModInv = 4 +A = -24 +M = 5 + +ModInv = 1 +A = -22 +M = 5 + +ModInv = 3 +A = -21 +M = 5 + +ModInv = 2 +A = -20 +M = 5 + +ModInv = 4 +A = -1f +M = 5 + +ModInv = 1 +A = -1d +M = 5 + +ModInv = 3 +A = -1c +M = 5 + +ModInv = 2 +A = -1b +M = 5 + +ModInv = 4 +A = -1a +M = 5 + +ModInv = 1 +A = -18 +M = 5 + +ModInv = 3 +A = -17 +M = 5 + +ModInv = 2 +A = -16 +M = 5 + +ModInv = 4 +A = -15 +M = 5 + +ModInv = 1 +A = -13 +M = 5 + +ModInv = 3 +A = -12 +M = 5 + +ModInv = 2 +A = -11 +M = 5 + +ModInv = 4 +A = -10 +M = 5 + +ModInv = 1 +A = -e +M = 5 + +ModInv = 3 +A = -d +M = 5 + +ModInv = 2 +A = -c +M = 5 + +ModInv = 4 +A = -b +M = 5 + +ModInv = 1 +A = -9 +M = 5 + +ModInv = 3 +A = -8 +M = 5 + +ModInv = 2 +A = -7 +M = 5 + +ModInv = 4 +A = -6 +M = 5 + +ModInv = 1 +A = -4 +M = 5 + +ModInv = 3 +A = -3 +M = 5 + +ModInv = 2 +A = -2 +M = 5 + +ModInv = 4 +A = -1 +M = 5 + +ModInv = 1 +A = 1 +M = 5 + +ModInv = 3 +A = 2 +M = 5 + +ModInv = 2 +A = 3 +M = 5 + +ModInv = 4 +A = 4 +M = 5 + +ModInv = 1 +A = 6 +M = 5 + +ModInv = 3 +A = 7 +M = 5 + +ModInv = 2 +A = 8 +M = 5 + +ModInv = 4 +A = 9 +M = 5 + +ModInv = 1 +A = b +M = 5 + +ModInv = 3 +A = c +M = 5 + +ModInv = 2 +A = d +M = 5 + +ModInv = 4 +A = e +M = 5 + +ModInv = 1 +A = 10 +M = 5 + +ModInv = 3 +A = 11 +M = 5 + +ModInv = 2 +A = 12 +M = 5 + +ModInv = 4 +A = 13 +M = 5 + +ModInv = 1 +A = 15 +M = 5 + +ModInv = 3 +A = 16 +M = 5 + +ModInv = 2 +A = 17 +M = 5 + +ModInv = 4 +A = 18 +M = 5 + +ModInv = 1 +A = 1a +M = 5 + +ModInv = 3 +A = 1b +M = 5 + +ModInv = 2 +A = 1c +M = 5 + +ModInv = 4 +A = 1d +M = 5 + +ModInv = 1 +A = 1f +M = 5 + +ModInv = 3 +A = 20 +M = 5 + +ModInv = 2 +A = 21 +M = 5 + +ModInv = 4 +A = 22 +M = 5 + +ModInv = 1 +A = 24 +M = 5 + +ModInv = 3 +A = 25 +M = 5 + +ModInv = 2 +A = 26 +M = 5 + +ModInv = 4 +A = 27 +M = 5 + +ModInv = 1 +A = 29 +M = 5 + +ModInv = 3 +A = 2a +M = 5 + +ModInv = 2 +A = 2b +M = 5 + +ModInv = 4 +A = 2c +M = 5 + +ModInv = 1 +A = 2e +M = 5 + +ModInv = 3 +A = 2f +M = 5 + +ModInv = 2 +A = 30 +M = 5 + +ModInv = 4 +A = 31 +M = 5 + +ModInv = 1 +A = 33 +M = 5 + +ModInv = 3 +A = 34 +M = 5 + +ModInv = 2 +A = 35 +M = 5 + +ModInv = 4 +A = 36 +M = 5 + +ModInv = 1 +A = 38 +M = 5 + +ModInv = 3 +A = 39 +M = 5 + +ModInv = 2 +A = 3a +M = 5 + +ModInv = 4 +A = 3b +M = 5 + +ModInv = 1 +A = 3d +M = 5 + +ModInv = 3 +A = 3e +M = 5 + +ModInv = 2 +A = 3f +M = 5 + +ModInv = 4 +A = 40 +M = 5 + +ModInv = 1 +A = 42 +M = 5 + +ModInv = 3 +A = 43 +M = 5 + +ModInv = 2 +A = 44 +M = 5 + +ModInv = 4 +A = 45 +M = 5 + +ModInv = 1 +A = 47 +M = 5 + +ModInv = 3 +A = 48 +M = 5 + +ModInv = 2 +A = 49 +M = 5 + +ModInv = 4 +A = 4a +M = 5 + +ModInv = 1 +A = 4c +M = 5 + +ModInv = 3 +A = 4d +M = 5 + +ModInv = 2 +A = 4e +M = 5 + +ModInv = 4 +A = 4f +M = 5 + +ModInv = 1 +A = 51 +M = 5 + +ModInv = 3 +A = 52 +M = 5 + +ModInv = 2 +A = 53 +M = 5 + +ModInv = 4 +A = 54 +M = 5 + +ModInv = 1 +A = 56 +M = 5 + +ModInv = 3 +A = 57 +M = 5 + +ModInv = 2 +A = 58 +M = 5 + +ModInv = 4 +A = 59 +M = 5 + +ModInv = 1 +A = 5b +M = 5 + +ModInv = 3 +A = 5c +M = 5 + +ModInv = 2 +A = 5d +M = 5 + +ModInv = 4 +A = 5e +M = 5 + +ModInv = 1 +A = 60 +M = 5 + +ModInv = 3 +A = 61 +M = 5 + +ModInv = 2 +A = 62 +M = 5 + +ModInv = 4 +A = 63 +M = 5 + +ModInv = 5 +A = -61 +M = 6 + +ModInv = 1 +A = -5f +M = 6 + +ModInv = 5 +A = -5b +M = 6 + +ModInv = 1 +A = -59 +M = 6 + +ModInv = 5 +A = -55 +M = 6 + +ModInv = 1 +A = -53 +M = 6 + +ModInv = 5 +A = -4f +M = 6 + +ModInv = 1 +A = -4d +M = 6 + +ModInv = 5 +A = -49 +M = 6 + +ModInv = 1 +A = -47 +M = 6 + +ModInv = 5 +A = -43 +M = 6 + +ModInv = 1 +A = -41 +M = 6 + +ModInv = 5 +A = -3d +M = 6 + +ModInv = 1 +A = -3b +M = 6 + +ModInv = 5 +A = -37 +M = 6 + +ModInv = 1 +A = -35 +M = 6 + +ModInv = 5 +A = -31 +M = 6 + +ModInv = 1 +A = -2f +M = 6 + +ModInv = 5 +A = -2b +M = 6 + +ModInv = 1 +A = -29 +M = 6 + +ModInv = 5 +A = -25 +M = 6 + +ModInv = 1 +A = -23 +M = 6 + +ModInv = 5 +A = -1f +M = 6 + +ModInv = 1 +A = -1d +M = 6 + +ModInv = 5 +A = -19 +M = 6 + +ModInv = 1 +A = -17 +M = 6 + +ModInv = 5 +A = -13 +M = 6 + +ModInv = 1 +A = -11 +M = 6 + +ModInv = 5 +A = -d +M = 6 + +ModInv = 1 +A = -b +M = 6 + +ModInv = 5 +A = -7 +M = 6 + +ModInv = 1 +A = -5 +M = 6 + +ModInv = 5 +A = -1 +M = 6 + +ModInv = 1 +A = 1 +M = 6 + +ModInv = 5 +A = 5 +M = 6 + +ModInv = 1 +A = 7 +M = 6 + +ModInv = 5 +A = b +M = 6 + +ModInv = 1 +A = d +M = 6 + +ModInv = 5 +A = 11 +M = 6 + +ModInv = 1 +A = 13 +M = 6 + +ModInv = 5 +A = 17 +M = 6 + +ModInv = 1 +A = 19 +M = 6 + +ModInv = 5 +A = 1d +M = 6 + +ModInv = 1 +A = 1f +M = 6 + +ModInv = 5 +A = 23 +M = 6 + +ModInv = 1 +A = 25 +M = 6 + +ModInv = 5 +A = 29 +M = 6 + +ModInv = 1 +A = 2b +M = 6 + +ModInv = 5 +A = 2f +M = 6 + +ModInv = 1 +A = 31 +M = 6 + +ModInv = 5 +A = 35 +M = 6 + +ModInv = 1 +A = 37 +M = 6 + +ModInv = 5 +A = 3b +M = 6 + +ModInv = 1 +A = 3d +M = 6 + +ModInv = 5 +A = 41 +M = 6 + +ModInv = 1 +A = 43 +M = 6 + +ModInv = 5 +A = 47 +M = 6 + +ModInv = 1 +A = 49 +M = 6 + +ModInv = 5 +A = 4d +M = 6 + +ModInv = 1 +A = 4f +M = 6 + +ModInv = 5 +A = 53 +M = 6 + +ModInv = 1 +A = 55 +M = 6 + +ModInv = 5 +A = 59 +M = 6 + +ModInv = 1 +A = 5b +M = 6 + +ModInv = 5 +A = 5f +M = 6 + +ModInv = 1 +A = 61 +M = 6 + +ModInv = 3 +A = -64 +M = 7 + +ModInv = 6 +A = -63 +M = 7 + +ModInv = 1 +A = -61 +M = 7 + +ModInv = 4 +A = -60 +M = 7 + +ModInv = 5 +A = -5f +M = 7 + +ModInv = 2 +A = -5e +M = 7 + +ModInv = 3 +A = -5d +M = 7 + +ModInv = 6 +A = -5c +M = 7 + +ModInv = 1 +A = -5a +M = 7 + +ModInv = 4 +A = -59 +M = 7 + +ModInv = 5 +A = -58 +M = 7 + +ModInv = 2 +A = -57 +M = 7 + +ModInv = 3 +A = -56 +M = 7 + +ModInv = 6 +A = -55 +M = 7 + +ModInv = 1 +A = -53 +M = 7 + +ModInv = 4 +A = -52 +M = 7 + +ModInv = 5 +A = -51 +M = 7 + +ModInv = 2 +A = -50 +M = 7 + +ModInv = 3 +A = -4f +M = 7 + +ModInv = 6 +A = -4e +M = 7 + +ModInv = 1 +A = -4c +M = 7 + +ModInv = 4 +A = -4b +M = 7 + +ModInv = 5 +A = -4a +M = 7 + +ModInv = 2 +A = -49 +M = 7 + +ModInv = 3 +A = -48 +M = 7 + +ModInv = 6 +A = -47 +M = 7 + +ModInv = 1 +A = -45 +M = 7 + +ModInv = 4 +A = -44 +M = 7 + +ModInv = 5 +A = -43 +M = 7 + +ModInv = 2 +A = -42 +M = 7 + +ModInv = 3 +A = -41 +M = 7 + +ModInv = 6 +A = -40 +M = 7 + +ModInv = 1 +A = -3e +M = 7 + +ModInv = 4 +A = -3d +M = 7 + +ModInv = 5 +A = -3c +M = 7 + +ModInv = 2 +A = -3b +M = 7 + +ModInv = 3 +A = -3a +M = 7 + +ModInv = 6 +A = -39 +M = 7 + +ModInv = 1 +A = -37 +M = 7 + +ModInv = 4 +A = -36 +M = 7 + +ModInv = 5 +A = -35 +M = 7 + +ModInv = 2 +A = -34 +M = 7 + +ModInv = 3 +A = -33 +M = 7 + +ModInv = 6 +A = -32 +M = 7 + +ModInv = 1 +A = -30 +M = 7 + +ModInv = 4 +A = -2f +M = 7 + +ModInv = 5 +A = -2e +M = 7 + +ModInv = 2 +A = -2d +M = 7 + +ModInv = 3 +A = -2c +M = 7 + +ModInv = 6 +A = -2b +M = 7 + +ModInv = 1 +A = -29 +M = 7 + +ModInv = 4 +A = -28 +M = 7 + +ModInv = 5 +A = -27 +M = 7 + +ModInv = 2 +A = -26 +M = 7 + +ModInv = 3 +A = -25 +M = 7 + +ModInv = 6 +A = -24 +M = 7 + +ModInv = 1 +A = -22 +M = 7 + +ModInv = 4 +A = -21 +M = 7 + +ModInv = 5 +A = -20 +M = 7 + +ModInv = 2 +A = -1f +M = 7 + +ModInv = 3 +A = -1e +M = 7 + +ModInv = 6 +A = -1d +M = 7 + +ModInv = 1 +A = -1b +M = 7 + +ModInv = 4 +A = -1a +M = 7 + +ModInv = 5 +A = -19 +M = 7 + +ModInv = 2 +A = -18 +M = 7 + +ModInv = 3 +A = -17 +M = 7 + +ModInv = 6 +A = -16 +M = 7 + +ModInv = 1 +A = -14 +M = 7 + +ModInv = 4 +A = -13 +M = 7 + +ModInv = 5 +A = -12 +M = 7 + +ModInv = 2 +A = -11 +M = 7 + +ModInv = 3 +A = -10 +M = 7 + +ModInv = 6 +A = -f +M = 7 + +ModInv = 1 +A = -d +M = 7 + +ModInv = 4 +A = -c +M = 7 + +ModInv = 5 +A = -b +M = 7 + +ModInv = 2 +A = -a +M = 7 + +ModInv = 3 +A = -9 +M = 7 + +ModInv = 6 +A = -8 +M = 7 + +ModInv = 1 +A = -6 +M = 7 + +ModInv = 4 +A = -5 +M = 7 + +ModInv = 5 +A = -4 +M = 7 + +ModInv = 2 +A = -3 +M = 7 + +ModInv = 3 +A = -2 +M = 7 + +ModInv = 6 +A = -1 +M = 7 + +ModInv = 1 +A = 1 +M = 7 + +ModInv = 4 +A = 2 +M = 7 + +ModInv = 5 +A = 3 +M = 7 + +ModInv = 2 +A = 4 +M = 7 + +ModInv = 3 +A = 5 +M = 7 + +ModInv = 6 +A = 6 +M = 7 + +ModInv = 1 +A = 8 +M = 7 + +ModInv = 4 +A = 9 +M = 7 + +ModInv = 5 +A = a +M = 7 + +ModInv = 2 +A = b +M = 7 + +ModInv = 3 +A = c +M = 7 + +ModInv = 6 +A = d +M = 7 + +ModInv = 1 +A = f +M = 7 + +ModInv = 4 +A = 10 +M = 7 + +ModInv = 5 +A = 11 +M = 7 + +ModInv = 2 +A = 12 +M = 7 + +ModInv = 3 +A = 13 +M = 7 + +ModInv = 6 +A = 14 +M = 7 + +ModInv = 1 +A = 16 +M = 7 + +ModInv = 4 +A = 17 +M = 7 + +ModInv = 5 +A = 18 +M = 7 + +ModInv = 2 +A = 19 +M = 7 + +ModInv = 3 +A = 1a +M = 7 + +ModInv = 6 +A = 1b +M = 7 + +ModInv = 1 +A = 1d +M = 7 + +ModInv = 4 +A = 1e +M = 7 + +ModInv = 5 +A = 1f +M = 7 + +ModInv = 2 +A = 20 +M = 7 + +ModInv = 3 +A = 21 +M = 7 + +ModInv = 6 +A = 22 +M = 7 + +ModInv = 1 +A = 24 +M = 7 + +ModInv = 4 +A = 25 +M = 7 + +ModInv = 5 +A = 26 +M = 7 + +ModInv = 2 +A = 27 +M = 7 + +ModInv = 3 +A = 28 +M = 7 + +ModInv = 6 +A = 29 +M = 7 + +ModInv = 1 +A = 2b +M = 7 + +ModInv = 4 +A = 2c +M = 7 + +ModInv = 5 +A = 2d +M = 7 + +ModInv = 2 +A = 2e +M = 7 + +ModInv = 3 +A = 2f +M = 7 + +ModInv = 6 +A = 30 +M = 7 + +ModInv = 1 +A = 32 +M = 7 + +ModInv = 4 +A = 33 +M = 7 + +ModInv = 5 +A = 34 +M = 7 + +ModInv = 2 +A = 35 +M = 7 + +ModInv = 3 +A = 36 +M = 7 + +ModInv = 6 +A = 37 +M = 7 + +ModInv = 1 +A = 39 +M = 7 + +ModInv = 4 +A = 3a +M = 7 + +ModInv = 5 +A = 3b +M = 7 + +ModInv = 2 +A = 3c +M = 7 + +ModInv = 3 +A = 3d +M = 7 + +ModInv = 6 +A = 3e +M = 7 + +ModInv = 1 +A = 40 +M = 7 + +ModInv = 4 +A = 41 +M = 7 + +ModInv = 5 +A = 42 +M = 7 + +ModInv = 2 +A = 43 +M = 7 + +ModInv = 3 +A = 44 +M = 7 + +ModInv = 6 +A = 45 +M = 7 + +ModInv = 1 +A = 47 +M = 7 + +ModInv = 4 +A = 48 +M = 7 + +ModInv = 5 +A = 49 +M = 7 + +ModInv = 2 +A = 4a +M = 7 + +ModInv = 3 +A = 4b +M = 7 + +ModInv = 6 +A = 4c +M = 7 + +ModInv = 1 +A = 4e +M = 7 + +ModInv = 4 +A = 4f +M = 7 + +ModInv = 5 +A = 50 +M = 7 + +ModInv = 2 +A = 51 +M = 7 + +ModInv = 3 +A = 52 +M = 7 + +ModInv = 6 +A = 53 +M = 7 + +ModInv = 1 +A = 55 +M = 7 + +ModInv = 4 +A = 56 +M = 7 + +ModInv = 5 +A = 57 +M = 7 + +ModInv = 2 +A = 58 +M = 7 + +ModInv = 3 +A = 59 +M = 7 + +ModInv = 6 +A = 5a +M = 7 + +ModInv = 1 +A = 5c +M = 7 + +ModInv = 4 +A = 5d +M = 7 + +ModInv = 5 +A = 5e +M = 7 + +ModInv = 2 +A = 5f +M = 7 + +ModInv = 3 +A = 60 +M = 7 + +ModInv = 6 +A = 61 +M = 7 + +ModInv = 1 +A = 63 +M = 7 + +ModInv = 5 +A = -63 +M = 8 + +ModInv = 7 +A = -61 +M = 8 + +ModInv = 1 +A = -5f +M = 8 + +ModInv = 3 +A = -5d +M = 8 + +ModInv = 5 +A = -5b +M = 8 + +ModInv = 7 +A = -59 +M = 8 + +ModInv = 1 +A = -57 +M = 8 + +ModInv = 3 +A = -55 +M = 8 + +ModInv = 5 +A = -53 +M = 8 + +ModInv = 7 +A = -51 +M = 8 + +ModInv = 1 +A = -4f +M = 8 + +ModInv = 3 +A = -4d +M = 8 + +ModInv = 5 +A = -4b +M = 8 + +ModInv = 7 +A = -49 +M = 8 + +ModInv = 1 +A = -47 +M = 8 + +ModInv = 3 +A = -45 +M = 8 + +ModInv = 5 +A = -43 +M = 8 + +ModInv = 7 +A = -41 +M = 8 + +ModInv = 1 +A = -3f +M = 8 + +ModInv = 3 +A = -3d +M = 8 + +ModInv = 5 +A = -3b +M = 8 + +ModInv = 7 +A = -39 +M = 8 + +ModInv = 1 +A = -37 +M = 8 + +ModInv = 3 +A = -35 +M = 8 + +ModInv = 5 +A = -33 +M = 8 + +ModInv = 7 +A = -31 +M = 8 + +ModInv = 1 +A = -2f +M = 8 + +ModInv = 3 +A = -2d +M = 8 + +ModInv = 5 +A = -2b +M = 8 + +ModInv = 7 +A = -29 +M = 8 + +ModInv = 1 +A = -27 +M = 8 + +ModInv = 3 +A = -25 +M = 8 + +ModInv = 5 +A = -23 +M = 8 + +ModInv = 7 +A = -21 +M = 8 + +ModInv = 1 +A = -1f +M = 8 + +ModInv = 3 +A = -1d +M = 8 + +ModInv = 5 +A = -1b +M = 8 + +ModInv = 7 +A = -19 +M = 8 + +ModInv = 1 +A = -17 +M = 8 + +ModInv = 3 +A = -15 +M = 8 + +ModInv = 5 +A = -13 +M = 8 + +ModInv = 7 +A = -11 +M = 8 + +ModInv = 1 +A = -f +M = 8 + +ModInv = 3 +A = -d +M = 8 + +ModInv = 5 +A = -b +M = 8 + +ModInv = 7 +A = -9 +M = 8 + +ModInv = 1 +A = -7 +M = 8 + +ModInv = 3 +A = -5 +M = 8 + +ModInv = 5 +A = -3 +M = 8 + +ModInv = 7 +A = -1 +M = 8 + +ModInv = 1 +A = 1 +M = 8 + +ModInv = 3 +A = 3 +M = 8 + +ModInv = 5 +A = 5 +M = 8 + +ModInv = 7 +A = 7 +M = 8 + +ModInv = 1 +A = 9 +M = 8 + +ModInv = 3 +A = b +M = 8 + +ModInv = 5 +A = d +M = 8 + +ModInv = 7 +A = f +M = 8 + +ModInv = 1 +A = 11 +M = 8 + +ModInv = 3 +A = 13 +M = 8 + +ModInv = 5 +A = 15 +M = 8 + +ModInv = 7 +A = 17 +M = 8 + +ModInv = 1 +A = 19 +M = 8 + +ModInv = 3 +A = 1b +M = 8 + +ModInv = 5 +A = 1d +M = 8 + +ModInv = 7 +A = 1f +M = 8 + +ModInv = 1 +A = 21 +M = 8 + +ModInv = 3 +A = 23 +M = 8 + +ModInv = 5 +A = 25 +M = 8 + +ModInv = 7 +A = 27 +M = 8 + +ModInv = 1 +A = 29 +M = 8 + +ModInv = 3 +A = 2b +M = 8 + +ModInv = 5 +A = 2d +M = 8 + +ModInv = 7 +A = 2f +M = 8 + +ModInv = 1 +A = 31 +M = 8 + +ModInv = 3 +A = 33 +M = 8 + +ModInv = 5 +A = 35 +M = 8 + +ModInv = 7 +A = 37 +M = 8 + +ModInv = 1 +A = 39 +M = 8 + +ModInv = 3 +A = 3b +M = 8 + +ModInv = 5 +A = 3d +M = 8 + +ModInv = 7 +A = 3f +M = 8 + +ModInv = 1 +A = 41 +M = 8 + +ModInv = 3 +A = 43 +M = 8 + +ModInv = 5 +A = 45 +M = 8 + +ModInv = 7 +A = 47 +M = 8 + +ModInv = 1 +A = 49 +M = 8 + +ModInv = 3 +A = 4b +M = 8 + +ModInv = 5 +A = 4d +M = 8 + +ModInv = 7 +A = 4f +M = 8 + +ModInv = 1 +A = 51 +M = 8 + +ModInv = 3 +A = 53 +M = 8 + +ModInv = 5 +A = 55 +M = 8 + +ModInv = 7 +A = 57 +M = 8 + +ModInv = 1 +A = 59 +M = 8 + +ModInv = 3 +A = 5b +M = 8 + +ModInv = 5 +A = 5d +M = 8 + +ModInv = 7 +A = 5f +M = 8 + +ModInv = 1 +A = 61 +M = 8 + +ModInv = 3 +A = 63 +M = 8 + +ModInv = 8 +A = -64 +M = 9 + +ModInv = 1 +A = -62 +M = 9 + +ModInv = 5 +A = -61 +M = 9 + +ModInv = 7 +A = -5f +M = 9 + +ModInv = 2 +A = -5e +M = 9 + +ModInv = 4 +A = -5c +M = 9 + +ModInv = 8 +A = -5b +M = 9 + +ModInv = 1 +A = -59 +M = 9 + +ModInv = 5 +A = -58 +M = 9 + +ModInv = 7 +A = -56 +M = 9 + +ModInv = 2 +A = -55 +M = 9 + +ModInv = 4 +A = -53 +M = 9 + +ModInv = 8 +A = -52 +M = 9 + +ModInv = 1 +A = -50 +M = 9 + +ModInv = 5 +A = -4f +M = 9 + +ModInv = 7 +A = -4d +M = 9 + +ModInv = 2 +A = -4c +M = 9 + +ModInv = 4 +A = -4a +M = 9 + +ModInv = 8 +A = -49 +M = 9 + +ModInv = 1 +A = -47 +M = 9 + +ModInv = 5 +A = -46 +M = 9 + +ModInv = 7 +A = -44 +M = 9 + +ModInv = 2 +A = -43 +M = 9 + +ModInv = 4 +A = -41 +M = 9 + +ModInv = 8 +A = -40 +M = 9 + +ModInv = 1 +A = -3e +M = 9 + +ModInv = 5 +A = -3d +M = 9 + +ModInv = 7 +A = -3b +M = 9 + +ModInv = 2 +A = -3a +M = 9 + +ModInv = 4 +A = -38 +M = 9 + +ModInv = 8 +A = -37 +M = 9 + +ModInv = 1 +A = -35 +M = 9 + +ModInv = 5 +A = -34 +M = 9 + +ModInv = 7 +A = -32 +M = 9 + +ModInv = 2 +A = -31 +M = 9 + +ModInv = 4 +A = -2f +M = 9 + +ModInv = 8 +A = -2e +M = 9 + +ModInv = 1 +A = -2c +M = 9 + +ModInv = 5 +A = -2b +M = 9 + +ModInv = 7 +A = -29 +M = 9 + +ModInv = 2 +A = -28 +M = 9 + +ModInv = 4 +A = -26 +M = 9 + +ModInv = 8 +A = -25 +M = 9 + +ModInv = 1 +A = -23 +M = 9 + +ModInv = 5 +A = -22 +M = 9 + +ModInv = 7 +A = -20 +M = 9 + +ModInv = 2 +A = -1f +M = 9 + +ModInv = 4 +A = -1d +M = 9 + +ModInv = 8 +A = -1c +M = 9 + +ModInv = 1 +A = -1a +M = 9 + +ModInv = 5 +A = -19 +M = 9 + +ModInv = 7 +A = -17 +M = 9 + +ModInv = 2 +A = -16 +M = 9 + +ModInv = 4 +A = -14 +M = 9 + +ModInv = 8 +A = -13 +M = 9 + +ModInv = 1 +A = -11 +M = 9 + +ModInv = 5 +A = -10 +M = 9 + +ModInv = 7 +A = -e +M = 9 + +ModInv = 2 +A = -d +M = 9 + +ModInv = 4 +A = -b +M = 9 + +ModInv = 8 +A = -a +M = 9 + +ModInv = 1 +A = -8 +M = 9 + +ModInv = 5 +A = -7 +M = 9 + +ModInv = 7 +A = -5 +M = 9 + +ModInv = 2 +A = -4 +M = 9 + +ModInv = 4 +A = -2 +M = 9 + +ModInv = 8 +A = -1 +M = 9 + +ModInv = 1 +A = 1 +M = 9 + +ModInv = 5 +A = 2 +M = 9 + +ModInv = 7 +A = 4 +M = 9 + +ModInv = 2 +A = 5 +M = 9 + +ModInv = 4 +A = 7 +M = 9 + +ModInv = 8 +A = 8 +M = 9 + +ModInv = 1 +A = a +M = 9 + +ModInv = 5 +A = b +M = 9 + +ModInv = 7 +A = d +M = 9 + +ModInv = 2 +A = e +M = 9 + +ModInv = 4 +A = 10 +M = 9 + +ModInv = 8 +A = 11 +M = 9 + +ModInv = 1 +A = 13 +M = 9 + +ModInv = 5 +A = 14 +M = 9 + +ModInv = 7 +A = 16 +M = 9 + +ModInv = 2 +A = 17 +M = 9 + +ModInv = 4 +A = 19 +M = 9 + +ModInv = 8 +A = 1a +M = 9 + +ModInv = 1 +A = 1c +M = 9 + +ModInv = 5 +A = 1d +M = 9 + +ModInv = 7 +A = 1f +M = 9 + +ModInv = 2 +A = 20 +M = 9 + +ModInv = 4 +A = 22 +M = 9 + +ModInv = 8 +A = 23 +M = 9 + +ModInv = 1 +A = 25 +M = 9 + +ModInv = 5 +A = 26 +M = 9 + +ModInv = 7 +A = 28 +M = 9 + +ModInv = 2 +A = 29 +M = 9 + +ModInv = 4 +A = 2b +M = 9 + +ModInv = 8 +A = 2c +M = 9 + +ModInv = 1 +A = 2e +M = 9 + +ModInv = 5 +A = 2f +M = 9 + +ModInv = 7 +A = 31 +M = 9 + +ModInv = 2 +A = 32 +M = 9 + +ModInv = 4 +A = 34 +M = 9 + +ModInv = 8 +A = 35 +M = 9 + +ModInv = 1 +A = 37 +M = 9 + +ModInv = 5 +A = 38 +M = 9 + +ModInv = 7 +A = 3a +M = 9 + +ModInv = 2 +A = 3b +M = 9 + +ModInv = 4 +A = 3d +M = 9 + +ModInv = 8 +A = 3e +M = 9 + +ModInv = 1 +A = 40 +M = 9 + +ModInv = 5 +A = 41 +M = 9 + +ModInv = 7 +A = 43 +M = 9 + +ModInv = 2 +A = 44 +M = 9 + +ModInv = 4 +A = 46 +M = 9 + +ModInv = 8 +A = 47 +M = 9 + +ModInv = 1 +A = 49 +M = 9 + +ModInv = 5 +A = 4a +M = 9 + +ModInv = 7 +A = 4c +M = 9 + +ModInv = 2 +A = 4d +M = 9 + +ModInv = 4 +A = 4f +M = 9 + +ModInv = 8 +A = 50 +M = 9 + +ModInv = 1 +A = 52 +M = 9 + +ModInv = 5 +A = 53 +M = 9 + +ModInv = 7 +A = 55 +M = 9 + +ModInv = 2 +A = 56 +M = 9 + +ModInv = 4 +A = 58 +M = 9 + +ModInv = 8 +A = 59 +M = 9 + +ModInv = 1 +A = 5b +M = 9 + +ModInv = 5 +A = 5c +M = 9 + +ModInv = 7 +A = 5e +M = 9 + +ModInv = 2 +A = 5f +M = 9 + +ModInv = 4 +A = 61 +M = 9 + +ModInv = 8 +A = 62 +M = 9 + +ModInv = 1 +A = -63 +M = a + +ModInv = 7 +A = -61 +M = a + +ModInv = 3 +A = -5d +M = a + +ModInv = 9 +A = -5b +M = a + +ModInv = 1 +A = -59 +M = a + +ModInv = 7 +A = -57 +M = a + +ModInv = 3 +A = -53 +M = a + +ModInv = 9 +A = -51 +M = a + +ModInv = 1 +A = -4f +M = a + +ModInv = 7 +A = -4d +M = a + +ModInv = 3 +A = -49 +M = a + +ModInv = 9 +A = -47 +M = a + +ModInv = 1 +A = -45 +M = a + +ModInv = 7 +A = -43 +M = a + +ModInv = 3 +A = -3f +M = a + +ModInv = 9 +A = -3d +M = a + +ModInv = 1 +A = -3b +M = a + +ModInv = 7 +A = -39 +M = a + +ModInv = 3 +A = -35 +M = a + +ModInv = 9 +A = -33 +M = a + +ModInv = 1 +A = -31 +M = a + +ModInv = 7 +A = -2f +M = a + +ModInv = 3 +A = -2b +M = a + +ModInv = 9 +A = -29 +M = a + +ModInv = 1 +A = -27 +M = a + +ModInv = 7 +A = -25 +M = a + +ModInv = 3 +A = -21 +M = a + +ModInv = 9 +A = -1f +M = a + +ModInv = 1 +A = -1d +M = a + +ModInv = 7 +A = -1b +M = a + +ModInv = 3 +A = -17 +M = a + +ModInv = 9 +A = -15 +M = a + +ModInv = 1 +A = -13 +M = a + +ModInv = 7 +A = -11 +M = a + +ModInv = 3 +A = -d +M = a + +ModInv = 9 +A = -b +M = a + +ModInv = 1 +A = -9 +M = a + +ModInv = 7 +A = -7 +M = a + +ModInv = 3 +A = -3 +M = a + +ModInv = 9 +A = -1 +M = a + +ModInv = 1 +A = 1 +M = a + +ModInv = 7 +A = 3 +M = a + +ModInv = 3 +A = 7 +M = a + +ModInv = 9 +A = 9 +M = a + +ModInv = 1 +A = b +M = a + +ModInv = 7 +A = d +M = a + +ModInv = 3 +A = 11 +M = a + +ModInv = 9 +A = 13 +M = a + +ModInv = 1 +A = 15 +M = a + +ModInv = 7 +A = 17 +M = a + +ModInv = 3 +A = 1b +M = a + +ModInv = 9 +A = 1d +M = a + +ModInv = 1 +A = 1f +M = a + +ModInv = 7 +A = 21 +M = a + +ModInv = 3 +A = 25 +M = a + +ModInv = 9 +A = 27 +M = a + +ModInv = 1 +A = 29 +M = a + +ModInv = 7 +A = 2b +M = a + +ModInv = 3 +A = 2f +M = a + +ModInv = 9 +A = 31 +M = a + +ModInv = 1 +A = 33 +M = a + +ModInv = 7 +A = 35 +M = a + +ModInv = 3 +A = 39 +M = a + +ModInv = 9 +A = 3b +M = a + +ModInv = 1 +A = 3d +M = a + +ModInv = 7 +A = 3f +M = a + +ModInv = 3 +A = 43 +M = a + +ModInv = 9 +A = 45 +M = a + +ModInv = 1 +A = 47 +M = a + +ModInv = 7 +A = 49 +M = a + +ModInv = 3 +A = 4d +M = a + +ModInv = 9 +A = 4f +M = a + +ModInv = 1 +A = 51 +M = a + +ModInv = 7 +A = 53 +M = a + +ModInv = 3 +A = 57 +M = a + +ModInv = 9 +A = 59 +M = a + +ModInv = 1 +A = 5b +M = a + +ModInv = 7 +A = 5d +M = a + +ModInv = 3 +A = 61 +M = a + +ModInv = 9 +A = 63 +M = a + +ModInv = a +A = -64 +M = b + +ModInv = 1 +A = -62 +M = b + +ModInv = 6 +A = -61 +M = b + +ModInv = 4 +A = -60 +M = b + +ModInv = 3 +A = -5f +M = b + +ModInv = 9 +A = -5e +M = b + +ModInv = 2 +A = -5d +M = b + +ModInv = 8 +A = -5c +M = b + +ModInv = 7 +A = -5b +M = b + +ModInv = 5 +A = -5a +M = b + +ModInv = a +A = -59 +M = b + +ModInv = 1 +A = -57 +M = b + +ModInv = 6 +A = -56 +M = b + +ModInv = 4 +A = -55 +M = b + +ModInv = 3 +A = -54 +M = b + +ModInv = 9 +A = -53 +M = b + +ModInv = 2 +A = -52 +M = b + +ModInv = 8 +A = -51 +M = b + +ModInv = 7 +A = -50 +M = b + +ModInv = 5 +A = -4f +M = b + +ModInv = a +A = -4e +M = b + +ModInv = 1 +A = -4c +M = b + +ModInv = 6 +A = -4b +M = b + +ModInv = 4 +A = -4a +M = b + +ModInv = 3 +A = -49 +M = b + +ModInv = 9 +A = -48 +M = b + +ModInv = 2 +A = -47 +M = b + +ModInv = 8 +A = -46 +M = b + +ModInv = 7 +A = -45 +M = b + +ModInv = 5 +A = -44 +M = b + +ModInv = a +A = -43 +M = b + +ModInv = 1 +A = -41 +M = b + +ModInv = 6 +A = -40 +M = b + +ModInv = 4 +A = -3f +M = b + +ModInv = 3 +A = -3e +M = b + +ModInv = 9 +A = -3d +M = b + +ModInv = 2 +A = -3c +M = b + +ModInv = 8 +A = -3b +M = b + +ModInv = 7 +A = -3a +M = b + +ModInv = 5 +A = -39 +M = b + +ModInv = a +A = -38 +M = b + +ModInv = 1 +A = -36 +M = b + +ModInv = 6 +A = -35 +M = b + +ModInv = 4 +A = -34 +M = b + +ModInv = 3 +A = -33 +M = b + +ModInv = 9 +A = -32 +M = b + +ModInv = 2 +A = -31 +M = b + +ModInv = 8 +A = -30 +M = b + +ModInv = 7 +A = -2f +M = b + +ModInv = 5 +A = -2e +M = b + +ModInv = a +A = -2d +M = b + +ModInv = 1 +A = -2b +M = b + +ModInv = 6 +A = -2a +M = b + +ModInv = 4 +A = -29 +M = b + +ModInv = 3 +A = -28 +M = b + +ModInv = 9 +A = -27 +M = b + +ModInv = 2 +A = -26 +M = b + +ModInv = 8 +A = -25 +M = b + +ModInv = 7 +A = -24 +M = b + +ModInv = 5 +A = -23 +M = b + +ModInv = a +A = -22 +M = b + +ModInv = 1 +A = -20 +M = b + +ModInv = 6 +A = -1f +M = b + +ModInv = 4 +A = -1e +M = b + +ModInv = 3 +A = -1d +M = b + +ModInv = 9 +A = -1c +M = b + +ModInv = 2 +A = -1b +M = b + +ModInv = 8 +A = -1a +M = b + +ModInv = 7 +A = -19 +M = b + +ModInv = 5 +A = -18 +M = b + +ModInv = a +A = -17 +M = b + +ModInv = 1 +A = -15 +M = b + +ModInv = 6 +A = -14 +M = b + +ModInv = 4 +A = -13 +M = b + +ModInv = 3 +A = -12 +M = b + +ModInv = 9 +A = -11 +M = b + +ModInv = 2 +A = -10 +M = b + +ModInv = 8 +A = -f +M = b + +ModInv = 7 +A = -e +M = b + +ModInv = 5 +A = -d +M = b + +ModInv = a +A = -c +M = b + +ModInv = 1 +A = -a +M = b + +ModInv = 6 +A = -9 +M = b + +ModInv = 4 +A = -8 +M = b + +ModInv = 3 +A = -7 +M = b + +ModInv = 9 +A = -6 +M = b + +ModInv = 2 +A = -5 +M = b + +ModInv = 8 +A = -4 +M = b + +ModInv = 7 +A = -3 +M = b + +ModInv = 5 +A = -2 +M = b + +ModInv = a +A = -1 +M = b + +ModInv = 1 +A = 1 +M = b + +ModInv = 6 +A = 2 +M = b + +ModInv = 4 +A = 3 +M = b + +ModInv = 3 +A = 4 +M = b + +ModInv = 9 +A = 5 +M = b + +ModInv = 2 +A = 6 +M = b + +ModInv = 8 +A = 7 +M = b + +ModInv = 7 +A = 8 +M = b + +ModInv = 5 +A = 9 +M = b + +ModInv = a +A = a +M = b + +ModInv = 1 +A = c +M = b + +ModInv = 6 +A = d +M = b + +ModInv = 4 +A = e +M = b + +ModInv = 3 +A = f +M = b + +ModInv = 9 +A = 10 +M = b + +ModInv = 2 +A = 11 +M = b + +ModInv = 8 +A = 12 +M = b + +ModInv = 7 +A = 13 +M = b + +ModInv = 5 +A = 14 +M = b + +ModInv = a +A = 15 +M = b + +ModInv = 1 +A = 17 +M = b + +ModInv = 6 +A = 18 +M = b + +ModInv = 4 +A = 19 +M = b + +ModInv = 3 +A = 1a +M = b + +ModInv = 9 +A = 1b +M = b + +ModInv = 2 +A = 1c +M = b + +ModInv = 8 +A = 1d +M = b + +ModInv = 7 +A = 1e +M = b + +ModInv = 5 +A = 1f +M = b + +ModInv = a +A = 20 +M = b + +ModInv = 1 +A = 22 +M = b + +ModInv = 6 +A = 23 +M = b + +ModInv = 4 +A = 24 +M = b + +ModInv = 3 +A = 25 +M = b + +ModInv = 9 +A = 26 +M = b + +ModInv = 2 +A = 27 +M = b + +ModInv = 8 +A = 28 +M = b + +ModInv = 7 +A = 29 +M = b + +ModInv = 5 +A = 2a +M = b + +ModInv = a +A = 2b +M = b + +ModInv = 1 +A = 2d +M = b + +ModInv = 6 +A = 2e +M = b + +ModInv = 4 +A = 2f +M = b + +ModInv = 3 +A = 30 +M = b + +ModInv = 9 +A = 31 +M = b + +ModInv = 2 +A = 32 +M = b + +ModInv = 8 +A = 33 +M = b + +ModInv = 7 +A = 34 +M = b + +ModInv = 5 +A = 35 +M = b + +ModInv = a +A = 36 +M = b + +ModInv = 1 +A = 38 +M = b + +ModInv = 6 +A = 39 +M = b + +ModInv = 4 +A = 3a +M = b + +ModInv = 3 +A = 3b +M = b + +ModInv = 9 +A = 3c +M = b + +ModInv = 2 +A = 3d +M = b + +ModInv = 8 +A = 3e +M = b + +ModInv = 7 +A = 3f +M = b + +ModInv = 5 +A = 40 +M = b + +ModInv = a +A = 41 +M = b + +ModInv = 1 +A = 43 +M = b + +ModInv = 6 +A = 44 +M = b + +ModInv = 4 +A = 45 +M = b + +ModInv = 3 +A = 46 +M = b + +ModInv = 9 +A = 47 +M = b + +ModInv = 2 +A = 48 +M = b + +ModInv = 8 +A = 49 +M = b + +ModInv = 7 +A = 4a +M = b + +ModInv = 5 +A = 4b +M = b + +ModInv = a +A = 4c +M = b + +ModInv = 1 +A = 4e +M = b + +ModInv = 6 +A = 4f +M = b + +ModInv = 4 +A = 50 +M = b + +ModInv = 3 +A = 51 +M = b + +ModInv = 9 +A = 52 +M = b + +ModInv = 2 +A = 53 +M = b + +ModInv = 8 +A = 54 +M = b + +ModInv = 7 +A = 55 +M = b + +ModInv = 5 +A = 56 +M = b + +ModInv = a +A = 57 +M = b + +ModInv = 1 +A = 59 +M = b + +ModInv = 6 +A = 5a +M = b + +ModInv = 4 +A = 5b +M = b + +ModInv = 3 +A = 5c +M = b + +ModInv = 9 +A = 5d +M = b + +ModInv = 2 +A = 5e +M = b + +ModInv = 8 +A = 5f +M = b + +ModInv = 7 +A = 60 +M = b + +ModInv = 5 +A = 61 +M = b + +ModInv = a +A = 62 +M = b + +ModInv = b +A = -61 +M = c + +ModInv = 1 +A = -5f +M = c + +ModInv = 5 +A = -5b +M = c + +ModInv = 7 +A = -59 +M = c + +ModInv = b +A = -55 +M = c + +ModInv = 1 +A = -53 +M = c + +ModInv = 5 +A = -4f +M = c + +ModInv = 7 +A = -4d +M = c + +ModInv = b +A = -49 +M = c + +ModInv = 1 +A = -47 +M = c + +ModInv = 5 +A = -43 +M = c + +ModInv = 7 +A = -41 +M = c + +ModInv = b +A = -3d +M = c + +ModInv = 1 +A = -3b +M = c + +ModInv = 5 +A = -37 +M = c + +ModInv = 7 +A = -35 +M = c + +ModInv = b +A = -31 +M = c + +ModInv = 1 +A = -2f +M = c + +ModInv = 5 +A = -2b +M = c + +ModInv = 7 +A = -29 +M = c + +ModInv = b +A = -25 +M = c + +ModInv = 1 +A = -23 +M = c + +ModInv = 5 +A = -1f +M = c + +ModInv = 7 +A = -1d +M = c + +ModInv = b +A = -19 +M = c + +ModInv = 1 +A = -17 +M = c + +ModInv = 5 +A = -13 +M = c + +ModInv = 7 +A = -11 +M = c + +ModInv = b +A = -d +M = c + +ModInv = 1 +A = -b +M = c + +ModInv = 5 +A = -7 +M = c + +ModInv = 7 +A = -5 +M = c + +ModInv = b +A = -1 +M = c + +ModInv = 1 +A = 1 +M = c + +ModInv = 5 +A = 5 +M = c + +ModInv = 7 +A = 7 +M = c + +ModInv = b +A = b +M = c + +ModInv = 1 +A = d +M = c + +ModInv = 5 +A = 11 +M = c + +ModInv = 7 +A = 13 +M = c + +ModInv = b +A = 17 +M = c + +ModInv = 1 +A = 19 +M = c + +ModInv = 5 +A = 1d +M = c + +ModInv = 7 +A = 1f +M = c + +ModInv = b +A = 23 +M = c + +ModInv = 1 +A = 25 +M = c + +ModInv = 5 +A = 29 +M = c + +ModInv = 7 +A = 2b +M = c + +ModInv = b +A = 2f +M = c + +ModInv = 1 +A = 31 +M = c + +ModInv = 5 +A = 35 +M = c + +ModInv = 7 +A = 37 +M = c + +ModInv = b +A = 3b +M = c + +ModInv = 1 +A = 3d +M = c + +ModInv = 5 +A = 41 +M = c + +ModInv = 7 +A = 43 +M = c + +ModInv = b +A = 47 +M = c + +ModInv = 1 +A = 49 +M = c + +ModInv = 5 +A = 4d +M = c + +ModInv = 7 +A = 4f +M = c + +ModInv = b +A = 53 +M = c + +ModInv = 1 +A = 55 +M = c + +ModInv = 5 +A = 59 +M = c + +ModInv = 7 +A = 5b +M = c + +ModInv = b +A = 5f +M = c + +ModInv = 1 +A = 61 +M = c + +ModInv = a +A = -64 +M = d + +ModInv = 8 +A = -63 +M = d + +ModInv = b +A = -62 +M = d + +ModInv = 2 +A = -61 +M = d + +ModInv = 5 +A = -60 +M = d + +ModInv = 3 +A = -5f +M = d + +ModInv = 4 +A = -5e +M = d + +ModInv = 6 +A = -5d +M = d + +ModInv = c +A = -5c +M = d + +ModInv = 1 +A = -5a +M = d + +ModInv = 7 +A = -59 +M = d + +ModInv = 9 +A = -58 +M = d + +ModInv = a +A = -57 +M = d + +ModInv = 8 +A = -56 +M = d + +ModInv = b +A = -55 +M = d + +ModInv = 2 +A = -54 +M = d + +ModInv = 5 +A = -53 +M = d + +ModInv = 3 +A = -52 +M = d + +ModInv = 4 +A = -51 +M = d + +ModInv = 6 +A = -50 +M = d + +ModInv = c +A = -4f +M = d + +ModInv = 1 +A = -4d +M = d + +ModInv = 7 +A = -4c +M = d + +ModInv = 9 +A = -4b +M = d + +ModInv = a +A = -4a +M = d + +ModInv = 8 +A = -49 +M = d + +ModInv = b +A = -48 +M = d + +ModInv = 2 +A = -47 +M = d + +ModInv = 5 +A = -46 +M = d + +ModInv = 3 +A = -45 +M = d + +ModInv = 4 +A = -44 +M = d + +ModInv = 6 +A = -43 +M = d + +ModInv = c +A = -42 +M = d + +ModInv = 1 +A = -40 +M = d + +ModInv = 7 +A = -3f +M = d + +ModInv = 9 +A = -3e +M = d + +ModInv = a +A = -3d +M = d + +ModInv = 8 +A = -3c +M = d + +ModInv = b +A = -3b +M = d + +ModInv = 2 +A = -3a +M = d + +ModInv = 5 +A = -39 +M = d + +ModInv = 3 +A = -38 +M = d + +ModInv = 4 +A = -37 +M = d + +ModInv = 6 +A = -36 +M = d + +ModInv = c +A = -35 +M = d + +ModInv = 1 +A = -33 +M = d + +ModInv = 7 +A = -32 +M = d + +ModInv = 9 +A = -31 +M = d + +ModInv = a +A = -30 +M = d + +ModInv = 8 +A = -2f +M = d + +ModInv = b +A = -2e +M = d + +ModInv = 2 +A = -2d +M = d + +ModInv = 5 +A = -2c +M = d + +ModInv = 3 +A = -2b +M = d + +ModInv = 4 +A = -2a +M = d + +ModInv = 6 +A = -29 +M = d + +ModInv = c +A = -28 +M = d + +ModInv = 1 +A = -26 +M = d + +ModInv = 7 +A = -25 +M = d + +ModInv = 9 +A = -24 +M = d + +ModInv = a +A = -23 +M = d + +ModInv = 8 +A = -22 +M = d + +ModInv = b +A = -21 +M = d + +ModInv = 2 +A = -20 +M = d + +ModInv = 5 +A = -1f +M = d + +ModInv = 3 +A = -1e +M = d + +ModInv = 4 +A = -1d +M = d + +ModInv = 6 +A = -1c +M = d + +ModInv = c +A = -1b +M = d + +ModInv = 1 +A = -19 +M = d + +ModInv = 7 +A = -18 +M = d + +ModInv = 9 +A = -17 +M = d + +ModInv = a +A = -16 +M = d + +ModInv = 8 +A = -15 +M = d + +ModInv = b +A = -14 +M = d + +ModInv = 2 +A = -13 +M = d + +ModInv = 5 +A = -12 +M = d + +ModInv = 3 +A = -11 +M = d + +ModInv = 4 +A = -10 +M = d + +ModInv = 6 +A = -f +M = d + +ModInv = c +A = -e +M = d + +ModInv = 1 +A = -c +M = d + +ModInv = 7 +A = -b +M = d + +ModInv = 9 +A = -a +M = d + +ModInv = a +A = -9 +M = d + +ModInv = 8 +A = -8 +M = d + +ModInv = b +A = -7 +M = d + +ModInv = 2 +A = -6 +M = d + +ModInv = 5 +A = -5 +M = d + +ModInv = 3 +A = -4 +M = d + +ModInv = 4 +A = -3 +M = d + +ModInv = 6 +A = -2 +M = d + +ModInv = c +A = -1 +M = d + +ModInv = 1 +A = 1 +M = d + +ModInv = 7 +A = 2 +M = d + +ModInv = 9 +A = 3 +M = d + +ModInv = a +A = 4 +M = d + +ModInv = 8 +A = 5 +M = d + +ModInv = b +A = 6 +M = d + +ModInv = 2 +A = 7 +M = d + +ModInv = 5 +A = 8 +M = d + +ModInv = 3 +A = 9 +M = d + +ModInv = 4 +A = a +M = d + +ModInv = 6 +A = b +M = d + +ModInv = c +A = c +M = d + +ModInv = 1 +A = e +M = d + +ModInv = 7 +A = f +M = d + +ModInv = 9 +A = 10 +M = d + +ModInv = a +A = 11 +M = d + +ModInv = 8 +A = 12 +M = d + +ModInv = b +A = 13 +M = d + +ModInv = 2 +A = 14 +M = d + +ModInv = 5 +A = 15 +M = d + +ModInv = 3 +A = 16 +M = d + +ModInv = 4 +A = 17 +M = d + +ModInv = 6 +A = 18 +M = d + +ModInv = c +A = 19 +M = d + +ModInv = 1 +A = 1b +M = d + +ModInv = 7 +A = 1c +M = d + +ModInv = 9 +A = 1d +M = d + +ModInv = a +A = 1e +M = d + +ModInv = 8 +A = 1f +M = d + +ModInv = b +A = 20 +M = d + +ModInv = 2 +A = 21 +M = d + +ModInv = 5 +A = 22 +M = d + +ModInv = 3 +A = 23 +M = d + +ModInv = 4 +A = 24 +M = d + +ModInv = 6 +A = 25 +M = d + +ModInv = c +A = 26 +M = d + +ModInv = 1 +A = 28 +M = d + +ModInv = 7 +A = 29 +M = d + +ModInv = 9 +A = 2a +M = d + +ModInv = a +A = 2b +M = d + +ModInv = 8 +A = 2c +M = d + +ModInv = b +A = 2d +M = d + +ModInv = 2 +A = 2e +M = d + +ModInv = 5 +A = 2f +M = d + +ModInv = 3 +A = 30 +M = d + +ModInv = 4 +A = 31 +M = d + +ModInv = 6 +A = 32 +M = d + +ModInv = c +A = 33 +M = d + +ModInv = 1 +A = 35 +M = d + +ModInv = 7 +A = 36 +M = d + +ModInv = 9 +A = 37 +M = d + +ModInv = a +A = 38 +M = d + +ModInv = 8 +A = 39 +M = d + +ModInv = b +A = 3a +M = d + +ModInv = 2 +A = 3b +M = d + +ModInv = 5 +A = 3c +M = d + +ModInv = 3 +A = 3d +M = d + +ModInv = 4 +A = 3e +M = d + +ModInv = 6 +A = 3f +M = d + +ModInv = c +A = 40 +M = d + +ModInv = 1 +A = 42 +M = d + +ModInv = 7 +A = 43 +M = d + +ModInv = 9 +A = 44 +M = d + +ModInv = a +A = 45 +M = d + +ModInv = 8 +A = 46 +M = d + +ModInv = b +A = 47 +M = d + +ModInv = 2 +A = 48 +M = d + +ModInv = 5 +A = 49 +M = d + +ModInv = 3 +A = 4a +M = d + +ModInv = 4 +A = 4b +M = d + +ModInv = 6 +A = 4c +M = d + +ModInv = c +A = 4d +M = d + +ModInv = 1 +A = 4f +M = d + +ModInv = 7 +A = 50 +M = d + +ModInv = 9 +A = 51 +M = d + +ModInv = a +A = 52 +M = d + +ModInv = 8 +A = 53 +M = d + +ModInv = b +A = 54 +M = d + +ModInv = 2 +A = 55 +M = d + +ModInv = 5 +A = 56 +M = d + +ModInv = 3 +A = 57 +M = d + +ModInv = 4 +A = 58 +M = d + +ModInv = 6 +A = 59 +M = d + +ModInv = c +A = 5a +M = d + +ModInv = 1 +A = 5c +M = d + +ModInv = 7 +A = 5d +M = d + +ModInv = 9 +A = 5e +M = d + +ModInv = a +A = 5f +M = d + +ModInv = 8 +A = 60 +M = d + +ModInv = b +A = 61 +M = d + +ModInv = 2 +A = 62 +M = d + +ModInv = 5 +A = 63 +M = d + +ModInv = d +A = -63 +M = e + +ModInv = 1 +A = -61 +M = e + +ModInv = 5 +A = -5f +M = e + +ModInv = 3 +A = -5d +M = e + +ModInv = b +A = -59 +M = e + +ModInv = 9 +A = -57 +M = e + +ModInv = d +A = -55 +M = e + +ModInv = 1 +A = -53 +M = e + +ModInv = 5 +A = -51 +M = e + +ModInv = 3 +A = -4f +M = e + +ModInv = b +A = -4b +M = e + +ModInv = 9 +A = -49 +M = e + +ModInv = d +A = -47 +M = e + +ModInv = 1 +A = -45 +M = e + +ModInv = 5 +A = -43 +M = e + +ModInv = 3 +A = -41 +M = e + +ModInv = b +A = -3d +M = e + +ModInv = 9 +A = -3b +M = e + +ModInv = d +A = -39 +M = e + +ModInv = 1 +A = -37 +M = e + +ModInv = 5 +A = -35 +M = e + +ModInv = 3 +A = -33 +M = e + +ModInv = b +A = -2f +M = e + +ModInv = 9 +A = -2d +M = e + +ModInv = d +A = -2b +M = e + +ModInv = 1 +A = -29 +M = e + +ModInv = 5 +A = -27 +M = e + +ModInv = 3 +A = -25 +M = e + +ModInv = b +A = -21 +M = e + +ModInv = 9 +A = -1f +M = e + +ModInv = d +A = -1d +M = e + +ModInv = 1 +A = -1b +M = e + +ModInv = 5 +A = -19 +M = e + +ModInv = 3 +A = -17 +M = e + +ModInv = b +A = -13 +M = e + +ModInv = 9 +A = -11 +M = e + +ModInv = d +A = -f +M = e + +ModInv = 1 +A = -d +M = e + +ModInv = 5 +A = -b +M = e + +ModInv = 3 +A = -9 +M = e + +ModInv = b +A = -5 +M = e + +ModInv = 9 +A = -3 +M = e + +ModInv = d +A = -1 +M = e + +ModInv = 1 +A = 1 +M = e + +ModInv = 5 +A = 3 +M = e + +ModInv = 3 +A = 5 +M = e + +ModInv = b +A = 9 +M = e + +ModInv = 9 +A = b +M = e + +ModInv = d +A = d +M = e + +ModInv = 1 +A = f +M = e + +ModInv = 5 +A = 11 +M = e + +ModInv = 3 +A = 13 +M = e + +ModInv = b +A = 17 +M = e + +ModInv = 9 +A = 19 +M = e + +ModInv = d +A = 1b +M = e + +ModInv = 1 +A = 1d +M = e + +ModInv = 5 +A = 1f +M = e + +ModInv = 3 +A = 21 +M = e + +ModInv = b +A = 25 +M = e + +ModInv = 9 +A = 27 +M = e + +ModInv = d +A = 29 +M = e + +ModInv = 1 +A = 2b +M = e + +ModInv = 5 +A = 2d +M = e + +ModInv = 3 +A = 2f +M = e + +ModInv = b +A = 33 +M = e + +ModInv = 9 +A = 35 +M = e + +ModInv = d +A = 37 +M = e + +ModInv = 1 +A = 39 +M = e + +ModInv = 5 +A = 3b +M = e + +ModInv = 3 +A = 3d +M = e + +ModInv = b +A = 41 +M = e + +ModInv = 9 +A = 43 +M = e + +ModInv = d +A = 45 +M = e + +ModInv = 1 +A = 47 +M = e + +ModInv = 5 +A = 49 +M = e + +ModInv = 3 +A = 4b +M = e + +ModInv = b +A = 4f +M = e + +ModInv = 9 +A = 51 +M = e + +ModInv = d +A = 53 +M = e + +ModInv = 1 +A = 55 +M = e + +ModInv = 5 +A = 57 +M = e + +ModInv = 3 +A = 59 +M = e + +ModInv = b +A = 5d +M = e + +ModInv = 9 +A = 5f +M = e + +ModInv = d +A = 61 +M = e + +ModInv = 1 +A = 63 +M = e + +ModInv = d +A = -62 +M = f + +ModInv = 2 +A = -61 +M = f + +ModInv = b +A = -5e +M = f + +ModInv = 7 +A = -5c +M = f + +ModInv = e +A = -5b +M = f + +ModInv = 1 +A = -59 +M = f + +ModInv = 8 +A = -58 +M = f + +ModInv = 4 +A = -56 +M = f + +ModInv = d +A = -53 +M = f + +ModInv = 2 +A = -52 +M = f + +ModInv = b +A = -4f +M = f + +ModInv = 7 +A = -4d +M = f + +ModInv = e +A = -4c +M = f + +ModInv = 1 +A = -4a +M = f + +ModInv = 8 +A = -49 +M = f + +ModInv = 4 +A = -47 +M = f + +ModInv = d +A = -44 +M = f + +ModInv = 2 +A = -43 +M = f + +ModInv = b +A = -40 +M = f + +ModInv = 7 +A = -3e +M = f + +ModInv = e +A = -3d +M = f + +ModInv = 1 +A = -3b +M = f + +ModInv = 8 +A = -3a +M = f + +ModInv = 4 +A = -38 +M = f + +ModInv = d +A = -35 +M = f + +ModInv = 2 +A = -34 +M = f + +ModInv = b +A = -31 +M = f + +ModInv = 7 +A = -2f +M = f + +ModInv = e +A = -2e +M = f + +ModInv = 1 +A = -2c +M = f + +ModInv = 8 +A = -2b +M = f + +ModInv = 4 +A = -29 +M = f + +ModInv = d +A = -26 +M = f + +ModInv = 2 +A = -25 +M = f + +ModInv = b +A = -22 +M = f + +ModInv = 7 +A = -20 +M = f + +ModInv = e +A = -1f +M = f + +ModInv = 1 +A = -1d +M = f + +ModInv = 8 +A = -1c +M = f + +ModInv = 4 +A = -1a +M = f + +ModInv = d +A = -17 +M = f + +ModInv = 2 +A = -16 +M = f + +ModInv = b +A = -13 +M = f + +ModInv = 7 +A = -11 +M = f + +ModInv = e +A = -10 +M = f + +ModInv = 1 +A = -e +M = f + +ModInv = 8 +A = -d +M = f + +ModInv = 4 +A = -b +M = f + +ModInv = d +A = -8 +M = f + +ModInv = 2 +A = -7 +M = f + +ModInv = b +A = -4 +M = f + +ModInv = 7 +A = -2 +M = f + +ModInv = e +A = -1 +M = f + +ModInv = 1 +A = 1 +M = f + +ModInv = 8 +A = 2 +M = f + +ModInv = 4 +A = 4 +M = f + +ModInv = d +A = 7 +M = f + +ModInv = 2 +A = 8 +M = f + +ModInv = b +A = b +M = f + +ModInv = 7 +A = d +M = f + +ModInv = e +A = e +M = f + +ModInv = 1 +A = 10 +M = f + +ModInv = 8 +A = 11 +M = f + +ModInv = 4 +A = 13 +M = f + +ModInv = d +A = 16 +M = f + +ModInv = 2 +A = 17 +M = f + +ModInv = b +A = 1a +M = f + +ModInv = 7 +A = 1c +M = f + +ModInv = e +A = 1d +M = f + +ModInv = 1 +A = 1f +M = f + +ModInv = 8 +A = 20 +M = f + +ModInv = 4 +A = 22 +M = f + +ModInv = d +A = 25 +M = f + +ModInv = 2 +A = 26 +M = f + +ModInv = b +A = 29 +M = f + +ModInv = 7 +A = 2b +M = f + +ModInv = e +A = 2c +M = f + +ModInv = 1 +A = 2e +M = f + +ModInv = 8 +A = 2f +M = f + +ModInv = 4 +A = 31 +M = f + +ModInv = d +A = 34 +M = f + +ModInv = 2 +A = 35 +M = f + +ModInv = b +A = 38 +M = f + +ModInv = 7 +A = 3a +M = f + +ModInv = e +A = 3b +M = f + +ModInv = 1 +A = 3d +M = f + +ModInv = 8 +A = 3e +M = f + +ModInv = 4 +A = 40 +M = f + +ModInv = d +A = 43 +M = f + +ModInv = 2 +A = 44 +M = f + +ModInv = b +A = 47 +M = f + +ModInv = 7 +A = 49 +M = f + +ModInv = e +A = 4a +M = f + +ModInv = 1 +A = 4c +M = f + +ModInv = 8 +A = 4d +M = f + +ModInv = 4 +A = 4f +M = f + +ModInv = d +A = 52 +M = f + +ModInv = 2 +A = 53 +M = f + +ModInv = b +A = 56 +M = f + +ModInv = 7 +A = 58 +M = f + +ModInv = e +A = 59 +M = f + +ModInv = 1 +A = 5b +M = f + +ModInv = 8 +A = 5c +M = f + +ModInv = 4 +A = 5e +M = f + +ModInv = d +A = 61 +M = f + +ModInv = 2 +A = 62 +M = f + +ModInv = 5 +A = -63 +M = 10 + +ModInv = f +A = -61 +M = 10 + +ModInv = 1 +A = -5f +M = 10 + +ModInv = b +A = -5d +M = 10 + +ModInv = d +A = -5b +M = 10 + +ModInv = 7 +A = -59 +M = 10 + +ModInv = 9 +A = -57 +M = 10 + +ModInv = 3 +A = -55 +M = 10 + +ModInv = 5 +A = -53 +M = 10 + +ModInv = f +A = -51 +M = 10 + +ModInv = 1 +A = -4f +M = 10 + +ModInv = b +A = -4d +M = 10 + +ModInv = d +A = -4b +M = 10 + +ModInv = 7 +A = -49 +M = 10 + +ModInv = 9 +A = -47 +M = 10 + +ModInv = 3 +A = -45 +M = 10 + +ModInv = 5 +A = -43 +M = 10 + +ModInv = f +A = -41 +M = 10 + +ModInv = 1 +A = -3f +M = 10 + +ModInv = b +A = -3d +M = 10 + +ModInv = d +A = -3b +M = 10 + +ModInv = 7 +A = -39 +M = 10 + +ModInv = 9 +A = -37 +M = 10 + +ModInv = 3 +A = -35 +M = 10 + +ModInv = 5 +A = -33 +M = 10 + +ModInv = f +A = -31 +M = 10 + +ModInv = 1 +A = -2f +M = 10 + +ModInv = b +A = -2d +M = 10 + +ModInv = d +A = -2b +M = 10 + +ModInv = 7 +A = -29 +M = 10 + +ModInv = 9 +A = -27 +M = 10 + +ModInv = 3 +A = -25 +M = 10 + +ModInv = 5 +A = -23 +M = 10 + +ModInv = f +A = -21 +M = 10 + +ModInv = 1 +A = -1f +M = 10 + +ModInv = b +A = -1d +M = 10 + +ModInv = d +A = -1b +M = 10 + +ModInv = 7 +A = -19 +M = 10 + +ModInv = 9 +A = -17 +M = 10 + +ModInv = 3 +A = -15 +M = 10 + +ModInv = 5 +A = -13 +M = 10 + +ModInv = f +A = -11 +M = 10 + +ModInv = 1 +A = -f +M = 10 + +ModInv = b +A = -d +M = 10 + +ModInv = d +A = -b +M = 10 + +ModInv = 7 +A = -9 +M = 10 + +ModInv = 9 +A = -7 +M = 10 + +ModInv = 3 +A = -5 +M = 10 + +ModInv = 5 +A = -3 +M = 10 + +ModInv = f +A = -1 +M = 10 + +ModInv = 1 +A = 1 +M = 10 + +ModInv = b +A = 3 +M = 10 + +ModInv = d +A = 5 +M = 10 + +ModInv = 7 +A = 7 +M = 10 + +ModInv = 9 +A = 9 +M = 10 + +ModInv = 3 +A = b +M = 10 + +ModInv = 5 +A = d +M = 10 + +ModInv = f +A = f +M = 10 + +ModInv = 1 +A = 11 +M = 10 + +ModInv = b +A = 13 +M = 10 + +ModInv = d +A = 15 +M = 10 + +ModInv = 7 +A = 17 +M = 10 + +ModInv = 9 +A = 19 +M = 10 + +ModInv = 3 +A = 1b +M = 10 + +ModInv = 5 +A = 1d +M = 10 + +ModInv = f +A = 1f +M = 10 + +ModInv = 1 +A = 21 +M = 10 + +ModInv = b +A = 23 +M = 10 + +ModInv = d +A = 25 +M = 10 + +ModInv = 7 +A = 27 +M = 10 + +ModInv = 9 +A = 29 +M = 10 + +ModInv = 3 +A = 2b +M = 10 + +ModInv = 5 +A = 2d +M = 10 + +ModInv = f +A = 2f +M = 10 + +ModInv = 1 +A = 31 +M = 10 + +ModInv = b +A = 33 +M = 10 + +ModInv = d +A = 35 +M = 10 + +ModInv = 7 +A = 37 +M = 10 + +ModInv = 9 +A = 39 +M = 10 + +ModInv = 3 +A = 3b +M = 10 + +ModInv = 5 +A = 3d +M = 10 + +ModInv = f +A = 3f +M = 10 + +ModInv = 1 +A = 41 +M = 10 + +ModInv = b +A = 43 +M = 10 + +ModInv = d +A = 45 +M = 10 + +ModInv = 7 +A = 47 +M = 10 + +ModInv = 9 +A = 49 +M = 10 + +ModInv = 3 +A = 4b +M = 10 + +ModInv = 5 +A = 4d +M = 10 + +ModInv = f +A = 4f +M = 10 + +ModInv = 1 +A = 51 +M = 10 + +ModInv = b +A = 53 +M = 10 + +ModInv = d +A = 55 +M = 10 + +ModInv = 7 +A = 57 +M = 10 + +ModInv = 9 +A = 59 +M = 10 + +ModInv = 3 +A = 5b +M = 10 + +ModInv = 5 +A = 5d +M = 10 + +ModInv = f +A = 5f +M = 10 + +ModInv = 1 +A = 61 +M = 10 + +ModInv = b +A = 63 +M = 10 + +ModInv = 9 +A = -64 +M = 11 + +ModInv = 6 +A = -63 +M = 11 + +ModInv = d +A = -62 +M = 11 + +ModInv = 7 +A = -61 +M = 11 + +ModInv = 3 +A = -60 +M = 11 + +ModInv = 5 +A = -5f +M = 11 + +ModInv = f +A = -5e +M = 11 + +ModInv = 2 +A = -5d +M = 11 + +ModInv = c +A = -5c +M = 11 + +ModInv = e +A = -5b +M = 11 + +ModInv = a +A = -5a +M = 11 + +ModInv = 4 +A = -59 +M = 11 + +ModInv = b +A = -58 +M = 11 + +ModInv = 8 +A = -57 +M = 11 + +ModInv = 10 +A = -56 +M = 11 + +ModInv = 1 +A = -54 +M = 11 + +ModInv = 9 +A = -53 +M = 11 + +ModInv = 6 +A = -52 +M = 11 + +ModInv = d +A = -51 +M = 11 + +ModInv = 7 +A = -50 +M = 11 + +ModInv = 3 +A = -4f +M = 11 + +ModInv = 5 +A = -4e +M = 11 + +ModInv = f +A = -4d +M = 11 + +ModInv = 2 +A = -4c +M = 11 + +ModInv = c +A = -4b +M = 11 + +ModInv = e +A = -4a +M = 11 + +ModInv = a +A = -49 +M = 11 + +ModInv = 4 +A = -48 +M = 11 + +ModInv = b +A = -47 +M = 11 + +ModInv = 8 +A = -46 +M = 11 + +ModInv = 10 +A = -45 +M = 11 + +ModInv = 1 +A = -43 +M = 11 + +ModInv = 9 +A = -42 +M = 11 + +ModInv = 6 +A = -41 +M = 11 + +ModInv = d +A = -40 +M = 11 + +ModInv = 7 +A = -3f +M = 11 + +ModInv = 3 +A = -3e +M = 11 + +ModInv = 5 +A = -3d +M = 11 + +ModInv = f +A = -3c +M = 11 + +ModInv = 2 +A = -3b +M = 11 + +ModInv = c +A = -3a +M = 11 + +ModInv = e +A = -39 +M = 11 + +ModInv = a +A = -38 +M = 11 + +ModInv = 4 +A = -37 +M = 11 + +ModInv = b +A = -36 +M = 11 + +ModInv = 8 +A = -35 +M = 11 + +ModInv = 10 +A = -34 +M = 11 + +ModInv = 1 +A = -32 +M = 11 + +ModInv = 9 +A = -31 +M = 11 + +ModInv = 6 +A = -30 +M = 11 + +ModInv = d +A = -2f +M = 11 + +ModInv = 7 +A = -2e +M = 11 + +ModInv = 3 +A = -2d +M = 11 + +ModInv = 5 +A = -2c +M = 11 + +ModInv = f +A = -2b +M = 11 + +ModInv = 2 +A = -2a +M = 11 + +ModInv = c +A = -29 +M = 11 + +ModInv = e +A = -28 +M = 11 + +ModInv = a +A = -27 +M = 11 + +ModInv = 4 +A = -26 +M = 11 + +ModInv = b +A = -25 +M = 11 + +ModInv = 8 +A = -24 +M = 11 + +ModInv = 10 +A = -23 +M = 11 + +ModInv = 1 +A = -21 +M = 11 + +ModInv = 9 +A = -20 +M = 11 + +ModInv = 6 +A = -1f +M = 11 + +ModInv = d +A = -1e +M = 11 + +ModInv = 7 +A = -1d +M = 11 + +ModInv = 3 +A = -1c +M = 11 + +ModInv = 5 +A = -1b +M = 11 + +ModInv = f +A = -1a +M = 11 + +ModInv = 2 +A = -19 +M = 11 + +ModInv = c +A = -18 +M = 11 + +ModInv = e +A = -17 +M = 11 + +ModInv = a +A = -16 +M = 11 + +ModInv = 4 +A = -15 +M = 11 + +ModInv = b +A = -14 +M = 11 + +ModInv = 8 +A = -13 +M = 11 + +ModInv = 10 +A = -12 +M = 11 + +ModInv = 1 +A = -10 +M = 11 + +ModInv = 9 +A = -f +M = 11 + +ModInv = 6 +A = -e +M = 11 + +ModInv = d +A = -d +M = 11 + +ModInv = 7 +A = -c +M = 11 + +ModInv = 3 +A = -b +M = 11 + +ModInv = 5 +A = -a +M = 11 + +ModInv = f +A = -9 +M = 11 + +ModInv = 2 +A = -8 +M = 11 + +ModInv = c +A = -7 +M = 11 + +ModInv = e +A = -6 +M = 11 + +ModInv = a +A = -5 +M = 11 + +ModInv = 4 +A = -4 +M = 11 + +ModInv = b +A = -3 +M = 11 + +ModInv = 8 +A = -2 +M = 11 + +ModInv = 10 +A = -1 +M = 11 + +ModInv = 1 +A = 1 +M = 11 + +ModInv = 9 +A = 2 +M = 11 + +ModInv = 6 +A = 3 +M = 11 + +ModInv = d +A = 4 +M = 11 + +ModInv = 7 +A = 5 +M = 11 + +ModInv = 3 +A = 6 +M = 11 + +ModInv = 5 +A = 7 +M = 11 + +ModInv = f +A = 8 +M = 11 + +ModInv = 2 +A = 9 +M = 11 + +ModInv = c +A = a +M = 11 + +ModInv = e +A = b +M = 11 + +ModInv = a +A = c +M = 11 + +ModInv = 4 +A = d +M = 11 + +ModInv = b +A = e +M = 11 + +ModInv = 8 +A = f +M = 11 + +ModInv = 10 +A = 10 +M = 11 + +ModInv = 1 +A = 12 +M = 11 + +ModInv = 9 +A = 13 +M = 11 + +ModInv = 6 +A = 14 +M = 11 + +ModInv = d +A = 15 +M = 11 + +ModInv = 7 +A = 16 +M = 11 + +ModInv = 3 +A = 17 +M = 11 + +ModInv = 5 +A = 18 +M = 11 + +ModInv = f +A = 19 +M = 11 + +ModInv = 2 +A = 1a +M = 11 + +ModInv = c +A = 1b +M = 11 + +ModInv = e +A = 1c +M = 11 + +ModInv = a +A = 1d +M = 11 + +ModInv = 4 +A = 1e +M = 11 + +ModInv = b +A = 1f +M = 11 + +ModInv = 8 +A = 20 +M = 11 + +ModInv = 10 +A = 21 +M = 11 + +ModInv = 1 +A = 23 +M = 11 + +ModInv = 9 +A = 24 +M = 11 + +ModInv = 6 +A = 25 +M = 11 + +ModInv = d +A = 26 +M = 11 + +ModInv = 7 +A = 27 +M = 11 + +ModInv = 3 +A = 28 +M = 11 + +ModInv = 5 +A = 29 +M = 11 + +ModInv = f +A = 2a +M = 11 + +ModInv = 2 +A = 2b +M = 11 + +ModInv = c +A = 2c +M = 11 + +ModInv = e +A = 2d +M = 11 + +ModInv = a +A = 2e +M = 11 + +ModInv = 4 +A = 2f +M = 11 + +ModInv = b +A = 30 +M = 11 + +ModInv = 8 +A = 31 +M = 11 + +ModInv = 10 +A = 32 +M = 11 + +ModInv = 1 +A = 34 +M = 11 + +ModInv = 9 +A = 35 +M = 11 + +ModInv = 6 +A = 36 +M = 11 + +ModInv = d +A = 37 +M = 11 + +ModInv = 7 +A = 38 +M = 11 + +ModInv = 3 +A = 39 +M = 11 + +ModInv = 5 +A = 3a +M = 11 + +ModInv = f +A = 3b +M = 11 + +ModInv = 2 +A = 3c +M = 11 + +ModInv = c +A = 3d +M = 11 + +ModInv = e +A = 3e +M = 11 + +ModInv = a +A = 3f +M = 11 + +ModInv = 4 +A = 40 +M = 11 + +ModInv = b +A = 41 +M = 11 + +ModInv = 8 +A = 42 +M = 11 + +ModInv = 10 +A = 43 +M = 11 + +ModInv = 1 +A = 45 +M = 11 + +ModInv = 9 +A = 46 +M = 11 + +ModInv = 6 +A = 47 +M = 11 + +ModInv = d +A = 48 +M = 11 + +ModInv = 7 +A = 49 +M = 11 + +ModInv = 3 +A = 4a +M = 11 + +ModInv = 5 +A = 4b +M = 11 + +ModInv = f +A = 4c +M = 11 + +ModInv = 2 +A = 4d +M = 11 + +ModInv = c +A = 4e +M = 11 + +ModInv = e +A = 4f +M = 11 + +ModInv = a +A = 50 +M = 11 + +ModInv = 4 +A = 51 +M = 11 + +ModInv = b +A = 52 +M = 11 + +ModInv = 8 +A = 53 +M = 11 + +ModInv = 10 +A = 54 +M = 11 + +ModInv = 1 +A = 56 +M = 11 + +ModInv = 9 +A = 57 +M = 11 + +ModInv = 6 +A = 58 +M = 11 + +ModInv = d +A = 59 +M = 11 + +ModInv = 7 +A = 5a +M = 11 + +ModInv = 3 +A = 5b +M = 11 + +ModInv = 5 +A = 5c +M = 11 + +ModInv = f +A = 5d +M = 11 + +ModInv = 2 +A = 5e +M = 11 + +ModInv = c +A = 5f +M = 11 + +ModInv = e +A = 60 +M = 11 + +ModInv = a +A = 61 +M = 11 + +ModInv = 4 +A = 62 +M = 11 + +ModInv = b +A = 63 +M = 11 + +ModInv = 5 +A = -61 +M = 12 + +ModInv = 7 +A = -5f +M = 12 + +ModInv = 11 +A = -5b +M = 12 + +ModInv = 1 +A = -59 +M = 12 + +ModInv = b +A = -55 +M = 12 + +ModInv = d +A = -53 +M = 12 + +ModInv = 5 +A = -4f +M = 12 + +ModInv = 7 +A = -4d +M = 12 + +ModInv = 11 +A = -49 +M = 12 + +ModInv = 1 +A = -47 +M = 12 + +ModInv = b +A = -43 +M = 12 + +ModInv = d +A = -41 +M = 12 + +ModInv = 5 +A = -3d +M = 12 + +ModInv = 7 +A = -3b +M = 12 + +ModInv = 11 +A = -37 +M = 12 + +ModInv = 1 +A = -35 +M = 12 + +ModInv = b +A = -31 +M = 12 + +ModInv = d +A = -2f +M = 12 + +ModInv = 5 +A = -2b +M = 12 + +ModInv = 7 +A = -29 +M = 12 + +ModInv = 11 +A = -25 +M = 12 + +ModInv = 1 +A = -23 +M = 12 + +ModInv = b +A = -1f +M = 12 + +ModInv = d +A = -1d +M = 12 + +ModInv = 5 +A = -19 +M = 12 + +ModInv = 7 +A = -17 +M = 12 + +ModInv = 11 +A = -13 +M = 12 + +ModInv = 1 +A = -11 +M = 12 + +ModInv = b +A = -d +M = 12 + +ModInv = d +A = -b +M = 12 + +ModInv = 5 +A = -7 +M = 12 + +ModInv = 7 +A = -5 +M = 12 + +ModInv = 11 +A = -1 +M = 12 + +ModInv = 1 +A = 1 +M = 12 + +ModInv = b +A = 5 +M = 12 + +ModInv = d +A = 7 +M = 12 + +ModInv = 5 +A = b +M = 12 + +ModInv = 7 +A = d +M = 12 + +ModInv = 11 +A = 11 +M = 12 + +ModInv = 1 +A = 13 +M = 12 + +ModInv = b +A = 17 +M = 12 + +ModInv = d +A = 19 +M = 12 + +ModInv = 5 +A = 1d +M = 12 + +ModInv = 7 +A = 1f +M = 12 + +ModInv = 11 +A = 23 +M = 12 + +ModInv = 1 +A = 25 +M = 12 + +ModInv = b +A = 29 +M = 12 + +ModInv = d +A = 2b +M = 12 + +ModInv = 5 +A = 2f +M = 12 + +ModInv = 7 +A = 31 +M = 12 + +ModInv = 11 +A = 35 +M = 12 + +ModInv = 1 +A = 37 +M = 12 + +ModInv = b +A = 3b +M = 12 + +ModInv = d +A = 3d +M = 12 + +ModInv = 5 +A = 41 +M = 12 + +ModInv = 7 +A = 43 +M = 12 + +ModInv = 11 +A = 47 +M = 12 + +ModInv = 1 +A = 49 +M = 12 + +ModInv = b +A = 4d +M = 12 + +ModInv = d +A = 4f +M = 12 + +ModInv = 5 +A = 53 +M = 12 + +ModInv = 7 +A = 55 +M = 12 + +ModInv = 11 +A = 59 +M = 12 + +ModInv = 1 +A = 5b +M = 12 + +ModInv = b +A = 5f +M = 12 + +ModInv = d +A = 61 +M = 12 + +ModInv = f +A = -64 +M = 13 + +ModInv = e +A = -63 +M = 13 + +ModInv = 6 +A = -62 +M = 13 + +ModInv = 9 +A = -61 +M = 13 + +ModInv = 12 +A = -60 +M = 13 + +ModInv = 1 +A = -5e +M = 13 + +ModInv = a +A = -5d +M = 13 + +ModInv = d +A = -5c +M = 13 + +ModInv = 5 +A = -5b +M = 13 + +ModInv = 4 +A = -5a +M = 13 + +ModInv = 10 +A = -59 +M = 13 + +ModInv = b +A = -58 +M = 13 + +ModInv = c +A = -57 +M = 13 + +ModInv = 11 +A = -56 +M = 13 + +ModInv = 2 +A = -55 +M = 13 + +ModInv = 7 +A = -54 +M = 13 + +ModInv = 8 +A = -53 +M = 13 + +ModInv = 3 +A = -52 +M = 13 + +ModInv = f +A = -51 +M = 13 + +ModInv = e +A = -50 +M = 13 + +ModInv = 6 +A = -4f +M = 13 + +ModInv = 9 +A = -4e +M = 13 + +ModInv = 12 +A = -4d +M = 13 + +ModInv = 1 +A = -4b +M = 13 + +ModInv = a +A = -4a +M = 13 + +ModInv = d +A = -49 +M = 13 + +ModInv = 5 +A = -48 +M = 13 + +ModInv = 4 +A = -47 +M = 13 + +ModInv = 10 +A = -46 +M = 13 + +ModInv = b +A = -45 +M = 13 + +ModInv = c +A = -44 +M = 13 + +ModInv = 11 +A = -43 +M = 13 + +ModInv = 2 +A = -42 +M = 13 + +ModInv = 7 +A = -41 +M = 13 + +ModInv = 8 +A = -40 +M = 13 + +ModInv = 3 +A = -3f +M = 13 + +ModInv = f +A = -3e +M = 13 + +ModInv = e +A = -3d +M = 13 + +ModInv = 6 +A = -3c +M = 13 + +ModInv = 9 +A = -3b +M = 13 + +ModInv = 12 +A = -3a +M = 13 + +ModInv = 1 +A = -38 +M = 13 + +ModInv = a +A = -37 +M = 13 + +ModInv = d +A = -36 +M = 13 + +ModInv = 5 +A = -35 +M = 13 + +ModInv = 4 +A = -34 +M = 13 + +ModInv = 10 +A = -33 +M = 13 + +ModInv = b +A = -32 +M = 13 + +ModInv = c +A = -31 +M = 13 + +ModInv = 11 +A = -30 +M = 13 + +ModInv = 2 +A = -2f +M = 13 + +ModInv = 7 +A = -2e +M = 13 + +ModInv = 8 +A = -2d +M = 13 + +ModInv = 3 +A = -2c +M = 13 + +ModInv = f +A = -2b +M = 13 + +ModInv = e +A = -2a +M = 13 + +ModInv = 6 +A = -29 +M = 13 + +ModInv = 9 +A = -28 +M = 13 + +ModInv = 12 +A = -27 +M = 13 + +ModInv = 1 +A = -25 +M = 13 + +ModInv = a +A = -24 +M = 13 + +ModInv = d +A = -23 +M = 13 + +ModInv = 5 +A = -22 +M = 13 + +ModInv = 4 +A = -21 +M = 13 + +ModInv = 10 +A = -20 +M = 13 + +ModInv = b +A = -1f +M = 13 + +ModInv = c +A = -1e +M = 13 + +ModInv = 11 +A = -1d +M = 13 + +ModInv = 2 +A = -1c +M = 13 + +ModInv = 7 +A = -1b +M = 13 + +ModInv = 8 +A = -1a +M = 13 + +ModInv = 3 +A = -19 +M = 13 + +ModInv = f +A = -18 +M = 13 + +ModInv = e +A = -17 +M = 13 + +ModInv = 6 +A = -16 +M = 13 + +ModInv = 9 +A = -15 +M = 13 + +ModInv = 12 +A = -14 +M = 13 + +ModInv = 1 +A = -12 +M = 13 + +ModInv = a +A = -11 +M = 13 + +ModInv = d +A = -10 +M = 13 + +ModInv = 5 +A = -f +M = 13 + +ModInv = 4 +A = -e +M = 13 + +ModInv = 10 +A = -d +M = 13 + +ModInv = b +A = -c +M = 13 + +ModInv = c +A = -b +M = 13 + +ModInv = 11 +A = -a +M = 13 + +ModInv = 2 +A = -9 +M = 13 + +ModInv = 7 +A = -8 +M = 13 + +ModInv = 8 +A = -7 +M = 13 + +ModInv = 3 +A = -6 +M = 13 + +ModInv = f +A = -5 +M = 13 + +ModInv = e +A = -4 +M = 13 + +ModInv = 6 +A = -3 +M = 13 + +ModInv = 9 +A = -2 +M = 13 + +ModInv = 12 +A = -1 +M = 13 + +ModInv = 1 +A = 1 +M = 13 + +ModInv = a +A = 2 +M = 13 + +ModInv = d +A = 3 +M = 13 + +ModInv = 5 +A = 4 +M = 13 + +ModInv = 4 +A = 5 +M = 13 + +ModInv = 10 +A = 6 +M = 13 + +ModInv = b +A = 7 +M = 13 + +ModInv = c +A = 8 +M = 13 + +ModInv = 11 +A = 9 +M = 13 + +ModInv = 2 +A = a +M = 13 + +ModInv = 7 +A = b +M = 13 + +ModInv = 8 +A = c +M = 13 + +ModInv = 3 +A = d +M = 13 + +ModInv = f +A = e +M = 13 + +ModInv = e +A = f +M = 13 + +ModInv = 6 +A = 10 +M = 13 + +ModInv = 9 +A = 11 +M = 13 + +ModInv = 12 +A = 12 +M = 13 + +ModInv = 1 +A = 14 +M = 13 + +ModInv = a +A = 15 +M = 13 + +ModInv = d +A = 16 +M = 13 + +ModInv = 5 +A = 17 +M = 13 + +ModInv = 4 +A = 18 +M = 13 + +ModInv = 10 +A = 19 +M = 13 + +ModInv = b +A = 1a +M = 13 + +ModInv = c +A = 1b +M = 13 + +ModInv = 11 +A = 1c +M = 13 + +ModInv = 2 +A = 1d +M = 13 + +ModInv = 7 +A = 1e +M = 13 + +ModInv = 8 +A = 1f +M = 13 + +ModInv = 3 +A = 20 +M = 13 + +ModInv = f +A = 21 +M = 13 + +ModInv = e +A = 22 +M = 13 + +ModInv = 6 +A = 23 +M = 13 + +ModInv = 9 +A = 24 +M = 13 + +ModInv = 12 +A = 25 +M = 13 + +ModInv = 1 +A = 27 +M = 13 + +ModInv = a +A = 28 +M = 13 + +ModInv = d +A = 29 +M = 13 + +ModInv = 5 +A = 2a +M = 13 + +ModInv = 4 +A = 2b +M = 13 + +ModInv = 10 +A = 2c +M = 13 + +ModInv = b +A = 2d +M = 13 + +ModInv = c +A = 2e +M = 13 + +ModInv = 11 +A = 2f +M = 13 + +ModInv = 2 +A = 30 +M = 13 + +ModInv = 7 +A = 31 +M = 13 + +ModInv = 8 +A = 32 +M = 13 + +ModInv = 3 +A = 33 +M = 13 + +ModInv = f +A = 34 +M = 13 + +ModInv = e +A = 35 +M = 13 + +ModInv = 6 +A = 36 +M = 13 + +ModInv = 9 +A = 37 +M = 13 + +ModInv = 12 +A = 38 +M = 13 + +ModInv = 1 +A = 3a +M = 13 + +ModInv = a +A = 3b +M = 13 + +ModInv = d +A = 3c +M = 13 + +ModInv = 5 +A = 3d +M = 13 + +ModInv = 4 +A = 3e +M = 13 + +ModInv = 10 +A = 3f +M = 13 + +ModInv = b +A = 40 +M = 13 + +ModInv = c +A = 41 +M = 13 + +ModInv = 11 +A = 42 +M = 13 + +ModInv = 2 +A = 43 +M = 13 + +ModInv = 7 +A = 44 +M = 13 + +ModInv = 8 +A = 45 +M = 13 + +ModInv = 3 +A = 46 +M = 13 + +ModInv = f +A = 47 +M = 13 + +ModInv = e +A = 48 +M = 13 + +ModInv = 6 +A = 49 +M = 13 + +ModInv = 9 +A = 4a +M = 13 + +ModInv = 12 +A = 4b +M = 13 + +ModInv = 1 +A = 4d +M = 13 + +ModInv = a +A = 4e +M = 13 + +ModInv = d +A = 4f +M = 13 + +ModInv = 5 +A = 50 +M = 13 + +ModInv = 4 +A = 51 +M = 13 + +ModInv = 10 +A = 52 +M = 13 + +ModInv = b +A = 53 +M = 13 + +ModInv = c +A = 54 +M = 13 + +ModInv = 11 +A = 55 +M = 13 + +ModInv = 2 +A = 56 +M = 13 + +ModInv = 7 +A = 57 +M = 13 + +ModInv = 8 +A = 58 +M = 13 + +ModInv = 3 +A = 59 +M = 13 + +ModInv = f +A = 5a +M = 13 + +ModInv = e +A = 5b +M = 13 + +ModInv = 6 +A = 5c +M = 13 + +ModInv = 9 +A = 5d +M = 13 + +ModInv = 12 +A = 5e +M = 13 + +ModInv = 1 +A = 60 +M = 13 + +ModInv = a +A = 61 +M = 13 + +ModInv = d +A = 62 +M = 13 + +ModInv = 5 +A = 63 +M = 13 + +ModInv = 1 +A = -63 +M = 14 + +ModInv = 7 +A = -61 +M = 14 + +ModInv = 3 +A = -5d +M = 14 + +ModInv = 9 +A = -5b +M = 14 + +ModInv = b +A = -59 +M = 14 + +ModInv = 11 +A = -57 +M = 14 + +ModInv = d +A = -53 +M = 14 + +ModInv = 13 +A = -51 +M = 14 + +ModInv = 1 +A = -4f +M = 14 + +ModInv = 7 +A = -4d +M = 14 + +ModInv = 3 +A = -49 +M = 14 + +ModInv = 9 +A = -47 +M = 14 + +ModInv = b +A = -45 +M = 14 + +ModInv = 11 +A = -43 +M = 14 + +ModInv = d +A = -3f +M = 14 + +ModInv = 13 +A = -3d +M = 14 + +ModInv = 1 +A = -3b +M = 14 + +ModInv = 7 +A = -39 +M = 14 + +ModInv = 3 +A = -35 +M = 14 + +ModInv = 9 +A = -33 +M = 14 + +ModInv = b +A = -31 +M = 14 + +ModInv = 11 +A = -2f +M = 14 + +ModInv = d +A = -2b +M = 14 + +ModInv = 13 +A = -29 +M = 14 + +ModInv = 1 +A = -27 +M = 14 + +ModInv = 7 +A = -25 +M = 14 + +ModInv = 3 +A = -21 +M = 14 + +ModInv = 9 +A = -1f +M = 14 + +ModInv = b +A = -1d +M = 14 + +ModInv = 11 +A = -1b +M = 14 + +ModInv = d +A = -17 +M = 14 + +ModInv = 13 +A = -15 +M = 14 + +ModInv = 1 +A = -13 +M = 14 + +ModInv = 7 +A = -11 +M = 14 + +ModInv = 3 +A = -d +M = 14 + +ModInv = 9 +A = -b +M = 14 + +ModInv = b +A = -9 +M = 14 + +ModInv = 11 +A = -7 +M = 14 + +ModInv = d +A = -3 +M = 14 + +ModInv = 13 +A = -1 +M = 14 + +ModInv = 1 +A = 1 +M = 14 + +ModInv = 7 +A = 3 +M = 14 + +ModInv = 3 +A = 7 +M = 14 + +ModInv = 9 +A = 9 +M = 14 + +ModInv = b +A = b +M = 14 + +ModInv = 11 +A = d +M = 14 + +ModInv = d +A = 11 +M = 14 + +ModInv = 13 +A = 13 +M = 14 + +ModInv = 1 +A = 15 +M = 14 + +ModInv = 7 +A = 17 +M = 14 + +ModInv = 3 +A = 1b +M = 14 + +ModInv = 9 +A = 1d +M = 14 + +ModInv = b +A = 1f +M = 14 + +ModInv = 11 +A = 21 +M = 14 + +ModInv = d +A = 25 +M = 14 + +ModInv = 13 +A = 27 +M = 14 + +ModInv = 1 +A = 29 +M = 14 + +ModInv = 7 +A = 2b +M = 14 + +ModInv = 3 +A = 2f +M = 14 + +ModInv = 9 +A = 31 +M = 14 + +ModInv = b +A = 33 +M = 14 + +ModInv = 11 +A = 35 +M = 14 + +ModInv = d +A = 39 +M = 14 + +ModInv = 13 +A = 3b +M = 14 + +ModInv = 1 +A = 3d +M = 14 + +ModInv = 7 +A = 3f +M = 14 + +ModInv = 3 +A = 43 +M = 14 + +ModInv = 9 +A = 45 +M = 14 + +ModInv = b +A = 47 +M = 14 + +ModInv = 11 +A = 49 +M = 14 + +ModInv = d +A = 4d +M = 14 + +ModInv = 13 +A = 4f +M = 14 + +ModInv = 1 +A = 51 +M = 14 + +ModInv = 7 +A = 53 +M = 14 + +ModInv = 3 +A = 57 +M = 14 + +ModInv = 9 +A = 59 +M = 14 + +ModInv = b +A = 5b +M = 14 + +ModInv = 11 +A = 5d +M = 14 + +ModInv = d +A = 61 +M = 14 + +ModInv = 13 +A = 63 +M = 14 + +ModInv = 11 +A = -64 +M = 15 + +ModInv = 8 +A = -61 +M = 15 + +ModInv = 13 +A = -5f +M = 15 + +ModInv = 2 +A = -5e +M = 15 + +ModInv = d +A = -5c +M = 15 + +ModInv = 4 +A = -59 +M = 15 + +ModInv = 5 +A = -58 +M = 15 + +ModInv = a +A = -56 +M = 15 + +ModInv = 14 +A = -55 +M = 15 + +ModInv = 1 +A = -53 +M = 15 + +ModInv = b +A = -52 +M = 15 + +ModInv = 10 +A = -50 +M = 15 + +ModInv = 11 +A = -4f +M = 15 + +ModInv = 8 +A = -4c +M = 15 + +ModInv = 13 +A = -4a +M = 15 + +ModInv = 2 +A = -49 +M = 15 + +ModInv = d +A = -47 +M = 15 + +ModInv = 4 +A = -44 +M = 15 + +ModInv = 5 +A = -43 +M = 15 + +ModInv = a +A = -41 +M = 15 + +ModInv = 14 +A = -40 +M = 15 + +ModInv = 1 +A = -3e +M = 15 + +ModInv = b +A = -3d +M = 15 + +ModInv = 10 +A = -3b +M = 15 + +ModInv = 11 +A = -3a +M = 15 + +ModInv = 8 +A = -37 +M = 15 + +ModInv = 13 +A = -35 +M = 15 + +ModInv = 2 +A = -34 +M = 15 + +ModInv = d +A = -32 +M = 15 + +ModInv = 4 +A = -2f +M = 15 + +ModInv = 5 +A = -2e +M = 15 + +ModInv = a +A = -2c +M = 15 + +ModInv = 14 +A = -2b +M = 15 + +ModInv = 1 +A = -29 +M = 15 + +ModInv = b +A = -28 +M = 15 + +ModInv = 10 +A = -26 +M = 15 + +ModInv = 11 +A = -25 +M = 15 + +ModInv = 8 +A = -22 +M = 15 + +ModInv = 13 +A = -20 +M = 15 + +ModInv = 2 +A = -1f +M = 15 + +ModInv = d +A = -1d +M = 15 + +ModInv = 4 +A = -1a +M = 15 + +ModInv = 5 +A = -19 +M = 15 + +ModInv = a +A = -17 +M = 15 + +ModInv = 14 +A = -16 +M = 15 + +ModInv = 1 +A = -14 +M = 15 + +ModInv = b +A = -13 +M = 15 + +ModInv = 10 +A = -11 +M = 15 + +ModInv = 11 +A = -10 +M = 15 + +ModInv = 8 +A = -d +M = 15 + +ModInv = 13 +A = -b +M = 15 + +ModInv = 2 +A = -a +M = 15 + +ModInv = d +A = -8 +M = 15 + +ModInv = 4 +A = -5 +M = 15 + +ModInv = 5 +A = -4 +M = 15 + +ModInv = a +A = -2 +M = 15 + +ModInv = 14 +A = -1 +M = 15 + +ModInv = 1 +A = 1 +M = 15 + +ModInv = b +A = 2 +M = 15 + +ModInv = 10 +A = 4 +M = 15 + +ModInv = 11 +A = 5 +M = 15 + +ModInv = 8 +A = 8 +M = 15 + +ModInv = 13 +A = a +M = 15 + +ModInv = 2 +A = b +M = 15 + +ModInv = d +A = d +M = 15 + +ModInv = 4 +A = 10 +M = 15 + +ModInv = 5 +A = 11 +M = 15 + +ModInv = a +A = 13 +M = 15 + +ModInv = 14 +A = 14 +M = 15 + +ModInv = 1 +A = 16 +M = 15 + +ModInv = b +A = 17 +M = 15 + +ModInv = 10 +A = 19 +M = 15 + +ModInv = 11 +A = 1a +M = 15 + +ModInv = 8 +A = 1d +M = 15 + +ModInv = 13 +A = 1f +M = 15 + +ModInv = 2 +A = 20 +M = 15 + +ModInv = d +A = 22 +M = 15 + +ModInv = 4 +A = 25 +M = 15 + +ModInv = 5 +A = 26 +M = 15 + +ModInv = a +A = 28 +M = 15 + +ModInv = 14 +A = 29 +M = 15 + +ModInv = 1 +A = 2b +M = 15 + +ModInv = b +A = 2c +M = 15 + +ModInv = 10 +A = 2e +M = 15 + +ModInv = 11 +A = 2f +M = 15 + +ModInv = 8 +A = 32 +M = 15 + +ModInv = 13 +A = 34 +M = 15 + +ModInv = 2 +A = 35 +M = 15 + +ModInv = d +A = 37 +M = 15 + +ModInv = 4 +A = 3a +M = 15 + +ModInv = 5 +A = 3b +M = 15 + +ModInv = a +A = 3d +M = 15 + +ModInv = 14 +A = 3e +M = 15 + +ModInv = 1 +A = 40 +M = 15 + +ModInv = b +A = 41 +M = 15 + +ModInv = 10 +A = 43 +M = 15 + +ModInv = 11 +A = 44 +M = 15 + +ModInv = 8 +A = 47 +M = 15 + +ModInv = 13 +A = 49 +M = 15 + +ModInv = 2 +A = 4a +M = 15 + +ModInv = d +A = 4c +M = 15 + +ModInv = 4 +A = 4f +M = 15 + +ModInv = 5 +A = 50 +M = 15 + +ModInv = a +A = 52 +M = 15 + +ModInv = 14 +A = 53 +M = 15 + +ModInv = 1 +A = 55 +M = 15 + +ModInv = b +A = 56 +M = 15 + +ModInv = 10 +A = 58 +M = 15 + +ModInv = 11 +A = 59 +M = 15 + +ModInv = 8 +A = 5c +M = 15 + +ModInv = 13 +A = 5e +M = 15 + +ModInv = 2 +A = 5f +M = 15 + +ModInv = d +A = 61 +M = 15 + +ModInv = 11 +A = -61 +M = 16 + +ModInv = 3 +A = -5f +M = 16 + +ModInv = d +A = -5d +M = 16 + +ModInv = 7 +A = -5b +M = 16 + +ModInv = 15 +A = -59 +M = 16 + +ModInv = 1 +A = -57 +M = 16 + +ModInv = f +A = -55 +M = 16 + +ModInv = 9 +A = -53 +M = 16 + +ModInv = 13 +A = -51 +M = 16 + +ModInv = 5 +A = -4f +M = 16 + +ModInv = 11 +A = -4b +M = 16 + +ModInv = 3 +A = -49 +M = 16 + +ModInv = d +A = -47 +M = 16 + +ModInv = 7 +A = -45 +M = 16 + +ModInv = 15 +A = -43 +M = 16 + +ModInv = 1 +A = -41 +M = 16 + +ModInv = f +A = -3f +M = 16 + +ModInv = 9 +A = -3d +M = 16 + +ModInv = 13 +A = -3b +M = 16 + +ModInv = 5 +A = -39 +M = 16 + +ModInv = 11 +A = -35 +M = 16 + +ModInv = 3 +A = -33 +M = 16 + +ModInv = d +A = -31 +M = 16 + +ModInv = 7 +A = -2f +M = 16 + +ModInv = 15 +A = -2d +M = 16 + +ModInv = 1 +A = -2b +M = 16 + +ModInv = f +A = -29 +M = 16 + +ModInv = 9 +A = -27 +M = 16 + +ModInv = 13 +A = -25 +M = 16 + +ModInv = 5 +A = -23 +M = 16 + +ModInv = 11 +A = -1f +M = 16 + +ModInv = 3 +A = -1d +M = 16 + +ModInv = d +A = -1b +M = 16 + +ModInv = 7 +A = -19 +M = 16 + +ModInv = 15 +A = -17 +M = 16 + +ModInv = 1 +A = -15 +M = 16 + +ModInv = f +A = -13 +M = 16 + +ModInv = 9 +A = -11 +M = 16 + +ModInv = 13 +A = -f +M = 16 + +ModInv = 5 +A = -d +M = 16 + +ModInv = 11 +A = -9 +M = 16 + +ModInv = 3 +A = -7 +M = 16 + +ModInv = d +A = -5 +M = 16 + +ModInv = 7 +A = -3 +M = 16 + +ModInv = 15 +A = -1 +M = 16 + +ModInv = 1 +A = 1 +M = 16 + +ModInv = f +A = 3 +M = 16 + +ModInv = 9 +A = 5 +M = 16 + +ModInv = 13 +A = 7 +M = 16 + +ModInv = 5 +A = 9 +M = 16 + +ModInv = 11 +A = d +M = 16 + +ModInv = 3 +A = f +M = 16 + +ModInv = d +A = 11 +M = 16 + +ModInv = 7 +A = 13 +M = 16 + +ModInv = 15 +A = 15 +M = 16 + +ModInv = 1 +A = 17 +M = 16 + +ModInv = f +A = 19 +M = 16 + +ModInv = 9 +A = 1b +M = 16 + +ModInv = 13 +A = 1d +M = 16 + +ModInv = 5 +A = 1f +M = 16 + +ModInv = 11 +A = 23 +M = 16 + +ModInv = 3 +A = 25 +M = 16 + +ModInv = d +A = 27 +M = 16 + +ModInv = 7 +A = 29 +M = 16 + +ModInv = 15 +A = 2b +M = 16 + +ModInv = 1 +A = 2d +M = 16 + +ModInv = f +A = 2f +M = 16 + +ModInv = 9 +A = 31 +M = 16 + +ModInv = 13 +A = 33 +M = 16 + +ModInv = 5 +A = 35 +M = 16 + +ModInv = 11 +A = 39 +M = 16 + +ModInv = 3 +A = 3b +M = 16 + +ModInv = d +A = 3d +M = 16 + +ModInv = 7 +A = 3f +M = 16 + +ModInv = 15 +A = 41 +M = 16 + +ModInv = 1 +A = 43 +M = 16 + +ModInv = f +A = 45 +M = 16 + +ModInv = 9 +A = 47 +M = 16 + +ModInv = 13 +A = 49 +M = 16 + +ModInv = 5 +A = 4b +M = 16 + +ModInv = 11 +A = 4f +M = 16 + +ModInv = 3 +A = 51 +M = 16 + +ModInv = d +A = 53 +M = 16 + +ModInv = 7 +A = 55 +M = 16 + +ModInv = 15 +A = 57 +M = 16 + +ModInv = 1 +A = 59 +M = 16 + +ModInv = f +A = 5b +M = 16 + +ModInv = 9 +A = 5d +M = 16 + +ModInv = 13 +A = 5f +M = 16 + +ModInv = 5 +A = 61 +M = 16 + +ModInv = 14 +A = -64 +M = 17 + +ModInv = d +A = -63 +M = 17 + +ModInv = 13 +A = -62 +M = 17 + +ModInv = 9 +A = -61 +M = 17 + +ModInv = 11 +A = -60 +M = 17 + +ModInv = f +A = -5f +M = 17 + +ModInv = b +A = -5e +M = 17 + +ModInv = 16 +A = -5d +M = 17 + +ModInv = 1 +A = -5b +M = 17 + +ModInv = c +A = -5a +M = 17 + +ModInv = 8 +A = -59 +M = 17 + +ModInv = 6 +A = -58 +M = 17 + +ModInv = e +A = -57 +M = 17 + +ModInv = 4 +A = -56 +M = 17 + +ModInv = a +A = -55 +M = 17 + +ModInv = 3 +A = -54 +M = 17 + +ModInv = 12 +A = -53 +M = 17 + +ModInv = 7 +A = -52 +M = 17 + +ModInv = 15 +A = -51 +M = 17 + +ModInv = 2 +A = -50 +M = 17 + +ModInv = 10 +A = -4f +M = 17 + +ModInv = 5 +A = -4e +M = 17 + +ModInv = 14 +A = -4d +M = 17 + +ModInv = d +A = -4c +M = 17 + +ModInv = 13 +A = -4b +M = 17 + +ModInv = 9 +A = -4a +M = 17 + +ModInv = 11 +A = -49 +M = 17 + +ModInv = f +A = -48 +M = 17 + +ModInv = b +A = -47 +M = 17 + +ModInv = 16 +A = -46 +M = 17 + +ModInv = 1 +A = -44 +M = 17 + +ModInv = c +A = -43 +M = 17 + +ModInv = 8 +A = -42 +M = 17 + +ModInv = 6 +A = -41 +M = 17 + +ModInv = e +A = -40 +M = 17 + +ModInv = 4 +A = -3f +M = 17 + +ModInv = a +A = -3e +M = 17 + +ModInv = 3 +A = -3d +M = 17 + +ModInv = 12 +A = -3c +M = 17 + +ModInv = 7 +A = -3b +M = 17 + +ModInv = 15 +A = -3a +M = 17 + +ModInv = 2 +A = -39 +M = 17 + +ModInv = 10 +A = -38 +M = 17 + +ModInv = 5 +A = -37 +M = 17 + +ModInv = 14 +A = -36 +M = 17 + +ModInv = d +A = -35 +M = 17 + +ModInv = 13 +A = -34 +M = 17 + +ModInv = 9 +A = -33 +M = 17 + +ModInv = 11 +A = -32 +M = 17 + +ModInv = f +A = -31 +M = 17 + +ModInv = b +A = -30 +M = 17 + +ModInv = 16 +A = -2f +M = 17 + +ModInv = 1 +A = -2d +M = 17 + +ModInv = c +A = -2c +M = 17 + +ModInv = 8 +A = -2b +M = 17 + +ModInv = 6 +A = -2a +M = 17 + +ModInv = e +A = -29 +M = 17 + +ModInv = 4 +A = -28 +M = 17 + +ModInv = a +A = -27 +M = 17 + +ModInv = 3 +A = -26 +M = 17 + +ModInv = 12 +A = -25 +M = 17 + +ModInv = 7 +A = -24 +M = 17 + +ModInv = 15 +A = -23 +M = 17 + +ModInv = 2 +A = -22 +M = 17 + +ModInv = 10 +A = -21 +M = 17 + +ModInv = 5 +A = -20 +M = 17 + +ModInv = 14 +A = -1f +M = 17 + +ModInv = d +A = -1e +M = 17 + +ModInv = 13 +A = -1d +M = 17 + +ModInv = 9 +A = -1c +M = 17 + +ModInv = 11 +A = -1b +M = 17 + +ModInv = f +A = -1a +M = 17 + +ModInv = b +A = -19 +M = 17 + +ModInv = 16 +A = -18 +M = 17 + +ModInv = 1 +A = -16 +M = 17 + +ModInv = c +A = -15 +M = 17 + +ModInv = 8 +A = -14 +M = 17 + +ModInv = 6 +A = -13 +M = 17 + +ModInv = e +A = -12 +M = 17 + +ModInv = 4 +A = -11 +M = 17 + +ModInv = a +A = -10 +M = 17 + +ModInv = 3 +A = -f +M = 17 + +ModInv = 12 +A = -e +M = 17 + +ModInv = 7 +A = -d +M = 17 + +ModInv = 15 +A = -c +M = 17 + +ModInv = 2 +A = -b +M = 17 + +ModInv = 10 +A = -a +M = 17 + +ModInv = 5 +A = -9 +M = 17 + +ModInv = 14 +A = -8 +M = 17 + +ModInv = d +A = -7 +M = 17 + +ModInv = 13 +A = -6 +M = 17 + +ModInv = 9 +A = -5 +M = 17 + +ModInv = 11 +A = -4 +M = 17 + +ModInv = f +A = -3 +M = 17 + +ModInv = b +A = -2 +M = 17 + +ModInv = 16 +A = -1 +M = 17 + +ModInv = 1 +A = 1 +M = 17 + +ModInv = c +A = 2 +M = 17 + +ModInv = 8 +A = 3 +M = 17 + +ModInv = 6 +A = 4 +M = 17 + +ModInv = e +A = 5 +M = 17 + +ModInv = 4 +A = 6 +M = 17 + +ModInv = a +A = 7 +M = 17 + +ModInv = 3 +A = 8 +M = 17 + +ModInv = 12 +A = 9 +M = 17 + +ModInv = 7 +A = a +M = 17 + +ModInv = 15 +A = b +M = 17 + +ModInv = 2 +A = c +M = 17 + +ModInv = 10 +A = d +M = 17 + +ModInv = 5 +A = e +M = 17 + +ModInv = 14 +A = f +M = 17 + +ModInv = d +A = 10 +M = 17 + +ModInv = 13 +A = 11 +M = 17 + +ModInv = 9 +A = 12 +M = 17 + +ModInv = 11 +A = 13 +M = 17 + +ModInv = f +A = 14 +M = 17 + +ModInv = b +A = 15 +M = 17 + +ModInv = 16 +A = 16 +M = 17 + +ModInv = 1 +A = 18 +M = 17 + +ModInv = c +A = 19 +M = 17 + +ModInv = 8 +A = 1a +M = 17 + +ModInv = 6 +A = 1b +M = 17 + +ModInv = e +A = 1c +M = 17 + +ModInv = 4 +A = 1d +M = 17 + +ModInv = a +A = 1e +M = 17 + +ModInv = 3 +A = 1f +M = 17 + +ModInv = 12 +A = 20 +M = 17 + +ModInv = 7 +A = 21 +M = 17 + +ModInv = 15 +A = 22 +M = 17 + +ModInv = 2 +A = 23 +M = 17 + +ModInv = 10 +A = 24 +M = 17 + +ModInv = 5 +A = 25 +M = 17 + +ModInv = 14 +A = 26 +M = 17 + +ModInv = d +A = 27 +M = 17 + +ModInv = 13 +A = 28 +M = 17 + +ModInv = 9 +A = 29 +M = 17 + +ModInv = 11 +A = 2a +M = 17 + +ModInv = f +A = 2b +M = 17 + +ModInv = b +A = 2c +M = 17 + +ModInv = 16 +A = 2d +M = 17 + +ModInv = 1 +A = 2f +M = 17 + +ModInv = c +A = 30 +M = 17 + +ModInv = 8 +A = 31 +M = 17 + +ModInv = 6 +A = 32 +M = 17 + +ModInv = e +A = 33 +M = 17 + +ModInv = 4 +A = 34 +M = 17 + +ModInv = a +A = 35 +M = 17 + +ModInv = 3 +A = 36 +M = 17 + +ModInv = 12 +A = 37 +M = 17 + +ModInv = 7 +A = 38 +M = 17 + +ModInv = 15 +A = 39 +M = 17 + +ModInv = 2 +A = 3a +M = 17 + +ModInv = 10 +A = 3b +M = 17 + +ModInv = 5 +A = 3c +M = 17 + +ModInv = 14 +A = 3d +M = 17 + +ModInv = d +A = 3e +M = 17 + +ModInv = 13 +A = 3f +M = 17 + +ModInv = 9 +A = 40 +M = 17 + +ModInv = 11 +A = 41 +M = 17 + +ModInv = f +A = 42 +M = 17 + +ModInv = b +A = 43 +M = 17 + +ModInv = 16 +A = 44 +M = 17 + +ModInv = 1 +A = 46 +M = 17 + +ModInv = c +A = 47 +M = 17 + +ModInv = 8 +A = 48 +M = 17 + +ModInv = 6 +A = 49 +M = 17 + +ModInv = e +A = 4a +M = 17 + +ModInv = 4 +A = 4b +M = 17 + +ModInv = a +A = 4c +M = 17 + +ModInv = 3 +A = 4d +M = 17 + +ModInv = 12 +A = 4e +M = 17 + +ModInv = 7 +A = 4f +M = 17 + +ModInv = 15 +A = 50 +M = 17 + +ModInv = 2 +A = 51 +M = 17 + +ModInv = 10 +A = 52 +M = 17 + +ModInv = 5 +A = 53 +M = 17 + +ModInv = 14 +A = 54 +M = 17 + +ModInv = d +A = 55 +M = 17 + +ModInv = 13 +A = 56 +M = 17 + +ModInv = 9 +A = 57 +M = 17 + +ModInv = 11 +A = 58 +M = 17 + +ModInv = f +A = 59 +M = 17 + +ModInv = b +A = 5a +M = 17 + +ModInv = 16 +A = 5b +M = 17 + +ModInv = 1 +A = 5d +M = 17 + +ModInv = c +A = 5e +M = 17 + +ModInv = 8 +A = 5f +M = 17 + +ModInv = 6 +A = 60 +M = 17 + +ModInv = e +A = 61 +M = 17 + +ModInv = 4 +A = 62 +M = 17 + +ModInv = a +A = 63 +M = 17 + +ModInv = 17 +A = -61 +M = 18 + +ModInv = 1 +A = -5f +M = 18 + +ModInv = 5 +A = -5b +M = 18 + +ModInv = 7 +A = -59 +M = 18 + +ModInv = b +A = -55 +M = 18 + +ModInv = d +A = -53 +M = 18 + +ModInv = 11 +A = -4f +M = 18 + +ModInv = 13 +A = -4d +M = 18 + +ModInv = 17 +A = -49 +M = 18 + +ModInv = 1 +A = -47 +M = 18 + +ModInv = 5 +A = -43 +M = 18 + +ModInv = 7 +A = -41 +M = 18 + +ModInv = b +A = -3d +M = 18 + +ModInv = d +A = -3b +M = 18 + +ModInv = 11 +A = -37 +M = 18 + +ModInv = 13 +A = -35 +M = 18 + +ModInv = 17 +A = -31 +M = 18 + +ModInv = 1 +A = -2f +M = 18 + +ModInv = 5 +A = -2b +M = 18 + +ModInv = 7 +A = -29 +M = 18 + +ModInv = b +A = -25 +M = 18 + +ModInv = d +A = -23 +M = 18 + +ModInv = 11 +A = -1f +M = 18 + +ModInv = 13 +A = -1d +M = 18 + +ModInv = 17 +A = -19 +M = 18 + +ModInv = 1 +A = -17 +M = 18 + +ModInv = 5 +A = -13 +M = 18 + +ModInv = 7 +A = -11 +M = 18 + +ModInv = b +A = -d +M = 18 + +ModInv = d +A = -b +M = 18 + +ModInv = 11 +A = -7 +M = 18 + +ModInv = 13 +A = -5 +M = 18 + +ModInv = 17 +A = -1 +M = 18 + +ModInv = 1 +A = 1 +M = 18 + +ModInv = 5 +A = 5 +M = 18 + +ModInv = 7 +A = 7 +M = 18 + +ModInv = b +A = b +M = 18 + +ModInv = d +A = d +M = 18 + +ModInv = 11 +A = 11 +M = 18 + +ModInv = 13 +A = 13 +M = 18 + +ModInv = 17 +A = 17 +M = 18 + +ModInv = 1 +A = 19 +M = 18 + +ModInv = 5 +A = 1d +M = 18 + +ModInv = 7 +A = 1f +M = 18 + +ModInv = b +A = 23 +M = 18 + +ModInv = d +A = 25 +M = 18 + +ModInv = 11 +A = 29 +M = 18 + +ModInv = 13 +A = 2b +M = 18 + +ModInv = 17 +A = 2f +M = 18 + +ModInv = 1 +A = 31 +M = 18 + +ModInv = 5 +A = 35 +M = 18 + +ModInv = 7 +A = 37 +M = 18 + +ModInv = b +A = 3b +M = 18 + +ModInv = d +A = 3d +M = 18 + +ModInv = 11 +A = 41 +M = 18 + +ModInv = 13 +A = 43 +M = 18 + +ModInv = 17 +A = 47 +M = 18 + +ModInv = 1 +A = 49 +M = 18 + +ModInv = 5 +A = 4d +M = 18 + +ModInv = 7 +A = 4f +M = 18 + +ModInv = b +A = 53 +M = 18 + +ModInv = d +A = 55 +M = 18 + +ModInv = 11 +A = 59 +M = 18 + +ModInv = 13 +A = 5b +M = 18 + +ModInv = 17 +A = 5f +M = 18 + +ModInv = 1 +A = 61 +M = 18 + +ModInv = 1 +A = -63 +M = 19 + +ModInv = d +A = -62 +M = 19 + +ModInv = 11 +A = -61 +M = 19 + +ModInv = 13 +A = -60 +M = 19 + +ModInv = 15 +A = -5e +M = 19 + +ModInv = 12 +A = -5d +M = 19 + +ModInv = 16 +A = -5c +M = 19 + +ModInv = e +A = -5b +M = 19 + +ModInv = 10 +A = -59 +M = 19 + +ModInv = 17 +A = -58 +M = 19 + +ModInv = 2 +A = -57 +M = 19 + +ModInv = 9 +A = -56 +M = 19 + +ModInv = b +A = -54 +M = 19 + +ModInv = 3 +A = -53 +M = 19 + +ModInv = 7 +A = -52 +M = 19 + +ModInv = 4 +A = -51 +M = 19 + +ModInv = 6 +A = -4f +M = 19 + +ModInv = 8 +A = -4e +M = 19 + +ModInv = c +A = -4d +M = 19 + +ModInv = 18 +A = -4c +M = 19 + +ModInv = 1 +A = -4a +M = 19 + +ModInv = d +A = -49 +M = 19 + +ModInv = 11 +A = -48 +M = 19 + +ModInv = 13 +A = -47 +M = 19 + +ModInv = 15 +A = -45 +M = 19 + +ModInv = 12 +A = -44 +M = 19 + +ModInv = 16 +A = -43 +M = 19 + +ModInv = e +A = -42 +M = 19 + +ModInv = 10 +A = -40 +M = 19 + +ModInv = 17 +A = -3f +M = 19 + +ModInv = 2 +A = -3e +M = 19 + +ModInv = 9 +A = -3d +M = 19 + +ModInv = b +A = -3b +M = 19 + +ModInv = 3 +A = -3a +M = 19 + +ModInv = 7 +A = -39 +M = 19 + +ModInv = 4 +A = -38 +M = 19 + +ModInv = 6 +A = -36 +M = 19 + +ModInv = 8 +A = -35 +M = 19 + +ModInv = c +A = -34 +M = 19 + +ModInv = 18 +A = -33 +M = 19 + +ModInv = 1 +A = -31 +M = 19 + +ModInv = d +A = -30 +M = 19 + +ModInv = 11 +A = -2f +M = 19 + +ModInv = 13 +A = -2e +M = 19 + +ModInv = 15 +A = -2c +M = 19 + +ModInv = 12 +A = -2b +M = 19 + +ModInv = 16 +A = -2a +M = 19 + +ModInv = e +A = -29 +M = 19 + +ModInv = 10 +A = -27 +M = 19 + +ModInv = 17 +A = -26 +M = 19 + +ModInv = 2 +A = -25 +M = 19 + +ModInv = 9 +A = -24 +M = 19 + +ModInv = b +A = -22 +M = 19 + +ModInv = 3 +A = -21 +M = 19 + +ModInv = 7 +A = -20 +M = 19 + +ModInv = 4 +A = -1f +M = 19 + +ModInv = 6 +A = -1d +M = 19 + +ModInv = 8 +A = -1c +M = 19 + +ModInv = c +A = -1b +M = 19 + +ModInv = 18 +A = -1a +M = 19 + +ModInv = 1 +A = -18 +M = 19 + +ModInv = d +A = -17 +M = 19 + +ModInv = 11 +A = -16 +M = 19 + +ModInv = 13 +A = -15 +M = 19 + +ModInv = 15 +A = -13 +M = 19 + +ModInv = 12 +A = -12 +M = 19 + +ModInv = 16 +A = -11 +M = 19 + +ModInv = e +A = -10 +M = 19 + +ModInv = 10 +A = -e +M = 19 + +ModInv = 17 +A = -d +M = 19 + +ModInv = 2 +A = -c +M = 19 + +ModInv = 9 +A = -b +M = 19 + +ModInv = b +A = -9 +M = 19 + +ModInv = 3 +A = -8 +M = 19 + +ModInv = 7 +A = -7 +M = 19 + +ModInv = 4 +A = -6 +M = 19 + +ModInv = 6 +A = -4 +M = 19 + +ModInv = 8 +A = -3 +M = 19 + +ModInv = c +A = -2 +M = 19 + +ModInv = 18 +A = -1 +M = 19 + +ModInv = 1 +A = 1 +M = 19 + +ModInv = d +A = 2 +M = 19 + +ModInv = 11 +A = 3 +M = 19 + +ModInv = 13 +A = 4 +M = 19 + +ModInv = 15 +A = 6 +M = 19 + +ModInv = 12 +A = 7 +M = 19 + +ModInv = 16 +A = 8 +M = 19 + +ModInv = e +A = 9 +M = 19 + +ModInv = 10 +A = b +M = 19 + +ModInv = 17 +A = c +M = 19 + +ModInv = 2 +A = d +M = 19 + +ModInv = 9 +A = e +M = 19 + +ModInv = b +A = 10 +M = 19 + +ModInv = 3 +A = 11 +M = 19 + +ModInv = 7 +A = 12 +M = 19 + +ModInv = 4 +A = 13 +M = 19 + +ModInv = 6 +A = 15 +M = 19 + +ModInv = 8 +A = 16 +M = 19 + +ModInv = c +A = 17 +M = 19 + +ModInv = 18 +A = 18 +M = 19 + +ModInv = 1 +A = 1a +M = 19 + +ModInv = d +A = 1b +M = 19 + +ModInv = 11 +A = 1c +M = 19 + +ModInv = 13 +A = 1d +M = 19 + +ModInv = 15 +A = 1f +M = 19 + +ModInv = 12 +A = 20 +M = 19 + +ModInv = 16 +A = 21 +M = 19 + +ModInv = e +A = 22 +M = 19 + +ModInv = 10 +A = 24 +M = 19 + +ModInv = 17 +A = 25 +M = 19 + +ModInv = 2 +A = 26 +M = 19 + +ModInv = 9 +A = 27 +M = 19 + +ModInv = b +A = 29 +M = 19 + +ModInv = 3 +A = 2a +M = 19 + +ModInv = 7 +A = 2b +M = 19 + +ModInv = 4 +A = 2c +M = 19 + +ModInv = 6 +A = 2e +M = 19 + +ModInv = 8 +A = 2f +M = 19 + +ModInv = c +A = 30 +M = 19 + +ModInv = 18 +A = 31 +M = 19 + +ModInv = 1 +A = 33 +M = 19 + +ModInv = d +A = 34 +M = 19 + +ModInv = 11 +A = 35 +M = 19 + +ModInv = 13 +A = 36 +M = 19 + +ModInv = 15 +A = 38 +M = 19 + +ModInv = 12 +A = 39 +M = 19 + +ModInv = 16 +A = 3a +M = 19 + +ModInv = e +A = 3b +M = 19 + +ModInv = 10 +A = 3d +M = 19 + +ModInv = 17 +A = 3e +M = 19 + +ModInv = 2 +A = 3f +M = 19 + +ModInv = 9 +A = 40 +M = 19 + +ModInv = b +A = 42 +M = 19 + +ModInv = 3 +A = 43 +M = 19 + +ModInv = 7 +A = 44 +M = 19 + +ModInv = 4 +A = 45 +M = 19 + +ModInv = 6 +A = 47 +M = 19 + +ModInv = 8 +A = 48 +M = 19 + +ModInv = c +A = 49 +M = 19 + +ModInv = 18 +A = 4a +M = 19 + +ModInv = 1 +A = 4c +M = 19 + +ModInv = d +A = 4d +M = 19 + +ModInv = 11 +A = 4e +M = 19 + +ModInv = 13 +A = 4f +M = 19 + +ModInv = 15 +A = 51 +M = 19 + +ModInv = 12 +A = 52 +M = 19 + +ModInv = 16 +A = 53 +M = 19 + +ModInv = e +A = 54 +M = 19 + +ModInv = 10 +A = 56 +M = 19 + +ModInv = 17 +A = 57 +M = 19 + +ModInv = 2 +A = 58 +M = 19 + +ModInv = 9 +A = 59 +M = 19 + +ModInv = b +A = 5b +M = 19 + +ModInv = 3 +A = 5c +M = 19 + +ModInv = 7 +A = 5d +M = 19 + +ModInv = 4 +A = 5e +M = 19 + +ModInv = 6 +A = 60 +M = 19 + +ModInv = 8 +A = 61 +M = 19 + +ModInv = c +A = 62 +M = 19 + +ModInv = 18 +A = 63 +M = 19 + +ModInv = 15 +A = -63 +M = 1a + +ModInv = f +A = -61 +M = 1a + +ModInv = 3 +A = -5f +M = 1a + +ModInv = 13 +A = -5d +M = 1a + +ModInv = 7 +A = -59 +M = 1a + +ModInv = 17 +A = -57 +M = 1a + +ModInv = b +A = -55 +M = 1a + +ModInv = 5 +A = -53 +M = 1a + +ModInv = 11 +A = -51 +M = 1a + +ModInv = 19 +A = -4f +M = 1a + +ModInv = 1 +A = -4d +M = 1a + +ModInv = 9 +A = -4b +M = 1a + +ModInv = 15 +A = -49 +M = 1a + +ModInv = f +A = -47 +M = 1a + +ModInv = 3 +A = -45 +M = 1a + +ModInv = 13 +A = -43 +M = 1a + +ModInv = 7 +A = -3f +M = 1a + +ModInv = 17 +A = -3d +M = 1a + +ModInv = b +A = -3b +M = 1a + +ModInv = 5 +A = -39 +M = 1a + +ModInv = 11 +A = -37 +M = 1a + +ModInv = 19 +A = -35 +M = 1a + +ModInv = 1 +A = -33 +M = 1a + +ModInv = 9 +A = -31 +M = 1a + +ModInv = 15 +A = -2f +M = 1a + +ModInv = f +A = -2d +M = 1a + +ModInv = 3 +A = -2b +M = 1a + +ModInv = 13 +A = -29 +M = 1a + +ModInv = 7 +A = -25 +M = 1a + +ModInv = 17 +A = -23 +M = 1a + +ModInv = b +A = -21 +M = 1a + +ModInv = 5 +A = -1f +M = 1a + +ModInv = 11 +A = -1d +M = 1a + +ModInv = 19 +A = -1b +M = 1a + +ModInv = 1 +A = -19 +M = 1a + +ModInv = 9 +A = -17 +M = 1a + +ModInv = 15 +A = -15 +M = 1a + +ModInv = f +A = -13 +M = 1a + +ModInv = 3 +A = -11 +M = 1a + +ModInv = 13 +A = -f +M = 1a + +ModInv = 7 +A = -b +M = 1a + +ModInv = 17 +A = -9 +M = 1a + +ModInv = b +A = -7 +M = 1a + +ModInv = 5 +A = -5 +M = 1a + +ModInv = 11 +A = -3 +M = 1a + +ModInv = 19 +A = -1 +M = 1a + +ModInv = 1 +A = 1 +M = 1a + +ModInv = 9 +A = 3 +M = 1a + +ModInv = 15 +A = 5 +M = 1a + +ModInv = f +A = 7 +M = 1a + +ModInv = 3 +A = 9 +M = 1a + +ModInv = 13 +A = b +M = 1a + +ModInv = 7 +A = f +M = 1a + +ModInv = 17 +A = 11 +M = 1a + +ModInv = b +A = 13 +M = 1a + +ModInv = 5 +A = 15 +M = 1a + +ModInv = 11 +A = 17 +M = 1a + +ModInv = 19 +A = 19 +M = 1a + +ModInv = 1 +A = 1b +M = 1a + +ModInv = 9 +A = 1d +M = 1a + +ModInv = 15 +A = 1f +M = 1a + +ModInv = f +A = 21 +M = 1a + +ModInv = 3 +A = 23 +M = 1a + +ModInv = 13 +A = 25 +M = 1a + +ModInv = 7 +A = 29 +M = 1a + +ModInv = 17 +A = 2b +M = 1a + +ModInv = b +A = 2d +M = 1a + +ModInv = 5 +A = 2f +M = 1a + +ModInv = 11 +A = 31 +M = 1a + +ModInv = 19 +A = 33 +M = 1a + +ModInv = 1 +A = 35 +M = 1a + +ModInv = 9 +A = 37 +M = 1a + +ModInv = 15 +A = 39 +M = 1a + +ModInv = f +A = 3b +M = 1a + +ModInv = 3 +A = 3d +M = 1a + +ModInv = 13 +A = 3f +M = 1a + +ModInv = 7 +A = 43 +M = 1a + +ModInv = 17 +A = 45 +M = 1a + +ModInv = b +A = 47 +M = 1a + +ModInv = 5 +A = 49 +M = 1a + +ModInv = 11 +A = 4b +M = 1a + +ModInv = 19 +A = 4d +M = 1a + +ModInv = 1 +A = 4f +M = 1a + +ModInv = 9 +A = 51 +M = 1a + +ModInv = 15 +A = 53 +M = 1a + +ModInv = f +A = 55 +M = 1a + +ModInv = 3 +A = 57 +M = 1a + +ModInv = 13 +A = 59 +M = 1a + +ModInv = 7 +A = 5d +M = 1a + +ModInv = 17 +A = 5f +M = 1a + +ModInv = b +A = 61 +M = 1a + +ModInv = 5 +A = 63 +M = 1a + +ModInv = 11 +A = -64 +M = 1b + +ModInv = 13 +A = -62 +M = 1b + +ModInv = 5 +A = -61 +M = 1b + +ModInv = 19 +A = -5f +M = 1b + +ModInv = 2 +A = -5e +M = 1b + +ModInv = 16 +A = -5c +M = 1b + +ModInv = 8 +A = -5b +M = 1b + +ModInv = a +A = -59 +M = 1b + +ModInv = 17 +A = -58 +M = 1b + +ModInv = 10 +A = -56 +M = 1b + +ModInv = 14 +A = -55 +M = 1b + +ModInv = d +A = -53 +M = 1b + +ModInv = 1a +A = -52 +M = 1b + +ModInv = 1 +A = -50 +M = 1b + +ModInv = e +A = -4f +M = 1b + +ModInv = 7 +A = -4d +M = 1b + +ModInv = b +A = -4c +M = 1b + +ModInv = 4 +A = -4a +M = 1b + +ModInv = 11 +A = -49 +M = 1b + +ModInv = 13 +A = -47 +M = 1b + +ModInv = 5 +A = -46 +M = 1b + +ModInv = 19 +A = -44 +M = 1b + +ModInv = 2 +A = -43 +M = 1b + +ModInv = 16 +A = -41 +M = 1b + +ModInv = 8 +A = -40 +M = 1b + +ModInv = a +A = -3e +M = 1b + +ModInv = 17 +A = -3d +M = 1b + +ModInv = 10 +A = -3b +M = 1b + +ModInv = 14 +A = -3a +M = 1b + +ModInv = d +A = -38 +M = 1b + +ModInv = 1a +A = -37 +M = 1b + +ModInv = 1 +A = -35 +M = 1b + +ModInv = e +A = -34 +M = 1b + +ModInv = 7 +A = -32 +M = 1b + +ModInv = b +A = -31 +M = 1b + +ModInv = 4 +A = -2f +M = 1b + +ModInv = 11 +A = -2e +M = 1b + +ModInv = 13 +A = -2c +M = 1b + +ModInv = 5 +A = -2b +M = 1b + +ModInv = 19 +A = -29 +M = 1b + +ModInv = 2 +A = -28 +M = 1b + +ModInv = 16 +A = -26 +M = 1b + +ModInv = 8 +A = -25 +M = 1b + +ModInv = a +A = -23 +M = 1b + +ModInv = 17 +A = -22 +M = 1b + +ModInv = 10 +A = -20 +M = 1b + +ModInv = 14 +A = -1f +M = 1b + +ModInv = d +A = -1d +M = 1b + +ModInv = 1a +A = -1c +M = 1b + +ModInv = 1 +A = -1a +M = 1b + +ModInv = e +A = -19 +M = 1b + +ModInv = 7 +A = -17 +M = 1b + +ModInv = b +A = -16 +M = 1b + +ModInv = 4 +A = -14 +M = 1b + +ModInv = 11 +A = -13 +M = 1b + +ModInv = 13 +A = -11 +M = 1b + +ModInv = 5 +A = -10 +M = 1b + +ModInv = 19 +A = -e +M = 1b + +ModInv = 2 +A = -d +M = 1b + +ModInv = 16 +A = -b +M = 1b + +ModInv = 8 +A = -a +M = 1b + +ModInv = a +A = -8 +M = 1b + +ModInv = 17 +A = -7 +M = 1b + +ModInv = 10 +A = -5 +M = 1b + +ModInv = 14 +A = -4 +M = 1b + +ModInv = d +A = -2 +M = 1b + +ModInv = 1a +A = -1 +M = 1b + +ModInv = 1 +A = 1 +M = 1b + +ModInv = e +A = 2 +M = 1b + +ModInv = 7 +A = 4 +M = 1b + +ModInv = b +A = 5 +M = 1b + +ModInv = 4 +A = 7 +M = 1b + +ModInv = 11 +A = 8 +M = 1b + +ModInv = 13 +A = a +M = 1b + +ModInv = 5 +A = b +M = 1b + +ModInv = 19 +A = d +M = 1b + +ModInv = 2 +A = e +M = 1b + +ModInv = 16 +A = 10 +M = 1b + +ModInv = 8 +A = 11 +M = 1b + +ModInv = a +A = 13 +M = 1b + +ModInv = 17 +A = 14 +M = 1b + +ModInv = 10 +A = 16 +M = 1b + +ModInv = 14 +A = 17 +M = 1b + +ModInv = d +A = 19 +M = 1b + +ModInv = 1a +A = 1a +M = 1b + +ModInv = 1 +A = 1c +M = 1b + +ModInv = e +A = 1d +M = 1b + +ModInv = 7 +A = 1f +M = 1b + +ModInv = b +A = 20 +M = 1b + +ModInv = 4 +A = 22 +M = 1b + +ModInv = 11 +A = 23 +M = 1b + +ModInv = 13 +A = 25 +M = 1b + +ModInv = 5 +A = 26 +M = 1b + +ModInv = 19 +A = 28 +M = 1b + +ModInv = 2 +A = 29 +M = 1b + +ModInv = 16 +A = 2b +M = 1b + +ModInv = 8 +A = 2c +M = 1b + +ModInv = a +A = 2e +M = 1b + +ModInv = 17 +A = 2f +M = 1b + +ModInv = 10 +A = 31 +M = 1b + +ModInv = 14 +A = 32 +M = 1b + +ModInv = d +A = 34 +M = 1b + +ModInv = 1a +A = 35 +M = 1b + +ModInv = 1 +A = 37 +M = 1b + +ModInv = e +A = 38 +M = 1b + +ModInv = 7 +A = 3a +M = 1b + +ModInv = b +A = 3b +M = 1b + +ModInv = 4 +A = 3d +M = 1b + +ModInv = 11 +A = 3e +M = 1b + +ModInv = 13 +A = 40 +M = 1b + +ModInv = 5 +A = 41 +M = 1b + +ModInv = 19 +A = 43 +M = 1b + +ModInv = 2 +A = 44 +M = 1b + +ModInv = 16 +A = 46 +M = 1b + +ModInv = 8 +A = 47 +M = 1b + +ModInv = a +A = 49 +M = 1b + +ModInv = 17 +A = 4a +M = 1b + +ModInv = 10 +A = 4c +M = 1b + +ModInv = 14 +A = 4d +M = 1b + +ModInv = d +A = 4f +M = 1b + +ModInv = 1a +A = 50 +M = 1b + +ModInv = 1 +A = 52 +M = 1b + +ModInv = e +A = 53 +M = 1b + +ModInv = 7 +A = 55 +M = 1b + +ModInv = b +A = 56 +M = 1b + +ModInv = 4 +A = 58 +M = 1b + +ModInv = 11 +A = 59 +M = 1b + +ModInv = 13 +A = 5b +M = 1b + +ModInv = 5 +A = 5c +M = 1b + +ModInv = 19 +A = 5e +M = 1b + +ModInv = 2 +A = 5f +M = 1b + +ModInv = 16 +A = 61 +M = 1b + +ModInv = 8 +A = 62 +M = 1b + +ModInv = d +A = -63 +M = 1c + +ModInv = f +A = -61 +M = 1c + +ModInv = 5 +A = -5f +M = 1c + +ModInv = 3 +A = -5d +M = 1c + +ModInv = b +A = -59 +M = 1c + +ModInv = 9 +A = -57 +M = 1c + +ModInv = 1b +A = -55 +M = 1c + +ModInv = 1 +A = -53 +M = 1c + +ModInv = 13 +A = -51 +M = 1c + +ModInv = 11 +A = -4f +M = 1c + +ModInv = 19 +A = -4b +M = 1c + +ModInv = 17 +A = -49 +M = 1c + +ModInv = d +A = -47 +M = 1c + +ModInv = f +A = -45 +M = 1c + +ModInv = 5 +A = -43 +M = 1c + +ModInv = 3 +A = -41 +M = 1c + +ModInv = b +A = -3d +M = 1c + +ModInv = 9 +A = -3b +M = 1c + +ModInv = 1b +A = -39 +M = 1c + +ModInv = 1 +A = -37 +M = 1c + +ModInv = 13 +A = -35 +M = 1c + +ModInv = 11 +A = -33 +M = 1c + +ModInv = 19 +A = -2f +M = 1c + +ModInv = 17 +A = -2d +M = 1c + +ModInv = d +A = -2b +M = 1c + +ModInv = f +A = -29 +M = 1c + +ModInv = 5 +A = -27 +M = 1c + +ModInv = 3 +A = -25 +M = 1c + +ModInv = b +A = -21 +M = 1c + +ModInv = 9 +A = -1f +M = 1c + +ModInv = 1b +A = -1d +M = 1c + +ModInv = 1 +A = -1b +M = 1c + +ModInv = 13 +A = -19 +M = 1c + +ModInv = 11 +A = -17 +M = 1c + +ModInv = 19 +A = -13 +M = 1c + +ModInv = 17 +A = -11 +M = 1c + +ModInv = d +A = -f +M = 1c + +ModInv = f +A = -d +M = 1c + +ModInv = 5 +A = -b +M = 1c + +ModInv = 3 +A = -9 +M = 1c + +ModInv = b +A = -5 +M = 1c + +ModInv = 9 +A = -3 +M = 1c + +ModInv = 1b +A = -1 +M = 1c + +ModInv = 1 +A = 1 +M = 1c + +ModInv = 13 +A = 3 +M = 1c + +ModInv = 11 +A = 5 +M = 1c + +ModInv = 19 +A = 9 +M = 1c + +ModInv = 17 +A = b +M = 1c + +ModInv = d +A = d +M = 1c + +ModInv = f +A = f +M = 1c + +ModInv = 5 +A = 11 +M = 1c + +ModInv = 3 +A = 13 +M = 1c + +ModInv = b +A = 17 +M = 1c + +ModInv = 9 +A = 19 +M = 1c + +ModInv = 1b +A = 1b +M = 1c + +ModInv = 1 +A = 1d +M = 1c + +ModInv = 13 +A = 1f +M = 1c + +ModInv = 11 +A = 21 +M = 1c + +ModInv = 19 +A = 25 +M = 1c + +ModInv = 17 +A = 27 +M = 1c + +ModInv = d +A = 29 +M = 1c + +ModInv = f +A = 2b +M = 1c + +ModInv = 5 +A = 2d +M = 1c + +ModInv = 3 +A = 2f +M = 1c + +ModInv = b +A = 33 +M = 1c + +ModInv = 9 +A = 35 +M = 1c + +ModInv = 1b +A = 37 +M = 1c + +ModInv = 1 +A = 39 +M = 1c + +ModInv = 13 +A = 3b +M = 1c + +ModInv = 11 +A = 3d +M = 1c + +ModInv = 19 +A = 41 +M = 1c + +ModInv = 17 +A = 43 +M = 1c + +ModInv = d +A = 45 +M = 1c + +ModInv = f +A = 47 +M = 1c + +ModInv = 5 +A = 49 +M = 1c + +ModInv = 3 +A = 4b +M = 1c + +ModInv = b +A = 4f +M = 1c + +ModInv = 9 +A = 51 +M = 1c + +ModInv = 1b +A = 53 +M = 1c + +ModInv = 1 +A = 55 +M = 1c + +ModInv = 13 +A = 57 +M = 1c + +ModInv = 11 +A = 59 +M = 1c + +ModInv = 19 +A = 5d +M = 1c + +ModInv = 17 +A = 5f +M = 1c + +ModInv = d +A = 61 +M = 1c + +ModInv = f +A = 63 +M = 1c + +ModInv = 14 +A = -64 +M = 1d + +ModInv = c +A = -63 +M = 1d + +ModInv = 15 +A = -62 +M = 1d + +ModInv = 1a +A = -61 +M = 1d + +ModInv = 10 +A = -60 +M = 1d + +ModInv = 12 +A = -5f +M = 1d + +ModInv = 4 +A = -5e +M = 1d + +ModInv = 18 +A = -5d +M = 1d + +ModInv = 17 +A = -5c +M = 1d + +ModInv = 7 +A = -5b +M = 1d + +ModInv = 13 +A = -5a +M = 1d + +ModInv = e +A = -59 +M = 1d + +ModInv = 1c +A = -58 +M = 1d + +ModInv = 1 +A = -56 +M = 1d + +ModInv = f +A = -55 +M = 1d + +ModInv = a +A = -54 +M = 1d + +ModInv = 16 +A = -53 +M = 1d + +ModInv = 6 +A = -52 +M = 1d + +ModInv = 5 +A = -51 +M = 1d + +ModInv = 19 +A = -50 +M = 1d + +ModInv = b +A = -4f +M = 1d + +ModInv = d +A = -4e +M = 1d + +ModInv = 3 +A = -4d +M = 1d + +ModInv = 8 +A = -4c +M = 1d + +ModInv = 11 +A = -4b +M = 1d + +ModInv = 9 +A = -4a +M = 1d + +ModInv = 1b +A = -49 +M = 1d + +ModInv = 2 +A = -48 +M = 1d + +ModInv = 14 +A = -47 +M = 1d + +ModInv = c +A = -46 +M = 1d + +ModInv = 15 +A = -45 +M = 1d + +ModInv = 1a +A = -44 +M = 1d + +ModInv = 10 +A = -43 +M = 1d + +ModInv = 12 +A = -42 +M = 1d + +ModInv = 4 +A = -41 +M = 1d + +ModInv = 18 +A = -40 +M = 1d + +ModInv = 17 +A = -3f +M = 1d + +ModInv = 7 +A = -3e +M = 1d + +ModInv = 13 +A = -3d +M = 1d + +ModInv = e +A = -3c +M = 1d + +ModInv = 1c +A = -3b +M = 1d + +ModInv = 1 +A = -39 +M = 1d + +ModInv = f +A = -38 +M = 1d + +ModInv = a +A = -37 +M = 1d + +ModInv = 16 +A = -36 +M = 1d + +ModInv = 6 +A = -35 +M = 1d + +ModInv = 5 +A = -34 +M = 1d + +ModInv = 19 +A = -33 +M = 1d + +ModInv = b +A = -32 +M = 1d + +ModInv = d +A = -31 +M = 1d + +ModInv = 3 +A = -30 +M = 1d + +ModInv = 8 +A = -2f +M = 1d + +ModInv = 11 +A = -2e +M = 1d + +ModInv = 9 +A = -2d +M = 1d + +ModInv = 1b +A = -2c +M = 1d + +ModInv = 2 +A = -2b +M = 1d + +ModInv = 14 +A = -2a +M = 1d + +ModInv = c +A = -29 +M = 1d + +ModInv = 15 +A = -28 +M = 1d + +ModInv = 1a +A = -27 +M = 1d + +ModInv = 10 +A = -26 +M = 1d + +ModInv = 12 +A = -25 +M = 1d + +ModInv = 4 +A = -24 +M = 1d + +ModInv = 18 +A = -23 +M = 1d + +ModInv = 17 +A = -22 +M = 1d + +ModInv = 7 +A = -21 +M = 1d + +ModInv = 13 +A = -20 +M = 1d + +ModInv = e +A = -1f +M = 1d + +ModInv = 1c +A = -1e +M = 1d + +ModInv = 1 +A = -1c +M = 1d + +ModInv = f +A = -1b +M = 1d + +ModInv = a +A = -1a +M = 1d + +ModInv = 16 +A = -19 +M = 1d + +ModInv = 6 +A = -18 +M = 1d + +ModInv = 5 +A = -17 +M = 1d + +ModInv = 19 +A = -16 +M = 1d + +ModInv = b +A = -15 +M = 1d + +ModInv = d +A = -14 +M = 1d + +ModInv = 3 +A = -13 +M = 1d + +ModInv = 8 +A = -12 +M = 1d + +ModInv = 11 +A = -11 +M = 1d + +ModInv = 9 +A = -10 +M = 1d + +ModInv = 1b +A = -f +M = 1d + +ModInv = 2 +A = -e +M = 1d + +ModInv = 14 +A = -d +M = 1d + +ModInv = c +A = -c +M = 1d + +ModInv = 15 +A = -b +M = 1d + +ModInv = 1a +A = -a +M = 1d + +ModInv = 10 +A = -9 +M = 1d + +ModInv = 12 +A = -8 +M = 1d + +ModInv = 4 +A = -7 +M = 1d + +ModInv = 18 +A = -6 +M = 1d + +ModInv = 17 +A = -5 +M = 1d + +ModInv = 7 +A = -4 +M = 1d + +ModInv = 13 +A = -3 +M = 1d + +ModInv = e +A = -2 +M = 1d + +ModInv = 1c +A = -1 +M = 1d + +ModInv = 1 +A = 1 +M = 1d + +ModInv = f +A = 2 +M = 1d + +ModInv = a +A = 3 +M = 1d + +ModInv = 16 +A = 4 +M = 1d + +ModInv = 6 +A = 5 +M = 1d + +ModInv = 5 +A = 6 +M = 1d + +ModInv = 19 +A = 7 +M = 1d + +ModInv = b +A = 8 +M = 1d + +ModInv = d +A = 9 +M = 1d + +ModInv = 3 +A = a +M = 1d + +ModInv = 8 +A = b +M = 1d + +ModInv = 11 +A = c +M = 1d + +ModInv = 9 +A = d +M = 1d + +ModInv = 1b +A = e +M = 1d + +ModInv = 2 +A = f +M = 1d + +ModInv = 14 +A = 10 +M = 1d + +ModInv = c +A = 11 +M = 1d + +ModInv = 15 +A = 12 +M = 1d + +ModInv = 1a +A = 13 +M = 1d + +ModInv = 10 +A = 14 +M = 1d + +ModInv = 12 +A = 15 +M = 1d + +ModInv = 4 +A = 16 +M = 1d + +ModInv = 18 +A = 17 +M = 1d + +ModInv = 17 +A = 18 +M = 1d + +ModInv = 7 +A = 19 +M = 1d + +ModInv = 13 +A = 1a +M = 1d + +ModInv = e +A = 1b +M = 1d + +ModInv = 1c +A = 1c +M = 1d + +ModInv = 1 +A = 1e +M = 1d + +ModInv = f +A = 1f +M = 1d + +ModInv = a +A = 20 +M = 1d + +ModInv = 16 +A = 21 +M = 1d + +ModInv = 6 +A = 22 +M = 1d + +ModInv = 5 +A = 23 +M = 1d + +ModInv = 19 +A = 24 +M = 1d + +ModInv = b +A = 25 +M = 1d + +ModInv = d +A = 26 +M = 1d + +ModInv = 3 +A = 27 +M = 1d + +ModInv = 8 +A = 28 +M = 1d + +ModInv = 11 +A = 29 +M = 1d + +ModInv = 9 +A = 2a +M = 1d + +ModInv = 1b +A = 2b +M = 1d + +ModInv = 2 +A = 2c +M = 1d + +ModInv = 14 +A = 2d +M = 1d + +ModInv = c +A = 2e +M = 1d + +ModInv = 15 +A = 2f +M = 1d + +ModInv = 1a +A = 30 +M = 1d + +ModInv = 10 +A = 31 +M = 1d + +ModInv = 12 +A = 32 +M = 1d + +ModInv = 4 +A = 33 +M = 1d + +ModInv = 18 +A = 34 +M = 1d + +ModInv = 17 +A = 35 +M = 1d + +ModInv = 7 +A = 36 +M = 1d + +ModInv = 13 +A = 37 +M = 1d + +ModInv = e +A = 38 +M = 1d + +ModInv = 1c +A = 39 +M = 1d + +ModInv = 1 +A = 3b +M = 1d + +ModInv = f +A = 3c +M = 1d + +ModInv = a +A = 3d +M = 1d + +ModInv = 16 +A = 3e +M = 1d + +ModInv = 6 +A = 3f +M = 1d + +ModInv = 5 +A = 40 +M = 1d + +ModInv = 19 +A = 41 +M = 1d + +ModInv = b +A = 42 +M = 1d + +ModInv = d +A = 43 +M = 1d + +ModInv = 3 +A = 44 +M = 1d + +ModInv = 8 +A = 45 +M = 1d + +ModInv = 11 +A = 46 +M = 1d + +ModInv = 9 +A = 47 +M = 1d + +ModInv = 1b +A = 48 +M = 1d + +ModInv = 2 +A = 49 +M = 1d + +ModInv = 14 +A = 4a +M = 1d + +ModInv = c +A = 4b +M = 1d + +ModInv = 15 +A = 4c +M = 1d + +ModInv = 1a +A = 4d +M = 1d + +ModInv = 10 +A = 4e +M = 1d + +ModInv = 12 +A = 4f +M = 1d + +ModInv = 4 +A = 50 +M = 1d + +ModInv = 18 +A = 51 +M = 1d + +ModInv = 17 +A = 52 +M = 1d + +ModInv = 7 +A = 53 +M = 1d + +ModInv = 13 +A = 54 +M = 1d + +ModInv = e +A = 55 +M = 1d + +ModInv = 1c +A = 56 +M = 1d + +ModInv = 1 +A = 58 +M = 1d + +ModInv = f +A = 59 +M = 1d + +ModInv = a +A = 5a +M = 1d + +ModInv = 16 +A = 5b +M = 1d + +ModInv = 6 +A = 5c +M = 1d + +ModInv = 5 +A = 5d +M = 1d + +ModInv = 19 +A = 5e +M = 1d + +ModInv = b +A = 5f +M = 1d + +ModInv = d +A = 60 +M = 1d + +ModInv = 3 +A = 61 +M = 1d + +ModInv = 8 +A = 62 +M = 1d + +ModInv = 11 +A = 63 +M = 1d + +ModInv = 11 +A = -61 +M = 1e + +ModInv = 1d +A = -5b +M = 1e + +ModInv = 1 +A = -59 +M = 1e + +ModInv = d +A = -53 +M = 1e + +ModInv = b +A = -4f +M = 1e + +ModInv = 7 +A = -4d +M = 1e + +ModInv = 17 +A = -49 +M = 1e + +ModInv = 13 +A = -47 +M = 1e + +ModInv = 11 +A = -43 +M = 1e + +ModInv = 1d +A = -3d +M = 1e + +ModInv = 1 +A = -3b +M = 1e + +ModInv = d +A = -35 +M = 1e + +ModInv = b +A = -31 +M = 1e + +ModInv = 7 +A = -2f +M = 1e + +ModInv = 17 +A = -2b +M = 1e + +ModInv = 13 +A = -29 +M = 1e + +ModInv = 11 +A = -25 +M = 1e + +ModInv = 1d +A = -1f +M = 1e + +ModInv = 1 +A = -1d +M = 1e + +ModInv = d +A = -17 +M = 1e + +ModInv = b +A = -13 +M = 1e + +ModInv = 7 +A = -11 +M = 1e + +ModInv = 17 +A = -d +M = 1e + +ModInv = 13 +A = -b +M = 1e + +ModInv = 11 +A = -7 +M = 1e + +ModInv = 1d +A = -1 +M = 1e + +ModInv = 1 +A = 1 +M = 1e + +ModInv = d +A = 7 +M = 1e + +ModInv = b +A = b +M = 1e + +ModInv = 7 +A = d +M = 1e + +ModInv = 17 +A = 11 +M = 1e + +ModInv = 13 +A = 13 +M = 1e + +ModInv = 11 +A = 17 +M = 1e + +ModInv = 1d +A = 1d +M = 1e + +ModInv = 1 +A = 1f +M = 1e + +ModInv = d +A = 25 +M = 1e + +ModInv = b +A = 29 +M = 1e + +ModInv = 7 +A = 2b +M = 1e + +ModInv = 17 +A = 2f +M = 1e + +ModInv = 13 +A = 31 +M = 1e + +ModInv = 11 +A = 35 +M = 1e + +ModInv = 1d +A = 3b +M = 1e + +ModInv = 1 +A = 3d +M = 1e + +ModInv = d +A = 43 +M = 1e + +ModInv = b +A = 47 +M = 1e + +ModInv = 7 +A = 49 +M = 1e + +ModInv = 17 +A = 4d +M = 1e + +ModInv = 13 +A = 4f +M = 1e + +ModInv = 11 +A = 53 +M = 1e + +ModInv = 1d +A = 59 +M = 1e + +ModInv = 1 +A = 5b +M = 1e + +ModInv = d +A = 61 +M = 1e + +ModInv = 16 +A = -64 +M = 1f + +ModInv = 5 +A = -63 +M = 1f + +ModInv = 6 +A = -62 +M = 1f + +ModInv = 17 +A = -61 +M = 1f + +ModInv = a +A = -60 +M = 1f + +ModInv = f +A = -5f +M = 1f + +ModInv = 1e +A = -5e +M = 1f + +ModInv = 1 +A = -5c +M = 1f + +ModInv = 10 +A = -5b +M = 1f + +ModInv = 15 +A = -5a +M = 1f + +ModInv = 8 +A = -59 +M = 1f + +ModInv = 19 +A = -58 +M = 1f + +ModInv = 1a +A = -57 +M = 1f + +ModInv = 9 +A = -56 +M = 1f + +ModInv = 4 +A = -55 +M = 1f + +ModInv = 7 +A = -54 +M = 1f + +ModInv = 1c +A = -53 +M = 1f + +ModInv = 11 +A = -52 +M = 1f + +ModInv = d +A = -51 +M = 1f + +ModInv = c +A = -50 +M = 1f + +ModInv = 14 +A = -4f +M = 1f + +ModInv = 1d +A = -4e +M = 1f + +ModInv = 2 +A = -4d +M = 1f + +ModInv = b +A = -4c +M = 1f + +ModInv = 13 +A = -4b +M = 1f + +ModInv = 12 +A = -4a +M = 1f + +ModInv = e +A = -49 +M = 1f + +ModInv = 3 +A = -48 +M = 1f + +ModInv = 18 +A = -47 +M = 1f + +ModInv = 1b +A = -46 +M = 1f + +ModInv = 16 +A = -45 +M = 1f + +ModInv = 5 +A = -44 +M = 1f + +ModInv = 6 +A = -43 +M = 1f + +ModInv = 17 +A = -42 +M = 1f + +ModInv = a +A = -41 +M = 1f + +ModInv = f +A = -40 +M = 1f + +ModInv = 1e +A = -3f +M = 1f + +ModInv = 1 +A = -3d +M = 1f + +ModInv = 10 +A = -3c +M = 1f + +ModInv = 15 +A = -3b +M = 1f + +ModInv = 8 +A = -3a +M = 1f + +ModInv = 19 +A = -39 +M = 1f + +ModInv = 1a +A = -38 +M = 1f + +ModInv = 9 +A = -37 +M = 1f + +ModInv = 4 +A = -36 +M = 1f + +ModInv = 7 +A = -35 +M = 1f + +ModInv = 1c +A = -34 +M = 1f + +ModInv = 11 +A = -33 +M = 1f + +ModInv = d +A = -32 +M = 1f + +ModInv = c +A = -31 +M = 1f + +ModInv = 14 +A = -30 +M = 1f + +ModInv = 1d +A = -2f +M = 1f + +ModInv = 2 +A = -2e +M = 1f + +ModInv = b +A = -2d +M = 1f + +ModInv = 13 +A = -2c +M = 1f + +ModInv = 12 +A = -2b +M = 1f + +ModInv = e +A = -2a +M = 1f + +ModInv = 3 +A = -29 +M = 1f + +ModInv = 18 +A = -28 +M = 1f + +ModInv = 1b +A = -27 +M = 1f + +ModInv = 16 +A = -26 +M = 1f + +ModInv = 5 +A = -25 +M = 1f + +ModInv = 6 +A = -24 +M = 1f + +ModInv = 17 +A = -23 +M = 1f + +ModInv = a +A = -22 +M = 1f + +ModInv = f +A = -21 +M = 1f + +ModInv = 1e +A = -20 +M = 1f + +ModInv = 1 +A = -1e +M = 1f + +ModInv = 10 +A = -1d +M = 1f + +ModInv = 15 +A = -1c +M = 1f + +ModInv = 8 +A = -1b +M = 1f + +ModInv = 19 +A = -1a +M = 1f + +ModInv = 1a +A = -19 +M = 1f + +ModInv = 9 +A = -18 +M = 1f + +ModInv = 4 +A = -17 +M = 1f + +ModInv = 7 +A = -16 +M = 1f + +ModInv = 1c +A = -15 +M = 1f + +ModInv = 11 +A = -14 +M = 1f + +ModInv = d +A = -13 +M = 1f + +ModInv = c +A = -12 +M = 1f + +ModInv = 14 +A = -11 +M = 1f + +ModInv = 1d +A = -10 +M = 1f + +ModInv = 2 +A = -f +M = 1f + +ModInv = b +A = -e +M = 1f + +ModInv = 13 +A = -d +M = 1f + +ModInv = 12 +A = -c +M = 1f + +ModInv = e +A = -b +M = 1f + +ModInv = 3 +A = -a +M = 1f + +ModInv = 18 +A = -9 +M = 1f + +ModInv = 1b +A = -8 +M = 1f + +ModInv = 16 +A = -7 +M = 1f + +ModInv = 5 +A = -6 +M = 1f + +ModInv = 6 +A = -5 +M = 1f + +ModInv = 17 +A = -4 +M = 1f + +ModInv = a +A = -3 +M = 1f + +ModInv = f +A = -2 +M = 1f + +ModInv = 1e +A = -1 +M = 1f + +ModInv = 1 +A = 1 +M = 1f + +ModInv = 10 +A = 2 +M = 1f + +ModInv = 15 +A = 3 +M = 1f + +ModInv = 8 +A = 4 +M = 1f + +ModInv = 19 +A = 5 +M = 1f + +ModInv = 1a +A = 6 +M = 1f + +ModInv = 9 +A = 7 +M = 1f + +ModInv = 4 +A = 8 +M = 1f + +ModInv = 7 +A = 9 +M = 1f + +ModInv = 1c +A = a +M = 1f + +ModInv = 11 +A = b +M = 1f + +ModInv = d +A = c +M = 1f + +ModInv = c +A = d +M = 1f + +ModInv = 14 +A = e +M = 1f + +ModInv = 1d +A = f +M = 1f + +ModInv = 2 +A = 10 +M = 1f + +ModInv = b +A = 11 +M = 1f + +ModInv = 13 +A = 12 +M = 1f + +ModInv = 12 +A = 13 +M = 1f + +ModInv = e +A = 14 +M = 1f + +ModInv = 3 +A = 15 +M = 1f + +ModInv = 18 +A = 16 +M = 1f + +ModInv = 1b +A = 17 +M = 1f + +ModInv = 16 +A = 18 +M = 1f + +ModInv = 5 +A = 19 +M = 1f + +ModInv = 6 +A = 1a +M = 1f + +ModInv = 17 +A = 1b +M = 1f + +ModInv = a +A = 1c +M = 1f + +ModInv = f +A = 1d +M = 1f + +ModInv = 1e +A = 1e +M = 1f + +ModInv = 1 +A = 20 +M = 1f + +ModInv = 10 +A = 21 +M = 1f + +ModInv = 15 +A = 22 +M = 1f + +ModInv = 8 +A = 23 +M = 1f + +ModInv = 19 +A = 24 +M = 1f + +ModInv = 1a +A = 25 +M = 1f + +ModInv = 9 +A = 26 +M = 1f + +ModInv = 4 +A = 27 +M = 1f + +ModInv = 7 +A = 28 +M = 1f + +ModInv = 1c +A = 29 +M = 1f + +ModInv = 11 +A = 2a +M = 1f + +ModInv = d +A = 2b +M = 1f + +ModInv = c +A = 2c +M = 1f + +ModInv = 14 +A = 2d +M = 1f + +ModInv = 1d +A = 2e +M = 1f + +ModInv = 2 +A = 2f +M = 1f + +ModInv = b +A = 30 +M = 1f + +ModInv = 13 +A = 31 +M = 1f + +ModInv = 12 +A = 32 +M = 1f + +ModInv = e +A = 33 +M = 1f + +ModInv = 3 +A = 34 +M = 1f + +ModInv = 18 +A = 35 +M = 1f + +ModInv = 1b +A = 36 +M = 1f + +ModInv = 16 +A = 37 +M = 1f + +ModInv = 5 +A = 38 +M = 1f + +ModInv = 6 +A = 39 +M = 1f + +ModInv = 17 +A = 3a +M = 1f + +ModInv = a +A = 3b +M = 1f + +ModInv = f +A = 3c +M = 1f + +ModInv = 1e +A = 3d +M = 1f + +ModInv = 1 +A = 3f +M = 1f + +ModInv = 10 +A = 40 +M = 1f + +ModInv = 15 +A = 41 +M = 1f + +ModInv = 8 +A = 42 +M = 1f + +ModInv = 19 +A = 43 +M = 1f + +ModInv = 1a +A = 44 +M = 1f + +ModInv = 9 +A = 45 +M = 1f + +ModInv = 4 +A = 46 +M = 1f + +ModInv = 7 +A = 47 +M = 1f + +ModInv = 1c +A = 48 +M = 1f + +ModInv = 11 +A = 49 +M = 1f + +ModInv = d +A = 4a +M = 1f + +ModInv = c +A = 4b +M = 1f + +ModInv = 14 +A = 4c +M = 1f + +ModInv = 1d +A = 4d +M = 1f + +ModInv = 2 +A = 4e +M = 1f + +ModInv = b +A = 4f +M = 1f + +ModInv = 13 +A = 50 +M = 1f + +ModInv = 12 +A = 51 +M = 1f + +ModInv = e +A = 52 +M = 1f + +ModInv = 3 +A = 53 +M = 1f + +ModInv = 18 +A = 54 +M = 1f + +ModInv = 1b +A = 55 +M = 1f + +ModInv = 16 +A = 56 +M = 1f + +ModInv = 5 +A = 57 +M = 1f + +ModInv = 6 +A = 58 +M = 1f + +ModInv = 17 +A = 59 +M = 1f + +ModInv = a +A = 5a +M = 1f + +ModInv = f +A = 5b +M = 1f + +ModInv = 1e +A = 5c +M = 1f + +ModInv = 1 +A = 5e +M = 1f + +ModInv = 10 +A = 5f +M = 1f + +ModInv = 15 +A = 60 +M = 1f + +ModInv = 8 +A = 61 +M = 1f + +ModInv = 19 +A = 62 +M = 1f + +ModInv = 1a +A = 63 +M = 1f + +ModInv = 15 +A = -63 +M = 20 + +ModInv = 1f +A = -61 +M = 20 + +ModInv = 1 +A = -5f +M = 20 + +ModInv = b +A = -5d +M = 20 + +ModInv = d +A = -5b +M = 20 + +ModInv = 17 +A = -59 +M = 20 + +ModInv = 19 +A = -57 +M = 20 + +ModInv = 3 +A = -55 +M = 20 + +ModInv = 5 +A = -53 +M = 20 + +ModInv = f +A = -51 +M = 20 + +ModInv = 11 +A = -4f +M = 20 + +ModInv = 1b +A = -4d +M = 20 + +ModInv = 1d +A = -4b +M = 20 + +ModInv = 7 +A = -49 +M = 20 + +ModInv = 9 +A = -47 +M = 20 + +ModInv = 13 +A = -45 +M = 20 + +ModInv = 15 +A = -43 +M = 20 + +ModInv = 1f +A = -41 +M = 20 + +ModInv = 1 +A = -3f +M = 20 + +ModInv = b +A = -3d +M = 20 + +ModInv = d +A = -3b +M = 20 + +ModInv = 17 +A = -39 +M = 20 + +ModInv = 19 +A = -37 +M = 20 + +ModInv = 3 +A = -35 +M = 20 + +ModInv = 5 +A = -33 +M = 20 + +ModInv = f +A = -31 +M = 20 + +ModInv = 11 +A = -2f +M = 20 + +ModInv = 1b +A = -2d +M = 20 + +ModInv = 1d +A = -2b +M = 20 + +ModInv = 7 +A = -29 +M = 20 + +ModInv = 9 +A = -27 +M = 20 + +ModInv = 13 +A = -25 +M = 20 + +ModInv = 15 +A = -23 +M = 20 + +ModInv = 1f +A = -21 +M = 20 + +ModInv = 1 +A = -1f +M = 20 + +ModInv = b +A = -1d +M = 20 + +ModInv = d +A = -1b +M = 20 + +ModInv = 17 +A = -19 +M = 20 + +ModInv = 19 +A = -17 +M = 20 + +ModInv = 3 +A = -15 +M = 20 + +ModInv = 5 +A = -13 +M = 20 + +ModInv = f +A = -11 +M = 20 + +ModInv = 11 +A = -f +M = 20 + +ModInv = 1b +A = -d +M = 20 + +ModInv = 1d +A = -b +M = 20 + +ModInv = 7 +A = -9 +M = 20 + +ModInv = 9 +A = -7 +M = 20 + +ModInv = 13 +A = -5 +M = 20 + +ModInv = 15 +A = -3 +M = 20 + +ModInv = 1f +A = -1 +M = 20 + +ModInv = 1 +A = 1 +M = 20 + +ModInv = b +A = 3 +M = 20 + +ModInv = d +A = 5 +M = 20 + +ModInv = 17 +A = 7 +M = 20 + +ModInv = 19 +A = 9 +M = 20 + +ModInv = 3 +A = b +M = 20 + +ModInv = 5 +A = d +M = 20 + +ModInv = f +A = f +M = 20 + +ModInv = 11 +A = 11 +M = 20 + +ModInv = 1b +A = 13 +M = 20 + +ModInv = 1d +A = 15 +M = 20 + +ModInv = 7 +A = 17 +M = 20 + +ModInv = 9 +A = 19 +M = 20 + +ModInv = 13 +A = 1b +M = 20 + +ModInv = 15 +A = 1d +M = 20 + +ModInv = 1f +A = 1f +M = 20 + +ModInv = 1 +A = 21 +M = 20 + +ModInv = b +A = 23 +M = 20 + +ModInv = d +A = 25 +M = 20 + +ModInv = 17 +A = 27 +M = 20 + +ModInv = 19 +A = 29 +M = 20 + +ModInv = 3 +A = 2b +M = 20 + +ModInv = 5 +A = 2d +M = 20 + +ModInv = f +A = 2f +M = 20 + +ModInv = 11 +A = 31 +M = 20 + +ModInv = 1b +A = 33 +M = 20 + +ModInv = 1d +A = 35 +M = 20 + +ModInv = 7 +A = 37 +M = 20 + +ModInv = 9 +A = 39 +M = 20 + +ModInv = 13 +A = 3b +M = 20 + +ModInv = 15 +A = 3d +M = 20 + +ModInv = 1f +A = 3f +M = 20 + +ModInv = 1 +A = 41 +M = 20 + +ModInv = b +A = 43 +M = 20 + +ModInv = d +A = 45 +M = 20 + +ModInv = 17 +A = 47 +M = 20 + +ModInv = 19 +A = 49 +M = 20 + +ModInv = 3 +A = 4b +M = 20 + +ModInv = 5 +A = 4d +M = 20 + +ModInv = f +A = 4f +M = 20 + +ModInv = 11 +A = 51 +M = 20 + +ModInv = 1b +A = 53 +M = 20 + +ModInv = 1d +A = 55 +M = 20 + +ModInv = 7 +A = 57 +M = 20 + +ModInv = 9 +A = 59 +M = 20 + +ModInv = 13 +A = 5b +M = 20 + +ModInv = 15 +A = 5d +M = 20 + +ModInv = 1f +A = 5f +M = 20 + +ModInv = 1 +A = 61 +M = 20 + +ModInv = b +A = 63 +M = 20 + +ModInv = 20 +A = -64 +M = 21 + +ModInv = 1 +A = -62 +M = 21 + +ModInv = 11 +A = -61 +M = 21 + +ModInv = 19 +A = -5f +M = 21 + +ModInv = 14 +A = -5e +M = 21 + +ModInv = 13 +A = -5c +M = 21 + +ModInv = 1d +A = -5b +M = 21 + +ModInv = a +A = -59 +M = 21 + +ModInv = 1c +A = -56 +M = 21 + +ModInv = 1a +A = -55 +M = 21 + +ModInv = 1f +A = -53 +M = 21 + +ModInv = 2 +A = -52 +M = 21 + +ModInv = 7 +A = -50 +M = 21 + +ModInv = 5 +A = -4f +M = 21 + +ModInv = 17 +A = -4c +M = 21 + +ModInv = 4 +A = -4a +M = 21 + +ModInv = e +A = -49 +M = 21 + +ModInv = d +A = -47 +M = 21 + +ModInv = 8 +A = -46 +M = 21 + +ModInv = 10 +A = -44 +M = 21 + +ModInv = 20 +A = -43 +M = 21 + +ModInv = 1 +A = -41 +M = 21 + +ModInv = 11 +A = -40 +M = 21 + +ModInv = 19 +A = -3e +M = 21 + +ModInv = 14 +A = -3d +M = 21 + +ModInv = 13 +A = -3b +M = 21 + +ModInv = 1d +A = -3a +M = 21 + +ModInv = a +A = -38 +M = 21 + +ModInv = 1c +A = -35 +M = 21 + +ModInv = 1a +A = -34 +M = 21 + +ModInv = 1f +A = -32 +M = 21 + +ModInv = 2 +A = -31 +M = 21 + +ModInv = 7 +A = -2f +M = 21 + +ModInv = 5 +A = -2e +M = 21 + +ModInv = 17 +A = -2b +M = 21 + +ModInv = 4 +A = -29 +M = 21 + +ModInv = e +A = -28 +M = 21 + +ModInv = d +A = -26 +M = 21 + +ModInv = 8 +A = -25 +M = 21 + +ModInv = 10 +A = -23 +M = 21 + +ModInv = 20 +A = -22 +M = 21 + +ModInv = 1 +A = -20 +M = 21 + +ModInv = 11 +A = -1f +M = 21 + +ModInv = 19 +A = -1d +M = 21 + +ModInv = 14 +A = -1c +M = 21 + +ModInv = 13 +A = -1a +M = 21 + +ModInv = 1d +A = -19 +M = 21 + +ModInv = a +A = -17 +M = 21 + +ModInv = 1c +A = -14 +M = 21 + +ModInv = 1a +A = -13 +M = 21 + +ModInv = 1f +A = -11 +M = 21 + +ModInv = 2 +A = -10 +M = 21 + +ModInv = 7 +A = -e +M = 21 + +ModInv = 5 +A = -d +M = 21 + +ModInv = 17 +A = -a +M = 21 + +ModInv = 4 +A = -8 +M = 21 + +ModInv = e +A = -7 +M = 21 + +ModInv = d +A = -5 +M = 21 + +ModInv = 8 +A = -4 +M = 21 + +ModInv = 10 +A = -2 +M = 21 + +ModInv = 20 +A = -1 +M = 21 + +ModInv = 1 +A = 1 +M = 21 + +ModInv = 11 +A = 2 +M = 21 + +ModInv = 19 +A = 4 +M = 21 + +ModInv = 14 +A = 5 +M = 21 + +ModInv = 13 +A = 7 +M = 21 + +ModInv = 1d +A = 8 +M = 21 + +ModInv = a +A = a +M = 21 + +ModInv = 1c +A = d +M = 21 + +ModInv = 1a +A = e +M = 21 + +ModInv = 1f +A = 10 +M = 21 + +ModInv = 2 +A = 11 +M = 21 + +ModInv = 7 +A = 13 +M = 21 + +ModInv = 5 +A = 14 +M = 21 + +ModInv = 17 +A = 17 +M = 21 + +ModInv = 4 +A = 19 +M = 21 + +ModInv = e +A = 1a +M = 21 + +ModInv = d +A = 1c +M = 21 + +ModInv = 8 +A = 1d +M = 21 + +ModInv = 10 +A = 1f +M = 21 + +ModInv = 20 +A = 20 +M = 21 + +ModInv = 1 +A = 22 +M = 21 + +ModInv = 11 +A = 23 +M = 21 + +ModInv = 19 +A = 25 +M = 21 + +ModInv = 14 +A = 26 +M = 21 + +ModInv = 13 +A = 28 +M = 21 + +ModInv = 1d +A = 29 +M = 21 + +ModInv = a +A = 2b +M = 21 + +ModInv = 1c +A = 2e +M = 21 + +ModInv = 1a +A = 2f +M = 21 + +ModInv = 1f +A = 31 +M = 21 + +ModInv = 2 +A = 32 +M = 21 + +ModInv = 7 +A = 34 +M = 21 + +ModInv = 5 +A = 35 +M = 21 + +ModInv = 17 +A = 38 +M = 21 + +ModInv = 4 +A = 3a +M = 21 + +ModInv = e +A = 3b +M = 21 + +ModInv = d +A = 3d +M = 21 + +ModInv = 8 +A = 3e +M = 21 + +ModInv = 10 +A = 40 +M = 21 + +ModInv = 20 +A = 41 +M = 21 + +ModInv = 1 +A = 43 +M = 21 + +ModInv = 11 +A = 44 +M = 21 + +ModInv = 19 +A = 46 +M = 21 + +ModInv = 14 +A = 47 +M = 21 + +ModInv = 13 +A = 49 +M = 21 + +ModInv = 1d +A = 4a +M = 21 + +ModInv = a +A = 4c +M = 21 + +ModInv = 1c +A = 4f +M = 21 + +ModInv = 1a +A = 50 +M = 21 + +ModInv = 1f +A = 52 +M = 21 + +ModInv = 2 +A = 53 +M = 21 + +ModInv = 7 +A = 55 +M = 21 + +ModInv = 5 +A = 56 +M = 21 + +ModInv = 17 +A = 59 +M = 21 + +ModInv = 4 +A = 5b +M = 21 + +ModInv = e +A = 5c +M = 21 + +ModInv = d +A = 5e +M = 21 + +ModInv = 8 +A = 5f +M = 21 + +ModInv = 10 +A = 61 +M = 21 + +ModInv = 20 +A = 62 +M = 21 + +ModInv = 17 +A = -63 +M = 22 + +ModInv = 7 +A = -61 +M = 22 + +ModInv = 5 +A = -5f +M = 22 + +ModInv = 13 +A = -5d +M = 22 + +ModInv = 1f +A = -5b +M = 22 + +ModInv = 15 +A = -59 +M = 22 + +ModInv = 19 +A = -57 +M = 22 + +ModInv = 9 +A = -53 +M = 22 + +ModInv = d +A = -51 +M = 22 + +ModInv = 3 +A = -4f +M = 22 + +ModInv = f +A = -4d +M = 22 + +ModInv = 1d +A = -4b +M = 22 + +ModInv = 1b +A = -49 +M = 22 + +ModInv = b +A = -47 +M = 22 + +ModInv = 21 +A = -45 +M = 22 + +ModInv = 1 +A = -43 +M = 22 + +ModInv = 17 +A = -41 +M = 22 + +ModInv = 7 +A = -3f +M = 22 + +ModInv = 5 +A = -3d +M = 22 + +ModInv = 13 +A = -3b +M = 22 + +ModInv = 1f +A = -39 +M = 22 + +ModInv = 15 +A = -37 +M = 22 + +ModInv = 19 +A = -35 +M = 22 + +ModInv = 9 +A = -31 +M = 22 + +ModInv = d +A = -2f +M = 22 + +ModInv = 3 +A = -2d +M = 22 + +ModInv = f +A = -2b +M = 22 + +ModInv = 1d +A = -29 +M = 22 + +ModInv = 1b +A = -27 +M = 22 + +ModInv = b +A = -25 +M = 22 + +ModInv = 21 +A = -23 +M = 22 + +ModInv = 1 +A = -21 +M = 22 + +ModInv = 17 +A = -1f +M = 22 + +ModInv = 7 +A = -1d +M = 22 + +ModInv = 5 +A = -1b +M = 22 + +ModInv = 13 +A = -19 +M = 22 + +ModInv = 1f +A = -17 +M = 22 + +ModInv = 15 +A = -15 +M = 22 + +ModInv = 19 +A = -13 +M = 22 + +ModInv = 9 +A = -f +M = 22 + +ModInv = d +A = -d +M = 22 + +ModInv = 3 +A = -b +M = 22 + +ModInv = f +A = -9 +M = 22 + +ModInv = 1d +A = -7 +M = 22 + +ModInv = 1b +A = -5 +M = 22 + +ModInv = b +A = -3 +M = 22 + +ModInv = 21 +A = -1 +M = 22 + +ModInv = 1 +A = 1 +M = 22 + +ModInv = 17 +A = 3 +M = 22 + +ModInv = 7 +A = 5 +M = 22 + +ModInv = 5 +A = 7 +M = 22 + +ModInv = 13 +A = 9 +M = 22 + +ModInv = 1f +A = b +M = 22 + +ModInv = 15 +A = d +M = 22 + +ModInv = 19 +A = f +M = 22 + +ModInv = 9 +A = 13 +M = 22 + +ModInv = d +A = 15 +M = 22 + +ModInv = 3 +A = 17 +M = 22 + +ModInv = f +A = 19 +M = 22 + +ModInv = 1d +A = 1b +M = 22 + +ModInv = 1b +A = 1d +M = 22 + +ModInv = b +A = 1f +M = 22 + +ModInv = 21 +A = 21 +M = 22 + +ModInv = 1 +A = 23 +M = 22 + +ModInv = 17 +A = 25 +M = 22 + +ModInv = 7 +A = 27 +M = 22 + +ModInv = 5 +A = 29 +M = 22 + +ModInv = 13 +A = 2b +M = 22 + +ModInv = 1f +A = 2d +M = 22 + +ModInv = 15 +A = 2f +M = 22 + +ModInv = 19 +A = 31 +M = 22 + +ModInv = 9 +A = 35 +M = 22 + +ModInv = d +A = 37 +M = 22 + +ModInv = 3 +A = 39 +M = 22 + +ModInv = f +A = 3b +M = 22 + +ModInv = 1d +A = 3d +M = 22 + +ModInv = 1b +A = 3f +M = 22 + +ModInv = b +A = 41 +M = 22 + +ModInv = 21 +A = 43 +M = 22 + +ModInv = 1 +A = 45 +M = 22 + +ModInv = 17 +A = 47 +M = 22 + +ModInv = 7 +A = 49 +M = 22 + +ModInv = 5 +A = 4b +M = 22 + +ModInv = 13 +A = 4d +M = 22 + +ModInv = 1f +A = 4f +M = 22 + +ModInv = 15 +A = 51 +M = 22 + +ModInv = 19 +A = 53 +M = 22 + +ModInv = 9 +A = 57 +M = 22 + +ModInv = d +A = 59 +M = 22 + +ModInv = 3 +A = 5b +M = 22 + +ModInv = f +A = 5d +M = 22 + +ModInv = 1d +A = 5f +M = 22 + +ModInv = 1b +A = 61 +M = 22 + +ModInv = b +A = 63 +M = 22 + +ModInv = 6 +A = -63 +M = 23 + +ModInv = 16 +A = -61 +M = 23 + +ModInv = 4 +A = -60 +M = 23 + +ModInv = 10 +A = -5e +M = 23 + +ModInv = 3 +A = -5d +M = 23 + +ModInv = 1b +A = -5c +M = 23 + +ModInv = b +A = -59 +M = 23 + +ModInv = 21 +A = -58 +M = 23 + +ModInv = 2 +A = -57 +M = 23 + +ModInv = 18 +A = -56 +M = 23 + +ModInv = 8 +A = -53 +M = 23 + +ModInv = 20 +A = -52 +M = 23 + +ModInv = 13 +A = -51 +M = 23 + +ModInv = 1f +A = -4f +M = 23 + +ModInv = d +A = -4e +M = 23 + +ModInv = 1d +A = -4c +M = 23 + +ModInv = 1a +A = -4a +M = 23 + +ModInv = 17 +A = -49 +M = 23 + +ModInv = 11 +A = -48 +M = 23 + +ModInv = 22 +A = -47 +M = 23 + +ModInv = 1 +A = -45 +M = 23 + +ModInv = 12 +A = -44 +M = 23 + +ModInv = c +A = -43 +M = 23 + +ModInv = 9 +A = -42 +M = 23 + +ModInv = 6 +A = -40 +M = 23 + +ModInv = 16 +A = -3e +M = 23 + +ModInv = 4 +A = -3d +M = 23 + +ModInv = 10 +A = -3b +M = 23 + +ModInv = 3 +A = -3a +M = 23 + +ModInv = 1b +A = -39 +M = 23 + +ModInv = b +A = -36 +M = 23 + +ModInv = 21 +A = -35 +M = 23 + +ModInv = 2 +A = -34 +M = 23 + +ModInv = 18 +A = -33 +M = 23 + +ModInv = 8 +A = -30 +M = 23 + +ModInv = 20 +A = -2f +M = 23 + +ModInv = 13 +A = -2e +M = 23 + +ModInv = 1f +A = -2c +M = 23 + +ModInv = d +A = -2b +M = 23 + +ModInv = 1d +A = -29 +M = 23 + +ModInv = 1a +A = -27 +M = 23 + +ModInv = 17 +A = -26 +M = 23 + +ModInv = 11 +A = -25 +M = 23 + +ModInv = 22 +A = -24 +M = 23 + +ModInv = 1 +A = -22 +M = 23 + +ModInv = 12 +A = -21 +M = 23 + +ModInv = c +A = -20 +M = 23 + +ModInv = 9 +A = -1f +M = 23 + +ModInv = 6 +A = -1d +M = 23 + +ModInv = 16 +A = -1b +M = 23 + +ModInv = 4 +A = -1a +M = 23 + +ModInv = 10 +A = -18 +M = 23 + +ModInv = 3 +A = -17 +M = 23 + +ModInv = 1b +A = -16 +M = 23 + +ModInv = b +A = -13 +M = 23 + +ModInv = 21 +A = -12 +M = 23 + +ModInv = 2 +A = -11 +M = 23 + +ModInv = 18 +A = -10 +M = 23 + +ModInv = 8 +A = -d +M = 23 + +ModInv = 20 +A = -c +M = 23 + +ModInv = 13 +A = -b +M = 23 + +ModInv = 1f +A = -9 +M = 23 + +ModInv = d +A = -8 +M = 23 + +ModInv = 1d +A = -6 +M = 23 + +ModInv = 1a +A = -4 +M = 23 + +ModInv = 17 +A = -3 +M = 23 + +ModInv = 11 +A = -2 +M = 23 + +ModInv = 22 +A = -1 +M = 23 + +ModInv = 1 +A = 1 +M = 23 + +ModInv = 12 +A = 2 +M = 23 + +ModInv = c +A = 3 +M = 23 + +ModInv = 9 +A = 4 +M = 23 + +ModInv = 6 +A = 6 +M = 23 + +ModInv = 16 +A = 8 +M = 23 + +ModInv = 4 +A = 9 +M = 23 + +ModInv = 10 +A = b +M = 23 + +ModInv = 3 +A = c +M = 23 + +ModInv = 1b +A = d +M = 23 + +ModInv = b +A = 10 +M = 23 + +ModInv = 21 +A = 11 +M = 23 + +ModInv = 2 +A = 12 +M = 23 + +ModInv = 18 +A = 13 +M = 23 + +ModInv = 8 +A = 16 +M = 23 + +ModInv = 20 +A = 17 +M = 23 + +ModInv = 13 +A = 18 +M = 23 + +ModInv = 1f +A = 1a +M = 23 + +ModInv = d +A = 1b +M = 23 + +ModInv = 1d +A = 1d +M = 23 + +ModInv = 1a +A = 1f +M = 23 + +ModInv = 17 +A = 20 +M = 23 + +ModInv = 11 +A = 21 +M = 23 + +ModInv = 22 +A = 22 +M = 23 + +ModInv = 1 +A = 24 +M = 23 + +ModInv = 12 +A = 25 +M = 23 + +ModInv = c +A = 26 +M = 23 + +ModInv = 9 +A = 27 +M = 23 + +ModInv = 6 +A = 29 +M = 23 + +ModInv = 16 +A = 2b +M = 23 + +ModInv = 4 +A = 2c +M = 23 + +ModInv = 10 +A = 2e +M = 23 + +ModInv = 3 +A = 2f +M = 23 + +ModInv = 1b +A = 30 +M = 23 + +ModInv = b +A = 33 +M = 23 + +ModInv = 21 +A = 34 +M = 23 + +ModInv = 2 +A = 35 +M = 23 + +ModInv = 18 +A = 36 +M = 23 + +ModInv = 8 +A = 39 +M = 23 + +ModInv = 20 +A = 3a +M = 23 + +ModInv = 13 +A = 3b +M = 23 + +ModInv = 1f +A = 3d +M = 23 + +ModInv = d +A = 3e +M = 23 + +ModInv = 1d +A = 40 +M = 23 + +ModInv = 1a +A = 42 +M = 23 + +ModInv = 17 +A = 43 +M = 23 + +ModInv = 11 +A = 44 +M = 23 + +ModInv = 22 +A = 45 +M = 23 + +ModInv = 1 +A = 47 +M = 23 + +ModInv = 12 +A = 48 +M = 23 + +ModInv = c +A = 49 +M = 23 + +ModInv = 9 +A = 4a +M = 23 + +ModInv = 6 +A = 4c +M = 23 + +ModInv = 16 +A = 4e +M = 23 + +ModInv = 4 +A = 4f +M = 23 + +ModInv = 10 +A = 51 +M = 23 + +ModInv = 3 +A = 52 +M = 23 + +ModInv = 1b +A = 53 +M = 23 + +ModInv = b +A = 56 +M = 23 + +ModInv = 21 +A = 57 +M = 23 + +ModInv = 2 +A = 58 +M = 23 + +ModInv = 18 +A = 59 +M = 23 + +ModInv = 8 +A = 5c +M = 23 + +ModInv = 20 +A = 5d +M = 23 + +ModInv = 13 +A = 5e +M = 23 + +ModInv = 1f +A = 60 +M = 23 + +ModInv = d +A = 61 +M = 23 + +ModInv = 1d +A = 63 +M = 23 + +ModInv = 17 +A = -61 +M = 24 + +ModInv = 19 +A = -5f +M = 24 + +ModInv = 11 +A = -5b +M = 24 + +ModInv = 13 +A = -59 +M = 24 + +ModInv = b +A = -55 +M = 24 + +ModInv = d +A = -53 +M = 24 + +ModInv = 5 +A = -4f +M = 24 + +ModInv = 7 +A = -4d +M = 24 + +ModInv = 23 +A = -49 +M = 24 + +ModInv = 1 +A = -47 +M = 24 + +ModInv = 1d +A = -43 +M = 24 + +ModInv = 1f +A = -41 +M = 24 + +ModInv = 17 +A = -3d +M = 24 + +ModInv = 19 +A = -3b +M = 24 + +ModInv = 11 +A = -37 +M = 24 + +ModInv = 13 +A = -35 +M = 24 + +ModInv = b +A = -31 +M = 24 + +ModInv = d +A = -2f +M = 24 + +ModInv = 5 +A = -2b +M = 24 + +ModInv = 7 +A = -29 +M = 24 + +ModInv = 23 +A = -25 +M = 24 + +ModInv = 1 +A = -23 +M = 24 + +ModInv = 1d +A = -1f +M = 24 + +ModInv = 1f +A = -1d +M = 24 + +ModInv = 17 +A = -19 +M = 24 + +ModInv = 19 +A = -17 +M = 24 + +ModInv = 11 +A = -13 +M = 24 + +ModInv = 13 +A = -11 +M = 24 + +ModInv = b +A = -d +M = 24 + +ModInv = d +A = -b +M = 24 + +ModInv = 5 +A = -7 +M = 24 + +ModInv = 7 +A = -5 +M = 24 + +ModInv = 23 +A = -1 +M = 24 + +ModInv = 1 +A = 1 +M = 24 + +ModInv = 1d +A = 5 +M = 24 + +ModInv = 1f +A = 7 +M = 24 + +ModInv = 17 +A = b +M = 24 + +ModInv = 19 +A = d +M = 24 + +ModInv = 11 +A = 11 +M = 24 + +ModInv = 13 +A = 13 +M = 24 + +ModInv = b +A = 17 +M = 24 + +ModInv = d +A = 19 +M = 24 + +ModInv = 5 +A = 1d +M = 24 + +ModInv = 7 +A = 1f +M = 24 + +ModInv = 23 +A = 23 +M = 24 + +ModInv = 1 +A = 25 +M = 24 + +ModInv = 1d +A = 29 +M = 24 + +ModInv = 1f +A = 2b +M = 24 + +ModInv = 17 +A = 2f +M = 24 + +ModInv = 19 +A = 31 +M = 24 + +ModInv = 11 +A = 35 +M = 24 + +ModInv = 13 +A = 37 +M = 24 + +ModInv = b +A = 3b +M = 24 + +ModInv = d +A = 3d +M = 24 + +ModInv = 5 +A = 41 +M = 24 + +ModInv = 7 +A = 43 +M = 24 + +ModInv = 23 +A = 47 +M = 24 + +ModInv = 1 +A = 49 +M = 24 + +ModInv = 1d +A = 4d +M = 24 + +ModInv = 1f +A = 4f +M = 24 + +ModInv = 17 +A = 53 +M = 24 + +ModInv = 19 +A = 55 +M = 24 + +ModInv = 11 +A = 59 +M = 24 + +ModInv = 13 +A = 5b +M = 24 + +ModInv = b +A = 5f +M = 24 + +ModInv = d +A = 61 +M = 24 + +ModInv = 1b +A = -64 +M = 25 + +ModInv = 22 +A = -63 +M = 25 + +ModInv = 14 +A = -62 +M = 25 + +ModInv = 8 +A = -61 +M = 25 + +ModInv = 5 +A = -60 +M = 25 + +ModInv = 7 +A = -5f +M = 25 + +ModInv = 18 +A = -5e +M = 25 + +ModInv = 23 +A = -5d +M = 25 + +ModInv = 2 +A = -5c +M = 25 + +ModInv = d +A = -5b +M = 25 + +ModInv = 1e +A = -5a +M = 25 + +ModInv = 20 +A = -59 +M = 25 + +ModInv = 1d +A = -58 +M = 25 + +ModInv = 11 +A = -57 +M = 25 + +ModInv = 3 +A = -56 +M = 25 + +ModInv = a +A = -55 +M = 25 + +ModInv = b +A = -54 +M = 25 + +ModInv = 4 +A = -53 +M = 25 + +ModInv = 17 +A = -52 +M = 25 + +ModInv = 15 +A = -51 +M = 25 + +ModInv = 6 +A = -50 +M = 25 + +ModInv = 16 +A = -4f +M = 25 + +ModInv = 9 +A = -4e +M = 25 + +ModInv = c +A = -4d +M = 25 + +ModInv = 12 +A = -4c +M = 25 + +ModInv = 24 +A = -4b +M = 25 + +ModInv = 1 +A = -49 +M = 25 + +ModInv = 13 +A = -48 +M = 25 + +ModInv = 19 +A = -47 +M = 25 + +ModInv = 1c +A = -46 +M = 25 + +ModInv = f +A = -45 +M = 25 + +ModInv = 1f +A = -44 +M = 25 + +ModInv = 10 +A = -43 +M = 25 + +ModInv = e +A = -42 +M = 25 + +ModInv = 21 +A = -41 +M = 25 + +ModInv = 1a +A = -40 +M = 25 + +ModInv = 1b +A = -3f +M = 25 + +ModInv = 22 +A = -3e +M = 25 + +ModInv = 14 +A = -3d +M = 25 + +ModInv = 8 +A = -3c +M = 25 + +ModInv = 5 +A = -3b +M = 25 + +ModInv = 7 +A = -3a +M = 25 + +ModInv = 18 +A = -39 +M = 25 + +ModInv = 23 +A = -38 +M = 25 + +ModInv = 2 +A = -37 +M = 25 + +ModInv = d +A = -36 +M = 25 + +ModInv = 1e +A = -35 +M = 25 + +ModInv = 20 +A = -34 +M = 25 + +ModInv = 1d +A = -33 +M = 25 + +ModInv = 11 +A = -32 +M = 25 + +ModInv = 3 +A = -31 +M = 25 + +ModInv = a +A = -30 +M = 25 + +ModInv = b +A = -2f +M = 25 + +ModInv = 4 +A = -2e +M = 25 + +ModInv = 17 +A = -2d +M = 25 + +ModInv = 15 +A = -2c +M = 25 + +ModInv = 6 +A = -2b +M = 25 + +ModInv = 16 +A = -2a +M = 25 + +ModInv = 9 +A = -29 +M = 25 + +ModInv = c +A = -28 +M = 25 + +ModInv = 12 +A = -27 +M = 25 + +ModInv = 24 +A = -26 +M = 25 + +ModInv = 1 +A = -24 +M = 25 + +ModInv = 13 +A = -23 +M = 25 + +ModInv = 19 +A = -22 +M = 25 + +ModInv = 1c +A = -21 +M = 25 + +ModInv = f +A = -20 +M = 25 + +ModInv = 1f +A = -1f +M = 25 + +ModInv = 10 +A = -1e +M = 25 + +ModInv = e +A = -1d +M = 25 + +ModInv = 21 +A = -1c +M = 25 + +ModInv = 1a +A = -1b +M = 25 + +ModInv = 1b +A = -1a +M = 25 + +ModInv = 22 +A = -19 +M = 25 + +ModInv = 14 +A = -18 +M = 25 + +ModInv = 8 +A = -17 +M = 25 + +ModInv = 5 +A = -16 +M = 25 + +ModInv = 7 +A = -15 +M = 25 + +ModInv = 18 +A = -14 +M = 25 + +ModInv = 23 +A = -13 +M = 25 + +ModInv = 2 +A = -12 +M = 25 + +ModInv = d +A = -11 +M = 25 + +ModInv = 1e +A = -10 +M = 25 + +ModInv = 20 +A = -f +M = 25 + +ModInv = 1d +A = -e +M = 25 + +ModInv = 11 +A = -d +M = 25 + +ModInv = 3 +A = -c +M = 25 + +ModInv = a +A = -b +M = 25 + +ModInv = b +A = -a +M = 25 + +ModInv = 4 +A = -9 +M = 25 + +ModInv = 17 +A = -8 +M = 25 + +ModInv = 15 +A = -7 +M = 25 + +ModInv = 6 +A = -6 +M = 25 + +ModInv = 16 +A = -5 +M = 25 + +ModInv = 9 +A = -4 +M = 25 + +ModInv = c +A = -3 +M = 25 + +ModInv = 12 +A = -2 +M = 25 + +ModInv = 24 +A = -1 +M = 25 + +ModInv = 1 +A = 1 +M = 25 + +ModInv = 13 +A = 2 +M = 25 + +ModInv = 19 +A = 3 +M = 25 + +ModInv = 1c +A = 4 +M = 25 + +ModInv = f +A = 5 +M = 25 + +ModInv = 1f +A = 6 +M = 25 + +ModInv = 10 +A = 7 +M = 25 + +ModInv = e +A = 8 +M = 25 + +ModInv = 21 +A = 9 +M = 25 + +ModInv = 1a +A = a +M = 25 + +ModInv = 1b +A = b +M = 25 + +ModInv = 22 +A = c +M = 25 + +ModInv = 14 +A = d +M = 25 + +ModInv = 8 +A = e +M = 25 + +ModInv = 5 +A = f +M = 25 + +ModInv = 7 +A = 10 +M = 25 + +ModInv = 18 +A = 11 +M = 25 + +ModInv = 23 +A = 12 +M = 25 + +ModInv = 2 +A = 13 +M = 25 + +ModInv = d +A = 14 +M = 25 + +ModInv = 1e +A = 15 +M = 25 + +ModInv = 20 +A = 16 +M = 25 + +ModInv = 1d +A = 17 +M = 25 + +ModInv = 11 +A = 18 +M = 25 + +ModInv = 3 +A = 19 +M = 25 + +ModInv = a +A = 1a +M = 25 + +ModInv = b +A = 1b +M = 25 + +ModInv = 4 +A = 1c +M = 25 + +ModInv = 17 +A = 1d +M = 25 + +ModInv = 15 +A = 1e +M = 25 + +ModInv = 6 +A = 1f +M = 25 + +ModInv = 16 +A = 20 +M = 25 + +ModInv = 9 +A = 21 +M = 25 + +ModInv = c +A = 22 +M = 25 + +ModInv = 12 +A = 23 +M = 25 + +ModInv = 24 +A = 24 +M = 25 + +ModInv = 1 +A = 26 +M = 25 + +ModInv = 13 +A = 27 +M = 25 + +ModInv = 19 +A = 28 +M = 25 + +ModInv = 1c +A = 29 +M = 25 + +ModInv = f +A = 2a +M = 25 + +ModInv = 1f +A = 2b +M = 25 + +ModInv = 10 +A = 2c +M = 25 + +ModInv = e +A = 2d +M = 25 + +ModInv = 21 +A = 2e +M = 25 + +ModInv = 1a +A = 2f +M = 25 + +ModInv = 1b +A = 30 +M = 25 + +ModInv = 22 +A = 31 +M = 25 + +ModInv = 14 +A = 32 +M = 25 + +ModInv = 8 +A = 33 +M = 25 + +ModInv = 5 +A = 34 +M = 25 + +ModInv = 7 +A = 35 +M = 25 + +ModInv = 18 +A = 36 +M = 25 + +ModInv = 23 +A = 37 +M = 25 + +ModInv = 2 +A = 38 +M = 25 + +ModInv = d +A = 39 +M = 25 + +ModInv = 1e +A = 3a +M = 25 + +ModInv = 20 +A = 3b +M = 25 + +ModInv = 1d +A = 3c +M = 25 + +ModInv = 11 +A = 3d +M = 25 + +ModInv = 3 +A = 3e +M = 25 + +ModInv = a +A = 3f +M = 25 + +ModInv = b +A = 40 +M = 25 + +ModInv = 4 +A = 41 +M = 25 + +ModInv = 17 +A = 42 +M = 25 + +ModInv = 15 +A = 43 +M = 25 + +ModInv = 6 +A = 44 +M = 25 + +ModInv = 16 +A = 45 +M = 25 + +ModInv = 9 +A = 46 +M = 25 + +ModInv = c +A = 47 +M = 25 + +ModInv = 12 +A = 48 +M = 25 + +ModInv = 24 +A = 49 +M = 25 + +ModInv = 1 +A = 4b +M = 25 + +ModInv = 13 +A = 4c +M = 25 + +ModInv = 19 +A = 4d +M = 25 + +ModInv = 1c +A = 4e +M = 25 + +ModInv = f +A = 4f +M = 25 + +ModInv = 1f +A = 50 +M = 25 + +ModInv = 10 +A = 51 +M = 25 + +ModInv = e +A = 52 +M = 25 + +ModInv = 21 +A = 53 +M = 25 + +ModInv = 1a +A = 54 +M = 25 + +ModInv = 1b +A = 55 +M = 25 + +ModInv = 22 +A = 56 +M = 25 + +ModInv = 14 +A = 57 +M = 25 + +ModInv = 8 +A = 58 +M = 25 + +ModInv = 5 +A = 59 +M = 25 + +ModInv = 7 +A = 5a +M = 25 + +ModInv = 18 +A = 5b +M = 25 + +ModInv = 23 +A = 5c +M = 25 + +ModInv = 2 +A = 5d +M = 25 + +ModInv = d +A = 5e +M = 25 + +ModInv = 1e +A = 5f +M = 25 + +ModInv = 20 +A = 60 +M = 25 + +ModInv = 1d +A = 61 +M = 25 + +ModInv = 11 +A = 62 +M = 25 + +ModInv = 3 +A = 63 +M = 25 + +ModInv = 21 +A = -63 +M = 26 + +ModInv = 9 +A = -61 +M = 26 + +ModInv = 1d +A = -5d +M = 26 + +ModInv = 5 +A = -5b +M = 26 + +ModInv = 23 +A = -59 +M = 26 + +ModInv = 1f +A = -57 +M = 26 + +ModInv = 15 +A = -55 +M = 26 + +ModInv = 1b +A = -53 +M = 26 + +ModInv = f +A = -51 +M = 26 + +ModInv = 19 +A = -4f +M = 26 + +ModInv = 25 +A = -4d +M = 26 + +ModInv = 1 +A = -4b +M = 26 + +ModInv = d +A = -49 +M = 26 + +ModInv = 17 +A = -47 +M = 26 + +ModInv = b +A = -45 +M = 26 + +ModInv = 11 +A = -43 +M = 26 + +ModInv = 7 +A = -41 +M = 26 + +ModInv = 3 +A = -3f +M = 26 + +ModInv = 21 +A = -3d +M = 26 + +ModInv = 9 +A = -3b +M = 26 + +ModInv = 1d +A = -37 +M = 26 + +ModInv = 5 +A = -35 +M = 26 + +ModInv = 23 +A = -33 +M = 26 + +ModInv = 1f +A = -31 +M = 26 + +ModInv = 15 +A = -2f +M = 26 + +ModInv = 1b +A = -2d +M = 26 + +ModInv = f +A = -2b +M = 26 + +ModInv = 19 +A = -29 +M = 26 + +ModInv = 25 +A = -27 +M = 26 + +ModInv = 1 +A = -25 +M = 26 + +ModInv = d +A = -23 +M = 26 + +ModInv = 17 +A = -21 +M = 26 + +ModInv = b +A = -1f +M = 26 + +ModInv = 11 +A = -1d +M = 26 + +ModInv = 7 +A = -1b +M = 26 + +ModInv = 3 +A = -19 +M = 26 + +ModInv = 21 +A = -17 +M = 26 + +ModInv = 9 +A = -15 +M = 26 + +ModInv = 1d +A = -11 +M = 26 + +ModInv = 5 +A = -f +M = 26 + +ModInv = 23 +A = -d +M = 26 + +ModInv = 1f +A = -b +M = 26 + +ModInv = 15 +A = -9 +M = 26 + +ModInv = 1b +A = -7 +M = 26 + +ModInv = f +A = -5 +M = 26 + +ModInv = 19 +A = -3 +M = 26 + +ModInv = 25 +A = -1 +M = 26 + +ModInv = 1 +A = 1 +M = 26 + +ModInv = d +A = 3 +M = 26 + +ModInv = 17 +A = 5 +M = 26 + +ModInv = b +A = 7 +M = 26 + +ModInv = 11 +A = 9 +M = 26 + +ModInv = 7 +A = b +M = 26 + +ModInv = 3 +A = d +M = 26 + +ModInv = 21 +A = f +M = 26 + +ModInv = 9 +A = 11 +M = 26 + +ModInv = 1d +A = 15 +M = 26 + +ModInv = 5 +A = 17 +M = 26 + +ModInv = 23 +A = 19 +M = 26 + +ModInv = 1f +A = 1b +M = 26 + +ModInv = 15 +A = 1d +M = 26 + +ModInv = 1b +A = 1f +M = 26 + +ModInv = f +A = 21 +M = 26 + +ModInv = 19 +A = 23 +M = 26 + +ModInv = 25 +A = 25 +M = 26 + +ModInv = 1 +A = 27 +M = 26 + +ModInv = d +A = 29 +M = 26 + +ModInv = 17 +A = 2b +M = 26 + +ModInv = b +A = 2d +M = 26 + +ModInv = 11 +A = 2f +M = 26 + +ModInv = 7 +A = 31 +M = 26 + +ModInv = 3 +A = 33 +M = 26 + +ModInv = 21 +A = 35 +M = 26 + +ModInv = 9 +A = 37 +M = 26 + +ModInv = 1d +A = 3b +M = 26 + +ModInv = 5 +A = 3d +M = 26 + +ModInv = 23 +A = 3f +M = 26 + +ModInv = 1f +A = 41 +M = 26 + +ModInv = 15 +A = 43 +M = 26 + +ModInv = 1b +A = 45 +M = 26 + +ModInv = f +A = 47 +M = 26 + +ModInv = 19 +A = 49 +M = 26 + +ModInv = 25 +A = 4b +M = 26 + +ModInv = 1 +A = 4d +M = 26 + +ModInv = d +A = 4f +M = 26 + +ModInv = 17 +A = 51 +M = 26 + +ModInv = b +A = 53 +M = 26 + +ModInv = 11 +A = 55 +M = 26 + +ModInv = 7 +A = 57 +M = 26 + +ModInv = 3 +A = 59 +M = 26 + +ModInv = 21 +A = 5b +M = 26 + +ModInv = 9 +A = 5d +M = 26 + +ModInv = 1d +A = 61 +M = 26 + +ModInv = 5 +A = 63 +M = 26 + +ModInv = 17 +A = -64 +M = 27 + +ModInv = 25 +A = -62 +M = 27 + +ModInv = 2 +A = -61 +M = 27 + +ModInv = 10 +A = -5f +M = 27 + +ModInv = 11 +A = -5e +M = 27 + +ModInv = 19 +A = -5c +M = 27 + +ModInv = 7 +A = -59 +M = 27 + +ModInv = 23 +A = -58 +M = 27 + +ModInv = 22 +A = -56 +M = 27 + +ModInv = b +A = -55 +M = 27 + +ModInv = 1f +A = -53 +M = 27 + +ModInv = 1d +A = -52 +M = 27 + +ModInv = 13 +A = -50 +M = 27 + +ModInv = 26 +A = -4f +M = 27 + +ModInv = 1 +A = -4d +M = 27 + +ModInv = 14 +A = -4c +M = 27 + +ModInv = a +A = -4a +M = 27 + +ModInv = 8 +A = -49 +M = 27 + +ModInv = 1c +A = -47 +M = 27 + +ModInv = 5 +A = -46 +M = 27 + +ModInv = 4 +A = -44 +M = 27 + +ModInv = 20 +A = -43 +M = 27 + +ModInv = e +A = -40 +M = 27 + +ModInv = 16 +A = -3e +M = 27 + +ModInv = 17 +A = -3d +M = 27 + +ModInv = 25 +A = -3b +M = 27 + +ModInv = 2 +A = -3a +M = 27 + +ModInv = 10 +A = -38 +M = 27 + +ModInv = 11 +A = -37 +M = 27 + +ModInv = 19 +A = -35 +M = 27 + +ModInv = 7 +A = -32 +M = 27 + +ModInv = 23 +A = -31 +M = 27 + +ModInv = 22 +A = -2f +M = 27 + +ModInv = b +A = -2e +M = 27 + +ModInv = 1f +A = -2c +M = 27 + +ModInv = 1d +A = -2b +M = 27 + +ModInv = 13 +A = -29 +M = 27 + +ModInv = 26 +A = -28 +M = 27 + +ModInv = 1 +A = -26 +M = 27 + +ModInv = 14 +A = -25 +M = 27 + +ModInv = a +A = -23 +M = 27 + +ModInv = 8 +A = -22 +M = 27 + +ModInv = 1c +A = -20 +M = 27 + +ModInv = 5 +A = -1f +M = 27 + +ModInv = 4 +A = -1d +M = 27 + +ModInv = 20 +A = -1c +M = 27 + +ModInv = e +A = -19 +M = 27 + +ModInv = 16 +A = -17 +M = 27 + +ModInv = 17 +A = -16 +M = 27 + +ModInv = 25 +A = -14 +M = 27 + +ModInv = 2 +A = -13 +M = 27 + +ModInv = 10 +A = -11 +M = 27 + +ModInv = 11 +A = -10 +M = 27 + +ModInv = 19 +A = -e +M = 27 + +ModInv = 7 +A = -b +M = 27 + +ModInv = 23 +A = -a +M = 27 + +ModInv = 22 +A = -8 +M = 27 + +ModInv = b +A = -7 +M = 27 + +ModInv = 1f +A = -5 +M = 27 + +ModInv = 1d +A = -4 +M = 27 + +ModInv = 13 +A = -2 +M = 27 + +ModInv = 26 +A = -1 +M = 27 + +ModInv = 1 +A = 1 +M = 27 + +ModInv = 14 +A = 2 +M = 27 + +ModInv = a +A = 4 +M = 27 + +ModInv = 8 +A = 5 +M = 27 + +ModInv = 1c +A = 7 +M = 27 + +ModInv = 5 +A = 8 +M = 27 + +ModInv = 4 +A = a +M = 27 + +ModInv = 20 +A = b +M = 27 + +ModInv = e +A = e +M = 27 + +ModInv = 16 +A = 10 +M = 27 + +ModInv = 17 +A = 11 +M = 27 + +ModInv = 25 +A = 13 +M = 27 + +ModInv = 2 +A = 14 +M = 27 + +ModInv = 10 +A = 16 +M = 27 + +ModInv = 11 +A = 17 +M = 27 + +ModInv = 19 +A = 19 +M = 27 + +ModInv = 7 +A = 1c +M = 27 + +ModInv = 23 +A = 1d +M = 27 + +ModInv = 22 +A = 1f +M = 27 + +ModInv = b +A = 20 +M = 27 + +ModInv = 1f +A = 22 +M = 27 + +ModInv = 1d +A = 23 +M = 27 + +ModInv = 13 +A = 25 +M = 27 + +ModInv = 26 +A = 26 +M = 27 + +ModInv = 1 +A = 28 +M = 27 + +ModInv = 14 +A = 29 +M = 27 + +ModInv = a +A = 2b +M = 27 + +ModInv = 8 +A = 2c +M = 27 + +ModInv = 1c +A = 2e +M = 27 + +ModInv = 5 +A = 2f +M = 27 + +ModInv = 4 +A = 31 +M = 27 + +ModInv = 20 +A = 32 +M = 27 + +ModInv = e +A = 35 +M = 27 + +ModInv = 16 +A = 37 +M = 27 + +ModInv = 17 +A = 38 +M = 27 + +ModInv = 25 +A = 3a +M = 27 + +ModInv = 2 +A = 3b +M = 27 + +ModInv = 10 +A = 3d +M = 27 + +ModInv = 11 +A = 3e +M = 27 + +ModInv = 19 +A = 40 +M = 27 + +ModInv = 7 +A = 43 +M = 27 + +ModInv = 23 +A = 44 +M = 27 + +ModInv = 22 +A = 46 +M = 27 + +ModInv = b +A = 47 +M = 27 + +ModInv = 1f +A = 49 +M = 27 + +ModInv = 1d +A = 4a +M = 27 + +ModInv = 13 +A = 4c +M = 27 + +ModInv = 26 +A = 4d +M = 27 + +ModInv = 1 +A = 4f +M = 27 + +ModInv = 14 +A = 50 +M = 27 + +ModInv = a +A = 52 +M = 27 + +ModInv = 8 +A = 53 +M = 27 + +ModInv = 1c +A = 55 +M = 27 + +ModInv = 5 +A = 56 +M = 27 + +ModInv = 4 +A = 58 +M = 27 + +ModInv = 20 +A = 59 +M = 27 + +ModInv = e +A = 5c +M = 27 + +ModInv = 16 +A = 5e +M = 27 + +ModInv = 17 +A = 5f +M = 27 + +ModInv = 25 +A = 61 +M = 27 + +ModInv = 2 +A = 62 +M = 27 + +ModInv = 15 +A = -63 +M = 28 + +ModInv = 7 +A = -61 +M = 28 + +ModInv = 3 +A = -5d +M = 28 + +ModInv = 1d +A = -5b +M = 28 + +ModInv = 1f +A = -59 +M = 28 + +ModInv = 11 +A = -57 +M = 28 + +ModInv = d +A = -53 +M = 28 + +ModInv = 27 +A = -51 +M = 28 + +ModInv = 1 +A = -4f +M = 28 + +ModInv = 1b +A = -4d +M = 28 + +ModInv = 17 +A = -49 +M = 28 + +ModInv = 9 +A = -47 +M = 28 + +ModInv = b +A = -45 +M = 28 + +ModInv = 25 +A = -43 +M = 28 + +ModInv = 21 +A = -3f +M = 28 + +ModInv = 13 +A = -3d +M = 28 + +ModInv = 15 +A = -3b +M = 28 + +ModInv = 7 +A = -39 +M = 28 + +ModInv = 3 +A = -35 +M = 28 + +ModInv = 1d +A = -33 +M = 28 + +ModInv = 1f +A = -31 +M = 28 + +ModInv = 11 +A = -2f +M = 28 + +ModInv = d +A = -2b +M = 28 + +ModInv = 27 +A = -29 +M = 28 + +ModInv = 1 +A = -27 +M = 28 + +ModInv = 1b +A = -25 +M = 28 + +ModInv = 17 +A = -21 +M = 28 + +ModInv = 9 +A = -1f +M = 28 + +ModInv = b +A = -1d +M = 28 + +ModInv = 25 +A = -1b +M = 28 + +ModInv = 21 +A = -17 +M = 28 + +ModInv = 13 +A = -15 +M = 28 + +ModInv = 15 +A = -13 +M = 28 + +ModInv = 7 +A = -11 +M = 28 + +ModInv = 3 +A = -d +M = 28 + +ModInv = 1d +A = -b +M = 28 + +ModInv = 1f +A = -9 +M = 28 + +ModInv = 11 +A = -7 +M = 28 + +ModInv = d +A = -3 +M = 28 + +ModInv = 27 +A = -1 +M = 28 + +ModInv = 1 +A = 1 +M = 28 + +ModInv = 1b +A = 3 +M = 28 + +ModInv = 17 +A = 7 +M = 28 + +ModInv = 9 +A = 9 +M = 28 + +ModInv = b +A = b +M = 28 + +ModInv = 25 +A = d +M = 28 + +ModInv = 21 +A = 11 +M = 28 + +ModInv = 13 +A = 13 +M = 28 + +ModInv = 15 +A = 15 +M = 28 + +ModInv = 7 +A = 17 +M = 28 + +ModInv = 3 +A = 1b +M = 28 + +ModInv = 1d +A = 1d +M = 28 + +ModInv = 1f +A = 1f +M = 28 + +ModInv = 11 +A = 21 +M = 28 + +ModInv = d +A = 25 +M = 28 + +ModInv = 27 +A = 27 +M = 28 + +ModInv = 1 +A = 29 +M = 28 + +ModInv = 1b +A = 2b +M = 28 + +ModInv = 17 +A = 2f +M = 28 + +ModInv = 9 +A = 31 +M = 28 + +ModInv = b +A = 33 +M = 28 + +ModInv = 25 +A = 35 +M = 28 + +ModInv = 21 +A = 39 +M = 28 + +ModInv = 13 +A = 3b +M = 28 + +ModInv = 15 +A = 3d +M = 28 + +ModInv = 7 +A = 3f +M = 28 + +ModInv = 3 +A = 43 +M = 28 + +ModInv = 1d +A = 45 +M = 28 + +ModInv = 1f +A = 47 +M = 28 + +ModInv = 11 +A = 49 +M = 28 + +ModInv = d +A = 4d +M = 28 + +ModInv = 27 +A = 4f +M = 28 + +ModInv = 1 +A = 51 +M = 28 + +ModInv = 1b +A = 53 +M = 28 + +ModInv = 17 +A = 57 +M = 28 + +ModInv = 9 +A = 59 +M = 28 + +ModInv = b +A = 5b +M = 28 + +ModInv = 25 +A = 5d +M = 28 + +ModInv = 21 +A = 61 +M = 28 + +ModInv = 13 +A = 63 +M = 28 + +ModInv = 19 +A = -64 +M = 29 + +ModInv = c +A = -63 +M = 29 + +ModInv = 17 +A = -62 +M = 29 + +ModInv = 1e +A = -61 +M = 29 + +ModInv = 26 +A = -60 +M = 29 + +ModInv = 16 +A = -5f +M = 29 + +ModInv = 11 +A = -5e +M = 29 + +ModInv = 1a +A = -5d +M = 29 + +ModInv = 4 +A = -5c +M = 29 + +ModInv = 9 +A = -5b +M = 29 + +ModInv = 5 +A = -5a +M = 29 + +ModInv = 23 +A = -59 +M = 29 + +ModInv = 22 +A = -58 +M = 29 + +ModInv = 8 +A = -57 +M = 29 + +ModInv = a +A = -56 +M = 29 + +ModInv = 1b +A = -55 +M = 29 + +ModInv = 14 +A = -54 +M = 29 + +ModInv = 28 +A = -53 +M = 29 + +ModInv = 1 +A = -51 +M = 29 + +ModInv = 15 +A = -50 +M = 29 + +ModInv = e +A = -4f +M = 29 + +ModInv = 1f +A = -4e +M = 29 + +ModInv = 21 +A = -4d +M = 29 + +ModInv = 7 +A = -4c +M = 29 + +ModInv = 6 +A = -4b +M = 29 + +ModInv = 24 +A = -4a +M = 29 + +ModInv = 20 +A = -49 +M = 29 + +ModInv = 25 +A = -48 +M = 29 + +ModInv = f +A = -47 +M = 29 + +ModInv = 18 +A = -46 +M = 29 + +ModInv = 13 +A = -45 +M = 29 + +ModInv = 3 +A = -44 +M = 29 + +ModInv = b +A = -43 +M = 29 + +ModInv = 12 +A = -42 +M = 29 + +ModInv = 1d +A = -41 +M = 29 + +ModInv = 10 +A = -40 +M = 29 + +ModInv = d +A = -3f +M = 29 + +ModInv = 27 +A = -3e +M = 29 + +ModInv = 2 +A = -3d +M = 29 + +ModInv = 1c +A = -3c +M = 29 + +ModInv = 19 +A = -3b +M = 29 + +ModInv = c +A = -3a +M = 29 + +ModInv = 17 +A = -39 +M = 29 + +ModInv = 1e +A = -38 +M = 29 + +ModInv = 26 +A = -37 +M = 29 + +ModInv = 16 +A = -36 +M = 29 + +ModInv = 11 +A = -35 +M = 29 + +ModInv = 1a +A = -34 +M = 29 + +ModInv = 4 +A = -33 +M = 29 + +ModInv = 9 +A = -32 +M = 29 + +ModInv = 5 +A = -31 +M = 29 + +ModInv = 23 +A = -30 +M = 29 + +ModInv = 22 +A = -2f +M = 29 + +ModInv = 8 +A = -2e +M = 29 + +ModInv = a +A = -2d +M = 29 + +ModInv = 1b +A = -2c +M = 29 + +ModInv = 14 +A = -2b +M = 29 + +ModInv = 28 +A = -2a +M = 29 + +ModInv = 1 +A = -28 +M = 29 + +ModInv = 15 +A = -27 +M = 29 + +ModInv = e +A = -26 +M = 29 + +ModInv = 1f +A = -25 +M = 29 + +ModInv = 21 +A = -24 +M = 29 + +ModInv = 7 +A = -23 +M = 29 + +ModInv = 6 +A = -22 +M = 29 + +ModInv = 24 +A = -21 +M = 29 + +ModInv = 20 +A = -20 +M = 29 + +ModInv = 25 +A = -1f +M = 29 + +ModInv = f +A = -1e +M = 29 + +ModInv = 18 +A = -1d +M = 29 + +ModInv = 13 +A = -1c +M = 29 + +ModInv = 3 +A = -1b +M = 29 + +ModInv = b +A = -1a +M = 29 + +ModInv = 12 +A = -19 +M = 29 + +ModInv = 1d +A = -18 +M = 29 + +ModInv = 10 +A = -17 +M = 29 + +ModInv = d +A = -16 +M = 29 + +ModInv = 27 +A = -15 +M = 29 + +ModInv = 2 +A = -14 +M = 29 + +ModInv = 1c +A = -13 +M = 29 + +ModInv = 19 +A = -12 +M = 29 + +ModInv = c +A = -11 +M = 29 + +ModInv = 17 +A = -10 +M = 29 + +ModInv = 1e +A = -f +M = 29 + +ModInv = 26 +A = -e +M = 29 + +ModInv = 16 +A = -d +M = 29 + +ModInv = 11 +A = -c +M = 29 + +ModInv = 1a +A = -b +M = 29 + +ModInv = 4 +A = -a +M = 29 + +ModInv = 9 +A = -9 +M = 29 + +ModInv = 5 +A = -8 +M = 29 + +ModInv = 23 +A = -7 +M = 29 + +ModInv = 22 +A = -6 +M = 29 + +ModInv = 8 +A = -5 +M = 29 + +ModInv = a +A = -4 +M = 29 + +ModInv = 1b +A = -3 +M = 29 + +ModInv = 14 +A = -2 +M = 29 + +ModInv = 28 +A = -1 +M = 29 + +ModInv = 1 +A = 1 +M = 29 + +ModInv = 15 +A = 2 +M = 29 + +ModInv = e +A = 3 +M = 29 + +ModInv = 1f +A = 4 +M = 29 + +ModInv = 21 +A = 5 +M = 29 + +ModInv = 7 +A = 6 +M = 29 + +ModInv = 6 +A = 7 +M = 29 + +ModInv = 24 +A = 8 +M = 29 + +ModInv = 20 +A = 9 +M = 29 + +ModInv = 25 +A = a +M = 29 + +ModInv = f +A = b +M = 29 + +ModInv = 18 +A = c +M = 29 + +ModInv = 13 +A = d +M = 29 + +ModInv = 3 +A = e +M = 29 + +ModInv = b +A = f +M = 29 + +ModInv = 12 +A = 10 +M = 29 + +ModInv = 1d +A = 11 +M = 29 + +ModInv = 10 +A = 12 +M = 29 + +ModInv = d +A = 13 +M = 29 + +ModInv = 27 +A = 14 +M = 29 + +ModInv = 2 +A = 15 +M = 29 + +ModInv = 1c +A = 16 +M = 29 + +ModInv = 19 +A = 17 +M = 29 + +ModInv = c +A = 18 +M = 29 + +ModInv = 17 +A = 19 +M = 29 + +ModInv = 1e +A = 1a +M = 29 + +ModInv = 26 +A = 1b +M = 29 + +ModInv = 16 +A = 1c +M = 29 + +ModInv = 11 +A = 1d +M = 29 + +ModInv = 1a +A = 1e +M = 29 + +ModInv = 4 +A = 1f +M = 29 + +ModInv = 9 +A = 20 +M = 29 + +ModInv = 5 +A = 21 +M = 29 + +ModInv = 23 +A = 22 +M = 29 + +ModInv = 22 +A = 23 +M = 29 + +ModInv = 8 +A = 24 +M = 29 + +ModInv = a +A = 25 +M = 29 + +ModInv = 1b +A = 26 +M = 29 + +ModInv = 14 +A = 27 +M = 29 + +ModInv = 28 +A = 28 +M = 29 + +ModInv = 1 +A = 2a +M = 29 + +ModInv = 15 +A = 2b +M = 29 + +ModInv = e +A = 2c +M = 29 + +ModInv = 1f +A = 2d +M = 29 + +ModInv = 21 +A = 2e +M = 29 + +ModInv = 7 +A = 2f +M = 29 + +ModInv = 6 +A = 30 +M = 29 + +ModInv = 24 +A = 31 +M = 29 + +ModInv = 20 +A = 32 +M = 29 + +ModInv = 25 +A = 33 +M = 29 + +ModInv = f +A = 34 +M = 29 + +ModInv = 18 +A = 35 +M = 29 + +ModInv = 13 +A = 36 +M = 29 + +ModInv = 3 +A = 37 +M = 29 + +ModInv = b +A = 38 +M = 29 + +ModInv = 12 +A = 39 +M = 29 + +ModInv = 1d +A = 3a +M = 29 + +ModInv = 10 +A = 3b +M = 29 + +ModInv = d +A = 3c +M = 29 + +ModInv = 27 +A = 3d +M = 29 + +ModInv = 2 +A = 3e +M = 29 + +ModInv = 1c +A = 3f +M = 29 + +ModInv = 19 +A = 40 +M = 29 + +ModInv = c +A = 41 +M = 29 + +ModInv = 17 +A = 42 +M = 29 + +ModInv = 1e +A = 43 +M = 29 + +ModInv = 26 +A = 44 +M = 29 + +ModInv = 16 +A = 45 +M = 29 + +ModInv = 11 +A = 46 +M = 29 + +ModInv = 1a +A = 47 +M = 29 + +ModInv = 4 +A = 48 +M = 29 + +ModInv = 9 +A = 49 +M = 29 + +ModInv = 5 +A = 4a +M = 29 + +ModInv = 23 +A = 4b +M = 29 + +ModInv = 22 +A = 4c +M = 29 + +ModInv = 8 +A = 4d +M = 29 + +ModInv = a +A = 4e +M = 29 + +ModInv = 1b +A = 4f +M = 29 + +ModInv = 14 +A = 50 +M = 29 + +ModInv = 28 +A = 51 +M = 29 + +ModInv = 1 +A = 53 +M = 29 + +ModInv = 15 +A = 54 +M = 29 + +ModInv = e +A = 55 +M = 29 + +ModInv = 1f +A = 56 +M = 29 + +ModInv = 21 +A = 57 +M = 29 + +ModInv = 7 +A = 58 +M = 29 + +ModInv = 6 +A = 59 +M = 29 + +ModInv = 24 +A = 5a +M = 29 + +ModInv = 20 +A = 5b +M = 29 + +ModInv = 25 +A = 5c +M = 29 + +ModInv = f +A = 5d +M = 29 + +ModInv = 18 +A = 5e +M = 29 + +ModInv = 13 +A = 5f +M = 29 + +ModInv = 3 +A = 60 +M = 29 + +ModInv = b +A = 61 +M = 29 + +ModInv = 12 +A = 62 +M = 29 + +ModInv = 1d +A = 63 +M = 29 + +ModInv = 1d +A = -61 +M = 2a + +ModInv = 13 +A = -5f +M = 2a + +ModInv = 19 +A = -59 +M = 2a + +ModInv = 29 +A = -55 +M = 2a + +ModInv = 1 +A = -53 +M = 2a + +ModInv = 11 +A = -4f +M = 2a + +ModInv = 17 +A = -49 +M = 2a + +ModInv = d +A = -47 +M = 2a + +ModInv = 5 +A = -43 +M = 2a + +ModInv = 1f +A = -41 +M = 2a + +ModInv = b +A = -3d +M = 2a + +ModInv = 25 +A = -3b +M = 2a + +ModInv = 1d +A = -37 +M = 2a + +ModInv = 13 +A = -35 +M = 2a + +ModInv = 19 +A = -2f +M = 2a + +ModInv = 29 +A = -2b +M = 2a + +ModInv = 1 +A = -29 +M = 2a + +ModInv = 11 +A = -25 +M = 2a + +ModInv = 17 +A = -1f +M = 2a + +ModInv = d +A = -1d +M = 2a + +ModInv = 5 +A = -19 +M = 2a + +ModInv = 1f +A = -17 +M = 2a + +ModInv = b +A = -13 +M = 2a + +ModInv = 25 +A = -11 +M = 2a + +ModInv = 1d +A = -d +M = 2a + +ModInv = 13 +A = -b +M = 2a + +ModInv = 19 +A = -5 +M = 2a + +ModInv = 29 +A = -1 +M = 2a + +ModInv = 1 +A = 1 +M = 2a + +ModInv = 11 +A = 5 +M = 2a + +ModInv = 17 +A = b +M = 2a + +ModInv = d +A = d +M = 2a + +ModInv = 5 +A = 11 +M = 2a + +ModInv = 1f +A = 13 +M = 2a + +ModInv = b +A = 17 +M = 2a + +ModInv = 25 +A = 19 +M = 2a + +ModInv = 1d +A = 1d +M = 2a + +ModInv = 13 +A = 1f +M = 2a + +ModInv = 19 +A = 25 +M = 2a + +ModInv = 29 +A = 29 +M = 2a + +ModInv = 1 +A = 2b +M = 2a + +ModInv = 11 +A = 2f +M = 2a + +ModInv = 17 +A = 35 +M = 2a + +ModInv = d +A = 37 +M = 2a + +ModInv = 5 +A = 3b +M = 2a + +ModInv = 1f +A = 3d +M = 2a + +ModInv = b +A = 41 +M = 2a + +ModInv = 25 +A = 43 +M = 2a + +ModInv = 1d +A = 47 +M = 2a + +ModInv = 13 +A = 49 +M = 2a + +ModInv = 19 +A = 4f +M = 2a + +ModInv = 29 +A = 53 +M = 2a + +ModInv = 1 +A = 55 +M = 2a + +ModInv = 11 +A = 59 +M = 2a + +ModInv = 17 +A = 5f +M = 2a + +ModInv = d +A = 61 +M = 2a + +ModInv = 3 +A = -64 +M = 2b + +ModInv = 21 +A = -63 +M = 2b + +ModInv = 19 +A = -62 +M = 2b + +ModInv = 27 +A = -61 +M = 2b + +ModInv = 1e +A = -60 +M = 2b + +ModInv = 13 +A = -5f +M = 2b + +ModInv = 10 +A = -5e +M = 2b + +ModInv = 6 +A = -5d +M = 2b + +ModInv = 7 +A = -5c +M = 2b + +ModInv = 11 +A = -5b +M = 2b + +ModInv = 20 +A = -5a +M = 2b + +ModInv = e +A = -59 +M = 2b + +ModInv = 15 +A = -58 +M = 2b + +ModInv = 2a +A = -57 +M = 2b + +ModInv = 1 +A = -55 +M = 2b + +ModInv = 16 +A = -54 +M = 2b + +ModInv = 1d +A = -53 +M = 2b + +ModInv = b +A = -52 +M = 2b + +ModInv = 1a +A = -51 +M = 2b + +ModInv = 24 +A = -50 +M = 2b + +ModInv = 25 +A = -4f +M = 2b + +ModInv = 1b +A = -4e +M = 2b + +ModInv = 18 +A = -4d +M = 2b + +ModInv = d +A = -4c +M = 2b + +ModInv = 4 +A = -4b +M = 2b + +ModInv = 12 +A = -4a +M = 2b + +ModInv = a +A = -49 +M = 2b + +ModInv = 28 +A = -48 +M = 2b + +ModInv = 17 +A = -47 +M = 2b + +ModInv = 23 +A = -46 +M = 2b + +ModInv = 26 +A = -45 +M = 2b + +ModInv = c +A = -44 +M = 2b + +ModInv = 22 +A = -43 +M = 2b + +ModInv = 1c +A = -42 +M = 2b + +ModInv = 29 +A = -41 +M = 2b + +ModInv = 2 +A = -40 +M = 2b + +ModInv = f +A = -3f +M = 2b + +ModInv = 9 +A = -3e +M = 2b + +ModInv = 1f +A = -3d +M = 2b + +ModInv = 5 +A = -3c +M = 2b + +ModInv = 8 +A = -3b +M = 2b + +ModInv = 14 +A = -3a +M = 2b + +ModInv = 3 +A = -39 +M = 2b + +ModInv = 21 +A = -38 +M = 2b + +ModInv = 19 +A = -37 +M = 2b + +ModInv = 27 +A = -36 +M = 2b + +ModInv = 1e +A = -35 +M = 2b + +ModInv = 13 +A = -34 +M = 2b + +ModInv = 10 +A = -33 +M = 2b + +ModInv = 6 +A = -32 +M = 2b + +ModInv = 7 +A = -31 +M = 2b + +ModInv = 11 +A = -30 +M = 2b + +ModInv = 20 +A = -2f +M = 2b + +ModInv = e +A = -2e +M = 2b + +ModInv = 15 +A = -2d +M = 2b + +ModInv = 2a +A = -2c +M = 2b + +ModInv = 1 +A = -2a +M = 2b + +ModInv = 16 +A = -29 +M = 2b + +ModInv = 1d +A = -28 +M = 2b + +ModInv = b +A = -27 +M = 2b + +ModInv = 1a +A = -26 +M = 2b + +ModInv = 24 +A = -25 +M = 2b + +ModInv = 25 +A = -24 +M = 2b + +ModInv = 1b +A = -23 +M = 2b + +ModInv = 18 +A = -22 +M = 2b + +ModInv = d +A = -21 +M = 2b + +ModInv = 4 +A = -20 +M = 2b + +ModInv = 12 +A = -1f +M = 2b + +ModInv = a +A = -1e +M = 2b + +ModInv = 28 +A = -1d +M = 2b + +ModInv = 17 +A = -1c +M = 2b + +ModInv = 23 +A = -1b +M = 2b + +ModInv = 26 +A = -1a +M = 2b + +ModInv = c +A = -19 +M = 2b + +ModInv = 22 +A = -18 +M = 2b + +ModInv = 1c +A = -17 +M = 2b + +ModInv = 29 +A = -16 +M = 2b + +ModInv = 2 +A = -15 +M = 2b + +ModInv = f +A = -14 +M = 2b + +ModInv = 9 +A = -13 +M = 2b + +ModInv = 1f +A = -12 +M = 2b + +ModInv = 5 +A = -11 +M = 2b + +ModInv = 8 +A = -10 +M = 2b + +ModInv = 14 +A = -f +M = 2b + +ModInv = 3 +A = -e +M = 2b + +ModInv = 21 +A = -d +M = 2b + +ModInv = 19 +A = -c +M = 2b + +ModInv = 27 +A = -b +M = 2b + +ModInv = 1e +A = -a +M = 2b + +ModInv = 13 +A = -9 +M = 2b + +ModInv = 10 +A = -8 +M = 2b + +ModInv = 6 +A = -7 +M = 2b + +ModInv = 7 +A = -6 +M = 2b + +ModInv = 11 +A = -5 +M = 2b + +ModInv = 20 +A = -4 +M = 2b + +ModInv = e +A = -3 +M = 2b + +ModInv = 15 +A = -2 +M = 2b + +ModInv = 2a +A = -1 +M = 2b + +ModInv = 1 +A = 1 +M = 2b + +ModInv = 16 +A = 2 +M = 2b + +ModInv = 1d +A = 3 +M = 2b + +ModInv = b +A = 4 +M = 2b + +ModInv = 1a +A = 5 +M = 2b + +ModInv = 24 +A = 6 +M = 2b + +ModInv = 25 +A = 7 +M = 2b + +ModInv = 1b +A = 8 +M = 2b + +ModInv = 18 +A = 9 +M = 2b + +ModInv = d +A = a +M = 2b + +ModInv = 4 +A = b +M = 2b + +ModInv = 12 +A = c +M = 2b + +ModInv = a +A = d +M = 2b + +ModInv = 28 +A = e +M = 2b + +ModInv = 17 +A = f +M = 2b + +ModInv = 23 +A = 10 +M = 2b + +ModInv = 26 +A = 11 +M = 2b + +ModInv = c +A = 12 +M = 2b + +ModInv = 22 +A = 13 +M = 2b + +ModInv = 1c +A = 14 +M = 2b + +ModInv = 29 +A = 15 +M = 2b + +ModInv = 2 +A = 16 +M = 2b + +ModInv = f +A = 17 +M = 2b + +ModInv = 9 +A = 18 +M = 2b + +ModInv = 1f +A = 19 +M = 2b + +ModInv = 5 +A = 1a +M = 2b + +ModInv = 8 +A = 1b +M = 2b + +ModInv = 14 +A = 1c +M = 2b + +ModInv = 3 +A = 1d +M = 2b + +ModInv = 21 +A = 1e +M = 2b + +ModInv = 19 +A = 1f +M = 2b + +ModInv = 27 +A = 20 +M = 2b + +ModInv = 1e +A = 21 +M = 2b + +ModInv = 13 +A = 22 +M = 2b + +ModInv = 10 +A = 23 +M = 2b + +ModInv = 6 +A = 24 +M = 2b + +ModInv = 7 +A = 25 +M = 2b + +ModInv = 11 +A = 26 +M = 2b + +ModInv = 20 +A = 27 +M = 2b + +ModInv = e +A = 28 +M = 2b + +ModInv = 15 +A = 29 +M = 2b + +ModInv = 2a +A = 2a +M = 2b + +ModInv = 1 +A = 2c +M = 2b + +ModInv = 16 +A = 2d +M = 2b + +ModInv = 1d +A = 2e +M = 2b + +ModInv = b +A = 2f +M = 2b + +ModInv = 1a +A = 30 +M = 2b + +ModInv = 24 +A = 31 +M = 2b + +ModInv = 25 +A = 32 +M = 2b + +ModInv = 1b +A = 33 +M = 2b + +ModInv = 18 +A = 34 +M = 2b + +ModInv = d +A = 35 +M = 2b + +ModInv = 4 +A = 36 +M = 2b + +ModInv = 12 +A = 37 +M = 2b + +ModInv = a +A = 38 +M = 2b + +ModInv = 28 +A = 39 +M = 2b + +ModInv = 17 +A = 3a +M = 2b + +ModInv = 23 +A = 3b +M = 2b + +ModInv = 26 +A = 3c +M = 2b + +ModInv = c +A = 3d +M = 2b + +ModInv = 22 +A = 3e +M = 2b + +ModInv = 1c +A = 3f +M = 2b + +ModInv = 29 +A = 40 +M = 2b + +ModInv = 2 +A = 41 +M = 2b + +ModInv = f +A = 42 +M = 2b + +ModInv = 9 +A = 43 +M = 2b + +ModInv = 1f +A = 44 +M = 2b + +ModInv = 5 +A = 45 +M = 2b + +ModInv = 8 +A = 46 +M = 2b + +ModInv = 14 +A = 47 +M = 2b + +ModInv = 3 +A = 48 +M = 2b + +ModInv = 21 +A = 49 +M = 2b + +ModInv = 19 +A = 4a +M = 2b + +ModInv = 27 +A = 4b +M = 2b + +ModInv = 1e +A = 4c +M = 2b + +ModInv = 13 +A = 4d +M = 2b + +ModInv = 10 +A = 4e +M = 2b + +ModInv = 6 +A = 4f +M = 2b + +ModInv = 7 +A = 50 +M = 2b + +ModInv = 11 +A = 51 +M = 2b + +ModInv = 20 +A = 52 +M = 2b + +ModInv = e +A = 53 +M = 2b + +ModInv = 15 +A = 54 +M = 2b + +ModInv = 2a +A = 55 +M = 2b + +ModInv = 1 +A = 57 +M = 2b + +ModInv = 16 +A = 58 +M = 2b + +ModInv = 1d +A = 59 +M = 2b + +ModInv = b +A = 5a +M = 2b + +ModInv = 1a +A = 5b +M = 2b + +ModInv = 24 +A = 5c +M = 2b + +ModInv = 25 +A = 5d +M = 2b + +ModInv = 1b +A = 5e +M = 2b + +ModInv = 18 +A = 5f +M = 2b + +ModInv = d +A = 60 +M = 2b + +ModInv = 4 +A = 61 +M = 2b + +ModInv = 12 +A = 62 +M = 2b + +ModInv = a +A = 63 +M = 2b + +ModInv = 27 +A = -61 +M = 2c + +ModInv = 19 +A = -5f +M = 2c + +ModInv = 23 +A = -5d +M = 2c + +ModInv = 1d +A = -5b +M = 2c + +ModInv = 2b +A = -59 +M = 2c + +ModInv = 1 +A = -57 +M = 2c + +ModInv = f +A = -55 +M = 2c + +ModInv = 9 +A = -53 +M = 2c + +ModInv = 13 +A = -51 +M = 2c + +ModInv = 5 +A = -4f +M = 2c + +ModInv = 11 +A = -4b +M = 2c + +ModInv = 3 +A = -49 +M = 2c + +ModInv = d +A = -47 +M = 2c + +ModInv = 7 +A = -45 +M = 2c + +ModInv = 15 +A = -43 +M = 2c + +ModInv = 17 +A = -41 +M = 2c + +ModInv = 25 +A = -3f +M = 2c + +ModInv = 1f +A = -3d +M = 2c + +ModInv = 29 +A = -3b +M = 2c + +ModInv = 1b +A = -39 +M = 2c + +ModInv = 27 +A = -35 +M = 2c + +ModInv = 19 +A = -33 +M = 2c + +ModInv = 23 +A = -31 +M = 2c + +ModInv = 1d +A = -2f +M = 2c + +ModInv = 2b +A = -2d +M = 2c + +ModInv = 1 +A = -2b +M = 2c + +ModInv = f +A = -29 +M = 2c + +ModInv = 9 +A = -27 +M = 2c + +ModInv = 13 +A = -25 +M = 2c + +ModInv = 5 +A = -23 +M = 2c + +ModInv = 11 +A = -1f +M = 2c + +ModInv = 3 +A = -1d +M = 2c + +ModInv = d +A = -1b +M = 2c + +ModInv = 7 +A = -19 +M = 2c + +ModInv = 15 +A = -17 +M = 2c + +ModInv = 17 +A = -15 +M = 2c + +ModInv = 25 +A = -13 +M = 2c + +ModInv = 1f +A = -11 +M = 2c + +ModInv = 29 +A = -f +M = 2c + +ModInv = 1b +A = -d +M = 2c + +ModInv = 27 +A = -9 +M = 2c + +ModInv = 19 +A = -7 +M = 2c + +ModInv = 23 +A = -5 +M = 2c + +ModInv = 1d +A = -3 +M = 2c + +ModInv = 2b +A = -1 +M = 2c + +ModInv = 1 +A = 1 +M = 2c + +ModInv = f +A = 3 +M = 2c + +ModInv = 9 +A = 5 +M = 2c + +ModInv = 13 +A = 7 +M = 2c + +ModInv = 5 +A = 9 +M = 2c + +ModInv = 11 +A = d +M = 2c + +ModInv = 3 +A = f +M = 2c + +ModInv = d +A = 11 +M = 2c + +ModInv = 7 +A = 13 +M = 2c + +ModInv = 15 +A = 15 +M = 2c + +ModInv = 17 +A = 17 +M = 2c + +ModInv = 25 +A = 19 +M = 2c + +ModInv = 1f +A = 1b +M = 2c + +ModInv = 29 +A = 1d +M = 2c + +ModInv = 1b +A = 1f +M = 2c + +ModInv = 27 +A = 23 +M = 2c + +ModInv = 19 +A = 25 +M = 2c + +ModInv = 23 +A = 27 +M = 2c + +ModInv = 1d +A = 29 +M = 2c + +ModInv = 2b +A = 2b +M = 2c + +ModInv = 1 +A = 2d +M = 2c + +ModInv = f +A = 2f +M = 2c + +ModInv = 9 +A = 31 +M = 2c + +ModInv = 13 +A = 33 +M = 2c + +ModInv = 5 +A = 35 +M = 2c + +ModInv = 11 +A = 39 +M = 2c + +ModInv = 3 +A = 3b +M = 2c + +ModInv = d +A = 3d +M = 2c + +ModInv = 7 +A = 3f +M = 2c + +ModInv = 15 +A = 41 +M = 2c + +ModInv = 17 +A = 43 +M = 2c + +ModInv = 25 +A = 45 +M = 2c + +ModInv = 1f +A = 47 +M = 2c + +ModInv = 29 +A = 49 +M = 2c + +ModInv = 1b +A = 4b +M = 2c + +ModInv = 27 +A = 4f +M = 2c + +ModInv = 19 +A = 51 +M = 2c + +ModInv = 23 +A = 53 +M = 2c + +ModInv = 1d +A = 55 +M = 2c + +ModInv = 2b +A = 57 +M = 2c + +ModInv = 1 +A = 59 +M = 2c + +ModInv = f +A = 5b +M = 2c + +ModInv = 9 +A = 5d +M = 2c + +ModInv = 13 +A = 5f +M = 2c + +ModInv = 5 +A = 61 +M = 2c + +ModInv = 1c +A = -62 +M = 2d + +ModInv = 20 +A = -61 +M = 2d + +ModInv = b +A = -5e +M = 2d + +ModInv = 16 +A = -5c +M = 2d + +ModInv = 2c +A = -5b +M = 2d + +ModInv = 1 +A = -59 +M = 2d + +ModInv = 17 +A = -58 +M = 2d + +ModInv = 22 +A = -56 +M = 2d + +ModInv = d +A = -53 +M = 2d + +ModInv = 11 +A = -52 +M = 2d + +ModInv = 29 +A = -4f +M = 2d + +ModInv = 7 +A = -4d +M = 2d + +ModInv = 1d +A = -4c +M = 2d + +ModInv = 1f +A = -4a +M = 2d + +ModInv = 8 +A = -49 +M = 2d + +ModInv = 13 +A = -47 +M = 2d + +ModInv = 2b +A = -44 +M = 2d + +ModInv = 2 +A = -43 +M = 2d + +ModInv = 1a +A = -40 +M = 2d + +ModInv = 25 +A = -3e +M = 2d + +ModInv = e +A = -3d +M = 2d + +ModInv = 10 +A = -3b +M = 2d + +ModInv = 26 +A = -3a +M = 2d + +ModInv = 4 +A = -38 +M = 2d + +ModInv = 1c +A = -35 +M = 2d + +ModInv = 20 +A = -34 +M = 2d + +ModInv = b +A = -31 +M = 2d + +ModInv = 16 +A = -2f +M = 2d + +ModInv = 2c +A = -2e +M = 2d + +ModInv = 1 +A = -2c +M = 2d + +ModInv = 17 +A = -2b +M = 2d + +ModInv = 22 +A = -29 +M = 2d + +ModInv = d +A = -26 +M = 2d + +ModInv = 11 +A = -25 +M = 2d + +ModInv = 29 +A = -22 +M = 2d + +ModInv = 7 +A = -20 +M = 2d + +ModInv = 1d +A = -1f +M = 2d + +ModInv = 1f +A = -1d +M = 2d + +ModInv = 8 +A = -1c +M = 2d + +ModInv = 13 +A = -1a +M = 2d + +ModInv = 2b +A = -17 +M = 2d + +ModInv = 2 +A = -16 +M = 2d + +ModInv = 1a +A = -13 +M = 2d + +ModInv = 25 +A = -11 +M = 2d + +ModInv = e +A = -10 +M = 2d + +ModInv = 10 +A = -e +M = 2d + +ModInv = 26 +A = -d +M = 2d + +ModInv = 4 +A = -b +M = 2d + +ModInv = 1c +A = -8 +M = 2d + +ModInv = 20 +A = -7 +M = 2d + +ModInv = b +A = -4 +M = 2d + +ModInv = 16 +A = -2 +M = 2d + +ModInv = 2c +A = -1 +M = 2d + +ModInv = 1 +A = 1 +M = 2d + +ModInv = 17 +A = 2 +M = 2d + +ModInv = 22 +A = 4 +M = 2d + +ModInv = d +A = 7 +M = 2d + +ModInv = 11 +A = 8 +M = 2d + +ModInv = 29 +A = b +M = 2d + +ModInv = 7 +A = d +M = 2d + +ModInv = 1d +A = e +M = 2d + +ModInv = 1f +A = 10 +M = 2d + +ModInv = 8 +A = 11 +M = 2d + +ModInv = 13 +A = 13 +M = 2d + +ModInv = 2b +A = 16 +M = 2d + +ModInv = 2 +A = 17 +M = 2d + +ModInv = 1a +A = 1a +M = 2d + +ModInv = 25 +A = 1c +M = 2d + +ModInv = e +A = 1d +M = 2d + +ModInv = 10 +A = 1f +M = 2d + +ModInv = 26 +A = 20 +M = 2d + +ModInv = 4 +A = 22 +M = 2d + +ModInv = 1c +A = 25 +M = 2d + +ModInv = 20 +A = 26 +M = 2d + +ModInv = b +A = 29 +M = 2d + +ModInv = 16 +A = 2b +M = 2d + +ModInv = 2c +A = 2c +M = 2d + +ModInv = 1 +A = 2e +M = 2d + +ModInv = 17 +A = 2f +M = 2d + +ModInv = 22 +A = 31 +M = 2d + +ModInv = d +A = 34 +M = 2d + +ModInv = 11 +A = 35 +M = 2d + +ModInv = 29 +A = 38 +M = 2d + +ModInv = 7 +A = 3a +M = 2d + +ModInv = 1d +A = 3b +M = 2d + +ModInv = 1f +A = 3d +M = 2d + +ModInv = 8 +A = 3e +M = 2d + +ModInv = 13 +A = 40 +M = 2d + +ModInv = 2b +A = 43 +M = 2d + +ModInv = 2 +A = 44 +M = 2d + +ModInv = 1a +A = 47 +M = 2d + +ModInv = 25 +A = 49 +M = 2d + +ModInv = e +A = 4a +M = 2d + +ModInv = 10 +A = 4c +M = 2d + +ModInv = 26 +A = 4d +M = 2d + +ModInv = 4 +A = 4f +M = 2d + +ModInv = 1c +A = 52 +M = 2d + +ModInv = 20 +A = 53 +M = 2d + +ModInv = b +A = 56 +M = 2d + +ModInv = 16 +A = 58 +M = 2d + +ModInv = 2c +A = 59 +M = 2d + +ModInv = 1 +A = 5b +M = 2d + +ModInv = 17 +A = 5c +M = 2d + +ModInv = 22 +A = 5e +M = 2d + +ModInv = d +A = 61 +M = 2d + +ModInv = 11 +A = 62 +M = 2d + +ModInv = d +A = -63 +M = 2e + +ModInv = 9 +A = -61 +M = 2e + +ModInv = f +A = -5f +M = 2e + +ModInv = 2d +A = -5d +M = 2e + +ModInv = 1 +A = -5b +M = 2e + +ModInv = 1f +A = -59 +M = 2e + +ModInv = 25 +A = -57 +M = 2e + +ModInv = 21 +A = -55 +M = 2e + +ModInv = 29 +A = -53 +M = 2e + +ModInv = 15 +A = -51 +M = 2e + +ModInv = 27 +A = -4f +M = 2e + +ModInv = 2b +A = -4d +M = 2e + +ModInv = 13 +A = -4b +M = 2e + +ModInv = 11 +A = -49 +M = 2e + +ModInv = b +A = -47 +M = 2e + +ModInv = 23 +A = -43 +M = 2e + +ModInv = 1d +A = -41 +M = 2e + +ModInv = 1b +A = -3f +M = 2e + +ModInv = 3 +A = -3d +M = 2e + +ModInv = 7 +A = -3b +M = 2e + +ModInv = 19 +A = -39 +M = 2e + +ModInv = 5 +A = -37 +M = 2e + +ModInv = d +A = -35 +M = 2e + +ModInv = 9 +A = -33 +M = 2e + +ModInv = f +A = -31 +M = 2e + +ModInv = 2d +A = -2f +M = 2e + +ModInv = 1 +A = -2d +M = 2e + +ModInv = 1f +A = -2b +M = 2e + +ModInv = 25 +A = -29 +M = 2e + +ModInv = 21 +A = -27 +M = 2e + +ModInv = 29 +A = -25 +M = 2e + +ModInv = 15 +A = -23 +M = 2e + +ModInv = 27 +A = -21 +M = 2e + +ModInv = 2b +A = -1f +M = 2e + +ModInv = 13 +A = -1d +M = 2e + +ModInv = 11 +A = -1b +M = 2e + +ModInv = b +A = -19 +M = 2e + +ModInv = 23 +A = -15 +M = 2e + +ModInv = 1d +A = -13 +M = 2e + +ModInv = 1b +A = -11 +M = 2e + +ModInv = 3 +A = -f +M = 2e + +ModInv = 7 +A = -d +M = 2e + +ModInv = 19 +A = -b +M = 2e + +ModInv = 5 +A = -9 +M = 2e + +ModInv = d +A = -7 +M = 2e + +ModInv = 9 +A = -5 +M = 2e + +ModInv = f +A = -3 +M = 2e + +ModInv = 2d +A = -1 +M = 2e + +ModInv = 1 +A = 1 +M = 2e + +ModInv = 1f +A = 3 +M = 2e + +ModInv = 25 +A = 5 +M = 2e + +ModInv = 21 +A = 7 +M = 2e + +ModInv = 29 +A = 9 +M = 2e + +ModInv = 15 +A = b +M = 2e + +ModInv = 27 +A = d +M = 2e + +ModInv = 2b +A = f +M = 2e + +ModInv = 13 +A = 11 +M = 2e + +ModInv = 11 +A = 13 +M = 2e + +ModInv = b +A = 15 +M = 2e + +ModInv = 23 +A = 19 +M = 2e + +ModInv = 1d +A = 1b +M = 2e + +ModInv = 1b +A = 1d +M = 2e + +ModInv = 3 +A = 1f +M = 2e + +ModInv = 7 +A = 21 +M = 2e + +ModInv = 19 +A = 23 +M = 2e + +ModInv = 5 +A = 25 +M = 2e + +ModInv = d +A = 27 +M = 2e + +ModInv = 9 +A = 29 +M = 2e + +ModInv = f +A = 2b +M = 2e + +ModInv = 2d +A = 2d +M = 2e + +ModInv = 1 +A = 2f +M = 2e + +ModInv = 1f +A = 31 +M = 2e + +ModInv = 25 +A = 33 +M = 2e + +ModInv = 21 +A = 35 +M = 2e + +ModInv = 29 +A = 37 +M = 2e + +ModInv = 15 +A = 39 +M = 2e + +ModInv = 27 +A = 3b +M = 2e + +ModInv = 2b +A = 3d +M = 2e + +ModInv = 13 +A = 3f +M = 2e + +ModInv = 11 +A = 41 +M = 2e + +ModInv = b +A = 43 +M = 2e + +ModInv = 23 +A = 47 +M = 2e + +ModInv = 1d +A = 49 +M = 2e + +ModInv = 1b +A = 4b +M = 2e + +ModInv = 3 +A = 4d +M = 2e + +ModInv = 7 +A = 4f +M = 2e + +ModInv = 19 +A = 51 +M = 2e + +ModInv = 5 +A = 53 +M = 2e + +ModInv = d +A = 55 +M = 2e + +ModInv = 9 +A = 57 +M = 2e + +ModInv = f +A = 59 +M = 2e + +ModInv = 2d +A = 5b +M = 2e + +ModInv = 1 +A = 5d +M = 2e + +ModInv = 1f +A = 5f +M = 2e + +ModInv = 25 +A = 61 +M = 2e + +ModInv = 21 +A = 63 +M = 2e + +ModInv = 27 +A = -64 +M = 2f + +ModInv = 1c +A = -63 +M = 2f + +ModInv = 23 +A = -62 +M = 2f + +ModInv = 1f +A = -61 +M = 2f + +ModInv = 17 +A = -60 +M = 2f + +ModInv = 2e +A = -5f +M = 2f + +ModInv = 1 +A = -5d +M = 2f + +ModInv = 18 +A = -5c +M = 2f + +ModInv = 10 +A = -5b +M = 2f + +ModInv = c +A = -5a +M = 2f + +ModInv = 13 +A = -59 +M = 2f + +ModInv = 8 +A = -58 +M = 2f + +ModInv = 1b +A = -57 +M = 2f + +ModInv = 6 +A = -56 +M = 2f + +ModInv = 15 +A = -55 +M = 2f + +ModInv = 21 +A = -54 +M = 2f + +ModInv = 1e +A = -53 +M = 2f + +ModInv = 4 +A = -52 +M = 2f + +ModInv = 1d +A = -51 +M = 2f + +ModInv = 25 +A = -50 +M = 2f + +ModInv = 16 +A = -4f +M = 2f + +ModInv = 3 +A = -4e +M = 2f + +ModInv = 24 +A = -4d +M = 2f + +ModInv = 22 +A = -4c +M = 2f + +ModInv = 5 +A = -4b +M = 2f + +ModInv = 28 +A = -4a +M = 2f + +ModInv = 9 +A = -49 +M = 2f + +ModInv = f +A = -48 +M = 2f + +ModInv = 2d +A = -47 +M = 2f + +ModInv = 2 +A = -46 +M = 2f + +ModInv = 20 +A = -45 +M = 2f + +ModInv = 26 +A = -44 +M = 2f + +ModInv = 7 +A = -43 +M = 2f + +ModInv = 2a +A = -42 +M = 2f + +ModInv = d +A = -41 +M = 2f + +ModInv = b +A = -40 +M = 2f + +ModInv = 2c +A = -3f +M = 2f + +ModInv = 19 +A = -3e +M = 2f + +ModInv = a +A = -3d +M = 2f + +ModInv = 12 +A = -3c +M = 2f + +ModInv = 2b +A = -3b +M = 2f + +ModInv = 11 +A = -3a +M = 2f + +ModInv = e +A = -39 +M = 2f + +ModInv = 1a +A = -38 +M = 2f + +ModInv = 29 +A = -37 +M = 2f + +ModInv = 14 +A = -36 +M = 2f + +ModInv = 27 +A = -35 +M = 2f + +ModInv = 1c +A = -34 +M = 2f + +ModInv = 23 +A = -33 +M = 2f + +ModInv = 1f +A = -32 +M = 2f + +ModInv = 17 +A = -31 +M = 2f + +ModInv = 2e +A = -30 +M = 2f + +ModInv = 1 +A = -2e +M = 2f + +ModInv = 18 +A = -2d +M = 2f + +ModInv = 10 +A = -2c +M = 2f + +ModInv = c +A = -2b +M = 2f + +ModInv = 13 +A = -2a +M = 2f + +ModInv = 8 +A = -29 +M = 2f + +ModInv = 1b +A = -28 +M = 2f + +ModInv = 6 +A = -27 +M = 2f + +ModInv = 15 +A = -26 +M = 2f + +ModInv = 21 +A = -25 +M = 2f + +ModInv = 1e +A = -24 +M = 2f + +ModInv = 4 +A = -23 +M = 2f + +ModInv = 1d +A = -22 +M = 2f + +ModInv = 25 +A = -21 +M = 2f + +ModInv = 16 +A = -20 +M = 2f + +ModInv = 3 +A = -1f +M = 2f + +ModInv = 24 +A = -1e +M = 2f + +ModInv = 22 +A = -1d +M = 2f + +ModInv = 5 +A = -1c +M = 2f + +ModInv = 28 +A = -1b +M = 2f + +ModInv = 9 +A = -1a +M = 2f + +ModInv = f +A = -19 +M = 2f + +ModInv = 2d +A = -18 +M = 2f + +ModInv = 2 +A = -17 +M = 2f + +ModInv = 20 +A = -16 +M = 2f + +ModInv = 26 +A = -15 +M = 2f + +ModInv = 7 +A = -14 +M = 2f + +ModInv = 2a +A = -13 +M = 2f + +ModInv = d +A = -12 +M = 2f + +ModInv = b +A = -11 +M = 2f + +ModInv = 2c +A = -10 +M = 2f + +ModInv = 19 +A = -f +M = 2f + +ModInv = a +A = -e +M = 2f + +ModInv = 12 +A = -d +M = 2f + +ModInv = 2b +A = -c +M = 2f + +ModInv = 11 +A = -b +M = 2f + +ModInv = e +A = -a +M = 2f + +ModInv = 1a +A = -9 +M = 2f + +ModInv = 29 +A = -8 +M = 2f + +ModInv = 14 +A = -7 +M = 2f + +ModInv = 27 +A = -6 +M = 2f + +ModInv = 1c +A = -5 +M = 2f + +ModInv = 23 +A = -4 +M = 2f + +ModInv = 1f +A = -3 +M = 2f + +ModInv = 17 +A = -2 +M = 2f + +ModInv = 2e +A = -1 +M = 2f + +ModInv = 1 +A = 1 +M = 2f + +ModInv = 18 +A = 2 +M = 2f + +ModInv = 10 +A = 3 +M = 2f + +ModInv = c +A = 4 +M = 2f + +ModInv = 13 +A = 5 +M = 2f + +ModInv = 8 +A = 6 +M = 2f + +ModInv = 1b +A = 7 +M = 2f + +ModInv = 6 +A = 8 +M = 2f + +ModInv = 15 +A = 9 +M = 2f + +ModInv = 21 +A = a +M = 2f + +ModInv = 1e +A = b +M = 2f + +ModInv = 4 +A = c +M = 2f + +ModInv = 1d +A = d +M = 2f + +ModInv = 25 +A = e +M = 2f + +ModInv = 16 +A = f +M = 2f + +ModInv = 3 +A = 10 +M = 2f + +ModInv = 24 +A = 11 +M = 2f + +ModInv = 22 +A = 12 +M = 2f + +ModInv = 5 +A = 13 +M = 2f + +ModInv = 28 +A = 14 +M = 2f + +ModInv = 9 +A = 15 +M = 2f + +ModInv = f +A = 16 +M = 2f + +ModInv = 2d +A = 17 +M = 2f + +ModInv = 2 +A = 18 +M = 2f + +ModInv = 20 +A = 19 +M = 2f + +ModInv = 26 +A = 1a +M = 2f + +ModInv = 7 +A = 1b +M = 2f + +ModInv = 2a +A = 1c +M = 2f + +ModInv = d +A = 1d +M = 2f + +ModInv = b +A = 1e +M = 2f + +ModInv = 2c +A = 1f +M = 2f + +ModInv = 19 +A = 20 +M = 2f + +ModInv = a +A = 21 +M = 2f + +ModInv = 12 +A = 22 +M = 2f + +ModInv = 2b +A = 23 +M = 2f + +ModInv = 11 +A = 24 +M = 2f + +ModInv = e +A = 25 +M = 2f + +ModInv = 1a +A = 26 +M = 2f + +ModInv = 29 +A = 27 +M = 2f + +ModInv = 14 +A = 28 +M = 2f + +ModInv = 27 +A = 29 +M = 2f + +ModInv = 1c +A = 2a +M = 2f + +ModInv = 23 +A = 2b +M = 2f + +ModInv = 1f +A = 2c +M = 2f + +ModInv = 17 +A = 2d +M = 2f + +ModInv = 2e +A = 2e +M = 2f + +ModInv = 1 +A = 30 +M = 2f + +ModInv = 18 +A = 31 +M = 2f + +ModInv = 10 +A = 32 +M = 2f + +ModInv = c +A = 33 +M = 2f + +ModInv = 13 +A = 34 +M = 2f + +ModInv = 8 +A = 35 +M = 2f + +ModInv = 1b +A = 36 +M = 2f + +ModInv = 6 +A = 37 +M = 2f + +ModInv = 15 +A = 38 +M = 2f + +ModInv = 21 +A = 39 +M = 2f + +ModInv = 1e +A = 3a +M = 2f + +ModInv = 4 +A = 3b +M = 2f + +ModInv = 1d +A = 3c +M = 2f + +ModInv = 25 +A = 3d +M = 2f + +ModInv = 16 +A = 3e +M = 2f + +ModInv = 3 +A = 3f +M = 2f + +ModInv = 24 +A = 40 +M = 2f + +ModInv = 22 +A = 41 +M = 2f + +ModInv = 5 +A = 42 +M = 2f + +ModInv = 28 +A = 43 +M = 2f + +ModInv = 9 +A = 44 +M = 2f + +ModInv = f +A = 45 +M = 2f + +ModInv = 2d +A = 46 +M = 2f + +ModInv = 2 +A = 47 +M = 2f + +ModInv = 20 +A = 48 +M = 2f + +ModInv = 26 +A = 49 +M = 2f + +ModInv = 7 +A = 4a +M = 2f + +ModInv = 2a +A = 4b +M = 2f + +ModInv = d +A = 4c +M = 2f + +ModInv = b +A = 4d +M = 2f + +ModInv = 2c +A = 4e +M = 2f + +ModInv = 19 +A = 4f +M = 2f + +ModInv = a +A = 50 +M = 2f + +ModInv = 12 +A = 51 +M = 2f + +ModInv = 2b +A = 52 +M = 2f + +ModInv = 11 +A = 53 +M = 2f + +ModInv = e +A = 54 +M = 2f + +ModInv = 1a +A = 55 +M = 2f + +ModInv = 29 +A = 56 +M = 2f + +ModInv = 14 +A = 57 +M = 2f + +ModInv = 27 +A = 58 +M = 2f + +ModInv = 1c +A = 59 +M = 2f + +ModInv = 23 +A = 5a +M = 2f + +ModInv = 1f +A = 5b +M = 2f + +ModInv = 17 +A = 5c +M = 2f + +ModInv = 2e +A = 5d +M = 2f + +ModInv = 1 +A = 5f +M = 2f + +ModInv = 18 +A = 60 +M = 2f + +ModInv = 10 +A = 61 +M = 2f + +ModInv = c +A = 62 +M = 2f + +ModInv = 13 +A = 63 +M = 2f + +ModInv = 2f +A = -61 +M = 30 + +ModInv = 1 +A = -5f +M = 30 + +ModInv = 1d +A = -5b +M = 30 + +ModInv = 7 +A = -59 +M = 30 + +ModInv = 23 +A = -55 +M = 30 + +ModInv = 25 +A = -53 +M = 30 + +ModInv = 11 +A = -4f +M = 30 + +ModInv = 2b +A = -4d +M = 30 + +ModInv = 17 +A = -49 +M = 30 + +ModInv = 19 +A = -47 +M = 30 + +ModInv = 5 +A = -43 +M = 30 + +ModInv = 1f +A = -41 +M = 30 + +ModInv = b +A = -3d +M = 30 + +ModInv = d +A = -3b +M = 30 + +ModInv = 29 +A = -37 +M = 30 + +ModInv = 13 +A = -35 +M = 30 + +ModInv = 2f +A = -31 +M = 30 + +ModInv = 1 +A = -2f +M = 30 + +ModInv = 1d +A = -2b +M = 30 + +ModInv = 7 +A = -29 +M = 30 + +ModInv = 23 +A = -25 +M = 30 + +ModInv = 25 +A = -23 +M = 30 + +ModInv = 11 +A = -1f +M = 30 + +ModInv = 2b +A = -1d +M = 30 + +ModInv = 17 +A = -19 +M = 30 + +ModInv = 19 +A = -17 +M = 30 + +ModInv = 5 +A = -13 +M = 30 + +ModInv = 1f +A = -11 +M = 30 + +ModInv = b +A = -d +M = 30 + +ModInv = d +A = -b +M = 30 + +ModInv = 29 +A = -7 +M = 30 + +ModInv = 13 +A = -5 +M = 30 + +ModInv = 2f +A = -1 +M = 30 + +ModInv = 1 +A = 1 +M = 30 + +ModInv = 1d +A = 5 +M = 30 + +ModInv = 7 +A = 7 +M = 30 + +ModInv = 23 +A = b +M = 30 + +ModInv = 25 +A = d +M = 30 + +ModInv = 11 +A = 11 +M = 30 + +ModInv = 2b +A = 13 +M = 30 + +ModInv = 17 +A = 17 +M = 30 + +ModInv = 19 +A = 19 +M = 30 + +ModInv = 5 +A = 1d +M = 30 + +ModInv = 1f +A = 1f +M = 30 + +ModInv = b +A = 23 +M = 30 + +ModInv = d +A = 25 +M = 30 + +ModInv = 29 +A = 29 +M = 30 + +ModInv = 13 +A = 2b +M = 30 + +ModInv = 2f +A = 2f +M = 30 + +ModInv = 1 +A = 31 +M = 30 + +ModInv = 1d +A = 35 +M = 30 + +ModInv = 7 +A = 37 +M = 30 + +ModInv = 23 +A = 3b +M = 30 + +ModInv = 25 +A = 3d +M = 30 + +ModInv = 11 +A = 41 +M = 30 + +ModInv = 2b +A = 43 +M = 30 + +ModInv = 17 +A = 47 +M = 30 + +ModInv = 19 +A = 49 +M = 30 + +ModInv = 5 +A = 4d +M = 30 + +ModInv = 1f +A = 4f +M = 30 + +ModInv = b +A = 53 +M = 30 + +ModInv = d +A = 55 +M = 30 + +ModInv = 29 +A = 59 +M = 30 + +ModInv = 13 +A = 5b +M = 30 + +ModInv = 2f +A = 5f +M = 30 + +ModInv = 1 +A = 61 +M = 30 + +ModInv = 18 +A = -64 +M = 31 + +ModInv = 30 +A = -63 +M = 31 + +ModInv = 1 +A = -61 +M = 31 + +ModInv = 19 +A = -60 +M = 31 + +ModInv = 21 +A = -5f +M = 31 + +ModInv = 25 +A = -5e +M = 31 + +ModInv = a +A = -5d +M = 31 + +ModInv = 29 +A = -5c +M = 31 + +ModInv = 2b +A = -5a +M = 31 + +ModInv = b +A = -59 +M = 31 + +ModInv = 5 +A = -58 +M = 31 + +ModInv = 9 +A = -57 +M = 31 + +ModInv = 2d +A = -56 +M = 31 + +ModInv = 22 +A = -55 +M = 31 + +ModInv = 24 +A = -53 +M = 31 + +ModInv = 2e +A = -52 +M = 31 + +ModInv = 1a +A = -51 +M = 31 + +ModInv = 1e +A = -50 +M = 31 + +ModInv = 1f +A = -4f +M = 31 + +ModInv = 1b +A = -4e +M = 31 + +ModInv = 1d +A = -4c +M = 31 + +ModInv = 20 +A = -4b +M = 31 + +ModInv = 2f +A = -4a +M = 31 + +ModInv = 2 +A = -49 +M = 31 + +ModInv = 11 +A = -48 +M = 31 + +ModInv = 14 +A = -47 +M = 31 + +ModInv = 16 +A = -45 +M = 31 + +ModInv = 12 +A = -44 +M = 31 + +ModInv = 13 +A = -43 +M = 31 + +ModInv = 17 +A = -42 +M = 31 + +ModInv = 3 +A = -41 +M = 31 + +ModInv = d +A = -40 +M = 31 + +ModInv = f +A = -3e +M = 31 + +ModInv = 4 +A = -3d +M = 31 + +ModInv = 28 +A = -3c +M = 31 + +ModInv = 2c +A = -3b +M = 31 + +ModInv = 26 +A = -3a +M = 31 + +ModInv = 6 +A = -39 +M = 31 + +ModInv = 8 +A = -37 +M = 31 + +ModInv = 27 +A = -36 +M = 31 + +ModInv = c +A = -35 +M = 31 + +ModInv = 10 +A = -34 +M = 31 + +ModInv = 18 +A = -33 +M = 31 + +ModInv = 30 +A = -32 +M = 31 + +ModInv = 1 +A = -30 +M = 31 + +ModInv = 19 +A = -2f +M = 31 + +ModInv = 21 +A = -2e +M = 31 + +ModInv = 25 +A = -2d +M = 31 + +ModInv = a +A = -2c +M = 31 + +ModInv = 29 +A = -2b +M = 31 + +ModInv = 2b +A = -29 +M = 31 + +ModInv = b +A = -28 +M = 31 + +ModInv = 5 +A = -27 +M = 31 + +ModInv = 9 +A = -26 +M = 31 + +ModInv = 2d +A = -25 +M = 31 + +ModInv = 22 +A = -24 +M = 31 + +ModInv = 24 +A = -22 +M = 31 + +ModInv = 2e +A = -21 +M = 31 + +ModInv = 1a +A = -20 +M = 31 + +ModInv = 1e +A = -1f +M = 31 + +ModInv = 1f +A = -1e +M = 31 + +ModInv = 1b +A = -1d +M = 31 + +ModInv = 1d +A = -1b +M = 31 + +ModInv = 20 +A = -1a +M = 31 + +ModInv = 2f +A = -19 +M = 31 + +ModInv = 2 +A = -18 +M = 31 + +ModInv = 11 +A = -17 +M = 31 + +ModInv = 14 +A = -16 +M = 31 + +ModInv = 16 +A = -14 +M = 31 + +ModInv = 12 +A = -13 +M = 31 + +ModInv = 13 +A = -12 +M = 31 + +ModInv = 17 +A = -11 +M = 31 + +ModInv = 3 +A = -10 +M = 31 + +ModInv = d +A = -f +M = 31 + +ModInv = f +A = -d +M = 31 + +ModInv = 4 +A = -c +M = 31 + +ModInv = 28 +A = -b +M = 31 + +ModInv = 2c +A = -a +M = 31 + +ModInv = 26 +A = -9 +M = 31 + +ModInv = 6 +A = -8 +M = 31 + +ModInv = 8 +A = -6 +M = 31 + +ModInv = 27 +A = -5 +M = 31 + +ModInv = c +A = -4 +M = 31 + +ModInv = 10 +A = -3 +M = 31 + +ModInv = 18 +A = -2 +M = 31 + +ModInv = 30 +A = -1 +M = 31 + +ModInv = 1 +A = 1 +M = 31 + +ModInv = 19 +A = 2 +M = 31 + +ModInv = 21 +A = 3 +M = 31 + +ModInv = 25 +A = 4 +M = 31 + +ModInv = a +A = 5 +M = 31 + +ModInv = 29 +A = 6 +M = 31 + +ModInv = 2b +A = 8 +M = 31 + +ModInv = b +A = 9 +M = 31 + +ModInv = 5 +A = a +M = 31 + +ModInv = 9 +A = b +M = 31 + +ModInv = 2d +A = c +M = 31 + +ModInv = 22 +A = d +M = 31 + +ModInv = 24 +A = f +M = 31 + +ModInv = 2e +A = 10 +M = 31 + +ModInv = 1a +A = 11 +M = 31 + +ModInv = 1e +A = 12 +M = 31 + +ModInv = 1f +A = 13 +M = 31 + +ModInv = 1b +A = 14 +M = 31 + +ModInv = 1d +A = 16 +M = 31 + +ModInv = 20 +A = 17 +M = 31 + +ModInv = 2f +A = 18 +M = 31 + +ModInv = 2 +A = 19 +M = 31 + +ModInv = 11 +A = 1a +M = 31 + +ModInv = 14 +A = 1b +M = 31 + +ModInv = 16 +A = 1d +M = 31 + +ModInv = 12 +A = 1e +M = 31 + +ModInv = 13 +A = 1f +M = 31 + +ModInv = 17 +A = 20 +M = 31 + +ModInv = 3 +A = 21 +M = 31 + +ModInv = d +A = 22 +M = 31 + +ModInv = f +A = 24 +M = 31 + +ModInv = 4 +A = 25 +M = 31 + +ModInv = 28 +A = 26 +M = 31 + +ModInv = 2c +A = 27 +M = 31 + +ModInv = 26 +A = 28 +M = 31 + +ModInv = 6 +A = 29 +M = 31 + +ModInv = 8 +A = 2b +M = 31 + +ModInv = 27 +A = 2c +M = 31 + +ModInv = c +A = 2d +M = 31 + +ModInv = 10 +A = 2e +M = 31 + +ModInv = 18 +A = 2f +M = 31 + +ModInv = 30 +A = 30 +M = 31 + +ModInv = 1 +A = 32 +M = 31 + +ModInv = 19 +A = 33 +M = 31 + +ModInv = 21 +A = 34 +M = 31 + +ModInv = 25 +A = 35 +M = 31 + +ModInv = a +A = 36 +M = 31 + +ModInv = 29 +A = 37 +M = 31 + +ModInv = 2b +A = 39 +M = 31 + +ModInv = b +A = 3a +M = 31 + +ModInv = 5 +A = 3b +M = 31 + +ModInv = 9 +A = 3c +M = 31 + +ModInv = 2d +A = 3d +M = 31 + +ModInv = 22 +A = 3e +M = 31 + +ModInv = 24 +A = 40 +M = 31 + +ModInv = 2e +A = 41 +M = 31 + +ModInv = 1a +A = 42 +M = 31 + +ModInv = 1e +A = 43 +M = 31 + +ModInv = 1f +A = 44 +M = 31 + +ModInv = 1b +A = 45 +M = 31 + +ModInv = 1d +A = 47 +M = 31 + +ModInv = 20 +A = 48 +M = 31 + +ModInv = 2f +A = 49 +M = 31 + +ModInv = 2 +A = 4a +M = 31 + +ModInv = 11 +A = 4b +M = 31 + +ModInv = 14 +A = 4c +M = 31 + +ModInv = 16 +A = 4e +M = 31 + +ModInv = 12 +A = 4f +M = 31 + +ModInv = 13 +A = 50 +M = 31 + +ModInv = 17 +A = 51 +M = 31 + +ModInv = 3 +A = 52 +M = 31 + +ModInv = d +A = 53 +M = 31 + +ModInv = f +A = 55 +M = 31 + +ModInv = 4 +A = 56 +M = 31 + +ModInv = 28 +A = 57 +M = 31 + +ModInv = 2c +A = 58 +M = 31 + +ModInv = 26 +A = 59 +M = 31 + +ModInv = 6 +A = 5a +M = 31 + +ModInv = 8 +A = 5c +M = 31 + +ModInv = 27 +A = 5d +M = 31 + +ModInv = c +A = 5e +M = 31 + +ModInv = 10 +A = 5f +M = 31 + +ModInv = 18 +A = 60 +M = 31 + +ModInv = 30 +A = 61 +M = 31 + +ModInv = 1 +A = 63 +M = 31 + +ModInv = 1 +A = -63 +M = 32 + +ModInv = 11 +A = -61 +M = 32 + +ModInv = 2b +A = -5d +M = 32 + +ModInv = 27 +A = -5b +M = 32 + +ModInv = 29 +A = -59 +M = 32 + +ModInv = 1b +A = -57 +M = 32 + +ModInv = 3 +A = -53 +M = 32 + +ModInv = 1d +A = -51 +M = 32 + +ModInv = 1f +A = -4f +M = 32 + +ModInv = 25 +A = -4d +M = 32 + +ModInv = d +A = -49 +M = 32 + +ModInv = 13 +A = -47 +M = 32 + +ModInv = 15 +A = -45 +M = 32 + +ModInv = 2f +A = -43 +M = 32 + +ModInv = 17 +A = -3f +M = 32 + +ModInv = 9 +A = -3d +M = 32 + +ModInv = b +A = -3b +M = 32 + +ModInv = 7 +A = -39 +M = 32 + +ModInv = 21 +A = -35 +M = 32 + +ModInv = 31 +A = -33 +M = 32 + +ModInv = 1 +A = -31 +M = 32 + +ModInv = 11 +A = -2f +M = 32 + +ModInv = 2b +A = -2b +M = 32 + +ModInv = 27 +A = -29 +M = 32 + +ModInv = 29 +A = -27 +M = 32 + +ModInv = 1b +A = -25 +M = 32 + +ModInv = 3 +A = -21 +M = 32 + +ModInv = 1d +A = -1f +M = 32 + +ModInv = 1f +A = -1d +M = 32 + +ModInv = 25 +A = -1b +M = 32 + +ModInv = d +A = -17 +M = 32 + +ModInv = 13 +A = -15 +M = 32 + +ModInv = 15 +A = -13 +M = 32 + +ModInv = 2f +A = -11 +M = 32 + +ModInv = 17 +A = -d +M = 32 + +ModInv = 9 +A = -b +M = 32 + +ModInv = b +A = -9 +M = 32 + +ModInv = 7 +A = -7 +M = 32 + +ModInv = 21 +A = -3 +M = 32 + +ModInv = 31 +A = -1 +M = 32 + +ModInv = 1 +A = 1 +M = 32 + +ModInv = 11 +A = 3 +M = 32 + +ModInv = 2b +A = 7 +M = 32 + +ModInv = 27 +A = 9 +M = 32 + +ModInv = 29 +A = b +M = 32 + +ModInv = 1b +A = d +M = 32 + +ModInv = 3 +A = 11 +M = 32 + +ModInv = 1d +A = 13 +M = 32 + +ModInv = 1f +A = 15 +M = 32 + +ModInv = 25 +A = 17 +M = 32 + +ModInv = d +A = 1b +M = 32 + +ModInv = 13 +A = 1d +M = 32 + +ModInv = 15 +A = 1f +M = 32 + +ModInv = 2f +A = 21 +M = 32 + +ModInv = 17 +A = 25 +M = 32 + +ModInv = 9 +A = 27 +M = 32 + +ModInv = b +A = 29 +M = 32 + +ModInv = 7 +A = 2b +M = 32 + +ModInv = 21 +A = 2f +M = 32 + +ModInv = 31 +A = 31 +M = 32 + +ModInv = 1 +A = 33 +M = 32 + +ModInv = 11 +A = 35 +M = 32 + +ModInv = 2b +A = 39 +M = 32 + +ModInv = 27 +A = 3b +M = 32 + +ModInv = 29 +A = 3d +M = 32 + +ModInv = 1b +A = 3f +M = 32 + +ModInv = 3 +A = 43 +M = 32 + +ModInv = 1d +A = 45 +M = 32 + +ModInv = 1f +A = 47 +M = 32 + +ModInv = 25 +A = 49 +M = 32 + +ModInv = d +A = 4d +M = 32 + +ModInv = 13 +A = 4f +M = 32 + +ModInv = 15 +A = 51 +M = 32 + +ModInv = 2f +A = 53 +M = 32 + +ModInv = 17 +A = 57 +M = 32 + +ModInv = 9 +A = 59 +M = 32 + +ModInv = b +A = 5b +M = 32 + +ModInv = 7 +A = 5d +M = 32 + +ModInv = 21 +A = 61 +M = 32 + +ModInv = 31 +A = 63 +M = 32 + +ModInv = 1a +A = -64 +M = 33 + +ModInv = d +A = -62 +M = 33 + +ModInv = 29 +A = -61 +M = 33 + +ModInv = 16 +A = -5f +M = 33 + +ModInv = 20 +A = -5e +M = 33 + +ModInv = 2e +A = -5c +M = 33 + +ModInv = e +A = -5b +M = 33 + +ModInv = 4 +A = -59 +M = 33 + +ModInv = b +A = -58 +M = 33 + +ModInv = 10 +A = -56 +M = 33 + +ModInv = 2b +A = -53 +M = 33 + +ModInv = 17 +A = -52 +M = 33 + +ModInv = 7 +A = -50 +M = 33 + +ModInv = 14 +A = -4f +M = 33 + +ModInv = 31 +A = -4d +M = 33 + +ModInv = 2 +A = -4c +M = 33 + +ModInv = 1f +A = -4a +M = 33 + +ModInv = 2c +A = -49 +M = 33 + +ModInv = 1c +A = -47 +M = 33 + +ModInv = 8 +A = -46 +M = 33 + +ModInv = 23 +A = -43 +M = 33 + +ModInv = 28 +A = -41 +M = 33 + +ModInv = 2f +A = -40 +M = 33 + +ModInv = 25 +A = -3e +M = 33 + +ModInv = 5 +A = -3d +M = 33 + +ModInv = 13 +A = -3b +M = 33 + +ModInv = 1d +A = -3a +M = 33 + +ModInv = a +A = -38 +M = 33 + +ModInv = 26 +A = -37 +M = 33 + +ModInv = 19 +A = -35 +M = 33 + +ModInv = 32 +A = -34 +M = 33 + +ModInv = 1 +A = -32 +M = 33 + +ModInv = 1a +A = -31 +M = 33 + +ModInv = d +A = -2f +M = 33 + +ModInv = 29 +A = -2e +M = 33 + +ModInv = 16 +A = -2c +M = 33 + +ModInv = 20 +A = -2b +M = 33 + +ModInv = 2e +A = -29 +M = 33 + +ModInv = e +A = -28 +M = 33 + +ModInv = 4 +A = -26 +M = 33 + +ModInv = b +A = -25 +M = 33 + +ModInv = 10 +A = -23 +M = 33 + +ModInv = 2b +A = -20 +M = 33 + +ModInv = 17 +A = -1f +M = 33 + +ModInv = 7 +A = -1d +M = 33 + +ModInv = 14 +A = -1c +M = 33 + +ModInv = 31 +A = -1a +M = 33 + +ModInv = 2 +A = -19 +M = 33 + +ModInv = 1f +A = -17 +M = 33 + +ModInv = 2c +A = -16 +M = 33 + +ModInv = 1c +A = -14 +M = 33 + +ModInv = 8 +A = -13 +M = 33 + +ModInv = 23 +A = -10 +M = 33 + +ModInv = 28 +A = -e +M = 33 + +ModInv = 2f +A = -d +M = 33 + +ModInv = 25 +A = -b +M = 33 + +ModInv = 5 +A = -a +M = 33 + +ModInv = 13 +A = -8 +M = 33 + +ModInv = 1d +A = -7 +M = 33 + +ModInv = a +A = -5 +M = 33 + +ModInv = 26 +A = -4 +M = 33 + +ModInv = 19 +A = -2 +M = 33 + +ModInv = 32 +A = -1 +M = 33 + +ModInv = 1 +A = 1 +M = 33 + +ModInv = 1a +A = 2 +M = 33 + +ModInv = d +A = 4 +M = 33 + +ModInv = 29 +A = 5 +M = 33 + +ModInv = 16 +A = 7 +M = 33 + +ModInv = 20 +A = 8 +M = 33 + +ModInv = 2e +A = a +M = 33 + +ModInv = e +A = b +M = 33 + +ModInv = 4 +A = d +M = 33 + +ModInv = b +A = e +M = 33 + +ModInv = 10 +A = 10 +M = 33 + +ModInv = 2b +A = 13 +M = 33 + +ModInv = 17 +A = 14 +M = 33 + +ModInv = 7 +A = 16 +M = 33 + +ModInv = 14 +A = 17 +M = 33 + +ModInv = 31 +A = 19 +M = 33 + +ModInv = 2 +A = 1a +M = 33 + +ModInv = 1f +A = 1c +M = 33 + +ModInv = 2c +A = 1d +M = 33 + +ModInv = 1c +A = 1f +M = 33 + +ModInv = 8 +A = 20 +M = 33 + +ModInv = 23 +A = 23 +M = 33 + +ModInv = 28 +A = 25 +M = 33 + +ModInv = 2f +A = 26 +M = 33 + +ModInv = 25 +A = 28 +M = 33 + +ModInv = 5 +A = 29 +M = 33 + +ModInv = 13 +A = 2b +M = 33 + +ModInv = 1d +A = 2c +M = 33 + +ModInv = a +A = 2e +M = 33 + +ModInv = 26 +A = 2f +M = 33 + +ModInv = 19 +A = 31 +M = 33 + +ModInv = 32 +A = 32 +M = 33 + +ModInv = 1 +A = 34 +M = 33 + +ModInv = 1a +A = 35 +M = 33 + +ModInv = d +A = 37 +M = 33 + +ModInv = 29 +A = 38 +M = 33 + +ModInv = 16 +A = 3a +M = 33 + +ModInv = 20 +A = 3b +M = 33 + +ModInv = 2e +A = 3d +M = 33 + +ModInv = e +A = 3e +M = 33 + +ModInv = 4 +A = 40 +M = 33 + +ModInv = b +A = 41 +M = 33 + +ModInv = 10 +A = 43 +M = 33 + +ModInv = 2b +A = 46 +M = 33 + +ModInv = 17 +A = 47 +M = 33 + +ModInv = 7 +A = 49 +M = 33 + +ModInv = 14 +A = 4a +M = 33 + +ModInv = 31 +A = 4c +M = 33 + +ModInv = 2 +A = 4d +M = 33 + +ModInv = 1f +A = 4f +M = 33 + +ModInv = 2c +A = 50 +M = 33 + +ModInv = 1c +A = 52 +M = 33 + +ModInv = 8 +A = 53 +M = 33 + +ModInv = 23 +A = 56 +M = 33 + +ModInv = 28 +A = 58 +M = 33 + +ModInv = 2f +A = 59 +M = 33 + +ModInv = 25 +A = 5b +M = 33 + +ModInv = 5 +A = 5c +M = 33 + +ModInv = 13 +A = 5e +M = 33 + +ModInv = 1d +A = 5f +M = 33 + +ModInv = a +A = 61 +M = 33 + +ModInv = 26 +A = 62 +M = 33 + +ModInv = 15 +A = -63 +M = 34 + +ModInv = f +A = -61 +M = 34 + +ModInv = 1d +A = -5f +M = 34 + +ModInv = 13 +A = -5d +M = 34 + +ModInv = 7 +A = -59 +M = 34 + +ModInv = 31 +A = -57 +M = 34 + +ModInv = b +A = -55 +M = 34 + +ModInv = 5 +A = -53 +M = 34 + +ModInv = 2b +A = -51 +M = 34 + +ModInv = 19 +A = -4f +M = 34 + +ModInv = 1b +A = -4d +M = 34 + +ModInv = 9 +A = -4b +M = 34 + +ModInv = 2f +A = -49 +M = 34 + +ModInv = 29 +A = -47 +M = 34 + +ModInv = 3 +A = -45 +M = 34 + +ModInv = 2d +A = -43 +M = 34 + +ModInv = 21 +A = -3f +M = 34 + +ModInv = 17 +A = -3d +M = 34 + +ModInv = 25 +A = -3b +M = 34 + +ModInv = 1f +A = -39 +M = 34 + +ModInv = 11 +A = -37 +M = 34 + +ModInv = 33 +A = -35 +M = 34 + +ModInv = 1 +A = -33 +M = 34 + +ModInv = 23 +A = -31 +M = 34 + +ModInv = 15 +A = -2f +M = 34 + +ModInv = f +A = -2d +M = 34 + +ModInv = 1d +A = -2b +M = 34 + +ModInv = 13 +A = -29 +M = 34 + +ModInv = 7 +A = -25 +M = 34 + +ModInv = 31 +A = -23 +M = 34 + +ModInv = b +A = -21 +M = 34 + +ModInv = 5 +A = -1f +M = 34 + +ModInv = 2b +A = -1d +M = 34 + +ModInv = 19 +A = -1b +M = 34 + +ModInv = 1b +A = -19 +M = 34 + +ModInv = 9 +A = -17 +M = 34 + +ModInv = 2f +A = -15 +M = 34 + +ModInv = 29 +A = -13 +M = 34 + +ModInv = 3 +A = -11 +M = 34 + +ModInv = 2d +A = -f +M = 34 + +ModInv = 21 +A = -b +M = 34 + +ModInv = 17 +A = -9 +M = 34 + +ModInv = 25 +A = -7 +M = 34 + +ModInv = 1f +A = -5 +M = 34 + +ModInv = 11 +A = -3 +M = 34 + +ModInv = 33 +A = -1 +M = 34 + +ModInv = 1 +A = 1 +M = 34 + +ModInv = 23 +A = 3 +M = 34 + +ModInv = 15 +A = 5 +M = 34 + +ModInv = f +A = 7 +M = 34 + +ModInv = 1d +A = 9 +M = 34 + +ModInv = 13 +A = b +M = 34 + +ModInv = 7 +A = f +M = 34 + +ModInv = 31 +A = 11 +M = 34 + +ModInv = b +A = 13 +M = 34 + +ModInv = 5 +A = 15 +M = 34 + +ModInv = 2b +A = 17 +M = 34 + +ModInv = 19 +A = 19 +M = 34 + +ModInv = 1b +A = 1b +M = 34 + +ModInv = 9 +A = 1d +M = 34 + +ModInv = 2f +A = 1f +M = 34 + +ModInv = 29 +A = 21 +M = 34 + +ModInv = 3 +A = 23 +M = 34 + +ModInv = 2d +A = 25 +M = 34 + +ModInv = 21 +A = 29 +M = 34 + +ModInv = 17 +A = 2b +M = 34 + +ModInv = 25 +A = 2d +M = 34 + +ModInv = 1f +A = 2f +M = 34 + +ModInv = 11 +A = 31 +M = 34 + +ModInv = 33 +A = 33 +M = 34 + +ModInv = 1 +A = 35 +M = 34 + +ModInv = 23 +A = 37 +M = 34 + +ModInv = 15 +A = 39 +M = 34 + +ModInv = f +A = 3b +M = 34 + +ModInv = 1d +A = 3d +M = 34 + +ModInv = 13 +A = 3f +M = 34 + +ModInv = 7 +A = 43 +M = 34 + +ModInv = 31 +A = 45 +M = 34 + +ModInv = b +A = 47 +M = 34 + +ModInv = 5 +A = 49 +M = 34 + +ModInv = 2b +A = 4b +M = 34 + +ModInv = 19 +A = 4d +M = 34 + +ModInv = 1b +A = 4f +M = 34 + +ModInv = 9 +A = 51 +M = 34 + +ModInv = 2f +A = 53 +M = 34 + +ModInv = 29 +A = 55 +M = 34 + +ModInv = 3 +A = 57 +M = 34 + +ModInv = 2d +A = 59 +M = 34 + +ModInv = 21 +A = 5d +M = 34 + +ModInv = 17 +A = 5f +M = 34 + +ModInv = 25 +A = 61 +M = 34 + +ModInv = 1f +A = 63 +M = 34 + +ModInv = 9 +A = -64 +M = 35 + +ModInv = 26 +A = -63 +M = 35 + +ModInv = 14 +A = -62 +M = 35 + +ModInv = 6 +A = -61 +M = 35 + +ModInv = 10 +A = -60 +M = 35 + +ModInv = 1d +A = -5f +M = 35 + +ModInv = 1f +A = -5e +M = 35 + +ModInv = 31 +A = -5d +M = 35 + +ModInv = 13 +A = -5c +M = 35 + +ModInv = 2e +A = -5b +M = 35 + +ModInv = a +A = -5a +M = 35 + +ModInv = 19 +A = -59 +M = 35 + +ModInv = 3 +A = -58 +M = 35 + +ModInv = e +A = -57 +M = 35 + +ModInv = 8 +A = -56 +M = 35 + +ModInv = 30 +A = -55 +M = 35 + +ModInv = 29 +A = -54 +M = 35 + +ModInv = 1e +A = -53 +M = 35 + +ModInv = 2a +A = -52 +M = 35 + +ModInv = 11 +A = -51 +M = 35 + +ModInv = 33 +A = -50 +M = 35 + +ModInv = 2 +A = -4f +M = 35 + +ModInv = 24 +A = -4e +M = 35 + +ModInv = b +A = -4d +M = 35 + +ModInv = 17 +A = -4c +M = 35 + +ModInv = c +A = -4b +M = 35 + +ModInv = 5 +A = -4a +M = 35 + +ModInv = 2d +A = -49 +M = 35 + +ModInv = 27 +A = -48 +M = 35 + +ModInv = 32 +A = -47 +M = 35 + +ModInv = 1c +A = -46 +M = 35 + +ModInv = 2b +A = -45 +M = 35 + +ModInv = 7 +A = -44 +M = 35 + +ModInv = 22 +A = -43 +M = 35 + +ModInv = 4 +A = -42 +M = 35 + +ModInv = 16 +A = -41 +M = 35 + +ModInv = 18 +A = -40 +M = 35 + +ModInv = 25 +A = -3f +M = 35 + +ModInv = 2f +A = -3e +M = 35 + +ModInv = 21 +A = -3d +M = 35 + +ModInv = f +A = -3c +M = 35 + +ModInv = 2c +A = -3b +M = 35 + +ModInv = 15 +A = -3a +M = 35 + +ModInv = d +A = -39 +M = 35 + +ModInv = 23 +A = -38 +M = 35 + +ModInv = 1a +A = -37 +M = 35 + +ModInv = 34 +A = -36 +M = 35 + +ModInv = 1 +A = -34 +M = 35 + +ModInv = 1b +A = -33 +M = 35 + +ModInv = 12 +A = -32 +M = 35 + +ModInv = 28 +A = -31 +M = 35 + +ModInv = 20 +A = -30 +M = 35 + +ModInv = 9 +A = -2f +M = 35 + +ModInv = 26 +A = -2e +M = 35 + +ModInv = 14 +A = -2d +M = 35 + +ModInv = 6 +A = -2c +M = 35 + +ModInv = 10 +A = -2b +M = 35 + +ModInv = 1d +A = -2a +M = 35 + +ModInv = 1f +A = -29 +M = 35 + +ModInv = 31 +A = -28 +M = 35 + +ModInv = 13 +A = -27 +M = 35 + +ModInv = 2e +A = -26 +M = 35 + +ModInv = a +A = -25 +M = 35 + +ModInv = 19 +A = -24 +M = 35 + +ModInv = 3 +A = -23 +M = 35 + +ModInv = e +A = -22 +M = 35 + +ModInv = 8 +A = -21 +M = 35 + +ModInv = 30 +A = -20 +M = 35 + +ModInv = 29 +A = -1f +M = 35 + +ModInv = 1e +A = -1e +M = 35 + +ModInv = 2a +A = -1d +M = 35 + +ModInv = 11 +A = -1c +M = 35 + +ModInv = 33 +A = -1b +M = 35 + +ModInv = 2 +A = -1a +M = 35 + +ModInv = 24 +A = -19 +M = 35 + +ModInv = b +A = -18 +M = 35 + +ModInv = 17 +A = -17 +M = 35 + +ModInv = c +A = -16 +M = 35 + +ModInv = 5 +A = -15 +M = 35 + +ModInv = 2d +A = -14 +M = 35 + +ModInv = 27 +A = -13 +M = 35 + +ModInv = 32 +A = -12 +M = 35 + +ModInv = 1c +A = -11 +M = 35 + +ModInv = 2b +A = -10 +M = 35 + +ModInv = 7 +A = -f +M = 35 + +ModInv = 22 +A = -e +M = 35 + +ModInv = 4 +A = -d +M = 35 + +ModInv = 16 +A = -c +M = 35 + +ModInv = 18 +A = -b +M = 35 + +ModInv = 25 +A = -a +M = 35 + +ModInv = 2f +A = -9 +M = 35 + +ModInv = 21 +A = -8 +M = 35 + +ModInv = f +A = -7 +M = 35 + +ModInv = 2c +A = -6 +M = 35 + +ModInv = 15 +A = -5 +M = 35 + +ModInv = d +A = -4 +M = 35 + +ModInv = 23 +A = -3 +M = 35 + +ModInv = 1a +A = -2 +M = 35 + +ModInv = 34 +A = -1 +M = 35 + +ModInv = 1 +A = 1 +M = 35 + +ModInv = 1b +A = 2 +M = 35 + +ModInv = 12 +A = 3 +M = 35 + +ModInv = 28 +A = 4 +M = 35 + +ModInv = 20 +A = 5 +M = 35 + +ModInv = 9 +A = 6 +M = 35 + +ModInv = 26 +A = 7 +M = 35 + +ModInv = 14 +A = 8 +M = 35 + +ModInv = 6 +A = 9 +M = 35 + +ModInv = 10 +A = a +M = 35 + +ModInv = 1d +A = b +M = 35 + +ModInv = 1f +A = c +M = 35 + +ModInv = 31 +A = d +M = 35 + +ModInv = 13 +A = e +M = 35 + +ModInv = 2e +A = f +M = 35 + +ModInv = a +A = 10 +M = 35 + +ModInv = 19 +A = 11 +M = 35 + +ModInv = 3 +A = 12 +M = 35 + +ModInv = e +A = 13 +M = 35 + +ModInv = 8 +A = 14 +M = 35 + +ModInv = 30 +A = 15 +M = 35 + +ModInv = 29 +A = 16 +M = 35 + +ModInv = 1e +A = 17 +M = 35 + +ModInv = 2a +A = 18 +M = 35 + +ModInv = 11 +A = 19 +M = 35 + +ModInv = 33 +A = 1a +M = 35 + +ModInv = 2 +A = 1b +M = 35 + +ModInv = 24 +A = 1c +M = 35 + +ModInv = b +A = 1d +M = 35 + +ModInv = 17 +A = 1e +M = 35 + +ModInv = c +A = 1f +M = 35 + +ModInv = 5 +A = 20 +M = 35 + +ModInv = 2d +A = 21 +M = 35 + +ModInv = 27 +A = 22 +M = 35 + +ModInv = 32 +A = 23 +M = 35 + +ModInv = 1c +A = 24 +M = 35 + +ModInv = 2b +A = 25 +M = 35 + +ModInv = 7 +A = 26 +M = 35 + +ModInv = 22 +A = 27 +M = 35 + +ModInv = 4 +A = 28 +M = 35 + +ModInv = 16 +A = 29 +M = 35 + +ModInv = 18 +A = 2a +M = 35 + +ModInv = 25 +A = 2b +M = 35 + +ModInv = 2f +A = 2c +M = 35 + +ModInv = 21 +A = 2d +M = 35 + +ModInv = f +A = 2e +M = 35 + +ModInv = 2c +A = 2f +M = 35 + +ModInv = 15 +A = 30 +M = 35 + +ModInv = d +A = 31 +M = 35 + +ModInv = 23 +A = 32 +M = 35 + +ModInv = 1a +A = 33 +M = 35 + +ModInv = 34 +A = 34 +M = 35 + +ModInv = 1 +A = 36 +M = 35 + +ModInv = 1b +A = 37 +M = 35 + +ModInv = 12 +A = 38 +M = 35 + +ModInv = 28 +A = 39 +M = 35 + +ModInv = 20 +A = 3a +M = 35 + +ModInv = 9 +A = 3b +M = 35 + +ModInv = 26 +A = 3c +M = 35 + +ModInv = 14 +A = 3d +M = 35 + +ModInv = 6 +A = 3e +M = 35 + +ModInv = 10 +A = 3f +M = 35 + +ModInv = 1d +A = 40 +M = 35 + +ModInv = 1f +A = 41 +M = 35 + +ModInv = 31 +A = 42 +M = 35 + +ModInv = 13 +A = 43 +M = 35 + +ModInv = 2e +A = 44 +M = 35 + +ModInv = a +A = 45 +M = 35 + +ModInv = 19 +A = 46 +M = 35 + +ModInv = 3 +A = 47 +M = 35 + +ModInv = e +A = 48 +M = 35 + +ModInv = 8 +A = 49 +M = 35 + +ModInv = 30 +A = 4a +M = 35 + +ModInv = 29 +A = 4b +M = 35 + +ModInv = 1e +A = 4c +M = 35 + +ModInv = 2a +A = 4d +M = 35 + +ModInv = 11 +A = 4e +M = 35 + +ModInv = 33 +A = 4f +M = 35 + +ModInv = 2 +A = 50 +M = 35 + +ModInv = 24 +A = 51 +M = 35 + +ModInv = b +A = 52 +M = 35 + +ModInv = 17 +A = 53 +M = 35 + +ModInv = c +A = 54 +M = 35 + +ModInv = 5 +A = 55 +M = 35 + +ModInv = 2d +A = 56 +M = 35 + +ModInv = 27 +A = 57 +M = 35 + +ModInv = 32 +A = 58 +M = 35 + +ModInv = 1c +A = 59 +M = 35 + +ModInv = 2b +A = 5a +M = 35 + +ModInv = 7 +A = 5b +M = 35 + +ModInv = 22 +A = 5c +M = 35 + +ModInv = 4 +A = 5d +M = 35 + +ModInv = 16 +A = 5e +M = 35 + +ModInv = 18 +A = 5f +M = 35 + +ModInv = 25 +A = 60 +M = 35 + +ModInv = 2f +A = 61 +M = 35 + +ModInv = 21 +A = 62 +M = 35 + +ModInv = f +A = 63 +M = 35 + +ModInv = 5 +A = -61 +M = 36 + +ModInv = 19 +A = -5f +M = 36 + +ModInv = 23 +A = -5b +M = 36 + +ModInv = 25 +A = -59 +M = 36 + +ModInv = 2f +A = -55 +M = 36 + +ModInv = d +A = -53 +M = 36 + +ModInv = 29 +A = -4f +M = 36 + +ModInv = 7 +A = -4d +M = 36 + +ModInv = 11 +A = -49 +M = 36 + +ModInv = 13 +A = -47 +M = 36 + +ModInv = 1d +A = -43 +M = 36 + +ModInv = 31 +A = -41 +M = 36 + +ModInv = 17 +A = -3d +M = 36 + +ModInv = 2b +A = -3b +M = 36 + +ModInv = 35 +A = -37 +M = 36 + +ModInv = 1 +A = -35 +M = 36 + +ModInv = b +A = -31 +M = 36 + +ModInv = 1f +A = -2f +M = 36 + +ModInv = 5 +A = -2b +M = 36 + +ModInv = 19 +A = -29 +M = 36 + +ModInv = 23 +A = -25 +M = 36 + +ModInv = 25 +A = -23 +M = 36 + +ModInv = 2f +A = -1f +M = 36 + +ModInv = d +A = -1d +M = 36 + +ModInv = 29 +A = -19 +M = 36 + +ModInv = 7 +A = -17 +M = 36 + +ModInv = 11 +A = -13 +M = 36 + +ModInv = 13 +A = -11 +M = 36 + +ModInv = 1d +A = -d +M = 36 + +ModInv = 31 +A = -b +M = 36 + +ModInv = 17 +A = -7 +M = 36 + +ModInv = 2b +A = -5 +M = 36 + +ModInv = 35 +A = -1 +M = 36 + +ModInv = 1 +A = 1 +M = 36 + +ModInv = b +A = 5 +M = 36 + +ModInv = 1f +A = 7 +M = 36 + +ModInv = 5 +A = b +M = 36 + +ModInv = 19 +A = d +M = 36 + +ModInv = 23 +A = 11 +M = 36 + +ModInv = 25 +A = 13 +M = 36 + +ModInv = 2f +A = 17 +M = 36 + +ModInv = d +A = 19 +M = 36 + +ModInv = 29 +A = 1d +M = 36 + +ModInv = 7 +A = 1f +M = 36 + +ModInv = 11 +A = 23 +M = 36 + +ModInv = 13 +A = 25 +M = 36 + +ModInv = 1d +A = 29 +M = 36 + +ModInv = 31 +A = 2b +M = 36 + +ModInv = 17 +A = 2f +M = 36 + +ModInv = 2b +A = 31 +M = 36 + +ModInv = 35 +A = 35 +M = 36 + +ModInv = 1 +A = 37 +M = 36 + +ModInv = b +A = 3b +M = 36 + +ModInv = 1f +A = 3d +M = 36 + +ModInv = 5 +A = 41 +M = 36 + +ModInv = 19 +A = 43 +M = 36 + +ModInv = 23 +A = 47 +M = 36 + +ModInv = 25 +A = 49 +M = 36 + +ModInv = 2f +A = 4d +M = 36 + +ModInv = d +A = 4f +M = 36 + +ModInv = 29 +A = 53 +M = 36 + +ModInv = 7 +A = 55 +M = 36 + +ModInv = 11 +A = 59 +M = 36 + +ModInv = 13 +A = 5b +M = 36 + +ModInv = 1d +A = 5f +M = 36 + +ModInv = 31 +A = 61 +M = 36 + +ModInv = 17 +A = -62 +M = 37 + +ModInv = 11 +A = -61 +M = 37 + +ModInv = 4 +A = -60 +M = 37 + +ModInv = 1f +A = -5e +M = 37 + +ModInv = d +A = -5d +M = 37 + +ModInv = 34 +A = -5c +M = 37 + +ModInv = 1d +A = -5b +M = 37 + +ModInv = 15 +A = -59 +M = 37 + +ModInv = c +A = -57 +M = 37 + +ModInv = 27 +A = -56 +M = 37 + +ModInv = 24 +A = -54 +M = 37 + +ModInv = 35 +A = -53 +M = 37 + +ModInv = 2 +A = -52 +M = 37 + +ModInv = 13 +A = -51 +M = 37 + +ModInv = 10 +A = -4f +M = 37 + +ModInv = 2b +A = -4e +M = 37 + +ModInv = 22 +A = -4c +M = 37 + +ModInv = 1a +A = -4a +M = 37 + +ModInv = 3 +A = -49 +M = 37 + +ModInv = 2a +A = -48 +M = 37 + +ModInv = 18 +A = -47 +M = 37 + +ModInv = 33 +A = -45 +M = 37 + +ModInv = 26 +A = -44 +M = 37 + +ModInv = 20 +A = -43 +M = 37 + +ModInv = 6 +A = -40 +M = 37 + +ModInv = 30 +A = -3f +M = 37 + +ModInv = 2f +A = -3e +M = 37 + +ModInv = 9 +A = -3d +M = 37 + +ModInv = 29 +A = -3b +M = 37 + +ModInv = 12 +A = -3a +M = 37 + +ModInv = 1b +A = -39 +M = 37 + +ModInv = 36 +A = -38 +M = 37 + +ModInv = 1 +A = -36 +M = 37 + +ModInv = 1c +A = -35 +M = 37 + +ModInv = 25 +A = -34 +M = 37 + +ModInv = e +A = -33 +M = 37 + +ModInv = 2e +A = -31 +M = 37 + +ModInv = 8 +A = -30 +M = 37 + +ModInv = 7 +A = -2f +M = 37 + +ModInv = 31 +A = -2e +M = 37 + +ModInv = 17 +A = -2b +M = 37 + +ModInv = 11 +A = -2a +M = 37 + +ModInv = 4 +A = -29 +M = 37 + +ModInv = 1f +A = -27 +M = 37 + +ModInv = d +A = -26 +M = 37 + +ModInv = 34 +A = -25 +M = 37 + +ModInv = 1d +A = -24 +M = 37 + +ModInv = 15 +A = -22 +M = 37 + +ModInv = c +A = -20 +M = 37 + +ModInv = 27 +A = -1f +M = 37 + +ModInv = 24 +A = -1d +M = 37 + +ModInv = 35 +A = -1c +M = 37 + +ModInv = 2 +A = -1b +M = 37 + +ModInv = 13 +A = -1a +M = 37 + +ModInv = 10 +A = -18 +M = 37 + +ModInv = 2b +A = -17 +M = 37 + +ModInv = 22 +A = -15 +M = 37 + +ModInv = 1a +A = -13 +M = 37 + +ModInv = 3 +A = -12 +M = 37 + +ModInv = 2a +A = -11 +M = 37 + +ModInv = 18 +A = -10 +M = 37 + +ModInv = 33 +A = -e +M = 37 + +ModInv = 26 +A = -d +M = 37 + +ModInv = 20 +A = -c +M = 37 + +ModInv = 6 +A = -9 +M = 37 + +ModInv = 30 +A = -8 +M = 37 + +ModInv = 2f +A = -7 +M = 37 + +ModInv = 9 +A = -6 +M = 37 + +ModInv = 29 +A = -4 +M = 37 + +ModInv = 12 +A = -3 +M = 37 + +ModInv = 1b +A = -2 +M = 37 + +ModInv = 36 +A = -1 +M = 37 + +ModInv = 1 +A = 1 +M = 37 + +ModInv = 1c +A = 2 +M = 37 + +ModInv = 25 +A = 3 +M = 37 + +ModInv = e +A = 4 +M = 37 + +ModInv = 2e +A = 6 +M = 37 + +ModInv = 8 +A = 7 +M = 37 + +ModInv = 7 +A = 8 +M = 37 + +ModInv = 31 +A = 9 +M = 37 + +ModInv = 17 +A = c +M = 37 + +ModInv = 11 +A = d +M = 37 + +ModInv = 4 +A = e +M = 37 + +ModInv = 1f +A = 10 +M = 37 + +ModInv = d +A = 11 +M = 37 + +ModInv = 34 +A = 12 +M = 37 + +ModInv = 1d +A = 13 +M = 37 + +ModInv = 15 +A = 15 +M = 37 + +ModInv = c +A = 17 +M = 37 + +ModInv = 27 +A = 18 +M = 37 + +ModInv = 24 +A = 1a +M = 37 + +ModInv = 35 +A = 1b +M = 37 + +ModInv = 2 +A = 1c +M = 37 + +ModInv = 13 +A = 1d +M = 37 + +ModInv = 10 +A = 1f +M = 37 + +ModInv = 2b +A = 20 +M = 37 + +ModInv = 22 +A = 22 +M = 37 + +ModInv = 1a +A = 24 +M = 37 + +ModInv = 3 +A = 25 +M = 37 + +ModInv = 2a +A = 26 +M = 37 + +ModInv = 18 +A = 27 +M = 37 + +ModInv = 33 +A = 29 +M = 37 + +ModInv = 26 +A = 2a +M = 37 + +ModInv = 20 +A = 2b +M = 37 + +ModInv = 6 +A = 2e +M = 37 + +ModInv = 30 +A = 2f +M = 37 + +ModInv = 2f +A = 30 +M = 37 + +ModInv = 9 +A = 31 +M = 37 + +ModInv = 29 +A = 33 +M = 37 + +ModInv = 12 +A = 34 +M = 37 + +ModInv = 1b +A = 35 +M = 37 + +ModInv = 36 +A = 36 +M = 37 + +ModInv = 1 +A = 38 +M = 37 + +ModInv = 1c +A = 39 +M = 37 + +ModInv = 25 +A = 3a +M = 37 + +ModInv = e +A = 3b +M = 37 + +ModInv = 2e +A = 3d +M = 37 + +ModInv = 8 +A = 3e +M = 37 + +ModInv = 7 +A = 3f +M = 37 + +ModInv = 31 +A = 40 +M = 37 + +ModInv = 17 +A = 43 +M = 37 + +ModInv = 11 +A = 44 +M = 37 + +ModInv = 4 +A = 45 +M = 37 + +ModInv = 1f +A = 47 +M = 37 + +ModInv = d +A = 48 +M = 37 + +ModInv = 34 +A = 49 +M = 37 + +ModInv = 1d +A = 4a +M = 37 + +ModInv = 15 +A = 4c +M = 37 + +ModInv = c +A = 4e +M = 37 + +ModInv = 27 +A = 4f +M = 37 + +ModInv = 24 +A = 51 +M = 37 + +ModInv = 35 +A = 52 +M = 37 + +ModInv = 2 +A = 53 +M = 37 + +ModInv = 13 +A = 54 +M = 37 + +ModInv = 10 +A = 56 +M = 37 + +ModInv = 2b +A = 57 +M = 37 + +ModInv = 22 +A = 59 +M = 37 + +ModInv = 1a +A = 5b +M = 37 + +ModInv = 3 +A = 5c +M = 37 + +ModInv = 2a +A = 5d +M = 37 + +ModInv = 18 +A = 5e +M = 37 + +ModInv = 33 +A = 60 +M = 37 + +ModInv = 26 +A = 61 +M = 37 + +ModInv = 20 +A = 62 +M = 37 + +ModInv = d +A = -63 +M = 38 + +ModInv = f +A = -61 +M = 38 + +ModInv = 21 +A = -5f +M = 38 + +ModInv = 3 +A = -5d +M = 38 + +ModInv = 27 +A = -59 +M = 38 + +ModInv = 9 +A = -57 +M = 38 + +ModInv = 1b +A = -55 +M = 38 + +ModInv = 1d +A = -53 +M = 38 + +ModInv = 2f +A = -51 +M = 38 + +ModInv = 11 +A = -4f +M = 38 + +ModInv = 35 +A = -4b +M = 38 + +ModInv = 17 +A = -49 +M = 38 + +ModInv = 29 +A = -47 +M = 38 + +ModInv = 2b +A = -45 +M = 38 + +ModInv = 5 +A = -43 +M = 38 + +ModInv = 1f +A = -41 +M = 38 + +ModInv = b +A = -3d +M = 38 + +ModInv = 25 +A = -3b +M = 38 + +ModInv = 37 +A = -39 +M = 38 + +ModInv = 1 +A = -37 +M = 38 + +ModInv = 13 +A = -35 +M = 38 + +ModInv = 2d +A = -33 +M = 38 + +ModInv = 19 +A = -2f +M = 38 + +ModInv = 33 +A = -2d +M = 38 + +ModInv = d +A = -2b +M = 38 + +ModInv = f +A = -29 +M = 38 + +ModInv = 21 +A = -27 +M = 38 + +ModInv = 3 +A = -25 +M = 38 + +ModInv = 27 +A = -21 +M = 38 + +ModInv = 9 +A = -1f +M = 38 + +ModInv = 1b +A = -1d +M = 38 + +ModInv = 1d +A = -1b +M = 38 + +ModInv = 2f +A = -19 +M = 38 + +ModInv = 11 +A = -17 +M = 38 + +ModInv = 35 +A = -13 +M = 38 + +ModInv = 17 +A = -11 +M = 38 + +ModInv = 29 +A = -f +M = 38 + +ModInv = 2b +A = -d +M = 38 + +ModInv = 5 +A = -b +M = 38 + +ModInv = 1f +A = -9 +M = 38 + +ModInv = b +A = -5 +M = 38 + +ModInv = 25 +A = -3 +M = 38 + +ModInv = 37 +A = -1 +M = 38 + +ModInv = 1 +A = 1 +M = 38 + +ModInv = 13 +A = 3 +M = 38 + +ModInv = 2d +A = 5 +M = 38 + +ModInv = 19 +A = 9 +M = 38 + +ModInv = 33 +A = b +M = 38 + +ModInv = d +A = d +M = 38 + +ModInv = f +A = f +M = 38 + +ModInv = 21 +A = 11 +M = 38 + +ModInv = 3 +A = 13 +M = 38 + +ModInv = 27 +A = 17 +M = 38 + +ModInv = 9 +A = 19 +M = 38 + +ModInv = 1b +A = 1b +M = 38 + +ModInv = 1d +A = 1d +M = 38 + +ModInv = 2f +A = 1f +M = 38 + +ModInv = 11 +A = 21 +M = 38 + +ModInv = 35 +A = 25 +M = 38 + +ModInv = 17 +A = 27 +M = 38 + +ModInv = 29 +A = 29 +M = 38 + +ModInv = 2b +A = 2b +M = 38 + +ModInv = 5 +A = 2d +M = 38 + +ModInv = 1f +A = 2f +M = 38 + +ModInv = b +A = 33 +M = 38 + +ModInv = 25 +A = 35 +M = 38 + +ModInv = 37 +A = 37 +M = 38 + +ModInv = 1 +A = 39 +M = 38 + +ModInv = 13 +A = 3b +M = 38 + +ModInv = 2d +A = 3d +M = 38 + +ModInv = 19 +A = 41 +M = 38 + +ModInv = 33 +A = 43 +M = 38 + +ModInv = d +A = 45 +M = 38 + +ModInv = f +A = 47 +M = 38 + +ModInv = 21 +A = 49 +M = 38 + +ModInv = 3 +A = 4b +M = 38 + +ModInv = 27 +A = 4f +M = 38 + +ModInv = 9 +A = 51 +M = 38 + +ModInv = 1b +A = 53 +M = 38 + +ModInv = 1d +A = 55 +M = 38 + +ModInv = 2f +A = 57 +M = 38 + +ModInv = 11 +A = 59 +M = 38 + +ModInv = 35 +A = 5d +M = 38 + +ModInv = 17 +A = 5f +M = 38 + +ModInv = 29 +A = 61 +M = 38 + +ModInv = 2b +A = 63 +M = 38 + +ModInv = 35 +A = -64 +M = 39 + +ModInv = 19 +A = -62 +M = 39 + +ModInv = 2f +A = -61 +M = 39 + +ModInv = 14 +A = -5e +M = 39 + +ModInv = d +A = -5c +M = 39 + +ModInv = 5 +A = -5b +M = 39 + +ModInv = 10 +A = -59 +M = 39 + +ModInv = b +A = -58 +M = 39 + +ModInv = 37 +A = -56 +M = 39 + +ModInv = 2 +A = -55 +M = 39 + +ModInv = 2e +A = -53 +M = 39 + +ModInv = 29 +A = -52 +M = 39 + +ModInv = 34 +A = -50 +M = 39 + +ModInv = 2c +A = -4f +M = 39 + +ModInv = 25 +A = -4d +M = 39 + +ModInv = a +A = -4a +M = 39 + +ModInv = 20 +A = -49 +M = 39 + +ModInv = 4 +A = -47 +M = 39 + +ModInv = 23 +A = -46 +M = 39 + +ModInv = 1f +A = -44 +M = 39 + +ModInv = 11 +A = -43 +M = 39 + +ModInv = 7 +A = -41 +M = 39 + +ModInv = 8 +A = -40 +M = 39 + +ModInv = 22 +A = -3e +M = 39 + +ModInv = e +A = -3d +M = 39 + +ModInv = 1c +A = -3b +M = 39 + +ModInv = 38 +A = -3a +M = 39 + +ModInv = 1 +A = -38 +M = 39 + +ModInv = 1d +A = -37 +M = 39 + +ModInv = 2b +A = -35 +M = 39 + +ModInv = 17 +A = -34 +M = 39 + +ModInv = 31 +A = -32 +M = 39 + +ModInv = 32 +A = -31 +M = 39 + +ModInv = 28 +A = -2f +M = 39 + +ModInv = 1a +A = -2e +M = 39 + +ModInv = 16 +A = -2c +M = 39 + +ModInv = 35 +A = -2b +M = 39 + +ModInv = 19 +A = -29 +M = 39 + +ModInv = 2f +A = -28 +M = 39 + +ModInv = 14 +A = -25 +M = 39 + +ModInv = d +A = -23 +M = 39 + +ModInv = 5 +A = -22 +M = 39 + +ModInv = 10 +A = -20 +M = 39 + +ModInv = b +A = -1f +M = 39 + +ModInv = 37 +A = -1d +M = 39 + +ModInv = 2 +A = -1c +M = 39 + +ModInv = 2e +A = -1a +M = 39 + +ModInv = 29 +A = -19 +M = 39 + +ModInv = 34 +A = -17 +M = 39 + +ModInv = 2c +A = -16 +M = 39 + +ModInv = 25 +A = -14 +M = 39 + +ModInv = a +A = -11 +M = 39 + +ModInv = 20 +A = -10 +M = 39 + +ModInv = 4 +A = -e +M = 39 + +ModInv = 23 +A = -d +M = 39 + +ModInv = 1f +A = -b +M = 39 + +ModInv = 11 +A = -a +M = 39 + +ModInv = 7 +A = -8 +M = 39 + +ModInv = 8 +A = -7 +M = 39 + +ModInv = 22 +A = -5 +M = 39 + +ModInv = e +A = -4 +M = 39 + +ModInv = 1c +A = -2 +M = 39 + +ModInv = 38 +A = -1 +M = 39 + +ModInv = 1 +A = 1 +M = 39 + +ModInv = 1d +A = 2 +M = 39 + +ModInv = 2b +A = 4 +M = 39 + +ModInv = 17 +A = 5 +M = 39 + +ModInv = 31 +A = 7 +M = 39 + +ModInv = 32 +A = 8 +M = 39 + +ModInv = 28 +A = a +M = 39 + +ModInv = 1a +A = b +M = 39 + +ModInv = 16 +A = d +M = 39 + +ModInv = 35 +A = e +M = 39 + +ModInv = 19 +A = 10 +M = 39 + +ModInv = 2f +A = 11 +M = 39 + +ModInv = 14 +A = 14 +M = 39 + +ModInv = d +A = 16 +M = 39 + +ModInv = 5 +A = 17 +M = 39 + +ModInv = 10 +A = 19 +M = 39 + +ModInv = b +A = 1a +M = 39 + +ModInv = 37 +A = 1c +M = 39 + +ModInv = 2 +A = 1d +M = 39 + +ModInv = 2e +A = 1f +M = 39 + +ModInv = 29 +A = 20 +M = 39 + +ModInv = 34 +A = 22 +M = 39 + +ModInv = 2c +A = 23 +M = 39 + +ModInv = 25 +A = 25 +M = 39 + +ModInv = a +A = 28 +M = 39 + +ModInv = 20 +A = 29 +M = 39 + +ModInv = 4 +A = 2b +M = 39 + +ModInv = 23 +A = 2c +M = 39 + +ModInv = 1f +A = 2e +M = 39 + +ModInv = 11 +A = 2f +M = 39 + +ModInv = 7 +A = 31 +M = 39 + +ModInv = 8 +A = 32 +M = 39 + +ModInv = 22 +A = 34 +M = 39 + +ModInv = e +A = 35 +M = 39 + +ModInv = 1c +A = 37 +M = 39 + +ModInv = 38 +A = 38 +M = 39 + +ModInv = 1 +A = 3a +M = 39 + +ModInv = 1d +A = 3b +M = 39 + +ModInv = 2b +A = 3d +M = 39 + +ModInv = 17 +A = 3e +M = 39 + +ModInv = 31 +A = 40 +M = 39 + +ModInv = 32 +A = 41 +M = 39 + +ModInv = 28 +A = 43 +M = 39 + +ModInv = 1a +A = 44 +M = 39 + +ModInv = 16 +A = 46 +M = 39 + +ModInv = 35 +A = 47 +M = 39 + +ModInv = 19 +A = 49 +M = 39 + +ModInv = 2f +A = 4a +M = 39 + +ModInv = 14 +A = 4d +M = 39 + +ModInv = d +A = 4f +M = 39 + +ModInv = 5 +A = 50 +M = 39 + +ModInv = 10 +A = 52 +M = 39 + +ModInv = b +A = 53 +M = 39 + +ModInv = 37 +A = 55 +M = 39 + +ModInv = 2 +A = 56 +M = 39 + +ModInv = 2e +A = 58 +M = 39 + +ModInv = 29 +A = 59 +M = 39 + +ModInv = 34 +A = 5b +M = 39 + +ModInv = 2c +A = 5c +M = 39 + +ModInv = 25 +A = 5e +M = 39 + +ModInv = a +A = 61 +M = 39 + +ModInv = 20 +A = 62 +M = 39 + +ModInv = 29 +A = -63 +M = 3a + +ModInv = 37 +A = -61 +M = 3a + +ModInv = 2f +A = -5f +M = 3a + +ModInv = 35 +A = -5d +M = 3a + +ModInv = 7 +A = -5b +M = 3a + +ModInv = 2b +A = -59 +M = 3a + +ModInv = f +A = -55 +M = 3a + +ModInv = 33 +A = -53 +M = 3a + +ModInv = 5 +A = -51 +M = 3a + +ModInv = b +A = -4f +M = 3a + +ModInv = 3 +A = -4d +M = 3a + +ModInv = 11 +A = -4b +M = 3a + +ModInv = 1b +A = -49 +M = 3a + +ModInv = 31 +A = -47 +M = 3a + +ModInv = 15 +A = -45 +M = 3a + +ModInv = 2d +A = -43 +M = 3a + +ModInv = 21 +A = -41 +M = 3a + +ModInv = 17 +A = -3f +M = 3a + +ModInv = 13 +A = -3d +M = 3a + +ModInv = 39 +A = -3b +M = 3a + +ModInv = 1 +A = -39 +M = 3a + +ModInv = 27 +A = -37 +M = 3a + +ModInv = 23 +A = -35 +M = 3a + +ModInv = 19 +A = -33 +M = 3a + +ModInv = d +A = -31 +M = 3a + +ModInv = 25 +A = -2f +M = 3a + +ModInv = 9 +A = -2d +M = 3a + +ModInv = 1f +A = -2b +M = 3a + +ModInv = 29 +A = -29 +M = 3a + +ModInv = 37 +A = -27 +M = 3a + +ModInv = 2f +A = -25 +M = 3a + +ModInv = 35 +A = -23 +M = 3a + +ModInv = 7 +A = -21 +M = 3a + +ModInv = 2b +A = -1f +M = 3a + +ModInv = f +A = -1b +M = 3a + +ModInv = 33 +A = -19 +M = 3a + +ModInv = 5 +A = -17 +M = 3a + +ModInv = b +A = -15 +M = 3a + +ModInv = 3 +A = -13 +M = 3a + +ModInv = 11 +A = -11 +M = 3a + +ModInv = 1b +A = -f +M = 3a + +ModInv = 31 +A = -d +M = 3a + +ModInv = 15 +A = -b +M = 3a + +ModInv = 2d +A = -9 +M = 3a + +ModInv = 21 +A = -7 +M = 3a + +ModInv = 17 +A = -5 +M = 3a + +ModInv = 13 +A = -3 +M = 3a + +ModInv = 39 +A = -1 +M = 3a + +ModInv = 1 +A = 1 +M = 3a + +ModInv = 27 +A = 3 +M = 3a + +ModInv = 23 +A = 5 +M = 3a + +ModInv = 19 +A = 7 +M = 3a + +ModInv = d +A = 9 +M = 3a + +ModInv = 25 +A = b +M = 3a + +ModInv = 9 +A = d +M = 3a + +ModInv = 1f +A = f +M = 3a + +ModInv = 29 +A = 11 +M = 3a + +ModInv = 37 +A = 13 +M = 3a + +ModInv = 2f +A = 15 +M = 3a + +ModInv = 35 +A = 17 +M = 3a + +ModInv = 7 +A = 19 +M = 3a + +ModInv = 2b +A = 1b +M = 3a + +ModInv = f +A = 1f +M = 3a + +ModInv = 33 +A = 21 +M = 3a + +ModInv = 5 +A = 23 +M = 3a + +ModInv = b +A = 25 +M = 3a + +ModInv = 3 +A = 27 +M = 3a + +ModInv = 11 +A = 29 +M = 3a + +ModInv = 1b +A = 2b +M = 3a + +ModInv = 31 +A = 2d +M = 3a + +ModInv = 15 +A = 2f +M = 3a + +ModInv = 2d +A = 31 +M = 3a + +ModInv = 21 +A = 33 +M = 3a + +ModInv = 17 +A = 35 +M = 3a + +ModInv = 13 +A = 37 +M = 3a + +ModInv = 39 +A = 39 +M = 3a + +ModInv = 1 +A = 3b +M = 3a + +ModInv = 27 +A = 3d +M = 3a + +ModInv = 23 +A = 3f +M = 3a + +ModInv = 19 +A = 41 +M = 3a + +ModInv = d +A = 43 +M = 3a + +ModInv = 25 +A = 45 +M = 3a + +ModInv = 9 +A = 47 +M = 3a + +ModInv = 1f +A = 49 +M = 3a + +ModInv = 29 +A = 4b +M = 3a + +ModInv = 37 +A = 4d +M = 3a + +ModInv = 2f +A = 4f +M = 3a + +ModInv = 35 +A = 51 +M = 3a + +ModInv = 7 +A = 53 +M = 3a + +ModInv = 2b +A = 55 +M = 3a + +ModInv = f +A = 59 +M = 3a + +ModInv = 33 +A = 5b +M = 3a + +ModInv = 5 +A = 5d +M = 3a + +ModInv = b +A = 5f +M = 3a + +ModInv = 3 +A = 61 +M = 3a + +ModInv = 11 +A = 63 +M = 3a + +ModInv = 17 +A = -64 +M = 3b + +ModInv = 1c +A = -63 +M = 3b + +ModInv = 3 +A = -62 +M = 3b + +ModInv = 2d +A = -61 +M = 3b + +ModInv = 33 +A = -60 +M = 3b + +ModInv = 12 +A = -5f +M = 3b + +ModInv = 20 +A = -5e +M = 3b + +ModInv = 1a +A = -5d +M = 3b + +ModInv = 19 +A = -5c +M = 3b + +ModInv = 23 +A = -5b +M = 3b + +ModInv = 13 +A = -5a +M = 3b + +ModInv = 39 +A = -59 +M = 3b + +ModInv = 2 +A = -58 +M = 3b + +ModInv = 28 +A = -57 +M = 3b + +ModInv = 18 +A = -56 +M = 3b + +ModInv = 22 +A = -55 +M = 3b + +ModInv = 21 +A = -54 +M = 3b + +ModInv = 1b +A = -53 +M = 3b + +ModInv = 29 +A = -52 +M = 3b + +ModInv = 8 +A = -51 +M = 3b + +ModInv = e +A = -50 +M = 3b + +ModInv = 38 +A = -4f +M = 3b + +ModInv = 1f +A = -4e +M = 3b + +ModInv = 24 +A = -4d +M = 3b + +ModInv = 34 +A = -4c +M = 3b + +ModInv = b +A = -4b +M = 3b + +ModInv = 37 +A = -4a +M = 3b + +ModInv = 15 +A = -49 +M = 3b + +ModInv = 9 +A = -48 +M = 3b + +ModInv = 36 +A = -47 +M = 3b + +ModInv = 10 +A = -46 +M = 3b + +ModInv = 35 +A = -45 +M = 3b + +ModInv = d +A = -44 +M = 3b + +ModInv = 16 +A = -43 +M = 3b + +ModInv = 2a +A = -42 +M = 3b + +ModInv = 31 +A = -41 +M = 3b + +ModInv = 2f +A = -40 +M = 3b + +ModInv = 2c +A = -3f +M = 3b + +ModInv = 27 +A = -3e +M = 3b + +ModInv = 1d +A = -3d +M = 3b + +ModInv = 3a +A = -3c +M = 3b + +ModInv = 1 +A = -3a +M = 3b + +ModInv = 1e +A = -39 +M = 3b + +ModInv = 14 +A = -38 +M = 3b + +ModInv = f +A = -37 +M = 3b + +ModInv = c +A = -36 +M = 3b + +ModInv = a +A = -35 +M = 3b + +ModInv = 11 +A = -34 +M = 3b + +ModInv = 25 +A = -33 +M = 3b + +ModInv = 2e +A = -32 +M = 3b + +ModInv = 6 +A = -31 +M = 3b + +ModInv = 2b +A = -30 +M = 3b + +ModInv = 5 +A = -2f +M = 3b + +ModInv = 32 +A = -2e +M = 3b + +ModInv = 26 +A = -2d +M = 3b + +ModInv = 4 +A = -2c +M = 3b + +ModInv = 30 +A = -2b +M = 3b + +ModInv = 7 +A = -2a +M = 3b + +ModInv = 17 +A = -29 +M = 3b + +ModInv = 1c +A = -28 +M = 3b + +ModInv = 3 +A = -27 +M = 3b + +ModInv = 2d +A = -26 +M = 3b + +ModInv = 33 +A = -25 +M = 3b + +ModInv = 12 +A = -24 +M = 3b + +ModInv = 20 +A = -23 +M = 3b + +ModInv = 1a +A = -22 +M = 3b + +ModInv = 19 +A = -21 +M = 3b + +ModInv = 23 +A = -20 +M = 3b + +ModInv = 13 +A = -1f +M = 3b + +ModInv = 39 +A = -1e +M = 3b + +ModInv = 2 +A = -1d +M = 3b + +ModInv = 28 +A = -1c +M = 3b + +ModInv = 18 +A = -1b +M = 3b + +ModInv = 22 +A = -1a +M = 3b + +ModInv = 21 +A = -19 +M = 3b + +ModInv = 1b +A = -18 +M = 3b + +ModInv = 29 +A = -17 +M = 3b + +ModInv = 8 +A = -16 +M = 3b + +ModInv = e +A = -15 +M = 3b + +ModInv = 38 +A = -14 +M = 3b + +ModInv = 1f +A = -13 +M = 3b + +ModInv = 24 +A = -12 +M = 3b + +ModInv = 34 +A = -11 +M = 3b + +ModInv = b +A = -10 +M = 3b + +ModInv = 37 +A = -f +M = 3b + +ModInv = 15 +A = -e +M = 3b + +ModInv = 9 +A = -d +M = 3b + +ModInv = 36 +A = -c +M = 3b + +ModInv = 10 +A = -b +M = 3b + +ModInv = 35 +A = -a +M = 3b + +ModInv = d +A = -9 +M = 3b + +ModInv = 16 +A = -8 +M = 3b + +ModInv = 2a +A = -7 +M = 3b + +ModInv = 31 +A = -6 +M = 3b + +ModInv = 2f +A = -5 +M = 3b + +ModInv = 2c +A = -4 +M = 3b + +ModInv = 27 +A = -3 +M = 3b + +ModInv = 1d +A = -2 +M = 3b + +ModInv = 3a +A = -1 +M = 3b + +ModInv = 1 +A = 1 +M = 3b + +ModInv = 1e +A = 2 +M = 3b + +ModInv = 14 +A = 3 +M = 3b + +ModInv = f +A = 4 +M = 3b + +ModInv = c +A = 5 +M = 3b + +ModInv = a +A = 6 +M = 3b + +ModInv = 11 +A = 7 +M = 3b + +ModInv = 25 +A = 8 +M = 3b + +ModInv = 2e +A = 9 +M = 3b + +ModInv = 6 +A = a +M = 3b + +ModInv = 2b +A = b +M = 3b + +ModInv = 5 +A = c +M = 3b + +ModInv = 32 +A = d +M = 3b + +ModInv = 26 +A = e +M = 3b + +ModInv = 4 +A = f +M = 3b + +ModInv = 30 +A = 10 +M = 3b + +ModInv = 7 +A = 11 +M = 3b + +ModInv = 17 +A = 12 +M = 3b + +ModInv = 1c +A = 13 +M = 3b + +ModInv = 3 +A = 14 +M = 3b + +ModInv = 2d +A = 15 +M = 3b + +ModInv = 33 +A = 16 +M = 3b + +ModInv = 12 +A = 17 +M = 3b + +ModInv = 20 +A = 18 +M = 3b + +ModInv = 1a +A = 19 +M = 3b + +ModInv = 19 +A = 1a +M = 3b + +ModInv = 23 +A = 1b +M = 3b + +ModInv = 13 +A = 1c +M = 3b + +ModInv = 39 +A = 1d +M = 3b + +ModInv = 2 +A = 1e +M = 3b + +ModInv = 28 +A = 1f +M = 3b + +ModInv = 18 +A = 20 +M = 3b + +ModInv = 22 +A = 21 +M = 3b + +ModInv = 21 +A = 22 +M = 3b + +ModInv = 1b +A = 23 +M = 3b + +ModInv = 29 +A = 24 +M = 3b + +ModInv = 8 +A = 25 +M = 3b + +ModInv = e +A = 26 +M = 3b + +ModInv = 38 +A = 27 +M = 3b + +ModInv = 1f +A = 28 +M = 3b + +ModInv = 24 +A = 29 +M = 3b + +ModInv = 34 +A = 2a +M = 3b + +ModInv = b +A = 2b +M = 3b + +ModInv = 37 +A = 2c +M = 3b + +ModInv = 15 +A = 2d +M = 3b + +ModInv = 9 +A = 2e +M = 3b + +ModInv = 36 +A = 2f +M = 3b + +ModInv = 10 +A = 30 +M = 3b + +ModInv = 35 +A = 31 +M = 3b + +ModInv = d +A = 32 +M = 3b + +ModInv = 16 +A = 33 +M = 3b + +ModInv = 2a +A = 34 +M = 3b + +ModInv = 31 +A = 35 +M = 3b + +ModInv = 2f +A = 36 +M = 3b + +ModInv = 2c +A = 37 +M = 3b + +ModInv = 27 +A = 38 +M = 3b + +ModInv = 1d +A = 39 +M = 3b + +ModInv = 3a +A = 3a +M = 3b + +ModInv = 1 +A = 3c +M = 3b + +ModInv = 1e +A = 3d +M = 3b + +ModInv = 14 +A = 3e +M = 3b + +ModInv = f +A = 3f +M = 3b + +ModInv = c +A = 40 +M = 3b + +ModInv = a +A = 41 +M = 3b + +ModInv = 11 +A = 42 +M = 3b + +ModInv = 25 +A = 43 +M = 3b + +ModInv = 2e +A = 44 +M = 3b + +ModInv = 6 +A = 45 +M = 3b + +ModInv = 2b +A = 46 +M = 3b + +ModInv = 5 +A = 47 +M = 3b + +ModInv = 32 +A = 48 +M = 3b + +ModInv = 26 +A = 49 +M = 3b + +ModInv = 4 +A = 4a +M = 3b + +ModInv = 30 +A = 4b +M = 3b + +ModInv = 7 +A = 4c +M = 3b + +ModInv = 17 +A = 4d +M = 3b + +ModInv = 1c +A = 4e +M = 3b + +ModInv = 3 +A = 4f +M = 3b + +ModInv = 2d +A = 50 +M = 3b + +ModInv = 33 +A = 51 +M = 3b + +ModInv = 12 +A = 52 +M = 3b + +ModInv = 20 +A = 53 +M = 3b + +ModInv = 1a +A = 54 +M = 3b + +ModInv = 19 +A = 55 +M = 3b + +ModInv = 23 +A = 56 +M = 3b + +ModInv = 13 +A = 57 +M = 3b + +ModInv = 39 +A = 58 +M = 3b + +ModInv = 2 +A = 59 +M = 3b + +ModInv = 28 +A = 5a +M = 3b + +ModInv = 18 +A = 5b +M = 3b + +ModInv = 22 +A = 5c +M = 3b + +ModInv = 21 +A = 5d +M = 3b + +ModInv = 1b +A = 5e +M = 3b + +ModInv = 29 +A = 5f +M = 3b + +ModInv = 8 +A = 60 +M = 3b + +ModInv = e +A = 61 +M = 3b + +ModInv = 38 +A = 62 +M = 3b + +ModInv = 1f +A = 63 +M = 3b + +ModInv = 2f +A = -61 +M = 3c + +ModInv = 1d +A = -5b +M = 3c + +ModInv = 1f +A = -59 +M = 3c + +ModInv = d +A = -53 +M = 3c + +ModInv = 29 +A = -4f +M = 3c + +ModInv = 7 +A = -4d +M = 3c + +ModInv = 17 +A = -49 +M = 3c + +ModInv = 31 +A = -47 +M = 3c + +ModInv = 11 +A = -43 +M = 3c + +ModInv = 3b +A = -3d +M = 3c + +ModInv = 1 +A = -3b +M = 3c + +ModInv = 2b +A = -35 +M = 3c + +ModInv = b +A = -31 +M = 3c + +ModInv = 25 +A = -2f +M = 3c + +ModInv = 35 +A = -2b +M = 3c + +ModInv = 13 +A = -29 +M = 3c + +ModInv = 2f +A = -25 +M = 3c + +ModInv = 1d +A = -1f +M = 3c + +ModInv = 1f +A = -1d +M = 3c + +ModInv = d +A = -17 +M = 3c + +ModInv = 29 +A = -13 +M = 3c + +ModInv = 7 +A = -11 +M = 3c + +ModInv = 17 +A = -d +M = 3c + +ModInv = 31 +A = -b +M = 3c + +ModInv = 11 +A = -7 +M = 3c + +ModInv = 3b +A = -1 +M = 3c + +ModInv = 1 +A = 1 +M = 3c + +ModInv = 2b +A = 7 +M = 3c + +ModInv = b +A = b +M = 3c + +ModInv = 25 +A = d +M = 3c + +ModInv = 35 +A = 11 +M = 3c + +ModInv = 13 +A = 13 +M = 3c + +ModInv = 2f +A = 17 +M = 3c + +ModInv = 1d +A = 1d +M = 3c + +ModInv = 1f +A = 1f +M = 3c + +ModInv = d +A = 25 +M = 3c + +ModInv = 29 +A = 29 +M = 3c + +ModInv = 7 +A = 2b +M = 3c + +ModInv = 17 +A = 2f +M = 3c + +ModInv = 31 +A = 31 +M = 3c + +ModInv = 11 +A = 35 +M = 3c + +ModInv = 3b +A = 3b +M = 3c + +ModInv = 1 +A = 3d +M = 3c + +ModInv = 2b +A = 43 +M = 3c + +ModInv = b +A = 47 +M = 3c + +ModInv = 25 +A = 49 +M = 3c + +ModInv = 35 +A = 4d +M = 3c + +ModInv = 13 +A = 4f +M = 3c + +ModInv = 2f +A = 53 +M = 3c + +ModInv = 1d +A = 59 +M = 3c + +ModInv = 1f +A = 5b +M = 3c + +ModInv = d +A = 61 +M = 3c + +ModInv = 19 +A = -64 +M = 3d + +ModInv = 8 +A = -63 +M = 3d + +ModInv = 1c +A = -62 +M = 3d + +ModInv = 16 +A = -61 +M = 3d + +ModInv = 36 +A = -60 +M = 3d + +ModInv = 34 +A = -5f +M = 3d + +ModInv = 18 +A = -5e +M = 3d + +ModInv = 28 +A = -5d +M = 3d + +ModInv = 3b +A = -5c +M = 3d + +ModInv = 2 +A = -5b +M = 3d + +ModInv = 15 +A = -5a +M = 3d + +ModInv = 25 +A = -59 +M = 3d + +ModInv = 9 +A = -58 +M = 3d + +ModInv = 7 +A = -57 +M = 3d + +ModInv = 27 +A = -56 +M = 3d + +ModInv = 21 +A = -55 +M = 3d + +ModInv = 35 +A = -54 +M = 3d + +ModInv = 24 +A = -53 +M = 3d + +ModInv = 1d +A = -52 +M = 3d + +ModInv = 3 +A = -51 +M = 3d + +ModInv = 10 +A = -50 +M = 3d + +ModInv = 2c +A = -4f +M = 3d + +ModInv = 2b +A = -4e +M = 3d + +ModInv = 13 +A = -4d +M = 3d + +ModInv = 4 +A = -4c +M = 3d + +ModInv = d +A = -4b +M = 3d + +ModInv = e +A = -4a +M = 3d + +ModInv = 5 +A = -49 +M = 3d + +ModInv = b +A = -48 +M = 3d + +ModInv = 6 +A = -47 +M = 3d + +ModInv = 1b +A = -46 +M = 3d + +ModInv = 26 +A = -45 +M = 3d + +ModInv = 1a +A = -44 +M = 3d + +ModInv = a +A = -43 +M = 3d + +ModInv = c +A = -42 +M = 3d + +ModInv = f +A = -41 +M = 3d + +ModInv = 14 +A = -40 +M = 3d + +ModInv = 1e +A = -3f +M = 3d + +ModInv = 3c +A = -3e +M = 3d + +ModInv = 1 +A = -3c +M = 3d + +ModInv = 1f +A = -3b +M = 3d + +ModInv = 29 +A = -3a +M = 3d + +ModInv = 2e +A = -39 +M = 3d + +ModInv = 31 +A = -38 +M = 3d + +ModInv = 33 +A = -37 +M = 3d + +ModInv = 23 +A = -36 +M = 3d + +ModInv = 17 +A = -35 +M = 3d + +ModInv = 22 +A = -34 +M = 3d + +ModInv = 37 +A = -33 +M = 3d + +ModInv = 32 +A = -32 +M = 3d + +ModInv = 38 +A = -31 +M = 3d + +ModInv = 2f +A = -30 +M = 3d + +ModInv = 30 +A = -2f +M = 3d + +ModInv = 39 +A = -2e +M = 3d + +ModInv = 2a +A = -2d +M = 3d + +ModInv = 12 +A = -2c +M = 3d + +ModInv = 11 +A = -2b +M = 3d + +ModInv = 2d +A = -2a +M = 3d + +ModInv = 3a +A = -29 +M = 3d + +ModInv = 20 +A = -28 +M = 3d + +ModInv = 19 +A = -27 +M = 3d + +ModInv = 8 +A = -26 +M = 3d + +ModInv = 1c +A = -25 +M = 3d + +ModInv = 16 +A = -24 +M = 3d + +ModInv = 36 +A = -23 +M = 3d + +ModInv = 34 +A = -22 +M = 3d + +ModInv = 18 +A = -21 +M = 3d + +ModInv = 28 +A = -20 +M = 3d + +ModInv = 3b +A = -1f +M = 3d + +ModInv = 2 +A = -1e +M = 3d + +ModInv = 15 +A = -1d +M = 3d + +ModInv = 25 +A = -1c +M = 3d + +ModInv = 9 +A = -1b +M = 3d + +ModInv = 7 +A = -1a +M = 3d + +ModInv = 27 +A = -19 +M = 3d + +ModInv = 21 +A = -18 +M = 3d + +ModInv = 35 +A = -17 +M = 3d + +ModInv = 24 +A = -16 +M = 3d + +ModInv = 1d +A = -15 +M = 3d + +ModInv = 3 +A = -14 +M = 3d + +ModInv = 10 +A = -13 +M = 3d + +ModInv = 2c +A = -12 +M = 3d + +ModInv = 2b +A = -11 +M = 3d + +ModInv = 13 +A = -10 +M = 3d + +ModInv = 4 +A = -f +M = 3d + +ModInv = d +A = -e +M = 3d + +ModInv = e +A = -d +M = 3d + +ModInv = 5 +A = -c +M = 3d + +ModInv = b +A = -b +M = 3d + +ModInv = 6 +A = -a +M = 3d + +ModInv = 1b +A = -9 +M = 3d + +ModInv = 26 +A = -8 +M = 3d + +ModInv = 1a +A = -7 +M = 3d + +ModInv = a +A = -6 +M = 3d + +ModInv = c +A = -5 +M = 3d + +ModInv = f +A = -4 +M = 3d + +ModInv = 14 +A = -3 +M = 3d + +ModInv = 1e +A = -2 +M = 3d + +ModInv = 3c +A = -1 +M = 3d + +ModInv = 1 +A = 1 +M = 3d + +ModInv = 1f +A = 2 +M = 3d + +ModInv = 29 +A = 3 +M = 3d + +ModInv = 2e +A = 4 +M = 3d + +ModInv = 31 +A = 5 +M = 3d + +ModInv = 33 +A = 6 +M = 3d + +ModInv = 23 +A = 7 +M = 3d + +ModInv = 17 +A = 8 +M = 3d + +ModInv = 22 +A = 9 +M = 3d + +ModInv = 37 +A = a +M = 3d + +ModInv = 32 +A = b +M = 3d + +ModInv = 38 +A = c +M = 3d + +ModInv = 2f +A = d +M = 3d + +ModInv = 30 +A = e +M = 3d + +ModInv = 39 +A = f +M = 3d + +ModInv = 2a +A = 10 +M = 3d + +ModInv = 12 +A = 11 +M = 3d + +ModInv = 11 +A = 12 +M = 3d + +ModInv = 2d +A = 13 +M = 3d + +ModInv = 3a +A = 14 +M = 3d + +ModInv = 20 +A = 15 +M = 3d + +ModInv = 19 +A = 16 +M = 3d + +ModInv = 8 +A = 17 +M = 3d + +ModInv = 1c +A = 18 +M = 3d + +ModInv = 16 +A = 19 +M = 3d + +ModInv = 36 +A = 1a +M = 3d + +ModInv = 34 +A = 1b +M = 3d + +ModInv = 18 +A = 1c +M = 3d + +ModInv = 28 +A = 1d +M = 3d + +ModInv = 3b +A = 1e +M = 3d + +ModInv = 2 +A = 1f +M = 3d + +ModInv = 15 +A = 20 +M = 3d + +ModInv = 25 +A = 21 +M = 3d + +ModInv = 9 +A = 22 +M = 3d + +ModInv = 7 +A = 23 +M = 3d + +ModInv = 27 +A = 24 +M = 3d + +ModInv = 21 +A = 25 +M = 3d + +ModInv = 35 +A = 26 +M = 3d + +ModInv = 24 +A = 27 +M = 3d + +ModInv = 1d +A = 28 +M = 3d + +ModInv = 3 +A = 29 +M = 3d + +ModInv = 10 +A = 2a +M = 3d + +ModInv = 2c +A = 2b +M = 3d + +ModInv = 2b +A = 2c +M = 3d + +ModInv = 13 +A = 2d +M = 3d + +ModInv = 4 +A = 2e +M = 3d + +ModInv = d +A = 2f +M = 3d + +ModInv = e +A = 30 +M = 3d + +ModInv = 5 +A = 31 +M = 3d + +ModInv = b +A = 32 +M = 3d + +ModInv = 6 +A = 33 +M = 3d + +ModInv = 1b +A = 34 +M = 3d + +ModInv = 26 +A = 35 +M = 3d + +ModInv = 1a +A = 36 +M = 3d + +ModInv = a +A = 37 +M = 3d + +ModInv = c +A = 38 +M = 3d + +ModInv = f +A = 39 +M = 3d + +ModInv = 14 +A = 3a +M = 3d + +ModInv = 1e +A = 3b +M = 3d + +ModInv = 3c +A = 3c +M = 3d + +ModInv = 1 +A = 3e +M = 3d + +ModInv = 1f +A = 3f +M = 3d + +ModInv = 29 +A = 40 +M = 3d + +ModInv = 2e +A = 41 +M = 3d + +ModInv = 31 +A = 42 +M = 3d + +ModInv = 33 +A = 43 +M = 3d + +ModInv = 23 +A = 44 +M = 3d + +ModInv = 17 +A = 45 +M = 3d + +ModInv = 22 +A = 46 +M = 3d + +ModInv = 37 +A = 47 +M = 3d + +ModInv = 32 +A = 48 +M = 3d + +ModInv = 38 +A = 49 +M = 3d + +ModInv = 2f +A = 4a +M = 3d + +ModInv = 30 +A = 4b +M = 3d + +ModInv = 39 +A = 4c +M = 3d + +ModInv = 2a +A = 4d +M = 3d + +ModInv = 12 +A = 4e +M = 3d + +ModInv = 11 +A = 4f +M = 3d + +ModInv = 2d +A = 50 +M = 3d + +ModInv = 3a +A = 51 +M = 3d + +ModInv = 20 +A = 52 +M = 3d + +ModInv = 19 +A = 53 +M = 3d + +ModInv = 8 +A = 54 +M = 3d + +ModInv = 1c +A = 55 +M = 3d + +ModInv = 16 +A = 56 +M = 3d + +ModInv = 36 +A = 57 +M = 3d + +ModInv = 34 +A = 58 +M = 3d + +ModInv = 18 +A = 59 +M = 3d + +ModInv = 28 +A = 5a +M = 3d + +ModInv = 3b +A = 5b +M = 3d + +ModInv = 2 +A = 5c +M = 3d + +ModInv = 15 +A = 5d +M = 3d + +ModInv = 25 +A = 5e +M = 3d + +ModInv = 9 +A = 5f +M = 3d + +ModInv = 7 +A = 60 +M = 3d + +ModInv = 27 +A = 61 +M = 3d + +ModInv = 21 +A = 62 +M = 3d + +ModInv = 35 +A = 63 +M = 3d + +ModInv = 5 +A = -63 +M = 3e + +ModInv = 17 +A = -61 +M = 3e + +ModInv = f +A = -5f +M = 3e + +ModInv = 2f +A = -5b +M = 3e + +ModInv = 27 +A = -59 +M = 3e + +ModInv = 39 +A = -57 +M = 3e + +ModInv = 23 +A = -55 +M = 3e + +ModInv = 3b +A = -53 +M = 3e + +ModInv = d +A = -51 +M = 3e + +ModInv = 33 +A = -4f +M = 3e + +ModInv = 21 +A = -4d +M = 3e + +ModInv = 13 +A = -4b +M = 3e + +ModInv = 2d +A = -49 +M = 3e + +ModInv = 37 +A = -47 +M = 3e + +ModInv = 35 +A = -45 +M = 3e + +ModInv = 25 +A = -43 +M = 3e + +ModInv = 29 +A = -41 +M = 3e + +ModInv = 3d +A = -3f +M = 3e + +ModInv = 1 +A = -3d +M = 3e + +ModInv = 15 +A = -3b +M = 3e + +ModInv = 19 +A = -39 +M = 3e + +ModInv = 9 +A = -37 +M = 3e + +ModInv = 7 +A = -35 +M = 3e + +ModInv = 11 +A = -33 +M = 3e + +ModInv = 2b +A = -31 +M = 3e + +ModInv = 1d +A = -2f +M = 3e + +ModInv = b +A = -2d +M = 3e + +ModInv = 31 +A = -2b +M = 3e + +ModInv = 3 +A = -29 +M = 3e + +ModInv = 1b +A = -27 +M = 3e + +ModInv = 5 +A = -25 +M = 3e + +ModInv = 17 +A = -23 +M = 3e + +ModInv = f +A = -21 +M = 3e + +ModInv = 2f +A = -1d +M = 3e + +ModInv = 27 +A = -1b +M = 3e + +ModInv = 39 +A = -19 +M = 3e + +ModInv = 23 +A = -17 +M = 3e + +ModInv = 3b +A = -15 +M = 3e + +ModInv = d +A = -13 +M = 3e + +ModInv = 33 +A = -11 +M = 3e + +ModInv = 21 +A = -f +M = 3e + +ModInv = 13 +A = -d +M = 3e + +ModInv = 2d +A = -b +M = 3e + +ModInv = 37 +A = -9 +M = 3e + +ModInv = 35 +A = -7 +M = 3e + +ModInv = 25 +A = -5 +M = 3e + +ModInv = 29 +A = -3 +M = 3e + +ModInv = 3d +A = -1 +M = 3e + +ModInv = 1 +A = 1 +M = 3e + +ModInv = 15 +A = 3 +M = 3e + +ModInv = 19 +A = 5 +M = 3e + +ModInv = 9 +A = 7 +M = 3e + +ModInv = 7 +A = 9 +M = 3e + +ModInv = 11 +A = b +M = 3e + +ModInv = 2b +A = d +M = 3e + +ModInv = 1d +A = f +M = 3e + +ModInv = b +A = 11 +M = 3e + +ModInv = 31 +A = 13 +M = 3e + +ModInv = 3 +A = 15 +M = 3e + +ModInv = 1b +A = 17 +M = 3e + +ModInv = 5 +A = 19 +M = 3e + +ModInv = 17 +A = 1b +M = 3e + +ModInv = f +A = 1d +M = 3e + +ModInv = 2f +A = 21 +M = 3e + +ModInv = 27 +A = 23 +M = 3e + +ModInv = 39 +A = 25 +M = 3e + +ModInv = 23 +A = 27 +M = 3e + +ModInv = 3b +A = 29 +M = 3e + +ModInv = d +A = 2b +M = 3e + +ModInv = 33 +A = 2d +M = 3e + +ModInv = 21 +A = 2f +M = 3e + +ModInv = 13 +A = 31 +M = 3e + +ModInv = 2d +A = 33 +M = 3e + +ModInv = 37 +A = 35 +M = 3e + +ModInv = 35 +A = 37 +M = 3e + +ModInv = 25 +A = 39 +M = 3e + +ModInv = 29 +A = 3b +M = 3e + +ModInv = 3d +A = 3d +M = 3e + +ModInv = 1 +A = 3f +M = 3e + +ModInv = 15 +A = 41 +M = 3e + +ModInv = 19 +A = 43 +M = 3e + +ModInv = 9 +A = 45 +M = 3e + +ModInv = 7 +A = 47 +M = 3e + +ModInv = 11 +A = 49 +M = 3e + +ModInv = 2b +A = 4b +M = 3e + +ModInv = 1d +A = 4d +M = 3e + +ModInv = b +A = 4f +M = 3e + +ModInv = 31 +A = 51 +M = 3e + +ModInv = 3 +A = 53 +M = 3e + +ModInv = 1b +A = 55 +M = 3e + +ModInv = 5 +A = 57 +M = 3e + +ModInv = 17 +A = 59 +M = 3e + +ModInv = f +A = 5b +M = 3e + +ModInv = 2f +A = 5f +M = 3e + +ModInv = 27 +A = 61 +M = 3e + +ModInv = 39 +A = 63 +M = 3e + +ModInv = 11 +A = -64 +M = 3f + +ModInv = 32 +A = -61 +M = 3f + +ModInv = 3d +A = -5f +M = 3f + +ModInv = 2 +A = -5e +M = 3f + +ModInv = d +A = -5c +M = 3f + +ModInv = 2e +A = -59 +M = 3f + +ModInv = 5 +A = -58 +M = 3f + +ModInv = 34 +A = -56 +M = 3f + +ModInv = 14 +A = -55 +M = 3f + +ModInv = 16 +A = -53 +M = 3f + +ModInv = 35 +A = -52 +M = 3f + +ModInv = 25 +A = -50 +M = 3f + +ModInv = 3b +A = -4f +M = 3f + +ModInv = 1d +A = -4c +M = 3f + +ModInv = 28 +A = -4a +M = 3f + +ModInv = 2c +A = -49 +M = 3f + +ModInv = 37 +A = -47 +M = 3f + +ModInv = 19 +A = -44 +M = 3f + +ModInv = 2f +A = -43 +M = 3f + +ModInv = 1f +A = -41 +M = 3f + +ModInv = 3e +A = -40 +M = 3f + +ModInv = 1 +A = -3e +M = 3f + +ModInv = 20 +A = -3d +M = 3f + +ModInv = 10 +A = -3b +M = 3f + +ModInv = 26 +A = -3a +M = 3f + +ModInv = 8 +A = -37 +M = 3f + +ModInv = 13 +A = -35 +M = 3f + +ModInv = 17 +A = -34 +M = 3f + +ModInv = 22 +A = -32 +M = 3f + +ModInv = 4 +A = -2f +M = 3f + +ModInv = 1a +A = -2e +M = 3f + +ModInv = a +A = -2c +M = 3f + +ModInv = 29 +A = -2b +M = 3f + +ModInv = 2b +A = -29 +M = 3f + +ModInv = b +A = -28 +M = 3f + +ModInv = 3a +A = -26 +M = 3f + +ModInv = 11 +A = -25 +M = 3f + +ModInv = 32 +A = -22 +M = 3f + +ModInv = 3d +A = -20 +M = 3f + +ModInv = 2 +A = -1f +M = 3f + +ModInv = d +A = -1d +M = 3f + +ModInv = 2e +A = -1a +M = 3f + +ModInv = 5 +A = -19 +M = 3f + +ModInv = 34 +A = -17 +M = 3f + +ModInv = 14 +A = -16 +M = 3f + +ModInv = 16 +A = -14 +M = 3f + +ModInv = 35 +A = -13 +M = 3f + +ModInv = 25 +A = -11 +M = 3f + +ModInv = 3b +A = -10 +M = 3f + +ModInv = 1d +A = -d +M = 3f + +ModInv = 28 +A = -b +M = 3f + +ModInv = 2c +A = -a +M = 3f + +ModInv = 37 +A = -8 +M = 3f + +ModInv = 19 +A = -5 +M = 3f + +ModInv = 2f +A = -4 +M = 3f + +ModInv = 1f +A = -2 +M = 3f + +ModInv = 3e +A = -1 +M = 3f + +ModInv = 1 +A = 1 +M = 3f + +ModInv = 20 +A = 2 +M = 3f + +ModInv = 10 +A = 4 +M = 3f + +ModInv = 26 +A = 5 +M = 3f + +ModInv = 8 +A = 8 +M = 3f + +ModInv = 13 +A = a +M = 3f + +ModInv = 17 +A = b +M = 3f + +ModInv = 22 +A = d +M = 3f + +ModInv = 4 +A = 10 +M = 3f + +ModInv = 1a +A = 11 +M = 3f + +ModInv = a +A = 13 +M = 3f + +ModInv = 29 +A = 14 +M = 3f + +ModInv = 2b +A = 16 +M = 3f + +ModInv = b +A = 17 +M = 3f + +ModInv = 3a +A = 19 +M = 3f + +ModInv = 11 +A = 1a +M = 3f + +ModInv = 32 +A = 1d +M = 3f + +ModInv = 3d +A = 1f +M = 3f + +ModInv = 2 +A = 20 +M = 3f + +ModInv = d +A = 22 +M = 3f + +ModInv = 2e +A = 25 +M = 3f + +ModInv = 5 +A = 26 +M = 3f + +ModInv = 34 +A = 28 +M = 3f + +ModInv = 14 +A = 29 +M = 3f + +ModInv = 16 +A = 2b +M = 3f + +ModInv = 35 +A = 2c +M = 3f + +ModInv = 25 +A = 2e +M = 3f + +ModInv = 3b +A = 2f +M = 3f + +ModInv = 1d +A = 32 +M = 3f + +ModInv = 28 +A = 34 +M = 3f + +ModInv = 2c +A = 35 +M = 3f + +ModInv = 37 +A = 37 +M = 3f + +ModInv = 19 +A = 3a +M = 3f + +ModInv = 2f +A = 3b +M = 3f + +ModInv = 1f +A = 3d +M = 3f + +ModInv = 3e +A = 3e +M = 3f + +ModInv = 1 +A = 40 +M = 3f + +ModInv = 20 +A = 41 +M = 3f + +ModInv = 10 +A = 43 +M = 3f + +ModInv = 26 +A = 44 +M = 3f + +ModInv = 8 +A = 47 +M = 3f + +ModInv = 13 +A = 49 +M = 3f + +ModInv = 17 +A = 4a +M = 3f + +ModInv = 22 +A = 4c +M = 3f + +ModInv = 4 +A = 4f +M = 3f + +ModInv = 1a +A = 50 +M = 3f + +ModInv = a +A = 52 +M = 3f + +ModInv = 29 +A = 53 +M = 3f + +ModInv = 2b +A = 55 +M = 3f + +ModInv = b +A = 56 +M = 3f + +ModInv = 3a +A = 58 +M = 3f + +ModInv = 11 +A = 59 +M = 3f + +ModInv = 32 +A = 5c +M = 3f + +ModInv = 3d +A = 5e +M = 3f + +ModInv = 2 +A = 5f +M = 3f + +ModInv = d +A = 61 +M = 3f + +ModInv = 35 +A = -63 +M = 40 + +ModInv = 1f +A = -61 +M = 40 + +ModInv = 21 +A = -5f +M = 40 + +ModInv = b +A = -5d +M = 40 + +ModInv = 2d +A = -5b +M = 40 + +ModInv = 17 +A = -59 +M = 40 + +ModInv = 19 +A = -57 +M = 40 + +ModInv = 3 +A = -55 +M = 40 + +ModInv = 25 +A = -53 +M = 40 + +ModInv = f +A = -51 +M = 40 + +ModInv = 11 +A = -4f +M = 40 + +ModInv = 3b +A = -4d +M = 40 + +ModInv = 1d +A = -4b +M = 40 + +ModInv = 7 +A = -49 +M = 40 + +ModInv = 9 +A = -47 +M = 40 + +ModInv = 33 +A = -45 +M = 40 + +ModInv = 15 +A = -43 +M = 40 + +ModInv = 3f +A = -41 +M = 40 + +ModInv = 1 +A = -3f +M = 40 + +ModInv = 2b +A = -3d +M = 40 + +ModInv = d +A = -3b +M = 40 + +ModInv = 37 +A = -39 +M = 40 + +ModInv = 39 +A = -37 +M = 40 + +ModInv = 23 +A = -35 +M = 40 + +ModInv = 5 +A = -33 +M = 40 + +ModInv = 2f +A = -31 +M = 40 + +ModInv = 31 +A = -2f +M = 40 + +ModInv = 1b +A = -2d +M = 40 + +ModInv = 3d +A = -2b +M = 40 + +ModInv = 27 +A = -29 +M = 40 + +ModInv = 29 +A = -27 +M = 40 + +ModInv = 13 +A = -25 +M = 40 + +ModInv = 35 +A = -23 +M = 40 + +ModInv = 1f +A = -21 +M = 40 + +ModInv = 21 +A = -1f +M = 40 + +ModInv = b +A = -1d +M = 40 + +ModInv = 2d +A = -1b +M = 40 + +ModInv = 17 +A = -19 +M = 40 + +ModInv = 19 +A = -17 +M = 40 + +ModInv = 3 +A = -15 +M = 40 + +ModInv = 25 +A = -13 +M = 40 + +ModInv = f +A = -11 +M = 40 + +ModInv = 11 +A = -f +M = 40 + +ModInv = 3b +A = -d +M = 40 + +ModInv = 1d +A = -b +M = 40 + +ModInv = 7 +A = -9 +M = 40 + +ModInv = 9 +A = -7 +M = 40 + +ModInv = 33 +A = -5 +M = 40 + +ModInv = 15 +A = -3 +M = 40 + +ModInv = 3f +A = -1 +M = 40 + +ModInv = 1 +A = 1 +M = 40 + +ModInv = 2b +A = 3 +M = 40 + +ModInv = d +A = 5 +M = 40 + +ModInv = 37 +A = 7 +M = 40 + +ModInv = 39 +A = 9 +M = 40 + +ModInv = 23 +A = b +M = 40 + +ModInv = 5 +A = d +M = 40 + +ModInv = 2f +A = f +M = 40 + +ModInv = 31 +A = 11 +M = 40 + +ModInv = 1b +A = 13 +M = 40 + +ModInv = 3d +A = 15 +M = 40 + +ModInv = 27 +A = 17 +M = 40 + +ModInv = 29 +A = 19 +M = 40 + +ModInv = 13 +A = 1b +M = 40 + +ModInv = 35 +A = 1d +M = 40 + +ModInv = 1f +A = 1f +M = 40 + +ModInv = 21 +A = 21 +M = 40 + +ModInv = b +A = 23 +M = 40 + +ModInv = 2d +A = 25 +M = 40 + +ModInv = 17 +A = 27 +M = 40 + +ModInv = 19 +A = 29 +M = 40 + +ModInv = 3 +A = 2b +M = 40 + +ModInv = 25 +A = 2d +M = 40 + +ModInv = f +A = 2f +M = 40 + +ModInv = 11 +A = 31 +M = 40 + +ModInv = 3b +A = 33 +M = 40 + +ModInv = 1d +A = 35 +M = 40 + +ModInv = 7 +A = 37 +M = 40 + +ModInv = 9 +A = 39 +M = 40 + +ModInv = 33 +A = 3b +M = 40 + +ModInv = 15 +A = 3d +M = 40 + +ModInv = 3f +A = 3f +M = 40 + +ModInv = 1 +A = 41 +M = 40 + +ModInv = 2b +A = 43 +M = 40 + +ModInv = d +A = 45 +M = 40 + +ModInv = 37 +A = 47 +M = 40 + +ModInv = 39 +A = 49 +M = 40 + +ModInv = 23 +A = 4b +M = 40 + +ModInv = 5 +A = 4d +M = 40 + +ModInv = 2f +A = 4f +M = 40 + +ModInv = 31 +A = 51 +M = 40 + +ModInv = 1b +A = 53 +M = 40 + +ModInv = 3d +A = 55 +M = 40 + +ModInv = 27 +A = 57 +M = 40 + +ModInv = 29 +A = 59 +M = 40 + +ModInv = 13 +A = 5b +M = 40 + +ModInv = 35 +A = 5d +M = 40 + +ModInv = 1f +A = 5f +M = 40 + +ModInv = 21 +A = 61 +M = 40 + +ModInv = b +A = 63 +M = 40 + +ModInv = 15 +A = -63 +M = 41 + +ModInv = 3f +A = -62 +M = 41 + +ModInv = 2 +A = -61 +M = 41 + +ModInv = 2c +A = -60 +M = 41 + +ModInv = 38 +A = -5e +M = 41 + +ModInv = 3a +A = -5d +M = 41 + +ModInv = c +A = -5c +M = 41 + +ModInv = 2e +A = -59 +M = 41 + +ModInv = 30 +A = -58 +M = 41 + +ModInv = 3e +A = -57 +M = 41 + +ModInv = 22 +A = -56 +M = 41 + +ModInv = 29 +A = -54 +M = 41 + +ModInv = 12 +A = -53 +M = 41 + +ModInv = 2a +A = -52 +M = 41 + +ModInv = 4 +A = -51 +M = 41 + +ModInv = 33 +A = -4f +M = 41 + +ModInv = 1b +A = -4d +M = 41 + +ModInv = 3b +A = -4c +M = 41 + +ModInv = 24 +A = -4a +M = 41 + +ModInv = 8 +A = -49 +M = 41 + +ModInv = 25 +A = -48 +M = 41 + +ModInv = 36 +A = -47 +M = 41 + +ModInv = 10 +A = -45 +M = 41 + +ModInv = 2b +A = -44 +M = 41 + +ModInv = 20 +A = -43 +M = 41 + +ModInv = 40 +A = -42 +M = 41 + +ModInv = 1 +A = -40 +M = 41 + +ModInv = 21 +A = -3f +M = 41 + +ModInv = 16 +A = -3e +M = 41 + +ModInv = 31 +A = -3d +M = 41 + +ModInv = b +A = -3b +M = 41 + +ModInv = 1c +A = -3a +M = 41 + +ModInv = 39 +A = -39 +M = 41 + +ModInv = 1d +A = -38 +M = 41 + +ModInv = 6 +A = -36 +M = 41 + +ModInv = 26 +A = -35 +M = 41 + +ModInv = e +A = -33 +M = 41 + +ModInv = 3d +A = -31 +M = 41 + +ModInv = 17 +A = -30 +M = 41 + +ModInv = 2f +A = -2f +M = 41 + +ModInv = 18 +A = -2e +M = 41 + +ModInv = 1f +A = -2c +M = 41 + +ModInv = 3 +A = -2b +M = 41 + +ModInv = 11 +A = -2a +M = 41 + +ModInv = 13 +A = -29 +M = 41 + +ModInv = 35 +A = -26 +M = 41 + +ModInv = 7 +A = -25 +M = 41 + +ModInv = 9 +A = -24 +M = 41 + +ModInv = 15 +A = -22 +M = 41 + +ModInv = 3f +A = -21 +M = 41 + +ModInv = 2 +A = -20 +M = 41 + +ModInv = 2c +A = -1f +M = 41 + +ModInv = 38 +A = -1d +M = 41 + +ModInv = 3a +A = -1c +M = 41 + +ModInv = c +A = -1b +M = 41 + +ModInv = 2e +A = -18 +M = 41 + +ModInv = 30 +A = -17 +M = 41 + +ModInv = 3e +A = -16 +M = 41 + +ModInv = 22 +A = -15 +M = 41 + +ModInv = 29 +A = -13 +M = 41 + +ModInv = 12 +A = -12 +M = 41 + +ModInv = 2a +A = -11 +M = 41 + +ModInv = 4 +A = -10 +M = 41 + +ModInv = 33 +A = -e +M = 41 + +ModInv = 1b +A = -c +M = 41 + +ModInv = 3b +A = -b +M = 41 + +ModInv = 24 +A = -9 +M = 41 + +ModInv = 8 +A = -8 +M = 41 + +ModInv = 25 +A = -7 +M = 41 + +ModInv = 36 +A = -6 +M = 41 + +ModInv = 10 +A = -4 +M = 41 + +ModInv = 2b +A = -3 +M = 41 + +ModInv = 20 +A = -2 +M = 41 + +ModInv = 40 +A = -1 +M = 41 + +ModInv = 1 +A = 1 +M = 41 + +ModInv = 21 +A = 2 +M = 41 + +ModInv = 16 +A = 3 +M = 41 + +ModInv = 31 +A = 4 +M = 41 + +ModInv = b +A = 6 +M = 41 + +ModInv = 1c +A = 7 +M = 41 + +ModInv = 39 +A = 8 +M = 41 + +ModInv = 1d +A = 9 +M = 41 + +ModInv = 6 +A = b +M = 41 + +ModInv = 26 +A = c +M = 41 + +ModInv = e +A = e +M = 41 + +ModInv = 3d +A = 10 +M = 41 + +ModInv = 17 +A = 11 +M = 41 + +ModInv = 2f +A = 12 +M = 41 + +ModInv = 18 +A = 13 +M = 41 + +ModInv = 1f +A = 15 +M = 41 + +ModInv = 3 +A = 16 +M = 41 + +ModInv = 11 +A = 17 +M = 41 + +ModInv = 13 +A = 18 +M = 41 + +ModInv = 35 +A = 1b +M = 41 + +ModInv = 7 +A = 1c +M = 41 + +ModInv = 9 +A = 1d +M = 41 + +ModInv = 15 +A = 1f +M = 41 + +ModInv = 3f +A = 20 +M = 41 + +ModInv = 2 +A = 21 +M = 41 + +ModInv = 2c +A = 22 +M = 41 + +ModInv = 38 +A = 24 +M = 41 + +ModInv = 3a +A = 25 +M = 41 + +ModInv = c +A = 26 +M = 41 + +ModInv = 2e +A = 29 +M = 41 + +ModInv = 30 +A = 2a +M = 41 + +ModInv = 3e +A = 2b +M = 41 + +ModInv = 22 +A = 2c +M = 41 + +ModInv = 29 +A = 2e +M = 41 + +ModInv = 12 +A = 2f +M = 41 + +ModInv = 2a +A = 30 +M = 41 + +ModInv = 4 +A = 31 +M = 41 + +ModInv = 33 +A = 33 +M = 41 + +ModInv = 1b +A = 35 +M = 41 + +ModInv = 3b +A = 36 +M = 41 + +ModInv = 24 +A = 38 +M = 41 + +ModInv = 8 +A = 39 +M = 41 + +ModInv = 25 +A = 3a +M = 41 + +ModInv = 36 +A = 3b +M = 41 + +ModInv = 10 +A = 3d +M = 41 + +ModInv = 2b +A = 3e +M = 41 + +ModInv = 20 +A = 3f +M = 41 + +ModInv = 40 +A = 40 +M = 41 + +ModInv = 1 +A = 42 +M = 41 + +ModInv = 21 +A = 43 +M = 41 + +ModInv = 16 +A = 44 +M = 41 + +ModInv = 31 +A = 45 +M = 41 + +ModInv = b +A = 47 +M = 41 + +ModInv = 1c +A = 48 +M = 41 + +ModInv = 39 +A = 49 +M = 41 + +ModInv = 1d +A = 4a +M = 41 + +ModInv = 6 +A = 4c +M = 41 + +ModInv = 26 +A = 4d +M = 41 + +ModInv = e +A = 4f +M = 41 + +ModInv = 3d +A = 51 +M = 41 + +ModInv = 17 +A = 52 +M = 41 + +ModInv = 2f +A = 53 +M = 41 + +ModInv = 18 +A = 54 +M = 41 + +ModInv = 1f +A = 56 +M = 41 + +ModInv = 3 +A = 57 +M = 41 + +ModInv = 11 +A = 58 +M = 41 + +ModInv = 13 +A = 59 +M = 41 + +ModInv = 35 +A = 5c +M = 41 + +ModInv = 7 +A = 5d +M = 41 + +ModInv = 9 +A = 5e +M = 41 + +ModInv = 15 +A = 60 +M = 41 + +ModInv = 3f +A = 61 +M = 41 + +ModInv = 2 +A = 62 +M = 41 + +ModInv = 2c +A = 63 +M = 41 + +ModInv = 11 +A = -61 +M = 42 + +ModInv = 19 +A = -5f +M = 42 + +ModInv = 1d +A = -5b +M = 42 + +ModInv = 2b +A = -59 +M = 42 + +ModInv = 3b +A = -55 +M = 42 + +ModInv = 1f +A = -53 +M = 42 + +ModInv = 5 +A = -4f +M = 42 + +ModInv = 2f +A = -49 +M = 42 + +ModInv = d +A = -47 +M = 42 + +ModInv = 41 +A = -43 +M = 42 + +ModInv = 1 +A = -41 +M = 42 + +ModInv = 35 +A = -3d +M = 42 + +ModInv = 13 +A = -3b +M = 42 + +ModInv = 3d +A = -35 +M = 42 + +ModInv = 23 +A = -31 +M = 42 + +ModInv = 7 +A = -2f +M = 42 + +ModInv = 17 +A = -2b +M = 42 + +ModInv = 25 +A = -29 +M = 42 + +ModInv = 29 +A = -25 +M = 42 + +ModInv = 31 +A = -23 +M = 42 + +ModInv = 11 +A = -1f +M = 42 + +ModInv = 19 +A = -1d +M = 42 + +ModInv = 1d +A = -19 +M = 42 + +ModInv = 2b +A = -17 +M = 42 + +ModInv = 3b +A = -13 +M = 42 + +ModInv = 1f +A = -11 +M = 42 + +ModInv = 5 +A = -d +M = 42 + +ModInv = 2f +A = -7 +M = 42 + +ModInv = d +A = -5 +M = 42 + +ModInv = 41 +A = -1 +M = 42 + +ModInv = 1 +A = 1 +M = 42 + +ModInv = 35 +A = 5 +M = 42 + +ModInv = 13 +A = 7 +M = 42 + +ModInv = 3d +A = d +M = 42 + +ModInv = 23 +A = 11 +M = 42 + +ModInv = 7 +A = 13 +M = 42 + +ModInv = 17 +A = 17 +M = 42 + +ModInv = 25 +A = 19 +M = 42 + +ModInv = 29 +A = 1d +M = 42 + +ModInv = 31 +A = 1f +M = 42 + +ModInv = 11 +A = 23 +M = 42 + +ModInv = 19 +A = 25 +M = 42 + +ModInv = 1d +A = 29 +M = 42 + +ModInv = 2b +A = 2b +M = 42 + +ModInv = 3b +A = 2f +M = 42 + +ModInv = 1f +A = 31 +M = 42 + +ModInv = 5 +A = 35 +M = 42 + +ModInv = 2f +A = 3b +M = 42 + +ModInv = d +A = 3d +M = 42 + +ModInv = 41 +A = 41 +M = 42 + +ModInv = 1 +A = 43 +M = 42 + +ModInv = 35 +A = 47 +M = 42 + +ModInv = 13 +A = 49 +M = 42 + +ModInv = 3d +A = 4f +M = 42 + +ModInv = 23 +A = 53 +M = 42 + +ModInv = 7 +A = 55 +M = 42 + +ModInv = 17 +A = 59 +M = 42 + +ModInv = 25 +A = 5b +M = 42 + +ModInv = 29 +A = 5f +M = 42 + +ModInv = 31 +A = 61 +M = 42 + +ModInv = 2 +A = -64 +M = 43 + +ModInv = 17 +A = -63 +M = 43 + +ModInv = 36 +A = -62 +M = 43 + +ModInv = 1d +A = -61 +M = 43 + +ModInv = 1e +A = -60 +M = 43 + +ModInv = 37 +A = -5f +M = 43 + +ModInv = 3e +A = -5e +M = 43 + +ModInv = 12 +A = -5d +M = 43 + +ModInv = 8 +A = -5c +M = 43 + +ModInv = 35 +A = -5b +M = 43 + +ModInv = 20 +A = -5a +M = 43 + +ModInv = 3 +A = -59 +M = 43 + +ModInv = 33 +A = -58 +M = 43 + +ModInv = a +A = -57 +M = 43 + +ModInv = 7 +A = -56 +M = 43 + +ModInv = 1a +A = -55 +M = 43 + +ModInv = 3f +A = -54 +M = 43 + +ModInv = 2e +A = -53 +M = 43 + +ModInv = 3a +A = -52 +M = 43 + +ModInv = 2b +A = -51 +M = 43 + +ModInv = 24 +A = -50 +M = 43 + +ModInv = 27 +A = -4f +M = 43 + +ModInv = 6 +A = -4e +M = 43 + +ModInv = 14 +A = -4d +M = 43 + +ModInv = 34 +A = -4c +M = 43 + +ModInv = 19 +A = -4b +M = 43 + +ModInv = 13 +A = -4a +M = 43 + +ModInv = b +A = -49 +M = 43 + +ModInv = 28 +A = -48 +M = 43 + +ModInv = 32 +A = -47 +M = 43 + +ModInv = 16 +A = -46 +M = 43 + +ModInv = 21 +A = -45 +M = 43 + +ModInv = 42 +A = -44 +M = 43 + +ModInv = 1 +A = -42 +M = 43 + +ModInv = 22 +A = -41 +M = 43 + +ModInv = 2d +A = -40 +M = 43 + +ModInv = 11 +A = -3f +M = 43 + +ModInv = 1b +A = -3e +M = 43 + +ModInv = 38 +A = -3d +M = 43 + +ModInv = 30 +A = -3c +M = 43 + +ModInv = 2a +A = -3b +M = 43 + +ModInv = f +A = -3a +M = 43 + +ModInv = 2f +A = -39 +M = 43 + +ModInv = 3d +A = -38 +M = 43 + +ModInv = 1c +A = -37 +M = 43 + +ModInv = 1f +A = -36 +M = 43 + +ModInv = 18 +A = -35 +M = 43 + +ModInv = 9 +A = -34 +M = 43 + +ModInv = 15 +A = -33 +M = 43 + +ModInv = 4 +A = -32 +M = 43 + +ModInv = 29 +A = -31 +M = 43 + +ModInv = 3c +A = -30 +M = 43 + +ModInv = 39 +A = -2f +M = 43 + +ModInv = 10 +A = -2e +M = 43 + +ModInv = 40 +A = -2d +M = 43 + +ModInv = 23 +A = -2c +M = 43 + +ModInv = e +A = -2b +M = 43 + +ModInv = 3b +A = -2a +M = 43 + +ModInv = 31 +A = -29 +M = 43 + +ModInv = 5 +A = -28 +M = 43 + +ModInv = c +A = -27 +M = 43 + +ModInv = 25 +A = -26 +M = 43 + +ModInv = 26 +A = -25 +M = 43 + +ModInv = d +A = -24 +M = 43 + +ModInv = 2c +A = -23 +M = 43 + +ModInv = 41 +A = -22 +M = 43 + +ModInv = 2 +A = -21 +M = 43 + +ModInv = 17 +A = -20 +M = 43 + +ModInv = 36 +A = -1f +M = 43 + +ModInv = 1d +A = -1e +M = 43 + +ModInv = 1e +A = -1d +M = 43 + +ModInv = 37 +A = -1c +M = 43 + +ModInv = 3e +A = -1b +M = 43 + +ModInv = 12 +A = -1a +M = 43 + +ModInv = 8 +A = -19 +M = 43 + +ModInv = 35 +A = -18 +M = 43 + +ModInv = 20 +A = -17 +M = 43 + +ModInv = 3 +A = -16 +M = 43 + +ModInv = 33 +A = -15 +M = 43 + +ModInv = a +A = -14 +M = 43 + +ModInv = 7 +A = -13 +M = 43 + +ModInv = 1a +A = -12 +M = 43 + +ModInv = 3f +A = -11 +M = 43 + +ModInv = 2e +A = -10 +M = 43 + +ModInv = 3a +A = -f +M = 43 + +ModInv = 2b +A = -e +M = 43 + +ModInv = 24 +A = -d +M = 43 + +ModInv = 27 +A = -c +M = 43 + +ModInv = 6 +A = -b +M = 43 + +ModInv = 14 +A = -a +M = 43 + +ModInv = 34 +A = -9 +M = 43 + +ModInv = 19 +A = -8 +M = 43 + +ModInv = 13 +A = -7 +M = 43 + +ModInv = b +A = -6 +M = 43 + +ModInv = 28 +A = -5 +M = 43 + +ModInv = 32 +A = -4 +M = 43 + +ModInv = 16 +A = -3 +M = 43 + +ModInv = 21 +A = -2 +M = 43 + +ModInv = 42 +A = -1 +M = 43 + +ModInv = 1 +A = 1 +M = 43 + +ModInv = 22 +A = 2 +M = 43 + +ModInv = 2d +A = 3 +M = 43 + +ModInv = 11 +A = 4 +M = 43 + +ModInv = 1b +A = 5 +M = 43 + +ModInv = 38 +A = 6 +M = 43 + +ModInv = 30 +A = 7 +M = 43 + +ModInv = 2a +A = 8 +M = 43 + +ModInv = f +A = 9 +M = 43 + +ModInv = 2f +A = a +M = 43 + +ModInv = 3d +A = b +M = 43 + +ModInv = 1c +A = c +M = 43 + +ModInv = 1f +A = d +M = 43 + +ModInv = 18 +A = e +M = 43 + +ModInv = 9 +A = f +M = 43 + +ModInv = 15 +A = 10 +M = 43 + +ModInv = 4 +A = 11 +M = 43 + +ModInv = 29 +A = 12 +M = 43 + +ModInv = 3c +A = 13 +M = 43 + +ModInv = 39 +A = 14 +M = 43 + +ModInv = 10 +A = 15 +M = 43 + +ModInv = 40 +A = 16 +M = 43 + +ModInv = 23 +A = 17 +M = 43 + +ModInv = e +A = 18 +M = 43 + +ModInv = 3b +A = 19 +M = 43 + +ModInv = 31 +A = 1a +M = 43 + +ModInv = 5 +A = 1b +M = 43 + +ModInv = c +A = 1c +M = 43 + +ModInv = 25 +A = 1d +M = 43 + +ModInv = 26 +A = 1e +M = 43 + +ModInv = d +A = 1f +M = 43 + +ModInv = 2c +A = 20 +M = 43 + +ModInv = 41 +A = 21 +M = 43 + +ModInv = 2 +A = 22 +M = 43 + +ModInv = 17 +A = 23 +M = 43 + +ModInv = 36 +A = 24 +M = 43 + +ModInv = 1d +A = 25 +M = 43 + +ModInv = 1e +A = 26 +M = 43 + +ModInv = 37 +A = 27 +M = 43 + +ModInv = 3e +A = 28 +M = 43 + +ModInv = 12 +A = 29 +M = 43 + +ModInv = 8 +A = 2a +M = 43 + +ModInv = 35 +A = 2b +M = 43 + +ModInv = 20 +A = 2c +M = 43 + +ModInv = 3 +A = 2d +M = 43 + +ModInv = 33 +A = 2e +M = 43 + +ModInv = a +A = 2f +M = 43 + +ModInv = 7 +A = 30 +M = 43 + +ModInv = 1a +A = 31 +M = 43 + +ModInv = 3f +A = 32 +M = 43 + +ModInv = 2e +A = 33 +M = 43 + +ModInv = 3a +A = 34 +M = 43 + +ModInv = 2b +A = 35 +M = 43 + +ModInv = 24 +A = 36 +M = 43 + +ModInv = 27 +A = 37 +M = 43 + +ModInv = 6 +A = 38 +M = 43 + +ModInv = 14 +A = 39 +M = 43 + +ModInv = 34 +A = 3a +M = 43 + +ModInv = 19 +A = 3b +M = 43 + +ModInv = 13 +A = 3c +M = 43 + +ModInv = b +A = 3d +M = 43 + +ModInv = 28 +A = 3e +M = 43 + +ModInv = 32 +A = 3f +M = 43 + +ModInv = 16 +A = 40 +M = 43 + +ModInv = 21 +A = 41 +M = 43 + +ModInv = 42 +A = 42 +M = 43 + +ModInv = 1 +A = 44 +M = 43 + +ModInv = 22 +A = 45 +M = 43 + +ModInv = 2d +A = 46 +M = 43 + +ModInv = 11 +A = 47 +M = 43 + +ModInv = 1b +A = 48 +M = 43 + +ModInv = 38 +A = 49 +M = 43 + +ModInv = 30 +A = 4a +M = 43 + +ModInv = 2a +A = 4b +M = 43 + +ModInv = f +A = 4c +M = 43 + +ModInv = 2f +A = 4d +M = 43 + +ModInv = 3d +A = 4e +M = 43 + +ModInv = 1c +A = 4f +M = 43 + +ModInv = 1f +A = 50 +M = 43 + +ModInv = 18 +A = 51 +M = 43 + +ModInv = 9 +A = 52 +M = 43 + +ModInv = 15 +A = 53 +M = 43 + +ModInv = 4 +A = 54 +M = 43 + +ModInv = 29 +A = 55 +M = 43 + +ModInv = 3c +A = 56 +M = 43 + +ModInv = 39 +A = 57 +M = 43 + +ModInv = 10 +A = 58 +M = 43 + +ModInv = 40 +A = 59 +M = 43 + +ModInv = 23 +A = 5a +M = 43 + +ModInv = e +A = 5b +M = 43 + +ModInv = 3b +A = 5c +M = 43 + +ModInv = 31 +A = 5d +M = 43 + +ModInv = 5 +A = 5e +M = 43 + +ModInv = c +A = 5f +M = 43 + +ModInv = 25 +A = 60 +M = 43 + +ModInv = 26 +A = 61 +M = 43 + +ModInv = d +A = 62 +M = 43 + +ModInv = 2c +A = 63 +M = 43 + +ModInv = 39 +A = -63 +M = 44 + +ModInv = 7 +A = -61 +M = 44 + +ModInv = 5 +A = -5f +M = 44 + +ModInv = 13 +A = -5d +M = 44 + +ModInv = 41 +A = -5b +M = 44 + +ModInv = 37 +A = -59 +M = 44 + +ModInv = 19 +A = -57 +M = 44 + +ModInv = 9 +A = -53 +M = 44 + +ModInv = 2f +A = -51 +M = 44 + +ModInv = 25 +A = -4f +M = 44 + +ModInv = f +A = -4d +M = 44 + +ModInv = 1d +A = -4b +M = 44 + +ModInv = 1b +A = -49 +M = 44 + +ModInv = 2d +A = -47 +M = 44 + +ModInv = 43 +A = -45 +M = 44 + +ModInv = 1 +A = -43 +M = 44 + +ModInv = 17 +A = -41 +M = 44 + +ModInv = 29 +A = -3f +M = 44 + +ModInv = 27 +A = -3d +M = 44 + +ModInv = 35 +A = -3b +M = 44 + +ModInv = 1f +A = -39 +M = 44 + +ModInv = 15 +A = -37 +M = 44 + +ModInv = 3b +A = -35 +M = 44 + +ModInv = 2b +A = -31 +M = 44 + +ModInv = d +A = -2f +M = 44 + +ModInv = 3 +A = -2d +M = 44 + +ModInv = 31 +A = -2b +M = 44 + +ModInv = 3f +A = -29 +M = 44 + +ModInv = 3d +A = -27 +M = 44 + +ModInv = b +A = -25 +M = 44 + +ModInv = 21 +A = -23 +M = 44 + +ModInv = 23 +A = -21 +M = 44 + +ModInv = 39 +A = -1f +M = 44 + +ModInv = 7 +A = -1d +M = 44 + +ModInv = 5 +A = -1b +M = 44 + +ModInv = 13 +A = -19 +M = 44 + +ModInv = 41 +A = -17 +M = 44 + +ModInv = 37 +A = -15 +M = 44 + +ModInv = 19 +A = -13 +M = 44 + +ModInv = 9 +A = -f +M = 44 + +ModInv = 2f +A = -d +M = 44 + +ModInv = 25 +A = -b +M = 44 + +ModInv = f +A = -9 +M = 44 + +ModInv = 1d +A = -7 +M = 44 + +ModInv = 1b +A = -5 +M = 44 + +ModInv = 2d +A = -3 +M = 44 + +ModInv = 43 +A = -1 +M = 44 + +ModInv = 1 +A = 1 +M = 44 + +ModInv = 17 +A = 3 +M = 44 + +ModInv = 29 +A = 5 +M = 44 + +ModInv = 27 +A = 7 +M = 44 + +ModInv = 35 +A = 9 +M = 44 + +ModInv = 1f +A = b +M = 44 + +ModInv = 15 +A = d +M = 44 + +ModInv = 3b +A = f +M = 44 + +ModInv = 2b +A = 13 +M = 44 + +ModInv = d +A = 15 +M = 44 + +ModInv = 3 +A = 17 +M = 44 + +ModInv = 31 +A = 19 +M = 44 + +ModInv = 3f +A = 1b +M = 44 + +ModInv = 3d +A = 1d +M = 44 + +ModInv = b +A = 1f +M = 44 + +ModInv = 21 +A = 21 +M = 44 + +ModInv = 23 +A = 23 +M = 44 + +ModInv = 39 +A = 25 +M = 44 + +ModInv = 7 +A = 27 +M = 44 + +ModInv = 5 +A = 29 +M = 44 + +ModInv = 13 +A = 2b +M = 44 + +ModInv = 41 +A = 2d +M = 44 + +ModInv = 37 +A = 2f +M = 44 + +ModInv = 19 +A = 31 +M = 44 + +ModInv = 9 +A = 35 +M = 44 + +ModInv = 2f +A = 37 +M = 44 + +ModInv = 25 +A = 39 +M = 44 + +ModInv = f +A = 3b +M = 44 + +ModInv = 1d +A = 3d +M = 44 + +ModInv = 1b +A = 3f +M = 44 + +ModInv = 2d +A = 41 +M = 44 + +ModInv = 43 +A = 43 +M = 44 + +ModInv = 1 +A = 45 +M = 44 + +ModInv = 17 +A = 47 +M = 44 + +ModInv = 29 +A = 49 +M = 44 + +ModInv = 27 +A = 4b +M = 44 + +ModInv = 35 +A = 4d +M = 44 + +ModInv = 1f +A = 4f +M = 44 + +ModInv = 15 +A = 51 +M = 44 + +ModInv = 3b +A = 53 +M = 44 + +ModInv = 2b +A = 57 +M = 44 + +ModInv = d +A = 59 +M = 44 + +ModInv = 3 +A = 5b +M = 44 + +ModInv = 31 +A = 5d +M = 44 + +ModInv = 3f +A = 5f +M = 44 + +ModInv = 3d +A = 61 +M = 44 + +ModInv = b +A = 63 +M = 44 + +ModInv = 14 +A = -64 +M = 45 + +ModInv = 13 +A = -62 +M = 45 + +ModInv = 20 +A = -61 +M = 45 + +ModInv = 3d +A = -5f +M = 45 + +ModInv = b +A = -5e +M = 45 + +ModInv = 2f +A = -5b +M = 45 + +ModInv = 1f +A = -59 +M = 45 + +ModInv = 1d +A = -58 +M = 45 + +ModInv = 4 +A = -56 +M = 45 + +ModInv = 38 +A = -55 +M = 45 + +ModInv = 40 +A = -53 +M = 45 + +ModInv = 35 +A = -52 +M = 45 + +ModInv = 19 +A = -50 +M = 45 + +ModInv = 3e +A = -4f +M = 45 + +ModInv = 2b +A = -4d +M = 45 + +ModInv = 3b +A = -4c +M = 45 + +ModInv = 37 +A = -4a +M = 45 + +ModInv = 11 +A = -49 +M = 45 + +ModInv = 22 +A = -47 +M = 45 + +ModInv = 44 +A = -46 +M = 45 + +ModInv = 1 +A = -44 +M = 45 + +ModInv = 23 +A = -43 +M = 45 + +ModInv = 34 +A = -41 +M = 45 + +ModInv = e +A = -40 +M = 45 + +ModInv = a +A = -3e +M = 45 + +ModInv = 1a +A = -3d +M = 45 + +ModInv = 7 +A = -3b +M = 45 + +ModInv = 2c +A = -3a +M = 45 + +ModInv = 10 +A = -38 +M = 45 + +ModInv = 5 +A = -37 +M = 45 + +ModInv = d +A = -35 +M = 45 + +ModInv = 41 +A = -34 +M = 45 + +ModInv = 28 +A = -32 +M = 45 + +ModInv = 26 +A = -31 +M = 45 + +ModInv = 16 +A = -2f +M = 45 + +ModInv = 3a +A = -2c +M = 45 + +ModInv = 8 +A = -2b +M = 45 + +ModInv = 25 +A = -29 +M = 45 + +ModInv = 32 +A = -28 +M = 45 + +ModInv = 31 +A = -26 +M = 45 + +ModInv = 29 +A = -25 +M = 45 + +ModInv = 43 +A = -23 +M = 45 + +ModInv = 2 +A = -22 +M = 45 + +ModInv = 1c +A = -20 +M = 45 + +ModInv = 14 +A = -1f +M = 45 + +ModInv = 13 +A = -1d +M = 45 + +ModInv = 20 +A = -1c +M = 45 + +ModInv = 3d +A = -1a +M = 45 + +ModInv = b +A = -19 +M = 45 + +ModInv = 2f +A = -16 +M = 45 + +ModInv = 1f +A = -14 +M = 45 + +ModInv = 1d +A = -13 +M = 45 + +ModInv = 4 +A = -11 +M = 45 + +ModInv = 38 +A = -10 +M = 45 + +ModInv = 40 +A = -e +M = 45 + +ModInv = 35 +A = -d +M = 45 + +ModInv = 19 +A = -b +M = 45 + +ModInv = 3e +A = -a +M = 45 + +ModInv = 2b +A = -8 +M = 45 + +ModInv = 3b +A = -7 +M = 45 + +ModInv = 37 +A = -5 +M = 45 + +ModInv = 11 +A = -4 +M = 45 + +ModInv = 22 +A = -2 +M = 45 + +ModInv = 44 +A = -1 +M = 45 + +ModInv = 1 +A = 1 +M = 45 + +ModInv = 23 +A = 2 +M = 45 + +ModInv = 34 +A = 4 +M = 45 + +ModInv = e +A = 5 +M = 45 + +ModInv = a +A = 7 +M = 45 + +ModInv = 1a +A = 8 +M = 45 + +ModInv = 7 +A = a +M = 45 + +ModInv = 2c +A = b +M = 45 + +ModInv = 10 +A = d +M = 45 + +ModInv = 5 +A = e +M = 45 + +ModInv = d +A = 10 +M = 45 + +ModInv = 41 +A = 11 +M = 45 + +ModInv = 28 +A = 13 +M = 45 + +ModInv = 26 +A = 14 +M = 45 + +ModInv = 16 +A = 16 +M = 45 + +ModInv = 3a +A = 19 +M = 45 + +ModInv = 8 +A = 1a +M = 45 + +ModInv = 25 +A = 1c +M = 45 + +ModInv = 32 +A = 1d +M = 45 + +ModInv = 31 +A = 1f +M = 45 + +ModInv = 29 +A = 20 +M = 45 + +ModInv = 43 +A = 22 +M = 45 + +ModInv = 2 +A = 23 +M = 45 + +ModInv = 1c +A = 25 +M = 45 + +ModInv = 14 +A = 26 +M = 45 + +ModInv = 13 +A = 28 +M = 45 + +ModInv = 20 +A = 29 +M = 45 + +ModInv = 3d +A = 2b +M = 45 + +ModInv = b +A = 2c +M = 45 + +ModInv = 2f +A = 2f +M = 45 + +ModInv = 1f +A = 31 +M = 45 + +ModInv = 1d +A = 32 +M = 45 + +ModInv = 4 +A = 34 +M = 45 + +ModInv = 38 +A = 35 +M = 45 + +ModInv = 40 +A = 37 +M = 45 + +ModInv = 35 +A = 38 +M = 45 + +ModInv = 19 +A = 3a +M = 45 + +ModInv = 3e +A = 3b +M = 45 + +ModInv = 2b +A = 3d +M = 45 + +ModInv = 3b +A = 3e +M = 45 + +ModInv = 37 +A = 40 +M = 45 + +ModInv = 11 +A = 41 +M = 45 + +ModInv = 22 +A = 43 +M = 45 + +ModInv = 44 +A = 44 +M = 45 + +ModInv = 1 +A = 46 +M = 45 + +ModInv = 23 +A = 47 +M = 45 + +ModInv = 34 +A = 49 +M = 45 + +ModInv = e +A = 4a +M = 45 + +ModInv = a +A = 4c +M = 45 + +ModInv = 1a +A = 4d +M = 45 + +ModInv = 7 +A = 4f +M = 45 + +ModInv = 2c +A = 50 +M = 45 + +ModInv = 10 +A = 52 +M = 45 + +ModInv = 5 +A = 53 +M = 45 + +ModInv = d +A = 55 +M = 45 + +ModInv = 41 +A = 56 +M = 45 + +ModInv = 28 +A = 58 +M = 45 + +ModInv = 26 +A = 59 +M = 45 + +ModInv = 16 +A = 5b +M = 45 + +ModInv = 3a +A = 5e +M = 45 + +ModInv = 8 +A = 5f +M = 45 + +ModInv = 25 +A = 61 +M = 45 + +ModInv = 32 +A = 62 +M = 45 + +ModInv = 29 +A = -63 +M = 46 + +ModInv = 39 +A = -61 +M = 46 + +ModInv = 3 +A = -5d +M = 46 + +ModInv = b +A = -59 +M = 46 + +ModInv = 25 +A = -57 +M = 46 + +ModInv = 2b +A = -53 +M = 46 + +ModInv = 13 +A = -51 +M = 46 + +ModInv = 1f +A = -4f +M = 46 + +ModInv = 17 +A = -49 +M = 46 + +ModInv = 45 +A = -47 +M = 46 + +ModInv = 1 +A = -45 +M = 46 + +ModInv = 2f +A = -43 +M = 46 + +ModInv = 27 +A = -3d +M = 46 + +ModInv = 33 +A = -3b +M = 46 + +ModInv = 1b +A = -39 +M = 46 + +ModInv = 21 +A = -35 +M = 46 + +ModInv = 3b +A = -33 +M = 46 + +ModInv = 43 +A = -2f +M = 46 + +ModInv = d +A = -2b +M = 46 + +ModInv = 1d +A = -29 +M = 46 + +ModInv = 3d +A = -27 +M = 46 + +ModInv = 11 +A = -25 +M = 46 + +ModInv = 35 +A = -21 +M = 46 + +ModInv = 9 +A = -1f +M = 46 + +ModInv = 29 +A = -1d +M = 46 + +ModInv = 39 +A = -1b +M = 46 + +ModInv = 3 +A = -17 +M = 46 + +ModInv = b +A = -13 +M = 46 + +ModInv = 25 +A = -11 +M = 46 + +ModInv = 2b +A = -d +M = 46 + +ModInv = 13 +A = -b +M = 46 + +ModInv = 1f +A = -9 +M = 46 + +ModInv = 17 +A = -3 +M = 46 + +ModInv = 45 +A = -1 +M = 46 + +ModInv = 1 +A = 1 +M = 46 + +ModInv = 2f +A = 3 +M = 46 + +ModInv = 27 +A = 9 +M = 46 + +ModInv = 33 +A = b +M = 46 + +ModInv = 1b +A = d +M = 46 + +ModInv = 21 +A = 11 +M = 46 + +ModInv = 3b +A = 13 +M = 46 + +ModInv = 43 +A = 17 +M = 46 + +ModInv = d +A = 1b +M = 46 + +ModInv = 1d +A = 1d +M = 46 + +ModInv = 3d +A = 1f +M = 46 + +ModInv = 11 +A = 21 +M = 46 + +ModInv = 35 +A = 25 +M = 46 + +ModInv = 9 +A = 27 +M = 46 + +ModInv = 29 +A = 29 +M = 46 + +ModInv = 39 +A = 2b +M = 46 + +ModInv = 3 +A = 2f +M = 46 + +ModInv = b +A = 33 +M = 46 + +ModInv = 25 +A = 35 +M = 46 + +ModInv = 2b +A = 39 +M = 46 + +ModInv = 13 +A = 3b +M = 46 + +ModInv = 1f +A = 3d +M = 46 + +ModInv = 17 +A = 43 +M = 46 + +ModInv = 45 +A = 45 +M = 46 + +ModInv = 1 +A = 47 +M = 46 + +ModInv = 2f +A = 49 +M = 46 + +ModInv = 27 +A = 4f +M = 46 + +ModInv = 33 +A = 51 +M = 46 + +ModInv = 1b +A = 53 +M = 46 + +ModInv = 21 +A = 57 +M = 46 + +ModInv = 3b +A = 59 +M = 46 + +ModInv = 43 +A = 5d +M = 46 + +ModInv = d +A = 61 +M = 46 + +ModInv = 1d +A = 63 +M = 46 + +ModInv = 16 +A = -64 +M = 47 + +ModInv = 26 +A = -63 +M = 47 + +ModInv = 15 +A = -62 +M = 47 + +ModInv = 1e +A = -61 +M = 47 + +ModInv = 11 +A = -60 +M = 47 + +ModInv = 44 +A = -5f +M = 47 + +ModInv = 25 +A = -5e +M = 47 + +ModInv = 1d +A = -5d +M = 47 + +ModInv = 1b +A = -5c +M = 47 + +ModInv = 27 +A = -5b +M = 47 + +ModInv = 38 +A = -5a +M = 47 + +ModInv = 43 +A = -59 +M = 47 + +ModInv = 19 +A = -58 +M = 47 + +ModInv = 1f +A = -57 +M = 47 + +ModInv = 34 +A = -56 +M = 47 + +ModInv = 5 +A = -55 +M = 47 + +ModInv = 3c +A = -54 +M = 47 + +ModInv = 41 +A = -53 +M = 47 + +ModInv = 3a +A = -52 +M = 47 + +ModInv = 7 +A = -51 +M = 47 + +ModInv = 3f +A = -50 +M = 47 + +ModInv = 3e +A = -4f +M = 47 + +ModInv = a +A = -4e +M = 47 + +ModInv = 3b +A = -4d +M = 47 + +ModInv = e +A = -4c +M = 47 + +ModInv = 35 +A = -4b +M = 47 + +ModInv = 2f +A = -4a +M = 47 + +ModInv = 23 +A = -49 +M = 47 + +ModInv = 46 +A = -48 +M = 47 + +ModInv = 1 +A = -46 +M = 47 + +ModInv = 24 +A = -45 +M = 47 + +ModInv = 18 +A = -44 +M = 47 + +ModInv = 12 +A = -43 +M = 47 + +ModInv = 39 +A = -42 +M = 47 + +ModInv = c +A = -41 +M = 47 + +ModInv = 3d +A = -40 +M = 47 + +ModInv = 9 +A = -3f +M = 47 + +ModInv = 8 +A = -3e +M = 47 + +ModInv = 40 +A = -3d +M = 47 + +ModInv = d +A = -3c +M = 47 + +ModInv = 6 +A = -3b +M = 47 + +ModInv = b +A = -3a +M = 47 + +ModInv = 42 +A = -39 +M = 47 + +ModInv = 13 +A = -38 +M = 47 + +ModInv = 28 +A = -37 +M = 47 + +ModInv = 2e +A = -36 +M = 47 + +ModInv = 4 +A = -35 +M = 47 + +ModInv = f +A = -34 +M = 47 + +ModInv = 20 +A = -33 +M = 47 + +ModInv = 2c +A = -32 +M = 47 + +ModInv = 2a +A = -31 +M = 47 + +ModInv = 22 +A = -30 +M = 47 + +ModInv = 3 +A = -2f +M = 47 + +ModInv = 36 +A = -2e +M = 47 + +ModInv = 29 +A = -2d +M = 47 + +ModInv = 32 +A = -2c +M = 47 + +ModInv = 21 +A = -2b +M = 47 + +ModInv = 31 +A = -2a +M = 47 + +ModInv = 2d +A = -29 +M = 47 + +ModInv = 37 +A = -28 +M = 47 + +ModInv = 14 +A = -27 +M = 47 + +ModInv = 1c +A = -26 +M = 47 + +ModInv = 17 +A = -25 +M = 47 + +ModInv = 45 +A = -24 +M = 47 + +ModInv = 2 +A = -23 +M = 47 + +ModInv = 30 +A = -22 +M = 47 + +ModInv = 2b +A = -21 +M = 47 + +ModInv = 33 +A = -20 +M = 47 + +ModInv = 10 +A = -1f +M = 47 + +ModInv = 1a +A = -1e +M = 47 + +ModInv = 16 +A = -1d +M = 47 + +ModInv = 26 +A = -1c +M = 47 + +ModInv = 15 +A = -1b +M = 47 + +ModInv = 1e +A = -1a +M = 47 + +ModInv = 11 +A = -19 +M = 47 + +ModInv = 44 +A = -18 +M = 47 + +ModInv = 25 +A = -17 +M = 47 + +ModInv = 1d +A = -16 +M = 47 + +ModInv = 1b +A = -15 +M = 47 + +ModInv = 27 +A = -14 +M = 47 + +ModInv = 38 +A = -13 +M = 47 + +ModInv = 43 +A = -12 +M = 47 + +ModInv = 19 +A = -11 +M = 47 + +ModInv = 1f +A = -10 +M = 47 + +ModInv = 34 +A = -f +M = 47 + +ModInv = 5 +A = -e +M = 47 + +ModInv = 3c +A = -d +M = 47 + +ModInv = 41 +A = -c +M = 47 + +ModInv = 3a +A = -b +M = 47 + +ModInv = 7 +A = -a +M = 47 + +ModInv = 3f +A = -9 +M = 47 + +ModInv = 3e +A = -8 +M = 47 + +ModInv = a +A = -7 +M = 47 + +ModInv = 3b +A = -6 +M = 47 + +ModInv = e +A = -5 +M = 47 + +ModInv = 35 +A = -4 +M = 47 + +ModInv = 2f +A = -3 +M = 47 + +ModInv = 23 +A = -2 +M = 47 + +ModInv = 46 +A = -1 +M = 47 + +ModInv = 1 +A = 1 +M = 47 + +ModInv = 24 +A = 2 +M = 47 + +ModInv = 18 +A = 3 +M = 47 + +ModInv = 12 +A = 4 +M = 47 + +ModInv = 39 +A = 5 +M = 47 + +ModInv = c +A = 6 +M = 47 + +ModInv = 3d +A = 7 +M = 47 + +ModInv = 9 +A = 8 +M = 47 + +ModInv = 8 +A = 9 +M = 47 + +ModInv = 40 +A = a +M = 47 + +ModInv = d +A = b +M = 47 + +ModInv = 6 +A = c +M = 47 + +ModInv = b +A = d +M = 47 + +ModInv = 42 +A = e +M = 47 + +ModInv = 13 +A = f +M = 47 + +ModInv = 28 +A = 10 +M = 47 + +ModInv = 2e +A = 11 +M = 47 + +ModInv = 4 +A = 12 +M = 47 + +ModInv = f +A = 13 +M = 47 + +ModInv = 20 +A = 14 +M = 47 + +ModInv = 2c +A = 15 +M = 47 + +ModInv = 2a +A = 16 +M = 47 + +ModInv = 22 +A = 17 +M = 47 + +ModInv = 3 +A = 18 +M = 47 + +ModInv = 36 +A = 19 +M = 47 + +ModInv = 29 +A = 1a +M = 47 + +ModInv = 32 +A = 1b +M = 47 + +ModInv = 21 +A = 1c +M = 47 + +ModInv = 31 +A = 1d +M = 47 + +ModInv = 2d +A = 1e +M = 47 + +ModInv = 37 +A = 1f +M = 47 + +ModInv = 14 +A = 20 +M = 47 + +ModInv = 1c +A = 21 +M = 47 + +ModInv = 17 +A = 22 +M = 47 + +ModInv = 45 +A = 23 +M = 47 + +ModInv = 2 +A = 24 +M = 47 + +ModInv = 30 +A = 25 +M = 47 + +ModInv = 2b +A = 26 +M = 47 + +ModInv = 33 +A = 27 +M = 47 + +ModInv = 10 +A = 28 +M = 47 + +ModInv = 1a +A = 29 +M = 47 + +ModInv = 16 +A = 2a +M = 47 + +ModInv = 26 +A = 2b +M = 47 + +ModInv = 15 +A = 2c +M = 47 + +ModInv = 1e +A = 2d +M = 47 + +ModInv = 11 +A = 2e +M = 47 + +ModInv = 44 +A = 2f +M = 47 + +ModInv = 25 +A = 30 +M = 47 + +ModInv = 1d +A = 31 +M = 47 + +ModInv = 1b +A = 32 +M = 47 + +ModInv = 27 +A = 33 +M = 47 + +ModInv = 38 +A = 34 +M = 47 + +ModInv = 43 +A = 35 +M = 47 + +ModInv = 19 +A = 36 +M = 47 + +ModInv = 1f +A = 37 +M = 47 + +ModInv = 34 +A = 38 +M = 47 + +ModInv = 5 +A = 39 +M = 47 + +ModInv = 3c +A = 3a +M = 47 + +ModInv = 41 +A = 3b +M = 47 + +ModInv = 3a +A = 3c +M = 47 + +ModInv = 7 +A = 3d +M = 47 + +ModInv = 3f +A = 3e +M = 47 + +ModInv = 3e +A = 3f +M = 47 + +ModInv = a +A = 40 +M = 47 + +ModInv = 3b +A = 41 +M = 47 + +ModInv = e +A = 42 +M = 47 + +ModInv = 35 +A = 43 +M = 47 + +ModInv = 2f +A = 44 +M = 47 + +ModInv = 23 +A = 45 +M = 47 + +ModInv = 46 +A = 46 +M = 47 + +ModInv = 1 +A = 48 +M = 47 + +ModInv = 24 +A = 49 +M = 47 + +ModInv = 18 +A = 4a +M = 47 + +ModInv = 12 +A = 4b +M = 47 + +ModInv = 39 +A = 4c +M = 47 + +ModInv = c +A = 4d +M = 47 + +ModInv = 3d +A = 4e +M = 47 + +ModInv = 9 +A = 4f +M = 47 + +ModInv = 8 +A = 50 +M = 47 + +ModInv = 40 +A = 51 +M = 47 + +ModInv = d +A = 52 +M = 47 + +ModInv = 6 +A = 53 +M = 47 + +ModInv = b +A = 54 +M = 47 + +ModInv = 42 +A = 55 +M = 47 + +ModInv = 13 +A = 56 +M = 47 + +ModInv = 28 +A = 57 +M = 47 + +ModInv = 2e +A = 58 +M = 47 + +ModInv = 4 +A = 59 +M = 47 + +ModInv = f +A = 5a +M = 47 + +ModInv = 20 +A = 5b +M = 47 + +ModInv = 2c +A = 5c +M = 47 + +ModInv = 2a +A = 5d +M = 47 + +ModInv = 22 +A = 5e +M = 47 + +ModInv = 3 +A = 5f +M = 47 + +ModInv = 36 +A = 60 +M = 47 + +ModInv = 29 +A = 61 +M = 47 + +ModInv = 32 +A = 62 +M = 47 + +ModInv = 21 +A = 63 +M = 47 + +ModInv = 17 +A = -61 +M = 48 + +ModInv = 19 +A = -5f +M = 48 + +ModInv = 35 +A = -5b +M = 48 + +ModInv = 37 +A = -59 +M = 48 + +ModInv = b +A = -55 +M = 48 + +ModInv = d +A = -53 +M = 48 + +ModInv = 29 +A = -4f +M = 48 + +ModInv = 2b +A = -4d +M = 48 + +ModInv = 47 +A = -49 +M = 48 + +ModInv = 1 +A = -47 +M = 48 + +ModInv = 1d +A = -43 +M = 48 + +ModInv = 1f +A = -41 +M = 48 + +ModInv = 3b +A = -3d +M = 48 + +ModInv = 3d +A = -3b +M = 48 + +ModInv = 11 +A = -37 +M = 48 + +ModInv = 13 +A = -35 +M = 48 + +ModInv = 2f +A = -31 +M = 48 + +ModInv = 31 +A = -2f +M = 48 + +ModInv = 5 +A = -2b +M = 48 + +ModInv = 7 +A = -29 +M = 48 + +ModInv = 23 +A = -25 +M = 48 + +ModInv = 25 +A = -23 +M = 48 + +ModInv = 41 +A = -1f +M = 48 + +ModInv = 43 +A = -1d +M = 48 + +ModInv = 17 +A = -19 +M = 48 + +ModInv = 19 +A = -17 +M = 48 + +ModInv = 35 +A = -13 +M = 48 + +ModInv = 37 +A = -11 +M = 48 + +ModInv = b +A = -d +M = 48 + +ModInv = d +A = -b +M = 48 + +ModInv = 29 +A = -7 +M = 48 + +ModInv = 2b +A = -5 +M = 48 + +ModInv = 47 +A = -1 +M = 48 + +ModInv = 1 +A = 1 +M = 48 + +ModInv = 1d +A = 5 +M = 48 + +ModInv = 1f +A = 7 +M = 48 + +ModInv = 3b +A = b +M = 48 + +ModInv = 3d +A = d +M = 48 + +ModInv = 11 +A = 11 +M = 48 + +ModInv = 13 +A = 13 +M = 48 + +ModInv = 2f +A = 17 +M = 48 + +ModInv = 31 +A = 19 +M = 48 + +ModInv = 5 +A = 1d +M = 48 + +ModInv = 7 +A = 1f +M = 48 + +ModInv = 23 +A = 23 +M = 48 + +ModInv = 25 +A = 25 +M = 48 + +ModInv = 41 +A = 29 +M = 48 + +ModInv = 43 +A = 2b +M = 48 + +ModInv = 17 +A = 2f +M = 48 + +ModInv = 19 +A = 31 +M = 48 + +ModInv = 35 +A = 35 +M = 48 + +ModInv = 37 +A = 37 +M = 48 + +ModInv = b +A = 3b +M = 48 + +ModInv = d +A = 3d +M = 48 + +ModInv = 29 +A = 41 +M = 48 + +ModInv = 2b +A = 43 +M = 48 + +ModInv = 47 +A = 47 +M = 48 + +ModInv = 1 +A = 49 +M = 48 + +ModInv = 1d +A = 4d +M = 48 + +ModInv = 1f +A = 4f +M = 48 + +ModInv = 3b +A = 53 +M = 48 + +ModInv = 3d +A = 55 +M = 48 + +ModInv = 11 +A = 59 +M = 48 + +ModInv = 13 +A = 5b +M = 48 + +ModInv = 2f +A = 5f +M = 48 + +ModInv = 31 +A = 61 +M = 48 + +ModInv = 1b +A = -64 +M = 49 + +ModInv = e +A = -63 +M = 49 + +ModInv = 23 +A = -62 +M = 49 + +ModInv = 3 +A = -61 +M = 49 + +ModInv = 13 +A = -60 +M = 49 + +ModInv = 3f +A = -5f +M = 49 + +ModInv = 42 +A = -5e +M = 49 + +ModInv = 3e +A = -5d +M = 49 + +ModInv = 17 +A = -5c +M = 49 + +ModInv = 4 +A = -5b +M = 49 + +ModInv = 1e +A = -5a +M = 49 + +ModInv = 29 +A = -59 +M = 49 + +ModInv = 22 +A = -58 +M = 49 + +ModInv = 1a +A = -57 +M = 49 + +ModInv = 1c +A = -56 +M = 49 + +ModInv = 6 +A = -55 +M = 49 + +ModInv = 35 +A = -54 +M = 49 + +ModInv = 33 +A = -53 +M = 49 + +ModInv = 8 +A = -52 +M = 49 + +ModInv = 9 +A = -51 +M = 49 + +ModInv = 34 +A = -50 +M = 49 + +ModInv = c +A = -4f +M = 49 + +ModInv = 1d +A = -4e +M = 49 + +ModInv = 12 +A = -4d +M = 49 + +ModInv = 18 +A = -4c +M = 49 + +ModInv = 24 +A = -4b +M = 49 + +ModInv = 48 +A = -4a +M = 49 + +ModInv = 1 +A = -48 +M = 49 + +ModInv = 25 +A = -47 +M = 49 + +ModInv = 31 +A = -46 +M = 49 + +ModInv = 37 +A = -45 +M = 49 + +ModInv = 2c +A = -44 +M = 49 + +ModInv = 3d +A = -43 +M = 49 + +ModInv = 15 +A = -42 +M = 49 + +ModInv = 40 +A = -41 +M = 49 + +ModInv = 41 +A = -40 +M = 49 + +ModInv = 16 +A = -3f +M = 49 + +ModInv = 14 +A = -3e +M = 49 + +ModInv = 43 +A = -3d +M = 49 + +ModInv = 2d +A = -3c +M = 49 + +ModInv = 2f +A = -3b +M = 49 + +ModInv = 27 +A = -3a +M = 49 + +ModInv = 20 +A = -39 +M = 49 + +ModInv = 2b +A = -38 +M = 49 + +ModInv = 45 +A = -37 +M = 49 + +ModInv = 32 +A = -36 +M = 49 + +ModInv = b +A = -35 +M = 49 + +ModInv = 7 +A = -34 +M = 49 + +ModInv = a +A = -33 +M = 49 + +ModInv = 36 +A = -32 +M = 49 + +ModInv = 46 +A = -31 +M = 49 + +ModInv = 26 +A = -30 +M = 49 + +ModInv = 3b +A = -2f +M = 49 + +ModInv = 2e +A = -2e +M = 49 + +ModInv = 3c +A = -2d +M = 49 + +ModInv = 44 +A = -2c +M = 49 + +ModInv = 38 +A = -2b +M = 49 + +ModInv = 21 +A = -2a +M = 49 + +ModInv = 10 +A = -29 +M = 49 + +ModInv = 1f +A = -28 +M = 49 + +ModInv = 3a +A = -27 +M = 49 + +ModInv = 30 +A = -26 +M = 49 + +ModInv = 47 +A = -25 +M = 49 + +ModInv = 2 +A = -24 +M = 49 + +ModInv = 19 +A = -23 +M = 49 + +ModInv = f +A = -22 +M = 49 + +ModInv = 2a +A = -21 +M = 49 + +ModInv = 39 +A = -20 +M = 49 + +ModInv = 28 +A = -1f +M = 49 + +ModInv = 11 +A = -1e +M = 49 + +ModInv = 5 +A = -1d +M = 49 + +ModInv = d +A = -1c +M = 49 + +ModInv = 1b +A = -1b +M = 49 + +ModInv = e +A = -1a +M = 49 + +ModInv = 23 +A = -19 +M = 49 + +ModInv = 3 +A = -18 +M = 49 + +ModInv = 13 +A = -17 +M = 49 + +ModInv = 3f +A = -16 +M = 49 + +ModInv = 42 +A = -15 +M = 49 + +ModInv = 3e +A = -14 +M = 49 + +ModInv = 17 +A = -13 +M = 49 + +ModInv = 4 +A = -12 +M = 49 + +ModInv = 1e +A = -11 +M = 49 + +ModInv = 29 +A = -10 +M = 49 + +ModInv = 22 +A = -f +M = 49 + +ModInv = 1a +A = -e +M = 49 + +ModInv = 1c +A = -d +M = 49 + +ModInv = 6 +A = -c +M = 49 + +ModInv = 35 +A = -b +M = 49 + +ModInv = 33 +A = -a +M = 49 + +ModInv = 8 +A = -9 +M = 49 + +ModInv = 9 +A = -8 +M = 49 + +ModInv = 34 +A = -7 +M = 49 + +ModInv = c +A = -6 +M = 49 + +ModInv = 1d +A = -5 +M = 49 + +ModInv = 12 +A = -4 +M = 49 + +ModInv = 18 +A = -3 +M = 49 + +ModInv = 24 +A = -2 +M = 49 + +ModInv = 48 +A = -1 +M = 49 + +ModInv = 1 +A = 1 +M = 49 + +ModInv = 25 +A = 2 +M = 49 + +ModInv = 31 +A = 3 +M = 49 + +ModInv = 37 +A = 4 +M = 49 + +ModInv = 2c +A = 5 +M = 49 + +ModInv = 3d +A = 6 +M = 49 + +ModInv = 15 +A = 7 +M = 49 + +ModInv = 40 +A = 8 +M = 49 + +ModInv = 41 +A = 9 +M = 49 + +ModInv = 16 +A = a +M = 49 + +ModInv = 14 +A = b +M = 49 + +ModInv = 43 +A = c +M = 49 + +ModInv = 2d +A = d +M = 49 + +ModInv = 2f +A = e +M = 49 + +ModInv = 27 +A = f +M = 49 + +ModInv = 20 +A = 10 +M = 49 + +ModInv = 2b +A = 11 +M = 49 + +ModInv = 45 +A = 12 +M = 49 + +ModInv = 32 +A = 13 +M = 49 + +ModInv = b +A = 14 +M = 49 + +ModInv = 7 +A = 15 +M = 49 + +ModInv = a +A = 16 +M = 49 + +ModInv = 36 +A = 17 +M = 49 + +ModInv = 46 +A = 18 +M = 49 + +ModInv = 26 +A = 19 +M = 49 + +ModInv = 3b +A = 1a +M = 49 + +ModInv = 2e +A = 1b +M = 49 + +ModInv = 3c +A = 1c +M = 49 + +ModInv = 44 +A = 1d +M = 49 + +ModInv = 38 +A = 1e +M = 49 + +ModInv = 21 +A = 1f +M = 49 + +ModInv = 10 +A = 20 +M = 49 + +ModInv = 1f +A = 21 +M = 49 + +ModInv = 3a +A = 22 +M = 49 + +ModInv = 30 +A = 23 +M = 49 + +ModInv = 47 +A = 24 +M = 49 + +ModInv = 2 +A = 25 +M = 49 + +ModInv = 19 +A = 26 +M = 49 + +ModInv = f +A = 27 +M = 49 + +ModInv = 2a +A = 28 +M = 49 + +ModInv = 39 +A = 29 +M = 49 + +ModInv = 28 +A = 2a +M = 49 + +ModInv = 11 +A = 2b +M = 49 + +ModInv = 5 +A = 2c +M = 49 + +ModInv = d +A = 2d +M = 49 + +ModInv = 1b +A = 2e +M = 49 + +ModInv = e +A = 2f +M = 49 + +ModInv = 23 +A = 30 +M = 49 + +ModInv = 3 +A = 31 +M = 49 + +ModInv = 13 +A = 32 +M = 49 + +ModInv = 3f +A = 33 +M = 49 + +ModInv = 42 +A = 34 +M = 49 + +ModInv = 3e +A = 35 +M = 49 + +ModInv = 17 +A = 36 +M = 49 + +ModInv = 4 +A = 37 +M = 49 + +ModInv = 1e +A = 38 +M = 49 + +ModInv = 29 +A = 39 +M = 49 + +ModInv = 22 +A = 3a +M = 49 + +ModInv = 1a +A = 3b +M = 49 + +ModInv = 1c +A = 3c +M = 49 + +ModInv = 6 +A = 3d +M = 49 + +ModInv = 35 +A = 3e +M = 49 + +ModInv = 33 +A = 3f +M = 49 + +ModInv = 8 +A = 40 +M = 49 + +ModInv = 9 +A = 41 +M = 49 + +ModInv = 34 +A = 42 +M = 49 + +ModInv = c +A = 43 +M = 49 + +ModInv = 1d +A = 44 +M = 49 + +ModInv = 12 +A = 45 +M = 49 + +ModInv = 18 +A = 46 +M = 49 + +ModInv = 24 +A = 47 +M = 49 + +ModInv = 48 +A = 48 +M = 49 + +ModInv = 1 +A = 4a +M = 49 + +ModInv = 25 +A = 4b +M = 49 + +ModInv = 31 +A = 4c +M = 49 + +ModInv = 37 +A = 4d +M = 49 + +ModInv = 2c +A = 4e +M = 49 + +ModInv = 3d +A = 4f +M = 49 + +ModInv = 15 +A = 50 +M = 49 + +ModInv = 40 +A = 51 +M = 49 + +ModInv = 41 +A = 52 +M = 49 + +ModInv = 16 +A = 53 +M = 49 + +ModInv = 14 +A = 54 +M = 49 + +ModInv = 43 +A = 55 +M = 49 + +ModInv = 2d +A = 56 +M = 49 + +ModInv = 2f +A = 57 +M = 49 + +ModInv = 27 +A = 58 +M = 49 + +ModInv = 20 +A = 59 +M = 49 + +ModInv = 2b +A = 5a +M = 49 + +ModInv = 45 +A = 5b +M = 49 + +ModInv = 32 +A = 5c +M = 49 + +ModInv = b +A = 5d +M = 49 + +ModInv = 7 +A = 5e +M = 49 + +ModInv = a +A = 5f +M = 49 + +ModInv = 36 +A = 60 +M = 49 + +ModInv = 46 +A = 61 +M = 49 + +ModInv = 26 +A = 62 +M = 49 + +ModInv = 3b +A = 63 +M = 49 + +ModInv = 47 +A = -63 +M = 4a + +ModInv = 2d +A = -61 +M = 4a + +ModInv = 7 +A = -5f +M = 4a + +ModInv = 23 +A = -5d +M = 4a + +ModInv = d +A = -5b +M = 4a + +ModInv = 45 +A = -59 +M = 4a + +ModInv = 11 +A = -57 +M = 4a + +ModInv = 2f +A = -55 +M = 4a + +ModInv = 29 +A = -53 +M = 4a + +ModInv = 15 +A = -51 +M = 4a + +ModInv = 3b +A = -4f +M = 4a + +ModInv = 31 +A = -4d +M = 4a + +ModInv = 49 +A = -4b +M = 4a + +ModInv = 1 +A = -49 +M = 4a + +ModInv = 19 +A = -47 +M = 4a + +ModInv = f +A = -45 +M = 4a + +ModInv = 35 +A = -43 +M = 4a + +ModInv = 21 +A = -41 +M = 4a + +ModInv = 1b +A = -3f +M = 4a + +ModInv = 39 +A = -3d +M = 4a + +ModInv = 5 +A = -3b +M = 4a + +ModInv = 3d +A = -39 +M = 4a + +ModInv = 27 +A = -37 +M = 4a + +ModInv = 43 +A = -35 +M = 4a + +ModInv = 1d +A = -33 +M = 4a + +ModInv = 3 +A = -31 +M = 4a + +ModInv = b +A = -2f +M = 4a + +ModInv = 17 +A = -2d +M = 4a + +ModInv = 2b +A = -2b +M = 4a + +ModInv = 9 +A = -29 +M = 4a + +ModInv = 37 +A = -27 +M = 4a + +ModInv = 13 +A = -23 +M = 4a + +ModInv = 41 +A = -21 +M = 4a + +ModInv = 1f +A = -1f +M = 4a + +ModInv = 33 +A = -1d +M = 4a + +ModInv = 3f +A = -1b +M = 4a + +ModInv = 47 +A = -19 +M = 4a + +ModInv = 2d +A = -17 +M = 4a + +ModInv = 7 +A = -15 +M = 4a + +ModInv = 23 +A = -13 +M = 4a + +ModInv = d +A = -11 +M = 4a + +ModInv = 45 +A = -f +M = 4a + +ModInv = 11 +A = -d +M = 4a + +ModInv = 2f +A = -b +M = 4a + +ModInv = 29 +A = -9 +M = 4a + +ModInv = 15 +A = -7 +M = 4a + +ModInv = 3b +A = -5 +M = 4a + +ModInv = 31 +A = -3 +M = 4a + +ModInv = 49 +A = -1 +M = 4a + +ModInv = 1 +A = 1 +M = 4a + +ModInv = 19 +A = 3 +M = 4a + +ModInv = f +A = 5 +M = 4a + +ModInv = 35 +A = 7 +M = 4a + +ModInv = 21 +A = 9 +M = 4a + +ModInv = 1b +A = b +M = 4a + +ModInv = 39 +A = d +M = 4a + +ModInv = 5 +A = f +M = 4a + +ModInv = 3d +A = 11 +M = 4a + +ModInv = 27 +A = 13 +M = 4a + +ModInv = 43 +A = 15 +M = 4a + +ModInv = 1d +A = 17 +M = 4a + +ModInv = 3 +A = 19 +M = 4a + +ModInv = b +A = 1b +M = 4a + +ModInv = 17 +A = 1d +M = 4a + +ModInv = 2b +A = 1f +M = 4a + +ModInv = 9 +A = 21 +M = 4a + +ModInv = 37 +A = 23 +M = 4a + +ModInv = 13 +A = 27 +M = 4a + +ModInv = 41 +A = 29 +M = 4a + +ModInv = 1f +A = 2b +M = 4a + +ModInv = 33 +A = 2d +M = 4a + +ModInv = 3f +A = 2f +M = 4a + +ModInv = 47 +A = 31 +M = 4a + +ModInv = 2d +A = 33 +M = 4a + +ModInv = 7 +A = 35 +M = 4a + +ModInv = 23 +A = 37 +M = 4a + +ModInv = d +A = 39 +M = 4a + +ModInv = 45 +A = 3b +M = 4a + +ModInv = 11 +A = 3d +M = 4a + +ModInv = 2f +A = 3f +M = 4a + +ModInv = 29 +A = 41 +M = 4a + +ModInv = 15 +A = 43 +M = 4a + +ModInv = 3b +A = 45 +M = 4a + +ModInv = 31 +A = 47 +M = 4a + +ModInv = 49 +A = 49 +M = 4a + +ModInv = 1 +A = 4b +M = 4a + +ModInv = 19 +A = 4d +M = 4a + +ModInv = f +A = 4f +M = 4a + +ModInv = 35 +A = 51 +M = 4a + +ModInv = 21 +A = 53 +M = 4a + +ModInv = 1b +A = 55 +M = 4a + +ModInv = 39 +A = 57 +M = 4a + +ModInv = 5 +A = 59 +M = 4a + +ModInv = 3d +A = 5b +M = 4a + +ModInv = 27 +A = 5d +M = 4a + +ModInv = 43 +A = 5f +M = 4a + +ModInv = 1d +A = 61 +M = 4a + +ModInv = 3 +A = 63 +M = 4a + +ModInv = d +A = -62 +M = 4b + +ModInv = 11 +A = -61 +M = 4b + +ModInv = 47 +A = -5e +M = 4b + +ModInv = 16 +A = -5c +M = 4b + +ModInv = e +A = -5b +M = 4b + +ModInv = 10 +A = -59 +M = 4b + +ModInv = 17 +A = -58 +M = 4b + +ModInv = 22 +A = -56 +M = 4b + +ModInv = 1c +A = -53 +M = 4b + +ModInv = 20 +A = -52 +M = 4b + +ModInv = 38 +A = -4f +M = 4b + +ModInv = 25 +A = -4d +M = 4b + +ModInv = 4a +A = -4c +M = 4b + +ModInv = 1 +A = -4a +M = 4b + +ModInv = 26 +A = -49 +M = 4b + +ModInv = 13 +A = -47 +M = 4b + +ModInv = 2b +A = -44 +M = 4b + +ModInv = 2f +A = -43 +M = 4b + +ModInv = 29 +A = -40 +M = 4b + +ModInv = 34 +A = -3e +M = 4b + +ModInv = 3b +A = -3d +M = 4b + +ModInv = 3d +A = -3b +M = 4b + +ModInv = 35 +A = -3a +M = 4b + +ModInv = 4 +A = -38 +M = 4b + +ModInv = 3a +A = -35 +M = 4b + +ModInv = 3e +A = -34 +M = 4b + +ModInv = 1a +A = -31 +M = 4b + +ModInv = 43 +A = -2f +M = 4b + +ModInv = 2c +A = -2e +M = 4b + +ModInv = 2e +A = -2c +M = 4b + +ModInv = 44 +A = -2b +M = 4b + +ModInv = 40 +A = -29 +M = 4b + +ModInv = 49 +A = -26 +M = 4b + +ModInv = 2 +A = -25 +M = 4b + +ModInv = b +A = -22 +M = 4b + +ModInv = 7 +A = -20 +M = 4b + +ModInv = 1d +A = -1f +M = 4b + +ModInv = 1f +A = -1d +M = 4b + +ModInv = 8 +A = -1c +M = 4b + +ModInv = 31 +A = -1a +M = 4b + +ModInv = d +A = -17 +M = 4b + +ModInv = 11 +A = -16 +M = 4b + +ModInv = 47 +A = -13 +M = 4b + +ModInv = 16 +A = -11 +M = 4b + +ModInv = e +A = -10 +M = 4b + +ModInv = 10 +A = -e +M = 4b + +ModInv = 17 +A = -d +M = 4b + +ModInv = 22 +A = -b +M = 4b + +ModInv = 1c +A = -8 +M = 4b + +ModInv = 20 +A = -7 +M = 4b + +ModInv = 38 +A = -4 +M = 4b + +ModInv = 25 +A = -2 +M = 4b + +ModInv = 4a +A = -1 +M = 4b + +ModInv = 1 +A = 1 +M = 4b + +ModInv = 26 +A = 2 +M = 4b + +ModInv = 13 +A = 4 +M = 4b + +ModInv = 2b +A = 7 +M = 4b + +ModInv = 2f +A = 8 +M = 4b + +ModInv = 29 +A = b +M = 4b + +ModInv = 34 +A = d +M = 4b + +ModInv = 3b +A = e +M = 4b + +ModInv = 3d +A = 10 +M = 4b + +ModInv = 35 +A = 11 +M = 4b + +ModInv = 4 +A = 13 +M = 4b + +ModInv = 3a +A = 16 +M = 4b + +ModInv = 3e +A = 17 +M = 4b + +ModInv = 1a +A = 1a +M = 4b + +ModInv = 43 +A = 1c +M = 4b + +ModInv = 2c +A = 1d +M = 4b + +ModInv = 2e +A = 1f +M = 4b + +ModInv = 44 +A = 20 +M = 4b + +ModInv = 40 +A = 22 +M = 4b + +ModInv = 49 +A = 25 +M = 4b + +ModInv = 2 +A = 26 +M = 4b + +ModInv = b +A = 29 +M = 4b + +ModInv = 7 +A = 2b +M = 4b + +ModInv = 1d +A = 2c +M = 4b + +ModInv = 1f +A = 2e +M = 4b + +ModInv = 8 +A = 2f +M = 4b + +ModInv = 31 +A = 31 +M = 4b + +ModInv = d +A = 34 +M = 4b + +ModInv = 11 +A = 35 +M = 4b + +ModInv = 47 +A = 38 +M = 4b + +ModInv = 16 +A = 3a +M = 4b + +ModInv = e +A = 3b +M = 4b + +ModInv = 10 +A = 3d +M = 4b + +ModInv = 17 +A = 3e +M = 4b + +ModInv = 22 +A = 40 +M = 4b + +ModInv = 1c +A = 43 +M = 4b + +ModInv = 20 +A = 44 +M = 4b + +ModInv = 38 +A = 47 +M = 4b + +ModInv = 25 +A = 49 +M = 4b + +ModInv = 4a +A = 4a +M = 4b + +ModInv = 1 +A = 4c +M = 4b + +ModInv = 26 +A = 4d +M = 4b + +ModInv = 13 +A = 4f +M = 4b + +ModInv = 2b +A = 52 +M = 4b + +ModInv = 2f +A = 53 +M = 4b + +ModInv = 29 +A = 56 +M = 4b + +ModInv = 34 +A = 58 +M = 4b + +ModInv = 3b +A = 59 +M = 4b + +ModInv = 3d +A = 5b +M = 4b + +ModInv = 35 +A = 5c +M = 4b + +ModInv = 4 +A = 5e +M = 4b + +ModInv = 3a +A = 61 +M = 4b + +ModInv = 3e +A = 62 +M = 4b + +ModInv = 21 +A = -63 +M = 4c + +ModInv = 2f +A = -61 +M = 4c + +ModInv = 43 +A = -5d +M = 4c + +ModInv = 5 +A = -5b +M = 4c + +ModInv = 23 +A = -59 +M = 4c + +ModInv = 45 +A = -57 +M = 4c + +ModInv = 3b +A = -55 +M = 4c + +ModInv = 41 +A = -53 +M = 4c + +ModInv = f +A = -51 +M = 4c + +ModInv = 19 +A = -4f +M = 4c + +ModInv = 4b +A = -4d +M = 4c + +ModInv = 1 +A = -4b +M = 4c + +ModInv = 33 +A = -49 +M = 4c + +ModInv = 3d +A = -47 +M = 4c + +ModInv = b +A = -45 +M = 4c + +ModInv = 11 +A = -43 +M = 4c + +ModInv = 7 +A = -41 +M = 4c + +ModInv = 29 +A = -3f +M = 4c + +ModInv = 47 +A = -3d +M = 4c + +ModInv = 9 +A = -3b +M = 4c + +ModInv = 1d +A = -37 +M = 4c + +ModInv = 2b +A = -35 +M = 4c + +ModInv = 49 +A = -33 +M = 4c + +ModInv = 1f +A = -31 +M = 4c + +ModInv = 15 +A = -2f +M = 4c + +ModInv = 1b +A = -2d +M = 4c + +ModInv = 35 +A = -2b +M = 4c + +ModInv = 3f +A = -29 +M = 4c + +ModInv = 25 +A = -27 +M = 4c + +ModInv = 27 +A = -25 +M = 4c + +ModInv = d +A = -23 +M = 4c + +ModInv = 17 +A = -21 +M = 4c + +ModInv = 31 +A = -1f +M = 4c + +ModInv = 37 +A = -1d +M = 4c + +ModInv = 2d +A = -1b +M = 4c + +ModInv = 3 +A = -19 +M = 4c + +ModInv = 21 +A = -17 +M = 4c + +ModInv = 2f +A = -15 +M = 4c + +ModInv = 43 +A = -11 +M = 4c + +ModInv = 5 +A = -f +M = 4c + +ModInv = 23 +A = -d +M = 4c + +ModInv = 45 +A = -b +M = 4c + +ModInv = 3b +A = -9 +M = 4c + +ModInv = 41 +A = -7 +M = 4c + +ModInv = f +A = -5 +M = 4c + +ModInv = 19 +A = -3 +M = 4c + +ModInv = 4b +A = -1 +M = 4c + +ModInv = 1 +A = 1 +M = 4c + +ModInv = 33 +A = 3 +M = 4c + +ModInv = 3d +A = 5 +M = 4c + +ModInv = b +A = 7 +M = 4c + +ModInv = 11 +A = 9 +M = 4c + +ModInv = 7 +A = b +M = 4c + +ModInv = 29 +A = d +M = 4c + +ModInv = 47 +A = f +M = 4c + +ModInv = 9 +A = 11 +M = 4c + +ModInv = 1d +A = 15 +M = 4c + +ModInv = 2b +A = 17 +M = 4c + +ModInv = 49 +A = 19 +M = 4c + +ModInv = 1f +A = 1b +M = 4c + +ModInv = 15 +A = 1d +M = 4c + +ModInv = 1b +A = 1f +M = 4c + +ModInv = 35 +A = 21 +M = 4c + +ModInv = 3f +A = 23 +M = 4c + +ModInv = 25 +A = 25 +M = 4c + +ModInv = 27 +A = 27 +M = 4c + +ModInv = d +A = 29 +M = 4c + +ModInv = 17 +A = 2b +M = 4c + +ModInv = 31 +A = 2d +M = 4c + +ModInv = 37 +A = 2f +M = 4c + +ModInv = 2d +A = 31 +M = 4c + +ModInv = 3 +A = 33 +M = 4c + +ModInv = 21 +A = 35 +M = 4c + +ModInv = 2f +A = 37 +M = 4c + +ModInv = 43 +A = 3b +M = 4c + +ModInv = 5 +A = 3d +M = 4c + +ModInv = 23 +A = 3f +M = 4c + +ModInv = 45 +A = 41 +M = 4c + +ModInv = 3b +A = 43 +M = 4c + +ModInv = 41 +A = 45 +M = 4c + +ModInv = f +A = 47 +M = 4c + +ModInv = 19 +A = 49 +M = 4c + +ModInv = 4b +A = 4b +M = 4c + +ModInv = 1 +A = 4d +M = 4c + +ModInv = 33 +A = 4f +M = 4c + +ModInv = 3d +A = 51 +M = 4c + +ModInv = b +A = 53 +M = 4c + +ModInv = 11 +A = 55 +M = 4c + +ModInv = 7 +A = 57 +M = 4c + +ModInv = 29 +A = 59 +M = 4c + +ModInv = 47 +A = 5b +M = 4c + +ModInv = 9 +A = 5d +M = 4c + +ModInv = 1d +A = 61 +M = 4c + +ModInv = 2b +A = 63 +M = 4c + +ModInv = a +A = -64 +M = 4d + +ModInv = 32 +A = -61 +M = 4d + +ModInv = 4 +A = -60 +M = 4d + +ModInv = 2f +A = -5f +M = 4d + +ModInv = 9 +A = -5e +M = 4d + +ModInv = 18 +A = -5d +M = 4d + +ModInv = 29 +A = -5c +M = 4d + +ModInv = 47 +A = -5a +M = 4d + +ModInv = 20 +A = -59 +M = 4d + +ModInv = 17 +A = -57 +M = 4d + +ModInv = 11 +A = -56 +M = 4d + +ModInv = 30 +A = -55 +M = 4d + +ModInv = 40 +A = -53 +M = 4d + +ModInv = 2e +A = -52 +M = 4d + +ModInv = 13 +A = -51 +M = 4d + +ModInv = 33 +A = -50 +M = 4d + +ModInv = 26 +A = -4f +M = 4d + +ModInv = 4c +A = -4e +M = 4d + +ModInv = 1 +A = -4c +M = 4d + +ModInv = 27 +A = -4b +M = 4d + +ModInv = 1a +A = -4a +M = 4d + +ModInv = 3a +A = -49 +M = 4d + +ModInv = 1f +A = -48 +M = 4d + +ModInv = d +A = -47 +M = 4d + +ModInv = 1d +A = -45 +M = 4d + +ModInv = 3c +A = -44 +M = 4d + +ModInv = 36 +A = -43 +M = 4d + +ModInv = 2d +A = -41 +M = 4d + +ModInv = 6 +A = -40 +M = 4d + +ModInv = 24 +A = -3e +M = 4d + +ModInv = 35 +A = -3d +M = 4d + +ModInv = 44 +A = -3c +M = 4d + +ModInv = 1e +A = -3b +M = 4d + +ModInv = 49 +A = -3a +M = 4d + +ModInv = 1b +A = -39 +M = 4d + +ModInv = 43 +A = -36 +M = 4d + +ModInv = 3d +A = -35 +M = 4d + +ModInv = 25 +A = -34 +M = 4d + +ModInv = 3 +A = -33 +M = 4d + +ModInv = 14 +A = -32 +M = 4d + +ModInv = 8 +A = -30 +M = 4d + +ModInv = 12 +A = -2f +M = 4d + +ModInv = 5 +A = -2e +M = 4d + +ModInv = 41 +A = -2d +M = 4d + +ModInv = 22 +A = -2b +M = 4d + +ModInv = f +A = -29 +M = 4d + +ModInv = 19 +A = -28 +M = 4d + +ModInv = 4b +A = -27 +M = 4d + +ModInv = 2 +A = -26 +M = 4d + +ModInv = 34 +A = -25 +M = 4d + +ModInv = 3e +A = -24 +M = 4d + +ModInv = 2b +A = -22 +M = 4d + +ModInv = c +A = -20 +M = 4d + +ModInv = 48 +A = -1f +M = 4d + +ModInv = 3b +A = -1e +M = 4d + +ModInv = 45 +A = -1d +M = 4d + +ModInv = 39 +A = -1b +M = 4d + +ModInv = 4a +A = -1a +M = 4d + +ModInv = 28 +A = -19 +M = 4d + +ModInv = 10 +A = -18 +M = 4d + +ModInv = a +A = -17 +M = 4d + +ModInv = 32 +A = -14 +M = 4d + +ModInv = 4 +A = -13 +M = 4d + +ModInv = 2f +A = -12 +M = 4d + +ModInv = 9 +A = -11 +M = 4d + +ModInv = 18 +A = -10 +M = 4d + +ModInv = 29 +A = -f +M = 4d + +ModInv = 47 +A = -d +M = 4d + +ModInv = 20 +A = -c +M = 4d + +ModInv = 17 +A = -a +M = 4d + +ModInv = 11 +A = -9 +M = 4d + +ModInv = 30 +A = -8 +M = 4d + +ModInv = 40 +A = -6 +M = 4d + +ModInv = 2e +A = -5 +M = 4d + +ModInv = 13 +A = -4 +M = 4d + +ModInv = 33 +A = -3 +M = 4d + +ModInv = 26 +A = -2 +M = 4d + +ModInv = 4c +A = -1 +M = 4d + +ModInv = 1 +A = 1 +M = 4d + +ModInv = 27 +A = 2 +M = 4d + +ModInv = 1a +A = 3 +M = 4d + +ModInv = 3a +A = 4 +M = 4d + +ModInv = 1f +A = 5 +M = 4d + +ModInv = d +A = 6 +M = 4d + +ModInv = 1d +A = 8 +M = 4d + +ModInv = 3c +A = 9 +M = 4d + +ModInv = 36 +A = a +M = 4d + +ModInv = 2d +A = c +M = 4d + +ModInv = 6 +A = d +M = 4d + +ModInv = 24 +A = f +M = 4d + +ModInv = 35 +A = 10 +M = 4d + +ModInv = 44 +A = 11 +M = 4d + +ModInv = 1e +A = 12 +M = 4d + +ModInv = 49 +A = 13 +M = 4d + +ModInv = 1b +A = 14 +M = 4d + +ModInv = 43 +A = 17 +M = 4d + +ModInv = 3d +A = 18 +M = 4d + +ModInv = 25 +A = 19 +M = 4d + +ModInv = 3 +A = 1a +M = 4d + +ModInv = 14 +A = 1b +M = 4d + +ModInv = 8 +A = 1d +M = 4d + +ModInv = 12 +A = 1e +M = 4d + +ModInv = 5 +A = 1f +M = 4d + +ModInv = 41 +A = 20 +M = 4d + +ModInv = 22 +A = 22 +M = 4d + +ModInv = f +A = 24 +M = 4d + +ModInv = 19 +A = 25 +M = 4d + +ModInv = 4b +A = 26 +M = 4d + +ModInv = 2 +A = 27 +M = 4d + +ModInv = 34 +A = 28 +M = 4d + +ModInv = 3e +A = 29 +M = 4d + +ModInv = 2b +A = 2b +M = 4d + +ModInv = c +A = 2d +M = 4d + +ModInv = 48 +A = 2e +M = 4d + +ModInv = 3b +A = 2f +M = 4d + +ModInv = 45 +A = 30 +M = 4d + +ModInv = 39 +A = 32 +M = 4d + +ModInv = 4a +A = 33 +M = 4d + +ModInv = 28 +A = 34 +M = 4d + +ModInv = 10 +A = 35 +M = 4d + +ModInv = a +A = 36 +M = 4d + +ModInv = 32 +A = 39 +M = 4d + +ModInv = 4 +A = 3a +M = 4d + +ModInv = 2f +A = 3b +M = 4d + +ModInv = 9 +A = 3c +M = 4d + +ModInv = 18 +A = 3d +M = 4d + +ModInv = 29 +A = 3e +M = 4d + +ModInv = 47 +A = 40 +M = 4d + +ModInv = 20 +A = 41 +M = 4d + +ModInv = 17 +A = 43 +M = 4d + +ModInv = 11 +A = 44 +M = 4d + +ModInv = 30 +A = 45 +M = 4d + +ModInv = 40 +A = 47 +M = 4d + +ModInv = 2e +A = 48 +M = 4d + +ModInv = 13 +A = 49 +M = 4d + +ModInv = 33 +A = 4a +M = 4d + +ModInv = 26 +A = 4b +M = 4d + +ModInv = 4c +A = 4c +M = 4d + +ModInv = 1 +A = 4e +M = 4d + +ModInv = 27 +A = 4f +M = 4d + +ModInv = 1a +A = 50 +M = 4d + +ModInv = 3a +A = 51 +M = 4d + +ModInv = 1f +A = 52 +M = 4d + +ModInv = d +A = 53 +M = 4d + +ModInv = 1d +A = 55 +M = 4d + +ModInv = 3c +A = 56 +M = 4d + +ModInv = 36 +A = 57 +M = 4d + +ModInv = 2d +A = 59 +M = 4d + +ModInv = 6 +A = 5a +M = 4d + +ModInv = 24 +A = 5c +M = 4d + +ModInv = 35 +A = 5d +M = 4d + +ModInv = 44 +A = 5e +M = 4d + +ModInv = 1e +A = 5f +M = 4d + +ModInv = 49 +A = 60 +M = 4d + +ModInv = 1b +A = 61 +M = 4d + +ModInv = 29 +A = -61 +M = 4e + +ModInv = 37 +A = -5f +M = 4e + +ModInv = 7 +A = -59 +M = 4e + +ModInv = b +A = -55 +M = 4e + +ModInv = 1f +A = -53 +M = 4e + +ModInv = 4d +A = -4f +M = 4e + +ModInv = 1 +A = -4d +M = 4e + +ModInv = 2f +A = -49 +M = 4e + +ModInv = 43 +A = -47 +M = 4e + +ModInv = 47 +A = -43 +M = 4e + +ModInv = 17 +A = -3d +M = 4e + +ModInv = 25 +A = -3b +M = 4e + +ModInv = 11 +A = -37 +M = 4e + +ModInv = 19 +A = -35 +M = 4e + +ModInv = 23 +A = -31 +M = 4e + +ModInv = 49 +A = -2f +M = 4e + +ModInv = 1d +A = -2b +M = 4e + +ModInv = 13 +A = -29 +M = 4e + +ModInv = 3b +A = -25 +M = 4e + +ModInv = 31 +A = -23 +M = 4e + +ModInv = 5 +A = -1f +M = 4e + +ModInv = 2b +A = -1d +M = 4e + +ModInv = 35 +A = -19 +M = 4e + +ModInv = 3d +A = -17 +M = 4e + +ModInv = 29 +A = -13 +M = 4e + +ModInv = 37 +A = -11 +M = 4e + +ModInv = 7 +A = -b +M = 4e + +ModInv = b +A = -7 +M = 4e + +ModInv = 1f +A = -5 +M = 4e + +ModInv = 4d +A = -1 +M = 4e + +ModInv = 1 +A = 1 +M = 4e + +ModInv = 2f +A = 5 +M = 4e + +ModInv = 43 +A = 7 +M = 4e + +ModInv = 47 +A = b +M = 4e + +ModInv = 17 +A = 11 +M = 4e + +ModInv = 25 +A = 13 +M = 4e + +ModInv = 11 +A = 17 +M = 4e + +ModInv = 19 +A = 19 +M = 4e + +ModInv = 23 +A = 1d +M = 4e + +ModInv = 49 +A = 1f +M = 4e + +ModInv = 1d +A = 23 +M = 4e + +ModInv = 13 +A = 25 +M = 4e + +ModInv = 3b +A = 29 +M = 4e + +ModInv = 31 +A = 2b +M = 4e + +ModInv = 5 +A = 2f +M = 4e + +ModInv = 2b +A = 31 +M = 4e + +ModInv = 35 +A = 35 +M = 4e + +ModInv = 3d +A = 37 +M = 4e + +ModInv = 29 +A = 3b +M = 4e + +ModInv = 37 +A = 3d +M = 4e + +ModInv = 7 +A = 43 +M = 4e + +ModInv = b +A = 47 +M = 4e + +ModInv = 1f +A = 49 +M = 4e + +ModInv = 4d +A = 4d +M = 4e + +ModInv = 1 +A = 4f +M = 4e + +ModInv = 2f +A = 53 +M = 4e + +ModInv = 43 +A = 55 +M = 4e + +ModInv = 47 +A = 59 +M = 4e + +ModInv = 17 +A = 5f +M = 4e + +ModInv = 25 +A = 61 +M = 4e + +ModInv = f +A = -64 +M = 4f + +ModInv = 4b +A = -63 +M = 4f + +ModInv = 36 +A = -62 +M = 4f + +ModInv = 39 +A = -61 +M = 4f + +ModInv = 41 +A = -60 +M = 4f + +ModInv = 4a +A = -5f +M = 4f + +ModInv = 15 +A = -5e +M = 4f + +ModInv = 3e +A = -5d +M = 4f + +ModInv = 6 +A = -5c +M = 4f + +ModInv = 2e +A = -5b +M = 4f + +ModInv = 2b +A = -5a +M = 4f + +ModInv = 47 +A = -59 +M = 4f + +ModInv = 23 +A = -58 +M = 4f + +ModInv = 45 +A = -57 +M = 4f + +ModInv = 2d +A = -56 +M = 4f + +ModInv = d +A = -55 +M = 4f + +ModInv = 3f +A = -54 +M = 4f + +ModInv = 3b +A = -53 +M = 4f + +ModInv = 1a +A = -52 +M = 4f + +ModInv = 27 +A = -51 +M = 4f + +ModInv = 4e +A = -50 +M = 4f + +ModInv = 1 +A = -4e +M = 4f + +ModInv = 28 +A = -4d +M = 4f + +ModInv = 35 +A = -4c +M = 4f + +ModInv = 14 +A = -4b +M = 4f + +ModInv = 10 +A = -4a +M = 4f + +ModInv = 42 +A = -49 +M = 4f + +ModInv = 22 +A = -48 +M = 4f + +ModInv = a +A = -47 +M = 4f + +ModInv = 2c +A = -46 +M = 4f + +ModInv = 8 +A = -45 +M = 4f + +ModInv = 24 +A = -44 +M = 4f + +ModInv = 21 +A = -43 +M = 4f + +ModInv = 49 +A = -42 +M = 4f + +ModInv = 11 +A = -41 +M = 4f + +ModInv = 3a +A = -40 +M = 4f + +ModInv = 5 +A = -3f +M = 4f + +ModInv = e +A = -3e +M = 4f + +ModInv = 16 +A = -3d +M = 4f + +ModInv = 19 +A = -3c +M = 4f + +ModInv = 4 +A = -3b +M = 4f + +ModInv = 40 +A = -3a +M = 4f + +ModInv = 12 +A = -39 +M = 4f + +ModInv = 37 +A = -38 +M = 4f + +ModInv = 38 +A = -37 +M = 4f + +ModInv = 13 +A = -36 +M = 4f + +ModInv = 4c +A = -35 +M = 4f + +ModInv = 29 +A = -34 +M = 4f + +ModInv = 30 +A = -33 +M = 4f + +ModInv = 1e +A = -32 +M = 4f + +ModInv = 1d +A = -31 +M = 4f + +ModInv = 33 +A = -30 +M = 4f + +ModInv = 2a +A = -2f +M = 4f + +ModInv = c +A = -2e +M = 4f + +ModInv = 7 +A = -2d +M = 4f + +ModInv = 46 +A = -2c +M = 4f + +ModInv = b +A = -2b +M = 4f + +ModInv = 2f +A = -2a +M = 4f + +ModInv = 34 +A = -29 +M = 4f + +ModInv = 4d +A = -28 +M = 4f + +ModInv = 2 +A = -27 +M = 4f + +ModInv = 1b +A = -26 +M = 4f + +ModInv = 20 +A = -25 +M = 4f + +ModInv = 44 +A = -24 +M = 4f + +ModInv = 9 +A = -23 +M = 4f + +ModInv = 48 +A = -22 +M = 4f + +ModInv = 43 +A = -21 +M = 4f + +ModInv = 25 +A = -20 +M = 4f + +ModInv = 1c +A = -1f +M = 4f + +ModInv = 32 +A = -1e +M = 4f + +ModInv = 31 +A = -1d +M = 4f + +ModInv = 1f +A = -1c +M = 4f + +ModInv = 26 +A = -1b +M = 4f + +ModInv = 3 +A = -1a +M = 4f + +ModInv = 3c +A = -19 +M = 4f + +ModInv = 17 +A = -18 +M = 4f + +ModInv = 18 +A = -17 +M = 4f + +ModInv = 3d +A = -16 +M = 4f + +ModInv = f +A = -15 +M = 4f + +ModInv = 4b +A = -14 +M = 4f + +ModInv = 36 +A = -13 +M = 4f + +ModInv = 39 +A = -12 +M = 4f + +ModInv = 41 +A = -11 +M = 4f + +ModInv = 4a +A = -10 +M = 4f + +ModInv = 15 +A = -f +M = 4f + +ModInv = 3e +A = -e +M = 4f + +ModInv = 6 +A = -d +M = 4f + +ModInv = 2e +A = -c +M = 4f + +ModInv = 2b +A = -b +M = 4f + +ModInv = 47 +A = -a +M = 4f + +ModInv = 23 +A = -9 +M = 4f + +ModInv = 45 +A = -8 +M = 4f + +ModInv = 2d +A = -7 +M = 4f + +ModInv = d +A = -6 +M = 4f + +ModInv = 3f +A = -5 +M = 4f + +ModInv = 3b +A = -4 +M = 4f + +ModInv = 1a +A = -3 +M = 4f + +ModInv = 27 +A = -2 +M = 4f + +ModInv = 4e +A = -1 +M = 4f + +ModInv = 1 +A = 1 +M = 4f + +ModInv = 28 +A = 2 +M = 4f + +ModInv = 35 +A = 3 +M = 4f + +ModInv = 14 +A = 4 +M = 4f + +ModInv = 10 +A = 5 +M = 4f + +ModInv = 42 +A = 6 +M = 4f + +ModInv = 22 +A = 7 +M = 4f + +ModInv = a +A = 8 +M = 4f + +ModInv = 2c +A = 9 +M = 4f + +ModInv = 8 +A = a +M = 4f + +ModInv = 24 +A = b +M = 4f + +ModInv = 21 +A = c +M = 4f + +ModInv = 49 +A = d +M = 4f + +ModInv = 11 +A = e +M = 4f + +ModInv = 3a +A = f +M = 4f + +ModInv = 5 +A = 10 +M = 4f + +ModInv = e +A = 11 +M = 4f + +ModInv = 16 +A = 12 +M = 4f + +ModInv = 19 +A = 13 +M = 4f + +ModInv = 4 +A = 14 +M = 4f + +ModInv = 40 +A = 15 +M = 4f + +ModInv = 12 +A = 16 +M = 4f + +ModInv = 37 +A = 17 +M = 4f + +ModInv = 38 +A = 18 +M = 4f + +ModInv = 13 +A = 19 +M = 4f + +ModInv = 4c +A = 1a +M = 4f + +ModInv = 29 +A = 1b +M = 4f + +ModInv = 30 +A = 1c +M = 4f + +ModInv = 1e +A = 1d +M = 4f + +ModInv = 1d +A = 1e +M = 4f + +ModInv = 33 +A = 1f +M = 4f + +ModInv = 2a +A = 20 +M = 4f + +ModInv = c +A = 21 +M = 4f + +ModInv = 7 +A = 22 +M = 4f + +ModInv = 46 +A = 23 +M = 4f + +ModInv = b +A = 24 +M = 4f + +ModInv = 2f +A = 25 +M = 4f + +ModInv = 34 +A = 26 +M = 4f + +ModInv = 4d +A = 27 +M = 4f + +ModInv = 2 +A = 28 +M = 4f + +ModInv = 1b +A = 29 +M = 4f + +ModInv = 20 +A = 2a +M = 4f + +ModInv = 44 +A = 2b +M = 4f + +ModInv = 9 +A = 2c +M = 4f + +ModInv = 48 +A = 2d +M = 4f + +ModInv = 43 +A = 2e +M = 4f + +ModInv = 25 +A = 2f +M = 4f + +ModInv = 1c +A = 30 +M = 4f + +ModInv = 32 +A = 31 +M = 4f + +ModInv = 31 +A = 32 +M = 4f + +ModInv = 1f +A = 33 +M = 4f + +ModInv = 26 +A = 34 +M = 4f + +ModInv = 3 +A = 35 +M = 4f + +ModInv = 3c +A = 36 +M = 4f + +ModInv = 17 +A = 37 +M = 4f + +ModInv = 18 +A = 38 +M = 4f + +ModInv = 3d +A = 39 +M = 4f + +ModInv = f +A = 3a +M = 4f + +ModInv = 4b +A = 3b +M = 4f + +ModInv = 36 +A = 3c +M = 4f + +ModInv = 39 +A = 3d +M = 4f + +ModInv = 41 +A = 3e +M = 4f + +ModInv = 4a +A = 3f +M = 4f + +ModInv = 15 +A = 40 +M = 4f + +ModInv = 3e +A = 41 +M = 4f + +ModInv = 6 +A = 42 +M = 4f + +ModInv = 2e +A = 43 +M = 4f + +ModInv = 2b +A = 44 +M = 4f + +ModInv = 47 +A = 45 +M = 4f + +ModInv = 23 +A = 46 +M = 4f + +ModInv = 45 +A = 47 +M = 4f + +ModInv = 2d +A = 48 +M = 4f + +ModInv = d +A = 49 +M = 4f + +ModInv = 3f +A = 4a +M = 4f + +ModInv = 3b +A = 4b +M = 4f + +ModInv = 1a +A = 4c +M = 4f + +ModInv = 27 +A = 4d +M = 4f + +ModInv = 4e +A = 4e +M = 4f + +ModInv = 1 +A = 50 +M = 4f + +ModInv = 28 +A = 51 +M = 4f + +ModInv = 35 +A = 52 +M = 4f + +ModInv = 14 +A = 53 +M = 4f + +ModInv = 10 +A = 54 +M = 4f + +ModInv = 42 +A = 55 +M = 4f + +ModInv = 22 +A = 56 +M = 4f + +ModInv = a +A = 57 +M = 4f + +ModInv = 2c +A = 58 +M = 4f + +ModInv = 8 +A = 59 +M = 4f + +ModInv = 24 +A = 5a +M = 4f + +ModInv = 21 +A = 5b +M = 4f + +ModInv = 49 +A = 5c +M = 4f + +ModInv = 11 +A = 5d +M = 4f + +ModInv = 3a +A = 5e +M = 4f + +ModInv = 5 +A = 5f +M = 4f + +ModInv = e +A = 60 +M = 4f + +ModInv = 16 +A = 61 +M = 4f + +ModInv = 19 +A = 62 +M = 4f + +ModInv = 4 +A = 63 +M = 4f + +ModInv = 15 +A = -63 +M = 50 + +ModInv = 2f +A = -61 +M = 50 + +ModInv = 2b +A = -5d +M = 50 + +ModInv = 1d +A = -5b +M = 50 + +ModInv = 47 +A = -59 +M = 50 + +ModInv = 39 +A = -57 +M = 50 + +ModInv = 35 +A = -53 +M = 50 + +ModInv = 4f +A = -51 +M = 50 + +ModInv = 1 +A = -4f +M = 50 + +ModInv = 1b +A = -4d +M = 50 + +ModInv = 17 +A = -49 +M = 50 + +ModInv = 9 +A = -47 +M = 50 + +ModInv = 33 +A = -45 +M = 50 + +ModInv = 25 +A = -43 +M = 50 + +ModInv = 21 +A = -3f +M = 50 + +ModInv = 3b +A = -3d +M = 50 + +ModInv = 3d +A = -3b +M = 50 + +ModInv = 7 +A = -39 +M = 50 + +ModInv = 3 +A = -35 +M = 50 + +ModInv = 45 +A = -33 +M = 50 + +ModInv = 1f +A = -31 +M = 50 + +ModInv = 11 +A = -2f +M = 50 + +ModInv = d +A = -2b +M = 50 + +ModInv = 27 +A = -29 +M = 50 + +ModInv = 29 +A = -27 +M = 50 + +ModInv = 43 +A = -25 +M = 50 + +ModInv = 3f +A = -21 +M = 50 + +ModInv = 31 +A = -1f +M = 50 + +ModInv = b +A = -1d +M = 50 + +ModInv = 4d +A = -1b +M = 50 + +ModInv = 49 +A = -17 +M = 50 + +ModInv = 13 +A = -15 +M = 50 + +ModInv = 15 +A = -13 +M = 50 + +ModInv = 2f +A = -11 +M = 50 + +ModInv = 2b +A = -d +M = 50 + +ModInv = 1d +A = -b +M = 50 + +ModInv = 47 +A = -9 +M = 50 + +ModInv = 39 +A = -7 +M = 50 + +ModInv = 35 +A = -3 +M = 50 + +ModInv = 4f +A = -1 +M = 50 + +ModInv = 1 +A = 1 +M = 50 + +ModInv = 1b +A = 3 +M = 50 + +ModInv = 17 +A = 7 +M = 50 + +ModInv = 9 +A = 9 +M = 50 + +ModInv = 33 +A = b +M = 50 + +ModInv = 25 +A = d +M = 50 + +ModInv = 21 +A = 11 +M = 50 + +ModInv = 3b +A = 13 +M = 50 + +ModInv = 3d +A = 15 +M = 50 + +ModInv = 7 +A = 17 +M = 50 + +ModInv = 3 +A = 1b +M = 50 + +ModInv = 45 +A = 1d +M = 50 + +ModInv = 1f +A = 1f +M = 50 + +ModInv = 11 +A = 21 +M = 50 + +ModInv = d +A = 25 +M = 50 + +ModInv = 27 +A = 27 +M = 50 + +ModInv = 29 +A = 29 +M = 50 + +ModInv = 43 +A = 2b +M = 50 + +ModInv = 3f +A = 2f +M = 50 + +ModInv = 31 +A = 31 +M = 50 + +ModInv = b +A = 33 +M = 50 + +ModInv = 4d +A = 35 +M = 50 + +ModInv = 49 +A = 39 +M = 50 + +ModInv = 13 +A = 3b +M = 50 + +ModInv = 15 +A = 3d +M = 50 + +ModInv = 2f +A = 3f +M = 50 + +ModInv = 2b +A = 43 +M = 50 + +ModInv = 1d +A = 45 +M = 50 + +ModInv = 47 +A = 47 +M = 50 + +ModInv = 39 +A = 49 +M = 50 + +ModInv = 35 +A = 4d +M = 50 + +ModInv = 4f +A = 4f +M = 50 + +ModInv = 1 +A = 51 +M = 50 + +ModInv = 1b +A = 53 +M = 50 + +ModInv = 17 +A = 57 +M = 50 + +ModInv = 9 +A = 59 +M = 50 + +ModInv = 33 +A = 5b +M = 50 + +ModInv = 25 +A = 5d +M = 50 + +ModInv = 21 +A = 61 +M = 50 + +ModInv = 3b +A = 63 +M = 50 + +ModInv = 11 +A = -64 +M = 51 + +ModInv = 13 +A = -62 +M = 51 + +ModInv = 5 +A = -61 +M = 51 + +ModInv = 34 +A = -5f +M = 51 + +ModInv = 38 +A = -5e +M = 51 + +ModInv = 16 +A = -5c +M = 51 + +ModInv = 8 +A = -5b +M = 51 + +ModInv = a +A = -59 +M = 51 + +ModInv = 17 +A = -58 +M = 51 + +ModInv = 10 +A = -56 +M = 51 + +ModInv = 14 +A = -55 +M = 51 + +ModInv = 28 +A = -53 +M = 51 + +ModInv = 50 +A = -52 +M = 51 + +ModInv = 1 +A = -50 +M = 51 + +ModInv = 29 +A = -4f +M = 51 + +ModInv = 3d +A = -4d +M = 51 + +ModInv = 41 +A = -4c +M = 51 + +ModInv = 3a +A = -4a +M = 51 + +ModInv = 47 +A = -49 +M = 51 + +ModInv = 49 +A = -47 +M = 51 + +ModInv = 3b +A = -46 +M = 51 + +ModInv = 19 +A = -44 +M = 51 + +ModInv = 1d +A = -43 +M = 51 + +ModInv = 4c +A = -41 +M = 51 + +ModInv = 3e +A = -40 +M = 51 + +ModInv = 40 +A = -3e +M = 51 + +ModInv = 4d +A = -3d +M = 51 + +ModInv = 46 +A = -3b +M = 51 + +ModInv = 4a +A = -3a +M = 51 + +ModInv = d +A = -38 +M = 51 + +ModInv = 35 +A = -37 +M = 51 + +ModInv = 37 +A = -35 +M = 51 + +ModInv = e +A = -34 +M = 51 + +ModInv = 22 +A = -32 +M = 51 + +ModInv = 26 +A = -31 +M = 51 + +ModInv = 1f +A = -2f +M = 51 + +ModInv = 2c +A = -2e +M = 51 + +ModInv = 2e +A = -2c +M = 51 + +ModInv = 20 +A = -2b +M = 51 + +ModInv = 4f +A = -29 +M = 51 + +ModInv = 2 +A = -28 +M = 51 + +ModInv = 31 +A = -26 +M = 51 + +ModInv = 23 +A = -25 +M = 51 + +ModInv = 25 +A = -23 +M = 51 + +ModInv = 32 +A = -22 +M = 51 + +ModInv = 2b +A = -20 +M = 51 + +ModInv = 2f +A = -1f +M = 51 + +ModInv = 43 +A = -1d +M = 51 + +ModInv = 1a +A = -1c +M = 51 + +ModInv = 1c +A = -1a +M = 51 + +ModInv = 44 +A = -19 +M = 51 + +ModInv = 7 +A = -17 +M = 51 + +ModInv = b +A = -16 +M = 51 + +ModInv = 4 +A = -14 +M = 51 + +ModInv = 11 +A = -13 +M = 51 + +ModInv = 13 +A = -11 +M = 51 + +ModInv = 5 +A = -10 +M = 51 + +ModInv = 34 +A = -e +M = 51 + +ModInv = 38 +A = -d +M = 51 + +ModInv = 16 +A = -b +M = 51 + +ModInv = 8 +A = -a +M = 51 + +ModInv = a +A = -8 +M = 51 + +ModInv = 17 +A = -7 +M = 51 + +ModInv = 10 +A = -5 +M = 51 + +ModInv = 14 +A = -4 +M = 51 + +ModInv = 28 +A = -2 +M = 51 + +ModInv = 50 +A = -1 +M = 51 + +ModInv = 1 +A = 1 +M = 51 + +ModInv = 29 +A = 2 +M = 51 + +ModInv = 3d +A = 4 +M = 51 + +ModInv = 41 +A = 5 +M = 51 + +ModInv = 3a +A = 7 +M = 51 + +ModInv = 47 +A = 8 +M = 51 + +ModInv = 49 +A = a +M = 51 + +ModInv = 3b +A = b +M = 51 + +ModInv = 19 +A = d +M = 51 + +ModInv = 1d +A = e +M = 51 + +ModInv = 4c +A = 10 +M = 51 + +ModInv = 3e +A = 11 +M = 51 + +ModInv = 40 +A = 13 +M = 51 + +ModInv = 4d +A = 14 +M = 51 + +ModInv = 46 +A = 16 +M = 51 + +ModInv = 4a +A = 17 +M = 51 + +ModInv = d +A = 19 +M = 51 + +ModInv = 35 +A = 1a +M = 51 + +ModInv = 37 +A = 1c +M = 51 + +ModInv = e +A = 1d +M = 51 + +ModInv = 22 +A = 1f +M = 51 + +ModInv = 26 +A = 20 +M = 51 + +ModInv = 1f +A = 22 +M = 51 + +ModInv = 2c +A = 23 +M = 51 + +ModInv = 2e +A = 25 +M = 51 + +ModInv = 20 +A = 26 +M = 51 + +ModInv = 4f +A = 28 +M = 51 + +ModInv = 2 +A = 29 +M = 51 + +ModInv = 31 +A = 2b +M = 51 + +ModInv = 23 +A = 2c +M = 51 + +ModInv = 25 +A = 2e +M = 51 + +ModInv = 32 +A = 2f +M = 51 + +ModInv = 2b +A = 31 +M = 51 + +ModInv = 2f +A = 32 +M = 51 + +ModInv = 43 +A = 34 +M = 51 + +ModInv = 1a +A = 35 +M = 51 + +ModInv = 1c +A = 37 +M = 51 + +ModInv = 44 +A = 38 +M = 51 + +ModInv = 7 +A = 3a +M = 51 + +ModInv = b +A = 3b +M = 51 + +ModInv = 4 +A = 3d +M = 51 + +ModInv = 11 +A = 3e +M = 51 + +ModInv = 13 +A = 40 +M = 51 + +ModInv = 5 +A = 41 +M = 51 + +ModInv = 34 +A = 43 +M = 51 + +ModInv = 38 +A = 44 +M = 51 + +ModInv = 16 +A = 46 +M = 51 + +ModInv = 8 +A = 47 +M = 51 + +ModInv = a +A = 49 +M = 51 + +ModInv = 17 +A = 4a +M = 51 + +ModInv = 10 +A = 4c +M = 51 + +ModInv = 14 +A = 4d +M = 51 + +ModInv = 28 +A = 4f +M = 51 + +ModInv = 50 +A = 50 +M = 51 + +ModInv = 1 +A = 52 +M = 51 + +ModInv = 29 +A = 53 +M = 51 + +ModInv = 3d +A = 55 +M = 51 + +ModInv = 41 +A = 56 +M = 51 + +ModInv = 3a +A = 58 +M = 51 + +ModInv = 47 +A = 59 +M = 51 + +ModInv = 49 +A = 5b +M = 51 + +ModInv = 3b +A = 5c +M = 51 + +ModInv = 19 +A = 5e +M = 51 + +ModInv = 1d +A = 5f +M = 51 + +ModInv = 4c +A = 61 +M = 51 + +ModInv = 3e +A = 62 +M = 51 + +ModInv = 35 +A = -63 +M = 52 + +ModInv = 47 +A = -61 +M = 52 + +ModInv = 3f +A = -5f +M = 52 + +ModInv = 43 +A = -5d +M = 52 + +ModInv = 9 +A = -5b +M = 52 + +ModInv = 23 +A = -59 +M = 52 + +ModInv = 31 +A = -57 +M = 52 + +ModInv = 1b +A = -55 +M = 52 + +ModInv = 51 +A = -53 +M = 52 + +ModInv = 1 +A = -51 +M = 52 + +ModInv = 37 +A = -4f +M = 52 + +ModInv = 21 +A = -4d +M = 52 + +ModInv = 2f +A = -4b +M = 52 + +ModInv = 49 +A = -49 +M = 52 + +ModInv = f +A = -47 +M = 52 + +ModInv = 13 +A = -45 +M = 52 + +ModInv = b +A = -43 +M = 52 + +ModInv = 1d +A = -41 +M = 52 + +ModInv = d +A = -3f +M = 52 + +ModInv = 2b +A = -3d +M = 52 + +ModInv = 19 +A = -3b +M = 52 + +ModInv = 17 +A = -39 +M = 52 + +ModInv = 4f +A = -37 +M = 52 + +ModInv = 11 +A = -35 +M = 52 + +ModInv = 2d +A = -33 +M = 52 + +ModInv = 5 +A = -31 +M = 52 + +ModInv = 4b +A = -2f +M = 52 + +ModInv = 33 +A = -2d +M = 52 + +ModInv = 3d +A = -2b +M = 52 + +ModInv = 15 +A = -27 +M = 52 + +ModInv = 1f +A = -25 +M = 52 + +ModInv = 7 +A = -23 +M = 52 + +ModInv = 4d +A = -21 +M = 52 + +ModInv = 25 +A = -1f +M = 52 + +ModInv = 41 +A = -1d +M = 52 + +ModInv = 3 +A = -1b +M = 52 + +ModInv = 3b +A = -19 +M = 52 + +ModInv = 39 +A = -17 +M = 52 + +ModInv = 27 +A = -15 +M = 52 + +ModInv = 45 +A = -13 +M = 52 + +ModInv = 35 +A = -11 +M = 52 + +ModInv = 47 +A = -f +M = 52 + +ModInv = 3f +A = -d +M = 52 + +ModInv = 43 +A = -b +M = 52 + +ModInv = 9 +A = -9 +M = 52 + +ModInv = 23 +A = -7 +M = 52 + +ModInv = 31 +A = -5 +M = 52 + +ModInv = 1b +A = -3 +M = 52 + +ModInv = 51 +A = -1 +M = 52 + +ModInv = 1 +A = 1 +M = 52 + +ModInv = 37 +A = 3 +M = 52 + +ModInv = 21 +A = 5 +M = 52 + +ModInv = 2f +A = 7 +M = 52 + +ModInv = 49 +A = 9 +M = 52 + +ModInv = f +A = b +M = 52 + +ModInv = 13 +A = d +M = 52 + +ModInv = b +A = f +M = 52 + +ModInv = 1d +A = 11 +M = 52 + +ModInv = d +A = 13 +M = 52 + +ModInv = 2b +A = 15 +M = 52 + +ModInv = 19 +A = 17 +M = 52 + +ModInv = 17 +A = 19 +M = 52 + +ModInv = 4f +A = 1b +M = 52 + +ModInv = 11 +A = 1d +M = 52 + +ModInv = 2d +A = 1f +M = 52 + +ModInv = 5 +A = 21 +M = 52 + +ModInv = 4b +A = 23 +M = 52 + +ModInv = 33 +A = 25 +M = 52 + +ModInv = 3d +A = 27 +M = 52 + +ModInv = 15 +A = 2b +M = 52 + +ModInv = 1f +A = 2d +M = 52 + +ModInv = 7 +A = 2f +M = 52 + +ModInv = 4d +A = 31 +M = 52 + +ModInv = 25 +A = 33 +M = 52 + +ModInv = 41 +A = 35 +M = 52 + +ModInv = 3 +A = 37 +M = 52 + +ModInv = 3b +A = 39 +M = 52 + +ModInv = 39 +A = 3b +M = 52 + +ModInv = 27 +A = 3d +M = 52 + +ModInv = 45 +A = 3f +M = 52 + +ModInv = 35 +A = 41 +M = 52 + +ModInv = 47 +A = 43 +M = 52 + +ModInv = 3f +A = 45 +M = 52 + +ModInv = 43 +A = 47 +M = 52 + +ModInv = 9 +A = 49 +M = 52 + +ModInv = 23 +A = 4b +M = 52 + +ModInv = 31 +A = 4d +M = 52 + +ModInv = 1b +A = 4f +M = 52 + +ModInv = 51 +A = 51 +M = 52 + +ModInv = 1 +A = 53 +M = 52 + +ModInv = 37 +A = 55 +M = 52 + +ModInv = 21 +A = 57 +M = 52 + +ModInv = 2f +A = 59 +M = 52 + +ModInv = 49 +A = 5b +M = 52 + +ModInv = f +A = 5d +M = 52 + +ModInv = 13 +A = 5f +M = 52 + +ModInv = b +A = 61 +M = 52 + +ModInv = 1d +A = 63 +M = 52 + +ModInv = 27 +A = -64 +M = 53 + +ModInv = 39 +A = -63 +M = 53 + +ModInv = b +A = -62 +M = 53 + +ModInv = 4d +A = -61 +M = 53 + +ModInv = 33 +A = -60 +M = 53 + +ModInv = 4c +A = -5f +M = 53 + +ModInv = f +A = -5e +M = 53 + +ModInv = 3a +A = -5d +M = 53 + +ModInv = 2e +A = -5c +M = 53 + +ModInv = 1f +A = -5b +M = 53 + +ModInv = 47 +A = -5a +M = 53 + +ModInv = 45 +A = -59 +M = 53 + +ModInv = 21 +A = -58 +M = 53 + +ModInv = 3e +A = -57 +M = 53 + +ModInv = 37 +A = -56 +M = 53 + +ModInv = 29 +A = -55 +M = 53 + +ModInv = 52 +A = -54 +M = 53 + +ModInv = 1 +A = -52 +M = 53 + +ModInv = 2a +A = -51 +M = 53 + +ModInv = 1c +A = -50 +M = 53 + +ModInv = 15 +A = -4f +M = 53 + +ModInv = 32 +A = -4e +M = 53 + +ModInv = e +A = -4d +M = 53 + +ModInv = c +A = -4c +M = 53 + +ModInv = 34 +A = -4b +M = 53 + +ModInv = 25 +A = -4a +M = 53 + +ModInv = 19 +A = -49 +M = 53 + +ModInv = 44 +A = -48 +M = 53 + +ModInv = 7 +A = -47 +M = 53 + +ModInv = 20 +A = -46 +M = 53 + +ModInv = 6 +A = -45 +M = 53 + +ModInv = 48 +A = -44 +M = 53 + +ModInv = 1a +A = -43 +M = 53 + +ModInv = 2c +A = -42 +M = 53 + +ModInv = 3c +A = -41 +M = 53 + +ModInv = 23 +A = -40 +M = 53 + +ModInv = 36 +A = -3f +M = 53 + +ModInv = 4 +A = -3e +M = 53 + +ModInv = 22 +A = -3d +M = 53 + +ModInv = 41 +A = -3c +M = 53 + +ModInv = 2d +A = -3b +M = 53 + +ModInv = a +A = -3a +M = 53 + +ModInv = 10 +A = -39 +M = 53 + +ModInv = 28 +A = -38 +M = 53 + +ModInv = 3 +A = -37 +M = 53 + +ModInv = 3f +A = -36 +M = 53 + +ModInv = 24 +A = -35 +M = 53 + +ModInv = 4b +A = -34 +M = 53 + +ModInv = d +A = -33 +M = 53 + +ModInv = 4e +A = -32 +M = 53 + +ModInv = 16 +A = -31 +M = 53 + +ModInv = 13 +A = -30 +M = 53 + +ModInv = 1e +A = -2f +M = 53 + +ModInv = 9 +A = -2e +M = 53 + +ModInv = 3b +A = -2d +M = 53 + +ModInv = 42 +A = -2c +M = 53 + +ModInv = 1b +A = -2b +M = 53 + +ModInv = 51 +A = -2a +M = 53 + +ModInv = 2 +A = -29 +M = 53 + +ModInv = 38 +A = -28 +M = 53 + +ModInv = 11 +A = -27 +M = 53 + +ModInv = 18 +A = -26 +M = 53 + +ModInv = 4a +A = -25 +M = 53 + +ModInv = 35 +A = -24 +M = 53 + +ModInv = 40 +A = -23 +M = 53 + +ModInv = 3d +A = -22 +M = 53 + +ModInv = 5 +A = -21 +M = 53 + +ModInv = 46 +A = -20 +M = 53 + +ModInv = 8 +A = -1f +M = 53 + +ModInv = 2f +A = -1e +M = 53 + +ModInv = 14 +A = -1d +M = 53 + +ModInv = 50 +A = -1c +M = 53 + +ModInv = 2b +A = -1b +M = 53 + +ModInv = 43 +A = -1a +M = 53 + +ModInv = 49 +A = -19 +M = 53 + +ModInv = 26 +A = -18 +M = 53 + +ModInv = 12 +A = -17 +M = 53 + +ModInv = 31 +A = -16 +M = 53 + +ModInv = 4f +A = -15 +M = 53 + +ModInv = 1d +A = -14 +M = 53 + +ModInv = 30 +A = -13 +M = 53 + +ModInv = 17 +A = -12 +M = 53 + +ModInv = 27 +A = -11 +M = 53 + +ModInv = 39 +A = -10 +M = 53 + +ModInv = b +A = -f +M = 53 + +ModInv = 4d +A = -e +M = 53 + +ModInv = 33 +A = -d +M = 53 + +ModInv = 4c +A = -c +M = 53 + +ModInv = f +A = -b +M = 53 + +ModInv = 3a +A = -a +M = 53 + +ModInv = 2e +A = -9 +M = 53 + +ModInv = 1f +A = -8 +M = 53 + +ModInv = 47 +A = -7 +M = 53 + +ModInv = 45 +A = -6 +M = 53 + +ModInv = 21 +A = -5 +M = 53 + +ModInv = 3e +A = -4 +M = 53 + +ModInv = 37 +A = -3 +M = 53 + +ModInv = 29 +A = -2 +M = 53 + +ModInv = 52 +A = -1 +M = 53 + +ModInv = 1 +A = 1 +M = 53 + +ModInv = 2a +A = 2 +M = 53 + +ModInv = 1c +A = 3 +M = 53 + +ModInv = 15 +A = 4 +M = 53 + +ModInv = 32 +A = 5 +M = 53 + +ModInv = e +A = 6 +M = 53 + +ModInv = c +A = 7 +M = 53 + +ModInv = 34 +A = 8 +M = 53 + +ModInv = 25 +A = 9 +M = 53 + +ModInv = 19 +A = a +M = 53 + +ModInv = 44 +A = b +M = 53 + +ModInv = 7 +A = c +M = 53 + +ModInv = 20 +A = d +M = 53 + +ModInv = 6 +A = e +M = 53 + +ModInv = 48 +A = f +M = 53 + +ModInv = 1a +A = 10 +M = 53 + +ModInv = 2c +A = 11 +M = 53 + +ModInv = 3c +A = 12 +M = 53 + +ModInv = 23 +A = 13 +M = 53 + +ModInv = 36 +A = 14 +M = 53 + +ModInv = 4 +A = 15 +M = 53 + +ModInv = 22 +A = 16 +M = 53 + +ModInv = 41 +A = 17 +M = 53 + +ModInv = 2d +A = 18 +M = 53 + +ModInv = a +A = 19 +M = 53 + +ModInv = 10 +A = 1a +M = 53 + +ModInv = 28 +A = 1b +M = 53 + +ModInv = 3 +A = 1c +M = 53 + +ModInv = 3f +A = 1d +M = 53 + +ModInv = 24 +A = 1e +M = 53 + +ModInv = 4b +A = 1f +M = 53 + +ModInv = d +A = 20 +M = 53 + +ModInv = 4e +A = 21 +M = 53 + +ModInv = 16 +A = 22 +M = 53 + +ModInv = 13 +A = 23 +M = 53 + +ModInv = 1e +A = 24 +M = 53 + +ModInv = 9 +A = 25 +M = 53 + +ModInv = 3b +A = 26 +M = 53 + +ModInv = 42 +A = 27 +M = 53 + +ModInv = 1b +A = 28 +M = 53 + +ModInv = 51 +A = 29 +M = 53 + +ModInv = 2 +A = 2a +M = 53 + +ModInv = 38 +A = 2b +M = 53 + +ModInv = 11 +A = 2c +M = 53 + +ModInv = 18 +A = 2d +M = 53 + +ModInv = 4a +A = 2e +M = 53 + +ModInv = 35 +A = 2f +M = 53 + +ModInv = 40 +A = 30 +M = 53 + +ModInv = 3d +A = 31 +M = 53 + +ModInv = 5 +A = 32 +M = 53 + +ModInv = 46 +A = 33 +M = 53 + +ModInv = 8 +A = 34 +M = 53 + +ModInv = 2f +A = 35 +M = 53 + +ModInv = 14 +A = 36 +M = 53 + +ModInv = 50 +A = 37 +M = 53 + +ModInv = 2b +A = 38 +M = 53 + +ModInv = 43 +A = 39 +M = 53 + +ModInv = 49 +A = 3a +M = 53 + +ModInv = 26 +A = 3b +M = 53 + +ModInv = 12 +A = 3c +M = 53 + +ModInv = 31 +A = 3d +M = 53 + +ModInv = 4f +A = 3e +M = 53 + +ModInv = 1d +A = 3f +M = 53 + +ModInv = 30 +A = 40 +M = 53 + +ModInv = 17 +A = 41 +M = 53 + +ModInv = 27 +A = 42 +M = 53 + +ModInv = 39 +A = 43 +M = 53 + +ModInv = b +A = 44 +M = 53 + +ModInv = 4d +A = 45 +M = 53 + +ModInv = 33 +A = 46 +M = 53 + +ModInv = 4c +A = 47 +M = 53 + +ModInv = f +A = 48 +M = 53 + +ModInv = 3a +A = 49 +M = 53 + +ModInv = 2e +A = 4a +M = 53 + +ModInv = 1f +A = 4b +M = 53 + +ModInv = 47 +A = 4c +M = 53 + +ModInv = 45 +A = 4d +M = 53 + +ModInv = 21 +A = 4e +M = 53 + +ModInv = 3e +A = 4f +M = 53 + +ModInv = 37 +A = 50 +M = 53 + +ModInv = 29 +A = 51 +M = 53 + +ModInv = 52 +A = 52 +M = 53 + +ModInv = 1 +A = 54 +M = 53 + +ModInv = 2a +A = 55 +M = 53 + +ModInv = 1c +A = 56 +M = 53 + +ModInv = 15 +A = 57 +M = 53 + +ModInv = 32 +A = 58 +M = 53 + +ModInv = e +A = 59 +M = 53 + +ModInv = c +A = 5a +M = 53 + +ModInv = 34 +A = 5b +M = 53 + +ModInv = 25 +A = 5c +M = 53 + +ModInv = 19 +A = 5d +M = 53 + +ModInv = 44 +A = 5e +M = 53 + +ModInv = 7 +A = 5f +M = 53 + +ModInv = 20 +A = 60 +M = 53 + +ModInv = 6 +A = 61 +M = 53 + +ModInv = 48 +A = 62 +M = 53 + +ModInv = 1a +A = 63 +M = 53 + +ModInv = 47 +A = -61 +M = 54 + +ModInv = 3d +A = -5f +M = 54 + +ModInv = 43 +A = -59 +M = 54 + +ModInv = 53 +A = -55 +M = 54 + +ModInv = 1 +A = -53 +M = 54 + +ModInv = 11 +A = -4f +M = 54 + +ModInv = 17 +A = -49 +M = 54 + +ModInv = d +A = -47 +M = 54 + +ModInv = 5 +A = -43 +M = 54 + +ModInv = 1f +A = -41 +M = 54 + +ModInv = b +A = -3d +M = 54 + +ModInv = 25 +A = -3b +M = 54 + +ModInv = 1d +A = -37 +M = 54 + +ModInv = 13 +A = -35 +M = 54 + +ModInv = 19 +A = -2f +M = 54 + +ModInv = 29 +A = -2b +M = 54 + +ModInv = 2b +A = -29 +M = 54 + +ModInv = 3b +A = -25 +M = 54 + +ModInv = 41 +A = -1f +M = 54 + +ModInv = 37 +A = -1d +M = 54 + +ModInv = 2f +A = -19 +M = 54 + +ModInv = 49 +A = -17 +M = 54 + +ModInv = 35 +A = -13 +M = 54 + +ModInv = 4f +A = -11 +M = 54 + +ModInv = 47 +A = -d +M = 54 + +ModInv = 3d +A = -b +M = 54 + +ModInv = 43 +A = -5 +M = 54 + +ModInv = 53 +A = -1 +M = 54 + +ModInv = 1 +A = 1 +M = 54 + +ModInv = 11 +A = 5 +M = 54 + +ModInv = 17 +A = b +M = 54 + +ModInv = d +A = d +M = 54 + +ModInv = 5 +A = 11 +M = 54 + +ModInv = 1f +A = 13 +M = 54 + +ModInv = b +A = 17 +M = 54 + +ModInv = 25 +A = 19 +M = 54 + +ModInv = 1d +A = 1d +M = 54 + +ModInv = 13 +A = 1f +M = 54 + +ModInv = 19 +A = 25 +M = 54 + +ModInv = 29 +A = 29 +M = 54 + +ModInv = 2b +A = 2b +M = 54 + +ModInv = 3b +A = 2f +M = 54 + +ModInv = 41 +A = 35 +M = 54 + +ModInv = 37 +A = 37 +M = 54 + +ModInv = 2f +A = 3b +M = 54 + +ModInv = 49 +A = 3d +M = 54 + +ModInv = 35 +A = 41 +M = 54 + +ModInv = 4f +A = 43 +M = 54 + +ModInv = 47 +A = 47 +M = 54 + +ModInv = 3d +A = 49 +M = 54 + +ModInv = 43 +A = 4f +M = 54 + +ModInv = 53 +A = 53 +M = 54 + +ModInv = 1 +A = 55 +M = 54 + +ModInv = 11 +A = 59 +M = 54 + +ModInv = 17 +A = 5f +M = 54 + +ModInv = d +A = 61 +M = 54 + +ModInv = 6 +A = -63 +M = 55 + +ModInv = d +A = -62 +M = 55 + +ModInv = 7 +A = -61 +M = 55 + +ModInv = 36 +A = -60 +M = 55 + +ModInv = 42 +A = -5e +M = 55 + +ModInv = 35 +A = -5d +M = 55 + +ModInv = c +A = -5c +M = 55 + +ModInv = e +A = -5b +M = 55 + +ModInv = 15 +A = -59 +M = 55 + +ModInv = 1c +A = -58 +M = 55 + +ModInv = 2a +A = -57 +M = 55 + +ModInv = 54 +A = -56 +M = 55 + +ModInv = 1 +A = -54 +M = 55 + +ModInv = 2b +A = -53 +M = 55 + +ModInv = 39 +A = -52 +M = 55 + +ModInv = 40 +A = -51 +M = 55 + +ModInv = 47 +A = -4f +M = 55 + +ModInv = 49 +A = -4e +M = 55 + +ModInv = 20 +A = -4d +M = 55 + +ModInv = 13 +A = -4c +M = 55 + +ModInv = 1f +A = -4a +M = 55 + +ModInv = 4e +A = -49 +M = 55 + +ModInv = 48 +A = -48 +M = 55 + +ModInv = 4f +A = -47 +M = 55 + +ModInv = 10 +A = -45 +M = 55 + +ModInv = 34 +A = -43 +M = 55 + +ModInv = 9 +A = -42 +M = 55 + +ModInv = 51 +A = -40 +M = 55 + +ModInv = 3a +A = -3f +M = 55 + +ModInv = 25 +A = -3e +M = 55 + +ModInv = 27 +A = -3d +M = 55 + +ModInv = 24 +A = -3b +M = 55 + +ModInv = 3f +A = -3a +M = 55 + +ModInv = 52 +A = -39 +M = 55 + +ModInv = 2c +A = -38 +M = 55 + +ModInv = b +A = -36 +M = 55 + +ModInv = 8 +A = -35 +M = 55 + +ModInv = 43 +A = -34 +M = 55 + +ModInv = 1a +A = -31 +M = 55 + +ModInv = 17 +A = -30 +M = 55 + +ModInv = 2f +A = -2f +M = 55 + +ModInv = 18 +A = -2e +M = 55 + +ModInv = 38 +A = -2c +M = 55 + +ModInv = 53 +A = -2b +M = 55 + +ModInv = 2 +A = -2a +M = 55 + +ModInv = 1d +A = -29 +M = 55 + +ModInv = 3d +A = -27 +M = 55 + +ModInv = 26 +A = -26 +M = 55 + +ModInv = 3e +A = -25 +M = 55 + +ModInv = 3b +A = -24 +M = 55 + +ModInv = 12 +A = -21 +M = 55 + +ModInv = 4d +A = -20 +M = 55 + +ModInv = 4a +A = -1f +M = 55 + +ModInv = 29 +A = -1d +M = 55 + +ModInv = 3 +A = -1c +M = 55 + +ModInv = 16 +A = -1b +M = 55 + +ModInv = 31 +A = -1a +M = 55 + +ModInv = 2e +A = -18 +M = 55 + +ModInv = 30 +A = -17 +M = 55 + +ModInv = 1b +A = -16 +M = 55 + +ModInv = 4 +A = -15 +M = 55 + +ModInv = 4c +A = -13 +M = 55 + +ModInv = 21 +A = -12 +M = 55 + +ModInv = 45 +A = -10 +M = 55 + +ModInv = 6 +A = -e +M = 55 + +ModInv = d +A = -d +M = 55 + +ModInv = 7 +A = -c +M = 55 + +ModInv = 36 +A = -b +M = 55 + +ModInv = 42 +A = -9 +M = 55 + +ModInv = 35 +A = -8 +M = 55 + +ModInv = c +A = -7 +M = 55 + +ModInv = e +A = -6 +M = 55 + +ModInv = 15 +A = -4 +M = 55 + +ModInv = 1c +A = -3 +M = 55 + +ModInv = 2a +A = -2 +M = 55 + +ModInv = 54 +A = -1 +M = 55 + +ModInv = 1 +A = 1 +M = 55 + +ModInv = 2b +A = 2 +M = 55 + +ModInv = 39 +A = 3 +M = 55 + +ModInv = 40 +A = 4 +M = 55 + +ModInv = 47 +A = 6 +M = 55 + +ModInv = 49 +A = 7 +M = 55 + +ModInv = 20 +A = 8 +M = 55 + +ModInv = 13 +A = 9 +M = 55 + +ModInv = 1f +A = b +M = 55 + +ModInv = 4e +A = c +M = 55 + +ModInv = 48 +A = d +M = 55 + +ModInv = 4f +A = e +M = 55 + +ModInv = 10 +A = 10 +M = 55 + +ModInv = 34 +A = 12 +M = 55 + +ModInv = 9 +A = 13 +M = 55 + +ModInv = 51 +A = 15 +M = 55 + +ModInv = 3a +A = 16 +M = 55 + +ModInv = 25 +A = 17 +M = 55 + +ModInv = 27 +A = 18 +M = 55 + +ModInv = 24 +A = 1a +M = 55 + +ModInv = 3f +A = 1b +M = 55 + +ModInv = 52 +A = 1c +M = 55 + +ModInv = 2c +A = 1d +M = 55 + +ModInv = b +A = 1f +M = 55 + +ModInv = 8 +A = 20 +M = 55 + +ModInv = 43 +A = 21 +M = 55 + +ModInv = 1a +A = 24 +M = 55 + +ModInv = 17 +A = 25 +M = 55 + +ModInv = 2f +A = 26 +M = 55 + +ModInv = 18 +A = 27 +M = 55 + +ModInv = 38 +A = 29 +M = 55 + +ModInv = 53 +A = 2a +M = 55 + +ModInv = 2 +A = 2b +M = 55 + +ModInv = 1d +A = 2c +M = 55 + +ModInv = 3d +A = 2e +M = 55 + +ModInv = 26 +A = 2f +M = 55 + +ModInv = 3e +A = 30 +M = 55 + +ModInv = 3b +A = 31 +M = 55 + +ModInv = 12 +A = 34 +M = 55 + +ModInv = 4d +A = 35 +M = 55 + +ModInv = 4a +A = 36 +M = 55 + +ModInv = 29 +A = 38 +M = 55 + +ModInv = 3 +A = 39 +M = 55 + +ModInv = 16 +A = 3a +M = 55 + +ModInv = 31 +A = 3b +M = 55 + +ModInv = 2e +A = 3d +M = 55 + +ModInv = 30 +A = 3e +M = 55 + +ModInv = 1b +A = 3f +M = 55 + +ModInv = 4 +A = 40 +M = 55 + +ModInv = 4c +A = 42 +M = 55 + +ModInv = 21 +A = 43 +M = 55 + +ModInv = 45 +A = 45 +M = 55 + +ModInv = 6 +A = 47 +M = 55 + +ModInv = d +A = 48 +M = 55 + +ModInv = 7 +A = 49 +M = 55 + +ModInv = 36 +A = 4a +M = 55 + +ModInv = 42 +A = 4c +M = 55 + +ModInv = 35 +A = 4d +M = 55 + +ModInv = c +A = 4e +M = 55 + +ModInv = e +A = 4f +M = 55 + +ModInv = 15 +A = 51 +M = 55 + +ModInv = 1c +A = 52 +M = 55 + +ModInv = 2a +A = 53 +M = 55 + +ModInv = 54 +A = 54 +M = 55 + +ModInv = 1 +A = 56 +M = 55 + +ModInv = 2b +A = 57 +M = 55 + +ModInv = 39 +A = 58 +M = 55 + +ModInv = 40 +A = 59 +M = 55 + +ModInv = 47 +A = 5b +M = 55 + +ModInv = 49 +A = 5c +M = 55 + +ModInv = 20 +A = 5d +M = 55 + +ModInv = 13 +A = 5e +M = 55 + +ModInv = 1f +A = 60 +M = 55 + +ModInv = 4e +A = 61 +M = 55 + +ModInv = 48 +A = 62 +M = 55 + +ModInv = 4f +A = 63 +M = 55 + +ModInv = 21 +A = -63 +M = 56 + +ModInv = 27 +A = -61 +M = 56 + +ModInv = 13 +A = -5f +M = 56 + +ModInv = 31 +A = -5d +M = 56 + +ModInv = 11 +A = -5b +M = 56 + +ModInv = 39 +A = -59 +M = 56 + +ModInv = 55 +A = -57 +M = 56 + +ModInv = 1 +A = -55 +M = 56 + +ModInv = 1d +A = -53 +M = 56 + +ModInv = 45 +A = -51 +M = 56 + +ModInv = 25 +A = -4f +M = 56 + +ModInv = 43 +A = -4d +M = 56 + +ModInv = 2f +A = -4b +M = 56 + +ModInv = 35 +A = -49 +M = 56 + +ModInv = 17 +A = -47 +M = 56 + +ModInv = 51 +A = -45 +M = 56 + +ModInv = 4d +A = -43 +M = 56 + +ModInv = 29 +A = -41 +M = 56 + +ModInv = f +A = -3f +M = 56 + +ModInv = 1f +A = -3d +M = 56 + +ModInv = 33 +A = -3b +M = 56 + +ModInv = 3 +A = -39 +M = 56 + +ModInv = 19 +A = -37 +M = 56 + +ModInv = 49 +A = -35 +M = 56 + +ModInv = 3b +A = -33 +M = 56 + +ModInv = 7 +A = -31 +M = 56 + +ModInv = 4b +A = -2f +M = 56 + +ModInv = 15 +A = -2d +M = 56 + +ModInv = 41 +A = -29 +M = 56 + +ModInv = b +A = -27 +M = 56 + +ModInv = 4f +A = -25 +M = 56 + +ModInv = 1b +A = -23 +M = 56 + +ModInv = d +A = -21 +M = 56 + +ModInv = 3d +A = -1f +M = 56 + +ModInv = 53 +A = -1d +M = 56 + +ModInv = 23 +A = -1b +M = 56 + +ModInv = 37 +A = -19 +M = 56 + +ModInv = 47 +A = -17 +M = 56 + +ModInv = 2d +A = -15 +M = 56 + +ModInv = 9 +A = -13 +M = 56 + +ModInv = 5 +A = -11 +M = 56 + +ModInv = 3f +A = -f +M = 56 + +ModInv = 21 +A = -d +M = 56 + +ModInv = 27 +A = -b +M = 56 + +ModInv = 13 +A = -9 +M = 56 + +ModInv = 31 +A = -7 +M = 56 + +ModInv = 11 +A = -5 +M = 56 + +ModInv = 39 +A = -3 +M = 56 + +ModInv = 55 +A = -1 +M = 56 + +ModInv = 1 +A = 1 +M = 56 + +ModInv = 1d +A = 3 +M = 56 + +ModInv = 45 +A = 5 +M = 56 + +ModInv = 25 +A = 7 +M = 56 + +ModInv = 43 +A = 9 +M = 56 + +ModInv = 2f +A = b +M = 56 + +ModInv = 35 +A = d +M = 56 + +ModInv = 17 +A = f +M = 56 + +ModInv = 51 +A = 11 +M = 56 + +ModInv = 4d +A = 13 +M = 56 + +ModInv = 29 +A = 15 +M = 56 + +ModInv = f +A = 17 +M = 56 + +ModInv = 1f +A = 19 +M = 56 + +ModInv = 33 +A = 1b +M = 56 + +ModInv = 3 +A = 1d +M = 56 + +ModInv = 19 +A = 1f +M = 56 + +ModInv = 49 +A = 21 +M = 56 + +ModInv = 3b +A = 23 +M = 56 + +ModInv = 7 +A = 25 +M = 56 + +ModInv = 4b +A = 27 +M = 56 + +ModInv = 15 +A = 29 +M = 56 + +ModInv = 41 +A = 2d +M = 56 + +ModInv = b +A = 2f +M = 56 + +ModInv = 4f +A = 31 +M = 56 + +ModInv = 1b +A = 33 +M = 56 + +ModInv = d +A = 35 +M = 56 + +ModInv = 3d +A = 37 +M = 56 + +ModInv = 53 +A = 39 +M = 56 + +ModInv = 23 +A = 3b +M = 56 + +ModInv = 37 +A = 3d +M = 56 + +ModInv = 47 +A = 3f +M = 56 + +ModInv = 2d +A = 41 +M = 56 + +ModInv = 9 +A = 43 +M = 56 + +ModInv = 5 +A = 45 +M = 56 + +ModInv = 3f +A = 47 +M = 56 + +ModInv = 21 +A = 49 +M = 56 + +ModInv = 27 +A = 4b +M = 56 + +ModInv = 13 +A = 4d +M = 56 + +ModInv = 31 +A = 4f +M = 56 + +ModInv = 11 +A = 51 +M = 56 + +ModInv = 39 +A = 53 +M = 56 + +ModInv = 55 +A = 55 +M = 56 + +ModInv = 1 +A = 57 +M = 56 + +ModInv = 1d +A = 59 +M = 56 + +ModInv = 45 +A = 5b +M = 56 + +ModInv = 25 +A = 5d +M = 56 + +ModInv = 43 +A = 5f +M = 56 + +ModInv = 2f +A = 61 +M = 56 + +ModInv = 35 +A = 63 +M = 56 + +ModInv = 14 +A = -64 +M = 57 + +ModInv = 4f +A = -62 +M = 57 + +ModInv = 1a +A = -61 +M = 57 + +ModInv = 4c +A = -5f +M = 57 + +ModInv = 3e +A = -5e +M = 57 + +ModInv = 34 +A = -5c +M = 57 + +ModInv = 41 +A = -5b +M = 57 + +ModInv = 2b +A = -59 +M = 57 + +ModInv = 56 +A = -58 +M = 57 + +ModInv = 1 +A = -56 +M = 57 + +ModInv = 2c +A = -55 +M = 57 + +ModInv = 16 +A = -53 +M = 57 + +ModInv = 23 +A = -52 +M = 57 + +ModInv = 19 +A = -50 +M = 57 + +ModInv = b +A = -4f +M = 57 + +ModInv = 3d +A = -4d +M = 57 + +ModInv = 8 +A = -4c +M = 57 + +ModInv = 43 +A = -4a +M = 57 + +ModInv = 38 +A = -49 +M = 57 + +ModInv = 31 +A = -47 +M = 57 + +ModInv = 29 +A = -46 +M = 57 + +ModInv = 37 +A = -44 +M = 57 + +ModInv = 4a +A = -43 +M = 57 + +ModInv = 4 +A = -41 +M = 57 + +ModInv = 35 +A = -40 +M = 57 + +ModInv = 7 +A = -3e +M = 57 + +ModInv = 4d +A = -3d +M = 57 + +ModInv = 1c +A = -3b +M = 57 + +ModInv = 49 +A = -38 +M = 57 + +ModInv = 44 +A = -37 +M = 57 + +ModInv = 40 +A = -35 +M = 57 + +ModInv = 5 +A = -34 +M = 57 + +ModInv = 28 +A = -32 +M = 57 + +ModInv = 47 +A = -31 +M = 57 + +ModInv = 25 +A = -2f +M = 57 + +ModInv = 11 +A = -2e +M = 57 + +ModInv = 55 +A = -2c +M = 57 + +ModInv = 2 +A = -2b +M = 57 + +ModInv = 46 +A = -29 +M = 57 + +ModInv = 32 +A = -28 +M = 57 + +ModInv = 10 +A = -26 +M = 57 + +ModInv = 2f +A = -25 +M = 57 + +ModInv = 52 +A = -23 +M = 57 + +ModInv = 17 +A = -22 +M = 57 + +ModInv = 13 +A = -20 +M = 57 + +ModInv = e +A = -1f +M = 57 + +ModInv = 3b +A = -1c +M = 57 + +ModInv = a +A = -1a +M = 57 + +ModInv = 50 +A = -19 +M = 57 + +ModInv = 22 +A = -17 +M = 57 + +ModInv = 53 +A = -16 +M = 57 + +ModInv = d +A = -14 +M = 57 + +ModInv = 20 +A = -13 +M = 57 + +ModInv = 2e +A = -11 +M = 57 + +ModInv = 26 +A = -10 +M = 57 + +ModInv = 1f +A = -e +M = 57 + +ModInv = 14 +A = -d +M = 57 + +ModInv = 4f +A = -b +M = 57 + +ModInv = 1a +A = -a +M = 57 + +ModInv = 4c +A = -8 +M = 57 + +ModInv = 3e +A = -7 +M = 57 + +ModInv = 34 +A = -5 +M = 57 + +ModInv = 41 +A = -4 +M = 57 + +ModInv = 2b +A = -2 +M = 57 + +ModInv = 56 +A = -1 +M = 57 + +ModInv = 1 +A = 1 +M = 57 + +ModInv = 2c +A = 2 +M = 57 + +ModInv = 16 +A = 4 +M = 57 + +ModInv = 23 +A = 5 +M = 57 + +ModInv = 19 +A = 7 +M = 57 + +ModInv = b +A = 8 +M = 57 + +ModInv = 3d +A = a +M = 57 + +ModInv = 8 +A = b +M = 57 + +ModInv = 43 +A = d +M = 57 + +ModInv = 38 +A = e +M = 57 + +ModInv = 31 +A = 10 +M = 57 + +ModInv = 29 +A = 11 +M = 57 + +ModInv = 37 +A = 13 +M = 57 + +ModInv = 4a +A = 14 +M = 57 + +ModInv = 4 +A = 16 +M = 57 + +ModInv = 35 +A = 17 +M = 57 + +ModInv = 7 +A = 19 +M = 57 + +ModInv = 4d +A = 1a +M = 57 + +ModInv = 1c +A = 1c +M = 57 + +ModInv = 49 +A = 1f +M = 57 + +ModInv = 44 +A = 20 +M = 57 + +ModInv = 40 +A = 22 +M = 57 + +ModInv = 5 +A = 23 +M = 57 + +ModInv = 28 +A = 25 +M = 57 + +ModInv = 47 +A = 26 +M = 57 + +ModInv = 25 +A = 28 +M = 57 + +ModInv = 11 +A = 29 +M = 57 + +ModInv = 55 +A = 2b +M = 57 + +ModInv = 2 +A = 2c +M = 57 + +ModInv = 46 +A = 2e +M = 57 + +ModInv = 32 +A = 2f +M = 57 + +ModInv = 10 +A = 31 +M = 57 + +ModInv = 2f +A = 32 +M = 57 + +ModInv = 52 +A = 34 +M = 57 + +ModInv = 17 +A = 35 +M = 57 + +ModInv = 13 +A = 37 +M = 57 + +ModInv = e +A = 38 +M = 57 + +ModInv = 3b +A = 3b +M = 57 + +ModInv = a +A = 3d +M = 57 + +ModInv = 50 +A = 3e +M = 57 + +ModInv = 22 +A = 40 +M = 57 + +ModInv = 53 +A = 41 +M = 57 + +ModInv = d +A = 43 +M = 57 + +ModInv = 20 +A = 44 +M = 57 + +ModInv = 2e +A = 46 +M = 57 + +ModInv = 26 +A = 47 +M = 57 + +ModInv = 1f +A = 49 +M = 57 + +ModInv = 14 +A = 4a +M = 57 + +ModInv = 4f +A = 4c +M = 57 + +ModInv = 1a +A = 4d +M = 57 + +ModInv = 4c +A = 4f +M = 57 + +ModInv = 3e +A = 50 +M = 57 + +ModInv = 34 +A = 52 +M = 57 + +ModInv = 41 +A = 53 +M = 57 + +ModInv = 2b +A = 55 +M = 57 + +ModInv = 56 +A = 56 +M = 57 + +ModInv = 1 +A = 58 +M = 57 + +ModInv = 2c +A = 59 +M = 57 + +ModInv = 16 +A = 5b +M = 57 + +ModInv = 23 +A = 5c +M = 57 + +ModInv = 19 +A = 5e +M = 57 + +ModInv = b +A = 5f +M = 57 + +ModInv = 3d +A = 61 +M = 57 + +ModInv = 8 +A = 62 +M = 57 + +ModInv = 27 +A = -61 +M = 58 + +ModInv = 19 +A = -5f +M = 58 + +ModInv = 23 +A = -5d +M = 58 + +ModInv = 1d +A = -5b +M = 58 + +ModInv = 57 +A = -59 +M = 58 + +ModInv = 1 +A = -57 +M = 58 + +ModInv = 3b +A = -55 +M = 58 + +ModInv = 35 +A = -53 +M = 58 + +ModInv = 3f +A = -51 +M = 58 + +ModInv = 31 +A = -4f +M = 58 + +ModInv = 3d +A = -4b +M = 58 + +ModInv = 2f +A = -49 +M = 58 + +ModInv = 39 +A = -47 +M = 58 + +ModInv = 33 +A = -45 +M = 58 + +ModInv = 15 +A = -43 +M = 58 + +ModInv = 17 +A = -41 +M = 58 + +ModInv = 51 +A = -3f +M = 58 + +ModInv = 4b +A = -3d +M = 58 + +ModInv = 55 +A = -3b +M = 58 + +ModInv = 47 +A = -39 +M = 58 + +ModInv = 53 +A = -35 +M = 58 + +ModInv = 45 +A = -33 +M = 58 + +ModInv = 4f +A = -31 +M = 58 + +ModInv = 49 +A = -2f +M = 58 + +ModInv = 2b +A = -2d +M = 58 + +ModInv = 2d +A = -2b +M = 58 + +ModInv = f +A = -29 +M = 58 + +ModInv = 9 +A = -27 +M = 58 + +ModInv = 13 +A = -25 +M = 58 + +ModInv = 5 +A = -23 +M = 58 + +ModInv = 11 +A = -1f +M = 58 + +ModInv = 3 +A = -1d +M = 58 + +ModInv = d +A = -1b +M = 58 + +ModInv = 7 +A = -19 +M = 58 + +ModInv = 41 +A = -17 +M = 58 + +ModInv = 43 +A = -15 +M = 58 + +ModInv = 25 +A = -13 +M = 58 + +ModInv = 1f +A = -11 +M = 58 + +ModInv = 29 +A = -f +M = 58 + +ModInv = 1b +A = -d +M = 58 + +ModInv = 27 +A = -9 +M = 58 + +ModInv = 19 +A = -7 +M = 58 + +ModInv = 23 +A = -5 +M = 58 + +ModInv = 1d +A = -3 +M = 58 + +ModInv = 57 +A = -1 +M = 58 + +ModInv = 1 +A = 1 +M = 58 + +ModInv = 3b +A = 3 +M = 58 + +ModInv = 35 +A = 5 +M = 58 + +ModInv = 3f +A = 7 +M = 58 + +ModInv = 31 +A = 9 +M = 58 + +ModInv = 3d +A = d +M = 58 + +ModInv = 2f +A = f +M = 58 + +ModInv = 39 +A = 11 +M = 58 + +ModInv = 33 +A = 13 +M = 58 + +ModInv = 15 +A = 15 +M = 58 + +ModInv = 17 +A = 17 +M = 58 + +ModInv = 51 +A = 19 +M = 58 + +ModInv = 4b +A = 1b +M = 58 + +ModInv = 55 +A = 1d +M = 58 + +ModInv = 47 +A = 1f +M = 58 + +ModInv = 53 +A = 23 +M = 58 + +ModInv = 45 +A = 25 +M = 58 + +ModInv = 4f +A = 27 +M = 58 + +ModInv = 49 +A = 29 +M = 58 + +ModInv = 2b +A = 2b +M = 58 + +ModInv = 2d +A = 2d +M = 58 + +ModInv = f +A = 2f +M = 58 + +ModInv = 9 +A = 31 +M = 58 + +ModInv = 13 +A = 33 +M = 58 + +ModInv = 5 +A = 35 +M = 58 + +ModInv = 11 +A = 39 +M = 58 + +ModInv = 3 +A = 3b +M = 58 + +ModInv = d +A = 3d +M = 58 + +ModInv = 7 +A = 3f +M = 58 + +ModInv = 41 +A = 41 +M = 58 + +ModInv = 43 +A = 43 +M = 58 + +ModInv = 25 +A = 45 +M = 58 + +ModInv = 1f +A = 47 +M = 58 + +ModInv = 29 +A = 49 +M = 58 + +ModInv = 1b +A = 4b +M = 58 + +ModInv = 27 +A = 4f +M = 58 + +ModInv = 19 +A = 51 +M = 58 + +ModInv = 23 +A = 53 +M = 58 + +ModInv = 1d +A = 55 +M = 58 + +ModInv = 57 +A = 57 +M = 58 + +ModInv = 1 +A = 59 +M = 58 + +ModInv = 3b +A = 5b +M = 58 + +ModInv = 35 +A = 5d +M = 58 + +ModInv = 3f +A = 5f +M = 58 + +ModInv = 31 +A = 61 +M = 58 + +ModInv = 8 +A = -64 +M = 59 + +ModInv = 50 +A = -63 +M = 59 + +ModInv = 4f +A = -62 +M = 59 + +ModInv = b +A = -61 +M = 59 + +ModInv = 26 +A = -60 +M = 59 + +ModInv = 4a +A = -5f +M = 59 + +ModInv = 47 +A = -5e +M = 59 + +ModInv = 16 +A = -5d +M = 59 + +ModInv = 3b +A = -5c +M = 59 + +ModInv = 2c +A = -5b +M = 59 + +ModInv = 58 +A = -5a +M = 59 + +ModInv = 1 +A = -58 +M = 59 + +ModInv = 2d +A = -57 +M = 59 + +ModInv = 1e +A = -56 +M = 59 + +ModInv = 43 +A = -55 +M = 59 + +ModInv = 12 +A = -54 +M = 59 + +ModInv = f +A = -53 +M = 59 + +ModInv = 33 +A = -52 +M = 59 + +ModInv = 4e +A = -51 +M = 59 + +ModInv = a +A = -50 +M = 59 + +ModInv = 9 +A = -4f +M = 59 + +ModInv = 51 +A = -4e +M = 59 + +ModInv = 34 +A = -4d +M = 59 + +ModInv = 30 +A = -4c +M = 59 + +ModInv = 46 +A = -4b +M = 59 + +ModInv = 6 +A = -4a +M = 59 + +ModInv = 27 +A = -49 +M = 59 + +ModInv = 15 +A = -48 +M = 59 + +ModInv = 5 +A = -47 +M = 59 + +ModInv = 4b +A = -46 +M = 59 + +ModInv = 31 +A = -45 +M = 59 + +ModInv = 11 +A = -44 +M = 59 + +ModInv = 55 +A = -43 +M = 59 + +ModInv = 1f +A = -42 +M = 59 + +ModInv = 1a +A = -41 +M = 59 + +ModInv = 39 +A = -40 +M = 59 + +ModInv = 18 +A = -3f +M = 59 + +ModInv = 21 +A = -3e +M = 59 + +ModInv = 23 +A = -3d +M = 59 + +ModInv = 2b +A = -3c +M = 59 + +ModInv = 3 +A = -3b +M = 59 + +ModInv = 17 +A = -3a +M = 59 + +ModInv = 40 +A = -39 +M = 59 + +ModInv = 1b +A = -38 +M = 59 + +ModInv = 37 +A = -37 +M = 59 + +ModInv = 1c +A = -36 +M = 59 + +ModInv = 2f +A = -35 +M = 59 + +ModInv = 4d +A = -34 +M = 59 + +ModInv = 52 +A = -33 +M = 59 + +ModInv = 10 +A = -32 +M = 59 + +ModInv = 45 +A = -31 +M = 59 + +ModInv = 4c +A = -30 +M = 59 + +ModInv = 35 +A = -2f +M = 59 + +ModInv = 1d +A = -2e +M = 59 + +ModInv = 57 +A = -2d +M = 59 + +ModInv = 2 +A = -2c +M = 59 + +ModInv = 3c +A = -2b +M = 59 + +ModInv = 24 +A = -2a +M = 59 + +ModInv = d +A = -29 +M = 59 + +ModInv = 14 +A = -28 +M = 59 + +ModInv = 49 +A = -27 +M = 59 + +ModInv = 7 +A = -26 +M = 59 + +ModInv = c +A = -25 +M = 59 + +ModInv = 2a +A = -24 +M = 59 + +ModInv = 3d +A = -23 +M = 59 + +ModInv = 22 +A = -22 +M = 59 + +ModInv = 3e +A = -21 +M = 59 + +ModInv = 19 +A = -20 +M = 59 + +ModInv = 42 +A = -1f +M = 59 + +ModInv = 56 +A = -1e +M = 59 + +ModInv = 2e +A = -1d +M = 59 + +ModInv = 36 +A = -1c +M = 59 + +ModInv = 38 +A = -1b +M = 59 + +ModInv = 41 +A = -1a +M = 59 + +ModInv = 20 +A = -19 +M = 59 + +ModInv = 3f +A = -18 +M = 59 + +ModInv = 3a +A = -17 +M = 59 + +ModInv = 4 +A = -16 +M = 59 + +ModInv = 48 +A = -15 +M = 59 + +ModInv = 28 +A = -14 +M = 59 + +ModInv = e +A = -13 +M = 59 + +ModInv = 54 +A = -12 +M = 59 + +ModInv = 44 +A = -11 +M = 59 + +ModInv = 32 +A = -10 +M = 59 + +ModInv = 53 +A = -f +M = 59 + +ModInv = 13 +A = -e +M = 59 + +ModInv = 29 +A = -d +M = 59 + +ModInv = 25 +A = -c +M = 59 + +ModInv = 8 +A = -b +M = 59 + +ModInv = 50 +A = -a +M = 59 + +ModInv = 4f +A = -9 +M = 59 + +ModInv = b +A = -8 +M = 59 + +ModInv = 26 +A = -7 +M = 59 + +ModInv = 4a +A = -6 +M = 59 + +ModInv = 47 +A = -5 +M = 59 + +ModInv = 16 +A = -4 +M = 59 + +ModInv = 3b +A = -3 +M = 59 + +ModInv = 2c +A = -2 +M = 59 + +ModInv = 58 +A = -1 +M = 59 + +ModInv = 1 +A = 1 +M = 59 + +ModInv = 2d +A = 2 +M = 59 + +ModInv = 1e +A = 3 +M = 59 + +ModInv = 43 +A = 4 +M = 59 + +ModInv = 12 +A = 5 +M = 59 + +ModInv = f +A = 6 +M = 59 + +ModInv = 33 +A = 7 +M = 59 + +ModInv = 4e +A = 8 +M = 59 + +ModInv = a +A = 9 +M = 59 + +ModInv = 9 +A = a +M = 59 + +ModInv = 51 +A = b +M = 59 + +ModInv = 34 +A = c +M = 59 + +ModInv = 30 +A = d +M = 59 + +ModInv = 46 +A = e +M = 59 + +ModInv = 6 +A = f +M = 59 + +ModInv = 27 +A = 10 +M = 59 + +ModInv = 15 +A = 11 +M = 59 + +ModInv = 5 +A = 12 +M = 59 + +ModInv = 4b +A = 13 +M = 59 + +ModInv = 31 +A = 14 +M = 59 + +ModInv = 11 +A = 15 +M = 59 + +ModInv = 55 +A = 16 +M = 59 + +ModInv = 1f +A = 17 +M = 59 + +ModInv = 1a +A = 18 +M = 59 + +ModInv = 39 +A = 19 +M = 59 + +ModInv = 18 +A = 1a +M = 59 + +ModInv = 21 +A = 1b +M = 59 + +ModInv = 23 +A = 1c +M = 59 + +ModInv = 2b +A = 1d +M = 59 + +ModInv = 3 +A = 1e +M = 59 + +ModInv = 17 +A = 1f +M = 59 + +ModInv = 40 +A = 20 +M = 59 + +ModInv = 1b +A = 21 +M = 59 + +ModInv = 37 +A = 22 +M = 59 + +ModInv = 1c +A = 23 +M = 59 + +ModInv = 2f +A = 24 +M = 59 + +ModInv = 4d +A = 25 +M = 59 + +ModInv = 52 +A = 26 +M = 59 + +ModInv = 10 +A = 27 +M = 59 + +ModInv = 45 +A = 28 +M = 59 + +ModInv = 4c +A = 29 +M = 59 + +ModInv = 35 +A = 2a +M = 59 + +ModInv = 1d +A = 2b +M = 59 + +ModInv = 57 +A = 2c +M = 59 + +ModInv = 2 +A = 2d +M = 59 + +ModInv = 3c +A = 2e +M = 59 + +ModInv = 24 +A = 2f +M = 59 + +ModInv = d +A = 30 +M = 59 + +ModInv = 14 +A = 31 +M = 59 + +ModInv = 49 +A = 32 +M = 59 + +ModInv = 7 +A = 33 +M = 59 + +ModInv = c +A = 34 +M = 59 + +ModInv = 2a +A = 35 +M = 59 + +ModInv = 3d +A = 36 +M = 59 + +ModInv = 22 +A = 37 +M = 59 + +ModInv = 3e +A = 38 +M = 59 + +ModInv = 19 +A = 39 +M = 59 + +ModInv = 42 +A = 3a +M = 59 + +ModInv = 56 +A = 3b +M = 59 + +ModInv = 2e +A = 3c +M = 59 + +ModInv = 36 +A = 3d +M = 59 + +ModInv = 38 +A = 3e +M = 59 + +ModInv = 41 +A = 3f +M = 59 + +ModInv = 20 +A = 40 +M = 59 + +ModInv = 3f +A = 41 +M = 59 + +ModInv = 3a +A = 42 +M = 59 + +ModInv = 4 +A = 43 +M = 59 + +ModInv = 48 +A = 44 +M = 59 + +ModInv = 28 +A = 45 +M = 59 + +ModInv = e +A = 46 +M = 59 + +ModInv = 54 +A = 47 +M = 59 + +ModInv = 44 +A = 48 +M = 59 + +ModInv = 32 +A = 49 +M = 59 + +ModInv = 53 +A = 4a +M = 59 + +ModInv = 13 +A = 4b +M = 59 + +ModInv = 29 +A = 4c +M = 59 + +ModInv = 25 +A = 4d +M = 59 + +ModInv = 8 +A = 4e +M = 59 + +ModInv = 50 +A = 4f +M = 59 + +ModInv = 4f +A = 50 +M = 59 + +ModInv = b +A = 51 +M = 59 + +ModInv = 26 +A = 52 +M = 59 + +ModInv = 4a +A = 53 +M = 59 + +ModInv = 47 +A = 54 +M = 59 + +ModInv = 16 +A = 55 +M = 59 + +ModInv = 3b +A = 56 +M = 59 + +ModInv = 2c +A = 57 +M = 59 + +ModInv = 58 +A = 58 +M = 59 + +ModInv = 1 +A = 5a +M = 59 + +ModInv = 2d +A = 5b +M = 59 + +ModInv = 1e +A = 5c +M = 59 + +ModInv = 43 +A = 5d +M = 59 + +ModInv = 12 +A = 5e +M = 59 + +ModInv = f +A = 5f +M = 59 + +ModInv = 33 +A = 60 +M = 59 + +ModInv = 4e +A = 61 +M = 59 + +ModInv = a +A = 62 +M = 59 + +ModInv = 9 +A = 63 +M = 59 + +ModInv = 4d +A = -61 +M = 5a + +ModInv = 59 +A = -5b +M = 5a + +ModInv = 1 +A = -59 +M = 5a + +ModInv = d +A = -53 +M = 5a + +ModInv = 29 +A = -4f +M = 5a + +ModInv = 7 +A = -4d +M = 5a + +ModInv = 35 +A = -49 +M = 5a + +ModInv = 13 +A = -47 +M = 5a + +ModInv = 2f +A = -43 +M = 5a + +ModInv = 3b +A = -3d +M = 5a + +ModInv = 3d +A = -3b +M = 5a + +ModInv = 49 +A = -35 +M = 5a + +ModInv = b +A = -31 +M = 5a + +ModInv = 43 +A = -2f +M = 5a + +ModInv = 17 +A = -2b +M = 5a + +ModInv = 4f +A = -29 +M = 5a + +ModInv = 11 +A = -25 +M = 5a + +ModInv = 1d +A = -1f +M = 5a + +ModInv = 1f +A = -1d +M = 5a + +ModInv = 2b +A = -17 +M = 5a + +ModInv = 47 +A = -13 +M = 5a + +ModInv = 25 +A = -11 +M = 5a + +ModInv = 53 +A = -d +M = 5a + +ModInv = 31 +A = -b +M = 5a + +ModInv = 4d +A = -7 +M = 5a + +ModInv = 59 +A = -1 +M = 5a + +ModInv = 1 +A = 1 +M = 5a + +ModInv = d +A = 7 +M = 5a + +ModInv = 29 +A = b +M = 5a + +ModInv = 7 +A = d +M = 5a + +ModInv = 35 +A = 11 +M = 5a + +ModInv = 13 +A = 13 +M = 5a + +ModInv = 2f +A = 17 +M = 5a + +ModInv = 3b +A = 1d +M = 5a + +ModInv = 3d +A = 1f +M = 5a + +ModInv = 49 +A = 25 +M = 5a + +ModInv = b +A = 29 +M = 5a + +ModInv = 43 +A = 2b +M = 5a + +ModInv = 17 +A = 2f +M = 5a + +ModInv = 4f +A = 31 +M = 5a + +ModInv = 11 +A = 35 +M = 5a + +ModInv = 1d +A = 3b +M = 5a + +ModInv = 1f +A = 3d +M = 5a + +ModInv = 2b +A = 43 +M = 5a + +ModInv = 47 +A = 47 +M = 5a + +ModInv = 25 +A = 49 +M = 5a + +ModInv = 53 +A = 4d +M = 5a + +ModInv = 31 +A = 4f +M = 5a + +ModInv = 4d +A = 53 +M = 5a + +ModInv = 59 +A = 59 +M = 5a + +ModInv = 1 +A = 5b +M = 5a + +ModInv = d +A = 61 +M = 5a + +ModInv = a +A = -64 +M = 5b + +ModInv = 22 +A = -63 +M = 5b + +ModInv = f +A = -61 +M = 5b + +ModInv = 12 +A = -60 +M = 5b + +ModInv = 44 +A = -5f +M = 5b + +ModInv = 1e +A = -5e +M = 5b + +ModInv = 2d +A = -5d +M = 5b + +ModInv = 5a +A = -5c +M = 5b + +ModInv = 1 +A = -5a +M = 5b + +ModInv = 2e +A = -59 +M = 5b + +ModInv = 3d +A = -58 +M = 5b + +ModInv = 17 +A = -57 +M = 5b + +ModInv = 49 +A = -56 +M = 5b + +ModInv = 4c +A = -55 +M = 5b + +ModInv = 39 +A = -53 +M = 5b + +ModInv = 51 +A = -52 +M = 5b + +ModInv = 52 +A = -51 +M = 5b + +ModInv = 3a +A = -50 +M = 5b + +ModInv = 26 +A = -4f +M = 5b + +ModInv = 55 +A = -4c +M = 5b + +ModInv = 4a +A = -4b +M = 5b + +ModInv = 4b +A = -4a +M = 5b + +ModInv = 56 +A = -49 +M = 5b + +ModInv = 18 +A = -48 +M = 5b + +ModInv = 29 +A = -47 +M = 5b + +ModInv = 1d +A = -45 +M = 5b + +ModInv = 4 +A = -44 +M = 5b + +ModInv = 13 +A = -43 +M = 5b + +ModInv = 33 +A = -42 +M = 5b + +ModInv = 1b +A = -40 +M = 5b + +ModInv = 16 +A = -3e +M = 5b + +ModInv = 58 +A = -3d +M = 5b + +ModInv = 2f +A = -3c +M = 5b + +ModInv = 25 +A = -3b +M = 5b + +ModInv = 50 +A = -3a +M = 5b + +ModInv = 53 +A = -39 +M = 5b + +ModInv = 2b +A = -37 +M = 5b + +ModInv = 20 +A = -36 +M = 5b + +ModInv = c +A = -35 +M = 5b + +ModInv = 42 +A = -33 +M = 5b + +ModInv = 14 +A = -32 +M = 5b + +ModInv = 24 +A = -30 +M = 5b + +ModInv = 3c +A = -2f +M = 5b + +ModInv = 59 +A = -2e +M = 5b + +ModInv = 2 +A = -2d +M = 5b + +ModInv = 1f +A = -2c +M = 5b + +ModInv = 37 +A = -2b +M = 5b + +ModInv = 47 +A = -29 +M = 5b + +ModInv = 19 +A = -28 +M = 5b + +ModInv = 4f +A = -26 +M = 5b + +ModInv = 3b +A = -25 +M = 5b + +ModInv = 30 +A = -24 +M = 5b + +ModInv = 8 +A = -22 +M = 5b + +ModInv = b +A = -21 +M = 5b + +ModInv = 36 +A = -20 +M = 5b + +ModInv = 2c +A = -1f +M = 5b + +ModInv = 3 +A = -1e +M = 5b + +ModInv = 45 +A = -1d +M = 5b + +ModInv = 40 +A = -1b +M = 5b + +ModInv = 28 +A = -19 +M = 5b + +ModInv = 48 +A = -18 +M = 5b + +ModInv = 57 +A = -17 +M = 5b + +ModInv = 3e +A = -16 +M = 5b + +ModInv = 32 +A = -14 +M = 5b + +ModInv = 43 +A = -13 +M = 5b + +ModInv = 5 +A = -12 +M = 5b + +ModInv = 10 +A = -11 +M = 5b + +ModInv = 11 +A = -10 +M = 5b + +ModInv = 6 +A = -f +M = 5b + +ModInv = 35 +A = -c +M = 5b + +ModInv = 21 +A = -b +M = 5b + +ModInv = 9 +A = -a +M = 5b + +ModInv = a +A = -9 +M = 5b + +ModInv = 22 +A = -8 +M = 5b + +ModInv = f +A = -6 +M = 5b + +ModInv = 12 +A = -5 +M = 5b + +ModInv = 44 +A = -4 +M = 5b + +ModInv = 1e +A = -3 +M = 5b + +ModInv = 2d +A = -2 +M = 5b + +ModInv = 5a +A = -1 +M = 5b + +ModInv = 1 +A = 1 +M = 5b + +ModInv = 2e +A = 2 +M = 5b + +ModInv = 3d +A = 3 +M = 5b + +ModInv = 17 +A = 4 +M = 5b + +ModInv = 49 +A = 5 +M = 5b + +ModInv = 4c +A = 6 +M = 5b + +ModInv = 39 +A = 8 +M = 5b + +ModInv = 51 +A = 9 +M = 5b + +ModInv = 52 +A = a +M = 5b + +ModInv = 3a +A = b +M = 5b + +ModInv = 26 +A = c +M = 5b + +ModInv = 55 +A = f +M = 5b + +ModInv = 4a +A = 10 +M = 5b + +ModInv = 4b +A = 11 +M = 5b + +ModInv = 56 +A = 12 +M = 5b + +ModInv = 18 +A = 13 +M = 5b + +ModInv = 29 +A = 14 +M = 5b + +ModInv = 1d +A = 16 +M = 5b + +ModInv = 4 +A = 17 +M = 5b + +ModInv = 13 +A = 18 +M = 5b + +ModInv = 33 +A = 19 +M = 5b + +ModInv = 1b +A = 1b +M = 5b + +ModInv = 16 +A = 1d +M = 5b + +ModInv = 58 +A = 1e +M = 5b + +ModInv = 2f +A = 1f +M = 5b + +ModInv = 25 +A = 20 +M = 5b + +ModInv = 50 +A = 21 +M = 5b + +ModInv = 53 +A = 22 +M = 5b + +ModInv = 2b +A = 24 +M = 5b + +ModInv = 20 +A = 25 +M = 5b + +ModInv = c +A = 26 +M = 5b + +ModInv = 42 +A = 28 +M = 5b + +ModInv = 14 +A = 29 +M = 5b + +ModInv = 24 +A = 2b +M = 5b + +ModInv = 3c +A = 2c +M = 5b + +ModInv = 59 +A = 2d +M = 5b + +ModInv = 2 +A = 2e +M = 5b + +ModInv = 1f +A = 2f +M = 5b + +ModInv = 37 +A = 30 +M = 5b + +ModInv = 47 +A = 32 +M = 5b + +ModInv = 19 +A = 33 +M = 5b + +ModInv = 4f +A = 35 +M = 5b + +ModInv = 3b +A = 36 +M = 5b + +ModInv = 30 +A = 37 +M = 5b + +ModInv = 8 +A = 39 +M = 5b + +ModInv = b +A = 3a +M = 5b + +ModInv = 36 +A = 3b +M = 5b + +ModInv = 2c +A = 3c +M = 5b + +ModInv = 3 +A = 3d +M = 5b + +ModInv = 45 +A = 3e +M = 5b + +ModInv = 40 +A = 40 +M = 5b + +ModInv = 28 +A = 42 +M = 5b + +ModInv = 48 +A = 43 +M = 5b + +ModInv = 57 +A = 44 +M = 5b + +ModInv = 3e +A = 45 +M = 5b + +ModInv = 32 +A = 47 +M = 5b + +ModInv = 43 +A = 48 +M = 5b + +ModInv = 5 +A = 49 +M = 5b + +ModInv = 10 +A = 4a +M = 5b + +ModInv = 11 +A = 4b +M = 5b + +ModInv = 6 +A = 4c +M = 5b + +ModInv = 35 +A = 4f +M = 5b + +ModInv = 21 +A = 50 +M = 5b + +ModInv = 9 +A = 51 +M = 5b + +ModInv = a +A = 52 +M = 5b + +ModInv = 22 +A = 53 +M = 5b + +ModInv = f +A = 55 +M = 5b + +ModInv = 12 +A = 56 +M = 5b + +ModInv = 44 +A = 57 +M = 5b + +ModInv = 1e +A = 58 +M = 5b + +ModInv = 2d +A = 59 +M = 5b + +ModInv = 5a +A = 5a +M = 5b + +ModInv = 1 +A = 5c +M = 5b + +ModInv = 2e +A = 5d +M = 5b + +ModInv = 3d +A = 5e +M = 5b + +ModInv = 17 +A = 5f +M = 5b + +ModInv = 49 +A = 60 +M = 5b + +ModInv = 4c +A = 61 +M = 5b + +ModInv = 39 +A = 63 +M = 5b + +ModInv = d +A = -63 +M = 5c + +ModInv = 37 +A = -61 +M = 5c + +ModInv = 3d +A = -5f +M = 5c + +ModInv = 5b +A = -5d +M = 5c + +ModInv = 1 +A = -5b +M = 5c + +ModInv = 1f +A = -59 +M = 5c + +ModInv = 25 +A = -57 +M = 5c + +ModInv = 4f +A = -55 +M = 5c + +ModInv = 29 +A = -53 +M = 5c + +ModInv = 43 +A = -51 +M = 5c + +ModInv = 55 +A = -4f +M = 5c + +ModInv = 2b +A = -4d +M = 5c + +ModInv = 41 +A = -4b +M = 5c + +ModInv = 3f +A = -49 +M = 5c + +ModInv = 39 +A = -47 +M = 5c + +ModInv = 51 +A = -43 +M = 5c + +ModInv = 4b +A = -41 +M = 5c + +ModInv = 49 +A = -3f +M = 5c + +ModInv = 3 +A = -3d +M = 5c + +ModInv = 35 +A = -3b +M = 5c + +ModInv = 47 +A = -39 +M = 5c + +ModInv = 5 +A = -37 +M = 5c + +ModInv = 3b +A = -35 +M = 5c + +ModInv = 9 +A = -33 +M = 5c + +ModInv = f +A = -31 +M = 5c + +ModInv = 2d +A = -2f +M = 5c + +ModInv = 2f +A = -2d +M = 5c + +ModInv = 4d +A = -2b +M = 5c + +ModInv = 53 +A = -29 +M = 5c + +ModInv = 21 +A = -27 +M = 5c + +ModInv = 57 +A = -25 +M = 5c + +ModInv = 15 +A = -23 +M = 5c + +ModInv = 27 +A = -21 +M = 5c + +ModInv = 59 +A = -1f +M = 5c + +ModInv = 13 +A = -1d +M = 5c + +ModInv = 11 +A = -1b +M = 5c + +ModInv = b +A = -19 +M = 5c + +ModInv = 23 +A = -15 +M = 5c + +ModInv = 1d +A = -13 +M = 5c + +ModInv = 1b +A = -11 +M = 5c + +ModInv = 31 +A = -f +M = 5c + +ModInv = 7 +A = -d +M = 5c + +ModInv = 19 +A = -b +M = 5c + +ModInv = 33 +A = -9 +M = 5c + +ModInv = d +A = -7 +M = 5c + +ModInv = 37 +A = -5 +M = 5c + +ModInv = 3d +A = -3 +M = 5c + +ModInv = 5b +A = -1 +M = 5c + +ModInv = 1 +A = 1 +M = 5c + +ModInv = 1f +A = 3 +M = 5c + +ModInv = 25 +A = 5 +M = 5c + +ModInv = 4f +A = 7 +M = 5c + +ModInv = 29 +A = 9 +M = 5c + +ModInv = 43 +A = b +M = 5c + +ModInv = 55 +A = d +M = 5c + +ModInv = 2b +A = f +M = 5c + +ModInv = 41 +A = 11 +M = 5c + +ModInv = 3f +A = 13 +M = 5c + +ModInv = 39 +A = 15 +M = 5c + +ModInv = 51 +A = 19 +M = 5c + +ModInv = 4b +A = 1b +M = 5c + +ModInv = 49 +A = 1d +M = 5c + +ModInv = 3 +A = 1f +M = 5c + +ModInv = 35 +A = 21 +M = 5c + +ModInv = 47 +A = 23 +M = 5c + +ModInv = 5 +A = 25 +M = 5c + +ModInv = 3b +A = 27 +M = 5c + +ModInv = 9 +A = 29 +M = 5c + +ModInv = f +A = 2b +M = 5c + +ModInv = 2d +A = 2d +M = 5c + +ModInv = 2f +A = 2f +M = 5c + +ModInv = 4d +A = 31 +M = 5c + +ModInv = 53 +A = 33 +M = 5c + +ModInv = 21 +A = 35 +M = 5c + +ModInv = 57 +A = 37 +M = 5c + +ModInv = 15 +A = 39 +M = 5c + +ModInv = 27 +A = 3b +M = 5c + +ModInv = 59 +A = 3d +M = 5c + +ModInv = 13 +A = 3f +M = 5c + +ModInv = 11 +A = 41 +M = 5c + +ModInv = b +A = 43 +M = 5c + +ModInv = 23 +A = 47 +M = 5c + +ModInv = 1d +A = 49 +M = 5c + +ModInv = 1b +A = 4b +M = 5c + +ModInv = 31 +A = 4d +M = 5c + +ModInv = 7 +A = 4f +M = 5c + +ModInv = 19 +A = 51 +M = 5c + +ModInv = 33 +A = 53 +M = 5c + +ModInv = d +A = 55 +M = 5c + +ModInv = 37 +A = 57 +M = 5c + +ModInv = 3d +A = 59 +M = 5c + +ModInv = 5b +A = 5b +M = 5c + +ModInv = 1 +A = 5d +M = 5c + +ModInv = 1f +A = 5f +M = 5c + +ModInv = 25 +A = 61 +M = 5c + +ModInv = 4f +A = 63 +M = 5c + +ModInv = 35 +A = -64 +M = 5d + +ModInv = 25 +A = -62 +M = 5d + +ModInv = 17 +A = -61 +M = 5d + +ModInv = 2e +A = -5f +M = 5d + +ModInv = 5c +A = -5e +M = 5d + +ModInv = 1 +A = -5c +M = 5d + +ModInv = 2f +A = -5b +M = 5d + +ModInv = 46 +A = -59 +M = 5d + +ModInv = 38 +A = -58 +M = 5d + +ModInv = 28 +A = -56 +M = 5d + +ModInv = 23 +A = -55 +M = 5d + +ModInv = 1c +A = -53 +M = 5d + +ModInv = 11 +A = -52 +M = 5d + +ModInv = 2b +A = -50 +M = 5d + +ModInv = 14 +A = -4f +M = 5d + +ModInv = 40 +A = -4d +M = 5d + +ModInv = b +A = -4c +M = 5d + +ModInv = 31 +A = -4a +M = 5d + +ModInv = e +A = -49 +M = 5d + +ModInv = 37 +A = -47 +M = 5d + +ModInv = 59 +A = -46 +M = 5d + +ModInv = 43 +A = -44 +M = 5d + +ModInv = 44 +A = -43 +M = 5d + +ModInv = a +A = -41 +M = 5d + +ModInv = 4d +A = -40 +M = 5d + +ModInv = 20 +A = -3d +M = 5d + +ModInv = 34 +A = -3b +M = 5d + +ModInv = 8 +A = -3a +M = 5d + +ModInv = 58 +A = -38 +M = 5d + +ModInv = 47 +A = -37 +M = 5d + +ModInv = 7 +A = -35 +M = 5d + +ModInv = 3b +A = -34 +M = 5d + +ModInv = d +A = -32 +M = 5d + +ModInv = 4a +A = -31 +M = 5d + +ModInv = 5b +A = -2f +M = 5d + +ModInv = 2 +A = -2e +M = 5d + +ModInv = 13 +A = -2c +M = 5d + +ModInv = 50 +A = -2b +M = 5d + +ModInv = 22 +A = -29 +M = 5d + +ModInv = 56 +A = -28 +M = 5d + +ModInv = 16 +A = -26 +M = 5d + +ModInv = 5 +A = -25 +M = 5d + +ModInv = 55 +A = -23 +M = 5d + +ModInv = 29 +A = -22 +M = 5d + +ModInv = 3d +A = -20 +M = 5d + +ModInv = 10 +A = -1d +M = 5d + +ModInv = 53 +A = -1c +M = 5d + +ModInv = 19 +A = -1a +M = 5d + +ModInv = 1a +A = -19 +M = 5d + +ModInv = 4 +A = -17 +M = 5d + +ModInv = 26 +A = -16 +M = 5d + +ModInv = 4f +A = -14 +M = 5d + +ModInv = 2c +A = -13 +M = 5d + +ModInv = 52 +A = -11 +M = 5d + +ModInv = 1d +A = -10 +M = 5d + +ModInv = 49 +A = -e +M = 5d + +ModInv = 32 +A = -d +M = 5d + +ModInv = 4c +A = -b +M = 5d + +ModInv = 41 +A = -a +M = 5d + +ModInv = 3a +A = -8 +M = 5d + +ModInv = 35 +A = -7 +M = 5d + +ModInv = 25 +A = -5 +M = 5d + +ModInv = 17 +A = -4 +M = 5d + +ModInv = 2e +A = -2 +M = 5d + +ModInv = 5c +A = -1 +M = 5d + +ModInv = 1 +A = 1 +M = 5d + +ModInv = 2f +A = 2 +M = 5d + +ModInv = 46 +A = 4 +M = 5d + +ModInv = 38 +A = 5 +M = 5d + +ModInv = 28 +A = 7 +M = 5d + +ModInv = 23 +A = 8 +M = 5d + +ModInv = 1c +A = a +M = 5d + +ModInv = 11 +A = b +M = 5d + +ModInv = 2b +A = d +M = 5d + +ModInv = 14 +A = e +M = 5d + +ModInv = 40 +A = 10 +M = 5d + +ModInv = b +A = 11 +M = 5d + +ModInv = 31 +A = 13 +M = 5d + +ModInv = e +A = 14 +M = 5d + +ModInv = 37 +A = 16 +M = 5d + +ModInv = 59 +A = 17 +M = 5d + +ModInv = 43 +A = 19 +M = 5d + +ModInv = 44 +A = 1a +M = 5d + +ModInv = a +A = 1c +M = 5d + +ModInv = 4d +A = 1d +M = 5d + +ModInv = 20 +A = 20 +M = 5d + +ModInv = 34 +A = 22 +M = 5d + +ModInv = 8 +A = 23 +M = 5d + +ModInv = 58 +A = 25 +M = 5d + +ModInv = 47 +A = 26 +M = 5d + +ModInv = 7 +A = 28 +M = 5d + +ModInv = 3b +A = 29 +M = 5d + +ModInv = d +A = 2b +M = 5d + +ModInv = 4a +A = 2c +M = 5d + +ModInv = 5b +A = 2e +M = 5d + +ModInv = 2 +A = 2f +M = 5d + +ModInv = 13 +A = 31 +M = 5d + +ModInv = 50 +A = 32 +M = 5d + +ModInv = 22 +A = 34 +M = 5d + +ModInv = 56 +A = 35 +M = 5d + +ModInv = 16 +A = 37 +M = 5d + +ModInv = 5 +A = 38 +M = 5d + +ModInv = 55 +A = 3a +M = 5d + +ModInv = 29 +A = 3b +M = 5d + +ModInv = 3d +A = 3d +M = 5d + +ModInv = 10 +A = 40 +M = 5d + +ModInv = 53 +A = 41 +M = 5d + +ModInv = 19 +A = 43 +M = 5d + +ModInv = 1a +A = 44 +M = 5d + +ModInv = 4 +A = 46 +M = 5d + +ModInv = 26 +A = 47 +M = 5d + +ModInv = 4f +A = 49 +M = 5d + +ModInv = 2c +A = 4a +M = 5d + +ModInv = 52 +A = 4c +M = 5d + +ModInv = 1d +A = 4d +M = 5d + +ModInv = 49 +A = 4f +M = 5d + +ModInv = 32 +A = 50 +M = 5d + +ModInv = 4c +A = 52 +M = 5d + +ModInv = 41 +A = 53 +M = 5d + +ModInv = 3a +A = 55 +M = 5d + +ModInv = 35 +A = 56 +M = 5d + +ModInv = 25 +A = 58 +M = 5d + +ModInv = 17 +A = 59 +M = 5d + +ModInv = 2e +A = 5b +M = 5d + +ModInv = 5c +A = 5c +M = 5d + +ModInv = 1 +A = 5e +M = 5d + +ModInv = 2f +A = 5f +M = 5d + +ModInv = 46 +A = 61 +M = 5d + +ModInv = 38 +A = 62 +M = 5d + +ModInv = 4b +A = -63 +M = 5e + +ModInv = 1f +A = -61 +M = 5e + +ModInv = 5d +A = -5f +M = 5e + +ModInv = 1 +A = -5d +M = 5e + +ModInv = 3f +A = -5b +M = 5e + +ModInv = 13 +A = -59 +M = 5e + +ModInv = 1b +A = -57 +M = 5e + +ModInv = 15 +A = -55 +M = 5e + +ModInv = 4d +A = -53 +M = 5e + +ModInv = 1d +A = -51 +M = 5e + +ModInv = 45 +A = -4f +M = 5e + +ModInv = 53 +A = -4d +M = 5e + +ModInv = 5 +A = -4b +M = 5e + +ModInv = 9 +A = -49 +M = 5e + +ModInv = 2d +A = -47 +M = 5e + +ModInv = 4f +A = -45 +M = 5e + +ModInv = 7 +A = -43 +M = 5e + +ModInv = d +A = -41 +M = 5e + +ModInv = 5b +A = -3f +M = 5e + +ModInv = 39 +A = -3d +M = 5e + +ModInv = 2b +A = -3b +M = 5e + +ModInv = 3d +A = -39 +M = 5e + +ModInv = 29 +A = -37 +M = 5e + +ModInv = 27 +A = -35 +M = 5e + +ModInv = 23 +A = -33 +M = 5e + +ModInv = 17 +A = -31 +M = 5e + +ModInv = 47 +A = -2d +M = 5e + +ModInv = 3b +A = -2b +M = 5e + +ModInv = 37 +A = -29 +M = 5e + +ModInv = 35 +A = -27 +M = 5e + +ModInv = 21 +A = -25 +M = 5e + +ModInv = 33 +A = -23 +M = 5e + +ModInv = 25 +A = -21 +M = 5e + +ModInv = 3 +A = -1f +M = 5e + +ModInv = 51 +A = -1d +M = 5e + +ModInv = 57 +A = -1b +M = 5e + +ModInv = f +A = -19 +M = 5e + +ModInv = 31 +A = -17 +M = 5e + +ModInv = 55 +A = -15 +M = 5e + +ModInv = 59 +A = -13 +M = 5e + +ModInv = b +A = -11 +M = 5e + +ModInv = 19 +A = -f +M = 5e + +ModInv = 41 +A = -d +M = 5e + +ModInv = 11 +A = -b +M = 5e + +ModInv = 49 +A = -9 +M = 5e + +ModInv = 43 +A = -7 +M = 5e + +ModInv = 4b +A = -5 +M = 5e + +ModInv = 1f +A = -3 +M = 5e + +ModInv = 5d +A = -1 +M = 5e + +ModInv = 1 +A = 1 +M = 5e + +ModInv = 3f +A = 3 +M = 5e + +ModInv = 13 +A = 5 +M = 5e + +ModInv = 1b +A = 7 +M = 5e + +ModInv = 15 +A = 9 +M = 5e + +ModInv = 4d +A = b +M = 5e + +ModInv = 1d +A = d +M = 5e + +ModInv = 45 +A = f +M = 5e + +ModInv = 53 +A = 11 +M = 5e + +ModInv = 5 +A = 13 +M = 5e + +ModInv = 9 +A = 15 +M = 5e + +ModInv = 2d +A = 17 +M = 5e + +ModInv = 4f +A = 19 +M = 5e + +ModInv = 7 +A = 1b +M = 5e + +ModInv = d +A = 1d +M = 5e + +ModInv = 5b +A = 1f +M = 5e + +ModInv = 39 +A = 21 +M = 5e + +ModInv = 2b +A = 23 +M = 5e + +ModInv = 3d +A = 25 +M = 5e + +ModInv = 29 +A = 27 +M = 5e + +ModInv = 27 +A = 29 +M = 5e + +ModInv = 23 +A = 2b +M = 5e + +ModInv = 17 +A = 2d +M = 5e + +ModInv = 47 +A = 31 +M = 5e + +ModInv = 3b +A = 33 +M = 5e + +ModInv = 37 +A = 35 +M = 5e + +ModInv = 35 +A = 37 +M = 5e + +ModInv = 21 +A = 39 +M = 5e + +ModInv = 33 +A = 3b +M = 5e + +ModInv = 25 +A = 3d +M = 5e + +ModInv = 3 +A = 3f +M = 5e + +ModInv = 51 +A = 41 +M = 5e + +ModInv = 57 +A = 43 +M = 5e + +ModInv = f +A = 45 +M = 5e + +ModInv = 31 +A = 47 +M = 5e + +ModInv = 55 +A = 49 +M = 5e + +ModInv = 59 +A = 4b +M = 5e + +ModInv = b +A = 4d +M = 5e + +ModInv = 19 +A = 4f +M = 5e + +ModInv = 41 +A = 51 +M = 5e + +ModInv = 11 +A = 53 +M = 5e + +ModInv = 49 +A = 55 +M = 5e + +ModInv = 43 +A = 57 +M = 5e + +ModInv = 4b +A = 59 +M = 5e + +ModInv = 1f +A = 5b +M = 5e + +ModInv = 5d +A = 5d +M = 5e + +ModInv = 1 +A = 5f +M = 5e + +ModInv = 3f +A = 61 +M = 5e + +ModInv = 13 +A = 63 +M = 5e + +ModInv = 47 +A = -63 +M = 5f + +ModInv = 3f +A = -62 +M = 5f + +ModInv = 2f +A = -61 +M = 5f + +ModInv = 5e +A = -60 +M = 5f + +ModInv = 1 +A = -5e +M = 5f + +ModInv = 30 +A = -5d +M = 5f + +ModInv = 20 +A = -5c +M = 5f + +ModInv = 18 +A = -5b +M = 5f + +ModInv = 10 +A = -59 +M = 5f + +ModInv = 44 +A = -58 +M = 5f + +ModInv = c +A = -57 +M = 5f + +ModInv = 4a +A = -56 +M = 5f + +ModInv = 1a +A = -54 +M = 5f + +ModInv = 8 +A = -53 +M = 5f + +ModInv = 16 +A = -52 +M = 5f + +ModInv = 22 +A = -51 +M = 5f + +ModInv = 6 +A = -4f +M = 5f + +ModInv = 1c +A = -4e +M = 5f + +ModInv = 25 +A = -4d +M = 5f + +ModInv = 56 +A = -4a +M = 5f + +ModInv = d +A = -49 +M = 5f + +ModInv = 3e +A = -48 +M = 5f + +ModInv = 4 +A = -47 +M = 5f + +ModInv = b +A = -45 +M = 5f + +ModInv = 58 +A = -44 +M = 5f + +ModInv = 11 +A = -43 +M = 5f + +ModInv = 3b +A = -42 +M = 5f + +ModInv = 2e +A = -40 +M = 5f + +ModInv = 3 +A = -3f +M = 5f + +ModInv = 48 +A = -3e +M = 5f + +ModInv = e +A = -3d +M = 5f + +ModInv = 42 +A = -3b +M = 5f + +ModInv = 12 +A = -3a +M = 5f + +ModInv = 27 +A = -38 +M = 5f + +ModInv = 33 +A = -36 +M = 5f + +ModInv = 2b +A = -35 +M = 5f + +ModInv = 2a +A = -34 +M = 5f + +ModInv = 36 +A = -33 +M = 5f + +ModInv = 1f +A = -31 +M = 5f + +ModInv = 5d +A = -30 +M = 5f + +ModInv = 2 +A = -2f +M = 5f + +ModInv = 40 +A = -2e +M = 5f + +ModInv = 29 +A = -2c +M = 5f + +ModInv = 35 +A = -2b +M = 5f + +ModInv = 34 +A = -2a +M = 5f + +ModInv = 2c +A = -29 +M = 5f + +ModInv = 38 +A = -27 +M = 5f + +ModInv = 4d +A = -25 +M = 5f + +ModInv = 1d +A = -24 +M = 5f + +ModInv = 51 +A = -22 +M = 5f + +ModInv = 17 +A = -21 +M = 5f + +ModInv = 5c +A = -20 +M = 5f + +ModInv = 31 +A = -1f +M = 5f + +ModInv = 24 +A = -1d +M = 5f + +ModInv = 4e +A = -1c +M = 5f + +ModInv = 7 +A = -1b +M = 5f + +ModInv = 54 +A = -1a +M = 5f + +ModInv = 5b +A = -18 +M = 5f + +ModInv = 21 +A = -17 +M = 5f + +ModInv = 52 +A = -16 +M = 5f + +ModInv = 9 +A = -15 +M = 5f + +ModInv = 3a +A = -12 +M = 5f + +ModInv = 43 +A = -11 +M = 5f + +ModInv = 59 +A = -10 +M = 5f + +ModInv = 3d +A = -e +M = 5f + +ModInv = 49 +A = -d +M = 5f + +ModInv = 57 +A = -c +M = 5f + +ModInv = 45 +A = -b +M = 5f + +ModInv = 15 +A = -9 +M = 5f + +ModInv = 53 +A = -8 +M = 5f + +ModInv = 1b +A = -7 +M = 5f + +ModInv = 4f +A = -6 +M = 5f + +ModInv = 47 +A = -4 +M = 5f + +ModInv = 3f +A = -3 +M = 5f + +ModInv = 2f +A = -2 +M = 5f + +ModInv = 5e +A = -1 +M = 5f + +ModInv = 1 +A = 1 +M = 5f + +ModInv = 30 +A = 2 +M = 5f + +ModInv = 20 +A = 3 +M = 5f + +ModInv = 18 +A = 4 +M = 5f + +ModInv = 10 +A = 6 +M = 5f + +ModInv = 44 +A = 7 +M = 5f + +ModInv = c +A = 8 +M = 5f + +ModInv = 4a +A = 9 +M = 5f + +ModInv = 1a +A = b +M = 5f + +ModInv = 8 +A = c +M = 5f + +ModInv = 16 +A = d +M = 5f + +ModInv = 22 +A = e +M = 5f + +ModInv = 6 +A = 10 +M = 5f + +ModInv = 1c +A = 11 +M = 5f + +ModInv = 25 +A = 12 +M = 5f + +ModInv = 56 +A = 15 +M = 5f + +ModInv = d +A = 16 +M = 5f + +ModInv = 3e +A = 17 +M = 5f + +ModInv = 4 +A = 18 +M = 5f + +ModInv = b +A = 1a +M = 5f + +ModInv = 58 +A = 1b +M = 5f + +ModInv = 11 +A = 1c +M = 5f + +ModInv = 3b +A = 1d +M = 5f + +ModInv = 2e +A = 1f +M = 5f + +ModInv = 3 +A = 20 +M = 5f + +ModInv = 48 +A = 21 +M = 5f + +ModInv = e +A = 22 +M = 5f + +ModInv = 42 +A = 24 +M = 5f + +ModInv = 12 +A = 25 +M = 5f + +ModInv = 27 +A = 27 +M = 5f + +ModInv = 33 +A = 29 +M = 5f + +ModInv = 2b +A = 2a +M = 5f + +ModInv = 2a +A = 2b +M = 5f + +ModInv = 36 +A = 2c +M = 5f + +ModInv = 1f +A = 2e +M = 5f + +ModInv = 5d +A = 2f +M = 5f + +ModInv = 2 +A = 30 +M = 5f + +ModInv = 40 +A = 31 +M = 5f + +ModInv = 29 +A = 33 +M = 5f + +ModInv = 35 +A = 34 +M = 5f + +ModInv = 34 +A = 35 +M = 5f + +ModInv = 2c +A = 36 +M = 5f + +ModInv = 38 +A = 38 +M = 5f + +ModInv = 4d +A = 3a +M = 5f + +ModInv = 1d +A = 3b +M = 5f + +ModInv = 51 +A = 3d +M = 5f + +ModInv = 17 +A = 3e +M = 5f + +ModInv = 5c +A = 3f +M = 5f + +ModInv = 31 +A = 40 +M = 5f + +ModInv = 24 +A = 42 +M = 5f + +ModInv = 4e +A = 43 +M = 5f + +ModInv = 7 +A = 44 +M = 5f + +ModInv = 54 +A = 45 +M = 5f + +ModInv = 5b +A = 47 +M = 5f + +ModInv = 21 +A = 48 +M = 5f + +ModInv = 52 +A = 49 +M = 5f + +ModInv = 9 +A = 4a +M = 5f + +ModInv = 3a +A = 4d +M = 5f + +ModInv = 43 +A = 4e +M = 5f + +ModInv = 59 +A = 4f +M = 5f + +ModInv = 3d +A = 51 +M = 5f + +ModInv = 49 +A = 52 +M = 5f + +ModInv = 57 +A = 53 +M = 5f + +ModInv = 45 +A = 54 +M = 5f + +ModInv = 15 +A = 56 +M = 5f + +ModInv = 53 +A = 57 +M = 5f + +ModInv = 1b +A = 58 +M = 5f + +ModInv = 4f +A = 59 +M = 5f + +ModInv = 47 +A = 5b +M = 5f + +ModInv = 3f +A = 5c +M = 5f + +ModInv = 2f +A = 5d +M = 5f + +ModInv = 5e +A = 5e +M = 5f + +ModInv = 1 +A = 60 +M = 5f + +ModInv = 30 +A = 61 +M = 5f + +ModInv = 20 +A = 62 +M = 5f + +ModInv = 18 +A = 63 +M = 5f + +ModInv = 5f +A = -61 +M = 60 + +ModInv = 1 +A = -5f +M = 60 + +ModInv = 4d +A = -5b +M = 60 + +ModInv = 37 +A = -59 +M = 60 + +ModInv = 23 +A = -55 +M = 60 + +ModInv = 25 +A = -53 +M = 60 + +ModInv = 11 +A = -4f +M = 60 + +ModInv = 5b +A = -4d +M = 60 + +ModInv = 47 +A = -49 +M = 60 + +ModInv = 49 +A = -47 +M = 60 + +ModInv = 35 +A = -43 +M = 60 + +ModInv = 1f +A = -41 +M = 60 + +ModInv = b +A = -3d +M = 60 + +ModInv = d +A = -3b +M = 60 + +ModInv = 59 +A = -37 +M = 60 + +ModInv = 43 +A = -35 +M = 60 + +ModInv = 2f +A = -31 +M = 60 + +ModInv = 31 +A = -2f +M = 60 + +ModInv = 1d +A = -2b +M = 60 + +ModInv = 7 +A = -29 +M = 60 + +ModInv = 53 +A = -25 +M = 60 + +ModInv = 55 +A = -23 +M = 60 + +ModInv = 41 +A = -1f +M = 60 + +ModInv = 2b +A = -1d +M = 60 + +ModInv = 17 +A = -19 +M = 60 + +ModInv = 19 +A = -17 +M = 60 + +ModInv = 5 +A = -13 +M = 60 + +ModInv = 4f +A = -11 +M = 60 + +ModInv = 3b +A = -d +M = 60 + +ModInv = 3d +A = -b +M = 60 + +ModInv = 29 +A = -7 +M = 60 + +ModInv = 13 +A = -5 +M = 60 + +ModInv = 5f +A = -1 +M = 60 + +ModInv = 1 +A = 1 +M = 60 + +ModInv = 4d +A = 5 +M = 60 + +ModInv = 37 +A = 7 +M = 60 + +ModInv = 23 +A = b +M = 60 + +ModInv = 25 +A = d +M = 60 + +ModInv = 11 +A = 11 +M = 60 + +ModInv = 5b +A = 13 +M = 60 + +ModInv = 47 +A = 17 +M = 60 + +ModInv = 49 +A = 19 +M = 60 + +ModInv = 35 +A = 1d +M = 60 + +ModInv = 1f +A = 1f +M = 60 + +ModInv = b +A = 23 +M = 60 + +ModInv = d +A = 25 +M = 60 + +ModInv = 59 +A = 29 +M = 60 + +ModInv = 43 +A = 2b +M = 60 + +ModInv = 2f +A = 2f +M = 60 + +ModInv = 31 +A = 31 +M = 60 + +ModInv = 1d +A = 35 +M = 60 + +ModInv = 7 +A = 37 +M = 60 + +ModInv = 53 +A = 3b +M = 60 + +ModInv = 55 +A = 3d +M = 60 + +ModInv = 41 +A = 41 +M = 60 + +ModInv = 2b +A = 43 +M = 60 + +ModInv = 17 +A = 47 +M = 60 + +ModInv = 19 +A = 49 +M = 60 + +ModInv = 5 +A = 4d +M = 60 + +ModInv = 4f +A = 4f +M = 60 + +ModInv = 3b +A = 53 +M = 60 + +ModInv = 3d +A = 55 +M = 60 + +ModInv = 29 +A = 59 +M = 60 + +ModInv = 13 +A = 5b +M = 60 + +ModInv = 5f +A = 5f +M = 60 + +ModInv = 1 +A = 61 +M = 60 + +ModInv = 20 +A = -64 +M = 61 + +ModInv = 30 +A = -63 +M = 61 + +ModInv = 60 +A = -62 +M = 61 + +ModInv = 1 +A = -60 +M = 61 + +ModInv = 31 +A = -5f +M = 61 + +ModInv = 41 +A = -5e +M = 61 + +ModInv = 49 +A = -5d +M = 61 + +ModInv = 27 +A = -5c +M = 61 + +ModInv = 51 +A = -5b +M = 61 + +ModInv = e +A = -5a +M = 61 + +ModInv = 55 +A = -59 +M = 61 + +ModInv = 36 +A = -58 +M = 61 + +ModInv = 44 +A = -57 +M = 61 + +ModInv = 35 +A = -56 +M = 61 + +ModInv = 59 +A = -55 +M = 61 + +ModInv = f +A = -54 +M = 61 + +ModInv = 7 +A = -53 +M = 61 + +ModInv = d +A = -52 +M = 61 + +ModInv = 5b +A = -51 +M = 61 + +ModInv = 28 +A = -50 +M = 61 + +ModInv = 1b +A = -4f +M = 61 + +ModInv = 2e +A = -4e +M = 61 + +ModInv = 22 +A = -4d +M = 61 + +ModInv = 25 +A = -4c +M = 61 + +ModInv = 4b +A = -4b +M = 61 + +ModInv = 26 +A = -4a +M = 61 + +ModInv = 5d +A = -49 +M = 61 + +ModInv = 42 +A = -48 +M = 61 + +ModInv = 38 +A = -47 +M = 61 + +ModInv = 12 +A = -46 +M = 61 + +ModInv = 34 +A = -45 +M = 61 + +ModInv = 57 +A = -44 +M = 61 + +ModInv = 37 +A = -43 +M = 61 + +ModInv = 48 +A = -42 +M = 61 + +ModInv = 5e +A = -41 +M = 61 + +ModInv = 32 +A = -40 +M = 61 + +ModInv = 14 +A = -3f +M = 61 + +ModInv = 3d +A = -3e +M = 61 + +ModInv = 3e +A = -3d +M = 61 + +ModInv = 15 +A = -3c +M = 61 + +ModInv = 17 +A = -3b +M = 61 + +ModInv = 5 +A = -3a +M = 61 + +ModInv = 11 +A = -39 +M = 61 + +ModInv = 47 +A = -38 +M = 61 + +ModInv = 43 +A = -37 +M = 61 + +ModInv = 58 +A = -36 +M = 61 + +ModInv = 56 +A = -35 +M = 61 + +ModInv = 45 +A = -34 +M = 61 + +ModInv = 13 +A = -33 +M = 61 + +ModInv = 40 +A = -32 +M = 61 + +ModInv = 5f +A = -31 +M = 61 + +ModInv = 2 +A = -30 +M = 61 + +ModInv = 21 +A = -2f +M = 61 + +ModInv = 4e +A = -2e +M = 61 + +ModInv = 1c +A = -2d +M = 61 + +ModInv = b +A = -2c +M = 61 + +ModInv = 9 +A = -2b +M = 61 + +ModInv = 1e +A = -2a +M = 61 + +ModInv = 1a +A = -29 +M = 61 + +ModInv = 50 +A = -28 +M = 61 + +ModInv = 5c +A = -27 +M = 61 + +ModInv = 4a +A = -26 +M = 61 + +ModInv = 4c +A = -25 +M = 61 + +ModInv = 23 +A = -24 +M = 61 + +ModInv = 24 +A = -23 +M = 61 + +ModInv = 4d +A = -22 +M = 61 + +ModInv = 2f +A = -21 +M = 61 + +ModInv = 3 +A = -20 +M = 61 + +ModInv = 19 +A = -1f +M = 61 + +ModInv = 2a +A = -1e +M = 61 + +ModInv = a +A = -1d +M = 61 + +ModInv = 2d +A = -1c +M = 61 + +ModInv = 4f +A = -1b +M = 61 + +ModInv = 29 +A = -1a +M = 61 + +ModInv = 1f +A = -19 +M = 61 + +ModInv = 4 +A = -18 +M = 61 + +ModInv = 3b +A = -17 +M = 61 + +ModInv = 16 +A = -16 +M = 61 + +ModInv = 3c +A = -15 +M = 61 + +ModInv = 3f +A = -14 +M = 61 + +ModInv = 33 +A = -13 +M = 61 + +ModInv = 46 +A = -12 +M = 61 + +ModInv = 39 +A = -11 +M = 61 + +ModInv = 6 +A = -10 +M = 61 + +ModInv = 54 +A = -f +M = 61 + +ModInv = 5a +A = -e +M = 61 + +ModInv = 52 +A = -d +M = 61 + +ModInv = 8 +A = -c +M = 61 + +ModInv = 2c +A = -b +M = 61 + +ModInv = 1d +A = -a +M = 61 + +ModInv = 2b +A = -9 +M = 61 + +ModInv = c +A = -8 +M = 61 + +ModInv = 53 +A = -7 +M = 61 + +ModInv = 10 +A = -6 +M = 61 + +ModInv = 3a +A = -5 +M = 61 + +ModInv = 18 +A = -4 +M = 61 + +ModInv = 20 +A = -3 +M = 61 + +ModInv = 30 +A = -2 +M = 61 + +ModInv = 60 +A = -1 +M = 61 + +ModInv = 1 +A = 1 +M = 61 + +ModInv = 31 +A = 2 +M = 61 + +ModInv = 41 +A = 3 +M = 61 + +ModInv = 49 +A = 4 +M = 61 + +ModInv = 27 +A = 5 +M = 61 + +ModInv = 51 +A = 6 +M = 61 + +ModInv = e +A = 7 +M = 61 + +ModInv = 55 +A = 8 +M = 61 + +ModInv = 36 +A = 9 +M = 61 + +ModInv = 44 +A = a +M = 61 + +ModInv = 35 +A = b +M = 61 + +ModInv = 59 +A = c +M = 61 + +ModInv = f +A = d +M = 61 + +ModInv = 7 +A = e +M = 61 + +ModInv = d +A = f +M = 61 + +ModInv = 5b +A = 10 +M = 61 + +ModInv = 28 +A = 11 +M = 61 + +ModInv = 1b +A = 12 +M = 61 + +ModInv = 2e +A = 13 +M = 61 + +ModInv = 22 +A = 14 +M = 61 + +ModInv = 25 +A = 15 +M = 61 + +ModInv = 4b +A = 16 +M = 61 + +ModInv = 26 +A = 17 +M = 61 + +ModInv = 5d +A = 18 +M = 61 + +ModInv = 42 +A = 19 +M = 61 + +ModInv = 38 +A = 1a +M = 61 + +ModInv = 12 +A = 1b +M = 61 + +ModInv = 34 +A = 1c +M = 61 + +ModInv = 57 +A = 1d +M = 61 + +ModInv = 37 +A = 1e +M = 61 + +ModInv = 48 +A = 1f +M = 61 + +ModInv = 5e +A = 20 +M = 61 + +ModInv = 32 +A = 21 +M = 61 + +ModInv = 14 +A = 22 +M = 61 + +ModInv = 3d +A = 23 +M = 61 + +ModInv = 3e +A = 24 +M = 61 + +ModInv = 15 +A = 25 +M = 61 + +ModInv = 17 +A = 26 +M = 61 + +ModInv = 5 +A = 27 +M = 61 + +ModInv = 11 +A = 28 +M = 61 + +ModInv = 47 +A = 29 +M = 61 + +ModInv = 43 +A = 2a +M = 61 + +ModInv = 58 +A = 2b +M = 61 + +ModInv = 56 +A = 2c +M = 61 + +ModInv = 45 +A = 2d +M = 61 + +ModInv = 13 +A = 2e +M = 61 + +ModInv = 40 +A = 2f +M = 61 + +ModInv = 5f +A = 30 +M = 61 + +ModInv = 2 +A = 31 +M = 61 + +ModInv = 21 +A = 32 +M = 61 + +ModInv = 4e +A = 33 +M = 61 + +ModInv = 1c +A = 34 +M = 61 + +ModInv = b +A = 35 +M = 61 + +ModInv = 9 +A = 36 +M = 61 + +ModInv = 1e +A = 37 +M = 61 + +ModInv = 1a +A = 38 +M = 61 + +ModInv = 50 +A = 39 +M = 61 + +ModInv = 5c +A = 3a +M = 61 + +ModInv = 4a +A = 3b +M = 61 + +ModInv = 4c +A = 3c +M = 61 + +ModInv = 23 +A = 3d +M = 61 + +ModInv = 24 +A = 3e +M = 61 + +ModInv = 4d +A = 3f +M = 61 + +ModInv = 2f +A = 40 +M = 61 + +ModInv = 3 +A = 41 +M = 61 + +ModInv = 19 +A = 42 +M = 61 + +ModInv = 2a +A = 43 +M = 61 + +ModInv = a +A = 44 +M = 61 + +ModInv = 2d +A = 45 +M = 61 + +ModInv = 4f +A = 46 +M = 61 + +ModInv = 29 +A = 47 +M = 61 + +ModInv = 1f +A = 48 +M = 61 + +ModInv = 4 +A = 49 +M = 61 + +ModInv = 3b +A = 4a +M = 61 + +ModInv = 16 +A = 4b +M = 61 + +ModInv = 3c +A = 4c +M = 61 + +ModInv = 3f +A = 4d +M = 61 + +ModInv = 33 +A = 4e +M = 61 + +ModInv = 46 +A = 4f +M = 61 + +ModInv = 39 +A = 50 +M = 61 + +ModInv = 6 +A = 51 +M = 61 + +ModInv = 54 +A = 52 +M = 61 + +ModInv = 5a +A = 53 +M = 61 + +ModInv = 52 +A = 54 +M = 61 + +ModInv = 8 +A = 55 +M = 61 + +ModInv = 2c +A = 56 +M = 61 + +ModInv = 1d +A = 57 +M = 61 + +ModInv = 2b +A = 58 +M = 61 + +ModInv = c +A = 59 +M = 61 + +ModInv = 53 +A = 5a +M = 61 + +ModInv = 10 +A = 5b +M = 61 + +ModInv = 3a +A = 5c +M = 61 + +ModInv = 18 +A = 5d +M = 61 + +ModInv = 20 +A = 5e +M = 61 + +ModInv = 30 +A = 5f +M = 61 + +ModInv = 60 +A = 60 +M = 61 + +ModInv = 1 +A = 62 +M = 61 + +ModInv = 31 +A = 63 +M = 61 + +ModInv = 61 +A = -63 +M = 62 + +ModInv = 1 +A = -61 +M = 62 + +ModInv = 21 +A = -5f +M = 62 + +ModInv = 3b +A = -5d +M = 62 + +ModInv = b +A = -59 +M = 62 + +ModInv = 9 +A = -57 +M = 62 + +ModInv = 53 +A = -55 +M = 62 + +ModInv = 55 +A = -53 +M = 62 + +ModInv = 4b +A = -51 +M = 62 + +ModInv = 1f +A = -4f +M = 62 + +ModInv = 51 +A = -4b +M = 62 + +ModInv = 33 +A = -49 +M = 62 + +ModInv = 45 +A = -47 +M = 62 + +ModInv = 47 +A = -45 +M = 62 + +ModInv = 13 +A = -43 +M = 62 + +ModInv = 3 +A = -41 +M = 62 + +ModInv = 35 +A = -3d +M = 62 + +ModInv = 5d +A = -3b +M = 62 + +ModInv = 37 +A = -39 +M = 62 + +ModInv = 39 +A = -37 +M = 62 + +ModInv = 3d +A = -35 +M = 62 + +ModInv = 49 +A = -33 +M = 62 + +ModInv = 19 +A = -2f +M = 62 + +ModInv = 25 +A = -2d +M = 62 + +ModInv = 29 +A = -2b +M = 62 + +ModInv = 2b +A = -29 +M = 62 + +ModInv = 5 +A = -27 +M = 62 + +ModInv = 2d +A = -25 +M = 62 + +ModInv = 5f +A = -21 +M = 62 + +ModInv = 4f +A = -1f +M = 62 + +ModInv = 1b +A = -1d +M = 62 + +ModInv = 1d +A = -1b +M = 62 + +ModInv = 2f +A = -19 +M = 62 + +ModInv = 11 +A = -17 +M = 62 + +ModInv = 43 +A = -13 +M = 62 + +ModInv = 17 +A = -11 +M = 62 + +ModInv = d +A = -f +M = 62 + +ModInv = f +A = -d +M = 62 + +ModInv = 59 +A = -b +M = 62 + +ModInv = 57 +A = -9 +M = 62 + +ModInv = 27 +A = -5 +M = 62 + +ModInv = 41 +A = -3 +M = 62 + +ModInv = 61 +A = -1 +M = 62 + +ModInv = 1 +A = 1 +M = 62 + +ModInv = 21 +A = 3 +M = 62 + +ModInv = 3b +A = 5 +M = 62 + +ModInv = b +A = 9 +M = 62 + +ModInv = 9 +A = b +M = 62 + +ModInv = 53 +A = d +M = 62 + +ModInv = 55 +A = f +M = 62 + +ModInv = 4b +A = 11 +M = 62 + +ModInv = 1f +A = 13 +M = 62 + +ModInv = 51 +A = 17 +M = 62 + +ModInv = 33 +A = 19 +M = 62 + +ModInv = 45 +A = 1b +M = 62 + +ModInv = 47 +A = 1d +M = 62 + +ModInv = 13 +A = 1f +M = 62 + +ModInv = 3 +A = 21 +M = 62 + +ModInv = 35 +A = 25 +M = 62 + +ModInv = 5d +A = 27 +M = 62 + +ModInv = 37 +A = 29 +M = 62 + +ModInv = 39 +A = 2b +M = 62 + +ModInv = 3d +A = 2d +M = 62 + +ModInv = 49 +A = 2f +M = 62 + +ModInv = 19 +A = 33 +M = 62 + +ModInv = 25 +A = 35 +M = 62 + +ModInv = 29 +A = 37 +M = 62 + +ModInv = 2b +A = 39 +M = 62 + +ModInv = 5 +A = 3b +M = 62 + +ModInv = 2d +A = 3d +M = 62 + +ModInv = 5f +A = 41 +M = 62 + +ModInv = 4f +A = 43 +M = 62 + +ModInv = 1b +A = 45 +M = 62 + +ModInv = 1d +A = 47 +M = 62 + +ModInv = 2f +A = 49 +M = 62 + +ModInv = 11 +A = 4b +M = 62 + +ModInv = 43 +A = 4f +M = 62 + +ModInv = 17 +A = 51 +M = 62 + +ModInv = d +A = 53 +M = 62 + +ModInv = f +A = 55 +M = 62 + +ModInv = 59 +A = 57 +M = 62 + +ModInv = 57 +A = 59 +M = 62 + +ModInv = 27 +A = 5d +M = 62 + +ModInv = 41 +A = 5f +M = 62 + +ModInv = 61 +A = 61 +M = 62 + +ModInv = 1 +A = 63 +M = 62 + +ModInv = 62 +A = -64 +M = 63 + +ModInv = 1 +A = -62 +M = 63 + +ModInv = 32 +A = -61 +M = 63 + +ModInv = 19 +A = -5f +M = 63 + +ModInv = 14 +A = -5e +M = 63 + +ModInv = 55 +A = -5c +M = 63 + +ModInv = 3e +A = -5b +M = 63 + +ModInv = a +A = -59 +M = 63 + +ModInv = 3d +A = -56 +M = 63 + +ModInv = 5c +A = -55 +M = 63 + +ModInv = 1f +A = -53 +M = 63 + +ModInv = 23 +A = -52 +M = 63 + +ModInv = 49 +A = -50 +M = 63 + +ModInv = 5 +A = -4f +M = 63 + +ModInv = 38 +A = -4c +M = 63 + +ModInv = 4 +A = -4a +M = 63 + +ModInv = 50 +A = -49 +M = 63 + +ModInv = 2e +A = -47 +M = 63 + +ModInv = 29 +A = -46 +M = 63 + +ModInv = 10 +A = -44 +M = 63 + +ModInv = 41 +A = -43 +M = 63 + +ModInv = 43 +A = -41 +M = 63 + +ModInv = 11 +A = -40 +M = 63 + +ModInv = 5b +A = -3e +M = 63 + +ModInv = 56 +A = -3d +M = 63 + +ModInv = 34 +A = -3b +M = 63 + +ModInv = 1d +A = -3a +M = 63 + +ModInv = 4c +A = -38 +M = 63 + +ModInv = 1c +A = -35 +M = 63 + +ModInv = 3b +A = -34 +M = 63 + +ModInv = 61 +A = -32 +M = 63 + +ModInv = 2 +A = -31 +M = 63 + +ModInv = 28 +A = -2f +M = 63 + +ModInv = 47 +A = -2e +M = 63 + +ModInv = 17 +A = -2b +M = 63 + +ModInv = 46 +A = -29 +M = 63 + +ModInv = 2f +A = -28 +M = 63 + +ModInv = d +A = -26 +M = 63 + +ModInv = 8 +A = -25 +M = 63 + +ModInv = 52 +A = -23 +M = 63 + +ModInv = 20 +A = -22 +M = 63 + +ModInv = 22 +A = -20 +M = 63 + +ModInv = 53 +A = -1f +M = 63 + +ModInv = 3a +A = -1d +M = 63 + +ModInv = 35 +A = -1c +M = 63 + +ModInv = 13 +A = -1a +M = 63 + +ModInv = 5f +A = -19 +M = 63 + +ModInv = 2b +A = -17 +M = 63 + +ModInv = 5e +A = -14 +M = 63 + +ModInv = 1a +A = -13 +M = 63 + +ModInv = 40 +A = -11 +M = 63 + +ModInv = 44 +A = -10 +M = 63 + +ModInv = 7 +A = -e +M = 63 + +ModInv = 26 +A = -d +M = 63 + +ModInv = 59 +A = -a +M = 63 + +ModInv = 25 +A = -8 +M = 63 + +ModInv = e +A = -7 +M = 63 + +ModInv = 4f +A = -5 +M = 63 + +ModInv = 4a +A = -4 +M = 63 + +ModInv = 31 +A = -2 +M = 63 + +ModInv = 62 +A = -1 +M = 63 + +ModInv = 1 +A = 1 +M = 63 + +ModInv = 32 +A = 2 +M = 63 + +ModInv = 19 +A = 4 +M = 63 + +ModInv = 14 +A = 5 +M = 63 + +ModInv = 55 +A = 7 +M = 63 + +ModInv = 3e +A = 8 +M = 63 + +ModInv = a +A = a +M = 63 + +ModInv = 3d +A = d +M = 63 + +ModInv = 5c +A = e +M = 63 + +ModInv = 1f +A = 10 +M = 63 + +ModInv = 23 +A = 11 +M = 63 + +ModInv = 49 +A = 13 +M = 63 + +ModInv = 5 +A = 14 +M = 63 + +ModInv = 38 +A = 17 +M = 63 + +ModInv = 4 +A = 19 +M = 63 + +ModInv = 50 +A = 1a +M = 63 + +ModInv = 2e +A = 1c +M = 63 + +ModInv = 29 +A = 1d +M = 63 + +ModInv = 10 +A = 1f +M = 63 + +ModInv = 41 +A = 20 +M = 63 + +ModInv = 43 +A = 22 +M = 63 + +ModInv = 11 +A = 23 +M = 63 + +ModInv = 5b +A = 25 +M = 63 + +ModInv = 56 +A = 26 +M = 63 + +ModInv = 34 +A = 28 +M = 63 + +ModInv = 1d +A = 29 +M = 63 + +ModInv = 4c +A = 2b +M = 63 + +ModInv = 1c +A = 2e +M = 63 + +ModInv = 3b +A = 2f +M = 63 + +ModInv = 61 +A = 31 +M = 63 + +ModInv = 2 +A = 32 +M = 63 + +ModInv = 28 +A = 34 +M = 63 + +ModInv = 47 +A = 35 +M = 63 + +ModInv = 17 +A = 38 +M = 63 + +ModInv = 46 +A = 3a +M = 63 + +ModInv = 2f +A = 3b +M = 63 + +ModInv = d +A = 3d +M = 63 + +ModInv = 8 +A = 3e +M = 63 + +ModInv = 52 +A = 40 +M = 63 + +ModInv = 20 +A = 41 +M = 63 + +ModInv = 22 +A = 43 +M = 63 + +ModInv = 53 +A = 44 +M = 63 + +ModInv = 3a +A = 46 +M = 63 + +ModInv = 35 +A = 47 +M = 63 + +ModInv = 13 +A = 49 +M = 63 + +ModInv = 5f +A = 4a +M = 63 + +ModInv = 2b +A = 4c +M = 63 + +ModInv = 5e +A = 4f +M = 63 + +ModInv = 1a +A = 50 +M = 63 + +ModInv = 40 +A = 52 +M = 63 + +ModInv = 44 +A = 53 +M = 63 + +ModInv = 7 +A = 55 +M = 63 + +ModInv = 26 +A = 56 +M = 63 + +ModInv = 59 +A = 59 +M = 63 + +ModInv = 25 +A = 5b +M = 63 + +ModInv = e +A = 5c +M = 63 + +ModInv = 4f +A = 5e +M = 63 + +ModInv = 4a +A = 5f +M = 63 + +ModInv = 31 +A = 61 +M = 63 + +ModInv = 62 +A = 62 +M = 63 + +ModInv = 3101a89b97a9ed435eebd32e2f90259e6343fa83077ff9288fbedca82d9cd56d8b9dbbb6af414e02b0d7b3d33326b9f4f5ff43b8ccae05bc95ebf3a1dcd0c818c65e565a5f75a955a7f898a99c6d80bd333836d0c2dbf651561a79939de45a0233343604c97d5fcb71c30bdb478fc23e288032dd69473652207b7bccd8e1337ca1a00ca6bc1d5ccd671731febc7e7e7b8893654067921dafd9341d80510ffffa434f82f42adf11a12bbf31fa009ca971b32da9d3154ae224395c7120de268e5ada41f4fb50dcf671b87789a334879bd733027ba5347cb75eee1d802b4bf0496e51e5da203e9038caf65daa7479ec5e3992fdf38ee565e8353a0dfa6e036a7375 +A = -d7 +M = 42af9fc385776e9add84f39e71545a137a1d50068d723104f77383c13458a748e9bb17bca3f2c9bf9c6316b950f244556f25e2a25a92118719c78df48f4ff31e78de58575487ce1eaf19922ad9b8a714e61a441c12e0c8b2bad640fb19488dec4f65d4d9259f4329e6f4590b9a164106cf6a659eb4862b21fb97d43588561712e8e5216afcbd04c340212ef7cca5a5a19e4d6e3c1846d424c17c627923c6612f4826867323a7711a8133287637ebdcd9e87a1613e443df789558867f5ba91faf7a024204f7c1bd874da5e709d4713d60c8a70639eb1167b367a9c3787c65c1e582e2e662f728b4fa42485e3a0a5d2f346baa9455e3e70682c2094cac629f6fbe + +ModInv = 7205c1777634d8c1940e8404207f6bb5c0449c22e1328e99183789690dc3770fceff4e053ca2e3c45670cbe9f266019b4860c8ace723f550f89abfd50ffa655ee1839fa0a40a47a54a5110fc32de244bcda9afa95df03d778d7a3e45632dd594906bf0fa1709811ede9172ead2d298de2369fa16900f3304a5acfeabf3abc135d75067d249e52c176ae86a6c0abc367c39b4e1af4463225f5b179c0dec0f480f0b42ae0458117c7c0b43768d88810a7db97dc9f72dc19a50cef314594143022a5e7edee107f5dbd688022aa1a16f16b0e13591fe965b5d80d19600bffbd19df08c8cad5326b8628b5d75675708ed0c0d39c0aa1c53c69867062d423bdd362a0f +A = -f4 +M = 829e07b0829a48d422fe99a22c70501e533c91352d3d854e061b90303b08c6e33c7295782d6c797f8f7d9b782a1be9cd8697bbd0e2520e33e44c50556c71c4a66148a86fe8624fab5186ee32ee8d7ee9770348a05d300cb90706a045defc044a09325626e6b58de744ab6cce80877b6f71e1f6d2ef8acd128b4f2fc15f3f57ebf30b94fa82523e86feac7eb7dc38f519b91751dacdbd47d364be8049a372db8f6e405d93ffed9235288bc781ae66267594c9c9500925e4749b575bd13653f8dd9b1f282e4067c3584ee207f8da94e3e8ab73738fcf1822ffbc6887782b491044d5e341245c6e433715ba2bdd177219d30e7a269fd95bafc8f2a4d27bdcf4bb99 + +ModInv = aa2dd3af93fb22928c8e81de98e5071cb94a9f4fea58a9f54205891a8fe0a6a83222538e31001a0190c9ccb4b51c23c02d602d725d6a0a0795b0145581f2be8d1767646123e3f9da6278966d604aa5e5411fda7e10166eeb7b047858bc65830766b48ff388d2b9d824b8a8461d89e2254d12621eae63570e93addf658d814a32a47a1ed8ac30bab08340ee74809d5812fa46e48444a9349ef04289358e672ea9a043a0c72f590425d922a8b00a0e8dcac5eddd2d22c54e7071c489d293f93b99e37f4580d881b9e6a8dff775891638d8bd0ce4d0fe8e1da95096b6d9223af6a3eca1df392aaf5d8803f5e1275f50baf1b819232893d8cebb28fd7f65fba9d2 +A = 3a09 +M = e6c082844dbc0ca65423a9e744b24e7f61701e1607b1c4b0f913063c02e56756a3e9570edca4eca92d04a31b941f4360908405d45c39a39ec353c162e917d310269470d0718c1afdd9a78d18dff3934223aa56a9b7e3ea1d1d784fb9db434b610b1631e941aa79e6edaf80796d3bc4685ca8af852a5fba444adf42b37f5722051e2670c24f6aa83bf36a147c2f7ad016edc5d467164890d49d0ac1e5b8063831360a4092b850ad7eb72f8263f65da874007cb47cc661e97589ca4a07c15471a4517d6c6694f229359b154881a0d5b3ffc6e35ccfaf00103f584ad4230824d215ceb3a10b3510b0b46ee1da317017a6205738d16018366cf658f7a75ed34fe5 + +ModInv = 3f7028b7e1986bc3c433216493dc35d151028e29e6fd083ce05b134804b7f0a2a39144ecd3c22832b2b804149c900df61151832aca5b01a0fee66d05d1d4487cb8588a090e35f62144f690eb628f00522121651dbc8e4bf3950249f0f5f6784d58a4ed58ea4fd8337976ee93e13fe5563e2e0f37e9ab5d1ed5e23443573d122c1d1e08fdbf2d57a086440377b6cd30a8550d91cca4ef9b28c1159db747ccbb75997fd5b43b24b66d96ef7eaa11263f0dd76b19ae84fbb9b947e141b0d8293e8d03011956bb70b4ae88bb7e381da21088423c8b3f7b71fe2c7a724f1e120493caa9ab4d375f4bcf685ca0d9fc651af2046f63ba5dfb670f41598a6424bbea41 +A = 7687 +M = 47fbb36583d61435bb5c11e95027004448a6a1c5c7d1861674518de3bb41b36bf82959cb01c357b9c7e435396bcb8fac9abb0c3478442b4a8aa593eb40a9b81a070205e323bb2abf00188dca22e4c76237dbe6b03da701c632976a10363c5f972651dafdb119a9ec801bdfdf2965b3819ad93b21e6a46f1c670ea90d243a163cee5e2c2b1e1885283b73a66c2ea417b99de255f386825473b7a490f23b2cc4b4174a672b5ebaa061076dc3ba6ace6c0a78250fb339a4769ddcc6f8efb6fbfe8de4ab47558298e214b044d79acd8acde5f6db1d76b6745180b65386569c803601a5ba50ad38835eddd6ff552fa73207237751aa4462ebfc5f915ef09cfbac6e + +ModInv = 26833790803a7e063143448916a05619d455be8543aad805505ae6e7d87efe980069d2a564257c6082273c69a5271b50760f59db66b33999e643f1be3a786e706d1d6cf8d565eacfc4f5e275183dcd97d3fa2018623461273dde3326f193c74b21039a9397c1417193d228f9d0495423c64a41d73db47a4b01a9364e84e4d2c941e14b31cc3b3e57b6fe60f14b500794c83207829c0a7cee5a31c803a46e1a2a67eaa05c3e11953887a654c39cb0d579bcd195de7ac0b62fcb259e4c05e9bd97abc12f7f86f3991f79f8db5b7367e335979c1057f12bb24c5fa939866a9ef0dce1512484c1a7f16b351e4788dba03385fd1c365c4110d254e2cbb26f8280ad +A = 9247 +M = 5dbbb7894deab44d88450fe8dac663f0e5865031e875ba224c06013c53d0e30109c207953b00b00b54aa22600fecc19d02fc90708cc1b6f829d29f3d4806c2fb7f6f5ddc2c2e2cc49104d074f942cb220adb0a5cd2875ea96ec2b34d984bffaf949e5e2cb7362c74f2e2ed432779eeacca7f0dd3ac535f489b340f6bd7f50361b0ee095ae6a2289a6ab329238123e5dc3383836b9f15c40b680c1c5c74e45eff1e5befbedc25e6f3ebcf12f3d06f863fffc830137a977753e8eb437d763fb9854a965708ceac392904cdefcf84b683a749f9c5470b9805d2d6b8777dc59a3ad035d259766bad0734c2da8003cc0f2793fdcab87b89296c6dcbac5008577eb1 + +ModInv = 33bcb9679c5ec453c8f82ff6ce9b35f8bced47788901d94f5d930d2a94da6f4febc3600f5314a22cada6d23f18d123e78dfcb19d8ff11ba3ca7454c08effbfe8b11e0cff58a97193d78da13ea3afa58da52798179c22d9ae4783141322981ab921e7b86d164850863e0bd2e5925a010a98f2b741556429d0b690ce2894c5ea9e51d488093e21aba3dd404aeeb74779235c6f93a895eeeae4a8990bcea8043cad8b514af3e70acaad31912dcf3fd360ea602a9fe5eed10e09e2b26778bce76c2e55f47bf106b157ebf91f6ce2f362e5d5ae543c7b5bc823505c11014edbc9889604c3fbfe355d8a4e8f526dddc966f8a15821cf01f31ba13c56bebb9be7c4 +A = 5c8cc1 +M = 4b03900977a9f2c943862c199bd3a49d1ce2844948a86c51ce927e89f918590825511600314ac9aee9cf6b978d7d421bb1235c9dc8b64f4e68e5c85bd78d396e0d55fc45228f4bd571b0b41b5669a0729b23994395a774f0147f76f87a640701ad82a1865506aadbf8319b25f81fcec1496e2769e927e4bf156405372ef440e5c51e9a508bb1f4c9da653868e6d9ca0bc36c05adb3fc4f6341279a23bef7be506564f3a160712456de76aaadd6b855c6b62bd09e04924d52bc614bedce030297c5e538f12d92a28f17d83ce44e27424458b6b6043106a85f68b6daa8b2a668d605d4017f9ee6725ed09d3a0562d56abd685a48f165d57b00c7f4781ef86f + +ModInv = 129ab1cce85f83e6b58ffb76edce5a4f822db50e9f559f4772aa1a629c00a3d16dd534e1586d930ce5189c3242d254db60a178ec4c738391f0a8f6b01f5e33ef087ec1a4c14db5afcb591056d1a7dfb22f7e50320683d5cd93f76d6e71c7964d34a93b01ad68d64a820bb1f20b3dacdefc995c108fa58e1dbf3048e0fc5c5409966ac9fe3d49f424ec81a653beb485ca0c8fc7f8a636dcf3e68a365ab044827037c0be80daff67d0b6d6b3a697a63922ef80f3f5b36febf0089a7174babf781f394089099505814e656e87eba8882a5e5170bb1207c34a71d593bcb4cb9b89fb2cd36631bd845d2ce851b799756a61572dfb2052967f513888aa8a3b3317 +A = -85a0bc +M = 795edbd5f6d2f09529af81dda9da14f5079168e06b0c4f27b35c11b5aecda386a3a0b730d88fe1e8a4aa1f9db8dd8a3b09dd54bec7d835c33744af929a91f4873115cd425ec38f1389998869510db4a02517e1ff83ab26a2658f32521553e014be00caa7e9bfd00724a123cf493f0febddf88d1a6bffff9a39142335e9e266cea9fab969ec07f1f83a79af371d87d8a8f065a3f96f0e51436d1fcd68615c80690847dc159e6a409c38f26b68b48ebf13c171d0b0090d625909923fb81d2706e55426eae0d2c11c339464473d212ba950666d8a4996efb447c0ceb48438b5c41f9dfd2cb85f3f4a24e39a5d998017f5e2fc574dad2986ce8349606a06e9ab + +ModInv = 56262c64c22d3318f58c4b7374560d8a0fe1e33ca3a37bc377955b32c228a5d26cab03fb8e1dc4e4143cff63bec3521e252b45542b40f37969b71b2f2cccc6f80e1629bfbd0a747265f33a34cb0316c84425ce6192591ae900f673062eb2d876350c52da88f8e2d1e5b9feb2c26c8fda046219bcc3ffa9e9a469bde5316129c9930cbdd1c962a9ea19b902c2a647fde313cdb68945a3eed3b21d502b343f4b30afaec5b1fe2d3da946c0558ed75e5374480f3ed8197fb489dc0cbdb16a1bd4887019115b8b483be2eb4a6d8f51d8b42dfdb61d93789e7ff7f6c1769fbbf133b227ff1066eea19d83c0ac0b083982643f6999373a6cfb98e0b072f22be085 +A = -2e675f +M = 86d892bdb98e97ed2981588df12289b3a30967eadff1ba23814cc594557b386eca7367c7eeb2f9c6245a57be0cbf01b4a96c43d6c44a4c87f36ab75ecfb53752145c7e60df30d5f61954c18fd63fdf8d53b0e44a6fc9ad7785adcf7dd28333adb83c81fb58929356cc2e5d93bf78bc1d89773341fde73cc608422b456d913c0bfc13cfa2f9f4f1abd893f796ef6eddae9b602ca106edc9843faac32f9525acc10a6c85a8bb9b530e60cb1e353f29b11f0de6e6342c1c40f919043234c93c43b84218e3089c7a755530004ba417007ad25f922ed764b27e790e8ba0d0e9b47d50e092f3b08f6932ac2b623d4fa08455a5b46572e63ac7a95383221f70d5dc + +ModInv = 7d5d68d9bec49dcdbfe0821e90d494000aba071f062ef84a2bbad5e695a08007ef402f82aac8c760c2cc0cab249d10ed11e81e6fd929823c3bf374a3c18101c4ab6b68e7a2a171e4f8c51397ab71d541b9652e9c7228f56a8de68d488362c40ce3239724cea9546988ce661867304040f494e2f82027f700b30bfd77653e819db914c3a9223d44007bedd2447cdf33f28829c214413baae0b2a29a43ec0fed828dd40e5ad8a2f1751d05030398cb09b35abfab513193849d79c8d172a165a103d1b0402deb6868ece7f5035e7de840be43bd58a7390ef517f9e962e0e929c1426fc9b5dcc6d7a535c26dc01330557880da3a9074cf2c3122a0760f8b73 +A = -608099f5 +M = 906748960b1203c22d128c999d75f349909e5f21092932df25ad16dc33307c48265a6c49686a17d2205b3627fc9530d16899bdb0511925535aad952622a2d2d4bbd563fe7ef91d8131e220bb921a9eb423864f96bf782a3ae88384a7f75bd2470b8c7d38462e52011aeb2842b9d326e9c250c4d7db9ffeafc4f1fb2337cb61c8adf6a6c4118327575b32776fead50db719ba9e5c47afca1560936e0b4f1fd8218adbcf34d896a8dab3189d51ec6c90847f9092a4d94e4f86d708e369b041747c23c1e3efacf3f5fa17dba8b6150ada35d1793bfb39a2ef283a4e0433b7df28434dee544eeb36cbb40403ed3511d7ec202ad7f20e07ed4202edc4bb895c + +ModInv = 317506f6f0c67b1da0c9c0dc121bafd009f98e29b5516834b3d9d8a617c7a4c62a5edd303c4c48aa00efc2735dcb0da00f8319434934bdd5f07ce02bc230565672dd3c6679170391979e6946d665b9bbb09c470aede5d4a693fda9f999e4733dead24e771f7b3277ccd6c8242e5efc05ab0103fe29b0b87434b840522b784130ea972d200156593be14c999d2095e2608dc826025251ad48b4e46183e4923978d38a7583a1b662c5813a7759413fb7e8fd07dd627f0618ab212d1dbd98bd061b1edd7ab6d0c84ab579b0cf309cf7e554122688509dc14c278d03be329e4a8ccc4c23ec15d4dfaa8df1be0637f420b20bb9b07a96b3eda4ad2a4ae3c1 +A = -2a92010b38 +M = e58b98e9fd921afe369ef033fec612f348d11107e33d4470fae2bfdd51be78090e574c27dd546c921e04932b3ee0e132ae6d1fc1c3c75de08e3c52ed51c83cc9ed90653147cdad4fd8b9fb81d0b384fe6d17a135ad5ea460bc60f7badc1e980d9b8a7945be3ac93d0d7710a3e61b6aa07f00725a84ab7ccb4f2ba00c69ecc7624d21a23b121e2576a2b7fb29ac445da3f18d394c483e8ef571fc2c397b20872a873c7488afe0f19af758bfe8522cbe7b80de6b34f189aa6f9dfb65dce7bb3348a6d7967bfaaedb9e2fbf496887011b4ee8a8fc75885d6f33e40c2fc4e158fb57a6e04b647a9d969146fc8893d73c43fad1272a253bb427c1a1da059d + +ModInv = 639be17bbd76cb8237dda74a2f504e56438132a0b744c89dcaa8c5888a81300321d3bb43d84300e6d2756efd3af64f2a936d8062bdb21741f40e64482052bf2e22b39a831c9d6bf032da5025e25a5b5ed36800da259dad1eb1df80e163cbef351b9fe00b596420a4ac64b7e9dcc5c993cf0d35bb337c98a9ee23f1220cb4cf1352c5c4b2085da9adc185392ff08ad6c70ff5bcf328fd5d5b7e9327115434c6f0389ccde43c304abbfa2bff5f5a1efc056feba3c186bfcec4f4668db711d673366373ab08c948836b3a2b8030e796ac6fd7aec7af3470ffa60972530122060bb3849444194aadc53ee5edafa2a3d5bf8ac4302015999644505283e6ec +A = -5b87684f34 +M = 6c84a0568b20b2b36458eb40b7e481cb92bcbdda2191ca539b751bf62de04539890800a173ff6eed34bca2b336796a5e50589cc961b0c46e4abdb5ca4f5c99c3a2fe1739dfa01aed96bb17562ab01b1fef0a3dc163015710cceb48b30f4a8a18d6be75b0b477a0778d4d45d6bd64b0f24155e48a5e8416160facfb49cd1d47f2161e84d3861abd5dc0ae699527aae362c6c0ac72006037d09c4f525558d9e5b64633e8a518b3cf3527a280ccd291a42182fd56459584375618334edc57548d5f4e620f38f49b20846c9025f8108797d6f2e7351df45ed8c55d5cb4226399227ae1d6f9f507a81949e60d93473ab434fed7e439fe07158ab795f38183 + +ModInv = 245b3bd71f6e6bf05081d6fa5d05423b0b0aafc1f83174b4aea3f7ddf1de9553ed0357cabbb0ab66bcef2b63df37d45a6128e1abf6d2d4fdc708ac67b24f78ce531bebc01d23993a395e2932e1e7c9d6242666a8f8f9f3f6f9f94aeb901c422d3773bf021d419e309890ad73441e4af76f9467fc31a51e72524a57acf4d8d8c5a615407dc3445a573f480c952fe1fd3a3788cbdd91ef08b881fb5f7dd3f082cbcf16feb755115f855a2d1f5b375dd5414aa854e7730acd3e31ebba6cf1f909a7e6db13056b97d1c8bafa445066f1afa5098d26a4ee4f89159ea099577b9a8392011ad947029a0ce4ec77030f3cecae5505eb61cf32838f3852405f +A = 945975673fcb +M = 29a0644f69a8162760dfe5bcd7f30f3a2172d255ffa25ec1a88bd3bb1ef32750d5e290d2b1983dd7b7f93b0c90939de095d391684a78f718fa1906f9d00763e21ca72685fcd2f2d526523eae481f9183575f0dc804587225120c155336f85ef7316abf401e4da81d152300502eb5d19ad08fa3cadd3e7f2d328ad50d9cf6daf644a8fdd992f7f575ee364fb505d6e19e9cc91433b52c97a42a03970f2eded7213f6d69bc944c3fe56c297e8709fec007546dbbd1a1c00970d5caf6be44db9be137404546f1417059300965c313063d20dd02f434d24c28aa10cae2a318d8b3f637f221aa2078e5484d14663ecb55e90827174a8623121de0bbf37a + +ModInv = 77714ac8845018cca5bfe1789ee3a941d3c0484e85e533b905eabda805ffc3aff1c23e6796e66662779e0b936c0733f0b02cd73d00318d9bf40e7388a522687b0f8bbfc0a2db2dad09107c2d435a60cbfef29b4ae78959bcea85f64832aadf2afe3431483adf729e05734c9e7665aaa58c307e0b6ed97f4277eb1b61893e6f8d881324fafa29598043eacc0ef690dbca1c9d2f18587497c2963b8e45079e30c11d7611aa6e77d83f03bb67cc27a61b2fd4bd89b07ad447b97c4ab1e4e8a6484233bcd0e0a72ae51326f080b70f2ee06df125be12f65943d7ca8dffbbb56a5c8324adb2bc642c40c5514a9a75ebe6cdf47e086828104e793403e017 +A = -1c80a3b1799d +M = 89463e759cde66bacfb3d00b1f9163ce9ff57f43b7a3a69a8dca03580d7b71d8f564135be6128e18c267976142ea7d17be31111a2a73ed562b0f79c37459eef50bea63371ecd7b27cd813047229389571aa8766c307511b2b9437a28df6ec4ce4a2bbdc241330b01a9e71fde8a774bcf36d58b4737819096da1dac72ff5d2a386ecbe06b65a6a48b8148f6b38a088ca65ed389b74d0fb132e706298fadc1a606cb0fb39a1de644815ef6d13b8faa1837f8a88b17fc695a07a0ca6e0822e8f36c031199972a846916419f828b9d2434e465e150bd9c66b3ad3c2d6d1a3d1fa7bc8960a923b8c1e9392456de3eb13b9046685257bdd640fb06671ad1 + +ModInv = 483a4b7d65c21fbc1ad31544b6e4d984b74bfad3c38ff4bac76fa7bc1520549ee33deb1509cfef16d7e62cbea7e268a1cd6ef835b882881fc9fe6aab900b6c0312bc57857a6d51042feabac5cb9fdc4114ce8609fc02b749dc02288d6057a63bd96f5e8b62220d2fe702a7dae3fd2021dc5b04b7d7f9556cd2e11206fe6ed981a6451504126837578ab34aa7a8f373ded643a0a14e1d7431793aafb880307761d135aa95337241c02b8d5b9e70221d892814b06783e8f6c0a4b02e9ba923ed0196969ae8ff948853962304e94cd4b13fa98ab95ed3605843f628c4781e87306dc5c64a83e4b333d585f75afde3d2f4b1aad1cdd9843af38be8b +A = 50c1918c541241 +M = 2360a19f4fe3486cd8f9e61405799236397ee1b85e41ef8f259603b8225aa5e70e1e43d7f5d7459c3ae43d13adc3d7748e5e1847b9c15676dc9cb2ddd7d956ce7284efb847f44ab04b8a8c52c215b2b9a32f0e7d56b620fb877bf35ecbbb29bca53cac1981697fb7009621e919461041dfb66c7cac7212c4ff1d0727ba023794291678c71ee427a88c338232a8ddd9adef0e8e7af51f82f83e7ac323a6a737d214f4386c206fa6399a757e3a82b21b8666f7a8490f89dfa4ccb4ce8b1ad2f7517cbc27969b142a677c0b6f945d78c3117314b6c006b43155fd43815c2a41f03615cbcb0cad1e4d60426388e7e802b627ef1d8e91579a21c3a39e + +ModInv = 22c6de4d67a1dcdcabde7c7284eb7524e675975d8e90b8f86e45fcffcb057bc8b25dd613a57b447ede0903ae314d449e42992ba4dfff74a708f70fb71badcbc410807577f84edc1392451183729c29b105806ad49c4d9811ed75a256cb05e1769a3a84fc131c013ca86595a52ee9f7d0259d7e14ed090d0f9204c2168bb47722e363299034efba6622d5ff1210a28d601d229ecaaad2d4e1f76647eade51bea401c61f949660d940e4e5ba9d8e05b1089d2941ed06945284870f836ea115afe48fd9bc87abce2ac309508a0daa6f1db00b0f299139cc9ce44149ad0684d01d21aa1e9f1ab629b0ef338d45c0d0e7f107117aa7fd36cbd9413142 +A = -582600111f4efd +M = 98828a6988744148fe28902fc85a10c8bc6ae8c2340ac535d8c4a65228ed34cd5c879d35bde0e8fd46e68b5591b9b01a48d069b0d174a94834c30d650b6e9ecb1d5f9d6d4278f234c256f63cbcd3660802aea7c5f31d44b41dc45bbdbddec5bfe2c65398952f604585c6ba9c6e0b6c59d51d1880de8223532e62b9f9f0943fadcd4e07cca836666b98e85f0635a092c780ae49346aab9a4130c7e437eaf0db15976c381b78fe811870038bcd1acba164c2670b9f15ecbbd6b49e746f25d42783770446a32f42bc66323ac2232d710b7880d7ae0b65170cb76f5acec8129282e394bd8dea3aa4c08a607352d095151c4a09caeeee318369ca47e7 + +ModInv = 460d9f6f146457a599f34dc12bae9913a260157ca1dffb41d818d0bcd59a2db962fef20077193b52ea9a0a9f6e9430f970703c9d630ef4266435a690a4773e856dc313cc450f8d63914a71400a10d25c36ab9813c28e14b5cbab3ccd88c5e35630d5e2fd7618e971b15e1fcf04de0fe0acfa33808d1baf1061772c6308ebeb2e114da25122d5f3340837e6d501cd5e86bfc807b4fab6ef7175204584129c23726bff81c5d2bb1e3c2c5c7c3f305f693e8d58c9bfbd85694a09f388cfb6bf71157a60c756f0799aa84afc91c0f80967f9cab7483f2beec04dd2df171d90ddf136101122465e97ceb0f085ca5c5732ac49b6d2a8aa2fea1f5a8684 +A = db0eda7f5e8e61 +M = e92a33797ec01b156412fbf38759b33784c26f35d36bee159babcc7bd2d244246227566312953a2b299501773fd26e27a042d532d2c3a4a3bf5cb0c9ce70cb3859655592002fd32ce3dd9a9a6d5bb17221a81062a1d3f663558eed6042a1ea5723e816c5deada28e9f8b6dca3d159b84bd80e4a78cf19a919f4efcf5f11454340c5edd4053c7f8ed95981198da733060458c38ee2c0651c02d6658f6f004facf1de91937f9a9d34525ba58e0aff5273fd14bee272ba515d25ff68e83a364ad2b6e443971d00b513fbea089daa17b15cee28d547e1371f867f338c453b92e79219369b14a81b53e13272ee40c58c9a32d60b15d357ffe4423f60d + +ModInv = 15d681b685db9c9a658abb4e9ba8c3de7a6d39f637ad35f5969b41c04e90f488af8b324f9c23c961fc604a5b1d47696a3bfe96f9102351b7cd9e735917a084eeffc65f2d0a7184530ee0e191c405f9c1c18547c3c1294699417ea23f36f5500ad442cfd2c5fbe9d22fd67b03631ab84ce587aa6046227b7de28b0112cd8d5ceb43f5a68af62cac03c58cb285b58eb3897b39c449881adbb1fde135a46be090b2ce07de939f567393bbb6206f69354499c84ae50b8a029bdc207f2449444a0c9ffc06a37302de02ede030d640adfeb10256187903bc923a2d3afcf204c7342191c30f30619af53e36733922eb471a43fe2fc18441e90366ab0f +A = d92b0703f7467ac9 +M = 222cf9394630a907682e332c12acd6bc95867cc21c36ea30cdc7b304181038fb0bfb9b152cabb40369e43cf819202c039d628f3320b6abf75d2f4817e871b2760f37ff77028f049254322b51249d6ae87a180ff4f32fc275173f25b185e6e4b3f462aba80c27d77cb7ed8b795f07c4b9bcae0e7f8c627884952306d0648e9699bf94fe0638edfe1b1c0def197b35fe3633929e2e50c250dfaa05bbc887350c297492e46caafe1ad57b41648338a4aa0f71565d0d6b11549f109e4369dd5feb85b81831b3953b1ea24db513f6156baa2f31ee53ebb7fd1548d38af01f82c4855eb54d17951e85f5a4d1a731bb3679428f9802f16d3d8f4c29e7 + +ModInv = b5fccbdf0a8ab50470e2a7579c6d44b3ecb949911a38e8e8a49140ab4cd840f2360a5bbd8c2e988c60471b627d682ed391ae07df686423b57848e13b442a316331a1f4abcb08bb2b70d9cdced324e4369343a3cd08046b9ee8ec766a1071eca6628e3c3d2976b9955206c374bd5c74cd25668fb159832d3c879052ad7e70158632492acaa97951919b24b1429a0a004a3cc4182e8b12363085b039429e7dae6bbcf41b221c1c07653ce7c670c55b9b73bdd714172a191d0b8479bc5bbdc90b14f9dc634e4bc8a9113d7a341bbbe11202c14eee44d99777abe479746cb1c618d70abc30628365a80453b66efb9a7b7a18d1fbe3f99831ff91bb +A = -5e2502420ae59635 +M = fb3cc2fb113840f0cb83f39d8d84a494b9935b5f3d5d7476ab6e3edbb296e7b86e2d42cc5fc3301bc682cd689a6d2d5932ef2a6b129616c0ebd020d033278a3a9efe4882698e6a7306615d529123b14604247c2a1690b5936923ae1c399dc3c7eba5c83846d03c199d4111b92d8bde68de7c5b8488aee8a14495c26ff8b9bf7bcbe1cb9068a7c0350e1bdc447afa1aed9f65ef814760c3454a5f71aada9ab664e7e991c9548446b9e52a539dccbc532a3dddb3e9570509225a60c2e6a3e24cfa40d55abb44a2d2f0416fe1ba56f96678d0fbf047634a4d9d417a343f8dfa057b26523b7841839dc54e399029b404f18db99af4974096f5b0ee + +ModInv = e61f39fa92704083356a97f3d425237d3f7762e834ad09485363f4fc7c9e8c21e23b8ab92f38225fcb9e0016593825c4128ac071d95acd55b8f8ad615e1597cbed6deebadadbdc06bb012227abb95116b0451f6068f379fbd187f686316861df0a7de63a74556d23379f3fb2b07edb0dbc5e5cdce6a34ff483eeb886a8208d4f99dd23f19d98ccb0155a763896bbb25d8fc43075b3e9a033e0c4ab866142771b9efbd06a6f9dc72b2c4aa7889b12d197481582eaa9a3255753c7656b16cbebe9f5a33dddd833a3706437f79c2e829d3e198ee769ad88dd1e9185eae5cd53bd09833f455e8cf10bde75877c4f9325f068fc1f45dca7ec2849e +A = -3278e0a594ac807a +M = 21200f62ad72c46d9d3390235d28a2a5a8135cad9ae9d4f88bae09e983c2e073493e3156eeb9d3cee89aed986c9cab30732c15c8f54f6e3ad74b274812de3cbdbd2f37372208df1cf54d47f181227b276dc718966baadd56f7c883024c19e4ca550fd5211d5e2a4901a8f12fae606c1c33a8e47b398db4385073ca374712cd0706c106e852784f547736a6d1a67d599072032e93321ac7ad0a947b585bdf30b9db48af5a426b4596fd9d866eb2cdcc0a927337ee9ff77badff42a2a94de07e1ef7ce2f622449b515f5f181d8665a7b685d67c84558730bda743141cbca0a8c81db337fdf27f24cdea7fb831e4da4581ab3bd02344734aa53ff + +ModInv = 32b19620cf64712eefb0f61cb9d256def4fecadad0bc76218379826d6acb070cb24e499adcf670d2b3afa3a0be134627ea267da11d2bbe0072f598f9e0190ad00376e12d1b591d2db155a495e28aaa15bf48a95fa6fab8b967a76a6cd545d6e7842ee19baf4b1bed4a90b8938ea41999ec5ef70d130e4fac546648dae40cfee106e4f09309e8ff3565f3277491ad54a1f85c6071312c853e5b3fe80da885421000c83cc4f05f535b64f49fc311be2941eb107374066840f9b383eca489bb8af71b9d8d89843eab2f0126bc3357ccb1de966935588a244f80bc80f6fdae4f4769aa89dc3bfec2f73f6ec432635630293d362697681b8a4d2f +A = -a11ff63c0179e58217 +M = 4e98ce51825bed805bdba1fd6d483bb28cb7c2ec23252e50be0d6c874bbdcdb536b8ce19e4426ad365a2a36c755849e2c509bba607902b9ed0a0b94e16bd0467325d62f58a0afd773820c30d4395e19e96c0e921f3358da90bb44eb99631bbcc1afc52d22cb0327c10570e51ed7a429f015e2d1de96ca3ecadf167436726c87d156b2102064cdc2db8a65eba32c129e670a6383e6aaf1061dc80372e146e902c25be0914f9997523a728f840c73791d7d1c5554eb2db3722338ccb9cc3b82493cd985768a1eedf23cdd29d96e9a60be9b440d80f44c6267afcd40b9d34194e2904506350afd60b62eb86b18089419f936769fc6f9cecdeee + +ModInv = 18245e853a9434541df860b0190edd99a1d8e60ba0e1e98f7d889aaed0fb5d3a61787656f1436beddb47629db436bf5531b3df9c5560d0ca5b06c00bf96605e244a1ad6a8a90d29c93978332e0281d9e493d07a550cde7fe23e1c8f83d424fdde8bd8fefe334a3cfac37c9ca4f7a310d3703dc94c7685ed634a816a5df40d3dcfdc127f2ef8e60764c905152458240b3409b18bdc91ec2c1a87835d8558b82b4de35f4d3d52e6167939d8c1c6a3999dfad49ad643a5fee9df376f271ab5278a80213ac7b55cd1dd4fcc794ad25b1c36040f13f4da55217e4c69bea00f73d88e419ca732932d69001f0d212bb906f12e0a0a3335dca131a7d +A = 4949f1b6106a2ca9a3 +M = 559f9a29dcfa53efc78f242905511342c26123bf2724a03db3186e860ccbf27779de4988731e5c6a65e4370d3a4257f1a29c7c97df0a3485ec0dccabfb6ef5ac3b0cb8029e1ec9f75dd0dfb8a702443993b0ea755e16b68d59bd96c1b0acb9882316097d1feccfcbd2ea73f0af93ec30cc340ced22a2d550dbd0ce07bc997fbc8741ebde28c002181ce72dc741c090f30bb59287b1f1f7cd9f95da6f792c8716a7da21a232638fc0439841a97796606e8f98274be2aa8420126df3f639bd3477e668dec36fbc5701a3b5fc07d36d788956c259feed4392a78d1f5291716ed94c875a9fb5755d2835719afa40384e79cfd83f117e83a52df2 + +ModInv = 2413ad04ca365a492061687bdce31978e41fa12b2f73070a07f7a2ec112466fb1e655df43c813af95793fa5dff3c7bc8fb36bc38c274bb1619eabbbb88f603f55053ccbceb68c60f5adf19caeb2e1b498678030cfb5ecce71e2bd9a520181d61518e7ebdcdc5e27db742354ab88845e5177aa6253c3cbd43085bc0b2889cac6d7c6734cb397844e4656faeb1ef816fc90b6f5480e4681385b35e5e8e3ef2ec731740c73d7bd1c280844e017a5ca1594109a6fed24b5851c792c00b3be6fc5fea8a805cf05d63d1b87be2b901f0008c1e87d77f60b46fa8bb41098e952b6cebc315de833582d91c5242c3857c6b282c0bd8992240de229c21 +A = 6f4fde580f122088a5 +M = 3309f19611cfe3144a86416c3388b1864e6dcd8bf329e95f7ba3d3659a9b09f451854e6dab2d2b83349aacf59d7c2c39fa28ba7077d05b92b27ef7ce34c78522b5c13535026cd9c8e162c944061ac7d45ed1c63522bc7485fad7244062520fe2d7c7bed21cbfa8a88741f18607ef6d7b81421b99a38325f7753be145b4734f80ba69f49c684b77142acf34a7ba68cc085d06e09ab6e6b62511cabb59b74f465dc8c615dbeac97d8920c1cde385c77bb777f216ad2f29bda57eb2f026d7ebb4e4ed308edfdda2d23ebe8964d1185e5ea58f78af9bc8863285dc8a5da4fa7ad3f5418ef89a4b4648a8721876c8c975ccd53f0a3984ec7d4222 + +ModInv = 11d92e1fbe4222803899a51d46c077565b1cfbe88020811081b8022476d62137f2e70cc87f92503a1aea39d84884399460fdf50082f167dabe06b09c868db98501621755db78ed9bfc11b4d80e753410fa91264e7dd9ab266be78c053bc60d4d5a7771a14cf071a7e264776536ed130e6a60e9713b2a36a4cd580d51d7a3729fa45b482639493a8576ad3fd8109f7fc935a45a1949194da92d1a7a766f3d4c9ca76a0a673138d1a692ddf9655ceca1236c47ce5d28bc2c20ffdf2c99a2bf7ea1dfbc85d3d438e3b11f29654dfe14e3646a8f7f0e260c85c93ea37853b0a1a08424db219ce6c936971daed45a0f4e39bad0ddd88e337465 +A = -9828c83edd4112cc16df +M = e7cb6d687c4e67f13a21404cd2cd8c2f4c576fb27e89767f590d3e97ef771a598c10523fafc659a29ca12b7cea3794da06695e5fac4c4f387b56a15ecd059e58cf4b1e44f65b4c41075f0ae20dd29c6abca8e4df767a95048dd84fb9dff24d514e24368175e77c175086b94b9da17ac5bc1b4111aaf73e726ffc96035e5a54cf1c40b8748b9bad38d4bf67cebe865fb127f40506ecd200a23619ff24b42dc5614454173b8650d157c3aee9b1ffc1adb3f2468afd77804cf9e0781b210623929946349ffc55f8e3af7a8e6bb7bf3ce8bd56968c4e93127a5fd4c6549eaa87fd8b41e63bb2ec7273580f58762faf2ceafd4c656dbd0558b4 + +ModInv = 77fe52f4deac5617f1b8bbd1a4c10b886451342d38eb72ec54eafdbe769ef53fee8d3b766251805553a9ade97a67f0d41816df7a4fff7d49427d2a3ed941813e5dd750903b52fc7a3541fc813047ab1c90bfc9e1c75f0b7a68bd7522c7150b0d0427548426b8720ee10e548279735a186a3cda72a9cd219796cbc65a957d1fff390bc447261b65c192ed932bf496d686bd9c70d1fafdb946e04a39470e7c33e6fa62dc645cacbd264d7ea2ae029f989188d5f708ad8f26ec53a9580901eac25f3fd43edf894d5e89fc0b1f5b543e25895b0502feb8714bcfd120e3f495c17e4f9d4df3242525c19cf55c3be4113ab3a1ba705948b7440b +A = 808c1f492fba47a1fca7 +M = c31ffced853d3b0c86a0c3b543c1e4463c16f4edf89dc6455a45c6cdf6fd5ccd804afcde2d841437a14fe006230f063a9eca13215a4348f36f7cdd4bb5c20ee26799f4597c9682cc475e68b77f929576d92b75173f70c7db0c5225b64c807ce00347cec990de4c33d5e11798477fdb9196d3de43dba6aeeff197220e54e30ddafc13092e2aa17d6efba0f4fdb48b3f8d95605b7f8b43706c1fb2918ec411835a28ede26a6566f306813a3cdaaf12a5c7a20213695e57a1414e647505a866cd1c42d0fe736d479633c57cdf80212c2684950c16677de7c67cbb5a6d12d9b29d96345e044c3396cf760198b72ee2002f906bfdc17aeff54e + +ModInv = 3bbef810285a558dea0e531c1e2fcbe5b479965bf14a1752b028a38f624287334b6f4132f7e419b8b83dc9a4680ecea06f207193f9325a8da860e512993969623c349d172bc092e476037c20e266447c83bce41c4903ca79eb34fc1c5f79dc3fe98d8a095c129c9089805e4f42eaef748d93cb047523d6c2ffabcd4637a088f198747a399afda81059d8565af6c5d2284e014bf60706caa453d30b9693f0596bac0db3b7cd054ef9ef3c9499e12edd2867b9689d22b0290e68aa3db24fc19adb46e0792db4ea407a53257ad64d82c5d8277b0cf98b4a738dc89da1209fddaf0d0afe7ed3007b61aadce426691ccfe05a44115f539e03 +A = -8aba6364d94a354580711b +M = 944a9ed1262c5e240a27ee47bbaf4c3891c24a847d128704f689266a41d80104a192bf33cabc04101009a85ab03219f8a91d51862d7a143c0b9fff693651422d0530454385d434340a48f811390efa1e71a6a1d6775e2c4adc0a97b590e95a7483cd5fb7ab5b3b32eb6628b4787fef7905502165b42e9f0b6ba173936cbc250dc0de03d7142e90182bbb8789866bf22e2c392b64f2803dc5e12863a0b4de0dec7c139e368d31f034fd3038538db5edb4d8bf62218d21fe288cbdf39f1708d76d3226c2fc2ad08cd2b805065de18c5fedcced66baa786886507b35d79baf55e7bf0986bb92d99f5668744dce6e87db54807bfe60922ca + +ModInv = 18abe6e867deeb88e8864ebd3e02e08d0b2f985661bb4e646aa6a3d87cec90a9f05943a00944f9c2db76d1b278806ec0c2cbe5ea83c5005b6a6f2e4b1d787270006dd93bf5d3a6be758c984e3ea12ce8c4afb38cd12ea3060a1642cad349693d71325a45f6240d518a271cc8d22d12fba39910abeccb9e886c1c86f821dda5eac58cbd99d99f10a925750a89c7acb53aa1bda1f1a156a6abbb51e233c5276b96782fae35dc1f8cc68bfe5a4975520361b47b66195d8a36c8464ef35dda85f3b6af8b49e0060d4cc256f7bab078b8caed326f92cac9b9832e7d2b58edd74284f5194159903bfbc6facf254be44ff716a5cdf900c8e2ee +A = 740a77d6f1813481854f8a +M = 596e6edd209ed6e8d6c7ee83cf20bb46d66bb741c475f5aaede6e9fc4a378eb4959a04923c6c72a7e9d6b265e1d93ecf4b0772ce906bd2ef9267a67be6743be2670fc591fe22e60b6c06e3bc3a006247f8462f53d04754bed04db7def09fc753dad5dbc20c44fea529772e02370ff6071d668f1e45279471dbafe00e82214c43b249c016bda58390d8c836328e64134929269a6fbb3921da5c3eaebb7fcd4e03769e38ba4b395b9eafa0b8758ca749e6d34c5130c499e7e74676005de8cd9b28f0f8d7b56f8bc34f77a7ac3f03de7349547b261b0d4028cf032c047128afd5a32d777a9abd2a625c4cbc88126eb08ed72d0d568cec2b + +ModInv = 2e2e78f14fed469fc90ed82160abe5b69ce91cbf24d6b67bdc1e217a3b9b044256a7308c2d3a6e0ad48fff5051809a29fc7a74e96a15d98204c4078d052f92b70df8ea75b7b5d75cde45a11e55989eb657f0035c0ddab3a250217c3eb046daa0d6a9ea292d669986d7f78a754d859a250a547993f5cb5c1885392203b84af67235149ed1f3246df352d1a2051e1da63099f6fb016a8034c3230ae161969a16ad3a8db45492b9d8f9c6a74fafeafa251c5834b7ae8be842c4845ddcf1be8ec26563ed6b9cdb6f4f14b3e919621592b6f17b1389f411c2fa9f1399cb072bdcfd656e4483d6af733d629c4b8e7f3c8c8ec8b0a1a1f8c7 +A = -3083d49ef945e4b665c1d4b3 +M = 60b4925ab07f66af06d0bd1d700668bac287094424c8aa5d4974220febf3b9c71e8621fd55a5ce38b2f2c54e0df9d3a2b53c3bcfd7fcde3b0b03d447c9eb7849322d3e65293828920f32ed24f6e10781b171756ade3f595ae2f28836bde70c4b07271b166e0f71660256558dc3dc805677d332af7c76e543831eafb68429f12a754e356a1723b599a26f9683b4ab79e6cc52dcb69f6902e2cb711882892c5eae079a09a69923ff579db03528e91f539270f3ba275bfde2b5f6395eb6c522b0919a76c75c07af9f8aa15764a5b4da3c359102001b19b25cae74c4b8878786d3f7d903b07f9aa02337842f5ae757e706437b5532e8ba + +ModInv = f6efb0d642835ad32d69c7c687979171dd73a0b5403acea2406a7fbcc84fc7132d4ec7fa0c361877346a99d8182f4db012cd9617e9b595aad0b0a002ea2e029d9f70b5d94b8c1b0a4a3243de79cea0d9f1f7ba859a455445003145e36a7602ab24d7d4a6a14e51531f48ef3d2ca0a9b64165be6c3cc98dff2cb104d906b3dd90ab524be8bd7dae14bc3bfc1589e22c3e747a818fc6d0cfb090a05dcb5953976d9b93191fd91e07025126dfe11fc39048912bdf80bdbf7cd5c95f35a64f234ad8894d01c0090e6485709c4c4aed4c3efde89a775c8d6b32132d68f9511279cca6f21cc1cd42ddd3a666cfa29d017a1530b07c68713a +A = -17bac194b6ae4b1d3423bf15 +M = fc2916dd01a6b45a823e624c8c1543c9c700f71fe1020cacb9132170b46c91fea9a94478a41a525add1fb0ca02367aea5ec5168ab4ed6654c049e251a9813b31ac1f0211d006535ae713b54173adea68b30de775d82e3f2a9d86dffcc3c50af8dc8bbc731821a718a81b1fe849cf20ddd475b18d1d5f666989619f33ebd8c660f6fd3e7a73f3b2485da28b111fadd6bea1fa5f98bc0a81d51624d7cdf4bb46be3f8bfd99f11304015f5ea8597445d831da7d05d47843c52a434e80ca34d16324f6f838c643e36c2c0b93891386738617b6ce12e6b15ad73fc6e2ed2a3ca268a4454f4f0eaf960c93f393194fb9a8d3ae7c7b24b13f + +ModInv = c076c2f6c6fa286c3fd4efc63cf7a651c77c574b37758a0c60df00ba81c0759e332624b8ef1e1e4bfef0391bd2b2360c3a1ae26b116feba1e03261426b388908320dd99a6943fb222cf58db5dfacd5c2fcc907a4a2b54a0441e5c3c92c3e7034e7f178714fe05c56dbc50440e079697b7cb04a80fcd351cd318059810de8682bde40ad9007af30d04c0218bfddc7e9336d4645a724bb3379d8b60a5d0b854ba2c5b7a39559944cb08041ea5fea39b8e351a17ea836b0fb64167eab15406b02b12d9c52fb2c78f192de3ef4c82feeff756460fa1e8a6d066d6eb5d9fa9c1cc49a83adde08ebfb43a7e06cd69af992966e4adf43c +A = ace85a1ee9508dbe225edf44c0 +M = 1d2b1b6ebed63c9c96c3091f2247c21bfb0e8f2c1170878e5f58aa5c36769c9ed38e41da8159b6e17004c4c61fed422c0fa0d0f52a1a4b44073c86ba52c9f03583297ef8e8998aa4cc925b30e9ee1f19e19787b1f00e1504e88b663b879af16b58b8da45d6e3f6a2b04e144a3e574256515dc05b71f257bf7bbc0e658b5b4adffb267fe07a6dbc44939b87e2d815c0f402e24082ced4498b811adf4a21b5935846a494ef5b6c07da56cc21c7fe8a00ea414d105016416a5550835b5aa4aec631684040dd2a9795df0595924de2fc885bb2c2aa230bce46bdc23facbc57429306d15b2fad18939cb834bfeafcec9c82d76562001d + +ModInv = 1a5167e326622565ddfdff9ba5662f9994a5191ffaa82aa452e479ae102f7e81ff764c3ee77951166c3e60ae270251df411474facda73c718779db26d86a77e7eaccb2193187eba9fa33a9ca536ab80dec8910cdeecef6c956f5cdf07dd5df577bb8f9a11203ddad63f03becafea0673d2944c6ccff6b6548eb0f96da7b447df4ccb93ea478a55cb005518db613b953b0ed297259526e1f18b192cd60c1c65b1730e888b53c4c5e46a8e0543da9851e84a75e2bd78dfdd632e7680ffc16f4d2ad6897f9bda232bfab36d2010b2209315856b3239edd4b537ad84b1e64ecce037314d717ecf3184672cf18760a7df224195a4fb39 +A = fece5b14fe6dd09a3531cd3165 +M = fa4fc28713a5c61573eb00860fe1b1e6be3c9c9b14d7b40c9efd98c6cd014cb5e83360a447285a9888293f2b8a9f89891076c042eb764a9c1bfbe43a23cfab3dbf901827c78c0fc410bafce720db6a588b7843109188120f3c0532921b77b59adce31c632d20f0d530111f03893977bd697fd9c2c3488cfb409786582ec886f24e391016e6803d1a3e053f1350b67442d26d09c11cf6c99fac348ff078b0b7d2701906fea2fd27c412228a2c06a6182b5e3d22f245b8ab4dd0a7f958be36172fe363586f043d9c170aa5c477c613eb198ed26f4705a2f44b930875550d0abfa9cbda00f7d1135800d78f14bfeabd32645f3f506f + +ModInv = 2908b083361d812927d6671ffa4e7bb6131751898da15383b2ce85970ed52530a34a0e5883d429e1b6a667b6ce5c9da78688f1f708e38f895b14efaee7a13110e252947db9892bae1f46f16badb1d6336dbeee9383c4a2f63b59d489eb1539a2a25f8c151c76be5a4e579289d106ee10a8efec7b3d4026de748c16423326e3aa497b503094fa936a7f2508985d84096908e908b236cbe52a2815d8478df617a8f78a52ca313d614801ff2e16922a87b2f52c19d24da76e904c8918133778615d04b4c2d2fd95871e35592a04e0e37c7dc6e3dfaea9d4fdd9a1443aeb8a639379119c98a85f151a701dbc2cc9ed1665ee41fc7310 +A = -bd4c6eb9c933106745b3ce9b3 +M = b0edb98a323741768a735dcf369f4bd520096487f19bf72783623e4f9e6ca7b744bfe88d30303d9ed02a0b54800586af91d156282db289a96723b46d2bf75f548a6d3713d2c798aad4c3fbc93148def47c497a20fa946995de059899b22ad579bed715dfa45c5d2b0bd263e9559081574dfb4e22c5f574be62204224c0bb4aa801e97c19e4043fe2ca88f88ac7ae2be5c6a7e82c01077c2b5c68851fc293a3ebb472b1cecea06ad5fac86db8a7de431308d7675265c8f8f7322822a1e8fe797f7f3c7ee5c9c4951f108d20218e655463adb183dfd131eea3ba6a185b482aa70a792c309bf8d2074a0f0896d26b0d4ff75a357cb1 + +ModInv = 83eb00887c7ffb4301d09a1f06ce2a77e4040703973fda914ea2bff93f034c1f088c4a8ec919b6daa1179aa2e3f414514aeec3c849dd2f6f26c1d843c18a071e9700b70f54d73bb02d7be7ff66446060fa1917af48c80d7f30e67a941acc32c2f217f6b4a577e7369d5c9e8445df658a0eb2614e8e8f139874267300e3bfe76bcf8482be52f1b73dec3290dcc5ddfbf554ffc91ca9f611c92756c93682d9eb1921dbc6e7a3a36cc68bf3f1f0916f57566b55b67c8a71682af24b21c75c0f1d802095acdb8a89c9f6cbedd3cb91f1d00b8544c97e117ae18af74a3087b8d90084acf06b2b754f9ea8004f24f3a6d5bff99b59c +A = 94aa595fd6ff97611f4ee0cb1e6b +M = e13a6aac2a9afac3e967c9b9c0833ad2bb6af65bb899041dcfd8dff132550c9ff44811d3054337ffc7d58453caff9cededd6c90fa82bab4036d4dfead4e2e886988d1afd632b3dd1172c03ea2f2aa2f5b1e0d64f92ad359cad3d1a2edfe6aefce3789fb50104ba3a2cee23ad36cce4eb9ce3b5df33dcb1e19164337f2c4e0275d9de55d4856e4162ef33d29d9701eb6e1c2a8fd8c746e92b45b34cee56449259ec68e56560d8c2a8c4d4dd19990f5d25c6f5b2e3a9e9c2c0507cab2a681a5d592a63c0d98d572429ee0bd04af099ef55aed055920a9cfcc4b0bf71862745e64fed9189008205daf39b3ce81bc1ea75ca6cddbf + +ModInv = 451dd6d2dac7fb44b850435c88802de0ef523639d4945230f3cdc22812f7042eac51aeabeff50d786b7156ddfaec775909a99d54b092a2a08fee2483125148b7a13576c5fb68c62f75aea719ed7b478fc1342bea27b47e68e2503640913b5201232cd2ddaaeceadb60589a8edd9b04bb4f254fbd83c0fe16e06a680cbb9d6371ab08ef12f976b966f063c909a64b8af8015772fbbe050ff7e804c285248fb27cb64cdd66fc425839f3ffb61c71f059183e5ceff31e6d79177c7c61b2d6e3738701694f71e71ff6e830414e56dccdc7da662bc7c2367b1ae2ed11c8a51c71d07877ff2fb3a987b6283c27520b3e9f021dadc3 +A = -946dd8aa84b6d2d53d50bd7b32fabb +M = a98c4152de253ed005c0f027f310103098f303a6e12dcd76d27ed417e19be98ce2cff75724ca94f568d116532dbee8468fa1c8625554a5a8973f65e7a44c4e96133d39153622ad2ef690118694b110b5757d056bf6304114cd7966251eb59c0861706855296e583f18be853bc37b73c84496bf1e7b5a2ad669afb007b8e9ec829a77ac7078349a50a498bbcefe113a35162731f8c30d59fe96e04340517977e7b60774bf780dba8d87863c785ccef6850ee1986c261863df672706f34b77746d5afe86bade2b388e69de5ccc3f84299ea215a9dec607c076d94a6bc33fa0e6faae7c77087fcdb30eb5b34c81e71b9ead6bde + +ModInv = da2a8ea4942833e493cf26f474afd090dda1e1d3342187deda8c73dffd5134c95614b6575235dd83c4498d62dd13db87271fefea7444424c5547a061d6659a089db7952ab9e71756dd8a1b8c26f8e54778b0f17aff29a7065de8e1865d4b11cc746fe5c0a79205c8840af74c84e4431715d2fd3f93441a6032f8d5193d50c35bb8d950b9d7cef773655148e1ef1643cdc2432c6cf57ea7c91b25f32817affa145acdb2128cb4c1c26be7d0857d3fcf006b9d40237249ab95b079b1d29f3b187ed66bdfff8e287508cb056d2b1e7a524e5a4e2fc3ba6ac0329d899b710c2c576a75c0090101d366c954ae5a1b0b6994ef11c0 +A = -cfd898de1c372fa7637e0807d27934 +M = e4de91ed1db8b5c1a70108c1ae6c2dce7ff77200a256091b4d36041b22c2b07453a8317d1960312382a7ae91072047180f99ab2516b1681ae6c646c411522a131e587674f5a7af2cdae87e731687a58212bc448a1a779b3aaf933843cdabc2c821bb9e161c74f7cd45782c680e4c5a35ad018538fd6e09cd8688da34b180bb12982a4ffc3492f3ba6168625ccc2877aa846c3199eaae650de01256ba3d7c6edec6f84d7f6828480e96bbf3bd66fd7eb38ba54c4b6a7b9938ab07205258044d38f2771164b983da82306307f9a4d3e1bb0b426fbc57bb3d19e971590cbabc8cc8a0f87a77210104936248464f6b5bb8d9f935 + +ModInv = 478d6f2c466b2ecddefc8946feafa6196b1c341866942b0430fb77742050267ae77212885a45260b6adaaa1c7927887f09c0b21603ee3972a4c68fa27e2cb01884eb9b066a42084dd2f63c3bfd362ab7b88bc71d98b385f91e40fc71bf11b572e72cb0ab3109618c2d079ef25c2747a96fc8db5df6b917aa9348d8687df0b96cc7fc63297167af96ab497d60c06102f599ccb560c28ae4000f90c4cef90c8e20a4748f3d83cf7838ca59d96cb33d2df8594530384983380cf649d278c9f0d51f33186879ed600f158fd8e197d833e890f55b08746666ee3c83e65da8354bd26c0c30440f774c1261b2707e831a0151120549 +A = 561b11190f2327900e58363dadf2e9 +M = f975ef567d0d4da24333902a94d655a532dcd2cea32bdd79d9ad394c114bcf5a42b8a1e5fb9cf36717757ab243e23b1c8df175c1e9fe9f3513a86f6f76c4eab69561ac351c9bbff92182fbe4f4cdde75966086b2da4e5e9d1957e26f36b24d2af91b870dfd2ef8832d9eec8479a6c069aca499560a471c485e1c652c7e5d76646547cbe33928e4f7c36b17ed08dbfa499d11d4ccb2eb1b36fba4b4b9ab1b5677cffa5f558c10e5d16cc3c9070530d655e05d8999da0b104b447b94e6a4fa4b4e7cff846a8d30acbb9d8e87d7bcc3fb16e77684c72b83274e5a9b0c37a3d39fcfd575a05468eb3e54521df684ad17aa7a21d4 + +ModInv = 2a27e6c76073d2fa771349c263e453de5e58eedcd79a4959b051641ca525b29ffc056b1f3d7a89ea4c208f1620ef8d746a62693098e558179f51d55ffd6cac6ff8f346f611e6708f310763f295704abe6ec3bd7ae91261e7b32a84a2cc2f46c834b1a4cc51d2e5f02948bb8281e7c2bf1a9b1093927608e61ef882ea495d412952bc0330e3a5f1817f0ff141063a271f89d2b870d8bc44832066b921ed5103534252fd6ec17554e92b055d5b77213e32f254227212289e528202d17e6319c34dcb0bdaee5fd6f2f5d6018f4be55d93ab72f863310b3af9a1cc7c4c2020274d10d1299cd38c7d19187f4b98e40841ee4a97 +A = df947fcc9574725f37d8cb30165963e9 +M = 5d75f78f5d559d7e88e2073db4253da71305ad9390699b36021cb9b8d7528c30e6a6ee2faa2e9bd35d7d0dacb0879d748d6d628041a5df526c3c65a4ffefd8912f5207472a1d8e4cc0c9120a996e03bb802eead0d458dcc06a2638d7ea3ab5d1679699e5e0737c6afe56e3cbffc0c4d4d3e3299d43dc0d35ddf8b4b6f06db90ded787c57eb063eee1321649e45ce3989f96e9121199ace001cdab2ebf4ce87ab6ddf437708f7f9f5bfb9fe8989ad0feae00eee1bd06c11083fa31afb7dd93d6aac2f437ae94922573f549bf87cf02bdc172d633ba585c42b76cc8fcc159d4ea3942d2bcb9eea2736dca02eda1d65d30abe + +ModInv = 70b464d1276c74c38d86c1b5562e5be98ceeb52384f747be62901445bb23d3a9a03cb8f4f415d41b8e4327632c62b66b88bea9f5ef05db0ca2bd0c4e206eef76d485f48517bd1d804137e6cc32603ab59f23f2ad6ebd6f1573d363c6a89b839af369b6e6e7cb828459326217f1034430c40f73fa3796116d08de48066df7a4ac87ff649b917f5f72b499ab58b05f4643d16cf647c0d6eba1b5e7171a26388546216779ea3566f940a6e6d4ba90a4c5c5d4c99bc426225dc39b629cb0b062429bedef2b6726bceaa74299767e9f8e7c3a61b0ce9a46bbe68b4dec8fe461d5e4e83aad1151a953a0ab45bc1999e60a7c17 +A = 8267d9849f3c94f8e0d974b822f0a612e1 +M = 93364c151355e4e910f62c7a263ade4f90136cc3242c610b00a83455d69befbd90e13c6ee996ab0432863bc7411720d0d7bbc7774ed31d1aadac784269d0dfa3591bebee86e4c375520f6f477e52292d5312eeb9786d6f68d7273a2f5b2495d1eb090346852495966643d5c8f8a7e4e12a61d563e8c4546870efc3e0a4fab233b7895f8ed584a285e92195e81f7678795f345ff4c2b90e2d4a7acb31079184601cbc456dc694494e110443704ced30628e0cd071e46ab5adb68f9c7d936d4747ab0e6d1ca10d04b240699a838a1d921ca352a3c35190feda277a4c28fc377c61075dce9e7bb2dae32250963d5d2d8167 + +ModInv = 2815786233c3b02be7573338b04cbd216b918b7ec3e75f63702e7df6a8460076670f2139169815e47a00285412f3feffca01498ddfce42c396dc42403743e77677402290ba25b123c01367be2c3b3c4112d4e1d99d54e3fab1f39fe0f2d7505d2b7d954fba219cf7b6d962c0f1ab7c601542260fddeac6b92d361a9b7015b291924cf2940856cd747bdeeae56ab2e1c651d803445a665b2c5b4e22b4effb8f2d3611d17ea05293d424be31f32b514243a0422a6db8c8bf302df31a6783bdbf4966761a32ac7697221f1b2d83a56c8db09df5d94d5dd9c340215e3b49034079a608815575c791df17db1ccce7366f1037 +A = -45853720c5c8330e01de3720e8960a80d9 +M = 53ae361d4b9421529e5beb1a40acbba80d7dfbbac796555b7bfa1af53dc13462191a37baee6505c62ccd6e19947a4a913d9302b10ad0d8cd6c21aa71e668c1f8ef2b42aaffd7ee0717d95a4bcbb146cbbacd43f0bfbdadb642c31880c35c70f013c7893c425207711a9a7fcdf5580f4122544ec275240b72cb6d61c2986b8a88bae148c77b408b22236f0e26f0e499a9c81e74c83b67a09590ed1b2f46718b25c99c606fad93b9c922f8855b27354bea8c6880c5b5306d491ca3a4763b7d8765d1ed414bdd848e2d5453a00d398604aaa1808a5c6617dd57f48280a5b1dc01d6e36bbfe6e994fca3e26607820bd205e0 + +ModInv = 724c0be88673c21575cadad19fc946e349b5ae4234b5cf7aacab86ffbac85229eac8748aefffa22dec9d8face1984b5296b53d6c9268c0ff7b16efd1da45826266a7e49ece642f5b5b4422e1162b7c6b89bedfc898b527f921fe7fa55609a62df17914709c0ba7d1945c5377089993ba587e9df02fb64dbc0cc1b0448bef60cc3d0ca8273ed2830cab7f8efc5f64d75bdb9679986b741d957b98c9041e26059641da7874371385ba6d8770f89f645752933be7f9654bb64d2b76b803fe3fe0c23abbcfa0afc763df40090316b9bbddc7dd3ed16a9b547d5e1222d9872966eed1fca9d468fb8d5c0b0f6660aca7d024 +A = -6ee30f8a65358731232d6dc8e7fa93622339 +M = bf0a5bc1a1b7ddaaf8517c198a723ddff645396c88474d415da41840802c193449b56f4f42ac3682e1c7f753d891d3f4bb5e1ffac2e0d2e2f214c0ad99ac4c2dc8f6850aba6505ca0fc980be44341307f6f41ac2d0e1fdc38e73b28b8dc194426aa578b7d666f3c3674f7fd69c0504127849e807c1c10cc7c29451b4b28378d15d02307c7cfb6867e700e35ba746d79eb35ad64792dd89c954960a9be51fe5f7b1c550e43a355431e16758331c2f720d655d159a2453d3b48618170ecb920dfec1489729fb1ab30bf3a2ac7f93f17ea33111642a8dd0df23ceb501b207cbcc6c357809339f3dccc3a9b4ae7ec2686b + +ModInv = 3d9b5dd69eaed0d5012371fb9127bb7734af9436607e34e2338d9ec6ec996197344d429000f63e00e1fb5c8d244cde7cdd5fee215337565be53d3f5141cc6cfcf511c299f89ecfed5d8b3c133d91b4314f587e8625ab8b40c4dccd7d8963530a2b56b22f717a2b37b5873cc6a8fee805b13d833ff5bbe321e7f10be2672a477dc025f7aa88029aa024f78c54be7ba94391457071d358391adf7b2e8a5be0ab81eb914f46c4b2b02ea8ebdd92dffc710d19c7388d960808a01064900a6605802916356e091e23da824011b3a47e438a1c1cd07ff561e014f6976dc60936737d1d6d34a17bfcb9882236ef44c0bb1965 +A = -fd81535d918968fbfe792e7cca2112869db2 +M = f252e7532834d098e146880a9f5baf329903ec1e359f1882aea301b282a7485b75e926b9b400ca112bfc225706ccf5664c5a17b23ce42b027d68e5b73f5ea151a987b6536527a7cd242e5c62dbd332f6247f837d7e9d20dc1a4bb23ef2051dcb12378f59ccf3dc2d6f643b5c3f0b02e5273ee27a4c8fc7243ea1a8b03ed7caf9646638ab845093068337ed9c09ce460088575e5468492984b01efa85128e916d5b97bafe238d6f22e0ed18792fb1e28684eeffd49d7984d6e3e6c965ce6e26f637a7085277e6e783df75a1ddd4441ce65bd42b67a66187d215c4340295844159497b657d0451633b1db8973143ff7d + +ModInv = 23006ae79ac6074f507b7b09c58218fb312e024e40e89c553a4142a4196bc5de40d96ff978e143b37512c5c9fd557f675bd69a23a7741885589b562904a35c264f6166803e85641a79a2711cd5de5fb20ee7936810ec4ff557479b0dad0343ad1c641e9a31e7265cf35f82420d24c2eb453cff55b8c3f920474a914b710740656486cdaa5b9d56639fea8bcf4736611870b5c637062d37f56e213604e778b1770dbaf35f3a3419618e1aae61ca551d46a5277c33fa9b5ea918dcb3ed30919bfe6c1cfd6245b3a5231c99d2c2a07293616ee7ddbb9971a109e6673f1f2328a83fb61fddf343894882b64409c47e17 +A = -f1e17314ddd9d07453403009082d4f72c1a41d +M = 64e372c51a70be5188f019e2597a42319a8a25103ee1d01bf63e4d9a677f6549ca8299e3efad2cbd669ac13af2543142b93399176facbb7f643a6e7e32c970df927c160049a6c4d86e996937291e98e02411a54ea4e6b69b832d3cd1f1df9f87655a340b4cb858ca914a879abbbb15c14664ae359b3f66156db50bbeaa5e426bbb77fcb77716be2d6aa73cd6d85641a755388123de51e46d03c13df84e93ed631f681f238edb77c33e3109f3012b6b67077d38bbff552259ebafaf6f4f0b77320f583c0a4edd96702f117f3e17df68dc7037a9fd17d316bbb59e6591e9f6cf56aec42b723effb8d358cad884e6f2 + +ModInv = 10b0faa11939c0102b5ebdad0022305dcd4f0107969d53e6cf2d2963ce9226c641b25016698a3a97485a2cf8701323e484fea8069b5245c204c6dd6920dad3c78b66d103559fc99bba7f7742a63fccac659dcc25a326154d3fd01c0f19fd005bbd8010fd02bb23f39be8bbc4d5b4bbf04a363c2e1fe00abf2e9ffef75b7d37ac031950f8ec52b719a0315dd68e321f127c51887b82a4d477d1d803652a507f3daa6ca7d03e5bbee4a97008f6800e87e54a1bfa0539defd771748abcfe425e0b81fee309bcfc01ec7e3a8eb5d1493392eda509113967622e0663ea0e0c0f8f65d1dd3532f516f7557828bfe78f3b +A = e965376c3a50e8ce5ae5b9c1e97f66ded77f2b +M = 8aa3bc5323dd755b6cc86ed771419b71dc67b6217d5a70450acd0b049f0a3468e3b9ef69d07d926ea8190d171cb3feb4520e2df627f4dbfeebd9c49f0608e4e9949becd8e16009b0a9ef7dbc5a4a83463cef01aeb9d852a63232bee257f92fa476d5e8440a656653e4a14167fdc346fb0f21444676de9b7898720bb14fe871c5bd09b47a2db3514106a69b8b85210f5415ab2fba07dfd4ab02df43b901261cc7c6a7465ac00282dd51579188a699783c3d08f36be8ace6b2a3f3b89d5d79ec7e8767fd2e7550afc742f9a68d6e47cb4ce6b1bbbfe4595221b3a5a9f8218c0643f5a470fcf2ad006e33f585e18688 + +ModInv = 7495212fd6e2f7af09c718328ed0a5f33bdf7d31c9d34089f30e52f8626e55e24a62b32379561a5d411ccdb991e44ba10efe09c06c466ae5428d46884db2897d17f56dfd81fd084be9bdcaf091f00695eb8278fd2fe41842be5bae8aa914802bae0d0b22aee4be2afc335237cdea94bef34df1df93b22c4f55a99773136f327a60e3614083b7dd5346786bab75ff7289ee45ff63a4960d97c46ff873f8e0b8bf7e616ba131925bbc6a20f798d16859ce81579391cf84299dd532c698eac3ec7eee16c8c0abe2032ab8bce3921f21c91bb068776017d4850c068022aa0bd1c70ec6718ee4138813da0a64468d8829 +A = c5c9f25401b8889f91ff8a23cc438d222240eb +M = 7e67597c43f2e27a7df97a87bf13ff877bc57202d73273b2efdd5672fe38a601d69c6351009963b7d7b6ffc466b7e1e8bf2ee68807093809d222dad729f89445c29577aff17331b89a0b99648de9c67de5b17050ff4ab92c1f3021a53fa4f3419fa3648675600859b72dfc5d48eb71a1b824f33175e2e9a277220263db3909c5a42ae544756112f2e1e95573bae9f0501f1b49d5199cfae4a278278fa5766d297fe4dc90fc22b50014248926f140cb6c12774e10e69769e9b940a8e262b5f983c4a936dcc0580a1f73a8cf0c15b958d6b3ff159c5866e5f76e21483b37689050bea128b26d6310aec98cceb407d2 + +ModInv = 26d63a529eb5503de6ae42178e41f3bed156d5c90aa3f2af8432452081f752627185ec6b4d1a585e1381897e5a44206a61f1bd8b1afd533cce2b02e4052ce73876a79ede711e0260d4f2b175bf70cb596960986353b9033dea7668ed83e99b55e04f0f1dffdb63351ec0ae3c819a2f58ff3dd5e45bfbafaf6c105238a9cd208852a7a3fc81dfea5d97407d0a4d0098f4590ad3899ffb5065cc03af79f0c1f6db33e04cfbec50a4b81b643d1b493d6a0ffcebef722c8bf682b3f4810af59dd03c9f16b922af6140332308cafd73a6ac35126c4a06d53a005806aa7bb5d6b3eacb0271cbed85b1ba94f702b0a56d +A = 256c25aaa0a8f9e764361963c19c728cfa477ce7 +M = 6f6484b9b02ed73e19da94935e10f0e16cc2920d891f7884771c4b8f3916c6ff48fd9448f0ef209f7c19640157d230b76e08a012276f9ce227e190940cae1eb860830a6c97ea05425437018384ef7ea21443f9b33d5365b78a759bf9d552c55a7bc3fcf585c08bd32698c09ad74da89c6b9baf2eed085274509c26e8368bccb082ad8772f34b692280124b28c7b919fb593c546778fa116b17e7d3bbf53efb2b0275251062dcbad06d2decb2579a4e70cf7db7cec7c28546e55877a33006a05b351d84d0daa0514b0d1f90783fe744f054046d63949fea8962162004b1cc628e5c333edd37f8bb20a861c4090d + +ModInv = 6a235aa44b09ef6c468899a3dae9b89de17128798cd8cb49ac95b69c2c816df4850d298728e765c1e676d07ed8c9cc84abb797935e603c74ef6f92b1a721ffba26dac718fdc8c16db3ac45278c439b71ba75e4bb05f73e6c2ff7a700557d7d9fa6a0b5916615c61ed68f82ed0b152ed54a160afeeae8742a79a9d47467f29b303e89cdefd4c2782f265da002b18f74c9f1c22f49af622155d0e2a7660058258d2c8d518f6b8642a1d4d8d31d3966d99d705590fb613c9387128d1ab23eb625dd0e17e722c53f0f764d2cb784cd69c3a81328ca9a9aa536fe9245fb7b4880744bf3968b9652c320482b14f16930 +A = -60220668ca477c71ec12f9bdd289046d34012259 +M = d3396618dcc3ef7d56445afbee83ee1ef7e108d46109a0e7242e673d197ba9c28cc0b6e5ba8f6a986face997f41b523b5f4d0b681cbe0fd7dbac4535f65a446b220864a64fc1c978c02a5fa2474b97e518da8a2e924356e06c12a26c4398b6f984e7d58b4d77fa96b173447984b6d2fd1d68d967578a601d07bdfaad5e632cc3f4c298fb290fcce46ee15f42b4ce6f02c88622966a725c57b5c3339675c390a0b6b52ce25b0c601300b0eda8f8952ddcc9a3cb1759a6b6fd9cf0c674ff6d1e217c659f727ac97f1f61427eb475739e8718e2b287ed0159be7b823007527197eba83530981bd4b80bf47c859493 + +ModInv = b85aae6931b7f24edcfb33b8867df550447a1706e2d0f313a11d85ddb215a1ebc98cfb8de54be1efb4f3c17e5447cf61af330454373633dc90ed4d32c45db47279c0f064f56823617dd663416e0d88f47aaa7ee131993a1a6f2a15496223b2e4a15103b316ec062b8837991ec7d53370eb8d68cbdbdafeb55aad1b4752861d6fb80e6ad5c5bb91c553e4a7ce3c50411bf655036be0efafbbf3103c8fab8294b7f1f84bb3cf6be1103bbbc37aa0ab41a0fc8443b5ca861db1ea6b379ad8515706b972026ba0c92c295f9e29ee833655dff617b6c925f7646f2ff352d30f165384a7a8c24c50747d7550a8c86 +A = -eb2ca5839d6643fff157daca62811880da1f5e95f4 +M = b04c5bb2b52c62c44f94a5ae7567e592694bfa1f2796c4a2265622f83074225213da0110e7eb050bacf86ffebbb7274ebd26525074bddb572e65147d48767e00ed85e9e1b5d95bb49ea60127bf817d7d0558ff6d33790eadae1b4813bf4d2c65f06a00134e03225ff411a62bfa3ff685ce607f344824fc66d53b17ae4a02f42b744f44755e78463082007172ed8a14a56b67b0686ec84d2e0c61847e3a87d1740c22608c54a484581e182c39d267a93d47d4bf6003b3049b781d48306de91b1cbdc32a7036761292d1c1cf57e84fe74689f7583d7e24c64f85f9d07ae3e9cb25b60868a959f9da98967aac8f + +ModInv = 15c90790ad3a5013d967034d27b5c473cc0a9dee8b5cb72793ad7ca80eb8a30db7ff39b2425c06a86ae0fc4a49e05898fa711afdd608ff9133e498b1b21d50d5d2db67913deed841e0faa5f8267567dea155cca4de51b9a4b90b9d30877b91c9ad23bab8abc2d69518fc34b13c298b70d6a306f748aa5775edfccc6b40ad8a8ea008cfca5365389f863ff1e39995f5392195ef3231f90887c36b5fb80c940d1cc853cf17aebb0635e038fed58b54f098261c8951be66c589531e2faff772c9761fed93863720b767ac61a393279f34fa41ab57298eedb259617c9ef25feca0d36abf93d939187a06b65312b7 +A = ed3ac480002b03b13a8ce2a0c03444132084a96a4d +M = 2a3b18097d95760ad0489fc00c21ecb170ec7784275769d16a9178af42f1c5ea887e509576d482f6b2a46a81ed286a07592e3afabf91f77335abcb3e782c072266f4c753ad06249be7980f26a50e0727ea0d4598e82ba2c1fc757eaa4694c3b186b4084542bc88b2c7d82ebac92b5147d4ae57d903068711e43cbd68011b7568ca449388b6256fad795675239925f9d1131ed8b7f625833e9f29227fd5f9021c7a7ad7230f04a0f1b5fa60d775e4f61f0c94f3c7baa8006c7ccf664e7b260823e295c5d0bbeede99b3749facecb8d19bc124a09908c417c77adcceee97149c72a3096fabf2c0a829e643c31a + +ModInv = 7380d7111ee1def49ee20d0daad08d4d87899184f5a8a1dc46d5b46a8636bc5add888b98220b1baf31731857f326d0276efa710db01f6a7136049986b3e43fc55d59fb119b616514ee920c9ba181114f5a04f3aa009dc07a74c4b0b0f0a37336f663058c7dbf416b2eb09cc84f5822d8ffa99ff951fcd1d7f5c6c3387d734f0e0cee1569af3abd76e5318bb4a03b27b735710ae5268017ecea5033524189ea21a1bf70c294b784fad429c616e6ba7f92fe2a83aa905b73d7ac7d21599a7f6704ef1547c5723a63cd103279dde482fb7cd1eb4f0f0e9036d097c3a806d80166d33900aeba3bd89eeb8e2602d +A = 8034622979a0aedb35e727468cb0ac5a8b0dbf8e69 +M = 66f5aa9637cdb6e7f0183ea34517dfea8f911c2539921ba240f49453819972b772c2ee011ca2a8e39f820a5600558136f41439aaf1cfbab680ce78b12c8bfab7bc1f367ca74f5336f487b9d837de3be1ea2224930053bf4edf1af2050ae96a52fe345c7dcb11398c75ef67c269c73cde258714e71217afb846699180d53fc5c4c50c8bded146b286a6657c680463968a93885da1750f1534101c288f8f969b48e8bbd1c9a49dc5c8516afe28c9502fcc6bf335141e147f4b2eeea35306ab650875ab0548733559b24b7cdb0af567ab63fdd63e27f9d843179c6c1044c51671a97fde684e69bb2edf33d5ad77 + +ModInv = 1e6ee806cf51f0efdf0b72ceca2630b1d848967e37e58cb4588d56476cace9058b6db7b0a4b3646b98e41f652b2e26e578dd251c7c85f2bb6389fc81654ba84439a8797c672663ddfee063ca1f4c44641f7189b8bd3b1bb218a9bd2e3957eea4cf8bc36a201bfc805731b057449dff0a318dc637151871ef771350c6116995f4cc81e8e370f995d5527a4af8890d7e10aeceb362aa05801aa54f792a5223a2e2b2b1f91f1c9aed95e3fb0afe342c6d8655e061e019b917402c429b63abeae01865b50f728c96ff16a6949155b94a32d41e48143f5c376a8576d31d5af54ff6f4816a53427e27b321339a11 +A = -2f2c612f1e885e92a710845c7c871d68b6d8bedcfefb +M = 69cf42abd99fab682a16cdaa28fcda2696fe846fd691a64833b09d5108f8c46bf483c1cf874bbf0491649b9881c70dc5d218af726eabb96842ffbfc376b47927b7a6aa30b3b749af9a85bd523693e135c58c2d0149e1f20734a41e7478a01a41019e5bd3a53632ff2d62d08dd2efbaf91a2b4fddd10b03604fa2152b5933fbf1ca671896f840bc530d845b58912caa5814454e87dfb9a06b72c4dc1df78a25e201b17fd65da8951d1ea91e62365e35ab4141e29dd9edfde4a2b86137d77ef59bfbcd857ff245d8c1c96083dc0a2e3383313e278bc03cb9dd08da0932a18f1b30a67be9884ff43138bc852c + +ModInv = 3faf5b9e407610cea605cae47810ddebad57d73bd422de6d7372909f314526e318a6bcd0a470b50091d27f31b15b13c5552218a76518724a048a961b7c1ce9bbfad187fe2a2f540e58861555c5a3033dffdac4e9cf9baa86aa530640392889be4b855480edab6ff8df3cf7ddf3bc6d7963346de43a80445bd10c1259dca2da200fb4cbec74fc425f84bf473f9a0397a4551ceca00b6ab7e087f36e4b034b43d2dada58ec2a2bf5dd871514577b9ea29980be36a9b1e596f1741bec2fad21a22a83dbc12d82681751d2a92e518f7242554fdb3d0faf1d40805e9de677d229915cdacdbecbcbb2c667af5d +A = c7041e393bc246f1a01cc0c476b6fd0e38c53a079a5d61 +M = 7074191b14e240e5a28b60e756cf09f743615e7d01de684751ff51983b798b534b5642e37186544002d5bd213f7b74fe9d4460935df2488e01a40aec943ad5feee45038ca9b66cf46957b06f9d08a46b5c82d58ec9c53bf5c186ea5a0921736853992deb5e41040d3e0be1cc2d76bde796dff7f5a8d178dbce6f6c9d0ccfebda970ca323316e8e61d0a453b78b6dde88073c43a700944eb26628798e0b1e50955ddf5b72840af5a182419d50f0344f1fd38107b70415f9779b9801b6720e197796757bbf0ba592316f40a69a353da093fc3c513bdabda2cf32836287b5c6e527284ad4aa1acc1c73dc23 + +ModInv = c9efc095438aec509208d12f88dcb78cfb5376bcab8e5da7d648e6bdd03731ee4328b492b4333ed12f18530789ef0e5ce9a7a00f233c5d1336297972a5e43f7d5bb7ae41f3b1d5d06193d044591adfa4c7a3ffa44cc81fcac3bac0e7d646f1fbf29b8273e6dd1219c357b76b10882dcba18e479ebf8db40f1c6b352d0fb16bf1e01f021a6b7b9c1bac535193f8ed5de0af845981cf125855de2824ade46bd419b7d22c56175bb699626c3bd142a89ef4f0221f3c23d9d89888bba2385377a63238d15726a289e32ffe2f853d08cc07e88582b6870e931ea8279ca794d1c98b835c3db08e53de2ff0b2d +A = 314eb895274dd76b934c7b7fa012f7377ff64ff7c45fab +M = 13a3c85d00f86e707b7fb68da48728acd9854bbd8ff2b8b85976c1bf873f3a855175c7bde37f90e55b8e19624294db50cb2ff7d3783513525c3ff99f49e2b91ca2f1e67aee3e674b90fec9a8f0fed05abe48edb132b97536cbb48c71bc72fc9e63e7eb74e8245e89a77ce988fd9668b5522ed7b696d85bc2e7edcc9a764eb1fd921f8d7bfe07d0d75ddb1a89b2f31f4273bfd377b507170d4b16d9cbb2ff462ee3fcd1b29c97bd10a1e84c82c386d182917dbaacba3cd1298809e94020559812c736a5600a34d6fdba92e4506d80d4526f796dbfc0b70b16ab74674a828ccefcfe39f91546f5b5a781de + +ModInv = 2ea1203079e49c2c9f8ecfeb393685c8d6f3e3e79db409dd605fb8457f8d0a522e9cc5cb0de9e291303151ac8191930955ac37fb1b49803b174422ea5cf26862ac196e77291c3d6d33c71bfb362b043300cc70c8a64b9ad479ac8364305d618ababb308275cfb993080bc876fa23d4940750f6f467731a37d82cd4a27725098d6a215b154b4ed242ab35d46d802007f330c47a1e71ca0689131120b282f6fd730aa2486f26f715ee3a5f6c4d9c2610ee607f3c1c8abe03d8ab70877f0f2bc9ef2244f94fa31a6f429fb0cb972b1b99a02a1d56c4e838c0dd18a1c31c1fe139176364e1bb908f9f39d2c0 +A = 77f9f2e4916e468e810511f4d94ef91cd835baf2d8e14e +M = 5c97f5c508f5f324f1e3e5b2e7f896168b0dd70c207e410842a8fbdede1984a63eb96c2f5ba78d53ff8094e1bf19aff44910dd61e8580403d7661424883ba5bbe97267911729460ebe43430f9a8e1e3223e4cdca6031be70dc502c593ebba8496f15180114291d0c9a4d778ba534620b084ad5120d89816659b085e8e4cf2ae9d47dc58d0289ebe13fb73cf5edf37b29c3a04693e664f93be77ff1241a9938f086578db08f933d73ea0ac7556314d8c8730b7351257bf242aad8144a63ba2f6450ca48afdb92fc507cc67beff800badc2b4aeb6c526c56135969f6593245c14e482e3de346c7a50ea241 + +ModInv = ca15dad56e2292dfc3dce42bd29f8c132fa1f02d9946da4462db59ec2326c5606631d36d6d0e1e1a13d5cfb72c50536bbc163033d998de4e4a5a6a3495d8e51221bf67aa64c8d0460c70924d30b97aa2f9bcc7677bb84fe077b191568b81526dc83b5f77b21647381310fdd7fb186c72f27891abc04ab5994d7c90b9b36a7439fd941a4a4c09223c704ef8542d82240529955c4e66ba9e0130e6a260e3bd1cca9d812ab74f3cfaa7b5746f70487ed5d87d8c73f7c07a9ba8c59c150bff9dc83fdcc0d25c0ce78a7c76b8bd2ee7019a200ad0611a96254fb4e13391499ac2f64df6b46ecfeab8909087 +A = -ee0e3bc4ee833ca7b1e73bec3d90df5c01ff2f1c46a28e7d +M = ccb3105af8c5a98d905c33a83b07ac82d189872807498d0784ba6b36e312d9d314ff06af50983d8ad76b4cabb0c8ed498c529e7b5ef9224738036ae73251ac4429fa137f73c4366d94801888b312ab54548a03089cf6115739c4fb60781a7894abeca5226ec8036ee0a5941b8627fcd34352f2ea9ca0c55664d98610821155d0973bf0c40d5bae66862c2589ab55c342d847b28dc8829f4ab3217963e3020211ccabdd076c95eb6c90734e0a3dd85e511e35308dcfed587cf288600d3a9e5c7a2db991fb22f123f32ad9bc7d3fe70c6371ed6a2837cf5ee892567732435550d5df5315b733b33cf864 + +ModInv = 7bcff16a655c948ff5b87ce010a393441f1b468c7fab256494efed20efca25d86b323dc8fb35380985e02f0aba57893a53ff630a25093f6a416fa98f92d954d6793f1358b3f23741da8970139a7d813f9eaeb9369eca54fdeab1ae702cb2dbf3d0037bd4e9a5a3a123ecd43468c78d8e2b6d14812da7f7050acfd3f49c64b2e9b7c4a09263f3738ee86bfad757606a8a37175d1a264a6c68fc13303fa2717dea1499bacb751c51b965e1b1c9763b6d85564dfc56f81b3028199e8523167aefc5bea91997111584043db5ef7599a398682d1aa6c869f3a3a2ebc36dc15d41aa36323f7cd426e51793de +A = -278e4dcc26d5c61f1cf13d14ce042465d897843de675127e +M = a620dc97c5f530558aa6017aa40ced6dc55a68d462c715292879cfdae3673b45e6ceb60f660b14af73c5831150803c41bb2f9468ea2ff8a60fe4f1d4381fe22d1c21eb1f9c96b08745cf4b052058af578161b68ae28f4f670db69586f52f220b78b371177b7aec6d1943840be09defc1c7873d06594286b724619d4daddc66be36c0e24dfb354403ccf956a0efa31299afcc59a7ee06d8007e88802dcfe7bfbd116ffd0ae143cb5de3b575c39ed89a2d893dd5ba3be977c2fcc6bf57a894ddaa3affe3d829005f84632c55097066c7d815bec7cf6479e3a92c7c40c7c997af687dddaef2fa4c7b2f39 + +ModInv = 3991068743d98db1727aab2824fa64c1ffb1194386d40bd6d881e38bf74c718dd0e3cfa35557652ab3441a88311737c021a3e4837742d7b556481ce8f68871e8191eaf63ebfc4b6d259c732a88c7d3ba8163b6219cdc33cb9e84e943dee1fe626b6d07400ffce962823bd8019ab1d6ff063ef913d6f523e2c4afbf9bf56d77ef7dccd1794e012763da9e291759d10648289e9b47fae313921c1bd96c2e8ae504820c203b0612a1c142231255ca7a456564b696edbd06e8a373ec67c1b71583f8c7eb947859e0f64ee68c8630968c4c2b9d5b6de858e20b88d764d98d4af2a33eea799f4679e46e736 +A = -c5fba1508c3c5a4add1652e26a22a12aa9346ef357a0f337 +M = 1e3e22c865c262e22f0f85baf8f90e5d4b45ce8843f8d67c828cca7d4d89e79c8701427a06fcaf3968a1f6099cc649a763a8fb359c0975c7a999739b503d064b242b8e1278a3e7327ab4b43c8b807280161c723529fb7583721c75ac48b9530f77100a26f8f6f315a94ac845e3143f68bea21ea6495b3dc7c9f95b7f2c83f11f3219949c9392f5b829d7dc7e88c5e0cecd227414ce755fdf6dad3662a778534f0064a45c4173b787220aadfd195935ac777157a0971fc1d44f8e8ae93c56a4d2a8cbde452f3282620d01cf0df8f851a40d1eeb4c41aeab42e5790bf02a1bc74715fef52cb172fa7c4b + +ModInv = 199d10169921a085bd0a107b39407bc9cc9ab2e111ed48682c8ebf0eee488b792625b7927cc5f7c2085392faa8171fd7b38d942c92e8ed10969d5f2bc3e78fdb023c143699f8d9506ff37f12ece51e1541dfcdf1e3d1162ed505a1e8422284125a5644430ee9655989f943bc9073939f094b810b3d4c35a64734a2b674ebbdc7087bf4d71e445f5122b51d1efa793f1e1a70aad131996680b3d07136374b67a1442ec22c4475d64afc84a79f902e9455f17c2382bf080ad0715654e0126dab88094102b7922fb85f46f81075823507a7f1280445b97e2a1f08515e5df521404c7033146a3ce4717 +A = f14e98df43777f3b33164b87dd4ca31882d523c6ba5f92f5cb +M = d31e98c635677e6b1a30ba71ac66dbfbc9ae21f864f56afb4f01e9750e3a39567c0cb3acf34c40c396b7455c2441e575c35d5fda84a45472893740740c22bad39766242c9cbec1532d074378397f526dfcbf7a9fb64f2fafdf4c8154060ba0c3a685641a2b11742daceaab03c583a6aa15e32d664450c3eb36da7897f6ce12149007859aba67fcf5747822742e0da5ae4babe43a564859fc944bb6033a02fb2741ff60444793a962b5ccf62b8af133f2f3366d165b13336f72434292066352ec570dc402fbdcf0a5f17815a3beaf573ae82b14346f5432d6d1cd107e7ef14bc558622a86cb621d9 + +ModInv = 8bf3a7d5ebbb742504fe227364457836a6f41b39065c689f2312ae7368edc1d69865c3f749a7e8138fbc36559f29729bb70de10f500f6dde50a9ee9192158ad9bdcf0988504f1a8384a7f36fa26b2dfd9b6bb6105fa4f91f9e8367fd238beac875b97760921703f9238a143a5ed8f7c6de39b9146d852704692e6144b9c376780e83795a03a7a014d6819f587c4bce6b27bad4c78ae4547df9e0c3c00dec8bb3d6bdf1ddd58e6d4666c3ff15b9fa25c576c0bcf0ec53cec1b73153d854d3c086f03c5b395ac5d8e0968e817cc54dea57d0e6c602b3641c13d3befec458b4bfbb518ee06688c96e29 +A = f82c55ab55c3717022ee753da6e2dbb424763a1cce8fd1a661 +M = 8bfafee3810049641716c5a5b6efdb2e8537e1e8558b9d5694ed6d45169f7d07efaa530f5b377f8aa66137afd8c100c2cfce8341c842fc746e16d40ac373e484f14a14e648721d542e590fc7b627fcb242779e94377f8623ba7c202ef65b937b3b4ee1af8ef960d5e19cb83cd0543689584822558e19578a52dbb148a852236447c1553f8ebe542880d433697cdba4aad81347ddcebf78ea372e60c9eff3eff23561ef2899b16f3aeecad321bfb05b59ff1519e1aa70c9388bd6813d743c428bec8e88db27c9c1624fd8a9c1063a908b39ebb0c6e7e6a48686aa10f94544228e8ee53e184c055244 + +ModInv = b5be0d07e1bcbb165a5c62e2d9947b065080b010a96c23c5ef82798638648771286419d30a3b626a9eb2cb6fd56565919f491e6d85f867a26dceaa84bd4ea06a935ce1c94be937cc24c90419fdc3e6d4f29a44f9bd2f3ee568c1ed7327441ca3efc0478ae677c60de2fe78f1eb4db267242d58373d3d7f97a6548c2ad77eb3fd9c5ee57e564ceafb3b23e59d073ca0fc2c8b99961ed72e595e1ce494c4717562197b792f3955eadbc97f00fe2e291d11a13386a5af44a91f6587ec8cd9ec258cc62586cbb89b75665fef10dc3e36a08830e88a4a5acf9074e583c867a0da13f4d582468bf5be5983 +A = -635a32b44e2707161494d566f01134f1b19a439881d09cbb51 +M = fc7819ec57c996e3179569bff431035ab2e5513336d8c58aeebcce73eef853c8786dc14b3831b41eee3430ad71400d032aaeaf36755005c2b6e3929d66dbb30bc2452014e520084136700dcc366234f5168255ccfa3d536a46554b5e77ecda6d5a5bd94cce9f9d2a2598f4c9ee7ed52f8fcd4feea51bb62f1a73fe2d8c3cf7aa37d36ffc9110caf3a129e9a9c710c9d41fdbe8ea6ad9e6d7adf3cba32b11ba0da1dad6ed1b89495ca2d2b11c24a097385fe4b8d668c22a25fddf4f916e35ae748b9b65027183d120e6f307a2c9a629a3bcfcdf646ff39440d3a1d9a1bd7650f540724e72cfbf22ae + +ModInv = 7384e6a6fde9d56f138fa8f958bcbe1f9303d350c61529760103fb646a8db08995df8705e98af49067523d97b5d360e7e15700398660a3df1d79147fa05251689aaba4e956acd550cae406d782015303ea9482d80bda9954cc8ba60300afa9805a636d931422b36c2b882732fc2367be04eeda24eae576f2c0a00e9788e9826a3ea1426797557be99644d4643f52a82f92d10b5a0487f2bf2c37a8d44879fa6e6ab7e03dba3b5bd7ddecadfc43eacaed6fcf22ee4076a338874f6200c41389c3de9068c2c8ec3d6787b767b0aa9686cd024cc3cfc4354db283f925b9836d24cc4b82c4423dc91b +A = 249107c5dc09b5892655bc087a02341519cae6cd1c580bad0d03 +M = c91c6ea64a1eaaac5c76f98c11fb7939b2f87a91291acc1c77ce0df3226158d1fde9d87cd0c27362166f4b3091931ddc6955852919bdd67dddfc207b67f38521506a5fdceb309823d08f17bc55bb781f2a462ab729f0d7a466f20c4b5ebd4a7cac8f2cf2362614af8716d93ad7003b6f411c1876a3063d19d757b7a633a67459d7dfbf6325c73eb369649eb452bd344cce68a81efe2b59da52b3f7a5f81894315f08f73b5b5f1075b572b5707f63484733f7117048744404276554b7f8367c2ace4d06b5b9b99170a1e8dfb11cb37202efe44cea96c99d4447412dcc78284cdc29ae1f9e2248aa + +ModInv = 3bdd168531443c2457167562192df71165e00ebfa457d6dc67e4c11bc87a1d3c17304a600d5d7413c04cc5ed64559a56b4d7f3a9fec959c0cc4f9fd7be5cab68c380fe20a07d5c723dffcf2156c50ded4272bf256624a3009cd9c0eb75756652fea4d05330dd039b976d8d8266b824c3b4e36ef6aa889c4893498c14483e574393c98a3020bdcbe0868284e2b77cfb52fc424b88262e60e00b75826bc394c35b0160dd1de2544613b450f32e118bb5f1d1ad59e5de21ee1a2d09e597955f6285810f319dff014fa2b403576a0171ec4608f9c7487245e216c8b48c74735d6f7dd587ef0ccd1585 +A = -32b5df81475368d0ef1c780c4b16a51059fa62b2bbd1c38dbe31 +M = 42bdf06145b70109e771841990469fc54c92a1a072a0f6de83e5b32d5ed2a0e5e638e2ee18d8510bbf2005f7cbf929455a4fb47e07f580dc988149dfb993b178b9722e726a44e2411cbcbbc0b9d65a3fa2617085b86a9e096823a9a82de0f7b53bd822d402ef02b71a6bb4bed1e9987706c40f6cfb9af520df789379e1575a53a7cfa066fb1d88de6c3a9c3136165f85e116c9a48ac536db1ccd8dc130c5d79c7b0ef4a137a5d27e8837d23cc8d9303398fdc453743a2d871cfc69e62db17f093c6d797387da67d9d2ef5d715256ba6d80d5580e60df92f8231d9965e382cbad3c3ba1322b7d97 + +ModInv = 2789ac34b547912edc3982fc9863845c9849a796a37e54a6d712d575233b4079b51a5ed331db99cc0df7c1557271d9f8c17b300aec4442109f53d0e1d7777e0929af1a0b84e7d57386074c1d625fd6257cf7a2621281bbb370eddde16076d1f543372ce90156d076c2064102f359950521296896ed02dbe8052e2dbe47641f99c7481cfcfa2f588b5b2048171740c567034bd99a3b0ec98feadf130642c38575bbc681bce9304d8678f48baab003fe6f68a1ecd15f3e9e22d2f1c97a2e75e542c100786c6c98bf1b8dc23f6463437f774be504fab3fc7ea540fbbf9c704748120bf58ecd6c +A = -3ff33de8b20a9e75406980842f3adacf3c508499496090bdf5d7e2fd +M = ac0fa8fc1293846d10e35c2e3f63e0d5dc4e5c0294aa73ce7a4a6777e398e5e914298ea9e2da790f78ce379484f7352d1b643cce108bc1ad31dc1f93137ae095a75abe5ae929b15264f448da00df05131e6ebe35b24a2aac6851e0c16b40e64306c9ccc33612214bb3f76b4d1dddbdf6965a514e0edbcabcdfeaa469268f75e4640c3f9b9814938f07e19a020a499eae36f2a98de3cd6eeb73d37f8dcd1500401b17d8ed1b3620e9a18c132a82b7058e97ea4fcee495742d978cc3b4066c8d24c6e3a3835dc4f8bf9ea85e51ba52f3d305bf9a041a44cfcdb326512a08574a524c1f183e6b + +ModInv = 4268df0abaef95dbe132112b7784f268466e37e5778acf71eaf13ccedd1d9171efde424e81f07a05e33e590fd4437843765796aac71b6d8c85e5a684d57ed899235c124b62523ea522d3af90f17d2d8200b2297b0e235b2921a4a14ba83d1e270086f8354172a4e360dc5543e577695fa2ed986115fa62ce143a7471f07d53debd62e5ec5a33529816f3f690e502f5b409996e60c3176459647597558a46b445d9e7989f88fb9c066f5f9b29d131dd1621b549d1030d515c3c69835f7320da78aa94233aa55bcbd72db32b7ef6b3a41a0f7c03a2108b5149c6d708ee9d44df6ae33f52d014 +A = -595cf43b99c1c506f2b51462c3565f1d1bda2d132fc13e734ce48c7d +M = b50906ab5044060f5b20b3f908f56a289c08639801db445fd04aa6fd6b2e8a699d74c6f454dc591d5ad4cf8dd383dc49c01e1e85e4ea26beec475704bd41aa5b65a8627fbb76084314d32b8a7e96bea3581208fff77658612bee784c46214b877d24678be1b89f144822b5ee76249243637fb5253d7ad5db0cb751b53a3f94f05ea1be1871305e9fb67697f702764dbc39ab49405fd585621d964b819ea18bfb4c3cb19ed43fc9521d96b5562e549112c35abedf01322444b5780784b2597c7dbad8f6b9a7bce0d82c801d8d060c88d27cf0c78198e8fbe61adafd328834b740c554119083 + +ModInv = 1d6959084904344a80c2bfd9baabfe0502eac746dd58b8915724b0a6e40a5f8fcf43f880467aa7f2e53549700a7570769befc642e97d8573643bb8c48251d441e5e8550b0655973e01ab1b370468c2239b5e9c502cc8412930acc1b18e90750940ba2d1302510cda79c973967dd1c1065b197f64efa3f8f4432889809be344b9ace0f2d5352be91a4e087eebc4053ba67ae707cd1329e334e88130115c6f568254c71e8360712e5b9287f5fc3ca67b5864cc36c50d5b031de0e3fe23c8a3dabef0c8fa0726bbf52ac8354883dd33173026d78e8d671117fc89c60ae3b7622293132953c9 +A = -f88903ee18fddf8b7613aac52f76f939de30a5e6ccd80de48610541d3f +M = ea4fba332f75945c16320eab4732046b66dbc245742ca7fe0dbe5155a6a7b98ecf3ac5990d39534df0bbf2180dfb4d4317448291b3e27a00a87a550f4aa28ea6cd9a19c182f83b519f37929bd5413fca66c3632c8a8e66b2e82e55a56a28fc5db9980d3d2b207e9db8b2125919443315b5ca2fd0499480e0654c964c60b4360a4024f66cc3d682ad6ba37e4b31f2f6615a589468edfec83b6b027d7dc5bb900ed2921f1620aae0da1aa294cc3ef1dd718b4001ff406f935353fa1efdfcdbcaff065e9ed721b63c7487408289a9f8b065edb4ed42e956c8ab6d22ef5e199a62f73a35bfd4 + +ModInv = a74adebd2af0a6c6ee21147790ddece7320677cf7dff22b845edff4595a7eaf04950b0b3d8df686e70d6dffcaad4df9d1a03a1d5d58bce1419dc8ebae56b7c0485b85ca842ad0601581cc2ddf276ea9f680d40f166f7f656dfaf9602a2f299f9c775f92494bff8a9bdf0c06ee94fba6b7ee226b9af223e6e7baeaa585e648ad4963e0381b6f97deafa1ca25e1d436eccd98433a3ae43f411aab55aece9175063f97f6c57a865ae3b092dc508475ef9c07f2334cfbb3ddfcbacc8a0fa366102c2158ed9a3da866786453a34b17d70e4ba8cdc1741e3f30113bb135f1454e7f7c3752c3f82 +A = -9beaa970bcb10d8d36ba5cbcee2d885f553d4ee2bae6b53b4cb3362773 +M = de8e61b8c440f7ce828d24408f990becff1a7b0e1529c332ab298399b9010d50d067a03d3f7fd9e14f4d6930519a0d659a0ebf6db33f6e3d9f3ab8125f9f782d215ca9675ee4c793ad7f672e6a6b22a8c96cffd64bdef32a0df60efe9757e5c32330a2cab78c2fb3721c57f96d29f2dbfcaa79ecfaf43091192a5a3b48a619164a9c2dfa8530fced36d2d3b3c8485bbdf0ad822f3db7f319822dd382469c0d34b13e635989cbf3ad061c0d01cc1110252e80462e9e17bb96022ee1fdf9c284de246c564ff57f0734c37ff700edbeb60ee1dfb7a85e0038fb3084a7ed2285baa1b39eaeb9 + +ModInv = 92c8eb6f5bab262fb08f3e2173aabe77c9067b9cdd3509cc071a8d2b5eae4395718aff5e563f9f907ffcbda11d2123ebf7d65f694f4a83d16a0f5d1b20db516df2012f878f6d75ac330d5e9a41537d34c31a6bea6e8d081bc115550659c4f1eefa4ea9b6b4f7fcafb9c4fcf255611f6dbf0ae29eac8c031bcced98c30cbeb152d4b2c726c6500cd5811a228f002ba5cff0c5d58887a078a69861a9cc34b4db81b52ff0c4956db815d08bbcb77891b50b7b206e2e12c413c228b594c553b2f35ecc82cde65f65533348743cf0273215cf7f5bd0adae8607211012871ba7b32045ebaca1d1 +A = e59801a8ea96b5034b8cda72b9a43ec79ddb5153710827cb5e7beac345 +M = f4e866b5a8f6f77989a4186609376010c247eba932556b4b6095fe2517c23b24620a00a4464b62a0033ef1bd5cc33db78ff59ea4ca4845b468116a00fb2c51f9077ae6ad0fa0a7e2bff18cbdde61550d677549e776e93b4924291731d38ef3a16d17205b162447ec8e2398696de33d5553ecb3c95bd3e46d8b0e7e79b76976962c35fcac04b0331d86a7e909ddab132b5a78042c9c754dce16d62d0bbf302d5158bf7626beef69238e2e9374b240035cf07d24b0db79ed34d230badb74ce7674f6c385d88c0b33b4628bc723f022bacaf1659a5057dab7a15e0175452c18be240cd3c554 + +ModInv = 73941cdbed5875cf5a4ce3ca7367e93de287886c92ca4590a2870efb96b4f9536330a6def7f5eaba3625e7a98d4a72bc71631b5984c1c2bad2aabfe71fd13363327f43c7f86780f58c742219ffa39a94b0c36ea131d92101f2ba783fa17cd537604d386f6554d0c903303c714218bd35f091d064e8fe2bd2883d73a050d107602ee25d51b4d5a3e56af9fd9469bd425a93a4cf18724f3a40631b0828aba9b876b331aed8e3bb33f1180c29322da12a5fbaee621efe8cb19fc220e43ac4d6201192ae909140cdb8047d0f52078f5e3a5bdb198dd7d0a1bb5a91483e736e055876622a3d +A = -f3f0dafad5d212f54f81149a9bd4dff8494d3bb3bb251f8120c447f0e17d +M = fdd97222bcfa3834e499260312ab20425f8f1260c0dafa8e544b0eb6464a8828adf55eeae4de10f54bdfd962ba9eda5bcb5d2b96427fab76b6926b01becd7f2c49811452e3755b12e627a3479a89e911609e43ca4d7b7898ebb856648c49c7b05110526f57bf60fc637920ece002789deda26cbfeba47d2c5c4c0cda887a19a724f705d1e059acce7907be75aec231720ab5e245324bca3b37e423cb562f7f12b934c6a13086295c91360d5fadadf245309d3d501e90931f4840e5f12537bf800d1b69296118c76b2038df2905ebe7f1311652f7bbda8d47dc5628d20799ba459570de + +ModInv = 6e0c25a79751daa0c5a74a31f01323e8dc2da4079384cc6cec74628ad8b8fd4864fafcb7403dff01a001c60c602acc341d3e999795d8659f06a641e60d9807983f1f2bbbf11cc3f8d483808c104e9e9075dfc1c8f3bfc41a7a4108a87579385ac2d3ed67328310674831823a4b7c88d57eff89a239a796d6036824e569f2e03dc8383955ff2d2649c78ede5ebf772a6fbbc50a83e9dae258c546c0996cca0fb7d985402ac3c889f74d2e41193dbe6f04e7e45f200c89030bd5f5bc4decfaecee36ef2acda452c32cf64933171acb7aceed42b3339eb82d91904a81bd8543668e257cac +A = d9a5ccd229453b1624388671d6242ca20ef1a0d997e9cd6e5c0baeb6ce87 +M = c37beac7a35984105ff811c0103e490e1f8a8c2e5e7df8bc398a7c66a9ed1109396134ec458a476953f83345775076bcdbd2f573931cc7809194d919a82e92fcf626734ff0614755bcc3edb4b954619c0e2a95e067d3d62654496ca198a9e586b514a97c2d8e9c4adda41aeb74c329d2078a771656ec1e37e942c552552f517b45133f1df7f28948deb35bbfdf3e673a2fe16bb563ad19b452dfa19b04a3befacde1cc3cfba4a6ad39973eeee8aba713b1a60b03ae7fb5b7471542f8ac1fd8b1803ec53be1465d44c763a61a3146cbd542255b155009233450fb4d8d0002857beedebf + +ModInv = 2ad0d2e363f48e69cf5e483add78eb906093152ba7fdf6939e0d20425cd0de0c3762e202b8d2f5480cdef16663f520d429e1cb0343cdf28ae39f162fc88467c30e1f2bc368f3a0253fbc9e504cfa03309496f430612bdf2ccf20b3542b37b54df3f5c40e1dbbb2b00e02f38913b6ca15448ac5c3679d9db4ee4cc0f146f2e1cd7917cd3eafa4cae69950dc9f675f85469754f3dfdf39076401d6b0b9df9d923ca751e202fd80bb27e413709217fd7ed894cb5ad9a72aaff0ea755e8974ed7c638ae170e8247d38971c08ac24384686718f3c49d70b6679dec9b91e7830027b127163a8 +A = -6948ec5f8e7c9498c984dba062040ebd0956dd97a69843c7520f5783b05f +M = 48c2dc0143f806f3e39d27fb4be11e6debc2f4c33b88c0d4ecc5b0fc607a4b9dd4b8f8288b1907da748a2c6ceca8053bba6a1a4d420fd93eac2b464d75d668bfc1df3ebf4981c796567dccb829d598b22e3ceb1d0a39051c7243194c631305610db43fa7a4f96a049e875eb84ce66848bf3451bd18931b472c911aa9f0c8916378fd49c743825b638581d406d17445af4175a69947891963c876f66cb20f1043d37af913e3f66de0d4ba219cb0f02b7dfed6a45c18337a58c0ce6142dc8d2ff7d5bb8e3aad1b4ef384c157c9ff42e5e7c1b1c5dec635817b025b09b5955ab18168e07f + +ModInv = 1c2747306ebb96f61ff64ea4e8b91a0925eee5235adfdf7e8d80a8aaff5f2447b34403137a6ef121f80521c8d38965bc3b13976ea1a716f24c97ada193565e575d41c7a879664d9058e0a36aa2ee409b0d58d54944ccdcdfe3282906fd87f9091fb235e9e5d6ea3265d08d2f02e9f2cbb20192a56813e3cae5573a7e4556c51133b6571fefeb0c77ab9180ea02df43def1ef343f9ece3ae2f39633ed1d626f7a29d811bc574761e237676f9c137c7d044e7b86076027aa946870456e10004a18321b7f2afd53bb9ea3dc1dceccaa7f584f8367d8ca9c3b42ad10c2154fb729c358b3 +A = -2522f750de7ce5f432e6ddf44d9dc6097ac32f0f045b429dcc9e88dd29c0f3 +M = 51afabb2d3de7f30e9e9110b37a505b4b0e94dbe24cecf7f783ada3a8afac2718ebdbf75cb82f84f967ed8fd62bf5bf62b931698f4259e893140ed7d6ddad9bee6d468624c979483c27ba1eaff8383840070da15623c660a5eb20047f555d6c1643cc83bab7cfb1fffa3ceeb85af8e872779f205dbac3f34a18d3ff5df34861183e2f32fa51029d015859dd945799f8a95c5dd6e8f2b8b307d9aa83964e7c9e7ef7f4cc1aab777e796f25fffb7f0c4422a55005f671e3fa897b01cc5e9665f4e4e1b0955457d5215b23accf4e8f3a4a2c59cf1ca162386ffed1fc2c437309e57ac3e + +ModInv = 5bacfc3b3654ffd0c75c95e5f3db56c308962b2221ff44b9904824594c4a20dc80f8d513d964f5c527d7cd9663f3c042fa0ac849c8574acbc8f354a126e13c735b2969834a579be2fc7248834bf7995f62c7020523e222b6bf2e3b37f7617255af1e435bee687fc7a136437e1b187ae491f06c1169bb691021ff5ef36b09499c407069a78a902ca98e2da6975600676a7ce575a229d1ba0aa639d8a66792a0ab6ed621184a96c64463a876852b375bef84a3de830508c3af333396f6322699c71e8e68248897e92e8d6b47edfedcdbf0239b0da99a1efbddb9406105255ecdb4861 +A = -d2de46b39b5d20ec7fac985aa652291a8d7c50c0d3cac588a43616b02b0cd7 +M = c7c0878ce719cf7fd2b3c9d1461578594f8a862062fafd1cdbae7a8391c2c9017445ae24980269eaaf022163015bf66c145271d6e62d4577b0b18f76716a7b3557299948cb7f6ca41c4f129a3010debbaf4ca0c9a3d294e76f25b47113d892d2fb139afe8d492a21aa7f6ebc8ec801cde02d90b5faf82d02e363bed7e1c9e19d261fd19ec2af49c1945b2b326382b3d8765039733acdd78a4fea41e14a9236e03f1b8bc2a4a5a239f14bd36b7194474d9b1d499ba62427f2ccda11fb46b2a23096ed95216e18ba2a2dddf3f82fca646f34b98abab293c71c8bc107bbbb7b5f9e524 + +ModInv = 4a39222219977e2e66f4a1239b0d4782fcd9038400c901d2029683087eff4bcfc7ac60a6a63aa42e2b928897f865f940ab5ace8b27cc4ed3cd8011a941a8d3f8f57fcacce495886e6e90760eec0397a921d4bd4496990d2a2c63ad6a21a4e5fa08fc42124097c6a5ef924b79eeab020137dc902f38da04556e08eb7bdb0c7a8ab54ff989d7d77d652c3704927188060be976d9fb0b595bcd87bf4bd2042b81f0b671e3204b9503eefeb3426b3f327f1e50ed059ce69e76edb67c1adb18a84172bad4889eef6e6941ccb9caf122dfed48df066af2711e1fb5a992107d1c428d3f25e0 +A = -7c52819fdbb743fb966422f641d45887bb47cb7f0092640706b39b55d9e4b8 +M = d78b54c5a79a3dff4ca8a57f6db896c51e3e9d7fe38789aba0345b9fa2fefd1bd5f5c746cc9bf62247cefe82943b2676e220ea32263121dd3539bcb2ff5c9d352accc3efce4315782982170d15d53a3c1a3f8a0694e525f42e9cc29b2b5a10869ebf5574cf9c558e8007c97ea9c979663afa76bada09645c55d88cabf9ad013f3e2d086420af389619c0556f13dd6e253a8ce64a6c1e52663fcc9d06c7b4d728b15b0a21ddc2d90801b7cbfbd788612d77bab95502819b221fae32f33f1535ba319d884ad0794171b98f33f8733200285fd72bfd6dfdc68c8f94b6cdf050837ae239 + +ModInv = 6a87459bcc85f7da29138a9fa45984fd267fe79a04259e007ac360c36fd0f24f9d4b001b21197c69c55a09e070dfd28d7914acc2c8154d3e4ae2cc26e264f23f5399b20b858c76289edd11624bc359119f6ebb61aef4402fca6c51500bdfdb01e014410f2515c85385a930ecf86882dac983e96d729de25992ba6cb5560c15ea467f8af31e77936e7ba7ea179733475e239be4ef87b8d67d4288e637baeede7f0e792c13d24d12890c342316e67003b035f5fe033571026f43b7aff1387f4a23676f8e8fb1069e3e96085323751febc3c42899263e2c4efbf8b01739f816064ed +A = 3377fb46b7a3b52d7a3fa1facc61535ced146fe6b96365116a7b4732d636b6cf +M = 8a60cd01aeb1a77e58ebf67dc0de38580301f947d7bb6fcb5206f92681d01bd5a031ea13f68db755a68958f15931a3068e5d0a49c756a851a313d89f675486658299fc8d89dd7a5a19f2919c48d37cd3f42688feeaa10f1313b4bc2c093e2297372e1dc534724018e4373807e3ec2401e2fcdf0fcadcf73067d22888ef986a3a79b1e4020934124327ff4735af248240bdf8b836ba6eabea046d45bbd1b7b74e6760203be9cbc860c6bd14c0616187a9a5ea5ce0e7e16886e70b0ee85b0ba399694ee1193d91cea7b42bf7292531b52d51a9c8b0daf23e78e76404defb303b79e + +ModInv = 31086fcc931bbfd10a802c14d98b17c69e0a377eb249e6f454f33bd1b38c60f1bdeb895002150ef6dede139a806da343156135c51dc32446ce3c141e0994f0d409d6ca23988d89a296ae682f57df4530df8b92e925ea6e38aa28de9c01d946e17650e257312b69a30f908a70f8a188f3ab93bc224e0b58680a63cd007efdfade5d0c3539a77504eabd42434a089905d66823e5a46e30a272419460333a5f30b0a513a9769745b925324e79eadd8fc50420d135b4bbaf4f6fa3491d35d9f8486e3c97f75ba64b042c56794a5222e603577c11c93d622bd602d114b76f1774b3e25f +A = -b404defc117b1538abe3b0ff8fe8d3bc2838f743eeda4f4466de04ac6336e3b1 +M = ebdb18227e7550226d52393c0eef57c68c31e94ecc372704af9d281d3556f866c379dc84d2942a8d4ca8a5f561629816033d9b5ce7abdb3481bdf5128474daff0df69a82b56c49c86abcdfef28d769a185d6f31d1993f2d213d0149b2036b3d64246bcb10078528344edb3867d3090dd3cad4082656cf083f42c947a58d18ebf03ad5b5bdf28ae0edbbf7f10bfcfa091d5938abedce49d060ea4525fa74f5c836992b6ea728beb6cbca494f9c2760b2c7a6c028066f2f9aa1e437fb86a68b20cafe90027be5fd051e6ed4366f42a8e66fdef1dd4213dacca3d8f2b23e60a045e58 + +ModInv = c43ef1f47b740978acb66eb0bc8f343afe57eb8ef047e5ac8af786cf8c37a5ec4e79ed1af1d6d63ba8fec25dcd2e08024a0bfbb9d0197551fe80107a07c24f06d193e1669a341806dd7bbe3ecd3aefcc6a140fb3d8065250dc22a985f04f42e848424dfce98530027b95db7229dff131bad78b4305f78c07829c1f63aa1d6213ae485e2812b41a4c1d518a70aa6e942fe824ac238db7253f65d3f0a3a208d2e662750285d18ddb1c60e435359a31049e6dfe5844c9b4d5fba2c61312151d7c45f0f55e575becea728abfaea8402ad5df98415c946f9402bbcf1fdd77bb50522d +A = -c5750b79840a35e888cea8684b60033cd65db233956ea88f4b4f72fd3f7d254db7 +M = c9cc3e8a7a0e0583f37151c4d7bea6cd4808ebb5723bdd10f425233bff64e5945d64f7d65e0466a76c3472ad2271615630ce9ba502f93eb042e9c091a7d0ba3f0605fca2d7a7836fcaf25f54c66f555c240a97759009eb69b50f9ca5376f3052c49915f5fde9c7e9675be2b6da6f2974beeb65d108c25300fecf0c9277eeb71d894a472bf09b30460cce5b3445fff12fb4d7a20d294b97d08e7981664997082c8b7e20bfd2aeeaf914c7d3fd9a1ac067541b8ee6f0969fe15284b2bf8e56916a518a4444aacdabbb49c9c6072c54a01283037cadfde8ec5e3e1544596ebbec4c + +ModInv = 14eb895990047532c0189ff2fd38eeb7441dc663e9965907ed253d6e3e41295b3928128cf04bc6f76340c3ca7ae80e5a5f53bb40134398738c58302840785fc91d691d27baaf862abb6f688f3484e680b6558ef3864ed7940accc1e697efbab79a19d7bca4946d36cadb603bb549d43db372b146d4f2b2911f66cb3752006fbbc8608eb2d2a18d469d6aee3652820e5c65f46bb57666f0a338c19aa122d020b58cfd46432180acac5edcb3f0c107b1cf3e3638c3ce65b72cb3e4ce0a2e68e12ccf303c69a34076382e81cf2ee4b444d9159f37694c81f78960828d17e7823a2f +A = -33610c0f1860bcf5788550b578804014944f27c7719ff747b694ab6e3512b1c51 +M = 18c59143ebbb150fad4cbad88281e3a7a3db14dcf723efb222d8f642103c86cd3d2f06e2afbfad51fe9c625ee2953df8d9cd4ec5eea97fe87d2345cabe9fda9ff4b550ec61d0d7ace993413d2a0ec38a62cac46313ce942d1cc031db146ad826b454d8fd7463ea93dea01c1e0da9ab162978eccbd6cabdacf9d804a38151abd506f842772e7c0fc9d0856c222d0adbf1c80fd2f2f94e2424d80e3de0e88a1c367a5296329f9955a2b7cb8af65fdb96293c210ba6db40de36dcc2f8d320afb7319ede5f8bc34a25ee763d2b00b9d8fb8fd417bf7c012fcdcad63bad439dae7f10 + +ModInv = a5c2e19d2ae5828d385280964af1ae11aa2f2182e4836f6373d004dff2ff8e2555d8ba39cfbaf4ce80fe2a8a620318bcc77cf8adc62505b9cb31c3c245474f516613c9f67d1dc30a8457c162ecf5faaf4ac09c4e24da1edacf82f186af3538f28951843746758d02e30551993692c134a69655ae0c382084d3b4bc13341a41cfcab6dd906542643c42c804963b9168ee169f8075e791ffaa0a05216deb2d0a99dfafef7a50b9fd5c60c794b591fdf490eeb960ee11d543365567e09e7004cbc535ac93367658a2490d5302b311d53bd3251b524e32a2c45e6101399ccb53949 +A = -2332b302d46e3b2539881cc51bee766d812792fd1112a8ea3fdc557607a756203f +M = 6c34f0055505ba32ad3c3c17986f62eea94fed4d709e766535c3223b4ed66259fdc532f1a074da7c8a33555149919e434864c02cc4898ce5d3218e9f8a3ffde7e4c4996519c09bd2d87d0a7bd8a50c059d82aee0c74dc254e0fc02953e05c3178cdd7068eb774eb9fa8071a96eccf5c0d3697118917c186e35d02e1129f0d5a3c2b133d51405fae41eaec077fd1e3aa6b8b2acef36352802ff8f2033302bdfc9f89874178a665be2fba36b442ede89f8319f4d03c3a57ecd49d9198095b7433136f462815aad0432618b786a00251ee9977efce2dfc37bc63a9f6d58ab504834 + +ModInv = 953b7017bf3512fe303b37ce978dec47db7a978fbd4ab3fcad399ebde676e63e9b9df67be33723cc8e156deb221de95f239f50cd99dc0496397fd9b265248a40363d681930b45b5c3efaaa188c1b91498fc7e90bbed0660c46b8ca711a528041d36841133090cbf47bf51e2ddd20834c02bca94c0efcf9a4881ca59b5b830e0d82a4ef972a015cbe5e366552915ceb7b5a5ac64efcfcf2f5461d196c8d2cc441927de3d126719c932fd490c18ecb7c7a79b5899467ab5424f1fddeaa6d90f909bffc45f7c3d1d079bd90d19ab31f4f6e66cf70adf558fdcb1bcfa89b70a3 +A = 52262aa6d40b849269c03170f5858bc976e44adc9ba6ac48eb86c610d98e9f34360b +M = 591d1e08aed141ef34f7e0e96133714377d8659a3914c35adc573a354c17f1ed64c7d0c86ea14243ec43a0f9b7fa02283da808681068939ae7ca605923c8928007297c335fd92f18158331d9539430114247f94691af83227ecb8d51dbfe5870396270023c4fdf6c23bf51e8e21181061e2c3125d465fd8dc3dc193629c958609c9a9ca0ea601df5d5a287c62c82fdea3aaf330246c898713db611d63b1e4699d655015de415c5ba2ca45d8b572d81176d51bcb2ea8f7b9ee45d8153e8c2d8dfd048abd1bd7ce5ebe9855c03712b4dc1d10de7b9668789e3ec3e3a38775d6e + +ModInv = 13a30d5789016459170251874ac31fc807ad4b44f9577a4792a9b07e69fdd36a574772810c47718f5defbc46e21131c6c2a8d3b620c7846d5242946063b81117c4d318094e5a1cd6f7ce604da4e452b9f488b7c8cfe937ec3a9b5e424d258709881d82f9186010d8dd19ede1d642bcdb9867a78137e361f88c9addb127ae51914499d3ca09fada931c5f52ced4d8ab8ed2f685996ca0e5af39fcbe7e7c3e64cabf7cd5b4b2cf70a2246063b2e04553634dbe7c7879a9cc6d7dc7460dd42d6c28b26a7bad3eba6034b74afbdbe8450845a67a1d31039299f7a98192ca30061 +A = 5045fc30131b85df97147bdc0aeb50691220d44a128b7a62704d6469a387cf2f4e88 +M = 1ae8e2258c4ca60d661cb9f888b3bed0091b1ffb59c13567b4bb7c44a136160149c5e89721e01aaffd8011dcfe8ba30cbcb7b6730712091f018743ea2685f0b5d9c3557e0e1ad130a6d40bf6055197076a46904b9e4839023e24f8674f2d56846135e377236d23812abc2344e235a8d1f5cf690bbeaef9c1372241551c11248099ed49e94ba7a8592c14c7aca9287d958e02d3802f8bd3afa08857173cf73685253442a15ad12ed3a4fbe54db14790b710198892f2378c54185323b0907c2a9cf4013e2a709b247c7e07831749ea1ff65aacb39b80cdeb4980c1d34b7407f + +ModInv = d197f0955619d79b8be6684eca3d130a226b70cd86ec8a502091902e5ab7dc8d1bd6480a2425ab8b858c9fad0bc03488a60a9b0ab78334b0eef0ba3f196ab626df657c83b0296f3d14642f18bba4d99a1a79a1d4c49161c51ced612d3b0035b384679ad39831b9316289f5f2e017df3eb7143e28c7b14e6759d0d83c83405a31ba8198e2e9e31b231527ab41121ce7b0774537dd6393359859a0a6e95f0f2508c8bc7c9ad6388db21f9a37087352478d1c42ede533384e2f111410c9b10930bf409ee1c33e3e6e718fd3fbf2fc56ca444ceda3968f96e4190a649e524e753 +A = -31e4bce325067219ee6e19b3c540acf1c2c9ae80ce918ab6064f11de567df74fb43d +M = 22be02e6ba63946bc80cf0609659419ff55f41ed916258ea13cfab0a3ab7f902baee80e621b7076ec0046289ac45b8b262b662647424754d1e0e884d35d47f89b69ec9ea9e80a4ae8c067b2454edd67c10d60dff55d813a5d13dd0fe530865987452d6463d169b2a9f5cd042fb95f1a584383209706e00ed88ca4bf91d446417da7dc723a30c6232d918dcffd6542053cf5d54f8bd143a917d7c68df44420a0757727cd3edd10d866de633f27a98e7cb7a15ed25ca73fd1662d65a1bbe955cf833393cf07e8fec0e2f4b7ce6b9356a97bf2cc16aebeecb61e8f7da8c8e78d8 + +ModInv = 15793ab805c468d3fb5f726008b999f67a0d957b85e3232075c3649c1c6988591303f6e7d3668ac6e22463a3c7b299b30683e80cda4bc51fccab779ce69586059952a30df32b6727779844cd8f8da0cf5ecf9613e6e45413f6992e0716dafea080b4824c0e8f3d5fc8400692de6ee761992181b865bd14dd3d8fde818862dad7e0a26725fe8f56349d3cf3755f69262232df72e06c22e3963ab17006be71d2b2331c5dcdbf3df79e9b518759f922341e4743fde4da4169c4aee335f9251f14ec9ad187e75b0b5b84cb32402b75cc488d2f05e86e8ad07eb10f4a27d66b65 +A = -5e36ba570ba8617f87032ee0aa3be7a6f95479100204cc5bdf8f407a128a26fa9627d7 +M = 2fa36283b519ae8b3f211790c182e30c8e9ccb2b0db2913d748e272584479a7b3158b270395c3388d6d569562cfdfa975e07ef14198472b103f177dd5af7106a555178eb5a6f23566478a4f92b6bc47cdd20a7113f39b9c826a2b11f898b8fdf76ce84bb415ea63e05ca3af8d758f8a38b2b9acb3b1f83fdaf343ed61ed5c96cf34ee1892a0e228919295b2e55a6322d4dd03cf511d9058b24abfc313f53c83a04d865958fc22b2368e4de493212d157adcc574b5127f662dc898255b94eefd12b932e05c8599c49ea4e88f29748461e4d4098f31c68b0a2af67fbdeac2c + +ModInv = 17349c3dc9152ad3dbeb9a3331094f2646ac39588b72b9449d3cf8c457c0069f1e73a6ec19485c64ae74e5cc27dd6af7fb5aebd763d3f74b3820ffe368194cfb8e82f298a259feebbe761ae2cfb1861e0f2db00a00b3fc2442869be24ff5b2e0910884b2ca5533a6553fdec9b1c56f29da56ed9b36651a18b070efa67f2c62ac61a7ebc24e182bda72089adb19fa0ef80cf45df53acf7121d7958bba33556863330abc2e905c335e3abc3987eac855a77183a1f50f2907fbb1e596342ef401d8f047bd7dd431471a05c1fe767fe1d1e7bd69048e39640975517cb593decb +A = -94d8589b31abb8bb31eee24e1f52243d457dfa97fcee98a2201d7eaa684ab4312ad555 +M = 789110099fb76b31bec9f2d09ad52fb0697225b30f5a49029cc0deb4ea9d04ed02d2b53985714a9605f2916d4c02978bb517ca76ea5b7bc4fb2b26f5abe65fdba5f7fae0f3c84a5598ee80327c1e8717721c9426875a2d020a4a28215d62af4062c0e69697629b3020d03c707cde5c5936edfebb51b56a4d1451ba08325a26a8723bef1b84924dd6ff7cfc8bc043eea505efe9cb868acc3e2714c2b0437dd9286440b1c31b84d40de63164e391eba7b8bab2efb8fd7b7aad0eb210d56d78847b187c30909b0483e7a65415636a7ed827d15d383bd3e8201fe0184a4e8108 + +ModInv = d32d37984b35edd5c0294a7f6e6b5c539eaa7ffc7b283ddf0538d28941d6cc5695025974e22a23f5509ccb2806124412c546fc1edb24e1dc7b5b541db6ad456ded715fde4b4280b68f41fd789e63e83a687b4bf072ab04fdc18423fcf2bc63fdc9fa9da6bafd2820dd86cdda22a32f850f9628e74a8121614300f22b42c3609f250f9098eb013025b0973caedefd5afb5be52e494fef88884f035aad388efa8cc7bba5780c5b8d0c413bf32a19257e2d56cd759b7371643bba24edca48d31f311b7a80e0f58b44fbc60ddbf077a6d49551162f0cf828563fd8975e89a815 +A = -a9041706a7418d35ba3584cb4aab9a0b59daf26b2f9a1a5e9773c57579cc8d24fcf17a +M = dfa8f92f3a2eafd63d0205c5f2d7e8a0bf0710fbae7b9da1d33d1785b2f1f837f22c6b40b86e663baeb98488c7f69c0561de8e189950f05f26a0cf43f5b493e7e34fdbcf310544f0091e6e1e007c71943488c2e5148a26b3223739cd27725bc4fd1cf0702250c3d67ce50da0341ab1e0e8c1963dca9cca8043004736e1a3e330193bfe0146e1951801abd740a0ec8f437d028e0fa1115ee88938eb51afff630cda9467d872cf05d4fefa575ddca1793aa09e662da240ddf8570355ba644403bc607637a7eba2bb60abcb9a204a2dc5d61d1699ffac70375598f84414f8ad + +ModInv = 55595a864259a12d764f54f220722ac3503b0a8e479a84f335cd99b8fbf34b68aa1300e3c20cc190f77f4ba9f2b4bf679030238fbe818d0b28ec4d28bdf4071bea7d1f78443ec965e62af368689eec8a18835256c58555e354eb068f8a8b45592caad22781d4545e7efb1a89f83b23ad3b04ab461d697c69c7c37d3ce410b0a7a50a75bf3331ecf5f9bb5be80786409fd47ab8d785edb2bd4c223b4dedbd48628953e29aa33228fd3c503fd25ddaec84ec3c87a76d3fe3e6f91bdda70e6d74a2ceb8fb2d9df9f8bb88d213928c978f15e815497a1c412d20b923ace88f +A = -42e16dfcea49c3bba01d7da3151df09be5bdfd5ebfac159ca7ecc8f1728c3e914f40fc11 +M = be7f5e9f70f4bf660ade3ea830d486b2c1694170626a39d507db8c23f72417eaaf5c991fc1b2ac5b6471837636e564ff8a63dae51e1883305b0f6f1058997fd1eebc47f6c10564a04c56dafb1b8a5f6587f7aeaeb64c3486c1b58b937c45e5ccc95fc0a7c65912ab7fb46364437a327896cc98be9ca653cb3c85188562deac7b1462a4405bdcb927ed9dcf4649a8e14d713973341d77ec43767b22e462c2e793873ef983aaa80404549b0a827cf01635410b95f8b0a71dfd45ac07a44e7da09e3904b77742c3bded8ac20eedbd8e07903b55e0cdbd8c7f8b7873b3d7aa + +ModInv = 66639f178da1638cc49bfb6c30b40c132d2a2d277cd266f4e176c8c6c482768277e1ff0e413351a509060cc69f32c0b2ab6c7c067bb9e8d1fb3ac54dd61a1dbbfc5e573d3522bc36a9488db7e9215b4bed63652bed5b0af907d121ef35a8e8f54dfee55883026c7d9b426bad0de26be12478a16535fcb57e0f55d9b5c91692b119a641952b142a58c6cc4f8ef11f09ca0785f311c0c37b887f4ebdd6d005b57814a4920770ff4baff0e77f6f6d2b0b4936d5c7d7a20663ff7346d6b887a8fc874d106ae39649499006a2a25d4e325dff5cbb74a40067e00eb0e7998453 +A = -ce4e0d1381cb5dbff3ab555071a21e8d7212a4471df88bd240a260c54e7623f20514ecdb +M = f06c6f1fb33f404c829e5af92d4c3adcdc8929cbb9b5a97261de8e7b38e0aa7b5f243c94737e3aa5fd59fa64330c2cb4d674ac898dcd2497249fece36f8502b4e9404c73a9af3eb9261f504fd63260816902b9b23ca463185422cf48dee3d8f15184547e1b8897aaf8dbc172746d6810aad79c51e877ca46bff1272c810e49d6ce43dcf7ca686a6e1e1899b2dbca772196f1ab2f5b2226d929241496a5bc07ba619f304626071751ff6b97fcc3130bb8befadaec5628c24a728729f4884785902cc1c0cf4a8f879faecb19e00b08e396cff49a88e6c29749063fae8e36 + +ModInv = 1d046b2ed325ab1c2be509432632757634a88387aad3bf460b6d943fbf253a338a8244d032e26c6d527bbc50d5771d34e5cbecadf7c379c27f352eed11c9473c99a4c83623a5f7f63d9829a114c7cee44f34ec18d0252c8a48700b1eae5c93f736048893c9445c61dcda6a5825958b032d87c32cbc961fa99f82f50f2fe84005a8c57508545f5a0571e81ba48e9c261900f8c17475126c9ab177e9612dc42f095604e553e6ce0c641eadc6f654528bc856c3ec22fa9072294a1676941d56b3c0e91e6bcd762959980c5e66a064ebcbd8e9f7ce08f0dc565dbf1e579d1 +A = -aecdd757dbb070dde542e49fb7fc262e7adfd26baa5fe310f09aed060a0b644dabf5a915 +M = 43835dc96cc2acaaad9eb4ac793a24440db4e114e44f58af5616c5587cd41906cb2889415375d4243938f4afd5d0d7d402493ac321d03010ad7b92b986f130fa33f8dcf0d16a43a03ab20237de44d0146d3fec7e8e63e6a62a603ef76557e502536282dfa9b9691b99557eea98cb655784aa196a762a653c4c4ae8ed7bc57a06df9297fa1523a102257ca7296798cd071dbab4a3669e8d28c8a8de6cd271b6822a92dbe38da7ff626478e598cbda007670515e137882496ff890986bae51fdfe31365269010da89aa41fdde71526c41890504a4f03f947d02d60878706 + +ModInv = 3745b5443ff39577b5cb893512555f2b454a110fa2ae33abc0f3a87a815c9a85fa107581a8d302ad58f22649ae04576cd9c4666c1c0331020769256e034c767d1c2e4e5c8eecd7564e259256dc4820645deb53ca4b3d7fb812e42a325581addb870b431777514bb32110ad35720defbf95ca11944abb9aa3317022c7a5063d12a2f81a39c34f3500a910d300a3d6ae6d38adc00c41d904fc27b57200f1acb57b725692ea1f0c9fb484e3bc745a01a662ab40472a5aa324e2ed8ce7c7c9f87da32a9f0ca0ceba62425fd840be6a7de6e5265a2071a0c19062371a76c3 +A = -c80152f2d171633b3b150d50472f9bb610afef33e4cf6d24e045b160d2c0380474d973eafd +M = 47560e486d0b00c56ba9563e2a4a7aedd936341891ec51c4d6a3fc9c8ae413c72aee9cbb63c7342b0ac99b2ee5ef55b09c5df3bb3e1f138c397d6122f9191517d977612c12c6b699712904af862623770260d462982790eb8a3f259821e68ad4eed83d8ce3f5ecb4b4a09a5305ef9462089e6b6ef473843d082dd58a29a433c2ff04f8e811586953a91febecba2bd39d29e89e60f3e4bfcc6af422e2cfbaf954b563a3d8cffc282e999fdaa509f608037da0dd3c1e94393dd7d8655379f7ef8a6ade5abf07428ec7e14fbc6e63f23885a6acd7a56046d4b40636c473 + +ModInv = 14ca6c3fa726256843bf33fbab12b2ebe67af20b0d4ac1d6ad05f8b7a2400a8269ef0ea9bc8c1c70fa2684b5aafb4ae18d6246ebfee74c15eeb99caa460c56281e36265dd13a3bb75fb971cf72cf3c4fdf950664f754437332f99cd1f9b7d248e966b84b097a6be72051db96808a69d4cad58d5764e40d5cd394bb376735d66fc29eee5200a2a91c2b2c67c801cc77679aad55932b7b6d543a280db05c48a8f82e0316490b42dc73ebd2a137801d13df8a38415aa36e9d6c802ccd43c40b6a5066aadee335fab2ec1d8ce470a3001f83e328dbafaa36d7f66e5c1b85 +A = -a3f38370821f29ba50184805597d600bf7da18bc6e15cc3d0569bef86f133030e8aee2619 +M = 421a6b4987c3cafcb8199bb6269068c16be860c48db0efb71266714f5fa6505a2e3def19ed271798cae2fd85542702fd9b363efeb61120c5c29f37d084b49b00e3e59a884cb238d946abba56a4f015ce4520d00f87d08cf23bfc9e5f6843114bdcec2a50bead199f90d35b56c7f090ff91d678e782ab5d3ad14b874a23a1103d4ca16da0ee5c96d67f49c722f74c8844212d530f4fb3bc3e07db59c8fb28e0127839a03558f6e59e6964f336c5e5f10a8bceb3ccf713653ba478516fdc3e3531b2bfbed5d463408a1f14cc090cc081001d6019837dc4b80c9363cac9 + +ModInv = b85c1c4c83b8122cdac2224073d301d5a8f679007f721f97d7e701f49cc5e59014bc271d2a9303049c6c4bdd545b7c37fb39b3d82b3377b0819439feecd767ccb9ee195bcf699f4c14a364eb757768589216ccd85a095d30f2344f7b87a3ff579e2d2ee0bc077adcde1d71dafaa1719d4407d25b4dfe94a9ee3e2df57d2b1512a0287b7059d93269302573858aa424b6ea21ad34b8107b54e5a3bdacbe104adae910eb2571240ae1a514e33d92743e8c28ae8e8aebaa2c2e24a71dbc3f963234d7ee407dba5f264ac35642cfb5e261754f145d1c6a4c068d19441f +A = -da91a1cbe0250bd0526aadc63b09806757ad5f05e1a240e88b44ed998b59f1ce6cd712b4547c +M = d80b857372f02090136c96117808ce48d915468863082e458015f98413f32231019c96cb778323d4805dfbc11ac9cc884e113ca274ca8dc4e46fe8579eb8166b16e9f9e64ea7d2700018349dc321f5f8d7d0853824ee142ebabb961ef826b5ac987a233e90067c9f3c6e3ce4f2eb93c43b091c25c4106d5f1061f98fd7b801f7d3e635cb89b354b546a8ae6942491f01187ccaedd42b7cf77f4b453b8facf3d34a740dbd79deae2b5e688bd2a9c1b8bd5ed0f44a5015ef0aefc173cf80e9ee1eafef82dc2010af2a2423a2e28f73f16d61342292357674f86cf5f3 + +ModInv = 600303f5653af078b169bdd7eb6c04c26de77d741fc20d16f7996f51f3d54afd31741a302f710e3abbf221eff2f025cc3f13c971caee5c7896f024cdfb9d55616a82ac204b445896243e7fadd618a7eb7d191811178181ebeee4717e8e62c4afa223c9312f69186c7cdcd62c0163dbffab20293f177643619b9c24d47e4a5c9944ce9eb999af9fe65905c4b88ed9c089798130545514cf2bec8129a34edb1bb22d8d04adcc3c35cc177f4179ebb5a3615b61fd60f51c20ba82be1cb399c3028774f029db1f7127ce45e1ce2f9155d271a85f776c3a9946064e6418 +A = d7f8525731b0b8b032080a595df867199488fbab0c0bff1bfb09bf8b6f8a5e2a1b13868301c0 +M = f996834086379b761c68a93c2452efccca8f7a417f3e002d50bd268cbbffe86c74d252f265cb28050e9e216a562f9250eaa71b7e5ca416bd6749ff9c8d821af9fafd2bdbbe8e94a3c46920eee48cc78b85e7a939124ccda96ea2ed89d799b26d4764b8356fc21c4540bfb930fe0b88e3da65eb0d57db045ddfa1ecb51ebf80fcb04d48f16d1bbec081cb56977483cf8bd8897f64f8fe508d9099454ac994bd54cd7d207e9808716516db2df38aa7b4b5cbac4bc61beb19742da98d4ac41c2464b2065573611d232b8d4e5905d2da962a9dd9b1188e640f1c5ebe21 + +ModInv = 285b6173076b22cfb1959c014b431cae700aa0ebde25973ffc07cc117ae790cbe41f820cda16a197700f7b1fab150b3b29dc881b1c445a641bd93a9354e6fb7f1c3889e0f7fbae265dfada79a8b585723f63aa0e320e5e640211a5c48309adeacb9813e83dca4146d20b04b396fc5f43554358a26644deb1019ce2cdf92b10a5fc64c6fa576f77f4b44afdec1f652f3dc24d80dec05f1312e9c7d2e48e0b5cd31dc63ce1c646ec2fd8294dd92a187e8a97280491fb2f7c5449af171a1cafecde449257de22f016646b67026b3b2a4fd3dbeadf621fb002b42101 +A = -cb26d63b96894c0e381da6738fbbfff10559d6da23cf4280abdcc16d498f3d350daad92245d358 +M = 42942d27583c4ab5b730355c8481947255dd5a692b9318764816ae0d5620ccfecf1b7135e064ff6559c6af41961065ac765584f18df95148f05a9a1a83ad44af622b2a284d9919f059005244279b757e0c3299413b9bc3c2fb7992160cd64f28b7253564d80af29fb3249a40304df4533acd5ff381c190ae39b17520c61c61a0dc52f402d67b2fb6162c23d627a063ec47424cc73b531631e2a3ad31436eedf7ce63439285eb4a0c01320d6658ff0cf9efade0fdf60fc1820671fc7529673ae92feabd38084895869a6d3ea834494e548ea2b862306dab266b89 + +ModInv = a1b22e483ad2f7bb83dd006108855710615f9e8467846a29ed8e810883b1d5e47cb62bcf37a23b8c39c6ad1464b632434148979761a51805c3c1ee0f292e744af7525328fab7cd258b5e4f17e16a941a61c67b828927a26b5714cf2696aceaaec73d070795d4c9bd56359c56a58d122bdbadffaf4fc5d1fb5521a8b69225596e3b37d6645d9c81a1a3613f545847be07273a6824bd994228e7be050e6580c4a6a0bcad6b02a71c2781dfd2ae15ffe0ce22a369979b4d46855ab44c502dc2ee73ccaa090d6d9dc091e3a15e6d4085263ff3132e418a201e6e817 +A = -b7539f2c581fc88503af6b488432dba9d9f694a1983ddd640c93b5910ad4529323f6a62ebe4831 +M = b284a00859b210c2a0d5fab73df5af67d1578f10eac4a76fe016a58779109771759827e63f317f2a43dc757b916f3fe1bae1feaeebeee20bc31447d2fe8bf45321d27d99fc3b5a71849608c30b19e8bffca6dce3332489ec687e907a8ebc217f8067f741590025ccbdc603bae4bb446319fe3cdbafc5ec8ef41bbb043241429bbd9238028c2a7e4f55ed9c1246c7f967703b754b1691aecaa6bfb093ded3f3bfc1150f399e2bd2d1ff952f1ab86fb376931e311df36bb15e0d084df5c5a691201d81786afe552f4a75ce2b197edf9ddef937be7f1e12c6a2c89a + +ModInv = 7df588758ed4d274828901e316dcd0c4a40b8ddf28bb57c5efb8a6c2e33052e3905555a1b5f6423c28b85faa026b73120ee3c99c0d952167ef5bf1877c9e6500f1ac06c00bbf856eaf05d21cf71d13a999e3dcc6d846bfdc4c0c00c29660bd1120e20f86d435a4cf0f3045d52cc0f6b862e1bb6dabaff9b81bdb1601e6744056d1e38d209bf932baf782f5af8f130ffda28ba0e9cb9b4bac0c467a2ba8227997992eeb2d75dd9ba585f65c9381167f5311aeccbfbd18461ccab5cde72a47d627b2fb5fe915525d7eca8dc13d88d179e7e30955cfc1ac944b0374 +A = 695392356e33fc9fbf6b0fc3779b0a47306d0f30947856c9b5dfe5865a86bbeaabef5c6e09ff05 +M = e14e9572a5b9e1a69a1171bed8fb394b19fc47409987667e454447174f305483b442dea1a31c484f05718fbd993ac1599539d6bd3618d2d84ed9ea6dd9e89c7b3a790cfbf2129a000c8deed126f243deff8b89f304a60fe38d986a280994ec7955453256140d6a2cd8cd483cd8a2f97e26e640f19fa7a8337aa486d361bf994448aaa7d1b2ec93ad221faf182cdfdd9523dcd79be06812ee61915b865473e6957b7bddc649a00e82d2fd9a353adbf17b820d98b2fadf0937ed168e81af75c7cabf6cd46a103cac897b4eac24123261025953cda34de9b94a1345 + +ModInv = 78622e99c1e2e8588979baaf81c574447f4868bd858615182563be632fadcfd19d9bcf1780963c285cc8670dcfaa9723334bf8d23bbed3cdfc509e11dd35ee9436e166f437b868a00bd84923bb33fac7e81b9d27f65c97310dada0e6c00e45ca7c6031c5f8d2ee6bd3db0a403c6aae838332b0ade476667c5cf2e406640bf7c05c97e64250fdc33afd5e374234ed71266777f6ae0b907c336669d6751d02348ceae0f486b3630c11ffc96aec82e081e3b4fcf336a156aa7ed93f9b46776ae87bc78f16afeb17853db03d09173cd54bc7d9b93d5d96c593321 +A = -d6803d21315cf261047c47a6df4d55df7a38bdf46d3f03d2aac4971ef826399a29ccd1439089d67b +M = f23adcbb1683a4d827e159a8f2fed246802c342f193a9aa5d1e8707ec87dc2dd2449cf93c81437271f9e769f7500b6984d6185dcd1e4b89e3ec7e6c72cbf4bffeeffd98058c10e5da9d7b39aa57e6b804bdec8e251496e59640ac514f53048dc59e2f4f0535651cfdcb6169be53816d5c36b7fe3bb85a4ca4ccef0220d3290ace680814a5ca0baa5210098e5818079faa615a7e10238fd19f758b50aa920f03042bd314bcbe602f93565eb95379437261f78a51fd9671b63c6f86db43172861eae2534929c0507a9de5409b2a8592f4f8b0d9b2aed23e5841a + +ModInv = 91f657cef68126c87e5f8e874dac6e80d40c8c62a6d270a25f9a84ca6a87356b8fdc866080658ca462efc4de8fa9d9590a0a1a9fe7d15c23b38c1d2a081a355d12fa8671b500ac5af4f56e19a13abaf5099e9d1c5a0c3c75e5a8a60c81bef91cffc8eff580081b4250af25719765feeccc8aa986aea33da396c73e0c6b9fc250bcccedee9f9dd30c70be0b840f07401b2a1475587b1adf6f57fe9c44ebb01dc4f8d5deca0d2afaefc7a9b6d64c209d120364406eac9f4d20e291c1472ad459acbd2741429eb648d54c4fa142bb76b3199f63a4984d571bf33 +A = 66bb64863bf69a614ac8724ea0cd86afa165f1e800acef182cfd77c61c89052774cfe1f6324951e5 +M = bb3c3166a8a9a8bd7517bae89f6f1f6f1313d57ea88248c2d550e636b9df44dc5f63085ea70e273c6bced3f710d6b6ff27991339925fd56af708fe155a17ff52af355b1f5f44c8d418ac5ed7f64ef026da79cdb885697bda89d452a21372c9799bf206b2e910e6329e27a3480845186475036c1e0d13076455224e48e595a81252526b3bc358a831d0d4e6d644142da839294f3f83cec3761f21df5dc072a58e1e59869793e649b12d051d8db1b99dc38217f792d2dde2956a0c233aea243aa640efe8a3373265e45e3663ca88bf97f2167f7af89352bcdae + +ModInv = 8553aef4847ee073fef62ed7c8e9d46fa5ebb9e913b170d0972545277e0c8e9f7055c57f5652a660efbfb6b92f34337cd2358e1b934a7c2eba3368a9eb90d0a1c2bec8e50aa785f9123464d054197af9505789e8f3c6522d63d13e0d87ba93922721569732a0304c4f8a2ac884bd3f3b223a41f4c7371f323a0f09bc96e673e8380d8f057c74b8e91f2df5a8e7bd4996ddf62b33660a430dbebe30f553be9564513173cb62a852b57b3ef5c7c2f37be0c969c053b369c32562fb100b5c60e172e7763a6ae9759a2a8eca3b0df7f68c235afa587665bb3 +A = 1745913bff6b3174ff1a248b30527c5dcf8bfa31bb702aa65916c8dbd8a11e67e782b332fd720e3f2d +M = 7444cfb785d44ff16153c782eeff2dff7adc2ca0a17d3169a005d1a771159d9690100fb6fe1b9b2015aca4c2f8ddd5f96902d577201999712b1630730ac1a8d6d537e5e8dc62a7dfe4f86d85f08545ff73c3438d5d6f4d15db250508d35e9626a1c5c69f8d540ae6410dcfa733e00d33a0b3e0c32f259539bcbd7a73be3cb2b6db83385b7951a2b3060dd0d836d313c07f4d2aff3d3021e27b06d1bf7f20b82d2bf0d2ede79c0b9d7ad227f0c18ba39a8efdafc13c6a8b5e9faa1ba69f1ee3cf5b48b237c2cdf97ec96ca359b548aa6783238cc6be33585a + +ModInv = 13946ac7c31e52d59ec74fe2efceaf2c066fe858e1f14752ec42ff10007494f2ea68f4a15f533d2bb96d788e80fd6d8b7f9b8bbc994a4c28d78bba218e4e67d14778681c05570930aea736587f40885e55f2a6b4a44c3479de694608e1a282351f902a46532e3460c7957f8ad245a15788722babd7b14d266102fde8e54e6f3d6d63ecb851fdbea0b2ac73d204cb8f712a62301cbfac8227c7a325745ff37b5ff6a2f8ccdbd7f99b5fd939ae8ebe943abf61d17b299631ff96cf96a0a1a3f67bb5b0ac1c6026874f3f32bb045d85086c540fd7ee9601e6a1 +A = -fab8cba86ef6b17ca857539e047128b841f4aea53d8fca83e75fdc6e4920243fa16414da4f468482ff +M = 300e2739cabf9adcd6f7bf8ead226810ee47ad955cabdf2fbaa582f67125c7db407239bb142d7a4057e3b51e839b5e01ce3297e4a7c5d0a6fe4dc0fa6ef30bc4b7bb13225eddf6a3f4c0954e35ea012c389c5b6016327277f7e6148031ec59ec7d568c4cf7a7571cf7957caddf04d0a794f0c7c1635f03c308421a8bf6654190eb239542e072407bebccf68e6ee78f7df79147d4405ed4e4e7ab147382ffcecbc374b2f903de4c47397d4131743b10a66c289e56fcd7cd11aa3a39fadee3d8bbc51782cc6ca92fbf7476e7969a454b27ef33c3343ef905e6 + +ModInv = 1a512626e7a706368f8f73a6cfd98fc620e2b46709a9788450ada7eb7614f5a84074faea943af9b26a1426c1f400608ed53aed956a3465dae59f9e18842c6df6cf679c385d8502b62b23be61303f08d598e628e6e4198b37b54141e405d58bd9a6ca9e1cfea7329c32ec12ee92275ecce13092dbe6b4ba05ff44275969066825481222fee2b693fb3ebfc62eeb13c3c039469ae3cf6f89193126456af6fc29f946fe6b049dd0671dff62032a7fe966f07bac136a0e7dab0b2e9818fcc974fbc71555e2943e7a73bac2ee4f7dfea454118f2b0b96b8f094b1 +A = -fd51b4013b486511643c91d7e01074234627f205796b7d56ebc6c0b32dd0611695b5bb172bdf9ff433 +M = 3a4de2cad85a4c742123ea960a14b48998e6fdceac6ac536cc820221a3c91978f4f782cc1c947afcc6dcfcfaeebd6540cc3cb8f4b1da78fbcbe818ec95bd43e4cd5d843995b21dbbc153e80bad5e2e074b0a1b0763154d4bce83e3c81d0b36c973f7018b185f888ae4cc98f153d2ed49e13183a65b9d27eda275d1c6d616e2eb78df321cb900e992d933fb443952e0a35b9ac31d8c5028e0d58101f3ea27de82346d84eca299c2823b7c0bd0d7c9b29939a1bdf78ab690c6cebbae8db97e755d8bb8737ea3e4fd802fc73c514f4c52c827c5a37f91cd2447 + +ModInv = 8bee6d17807074730c54145196f2cfd5ddd5375baa62becc0b95d520d74270f9f251f4dd161f6737fecc653d2cfdaefc6e3b5804d863a730e87f8beb179c2efa7e29685a67bfa4444d707b74de711f10a18688ff95389dc235f0b03f6d7891569d05cceb4c0c7fe1f39b82afd3e4bd139b04cce23a7812fbf69b261ce9b2314247f8c1e63932f128bcee21e3e67b11b5dc0f50df9d66d42f5fd16ef2fed2e8f783f263918a0e7ca0159a57e4c27419bde737b9f6388e4dcbe771fb69b3ddeaeb15dc7afe3272851919a03ce9f62057fd923ab6ffd65441 +A = a0b57c972b7dbf91189c145d78ddc104c5da7b522eb5773bd4e553f145d0c0d5e91780a35730a45e9501 +M = b24efeed0f06b6563799ce634090cead5b70c71c2c6ad3dfe88c8689307a46594e3ae2906ea9eafb540edf063f0afc04a0ac250ce02e19a679a2ff0b3807e118de3ca55edaf3dd1cbcc51bb73865aac87f8e63326c1a1b2f1d97672eeb4100ae5af5d69bf77a2f803ef96b55bc78951fb02ed4ffa6bb7d307d522a6a50c349dbdbf69082391e093532bf06ae0b79b645c4f6ef517c90f4b5faef56417c45a4d660b37751300c00ebf3276f89970e63f8efc84ec5da59f4586945d58fbda14a307bef6965819671cf7938fab8480fecd112e2f370a10ec0 + +ModInv = a3467182ad1b291dbcceb9f1ebc3a10826b2dfc223651bb1cfa75573d9072450d513d9092592d5d79d985deedd0d61735af02b83fcddbf57af41abd650638a692b7dc86cb4977349560183963a65170c560e658cf87739b40215391d554e8770e2428ab2616f935b7afc7d28bb59074a9815e3a14426af67fa224cbaccd8a96a32c1e5ef09bcc3396b64795b2fb6e8b5a3e23c80933fd43479a6cf515a04a1b0d2fad5306ca28dafdd21ed08810f1a6276b763c14f0e0a65bf3c1181a66d02c4d5df7dd8566fd1a3e8571abb8ddbfcd3aaa4aa0adf2b7 +A = -c9e3e4ef0a74341d279b463d553b6413157438d24dd455edcd2882f4c8914f0e7f5b79cd4cedd476d2db +M = b3736bb7641272eb00105443d57f3800013564a973cd447d6a1de871cbe88def649e16730572c7c360476d02710f3dcebe3cb893d8d8b2ad81538760b1d785970e64721cdbffb1a68ffcf5a7812d2796be05b1c30a09c3f70f019ea390655cf420af29e1ce4a32160db55358a5ddc3851acb333b04b9e1f41085c77b3ceca18231b49ed9d144bc86af5e043e0124233c298fc7204a3e0f778f10ff24f48ea80ac2dae3097a8a4e1e9b09467f37ca118743e779d7c47e10e0bdd7d798fddc78624d46bf0e8732bcebc25c90419443b7b46addf11e040ea + +ModInv = 34ec0f4554be259880d4fea60a552fac74a77ab02e6360b30b17dde5f7fcf73336c5ae880a4f8669eeaecca30ffff332ba47889232e7c54294193cb6e6065c0006c26797d63bd29494c330d79e8e7585561ec486340bf35440842ef4300016cc752191899a8dffcf3796fcc62e39c665e73adec32f8d32444b70a5ac7db69cb84dcff8cc4a308e6350a91c4f34b250a5e4993414848bb535bbb316ac3af125855056adf95e3c33ced3deb7646241d106fa91e9a7856a1bc738470d0a9a62e1a2576adb69ad3e55ec43f7369b69b68860097abd262e1e21 +A = -9df3554257bc04285e338f8789b166e7eea50c8cb8bdef458b0b124287c49e0380caeedbcc41f378533b +M = 573275414e24f9e68e200c740fd07299dc1a2d764466962c18d0dda0777b988e4e341667031da7ef0c249b8236e976e6aefd5295c3fdd185196f0aa8106900dc2e16ff79ad8209929607182876ba8d3a1e01cfdc0096bdbdf85a35b27c9fdbbf78137165f84af2e9eb443a71291f2c0ed4bd198dbf49390de2914c1238fb9492c5f6f684d2f01706d9d1598094b32fda83d7fd8bb0fd983eb897886ca4dc24ced6f67af1df27b315e7b50820e1f2811eeda4923dd8ffd3d2fbe75c97e61c5fa24ada21bd9256e2e2659107cf84ee1956412f4e83534cfe + +ModInv = 3b25934f80737b6d6ec64c12ce3a832459426ef81d6e8435933c326c7732dd466b1d33d42770bb42b95bf7fc4c12a0424933e26431c184c62d055d8540cc370e16d4aa4c4716c19d21ac534e6e8508c97b6418cefbc8d24128cffbc04c94475ec1630b6a75771b51adbd680b0b1882fd8df1ebd7fa21251ec33f01cef36f7ec8907e95b7e73c7f5e05e2d82f0aa0c8eeb085330868328e0274038200b626a77174a25c2e573029d4a50ac26aaefa583cf9ae1a2dbfc819d0c3b0f9a9521f8faeeb0e57a78cdc5a3227aab530ec58aaee62fda1762565 +A = fb3d6cd3f7dc625db51fff8a89584024cf1c6c31e091fcea37dadc888d8064bfff52bbc65ad6e5019e9965 +M = cb727298c50a12b4143c9227dd24b936930beb7203cfc68542dc6e72914064b12b9b037e699a5d8af46037b901ec7eee96347ed5d32772ab77120f19bf34641b87c137b3388cfbc2f56deb10c2953da31e45120378e6a04b29ed98baafbc867d56b345c4cd6b325c67d3dd147e42578bf9655bcb163ffcf3a592a1cb8c14e07350afe6d6f70c2dcd63f04dfd7a50cb9e9a53920bcb9d6e9cd6297f6ea88b16090ed96d89ab0bc2a8f3b81064435857b39e06890577fa7e6c7e0406a58f3fb8624026744e6807dee734432ecc7b93ddbe846fbd93039a + +ModInv = 36a09a9f8b02243142a6c9cf31442adad8c104e7bd9625add593fbc205370286b5445beef6ee683c4a9331d558941f9d0464bad9a1691efb123181098b67539358d6d3d54c72b979c416dbb8ea097c201b83da5dfbe963fdb51079c145feaa60b6828600faa831f9ed66e54fc4776a621a3de7c9b373a8d801cb04c9074b3a439a0d49717dc9972a2701af504e804fdb38b2db412dd242ee1a3829dba1aee27b4a6714fa53cf1e453118e8a4b9afb941051d61cbdb5ce421f660e5d5d13f295626f2153bcdfca2f81f94a020c1d8f12336c4f5e9e25 +A = 4094f75c4aa7f5877878f48366e235031f6a35bd6d369a5c39cbf3850d4aebd6cf2a277ff7bc0233ad09ad +M = 5a8b76cbed2a9930d2e9ff78a2b2d65e4e451e053c20f9bd9a579c7231283d39ca817ee5aac24b8c25173915c0d98dd358a2804ec0f8775dffc87d863108e4dc3fe19289b9798de550f8da6ac3468522b7722e28f2b8775483633171a26e72f446565b7e295333856ae97ef5021f9c98257a892eaa63aa78bd405baf4cfe97c39dc12c905c04be86f6ac22cb3f929500c40c251c3abc27d2e91707c94b2fe774f581ce92fbfb1832c0ba487ea61d3d125632061a1d9ab47bf5da7cd25cecdb7ad442a24a9c845f55833a0743dd9a703ab3d3d3ebab50 + +ModInv = 991c74dc78f71ec01169caad344dc97d7b97bab5dcc781c2b12818ad689d8cfa817f2b6b9ad0aed8096b9c901da6c3b108a124ea25fc075f4bf182f974fa3aeb636bc1c823788a39e378c7a5fda55cfd0e71417d3520423f3bea204f7766beea81babc4f5ff405267f2ca1fdf1c6443a6105c212d8ea96bb314d2963840de47b65c334295a326911e8cb545886c325c3771712c371135866e9725bea9392027b40f35688ca3804ab871c4b196736471843260f162f9fb616081ce70a4b036d988375a74e9e8319eabd14c17bc57147fbe6c001f1bc9 +A = bd33aa0f3d01469a94ce83b3e109dbd4b173e0332345a07effe09b778c5acc47cfe95f6986e2f21c0a73e9 +M = 573ec83542447813ede5a20477f294aa3f305dc74b9866e0fb1b6aefba9c786f6e74512586a92d3ac80a93c2eeb634c548b132881b2667118b4cd2be4ad57a186362d8f44e4d4ec1bc28e45448af008a89fdf160cfb29c1d65dbd4e0da363b10181df3d12c4d53bf90d07359fe24fefa636d29f1e733c5477090987f6cb02ee921d921955adc492e51df11d24067ad7981ae6914cbc98c97b0d533e204280b1866871a9a84ba9f3b2b3b1d6658e9316406a4c74485cfba68c900529bfed36432d560a2047652f4bcdc1077bbcfadb4f1b23f4a9ef95a + +ModInv = 332fe4921db02d149a15843047702ebad68f6763413cfb8cdc988e4f04ab21bfaf4969dac3cb421f45017b289100053dec2f9bd869ea90f97ff5ed72ce54940cd34b620cebffe0c7fa9e45ab18872273dda104a29afcadeb840121636d2b990934f1d28804487f7e8d8087acd715fb2580385a80b560883c29bdf518cb9b570de1aaf8194d7ce1a77156d9ff58323808e939f5c987bb4f032969540dded3720adcf4712efdd776d52a1e4429c559929c6221567de532313c59ab4602ad4f80c995ca6a39c07cc56f95bdea739b511221aac4e870a3 +A = -f4bd2eeab0c923775e24d383304415eb1a10d3d568f9cffbffe27f902a22350f017a60b948ffcebfc549ec39 +M = 810c5e155c8103665da720e587a0394d9013732eebbca12320176d42315c6cee8dae6fd781b785b752cdb1bf3cebb0352c0eaa44d1d783e2162610c5b1b79b9b9874d08e490b39c9b73d9dd874736d912645eb2c54a18ed0db43846deb9614e43f2c87d023a3430acb201de955a5f491e0712b4c67dcfd19d3d299a8627debab934da6108bc7e2101524fbf7e4571e177300679ae557e883989dc1fd10c91862d7174b8f2224d5c1c7578f53a6abebbe480c77f93f4b44aba7e1197da7abefc40c64e075f44806aa98fba4cd3b264774e1a636beb2 + +ModInv = 48df2238b0355862ee93a1668ac5fe32b2e78f23ad6c012c57060bae90d61f34728427592b58d52f98412c8f44a853985a26239403114a5559de5703d5a93f91aa4c0d963f32ba4400c446f9b51cdd9942fbb9c94ba4020cac6e30556fd470fe5408660f327e15cef2baf2698060c67a2ba74f444e6466123a28efb0aed73025880543aa49bb2dd068e70bdff8dacd5604c74bbbadd4e60004009c02afa6589d7f4b9772d98d7606fbbaf6f7019a33a8c6112b42126ffb578a0fcd96e55d0b556425bcc118bf7f90d5d743e76b96b793b4f3c024e7 +A = 87c1aa3050247fbdd2aef75a8edf675e1dfed26684cfe8acf0c63021f1031d949b9ef64931136e078f5c8e07 +M = 6083e281de52acf942d417dfead9dc98918dad03ad77de28a60c1ca165d3036464ce1ffc04ba388f2a5d48220b19a49b70d389b54074db050720fa5993aeac18f1ec609ddb8260cfd58c7997074d8a0dd6c4f497b870b334daf0deabc647c701eef8b676cb8159eb39eb2cd32597c572ec63cb4891d0e8e660ab97984065058dafdda7b5b45b4c8c5e25db3edc0bc7214e4733e80e55e91846f745636018b9e42585b4411c6cda931c242cc3e7f07db957175ca98f1b1fadaa93f403432759e5bc781657f673121bf28e7f4f3ef394fa4c898e5698 + +ModInv = 1290703f96f67606ac47990a9e49fb14e9df567f82001043361688abdf1939cef10d25973a2307590930503f471ad34b938d0729cf6e784c1d1676225db9e6d122260e520e931793e85f7bb4ab7ee45637f3295cb6591c1a88df6f7c2dbcb716ab39dc82449f98d7eace0791e04a63f94feb9996c1e3aef7849a6e16ec400f67b4e2e1bcc61cb6ec55313d2d8132dce1b937c2617635dca5d0777e4e49c338dc144cd36960a51c9fcfbed1042556ac7ac801027d83612ca27d65bbfff5f268aeaa1554ec57f8c0e01de968a1cd13b12c521e539f +A = 32fee2b98f97101238239644b3456a6f20f949a73aa9add2d3103b6ecbbdf6267024b0b59248cb0e31e36e2e4f +M = 5857ca75db4bf7ce4a6557e711c4b5b049d3a760b8c78394e06f3dcbd2e4b34da618a977e9bb1d4bd8611395f5fde5756d9f2b720f2d7dc598741fb9f024886ff9d1af0144c8c038b157d34c94f8d52529434dfa6f8beb0a7038c95d0e531f06e560bd98a4e062f88495197ba95bb9222277d611f6fe7ea54f5334f1ab5e33371a7e1c7d0ef037818bce35a8e040cde76a80a434d2427b144bddf26add58d9fa2e9a8d7ef474f9342a8e6ad41d6fed291178958c1d05f0a6bce9bd44b773407f4aca22c8886bfcd4364960d1121309837825a41e + +ModInv = 4ed2f3dbec471a5c5cae56cc0cdabcc39f3df26d2a0a6629d673dec0eaac2f79d7c2848d3d637d3081e01b151a6ab76c9e77cf66034e812085ca85bb71c0e9cd2d65de1db4afe354d8744d4d38f87e843e333bf436306033d66bb11890d280b9593ff943f6e7f512a787476bf93ea330ede03a5cc9009fe544e33eb24b2e0de387452179529dd6f6fd6fd1f35935356c7f698128e27b02fbe477da9da4232e8f8ff36656f9818b488a1a2dcd388abb0ab2de209379e97d2830d121e6b4b099c49ac13c1b3b7b6f9aab7abc223d4f52a8000c28e0 +A = bf1ac0c6d38cb47d246711406c7f69f538981161df16b86584b9be7d94cccefd1060924c9316bbb4cf18f924ea +M = c3984a95c6927fd8067488e2c3938690799faab6777339e98e4f355dea280d668c7250df230a188ee79f9ad05c9f3609ab42d6044be27f73449e7ef386b43160d76ec6b8a73734677cf8aa7e6c36143ea81f052740a411dd45ab44b96cdeadfd709a8136249eac46ffadda32f58d4473dc23a090dc17c280c32ee1042bfeb34361d36612e7c18f0fc1e6d1b49fdb67b85834adc4062264194c10d4e0158eb65450dceb257e2d9da2354c3387fe1245a1f6be3a3e95ec9684c399f48f5b5d61ebace830b388bff408622cd9587a39111f93734323 + +ModInv = 64da1665ef1e366bd39937260943e5d5c0964becc27948f8d36e13f1af270a307579665def3c7017ef26cf6624eca7bc6f9181d04a4b9f55ce3fbbe8892fa5b79033ebbe5c08c3f25cdcd4fe82d18b62165ed6e795790d34b96671a91bca0c95029962b9549e3aca47c5d98d19d1e89434db34b2e156d769932485321d32df0fa414af80c2c64388ae4d908c92131e96318557ef81be65a52b66a3434243317ba1025e51bbcd09fb2cff5181586fca7eb8f25c45c408d501e39ec210a8d152ed3c358ada94d622a67fdd336c696242cd687eadc3 +A = -1b0078a6ed26a6c89ea2ee3ef8caa18360c3d00085c6d51f7a18acf261ab784e83162f51cd32a4c95a36c0e6d5 +M = 88a2ffaf9b1915071af16001c4b1812b3b00c9b5fd9ef44e030133e102ce83609cfecb9ad4e389039741358ed3eab98a2b24339780f7b758d96f9cbe88510871b5fce40447d0c1cc7a4b2a60ce65d9c99846d25cd19dc2f23db7a5476bbfb1b6b9b32df17e7d09e59dd5fb9c5c7847bab21f44a2cc62c432394026b1eddcd9e894e5b887e31f795048c78c262addfb697ad0c428f1f5084be4dec7e36bda465c49272f2cddc21854d696c8564834da2e2bd9a63d8b9e71856d116adf99fd9fcda887ac7ba00542023ae6469afabb97094e8599b8 + +ModInv = aa4c32ec2e1ae70279c75269ea2b61bdbeb088ff0b7bf32b111914299ce46068ef119796e1ea09ee2db05a7c362bae5154c512708c4fef0642a05be13ede96349a36aec59a4423c02a4674f77e3e88da0adca17bf79948efe4cb02ff6092eca0797a86a86d43734fbe81179e58cf7b014f6065d6b01c43115f570b9c3da27b0bd1a5356e6e6ca2989c68d3009e5b2ff7b443f7a71105f593d036e88db280dca793eab4f79e4e6822ae6d27d412cbebde7b2b3de921634980ae526a18151ca5034cc1200b27bb7e2ea2465f839a157924192ec +A = 8c292518c1c5ada807b83508b5b8f6d3042815d151e9a9520742eaaa5a313e2255734e78b8c83b08efbeeb795c22 +M = 5493d3e4b195295733d72100f1d26a8b38107b9b21516c27d5007e883a46859f79d5e71e60afc74d4adf8b6a4f600a6e47325ef6a6cf683384877fb545cfebef95c8bdce88f312a6a039ec13ee7829c12ec99172efc476e11ac11d51d4a60032f770a64b6969675d6b1f9b46afa6bc26bdca0ca6d782a1ff2277ff464549f27b4b3855ea96b92c622966469ef6fae8d37bd2c19ea8ea978a84e68a2302ec7d74b2a2e6536f7568c5f915a2c758d78f1e747586b6941a4810cc965d3f53178bd2939bd1f9a72a3914221a022f97906ce79c32a3 + +ModInv = 55f99170f433c95838a550a346e1ef74a7d791f8fffbc377f0ffd61b17712bf24552546325527f9cf5aa394813f4a555b4a45b57930beda82437a9f3453f8866ca319a57934bb2253fb294a116601cdd3848ea941d9a31d4deede0115997f54d5d8562b970529250bb4ae1fe4b2bb664d6f64c6c3e847cd03448cfabf1af2769b064cfd68c83cdb734100d6352a34c65587739551371586df455e623cddd887d9b6754374a465413c3edf88a8c59e1d42a4aba2af5833adeabdb5836bb15349d33fd150a8ef4c7fb1e0fc8129c87a1910a129 +A = -6c3ded3ac94804f46a77e4de394f70144b8a6607118b660e8051c59103c3bfbd22b1215ef62a9d8ab392e9b37cd8 +M = 311b0d20027b837ca9c27462dc2a68a3e987001cefe89e308067c3bb730acb8087cc5cf647181837141eab5f84f98e89099b0d7f86118ad5fd97feb2ffc0894d4f029c676643159117387a7b4e990fe07896bb05b7981ff9ba12ba2ef9c602e1f26c51f01928b7c8a671571d5ae936d7b1ff520c2eee6f4c22de0362631d7d1163be7782f891e68a0e72ae77a5977006bd3e9d6b2b727f4eff8145fb7d6ed2967b33666167e3f25ca60e4efc2b22b79d6a0d95f296e560e6fdf5989ecb4b642a7624839e34d84920b8c403f03e9891bb9a7aff + +ModInv = a6fa33e59689b837fc8e0552e1f9527119cb8187a6c7d486c27dca023086fadf550223aa8ac4599cbc98afb2a5b0ae34b8476851e334eaa3ebcefdaffdc6efd8acef7de9be301166a554b614c6262da90e7389dad8d62097aed8e84e5b622bb9e4a2e364e26501e603dc7be48e769c338420e4e67765697eabbf734154f1a3c44600c9f73a5d32e076f3d3464a401afce4f8a4f8bf215be6be0753e20f99206a0f117c5fec95dabe9634efdc33b1ae849fe8f5c85f4926640a24bd0c33136d72a47f7f378816e3009d2efe1d8ca057ac30b +A = 98cd9d9c1f405879d9787c1a52aca5c14bb3eceec984b73316d02209bfb9050d25eb1994ef10c97a0ae137e083cc62 +M = 8eadfdc8be518f08957264d2006fb19ff6f9acde8855f9e07022c09044927dc22a859565dc669306fc880d1c1e340d0a94fde437112d426cf30aa3262168688f42c079361a19ec43e585f78be2399289159533a365b77dcff1b5220a922e22ced86deb39f1d179f36909dae3409f3cf28bbfd60bccd3ff6f266b03730e277b68c2566b54b089afc93ad487cdedf9cdf766be5616f8fa6be49934c78a9391be7c5c0e199248c3fc0a25811d3087eb621d0da27543175955da7525e004d4fef762196c229977894752bbfe8f3b4d8e9ea557c9 + +ModInv = 3a3ad4069e515b5f4d7e0eae7c946bbb01898cdb51d2feb04722d1dfd1054399338738ebb0f9d888e9a6e0d3d5cc24ac33b9cef93d6b86a879369546d15d0cd56bf2ca51c9b34533cb38e82fd6f99ff7b73b6226e78bb8d276eb9e4859f8da3daecb1802aa392e623fc57a855014f991c84a1d927474f64c5e6f8f2cb6463b197e51e85350d31bf843339560d92e2387dc2f595ac980016b0c315c781083c2c7532e54bc07beae11f66abd0d029c7fee3b3f6d390869a747d391291a612b95da1adfbac3fbd65b465a5e9e8e790845a36329 +A = -3acef082667409d19fb2e3d3455e3b77f9132f2d8d4ff4fcb8815e7343660c6c4a3e6fe13d6e65dcb4918c52215d4 +M = bfe2687dde083385f1d675e168b47a5f2f1effb6f5a6eeca194b65f1289d66a0050753671a103b7f82e18aa42c0dff8d01773ffcc9a5dde192d4d0207dc817651e727d78dc77ccd7f1b7a5703c6fe48f8caa0ab00a0c8a8e362d518e24f2a52cea10a55eec3db815706d8dc4a7cb6ea70b670c434f8eb8dffda4d9a108150008941153f03c8129a835b7631e1aef58f96c5511cc4a04d1506eae7f8c2a668f6a9febfa1e0ff3e3cd46a5d412f282e1393b5126f23decf66d9a93981f5bffd8f0ddf31c42ed54861c5dcb354e45086e7cdd17 + +ModInv = a815d2d7eeaa5fdb35cc62fe415ef77ff13bc894ddcbe597678119b07e1c51c0f18efcc5f93a4079e98b70d392898c86b0b4337379f93c9afc0dad22614dc52ed1e63a90ff4866411f47bf64955042562dbf3df288e97207a8c440a1e3416d2aaac11b63fae84f01acb1b28e488c2e576f527b49bd78e56fe00d770ce2f190ff9ec9b19fbfa0139681eb2bacd9dfcea1779fddebe44e742a4ac386be16d1d5f9a266ed8506744e28d30288b823936933ab3bb3ada8b7436cd5f28573401e6d04255e76fb0b67b2aab38d2ef3296e752b3882 +A = -15e7bbea9c5718aa3eaa134784b122864b2aaa97742dba49aa078bc523e6f0e895edf9d496f16da05f0edf1fcfa0de +M = db4593e42c58a8bc7c843a706cf4c43e3896a4e6e4cc8861672c2919c7855f8901178ced240d5c66536226ffd52ecf5f59ce9f468b6043130bdf1f92edc6ebe49af439e9f602e7c433b9a5a9f65cafefce8ad38c96bee255701bdaa43c398fb9f9544fea942e6189f9837d872cba111fa891d33e5d6fba5fe82f59e80e24529f09bd3c6cf10e8c7796e2a85407ed4b9fbf74935cbe969908d6705294ce1bac61b6c70cc2c373fb734f287b01798202b572afc68418acf1ff470fbe347e0a940253b824b5ef779bb791b09ccc497148d69f9f + +ModInv = 40a176ede08596cd0f281fa51458701f3eb8c25cd5f9a467985b6e224090060acba80de8af227c446baed9d62b58b9dbca2e7b4e89db6f540412c311c4df214de718690c49c733f534b832b7bc0e531d5d8879d4901aaccda6fd34d15eb074baf37da19b0571337dec4f1ad2cb4cdb9fca4a9a86b83ba9699f63babf5f949de9ae2b48bfa77c0ae7200319505c5d4f18dc7f4bc773b611b95f7f4f3bb991a7089cdd4aafb433051855acff96298cedda941f9ca8a48112a9c230fd49d80cc5d6396898ec4e03a62bef5f46b1b87be504be +A = 4f4d058c0fcef7dddde40f2d58a4234c9aa53571485619a3e4dd793f6ebbcbbb7d01b8c18283b0180b414d23d9b9309 +M = 6a402014e5a32ecf8bc00a3e5bee81e251e583f7516e94ee3d32b8654d18c6e27d545406d7b84755f50f7e7c803d6aba0008c15655f5824049f6854bc47690296bd0e0b915723912541bea1669d411bbefb16dcf15ea8981069925456e86f67c4bc11042a42eb0c784ad9114c351a1143fa6e0c5b177a9c77502d758a1931ffd75932edc9a26a0b9acdaae68adfdb8d62646ab3252feb7ed510b5d4e0f4911867480e6de4109b3252f49c64d8f897b1e5f570b75d32d048b2ba3f89fd5d778369f7f72a88756ec57d33eb112077abfba6f + +ModInv = 8df0637336b59aeb82028f84123a1ac103633b339fa3ee64904077796f55c8dd618c611427021b9b7d383023be1f6755f825d6d5bcb54bc6d56aee7582bc3f9840cffc5fa062ae6bea3e2e37d484156313955bbe2738d6dc5dedd7b9525805add68232b04cf6fc3a5ce6e4cd2cf4907960a2a4697b1e4d76f138dccfeec9f92bbd3e94bf97322e5498f8f0639c329adfb2402f6cdf7277ebd6a4f675c12f13c00bb7b2bb3b85bd6ce8241457d02e6dfda524b4d3187d8efe28bb6964a8d4202219dfb1a400e240e12a528ec0f627c7aff +A = -cf3d95e26d498cb370dc5e90b8b72ef5ec05f438254ea383741da5e4b372c48b67ea6fb9b56490d14a31d91705d1bff7 +M = 491c091208e9ee58b61fb630796d6e4eb1a831a4fcaaec0bb07e4e8f6199af78d89f35e4ac837f2ffbb86ee66b89d02fcc94f457ef3fef2a92c3d2f1432b623748b9358f20aa007aa77a0181a1819984ff7d0ff450eb0fcd08b43ac20edcb3402ef5517b00d6fc5385f31fbc295e046469a7892871669ca362dd4ede38f6c74829cb35b73245ba907e74670d4debce729013ac30f6f807ce1c01e4151a79127424c44e4ffaac662dc699c94783181c6ef5c8c9bfb75630751bd20a7c183ae4cd9025f4de0dfa0d1e03e9154bf50699696a + +ModInv = 977468a9f3cf342b1f27485ea77e5be0fd6aee631e63d8d229603b95541c5df4726c934838de255ae2cef39270533a1b04f7bc8a96a5a345fc633828e346bf75d7cf3263ac921b96897cf179e4bfed80b1d5de3d466029fbdda06806d0f74afa102e8e7ed58e96fe077963bffb452e97e8b4ade2ab1b1a2b1e56b5ce8eb526e7d4ea9418dfe034e11e29594bb2fd89a7c4b8e36f3c492b8bd099906c11953e88575570d1007729e8a53f74b94f0d6b8ae965afd05bf3741a99cf3421fb81d13960e4e84bb2d64d944bd17ef8aa784d0f +A = 5fa26a7bfcf51a7b45065ccd08ef9cfe25c46f8780bdb24532883f678ac85d3e870c4705de623958a8d7e77b64a4ff0d2f +M = e352aa3a71fb0c7372a559092d5e298ae1105f677ff52902fba8a814f0efbca52febd01bf0b991c8bb99f33d4b5009f5332ba39f40e17ad5477b446567baf4d09af211b3913dff386f0ee379e7dccbeb67235e51e011b7627c43365b7e6c6b03dee43ed7651afd26eadeada66e7cdc0ca244690794f7b3f7b62f1e12bada78d09420ddf2b93d6dfcace2007248f85dcbd4d9c5252eb1616a726c1f5464d4af1422db91d00e128a2948ab7279f209d61c612a948b3b9acd1c8eeed390b2edd3491fb3ce3a3f28b6f47068ce063e421b4c + +ModInv = cf1586c68ac991f3d495bf128693dd2aa2f0074fdacc50880c5d97340dabfdfe0f93258ba7abcf51438b2effd24012881bd141fa4120e34c1635ced692ac25b560f428386d9620b2fcd69db8eee0bdf030381860ff34132e7155b87f3bc0d250e7de06d4db1da59a733f5f504d9a9c6f793979b4c5f138935d6d21a2163547a117cf253827259ee8363db2fb83f8b1cde7b1e27918ab6b003b0837e76876479adc22df87d5cbde973692a68a5570890c495d65097ecb08599247fbb252b96c3ad948576bdaa3fe305859e4d33df24636 +A = 6092832ae4344c8127617273ddec94fb7a040edf424ef40fbc854cce3c653460747f4a81fed3fea71610a2b7b6ecf2ad68 +M = f5b3e714ad5bdb13329a9f598c4ca59186b6dbd41194ae763f6896db62db23eadf453287d9202fd0299edea872263f0748c507b91a9813721a29399d962df45f1b1ed9be4773c270014a851bda1236bb21e679e041c2ce76b6d56d4fed92e7b015554c38bb5cabe8b432bae3e903e87d289b54a4004d6e1444bddc56f2a2353f6ea3c09b21a839e7b1455fd236cf6c66045286402896baf715ac98a8db2b35706893181ba0d6d688d0490875c25f0d393da55315d3cff5ad2689fc8fe91330df847b5bd45f91cc80cc42253ce1ced8d9 + +ModInv = 4c656e7a1b7a6dcac90eeea3ed392b569a360812362c84beb6af0ae9df64d91a9a1dee3ceb22659622669cb2ca531866a710332e71d5a7f66efe8fe5cc2627562b94d87ae45b1f7420245cd0cfb1e7d3fe5dbef533e1e7b40de083c3fa7a5124cc2be84b5b6a7936178cb75d9c9b076f72bbd5234bccc007784f78ab98996fdba192f461331d67db54fd16abd4737cf867c147a4c240d4bcc960bbc8bd86a5bcd37baa9b368f96099ea9561dfe0895629a26e4c4fced189be6014aa6d4300f1b62e054e2c7b1605477ea9f0ab7bfcc21 +A = e6cb2b248a0692152b86a5eddffb7ff9380c81b8696ad54969712a651e8961dbc067072115b01ef91d4c54ae8f9f38c8c5 +M = 5606926c602f2610d15198af2cd1c939395ac3abd6a7525710fb4d8af1d90d86e869e96585fcaa0439b61a4084df443c749baf6dd9bb542b1fdbdbce40860959720e1cb83b2bb16dc790b01921328c88333cc6daa94ee388219a42c89e9bfba815731d2cbc8e19d206296305d083b61bea9acbbca09c6374b524944c8693a8c92ee8ef206eb0721cfd5af9442705853d5578a319f14bf32aff4cf60a7966c2004b150f99a2421a62d388ff34cd85f4b73d067a9393255ef8b0b865ad40be8628c79fc08841189a2a3fbed894dd5b7f12 + +ModInv = e9ebb9fc94bafc7fef6dad653478a1fd07b52eaaae34020ef58876308386b4663fa59b6e665284b7c08b073f31151b573297818eb3908838c202eb3810aff660a4ac81404272724c15accac07a07f236f961c58b398296c9b9a0f4fc3c2bace5fd183998122f9099a2c11a783556b0f319eefb7b209d0fc6ab9e3349a8243d9b9b45e997d4a80dc0b0b0c5bef8c14d5b07de7ed8c52ebc60791e3f5d819d27637d6b5ba9f6ca97269e09a1a053b3538afafc8180251ff6772ea5ba13afda948ebde529d7661a55ecbb8ae88fd9ed1 +A = -36307d171915347217a2ab00935be562d8ffb9d124f5e40e58ccce1be0329bfd878b75caae2f741888a8eb26eca99d82b996 +M = f30a1d3737290e912f95cb91f8d74cc20fc8136bd240bb52a576ad05cf797898d1789311285c234a4f9b067da4b2e2c9d1726cf0f8c33ee58e097c3925883213f28c0048bfb9b1ee28018ba74aa180ce0cb70b2c966871eb5fcd7914cb02f5180c7db5abc8f1d57704b371d00a4f375e79fa021a51f71116f023fe671bf61b814448009e9337723fbfc37fcf7a954d5359248aa81e78ea3da6959fcd1eb1a97e258304d5ec0b0a5fddde737e87a75c2239fdf4effcf39cdd8dab7da8301ec100feaab86b6b27233612ed45192a293 + +ModInv = 3a212c79387e4bd8108ab1b1af3607a76f80770c7d6ab5c7dff1a2fc115486d4c71f40f1e03a925392d3fb620227a122e2b6fcb02ef2fb8c9b3eacc9f309481947fa2f83a1b3374f453b25058881eb6b1e224dd355fefdc20351b137600a13446764a3f73395d7af046e2a150cb705b3f32de6ab25fc41eaffda2ddd66e03d54f615784d4bb78935e1985b61a9738d922cde44c2418c504c7f22ffb864e1a5d56d6d047152c9b73908675a4c4dfaf54fe72a89a18950efc9acda738d8e8c495361e4e9cc007ee09f074174be11e3f1 +A = -39260d883d662308450b90a915b37562cb036a72d57ac045b3d7f0087b0c00fd7a40e71922d72b3042c65082d6de5fb7adb4 +M = 8eaec57515c39d78918b6c7cccb2e5cc7ac6e0b4f0c44e383eb24670cacc29c0d10d89b9b85922890a24f51bf471ab738e74317fb7d4f49b1372a4440978a9ae7156de4f043adc7d9ba3a9822dfe8fc9efebd6ef122cbe8d95092d2655b897d52130df566d2e62a5f463fe79e910edbc0c6ee39ffa848b9b2bfb573a44549f242b11de62f2e68d04791308875f5eeb751f13059fbcf972961205f39e95be3433a2d2b134663bbe8e9112cf8c7f590e7619ce253fdb45c309b043e503f195f710717f9cf48d926ad687b5a13e635dd3 + +ModInv = cd0f8c451ce155d930be0027da9d5c5c096d4f5f7143be7402e01e6db787a53ec344f1a692507cd148abd6025138fc59e5d2cc9ec93a861371c0de236a6555013ad315bfbf88d23d8c527e8a43191c64643b81cc1b7bed75a85a4e2cb17cecaab836f0dbaf4c7b7ca0e25e433cf6d570f6c202b806f9d77235891afa9bf62cbd95a45fac371d639275373a9f90132dafa444fb944aa53d27357226066823e5521daf985b42c321910e31a1e4702f2393f2b2728413a86c9ab9af32f4cd5beb21fccdd52209eb813bc51533ac3a89 +A = -f427a47b65196d6472e938f29a977bcb3a20de92052a0fcb711eaa47b37e47d2e70abad28cd9496d7ccf5f19f0adb07f68607d +M = ee0a65b66495e03ff270048afb06445d3ad0a8081fad6380fa535b5659dd7799f795f06c25a42a56bd1c66f4fc468651cf04ed69042c3b13b026f5edd54985efbb1049e5325428649b62182fb4d7aaaa87fc026120654c15e9881284e6eaea5f11babf4c92c6f86b9efa7e5bbf1fa8b8f170d407c46a03026862b4fc558786dc0fdb1b2a0043ad5400b742e8af05c1184838f8b407ec12e906ffa61e9f54acf920fdb6c4aa79f190a1801fe440d02ffd0167704d6f5fab52c8d9eec9ec12ca9163184ed413dd2ff31a0451c77a56 + +ModInv = 37912d29d9f0161d717ecbc3a7a7900b8fb75c5037857122ec544254748475a9fcb8851228b562c5ae78a9f1248ba5f8d5f6d29e0ce75dbad7d35ec5e7505b171f02597db1792d45ff05294125c4908bcd70145a6b11f9b999b40988cda52c67e535c59cea5e42f654f54bea973a0948f895358882360590d083a191cc61f2893cc135dbe82adc747c5e04dc1ab519e9e5853db12f067acf308508f8fdf5d6122d999616c2763498395efdf4a11dc6aed3b6df5bedce0fe44f1aeda2c4680f01952716c9de8ad5c27d10b8a18141 +A = 67c5ae906435f968b9569774a19c098cae2cff4d79917167d789846ae5395da46ea784b19fb73718e9b14a7d5a4845d2687d0b +M = a6e84c8bd47b39f35da88ef6969c5dd737768874d919af88a866e0adb99c4838c5045027a91d90a232cb05a2c670bfbf28d79a29bd5f1e12f4be95faaf16eabba23e87d1a80f5ff3a579ade9030d43c21361717883854af78700a10611ec26baf041001a0a837a3c3139993198b0c5df933626826959d2ee5ae818bb2df27c59411a42aab397b0dd2125f5a8888cc2309b182d360493b17214bb2b0c717c7a421c49d17c86f59f694c1e79d7d959c49e1b0e018e0eb22bda1975ba482aead6f353e6a3b0ab91aea0402fa152904a + +ModInv = 9ce473cc73abede5ed8462c0b42a224777f1e66e85f3a3faa2009175077f00bc91a6f8cfeee1400259fbe976afce9c2dec52a4f336440b6139867fe7c954653eb4b0a47750332cb37f5d5af7b47399aa738ec5c9514f2f9cceeecd41727bbbf1c2ac07f891ed9304c03845b42990cf4f5a113487ad766a490e8d8a468f29ffe1e2e485a930e50849e46fb464c7657a232a55a48463dcd264df790f1a969037e47d8e7572c3efa62c8a4ef477079a07e4feb2774391774fc9c6440200d8139ae0c6a91a1d002df2535663f52e5f +A = -40c9450280a99af96f75b6be1840d0839208644c94f48c5b3c8a59978e82419df12c89a343d76a4170bf18b7b6ffa710cc5ecc79 +M = d1a78878350246ee38b9378bb511c862dce9d21ccdb339513743eeb97905b1fedbf7dc4ad5059a3a78158d78e5cfac81c37a34d4b368b244b3e06a8352782db5c387cd835e4e9460ee9cd79204985e300acbd00c20389440f3a2eee8520d1d75ce7b8546e91e0557440d54f6672d564b8635064dca0f298a5427851c99ea53e70a99d3c830ee790e6723af392db38041b4465b606c43158951ad35f1c0c212788e1b7e9aaecdb89cf7a66db19896cda1cd8c8053d487dcd0317540aec1c3340b5088be71bc135f9317f74507c8 + +ModInv = 228b8d5b9c33a43949798292516a7f34ce9342ef1cb15518375766d020bfbf62484499bb22252283fb346f0184846fe93aae3442a1888e0b1b90938a229b67855a36c64ecfc1bbae7af371656fe23b1aff0bafaedb6083bc27fe040779a1a88a83ed2ccfe0f2eb4d83ec1b6501ab869e7efeb0c67305673e39e136ad4a627ef7a350c435a736001619767e08d8b8cf52bd43494d68a3c3604edb24b618a8ff57d3d68cbb5613b031ba3d1be9abcfb01898181aa43cabfcab328c6ba1c6df3f2abd80806f122749306942a43aff +A = 768c89a0b5e0642fabeca6104cf9a54efd2b149d175846ad54188078aff3c1a30483feb54f851924f4bef723af7e95a025a74d21 +M = 89751a9c8b7b112960beab4e14d900580b5a80bd92498d7dede0fe938ef40facebfdcd8c6818539f8a21a6ae9a6ab52aa86c2fa689a1e6307791db25f64cdae210770cd96c1735666efbda5786ec2f3bbcbfe043900105f9f48df20f2167221795d2e9e162d3a662a42ddec458f19205863b80104eb78216e3b5036d4276a4e323de50d0798fbd1368f73530a727e0c6e78b427c7619d08d0b7372b7e6ae666c5869347ccad4ef1c3e3bb6c891e395879953cb09df0cc2b99a7900aa8229005a4d2ba592ec320cd8ce350e730e + +ModInv = d33148e63e9ccb0e1565bbab2c4248066eba4a338b41ddc5ed849f02d206a6d9cca4e67a379b4461fdcbd32efd92aec73e2cb8e1a8129adb018308c1586926b8d8ea17535c50ff88f3baa6ececf852bc8fe2a9ca163986c007513d2801c096f127992b02e9d509bc32e88f6a7ae852a0212dc9540b1245abe5b82690a49527547973fb6641d585b96d7ad9a4241db4f95b8409f76842569ae145b4c3b5c2bd4acc6d9a1c60e95744bca2aba39aeb45b4d62b1b5cc92f6859ef209b9a6372a73353154ac0f63124185fb45f3 +A = f9508e6f55823860b34b10b18096a03539bbaa451ff535728ba9ce037a9a0add38945d90408005bf0e01ff52dad67e414840eb3047 +M = 38207c84b9fbde219a8b485e9c3d35197d7b753db1bd2968b25a39a1292f2b48e3fc39f97cc765405367a3de015a23fa9cf9a9655ad4cacccce9ac302a0585d8c07a709693073b09122a48e27fbf56234bde9768cf5bd8c7d1a25b25021101a8e91651429a8fcaf06384990bffe0305d3943a2ec724a3a8a8300bfcb7da5957837ef06dfa941e7580c6d06afc712ea3dcbcc32b0ed5e2cfaa0be87795500a6a5fc875c1d8fb686c109fc01d9d7eecf54c4e616929f3c700aa493e279e3909963715dad5db7d498c4b742da5e + +ModInv = 34d15766fb6335fbc5238362d8fefebeb88e1914124e4804e0e38713aaf7e33f5ffccd92fd90372427b7942e733c9d93f08353a69c8f5f4f1f924838e778ce87a39fb26f9fb2c5bee2f67d6d9aa66ae6df21770e0e3abb076b315888ee7cffca0717f2e182649b406bdc9253104c6179d4157adf04ea174949a2d9d20c0bb6b891a0e2f004ce9f79f5f7444986a6758968a33e89cd69a465c4ba6dac6a55d8be9724a24299dd376f059280f9eb731a5140be1289f3e82a48c6699b8da7b7deb5da9131efd6f7325eb02f6886 +A = 590bba88bfe7419daca9a3212f49348b2e634e0331be8f29a20a3fa7b81477f374b9194bd4cf9f194acd2255df98f5f88eee58ad6a +M = 48f5bd065399f89fd523952c2255f38f5b5d926aa7de88ba478057e29a928fbaebbfe7156c53f83186094caebac91b7d6ae744ab204a08e325d3f4025da273f5b75c20d94043d83a6ee96596d24067ff832487b9d151de6b1c6df4c1fa828245b3df0c356895a843941223179b5123cf06c240527ed30cbb78525a2a1b5d441fe7c9b42c6b3b069555176a1702c6dedb41259f335a41b58314f139ff434447e70154e79362eaf84251696eea07efd163141e4d7d6340eb31c4baa78c001529f976528f05a73d454601a1d4f1 + +ModInv = 9b9ffb08b7425f2a128474c2ee8e845f9217551b1211917b52456129587bc0526850ff2bace725fb1ad182da616b23bfc0e669339d7e140416d686f6ba350b3bbdc413dca9f256b5ab2c3d80dae894078d8ecd8fa92ed054d794006eceb32e1fdda8dab620ed04fa98df8a54066a1a9a6aa560e6d9ca96d309ba5fb63f28fb1949df7448fe63e6ea32b4e55621a034fdfe835e84f2cd6ec5f68c521ecefc6e16403f2b39efb6dbe478a29c6365bc97c70d0d5e64f390e2336e0e1a9769e9638d5d7c81169054c9fef1d58b +A = e34e39666f0611b34e7569e5fe06a4657d01b0a67497efd0f1ed0f7fbeec2388dfbab7c26e89af2059c3cd4b753176fc7bb78fc3fe2f +M = 9def815608918de2677f7d423cd841916131137415435fa1e518c7ea00cbe0d0c63d8db8d018c46c89dc224294efbdb0f3b5655ac3be2b639149f89a30a10d820fdc96d4e6812d947f2d1b3a533ee244766716760bb038ba5d39d4e91b7454d5e18d77a49733b9615b966eeddbd4cbf5c15b62d548b0db725882b6da320c3fe5cb97721ff25da646125e306cc817d5a0a83a053b44188466fd03911b011174316f95da34c595c232f7d1a18834c4c9a93bbfce637fd98dbf5a33be2f3beb5bd9204cfb02c4bccb285c52a3 + +ModInv = a6adc124eb2c309772866ab84eff143911ac70919cf9b806b080e3b58fe1c8f82c14d9a9ed75a4318e5fd30dc028ed64422fd7742434b6adb0f644f01ac57d4459013b23195d02f94648e7054556f60c34b093d309c2f489798b1febc484af45085c1c2e198cb164e9561374514b267cb6e3e97869d108886b73d91caf7d9284515fd7806b4348acc8dbeee96b2fabe81d7069354c717657772d927e712dfc03033fdc32da03b0b3a9259c99a5d682ba24cbc36c196260f2e7cb7a933d68076bcb49c15970ffb011263f7 +A = -d1f09a829b1e393d9fe28d331f48cde900f5bbea1cc98d6c9c24bd111d2d9da3d48a0eda8b70589297bc2bfe4a3c16ebbc526b449e99 +M = fcee7fd38f4ebc7971303ba7e9cb78944a3d5ac9fcc1a33c3de986985ecd7d0911850d2b565477e31e61a185db2a76733e9c95d4af4b260ead434ada0a1c72fb315a676c11ca2536a26484af7129ec16a3344303af37a7c5189536818c8aca9e5365bb6399f3d0f6080ada2b270600c03b47ecb114ae0ce2a17af85c4384e19c391d6798d4913b868730cc1d1ab8284387bc15f6a5c9831f46113e7a115d30d01a3ee8f3c081189964b4fd905f3e46bb27a5c5d592053ac03360899fe757d39f60016c9d404a0be87d810 + +ModInv = 9a3881fb9de1cc9ec7c6803175468d87ddd1862fe73848582be9f93c24cf60d7dfecf925b4fe900d7b179566fc1d88d8050f249aa68ec84a8b5e5710de37e2f1153ed252b49eeec248a5d6419e3af4ce39207474175177482f958838f97a701aad44b6824cac77669938f7131fe7e204fef11f45011048c0c58245018a0eb6e20a8f33daf514ad9b0b845e486dfa0cb31e75f236ae4f2d7d2206c7915eafdd63ccf054dfb246c433314e223d70b7b8e55d2d19281ac17d060ca20f7fa7043a94e9cb7cca4bfae2b11df31 +A = 868ca91b152877dffaf94e2da8c21fa10507f588ae0bee48bfdf33a58c8a13ec7fec59ef1645bd85300fbb046e43554d04b029d0d4e9 +M = efbc5f0951fbf24cbb492ed3d6515f17fe5fedf2d19588fdba17d851ffb4a320940a0d570c827454b0e7428423f3cc8138b0a638e7a411a557a94970ecc576be70c620f93bea29ebd210c8582e4a160759e034edf3a6245a512afc7d84ca0d4b15d8c73b607feae5926b1b4523e2b8c39e28a8a97e520b177a1ae0cdcb1a8f59cb8d9f593923d276da6ca555d3bbf14ff86511f030d501d4c0593449bc7802bfbd6bb86408de41c9a14f08a76d69a79d8ab5b00a222131e112b66f54616f5fce39ee10fbdc6be88fb2e7ca + +ModInv = 40965be8a381348df4f2aef947be0bf5dc6db0d972668b7b7aca54a6ccdaa0023789a7073ca7bb406fd7d37a5c9ddfee7a34b223a44aca26ccc21ecc15b6e1a13d4552de77d85041a7fcccea24ca19dcec4931b3fc1fae2bd8e05ac09795da0ad7a026d833f42b2d4af86d000c3e9398096fbd76e096676cfe2f5eee5d12582f4e82e2018d6e65c485f589c9a91293f6fb877545659683c07fb39d8e47093f0aac8ed58d439b0b9482cd35cb279a50da2a78bdec52fdcf772222cd16e4065974e177500229b6047e8073 +A = -3f53b12eb058e8e5352f24b4b12be07965cc0f62f4ff25d4eb75e7ce20dcf3c557f300106223c47cb93175aa08faeca59c5106955c1459 +M = 57d7c9cfd93afae21463d7907e01e3174a371d829b3553965f90d75f9c6f1d620b751e8fe433a50227cb60e90a8ccb2763a9e33d07263a0d87beada770bae7370410df8898375067f4dc825daa17b9fa80b51aa74d854df2532011fe1a932935a73375acc835f2eebb41e286be23d0f9d779c0bf2de7a9c9c4f5369d6a0f3a68003f77913fa4b743cc32feed806649749cecc30f9a7f56a598c935fdf1403728b9a7004a641fe9e59fffd4211bf88319420b7c7ab883ab8219fd29c90c68a280753f8426d3e5cc9aea84 + +ModInv = 235be9a3bcdc17ccfd8b677114bf16859feffd7349653d71300564fb7ae87376745fed0219e8ac046d8b8e82c5756ab2f863677ad55736136a9db5d97932ec5069ef5ef3216b40d4f0a16c52349f094577a4565ea8dcaf2e20b28b6a1c2517a1f067369f5fd4c7487f4e2949bfc450a244ea8751508a705d9d8d09abec83ea437bf8c52e482636d4ef8aeedcbe5032cb43ecddf5aed7dd557b2006bc453795ccd8f8eb5a09ab6b77073cd08daf04ca4706269b64dc01992c98f560f433864f27bd74bb96c9c361822b +A = a1bc864f8d324a3a534f58f40f722366334df1933505fcaa3be6d8644ba2aa9ff4357e094d1c15e8cbc9b2ae152fa2a0c055b8271fcf6009 +M = bcaaf69b0fe70c9460875665ec2255d047088789bd1fff0ceefa9c3af26c028142e338f7ce635d24f67a3162deb3d7d0aaeab7ee858892cd81635efd44fd37a1552b920b95f9dd2cbea36f46a24fb88e56af92c1bf70e9163abfe77fb066d34ffb5bbcad1dc8524390a7c311fbbbbf933588e40c1bda691c360fc531e5658f4b5721bbd4db4aee37927700349019752333f09e73ee3e2ce4b46957dea61596e16f06092cf2653a5d86963543bf3ba33e33236ee590a45bcfaf61d430ff9b4a5ede3d48a9d490ef1e86 + +ModInv = 14221b11337de07d6d91dbfa62c12ce7d40bc980f92b991b19e2b7319d015535f5625fc9d81f1886b84119f06b3da6170fb8b5d45f762110aecc2201d7c285d1af66477b7c7f430ad0c0f7f68e26a5d4fac480fe249bff8fdcf3e935580ba37e84a30549fe101be804d27fe19f70d4f83b403b2c20a65d0aff2a0d415368f6fed8ff3e9fea55dadc37b20df80e0a746b992eaaa347744a8bf4e34e7f071a1ba4610eb5e39fdd0256e25667cbd4fcda4611a30ca33ebce5647405c9f88122fe5a58d29825974a50489 +A = -bf82fdcf736b1f5f37e30578d49495dfc526d36278787628271662b49d049a2ec2a01a4eb1a21c0766c3e22bcdb14cd8ebb3ba162d82f9b6 +M = 8a089edbd3d8a9675d9d0e3bc4f965f856876408c41ee2a90c93f6170f093d8e15ee3e6b83b727c0972fc038d0efd8b8e53ebe023cc50c14ad2137aab76fbbcdb8947469cd0ba6c55b47499fa0bfe1d610f1aaf169e10cf40d87315a6426624245b11f13a5039d0aebc3310b0385157b31ebb2712c5c8f5e7a3c0baee1243fe58613f3b9314f9fb9516f2e518b237c25829740a367b89923e497df2b805e1370858266351b18d9768946dab9b0686105ef00ab2638cf23927e9b3922974c34001defc4f1f1e83539a1 + +ModInv = 3dec454887bd53a1b7a93d47fea1a7c5afad2b151e4086de9321ac8d112d2ae2fd5aadc0782e64f3a20497ad70cdffffc9f1752079725e1b0479ebfaf6a9892326e9069a547c116fb2069dbe1b37176029b8a27f8cd0df208c3480ee21e0f52ea586e731b0c8eb4938ad0a6e893803877bf6fb2422031b690bc438b8cef364dc6ae8d1c2357fa39dc1a4176c034d2e17fa21362afc62b6b38f5cd4b864e2b8a9ec6ef819cd36b748507c86cbf32aad8d51ab16632a5463bd591dca29a34b00953433191bf591a1bbfd +A = cfd36823c28e7ec5cf0a692224b785506225ee3079b087bf6986aa756c489121ddcd9efc735cb6119c4fa82971f4d678c5cd5adc5dcce581 +M = 7a2ec3e79c84d4ad7f2cc75bbb014bcb8a3da4d22b7ed5752ea69d9861cc8df8a6f84b1a39c65542d368475b99c76f8fa59a26dd7b335c76e1f9e2644565447efd928a5776b4935362638a42ad10ed0c7549e31e29213dca9e2462fff266b154d06fda2d0cadc547e2bf8eae6deb9869a733dc0639f00f0fa4d61ec6478e52249c616775eabe61f0eccf8e5841db35f8b1707ee563d7e83a6e2dea281b3c5b02a554b44302dd3673433c947be1159bcd6267ee05f353ffd5b13e75f9cbb0e8a643ed3071499257ea1a + +ModInv = 22fa47024e4550c4251777a91e5b73a9190f064133ef2251c880c7b705ec04ef64bd1352b98f32024d2af77d659e813d1f86a6dfa9b7cb22b6ee46f7350aa49656f1f633a9404c8c6459b59e3f7556b6277420265d3ddba4c35e06817b4f0df32c124058024686cad0e02aed8759433bd987e23d4018a76b7bbab5569cb55df3fbf82e4252c5258bb326d89fd1b1ba34e40e1318f8f4481c882643718dcee50666c56f046f86b965f73a0d9fb470e364a214258cce127e400a5d30e60f6ad73f8cd66724484c8b3 +A = 1eaee356f2e7f309406d736e23586d98968cb9e84695699d7bce2c3243007cbae22854c4194b445712f28406871e33c6bd3fc32fec47c6b78b +M = 2307f0e83be074baf3b6639ef299a39cbfc8d019b21021930d8fda3fcd6918e5a85ebe248fcd486018292e2c95480d0f97b1d31b7efad4bbbb7d1c80fbbf428da2d87c4bf6dd2099b6de4bfce39fecf885299dc1e526f63fd97eba5c59e8e6f582d396bce72a5dd68933b5c5b68f079f8766f193ce98fc98d521b0fdc5a58aa4e54fe18e75592ec783096eace0d9682f457da87d035540156a420245ad29d36b71e08de500b9ac958e330b1821b4a5bf6c522caee1a36a6c7fc64c1315631d29ee1faf4d4f9ce4c + +ModInv = 952e3ed4afca9bf39e36fe96c3ce75b3813cf8db43918062dfd617a499e85d9ec88b934d517bbbafa03393214cd896ca38deeb38e8bc23647f1e478b7880a25f25e339d20206d1cee241339ff5de3ab29fc0ad755244b03c892a436dc674c3c9aecd2e7156b196effe2864bd23d14bcc1dec45e478e4c8e7075df41cff41d85245bc5ce2463fd8f85b0de25e2c91c181b27a70f49325cee680a5770ab4a0e931fd36bd59d34565c189a47ee9ae8b7697adbf0843efc3712deb0351d3c3e357d79aa351ff5fc00cab +A = -5ca59044ec19c21ffa7cd4d13036ad29bcfb4c55d99485627f99f31573ac5d79461fdbca2362ee1d41b70909d130eef2a2359f5e4230c3f717 +M = e30ad1a2b8d083cc081a60f23df98bf3c9919f6989cb709f4249afa30d5c36a365e4e6735a6802dbc3cae92ff31148e98e75456167b330611792a1b37cff1454976cbdd961ce4dd57c8eb8689e386f1bb265122c214916400dae95365bec5ef11a0ca057bf1603eb4971f813bb56780e3fca33a3e81833f04ad5bc2a5d407cc15aa7b8fd60fdadf861996c82d19c9a9db789f4895544e04914a227ff6d91c7aa3d84c77e1cb4226c8a4b426fd5e2b5fcf2da6390e7170a129a3fb544a968ad55730c3c9ca1c01b6e + +ModInv = 2a5276e158cb79ee44265f0d24dd1d667ac63d37316ee3b6a0216b62d7512fefef7216ae521104105b04592c775607acc898bc63ab97017b21be9d304ee7755518d9cb3b43d04459234ce3271572243194cc9fd05a078b9ecab2d4458f4340b5cedcafd33660c2804dd2dbf42aad34965a8d12a948470cb184f055122172bfbfd40e1df3c8a1f59ba2743b89c086668493ad47e878e4b3f54f48ea03cde69113a4a62d41ae613c4818b6a3167cca85d18c729b8fd360596f5df140b0868585332dc342da5ca167 +A = -2eb52a22d0420b3747cb5758e63ace44dfe7f2d95686a638ccb8bcabf25f75cbd42144eac51d8d512e7057a8f9a9ff30afc62ec012c7c0616b99 +M = 3185a1a90b9a4e3a5009fa95ecc774a6cdafc5535b74f4639379ff39267bdfb95fd0059ddb51eb4988e630936e044d92ae9ff994abef01db100dd219ad87bbff7bf09b1ee88351edcd6e2ea54b8e5aa7ae7dd7847ff41312d06703522a9b62c20b54a5e6f824419d7a709f17335abe092e6e1ec676be53b2382ef0ced768629f6b695d76869f569f5e52316b0fa15b2e58c9336ee1d7c5ada7a69eb10197f76a6f57d9e1e56f84ca3efe6139fdc6c420a31c1dd196f6978dec42b334b4445ad29f0177bb9f4f6d + +ModInv = 38b6ba3d173481b6313fc7aa887aad0ebf239688490b8432774c74293099673fd6c1c0c1057fd46eb9a15d0342832f5caacd39cfa6b939892d3acae7bda3786fa44b161e8e387c569819f7567c5add5ca74dcaf88aece19923a9b043d97ef3bb61d0bef1e98eeb939b3b3ea8b57945c8fbf79ced2893c67004945a20823ae7d5de38ab638a9b70de2e0a33e485feaa07e521c6c7a98a7b315f41502ded57dcbb453fac085f423ac606d0d115b69b1ef70487826034c6fb5012593dbbd2148c9c3917a39f9f301c +A = 84d6b76c405d5a8582467c19d214a91e6b4fa47a3279821a731749383294fbfc2d6e16bdfba310d053d3707abb0987f3f9489b3fe076123f3c27 +M = 463a888a16abb4f9385cbbb3ccb14a5dfbbc62002c736a80afdaa86d936dac4bc8933849483dd77ae9002e3ff742709bcb2d4c76aee37ccd2ea233a1f936a3c5820458f463770b0e6a859a68eb61a10e25987be99094dac8982fb556ca3433a628ff983a3cd2b41a3f084046c01d8688f52fe2ab4cb1f9f3fed51128a4e2204b999de93dec51435c0ac5e3bd804f5904f68ea8fa24e3f6e33e10b4f95385ebbaf3d6cb12a4d023532e764c4c66068774c0a9b0e654049004bb044bb0022b8093a19d23d02c29e9 + +ModInv = 82e980a6c0059eb825c2c5b79575c2c91317e59339967f919a011fba30fc6d073f3db1480dc40905b8e91a86911ad6021de3e5931d79838991220272d83fb8a21a22f541c8fe83dacae4e2aae7cd755b11f6f640d4d4ea8cc900afb84b6773ed89078934fc935015f04ec53503da73db3b4b8b7eb4f88298b02ba302078102ed6999cb805e4941dbdb161c244dfe4626e2ad7abbe9a1f59c3ae57ac9c7277e10c46d54369b3c4c971cafe02165bee308d0196a6d18a7a8bfd9c82e33ff833bf8c84573bcdb2 +A = d81309de80db4957fd3254e7e42a022a39fa078d2c4f754772741cc933edde3af3f9a43d21ddb09e21fdd0dba8f2098c3cc4ae2a071c37459ca087 +M = affd6379cb66bf07e8ebd6dbf6b6010f4860618154baf87ae6b6bce43a0478700c5c35a8ebb53f3395a480ec97612d1a272336bf0009ae6ee4b1baf37d0ed14754c7c10e9b52038c0ecdd638fd5b071b7ddfa70908647b1abfb2d02e8ffa13ce9d30833ac6f914f2d9be2dd43bbbdee3185a95db72e3e332f0baa4d3b80360fdb706cf4ec82b0ce3b3637ebdd6f085a94dbfc81b0cb87224a440c8bbe88ed06612b6d217ab18dc35d8ac8536981cc21017444e9a29566f5e8be61c650ddceeaec1498468ac71 + +ModInv = 4446cdebb06eee26506f631f7428eec3e381de854f623dbe538b2f452db7b7a72ffd600a2dc11e8f7019511c52a959a89f20caaf8fc63080361954c901063fd8cc2d29f50f9014b8686a48a99e33ae2c06fdde6598a07b347a9358f6fdae2bd0313387c1af67d63b7fd2763a23a445eceb768581aeac9cf1d1b88735798bbf35f57c710cd1c82bdd4f92802693ec245963a9bbe202ac4f00564607349d26de5f27fcce785ecdeb7f3b46f57ba6e8d43caed9f597703a056ac8a3624855b7f25d5214f75564c8 +A = f93f8aa64b4955b6e243a7c71e326b8d8f028ecede1b8b3a2209952e1a478006efc2a9a5f29a16d535b6ff0fb582a838bd346af68a2c6f3111bf01 +M = 4c1d914782072b6c9b3613d33a9c00adaa63ca2340da1ca755dfcd3fc1d07e4d0fd0ad707a3cf9034c32bb294809793cc2e69f3385442285ea6518ca2b717452fa1edf461e41a341d8ae7ac919bf0d06d8ead9fa3d4da9f7f62ca9d48561510fea8f854de2e26068425f29e713a2f43ce31147db63840ce9a8f2ab0068b2f30530c95de5c7b4a06cae1c60ce46006ee8ad1c9b07b12b840104c0230c3f493e48b3ca3c9e991adc43d75d7dd0a4d7d56bef5730c98250547a7efe161c286264b7e71a2dd61365 + +ModInv = 14cc1f70a85c265f45e5d199ef050fcb89bd887ae4409403dd057d4f45ae8c0b26bec0814a2dd0eb6f1d766fd385935f2c989f23dd71c9e5e76b8d63877229b7dbab213f392972a904425db8cbd5efd6532c8b5cdc13873c107db994a59cd7c8061b69a3bfd9503e10baabab8173d9b2debef09165522b4cbd53ed1de39ab2a53e7c00c579a72b40d18ab6b11937b4c8c197bf42613439104c31a6527371842c24352b71d6fc984ca91c0bf9b896cc6f41bd77bd0a6a2ebd97263a7c5617fad5b04b0750596 +A = c6a6507a48835083fbcfd939d097c12227d72eead2a6a6263afbdde39c91cefc309236ce044f633079db774adaf09c1f6c35590d84ec43e62aea69 +M = a3a0668dff9d28dc69b506575588f2406df609ca2f8ae4221ee1473f58d38d8a0ef67a9b81e030992f2e908c7447153b3d5b9a77774eb313631bedf6fe3f86be5207eeb956a37d6b606aeaed41aa741ab5bf40addcbf38fef405344e6ad685cc57ab0bd4f9e2241cab0d846a8815925bd0891e902036491e6e381a873c73e5b88c0347b5f682484de0cbdbd5f17cdc52cb72cdcec12467220c0347484f851de64424d083b3ed7036b78d7bdca51866dec628204063e95a0d0fd3d3d712c7b6c08137e306f0db + +ModInv = b8ae86e5a16c6bb4feba397f577656c7fb59a1dedb15da19c1de69b5c7f1895b8b14b1b0812f22aed765cd67b91dc10d5870eedf0135c3bd73a8af9bdc527c8a3d49c6f3e39db4a67cf2dd4ebf6bac2de5c500f2d59f3684d152a1f566f19246779fb5247d629d39c92354bc98415226d5668a95527b6b022f4f18b83a22575f27d44cdc92875aca253f273a9a65953437187d21414e3320cb58a18d69a778e4c1de95fee396a332a62965f864a3e804c50615a21838204c9f7aa9361205fbf72191349c6b +A = -d90f3ed145058343f81d16f9676ac3d11c94a7842cf50502abd0f4030ee4a80274582540a2d31ba0fd05f953320abab9f221e52127940b03e252d43d +M = cd45f665d293717fb33a30d5b6c306ee182ef174da405a9cb93cfba825d21ac1e57f5836c1ccf2fd0ff71991a9874a6c21ae8b8bc92754be4f192a686240edca52b3684dd3c7d88882db6aba8bedd00dd110189d165e799979c1a7a58e3a0aee90e98a21e0da952a2afc2e33b6362bb1c74a2bf0e90bba5653edeb80f3736737f745cb7a39c306374a535f36d11c74ce5780a8a60d564956783ad5d7684c16790e1e8a5a950bbe9886c3f190e34c384bd125da23fde0e12848f85c4315228854e62400fc9c + +ModInv = 5616c57d7b15c1425d892181a193a7411c11c2c58686c6894c3600d4dbd10fd70efa314ad62873dfa230589c9433057263a5d26f9e05f59c819389c2df9476527f5e2a3b9b6614787eac4a17a488542c371077d321fa81b637df0ad2c51b0daaa3cd37dbac1210bb0b25589762771f13d4482312980b7a0db4ca2d149b4848734deb631bbe12bd94419dcda36a77c011832181f7bad03f3bd7c981ad09f057e9e09cea42d087c49c119316cbad1241b579dcb80c834bcef88824eb1a20073896fbbcd300db +A = -96c45e7ed41340c52617c0b5fa1f5cc448bfc3594c0a8c7cd665053cbb6455961ca49e24b66501ae5f669f4d01c49fc10dc7becd57bf3cef56199df3 +M = 8c3d2aa87f698eef8a9be3ed113926e0b6fcc9517f3ea34bf9923c8c763c22231a4a56e8b9c164216bdfea823a395b4eadf1208237dd5ab4b2e488e90eb00b4a767ea75970c7136df19962ee238395a339df6708dc49cf7c3bba4f05a2e0fa2e21c28a11a4b7e77e4723133660ebee9be0d0dff5f3107218b51c5fa2b1276d18bd48aace495fdad0efa8c6ffadb444c4f37f402d7a931983a2ed54b2a378762c58448122c37490e0457da4e89a5105ee092cd78768ea40596001b310a1e5867a9c74f0796d + +ModInv = 1fb2c1fda12e1200802c2d14bc0e51cb6a12cbd0dbb4e3199627bb84df205e42beb9d161086c7dd0828cd755aa7b1a3fe853f5f086bbbf2a9c2ab1efc59ef99db23b12f44aa7a47eb19c3315663af3c3cb24869c661089167f958678f7dc0ce9d05c302ff698b7b10ffe1e9171fd111ba6bfba463cd5c3e386324ca08869d0ecceb68930dd41a6a5fa0ebf594c49107adce1de3f0b14e61666ec8a7995b21b43fa2643d39e0d10f2ea6be9928dade2996c1f5e4362c9dccdb9270aebb515325862b15cd727 +A = 35293f3cf517e6275eb08216f7d968125cbaa8ecf3fac9a4ec9fc7504c5be3d823c06bc5c993e044fee2bfb26860fbe70c93cc9df8f19f9411d29827 +M = 31a0ff964f6a3af9b73adba77bcee591260042fa586719973175341bf72099152fc0c2c3630b6155b9d6b66e49086662b8f1d53af73e254ef092d67d5ff455001d0b49b62f366d35aac90f32e88333454c9ae4dc946903c0b88f4d7e39a35d620540a3ef37c173adb3156d3512d0f5667f76090ac7aab4380a255bfe8f55079f4579756d846f53dbbdc3b10b1e69e09a6207c7f58ac2c85c1a3e230636e324c2a8d98c111e83399ceb2e95c86d093d99d532ee981c3001ab955e15dc2f137cbc882ac7dfb8 + +ModInv = 50ee2524004b607c8a52ac695b4b2f074903593ca7c57d2aee83b97d2fc388104d599eab5f32a43c59a600cbe66aabe4e3bae3202d8315efa4415f53a422bc3cdd43848746a56b9a3bc7edfb93a92ce587491f5a0ce1fa74d997ebeb463a7a3504e82f6a88b9b4a6b453255347ce9f6fb51b3fcd86d711daf93dc4ca1630e78ef34e0ef44a58f6423020f32d2e1372f9a1cb8b02f16003d58be8e2eff02d9997e4b7efb47692eaf2b548c98b6044ea5978578fe146f5a9ba2fee68a05833d446d77b7bda +A = f24f24033dafa0b1c2f3693b91d71c5757be13ef3e35f2fe0574bc20dcbf9f501caa20c9ac858709e64a78b237af81a728d95c3a399143a2f96491b626 +M = b0a2fafd65242a8a961cc5e94d154a426d0a90ee6d8a1f4a9741dd028f6152155a76e41c3b25302bc8bc0abc30f408841542e52a9af1cc20951deb0dfbb6a05fb374e173ce2631759ebbeaead249f05e6ca758ba29ed3fcbb1722f1d472bcfe1ed6e9f970141f686c1842cfedee62ddb5feb0f370bbf6ace22043cdc129e0ca2451f8ae00b737c1853d279270756e815f8b5a9ce5ab08ce421077dcd88d5bf8f42136d802ce0fb501d046e943c03c95cf579a558d1bb693cd74241783248d48d1781af17 + +ModInv = 43c8a107305a2d291c60dd75f33148868683adb9ca63b662984b0d662f3d854332fa6fe96f33f81cce8f720fea08888fbc52894a420aa0b3aa6004c21899e4374fccd0ecfac2711bfc61fe1e384c01b838b7d9120aa0ce902f859d04834996eea4ea049a0165640328734a4b569ae868067cf54456d34357fbf2525524381acd4bbe20a53e657354535a0964909bca9f8525b57f6843be999696e11c9424e84ffd4e5beb6145f65fbc51b0355921453f942bd339f851633eb7a43db5a87d0a2e747c8eb3 +A = -571f0b1bfef723e993317303bb9f86041a769b03f84ee1094ba4395da076147036239a9af3a899da936cc3f5dae4d79c96792792b8b0ef6299ad909092 +M = 5fbcea185228783cab2e12e801995e61761bbe8969c046d87f57459d732e0c4c28f9e046687f44a94cfefb643918c2242f21dd9eb9fe0f0079b8be2b002f2f4f16560605885a54b0cd00717241ad7fa244fe5ed1b9157128151715f2e179db7d2fdf9b7b72dc54192addcc89a491b970793d98a90d14e05503ce886d5cfa29affc2fb9ebfe6b59342e52f6ec87f102f643fbdc456400f780d6795102e1546cb54f9e4a90022a60f23f591642574459bc1730516852b5fab7cb7704dd09d8480c487d6081 + +ModInv = 3223853a5a8507d4da6e871e084a95aec938eb5f442de7bf1f7e009ede908eb70622fdd5631b6d909fccd45eafa07fb03a19928ed2edc527d1324d2b9ccd615091355d45c93a4894f5f3a277762ea31cfd47a642459140fba4854fdb0830e776ad80702f65ad1a0f821c112f2202f71e5fbaae4e7097416e0c70e3034a53c4717e8f2cba4d653fbbadbff2d8d4b0f0a87dee6056fd1ac94f83725372ff6bcd99037ac3b9891a71ab3cdbf076d05599198ea2985ff195b343319a86d0deace70b80b466 +A = -22665bb397adc6345d0060028d8a833faf8648ea60ec664c4ee988d0c118a6169619868c9b93509114c0e0fc3c9abd96922cb9ad00bf825758141cb673d1 +M = 7ae9eb6ea9a636d1467eb465323a0c32d14fc2c887588160287f84f0434442b7f06a0bc554f109bfe8050e0d47b3c6f12fc563ec996cfe11a2fc924f3bba871719c00e8e01ca564461107edc36049dd6a9cd8bfa8d30637ef4c36412bd5eec212427e84e166f16c64ad6afdaf5b9845cecb6e348bed6c5acf0a4846dafea64215e3bd34c5f3e3ba89f7a367773b57681f72cdf00272904b49d72a240704e6a4cfe3f879813997f77290af7e595f484a9798440a0fabbf7cea5ce6612941eaa7b33cffd + +ModInv = 396bae1835fb1e759ad86a3fd2abb1a2747ce95a8f2f2bac1003f3e8ec1b3dee19556fe8e79d893fd75714f0ad125cea982d3192aa1388fd6b02176d37cda5e53d5505dbbfaac3bfd53b910e2b04c044c13d3e1a3d7111b7c6db10d2d529acf389c7d7608890044cdf1d0bfbbe30b7b1f441b41759b1b383d53661c2dd1ac28310cd709c9284c1bed71eab2578168f8aabbed1ff29c963c1e79988dfb1b2331fa9cfa3947397560ab401dbc76d828b2a803012cb29eeb58184e63d81d8cc1825634bc +A = -3c9ecc3f121f494d4776ce500069f8a27abe01a7552b59fa508d65d5c7610681bb8e149636f819996d66ec005ca9de7c55d2dff8241ec73b666f05c8756 +M = 58486816478fd9e1f8d440829387f4d6b436bf346b00b323feadf05170e79139626af84926d00fb934bd7b0965ef381d2e60f42b9f3fe61ceca50eac5126b009e59241dc8bf64ae2e544aeab859bc213f32753e0ff1c132b89b9eb499c1ffe2ff6c411ce325c1c3fdaed5bce81959dcd1d06f4686581cfd17d6fe6562824fc681ae93033d2aac1400d29d096f3d4927559f6b38f3dd3a362983414261c3e1c1cc4dc97d34d63decf4712d83aaf76cf2d5d08d0102fe7c5c5373e08af336bb0d6ed3c5 + +ModInv = d85c2fda98c6466dc1f19bfe113287d991a72b22ce5695a1df1e6db2c876633dbd1ea5304856ebc03cccc4673f13700794a9e161b69f958213821ff78991370392a359fbef04c77ead9a0e3a17b470c219ad1f53a10cf76dade766b647e8d941ee890ea1512dc13fd0325e3182299afae10ef0acdac889388b9fe2aa19c3ecee7924752b08f82a44f26e5cde7a9f76a261230fedcb20af5c0fbe67304be26891077020545ceef038e6cee7c3dcb14700116251254f7941b0ae28f92060eb3ade9d9 +A = 97288c2d9e94e7b559bc31efd76abc819ad3eec3bbb9003d9376fba2d419ca516775e1cb5bbdf1c40b639f1f1bdb22608aa0297393d859f64ed094bae119c2 +M = 63cb91e135b9755cc2cc42de13cd38a283e685b4f9d9ffc1043e3670b1f12ffc5f9ea197880389fb6a1eedb3ab0ebeee40fc4f0d9cc2d00db7e29bb89499b228acc0aeb9d3a9ccdf8eb9804d5ee9297bdc3be4bfe000387727153bdf50bd2cb50a398f98f70749a34aaed912b3b0c230894c1bd4b4423a025c860b372136d74a9edfd4d72d4cb018211ba8f471476ded9a516073994952113171cd1d817de90d6447eb216e2c823747f7e57f5c9ad5ae3a032484596a386c0067ced527859b19e7ff + +ModInv = 6a42c61c1a50ac7a6893d926e4fdb021e9eb3cc30dae6696af37f69711c012150472bbaa2829f8d2992148a45dea58ad8f90eaae4716298ae9ffb899cb8ac135518372b585bb20411b9f96d172854beba60c5e99716d768fda101b495010fd70424014f1c3bad02aea954b2e6e5189d4ed38055bfdbbb8b5edcc42db34cd17fb6561615ce193418be32671e8ec4f72577d97659aa479d25d04c70342e44886afeec34a55ee4a46bb4944e6b3aee37b11db418f6d22b6eb469aab4450091ee7ecd82 +A = -4cc911125254dce812ca8f17d0e9381a879f04a5efdea53cedda3e48b038de328e64f0558c073a285d1b5bd54b1a12ba5de1a7f517f57199132c8043200676 +M = 9ee843e312a0fb28527035cc558cbe6c7c65f96977db041b1a9443b389400ab6fef79a0bde4155562f19d27d2df3c0e4a0e0bee7d428aca4bc8c34c8ecd1194d5109cbd648ae9a0fe18959259dd03e6924ee90dffce785f400022da12052af74058fc8cfde2e5d374eaa25c1fcb30c3aa5ccdd2ed4f52dc7d893ee940e45a4ef6e891cb4a7240a9fb1dafe63f0d6d87908cde061fb6b494e68e0764b118db6b2b343faa6dc811adb8f94d0e0509c521693bafba7b59db8484b44524a5c34806248e7 + +ModInv = 993ae9ce38a047b2914ad607dc92fb60b232d2f772efe5fac00bc67b724d15dbf304e0b208d831d321fd51f4db4d8e5a0f097acf07cda8d03589c6c986c2c31b637c12ac58854a74efd7d70d665349d9ea7a9c390d2dc1eccf3a99dd8f7bafc5c276995095ec2857d177a6729a674a8c3fccb4e544647941fd8ecee3da8fe14039471f11341de41d107a470508905adf4a7856445eea1d349b92edc516944a91114f4c3f913e5bc9b7310f826db5a5e46ac4a35917ae2ee6ac51a7bce3471724ad9b +A = -f42090437742b8984f194ef0d12b5e7b710eac9965fe9703ca96c56190571dd6e2d2315e8e7af23fbecc043f6f51bece4b3b709c66351b6a7d75657b67943d +M = c4a61eb1cf2d6bc60bb213fcdb1b4d311235648abaf357265cf65d0fdec9c24cd0da838266ee5ad249825051eebe8c4355c1cab5beff3476df1940868d791141c53d4e71f35a8d1c208fa0c61e133c99dad7fc1aab13392ace3965a6e4448d0ddc92d8d075348c5700c18bfc8f7167b6d5b24f3320ecec0e0b151b0087c1282bc8f88d0b0196c6c98874ec3da8735c45bc5320d0ce13799b9260739bd98a733cf804e78bf9ff8b3cdc09cd2d54809cabfa06a2e625c420f867deae80c385d4d56e48 + +ModInv = 12abb940ef9e0c27d1af2cc30bc23be679bbdd83d4c33c55f46d47ea268de0e2504e9aaef1a3a5c32f00d3b715b58b0c7455b734cd36ecf4977e475eb0bff56562d9ed7927e4c63cc269fc2055f9c412e60ecd7e41c6df2d4aeab07ecbd35faa409964c2eb1b916393c55ef926fd7ae717abda7418b579dd6feac9dbc1c66d6f6583325f472b76e9a523f26cc0c4e29ad9130b1a0c330b3f0eff78c04501be7e26483905344681b9625aede40acb99197b08f1aec00712ddd1e80d4246beb3cdfe +A = -8070cd9bb00d25225fca5227beea483e2f0d97a626f7c1a20cee3308310753b7d6fb9192c0a88d02032add06ce3d9f565df1b0569224446fd2c564197681d135 +M = 2c7590953366f90f70e3fe28d219244d114588b34f120d7ff98210b14df15c00cb0eea4193ec021068e495f8b935be87fe03e628c62a681cd6bac8bd1babc7fc95e516668e1571c1cd49638f9fc2cafce47280d84bba295c07d5af3d410e80feeb1e72b0906a6034c91dba4818ebf9b5092f9b62fd25588600d33a60b983999de74ee8f7c9682cb9c53d9335b4ce5875fcd5f7194e086622acaffc7122549c4f471b13ebed4cd2f025cfcce4998bc36a5e93e357fafaf39b0aca5bcd5f9d8962a9 + +ModInv = e75729e0746d5be55f78608ad103dde1ba4bc5e040f17e88886f4d25b682d6348dd0a602ec812ae8a4a7db4e0d5cf219bd7191ab073be2e640300dc907b97c6a7f17bf8681d72d91c80de5f52dfa420f957f6d8052add613be26c89801b26094f85434fc9782768c8b101707a992b5a1f373f8404d4448adcd9ce54cd4360ccf26c30f39eb0bfe90292b299f9d6a1158c0030074ed75175dc1b6d74bd820078b6a95cb0be1058741ec3235199cdfe412b531c5ae6dc0e797ffa9432faf4ed0ee1 +A = 6826d0c50f7c6c6f59aeea4ea50202df88949dadcb85f68988a38bce4b3c26b478656416b39f77cd5688d53247ceefc74ca67353d824b44b41c156cf264ca243 +M = 3fee98c3384fd8e935dc2f5f73d28289144a8fdbc8cbc9e7314cb9a04361ce0bf40d9e40d2bdf09eafb90c755efdc4e567455b231bc6ea2a69869d7866db6681d9c9c18713fa1d12dee3db5a88c56aada56e77cf25c35cbde21f3d1c053688c39b24ca75ac47c8d5e34bcb8afb05192ee31f1cf1ac3fcf3c0474e553dbeec7ff268d3daab3f7d1a84f55592bd3d7712198e436f226bf146a411965511fb8cb8754a63d3d24891e15d797f2fa9c6787ff819c6b3a21d7cb9a98d1c500f2f58a6535 + +ModInv = 1086403b3d886f47c25481d36d6fea46e08fcdb7931152581220bcc96dbdccdf6c82c39160514c591a2975587dafc6562f9b09957e7083c7e74fb001bcffb117eb167504a97caa03ec19614ed75da9baedbf43c9ebf3af4e585a794bcd688b12819cb117593ae25fc1d7f8edbecbbbf3e54299a17bfc86cd9718cf69decac78cae993db34579fd26646cee9ea5c6d309db0484344de99edaa4b219ea77ba2a34f47afb6249390ead1988144bcfb317f718f01968ce40138b8daec7da97a59233eb +A = -2c5134a8b38ff380e3d527d18661f745c702c7ea3c691bcac91068204518d075e27e7bc26a24c41492bea8ca6226c70b44af23df7d89655dc8a0c5b7c1e43a56 +M = 8536273665dddd0984c307ffadc4825eddef122f241e5cf6a25a0be3137f1a517b985bf90518a84a82f46bdb28e96dfdfea70202e17625f7c7b95b85b8cf7c7a218bed566ce34253a3ba2441561c988b4406130b8495f23c1837c85f1207b22ec32a92e6f6c0c9c1dfa6176fe5db09331f33996fccb85bb4482509f70c9f3d7b3c0a607e8e209e8ecf61197cb5db572f21a76f0de5cc01007f067233e6fee3f39c1b6479fe245e2c9d7dd1cfb5f51b7949583e98826d20f979aa7c0d2acb744511 + +ModInv = 8381fcc5886a9ff6f52afc6b0631e3393905d178a7b43c863572ee77da9fa2a4c85396e199c8d3d6cee304ed60384295d56864dbff685b48dceacdfbd2008f62a1c16952d22290b04954593b550820cfa53be8095028633031590b415ac76ffa225bfad990aa0109743d6e97da6161c35f0b5468004d87174ff9615481b749f99796d7cae428ecd812b370010e0b22cbf02b3fa3816c328e6d0d31a8db1e1e74e8054b90f14c3e3150d641ebc046607cde846e926b84c8344cc6189c4db59bd5 +A = -13da59d843dc6eabd385c88d92b6b8429c85210b167d1bcb29fa4cdb9ed6ecfbd5ca1bd356978ff81e3bca22c5499a1272453562e70732098d091fd7a04dc5434 +M = c14c52854e54299772a307f297b0dbd6c57739dc24f7f9d0d8400971029c6a02d69045c12d6b0c6205b59cf88a03464d99c88fa7b2d1fe6b7e48fae3b53fd9e9732d25852d1af3f5b719e7f65cdd35d8354a2ccfaf47f8ed116cfc343e2458660565d6e8458d33baaa7db45499b4e8c3da69e8e39fccf0e6185e9007d0c0eb22d674adccd002cdc2436d0555fba6e519e4ba7f4404e50eb7b64b01675b8d9ff1855fa6c41fa8e4016918ae3c8fa7dc757fc1c99b196eeae1bfc10ca2d372323b + +ModInv = 2f18e6af9444aa9ac8dd34ddf064ae76c260dd1ad7f38933d0418ec544a8e30ac620e8add4f3426429f35fb3418a12065a4b132c3ede523dcf36b61fa8fe26d217dd88e1e24315443e699ae91f9580b7bdf0dc814db4c7e801d7fb8a426ce827a3f124e8313f07e86bdd9c529d86bb111aa9dc1214ad3be6d23820a0a09c20455cc4f924dc932218c0d9e59022ea6bef14adca6699ee712868cda53fb827743d71a27089aa9c13b153557a7313695e5938e5b59cf0e33e12936c02691e68200b +A = -b52e774aeb002f285369af9562f52e36515279f82a497806ffdfe11e83973d4fc16fb236deaa36ee312e71b22c9e28bc14fcaf42d521bbef6534797e7b0436a592 +M = f1712efe3f445eb53f18d44a9cd9ab3b79832cdea4a9b7b9647a798327d0d09fda7dc0028e4939bc23615f20593e167db5a726186ed59b9588bc95d6099ac2f6966e3fb77d7a1bd03e55539a30fe01d4108967deee1744ff38a98c00b97ec16c10f80520934ef0710cc262b82e871fce2599d973b7ab0a1dac03be70da513b05d7935ad0cf8294895d77e055e48a8c0df5ebc6f01bea80bc81d519202491c6d98c712b94013c5e8df1f6218a6f6cba9fb105e86fd252209dc58d29ad4bf97451 + +ModInv = 26de145df06b771e384ba2f587fbcac5877af8584ec74e1f136c90de06f6f4967439082a370fbe05b387629d413734641f840329f4a8df4ba148bef14aabc2044da1a1e9c843a85c5cb63282712809ce46a84895d8102079ad3344fa1daee2bb6120350f717f2d4c2ba9fcd656b0a67874aae839ab4f6b2b128ce12497907f3b9f3bcd7f148fe33c7ace28c882ac2f8fde5dcfb38f911b31a60f74aa26d0ea526621ced220d66c29367d3d8da41f6af3a9b53f40e226a3c55af4141610f7ff68 +A = 52d2ef5ff950b06636516b4285921b5d4b45b6f25d6e45cc465d8bc334a59cd4fa6a30fbca699b400527cb03803547cd5fa7668517a1d19c311c1ceac55baf86e7 +M = d0c70a8bd5efc3615d70579b26b9115be1211d11fff2a61a23d5bebac47146452eb3bc32f6603775f948448a58ea408f79235f26171688ff40597b6f34849e0d2d7d295bf1938510e14efbf59feea1ee84f5b1ec239ed335b21b23e71adaa066fb7ec15a96a8a93debd4510c8b08ce1f63bb302283bd3a0068d6f1bf8037636033e2229635b527a360068ff049401e515dc8e3f81a1d7ea0d557d077b434c9b01d18b57de5d509d3ac7242d1ec5ff7f102ab3cae4209519bdb260d017b081bc1 + +ModInv = 4cb7d0acf580dcb802d59fc9940a5f98dc6e85071bd1d13a5fdd682e0a0e8fafd87cf5e0ade6fece2d1c7905e1f920e2a9c03e837344145a0ed7a1e6138d687e496a281a89de914b74bf6c70af7fff63da01536553e123cad85df93dafd390c306b007ae9e544ad164e0aa469e74001cf8d7d4f0b12b18f612119b9ba77d14764467e13bedb0e2713ab0c3b08346affc9cbeb66a0f831e746f2644d9acb282790630ad4ab73899fd85dfa46f9afa2d22148fe3dee1ac95e0af75abb038c62e +A = -3f143549fe3be2c3acc46aa5d1dec2285ff2e35b99f46f6ea19b728eeae62323e9e9ef9380d06720af1b6549dfe2dcf890a4ee8420180f76c0e3037aaeccfb7d107f +M = a280f6910e5777fc7a8fa5f1419392b1684aa3631c4515d08f9a6ffebd1d176b88f28fa513381823d5e1e47828c9aefb60a8bb2738dda8da477cf08c530653429c66effc60bb7fc76d95c7c0296506b220f3fdabf860821cf03b02f8cbdba6ad36edfdd7a8be52f19b50b22ac2f5587fa8405c7a78a5062fa854cf3d72ed1361737eb80921de3d36af7aae84183ee05371118a5d04903e1dc3ae06d1715d5bfbe2a3c9e259aebffb42fd2f6c786ba29a3d432d2c0225026ac55b6062599183 + +ModInv = 38b82bdfad01a0ac5aa20a0b2e07ad6b286cf8834a7ccff613f960d56f5d4003c5aa0ca34649ed69cf757b7c8c3946d5db772089f8b2929e810508b4169154e4689bd2e4d2dca2ef9a1419e282c4f0fa5e03ee1c8c6f56048be49c175a7cd5be79a5972ac0f7f6c13883664f89a73224fa5004ad6954a9bceef2a9e2b5cb10356863f4ff2a0d2f9a468736f5e9addd3a4f7caecd87fd86d174f5fcdabb5e841f87bc181708f11c70a4a754dd7c4183cc9bf89787eb835352dfb8f169e18482 +A = -f8535b246f35de30f5385b0d046ecf58db822d736535faacd706dd88272dc63c0cd6b66cb7eacba3eaf468d8fa9f4056c2b44f0f8fecdbbda10600179ea0198f7eb9 +M = 88d63ae9353709c2a23ab0267b952bc32690acd2f4be177cc5197cef45fab3d6a34cad9e981091d28c5d7b1ec720549558405d0bd62c550bc06bf78b82bdb08dc6ee3f9b5c55e20fad19bfa8cf45d9567c7e58819d0e0c1418a4432d2a82180107864f7a3275c6bb3e5b19460b3f64c9e16cb65195e98c63f93969da43d82f142b52d321a5e03fac1f5de7565f03882c8bc013bd73f1a96bb89e7f095cddc920dd0bc88d36471a4f71360b459e86035260a73ea6bf38c9d2e1715219ce6a4b + +ModInv = 17c698f6330b558217f061d4946551260c25bb36cba2cd035ca562574872f884fabe3c488e81429e207ef6dab5b47b6c31adf1399d4f81305ab0a68aacc31758bea84f4d4195eaadcfa64488a87f799b9f52f3079eff2e4abd6f4304ca0b007dd88d7a30b55597da2cf65a27c4f22eb6cceaa6b210b4dca1b0e0e508ea0430551ecaa2abd50863a421cf46ff6c27cfc7a616f1d95784a7c6218f4509737d70d2f766b5f8661a1f624cdd681c5749d53bce5015f4e238f81ce3516647ccbaf5 +A = cf55849dde0bde4a6c01e29f3fa48814455a1723c411bb0e0ad722368f3f0566ddfdc37ae8149c436d2cfb6429a4db0d85f1c633960a62dfa8df3bf40ee4139ebba8 +M = 80231ac55d6cc25d9a247ec4ae7b74e55cab487899aecdb096ed0b9b66fd8af7489ef77050db24abf9169394866a4663bbeeeb99ad4bd724d6bb7f5f3c2ea874613062c508a5ef783ad63493e37c82c6f839ce12d5a87867d8cda0572f4e500274100423e29eb079276a1ebd704c7fb3ea8205680d7c793eb9bdb44f2c1cf0f6bff7fb4fdd6a5c81280185dd8711b8926d3b119238d42470e29050e81fc72d8881fcfda19a18a90ab871c5bc1a63762358916eab6aaa31300b6ba6e1712e49 + +ModInv = 81e424cd9a67c3e78b8c9c4686c889d5930071a2a5ea74a13573d70631f58417ed31cac92b632d4be8449580d7b1c18934e518fc0c7e22011f865d685f16419d18e0a5d27d9fb07672d2f8bf8f1753be73dfe7958250926cfb6ca4ccbbdc19439a2ea713dc17c3beddeebfe57beae0ad4171cb33961dc291a41f4964d64efa6ae30b7f83714122f76fa90952f05c9e5f799902b0d8cb6a37f79999e7cb66463ba611dd403ae448278d1363f6b7f9b74459603b8cc7ec51d15c602148cfb +A = f82ca5b5e2edfd398e6cd86d25e19b3438184abd04d81d75d7e1fdaba3f158b905fdeff88731a13c9b1836d42a48cfc60e8b62be81854b26f8911fee2fa92fa66e0b62 +M = 2118279d4205dfff5d314e30c3d4f75b82e12027db7bb5734367d8140198ece4b530fb62ae1c6ed66fa357be51ab2b47b831f57bb75676ecff466a63af8afe9b78f7de97d4e2da26c84f20cc8c371ed20072e27716f4cd4878f37bef5c40dac90255314768d7b8578dfef29bb41b379d207a58a8a3ff52a0307bedc4e45dd7960cbddab1de858b35588b68939cfe68a32a815ca846a028d127aef60256c1a022c0176a1ec91594e004ba24580c7d1cf6576bc0abf49c620872056d543c27 + +ModInv = 86c6bbe9903a7752e5cc8559015d2e7cd1b7d01f94593d2a3741785113f3614f4f686f339dc80e772e735de0b46fc37a6a3487b70f187a1cee08736a1241b21f84f08d45e1a2ffa1cda8d2522660403f1c2fb9d64221d1013192d3d17164f14b4a7274ae002f43a60b2d38108d6c5a0c5cf1f3dd185a9dec36e74db3c60f4140984bf7b06d488733f686becaa5e06652cc61198032fb7716fdef2962459c711caa7ba67638a6205f899d9058fdfe9563e013f0c43979dfceae1e962487 +A = 2fab165a7bac9d23b95dc4836e4c76f3a1f50ce26dc932ad60530d58ce1907dd8df85f2b00500ff3cac2a15fdd72b5218ef71a4b8856b19ba15f68f430f44d52be67a00d +M = ad886a3aba788a27d7022dc4010223a222315ef57bcea9ae37a728c94ae92d3a9756fb3374aa2886871999960e31ba171269f496eaec6949f01b91fe619f7fe568567ddcfbfbed75731aafb79ddacf4fb2c3938218c7f1daa1589538d514d364cd0b4c72220f99165a7ca81773ef9df6187ae4b7878deb2645e121ecdf5e7ceb08575e7049ea7f7993f818470fa8ac8d83c6f5e57b3ae2848d291d4292176baad160900c69430a75401c312e130b4de71366c1550f557dc24d70657932 + +ModInv = 71be1d596c84d8fa09f5443e3857106648de53532fa56fabb2d82c4efc8af029203cae8fd07f3978be118de2a21dde8174fc4dbfe1e1d3bcb57b17a36635cc08b0e9f7a40204f7a51ae0d36890e58c687975f7d1ac29bcd8a07a61fa3096323d96d1842633afb2f850652c3584fa4289fcf73c7d10d01985219b0ae529b272a4a9e3b544c95471d67d19abd3285826fc56b191532a9db2972ef63ba786b580195d9e44aab24fa5712230fe6e4230e599b8c6fefcb0a2470438c87446a6 +A = a7dcba0391b0e1415097ec6947ac7534886327c3b3ff7d182379098e6e14b789b7cc4c2c84b0889075833dfe0ab1e421391bacf33ff06db5fe04b6fd71b82360ba0ed922 +M = a64aff27263b6844d38f7ab08c2d32ce53e2c7e318f54e65a1567edccb34d3bcf03643e81353acfa2a866897187f6840e8aebd0eb76724956ad1be4bed351a709a03105cb1de196183b118e03b614b32fff2f734774be23f1dac5c2fc5fe0f07cc247a21663ae6460fd137eb91c6d41e75beba72fac291e4003205cc62446c5be419d1981a11ce028ba02c89e35ab60a247eefe0d4647ab0c96a37285d9aed73aa94e79dc40e95409cbf06d9ebff4f75c3b785af3afcd0b37daea85c11 + +ModInv = 2528a5af7ebd30da277afc0a371225ba7aa6ba92de625f4e72abd6bc4edb486c71df47eb5018cae8cc2f11490e04459eea0f505fa87c8ca4c5c6a79e94af4db369652c6d70b4a6746ae33bcd4be25b540f12ece2e2af9820477901b9974c8fd4b429404bc8976864dd9f8dcf98f4a3092da37c381e666b1b9d2aaa8cfaed59a396373352f50a1d74a7f5eb7af85de52cfeabea6fc4297043f602c1213f21f44861cb35a2f7fe0d97c6412e8fbccaf11a7c7be7ba94e7c70af78303fc1 +A = -f613db02f2674391d069367e2d21e249e1917405191a7d4fe715ee4689e1302d5296397540d009752a0365910a78174a66504627ca9442ef0c4fb76d4bf4b17b4554b452 +M = 16e6e6a1cfcc0547fd220f288939c7f95c69ba29cd504b2de04a0621245dfe4500dd1e97e6ecc7c91e4bb822fccb4363a026a96bd42e727a68196a8709ee88aad5dd50fb8cb1218392faa435c54bcbe91a28654d8bd7175b5a7d376e99747fa1b8d36b38c5eec4b5ad98de96da786e5d3672d150cf40e3720f74f8ac9d4ae7ff58e1ecb929ed07547b975749d9c443067025eb752f6a331031676db846745b86e88aab3a5b04705666bf7f883c62c32a5623c68dfdc5e3680ca1c44f75 + +ModInv = 1eca47eee9c19ebde3603a375588b93b6786642223ce7be8dc78b59fdd62f73eeeb0c11ac7c7070615088d9d6724c875bb4641029d39f23ea2025238c31bd45f920f6eadfe75a7ddcf409fdc0641610f78763f80d7ac3b8cd909403df8bae7e9810f263837baf0ff70d887dfbccf0b8c16350809cf47431366e9bb595d7ed87db528bbd00110ea8e3216c218f817a3f66940409a3acd335bded3165aac5399f6a224755defb916394503eaa77ba71e04e582949362149a0ee58823b3 +A = -99b447f6a656bc04555b448111622fc45f13f6e25d7fcda3043b4ca4fc0e0e3da8ff5f13a2b2fa12a2a48b707dabf3f38fe2c45c02b803ce74e4643165a0d0cdef3703d437 +M = 57e7de4634e16d03bcd022951f580b7de5a4453b1d6c31aae436ba7571f6e50c5ed4f05ceb81e619384ae5f0246c9704e4f4f89f2bceda9cdb12120125d7a02b09f7e8e2c2a9dff5cc67d20fe735742abb1cd24a45b3835b11d9ec7fded14637deb00d8068e85aa467e7133caeeb1b40c4fa4dc7138b825d4432ea14cd8369c72eff6b96e5dca82ff2e6a9951e631a4bb1756e8174285a5f4524d240b53b14981e382eed559932e9d07ed78e36fe0a253aa34ece16c798568891ee51 + +ModInv = 931333b868ec1a96e9786edf867b5e7ba8ea9eb9f4fc87947eccacdc488d9b77f041c3e07ccc21fc112e08f705f25419682f18854d6852d87a15f81def11f7925994659e387e37acb67b16cc8b52bccad58810c5e772a209f62e349adfaecdb409bf68713f0b3042d08fea9198025840e45248e8c7a6bd7e1373cd907fa5561d8d018033a692e88b27e6c9f40d0142bdb4de52faef4c8a52edc9ec42d5f0acf5177f3bbdcab8480996840b254e3053cacf26b38913632c33eedd59c6 +A = -8efb27f6285ab7f438f867292e3597c857212d4ebb5386c132263a6891bc8386fe61fb708c5e69f2b4be89b6730bab033ee4cf81be6520e15e658e7ae546c039a003a0f2b7 +M = dd574694e8d1903202644a00b48a153537c9eeb3dd0facb73efb0d6f731afeb8bef9a97391e6ce245ec0e85fbea75f6514c319c25309d6f74dc587cce19a36954553b4c4f028fd54f7c367eea4e4e9d554bbd4b937edaed74f068d77f63bfb691e9bb0f3f255023b38d97f7d96fdef976bba78f49bba220d0fbe2c5a34a252b8dcdceba18ed2e59f48d2563a90dc6303943d7db026e400c35d82c3ca3ea4453bd39f6504b4f33b450d9c1621e3da42d00fd8a17acc50ac905f582f17 + +ModInv = b8bd50dbd4111eec42ba09dbfc0108fb470b63c015aec156e50e62d9b4c718e8b0545c08074b375a44e0506755c29f18f9d185f13e48092531c361d99e63f9bd2bc8b7b54f9d4226d7ea24fe9b5edc64fda90e4eb9f372ae2e1b4ec484492572a3e44cff9177f4a85631a31037b9250bcd509991c275ff5e499a090576574f2882f15ca22c6283574f931e30d5dd4f907f861ee6d63d2ceb50f2d6e557cefcc6af49bb860d4e9c56f68ab48405e4094030f5228a0bbd569c1a3ff4 +A = -8e6c9184dbf4cf217c5b61c3033cb5fd2c603bac7d2bfe6a3d53b384eb730a46dd51b13e7fa462e7518ec04fb1b5c74317088030a1b7a9996841131b6fdbbe0e7b05056f70f0 +M = c858943244ee03a295d8c8f1f15e64039426ce7e8ab3c9f3e4b81ee4ea47ca372e51c1e306e8166e1bf3a487543628faa80cdc363e6024e389e15616a487865479e3facca8eda57d7645c6c19481e4eee64dd8207cff4500f67b1894c0582ed5d50c53b92beca164c80314194888411e02a580203a78a1f751b6cc544baab2b23959cf5065d6d35c4adc4efc4cdd94eb20c01fe3581aa79a6449cb352d20d48364bec63959bd2d1b726dbada05d82ef7541cb0967baaf57a04adc7 + +ModInv = 5ff3549921e34953697ced2fafd930037a6a18dde0b2bdf3bdb8121c8665bda7e679b155da1ceb99dd96686638045bab72909534b81a359c04c4bb5fae20b9cd79eb621d1faaa27ff09a0df2dc4a54e5ba2fec4855cd42d743a0c93884635139fd7823a918660e40deb08f9c1eaf61864770e7c8a3b908f68c4e34734fdb8d2dd421106b7a9f352fd8dda89329a8c8a7b4c8f52179dc2b76a4887fe9df5f39ab6386c6497a978873332bedf1d92bb9787c8ff9008de9004594b445 +A = 7342e3724e5af29bda32ba91b0eb9133fea3ab2f0588bbb3414085fdfb91c647054fed3fdd07629d410668ef80fd06d330fb73e92d5c22adb005746674e4068b95da78cac281 +M = a9331c3c3fd1263b8d6619b37d5c0da4ae70709d72d06441500e7d0c6d397a0c97db62980680778a2979676a7c9cb7352d026902be8d943a0240c106d79c43db4df0d012d2e6e02fc56e77b07d79adf3718bd8bb73d91db84b298c62474940eee56a03d821c65d463e6c1402d64af157fecce10bd5c9f06d089255e9d504d58a8798baf9a6c28eaface17293d6b6472d81860573155ed0072a68a4f03ff614922a98f8bcba0a399eb4644474ed4b85d2fff94b2ebb8a5a2c992982 + +ModInv = 196ea873cb470ead4e5ab554680dc2634c73aad8c34b1aba99db39b465f17ae3af0b7f322b08610f7daee0fc99cbcc1b04566cdf112a802c10a8973d4243c6e5d4aee1c7d5021f507b0315f7a85b04e0bdca6a7734291b84d179e7cc37ec83e1824362ae3ad0780c8eca4cffb866010ee164dad33c8d8d494e983f31959319d0d123514c7b1b3b7f8c15a9fa81720c47ec00dd6928aa6d976c3d4a393aac1d3b23a552b818cc7b25f725533068a26c371229d4a39342fd41a22f82 +A = -5d06dcdb8676e856a3ff48f3de46b612e93542d261bb009ca6482639ab5ca345db83e1fde77e601a39443561abfdef1610005c710589dd14f46d2c248361579741d983ef00d7 +M = b81e6aa2003024905f16019af03c9074c03206c5afe4a68e4161e4fec399a44f3ea10214ccfef73c136c27d8c6310e9569cd3295dc70e6c7e51ba710a4eecd155f7bcec3ba67ec6892a971453aac6f455d094cddc13f1094876fb983d6c2c52135fe9078fccd45ec2b5685806476e9fa94da992aa95e40c6ca726ae22f22b33189cf1e9518165f15b6f0ad7bd7983b96a2bc28efd4798a30ccc3400ff137daaccd3a384a11ad6f0ce23693293f53e8de232d39d34c407311093731 + +ModInv = 12103ad6d5c1e109735e1240fe6cc4eff5ee16109f0b2d6558f9e5534d5be68b182a904a7ee724a2b9d7056efa8cf107037a23649f23952ad27823a14c4c64211e84d3888e53c258de856cb1a8d1bdeaf5f469d2f1ad63f821629c14e44c031f24b062bf2d27861c3b37c35b747a1f99c7ff86e4e78399c5e9a78bcaf92419205b4001ebb391bfeca73aeeecfb0372e2c36ab78c3fa8c35c4bfad1024bbf116e158beabb389d592ab5059ba87316d6803c8d5256aba5bf10c69b +A = 3d8a77ed4d6ef1e3b57a2b3d92a0eb5a5edef3c9d76afb6229c7cadfa2b02f946b0fcaeed74b21b6c9680800f87321764f1f2bbd2bf1b779f4d0930b56dfbea3717c62c2c007e9 +M = 188a479eb9536d7150f29d14e29a37e7568952fa5d21a016e4cf78cd53edb27cbe852d03632591a717daa14053d2ac0332bbe2e96d4dd1ef5c0ffbbbdca1710523542b62bc5a16839767948c7dabed91f1b93988d2e5fbc0081a730a35feddccfbd4480ee3bf2d612a9aa892da04cbe2ff79983cea4842f3751a11e811d311dd41744d28c3877f2a0674e8f825b6afd8c3c6dbbdb9e5232a218ec2d7084d7ba2888f276fde093da385716caf3f521bd11f1a6cf90ecc13cb8d02 + +ModInv = 94a4d41627cd98410792b541432fcd81f2cc326308a6e7ff762a8a36bb49643c35148cf8d17da08464742e01dfdde272bd72c23fce422c99339f633c25ad23f6d175fc52eaf54f98c77053ecb76de9ad15cce754186b3935d064fbf24642cff42d5763b8e55881ba8d48cfa1cdec94d3653f68a004a44affcae7dbda3acac74279d5a3339ace4404f756a755cd1f978091c4d8fdd61d85462380fa1c3eb9e5f7deac9bdf70396961e94aa3b9f9b4af75af8f7f9872f0b1e83b58 +A = -712176e2a0808994f3b71bb5982c99cef2c6aa884b6e34c12a80cc59666d519e3921b4399427e333e0e28e3300e9b44990e9468f70ce5f2de946593251b823876bd1f597b28ab0 +M = 97e94ed38f83877df7c51fe369354891339df861dc3514215915b2c545882c396dcc15886528f0eca49fa18b5cac1e46935c47d8acf8bfb2b8de356cc26212eff41b33c71217c45b2a5acb61e1bfa41b1d76725a71ea85e66c2204b785d7fedb7e30dd2202187e1be1e32144a147d3dbb2b9a5e649feebcabc2cbc5e528af7220213b04a0d77886a348cc9313330c70734f7b5ecb72a9d5317ad131759f6025b917182ff6d926f0acaaab87c391a35338a3da074920a8e4fbeb7 + +ModInv = 50cc6ddb35994d05cadfaea216a4e3ae07719730718aa2550368755845c0bef32702d3ba34248b125d48893642ab96fe48bc994f24f7dce3de86290bd6b7410b1a0da89ef80a076e7bdd7cef6eee877179d06482f2beee0fbf54a7b2ba770f33e6edb99243b670daf67819f218dc058dc860eda8e37c943b34e4defaf58aafa093d7391a26bdeed34a361cbefed7ebcd2d72e61ba4800d1157976e495e549b80587129c03baece370ede2d85baf07d81b081950058d562eb49 +A = 189e9f4e931e16e47d2b6ec5a9cd02ea1369f7e390c4b0f843dc7c5caabbe970f5da37424387377f54e359b70f6fdae055be4cde0f0e053a89978226ec50dff4dcd675e09e818aeb +M = 6bdba8aa0c921f58312cccf494531dfe7a29a14b021c121b6297609a9bd66e590518026c96245aaf27e7c3dccd3bb7e73d83cbb0e3702183c461c3a75c7fb5b02c8c970f1018775243ad698c2b34ac67505799a51e2ead7f0652c0efe159fa54e8ed53947d06d4099fd7546dcd740abda5d1e61a7a133098ab8f060d3ee5c1fdd07f6ba37da1be0a89e531d25722e34dd442dd2a3c05c49c8d4fd143b6cc34d97d545bdb00c8cb61aba37637a32cc1954489d099f87f8c115a + +ModInv = 8380349874fb15d99237d496e016cd8ccb02d481df08549418aeb442ebfc38bf1d7e87cd723da27f19fe9d7ffead7217659f08618ae02e189ee0b0a3ecc2d153533c2daf7a4f57e80880cb023eee84acc0000347a45a3bfacc2e39e903ffd2bea26698b9120ba4d9c52a8f864a81843ab59dff85fbb3bbb48ab6da699a090d8e1b6c60dc2442637c4a6a0644d6c8deb3bdd78901fd501789c9ec74eb5d2e0d78c78cf2985de4b4848271c3cb5019c5e0243856d395569a5753 +A = -4240916df4f81d15cac732f5f10ff8638f0334b3b1ac51f97f23bbb8bfab312555bcd7342e09b8ccf6107d6fe375f32014d8ba30cbe110454f480aa03be0b4233da4d3a1384d59d +M = 8e641fe97bebc5129cdfaa8ba7c712306ebf6bcb57e1f66ba540a095346f791f79510c4e2d2be265f13c05dfa7fae9313f5d8be66feed9e63bb8ed59936e01be9d91de488c02ce7e3d9655ce14b7ae1be7442c552931096fe580e85f849636513efb7a5ad36d137c2700e704ca87f8a27fa0e0d54bb0e66255efd973d0f36bd7fa571a8a807277f0a3f49c6f9ac4656590e58135f3b65d15f20232a87eaff9323745324d9653f758ebfe3c21f112a338e7cb3f3ef965a625b3 + +ModInv = 217b5c109bacdc39d2730a50b713cd73f8b2749aa560d13b5cec50a85430600c423069e13598ec6fe4f02742f90ca198c98d7cb6b28df87f500f0e3624c3649f429d8008636ea568e67dcca0aa5ca74b4be8837d519cd977c5472eb4eb3df291652707b5fc5ca5727661fc62b0513ac5bff8f829ae2dbf95e99926dcc2863c256f13108c19882ca884d21748386beb2eb34bbcafd0bb02cb0dd7b43ce7e202fc26f0671079d0ff43b050a661717a4620af13725ca721b367 +A = -abad0a69fd417d77e7df0e1896331f801b1658c0a2e894ede387448f0960ea9ab3566f0bdfe813619197cbb832008205ca320438b47d5413f0ed279215966d604eafe51b4ac3abacb0 +M = b1d59b8282071b21111ce95d45e0401f4f8311be6f58ae29baeef248b7e65354dabed2b084c7b96fa96e47b84f7e72506c2df7d22874d55fd41a24cd1b4fdb6a4ed68dd57ec33a067cdf3583e8301890cfdf5ee8fed817807e85b1788134fc1224cbcd6826ba05d6c566794f6b7be834b26cd3645a62a177357265a19652b88249d6011f88cbd66ccb64873650afe77e010871e9eb7fd6a4c9a93e1f27197ca0a911331543840cfcade3e2a5ac270750d502404f773cb8f3 + +ModInv = 4b0fe28bd8bb686d490d21c663d517c9695ba671c4321056e76a3b281785d08761bddc147e449ff037740001d6476e03422d0df8f983fcf0d1c95647114ce025e3e3fd685d16b37104d5c27542a3a709ae32a1368d86c45bcc6e4a9b8cbc8b8708e718f9b2edf5c57267a8f11c04e2fc858fdbd34bfd5ed18669b2ecf2b786d3f5d470d9eebbe530486218695d74ee58b0ec073c72cbf72939edc2567f3008de0b2dbedbf68fc930e35848c982d40e30ccd35e4a26eb5489 +A = 66d0d6b615b1508fe03e4445b0e8f492eb4aa0c71c7f5a532a8a3dcd2adf86d175c5218b13195c36abe118e7d66a6785ad76218e10579cf38d147d04adb3a31748598eb1946441f9a9 +M = cee72f474aa0d8fe46e1d1fc6d6b30d87fc15eb885ea6d803ef9286cb4bec0bf6c956b6d3cfcce5d840b69eaac9609cd4f808cc75a52552fc0e9fca8d0f54d69e217cd4330851e844428df8d4d9ada1e314eaa25f3ed7daec4a275d8f62b7186b079abff1c2971a8a9684c473fe596a5abc985a7c9b2048ee05be4bee3d6cfd2e52c3907cdaa4cae90ff1133f0be8a5d6d8208eb7b69345f3f0fd93cb527179fbc89e0878d5c48cf08c8efdd00d7c0e63160f385b3ae27f0 + +ModInv = 26a8d7e09b49255ff0332584c9b4b4743568a3866c551907e15e62b81d2b67a315280348add19170dc4d45bc7d57b6a054ed309fcca189d4000bbc1f07b7175ac1bace215c5d74d4a4d50ff3c3dcec2bf37cb144819e7db279773dfdd8d5f89e829550b3de00fca37e281f2781b2753613bd474c6eea9765918a69d9615a3263d3248c4d641f64a27ddbdcaf55d4e3f569ddf1492b5a4d3e347af6f82df2bd902da6fb38e19a74ba0433358256409fd5032f03178d227f28 +A = 9df0abbf402a33b603a408b74bff124c6b17f27943e59f578cd33f68e45dbf4b09960438c95b62177165b169b8c6ac7237bf5e5959928f5663abad52b629d7eb8e4a4d769cc379e603 +M = a66cb9ae8a56956e46c6145c2e286d3bbe3da5d7e0fc38378614c54e9c7df7997d78efdf3b2e16af2488067806b3af4953b32cf88241b71303196313c196c54ee0f68b4ae49ad089143edf668acd0b3dd79a4974ae9d2b6ee263817b5e7e1f73678f4268123637e38adaa5dd91aefa7640f436dbc204288906110ff2ccb0ec41abec3eed53f94f5b0e4d2fd8a0b76ddf63c435f7bb3d9f0c819e916b0b4b25e4f01aa4cfe23948ba667aec2a9bcef56c9a1db428587616ad + +ModInv = 68d84dcbf75950425b862cfd237585b2e57b8c4bd6f10a440ec981290eee2cf4e8b4a8fe1ebbc6b268e17d11fbba650bfb8c7978a0d168437a5d298b959ae28ce566f727b8b6f1c0b2b87b07d683dc02eb68ab5d5e06da1ea4b803725fb233153f316a4327b1bbb99ff07edb05a9aff1aec15a3c12dea0e15d565b323f45496fc77e8c038dc0516095db8fc4be5feca36112a39c4230de09ced4de653a181ac697768fb78635094665af8f425ca256fde7c1cbf58dca9a +A = -dc157075d817dfd2a1e5d3d36b669f611fbe953c909e3edfa68ed505f3e3181ab10a15313c2b1e70281a9d2b6db24bdc2edb7fa99ef4136bb68924c72b23405fecdcb4ad1a1c987bd4da +M = 81884da2fca8ad1b086cd324b6ea985f434b948c98050714d9b54d8800cc5f1d867f1ccb9fe2d0f5a22cec5bb99fd3b64ff4fc50ee24130f82d0cddc74289c63e60b4e84a6424b94f0e759a8bf00bfa13ce826548d311e3b0546fb6df76b09b38d15687c8228210bcd3640cc853ba6ad14582e8e54e9329333dd2166683164a279b9b47057670595f95963f92c99c8ed31224cbf5d4b1ba7e1e1d96233b700cd70740a4452bcabae0a3d1f3d5892d4fcb2d8fcc0fe4af1 + +ModInv = 7c9f5e76431d5ea80278568a84fe2bbd24e48bad31cb554484f838595cfa09431d0734d6eb4be836ed07f5f28a1de676eaf30b0b65adfbaaea2d294a4f66009374ea204ca5b5c3d0ff9eb4a2252f5e6205f39a8520eee35371a8278bd7d6651f6f48b15ac9fbe434c7f965705c7d4ee65415d0dc4a2f55e85739be00aea600e9d5c8cbfc71bec45eb076559856a02269e8346e6376e47a202a90e0df5762e003a8ee8cdb1c1dc6b9e25c451b42c8c6d4810f6dda308ab3 +A = -476d77c866c94330e78b00eccfabd31da42e37937e5c697b42337fce7626c3914cb08730b7435ed3d08a5b277d349f3ba3fc701f6af7303f1e38e5266cb8b8544e081609b8c10ffaedbc +M = db9e1791cb1ed8dcaafbefd9bb2124d58a7210fba7baa5cb31aae997b50ae77670a266927196b9319749f86630581c0f41056d771ded984c5ab97dead87f4b6b456d2062eb724d667f31248380a1b177ae469afe7ffcc10df1c776e78e318e94945c62e35173731591865b6547924aa2a2ee8cf0a5f2b3d689c2b789c9f350c6f2fe1b9a8a6ac0a4c9a8208d51f2878629d13dbf765f427fd815892ea158a5f8227bc6d663e98918a04d7f37c9820def2a9a33a1ebff3b + +ModInv = 188147c084b230e739380f8c60fb76916cb9a148fa8d45cfdc1daa92e88e9535515b8a8d79ed0ca103fdc46c768771bca5892d71f20f5956a1ca63ee8e2fd88962e4c72da8e1d01d74455544307705bc2084057521cead33e404912e4eeb37652de8a6313b41d7d9bf0269440e12202a3f95b51dbd846ff0e82ab83a82a71d0e893dbb29aad44cc766c2c2660834a28e1777f39bcc8b165e4a00eedf558433c8cd2aeda471d5e45d9a97f0faff6a46bd8298aee38dd7af +A = -1d31bb14571f4c5ca14882ced9d764f7731c0e9046759edac3453449fc8b7ac17bbdc6f12541b0364d861213663a5e4cbdda9ae14167fd133205c28575341e018544460eec4abcd00cd7 +M = 2260bc2df9d1199d1e1ed72860315232b917e8bcbb4091fb079ae7723129513fa838ec0a0eeb0e5a2f523120647e3041dba78a2d94c4b221bc38a661aefbd04a35e7dde604b74b91e4868ea3e1a6fffb9b794af16cfa98bdf6cd4aac1d63e2d97b6053917c2d13bcaf7ed01239049d3fc3d5316164e09721b35d44aa748381af97045ca6744b2760a123b3267d4e15a88ef06090ed143c98b91889297ff971f9e642c39ec09e5e31bbd5e974bd6c217783878b31e4edba + +ModInv = 114fa382e4d51f46f3d1dc04739c8bad9049c2f1a2c17f9d35d940d813245b3a51e482559fcfb7b2b3cbb6a44cb7ff70b7743702ecd5de20789fffb65b258e21712b70f41793f6c7a8118abb6676df59b336419cfe8dd31e165540a55161ceb246b7f0aca7372c85132db88931a6e2911d02da6712f064a685e3b468f02aeb136287218e4ae82b2d39059b6ab17252f33a9175147cdffd51b6f21e525c3f47cce1f8bece341e08213315e4cd869559e1a77bad1fb2dd +A = -9f25566ad97e62a9f5008ab7e9292a62d07cf4fbdba766b30a46bac1d2214dcd8e2d987ceffa35f7bf8b5aabfe592c159c8720c8fa2037a8306afd5831cd7f5df35e7850bec41eec50647b +M = 36f668fa743705bf07a111db5ae47d2221d9cdf2bef6bc2175b71378d6dbea155387a8e900aebd13fa8a0a8ae68d0cc1edb30b2cad876def94ab59a8c58e2c5bea67be23949c8102da30442cf191edfe1dece628a34003371046e9205528119ffc24d70937cd198272d8a82a39bbc2cefe27934dcdff6bc27837153b7a3835e63b6ad454a4313690b638093e19c74646b9a3e68a93cdeac0d41d60441f61fcb47e6c27b773432d663a39014c7132f773b615f230c19a + +ModInv = 5f8575764df6c5daf42ece1bfa444bf859fd0e12baf96d3cda414d3b6d353c83f75ec7d257778275c7abbf18ccc4489f33ecfcddd35a34393fb252e5b02a794f14a7dbed144a872071c8b20a29f049167f2f5eb9f03ce62a863692a03338218fa6b65f2d89bd3df1ba9ca39b4a30fcaefbdf351d83b6051b815acd54be07ae74c7687e62441951a421943403f9acfae97e650354fcbfd882aaa26e006c9d59b58d05847d1469580de5baea04b73b9918fe79ec62761a +A = 2d4ccd87edbb361791718e051bcba101b3413835215a36a96be7ac73a4dddc9e8bd6b4e9450198bdfc17130bc6e3ff0d28b7944bb6a9a5317e5db39f4818efaee71294780dee5820321dab +M = 70f03107989468a07599b6e3b376835ea29da278a155600bb079a8a9ab2ff4a5c8feaa9843bacf24f84159c3a1b1c9e4804a843ec998e541b5a59d1f62d8d933a15c64f3514b4d5dbac8eb9906148f6a444889bcf6627c2f9c6538e132d7f6abd2962b976b6fc59660c7d735f4a5ae3223ded31270828ea9f468d9b90c946a87df85cf16f8a06c04b30d937d7e24816060d87a8cab620583509d58ec2673e599113bb854f56f03d8314a0dd007f8e15f559d6bbe5dc1 + +ModInv = a59c6e24acdccc59b847dce2b0aded9ab8ffa6d9e0143472a7f93b41f3265ab5ba08d1c2cbe8fc2f149840734cfbc8ed1b5f22b84cd46d7fdd0f206e7b1759b7652025f713d22210db3cda1f09a409122eb988d8a0092502ce1cdc1d1ab5ef7c5b1387ad5e39cc9be1b0c0c7540a109f6fe8fd77c4d791546c82f7c92b807d6193e7079b79fa861d0ded4ed6228c79ae70a60692d172b18a84a6a64621c09395216dd57626ee67068120dc9e3c783eef30b027a93f +A = 8e6168e0121d059ab15f36f50f851018e9ae2b946d97d1a1719680d2672b7d5c63f9b60d1a4f9e26ee33ec849a69bc6bf5038f41267b1263708159f5a1e17d9e5810c2f443bc2c1bf0c8a307 +M = a7c7efb54e66e66ced05f0fef6a386128a8f0f8b291bebdc6452b239609a43c79710a4b640485203fbae9ac0dbd18f26dfd24f1f0d8a30d6546897d125b0020803804be93f6e7c47a70069204ef02d0bff770670b220f8233f824a0a05d0714ef2ca3d1a03b29aeb298e4693d663eed2c50b0c267c238629eab88eb92d297752a51e44ee8600bfeae5f870b34c2ae032751f00281f574aa0985f1929cda013f856614751e8c29e929eaf52645102a32cb8a8dd1238 + +ModInv = cd0d4acf1030ac036b649222f403be60b05034137712d08e2d30711e79f6144f15a28e19d01cc721e83f7b04c76bc3193507a482a07b1bd430202c048d7e8a6096dc82045e06af5b62975723b8d4a5654535a5dbc04cce5d2532ed92f024cf42e4f46d71c8fd7e2bb328d88389ab668cc8f6bf2d67de152fa0fbd952557f9f5a8d8f94377de37e81f63d81510fafd80b667a3d02f3c6be51cf0b28dea099d98556393cdd854c091f4d2a1910bb409a232ddce98043 +A = -5a6f6b1e0a0b0739fb25b2db93064b888ac2455c1a7876e3c952af4efe7e9133612af3677aac2eb79a2506b3b8c586787659ed664d0ace49bc44ff1987a036cc55b32f872f5fa6b966ba3138 +M = f6113e1c9e2f3de7c0603617d31147ee49a889da44a662b230bfb2c7dcb49f0a00f153b7f7091d9709c328200fdff4445f308a5830182c4d6164d4667c5b6ef5c18ba3db4d253e540227930981c2733893081dfa7d1629349ce5199e7eb4e3b3c8670172f12b475507a52553ee3f3cd6147cb55b8b0fa9afa6816350b3223780dd20e32cca23da8bb1819859dd3c2dcfb0f129fc9050a9032ba56891abbd5de3233609642f705ae5b49d2c300b73f3b41efcab0823 + +ModInv = 3c77e143970caafd0e2cbb50077b974e7ae01a250ed44873759a8320585f40085454c1949c3dc4c847c499d4d599fcbcd774be4d7506f55ad5066e7b83cf3fbbb3d1bc4b924cbe6545169ea22b9950a365d0d0f94c81731485424443327aba02d5433bdd662d8a5ad521a863eefb0005d4345e559badf7731d2c370757aec073d09def85598408a0d99748c28fb64b49df980e3633ece79793432b5f231bafccc3943ea34bcf75dddce14b62fc18c2a3c8dd7e15 +A = -d6c18805534d86142fe88c72aa1cb795cd978e0d5c701aca8c2eddcd731ae519ede632cd9b160361eba7f0baaf05e9917c1aa1ddfee05b8cb4d58b233448611ae29123afaa07ea19219e3a1e +M = a1a5708d8c9a21ed1428f5afcb2328c227f425cf55f94c789dab247a230cb4e587f7bea06dc7a6ffaca1ffebe3f6b1326ea6b7ef607154654046a89e8cec64ac62f1276574ebbc700b327efb65f83c2865bab0312bcfbf49d3c8dc5ce8bca78dc71cffeb42b0a66e72202d54bcffd27f289af398f5b0eab69c6ed3119fca71d269b4272f9a334f4ca3dcbdbba3ede71771f0f4ccf88be4b6666be0545cd73633e019c3891fe68c7862beb6f77eceb950a04a646f + +ModInv = c06bb115ada6ccfc01f13eb8f7a2daf8f7d9ea70741cf4279ddaf1e350cc2b51f6286ca40b49b6afc53b29491f1af4167d0df243fc9efc06f9cbd9f748966edf1c96ca62bda6e69be6dd5be30ad8343349c2c176d088ec75d83cfd98f5911f3454c8b2e6b7c1d2ed2e63de20cb627f490db81d4b130d5e31a26c5228ebf812983e81135c9b22b013ff516c43dde238d74e42259663a858b8f8d89ae90306854bf3b73107bfa093c0106324692c2a830100b9c2bf +A = 8f0df1c8dcb64e98f7f3af0daafda5c56e032107debf2c0a864f474c8cf3edd9a72b1576baf041693f3bc005fb36ca17f3a5c70739a375a1912cb644f00ab901264f306544905b4b9ca1410b4f +M = c7cd31cd526cce775cd71562bfae3a15185d4d24463c3c16055b901ddfe0f860ed964873f43993a3b77d99951ae7c62348dd8d2ad6c67230fe030db0da2abe385e26d8d5a6a1d511ec3e8725797b0301d8f41d73ed67f25d576f66e3975839d73af1f37dac727331f51aec2eda8705dd4ff189754d06c06a44014ab7affc3ad287ca9b151964307c7bde510878d6b38b12a05b6e24439fc2ebe7ec9c30385ad674b55a2977412f885c1bb0da7ab9710e595c4fbf + +ModInv = 110ea606e9d376ea88233de3f46a96927ade4387758c41117c5c5d0b30c76a729777e30c73af8a222b7d770462dc9f024f769d03fc9937673312d427437fa13d83454329aa804b6f824ed253859b743f7a36eb138d2ac542e1d6e87b72e2f74aaea204c75c6e7b96ce642722beebfbc3f505f7cfe49b1bbf3e78589acaeb42da408d3911ad7f32f2a29cc75f3ee9c810c05c070c7ed602488da5ea60a82cee256dbbccc66e4a15f56b8a8b3e93731b80001e847 +A = 38d83a222b01c6c981264cb2450d9a0317db49440d9c05b584aeb5870ad06523e6fae67c735d0840a131d4b0445080c2fa5c1da9fa490db5c4fd9e92a8f4e14e754ea224f568543d8871dfd963 +M = 242fd81e85874d9b2cecc9ecb10d8759e3b56d7f1d5235e10dd43c6f3ddb3ba79ebfc328c075388c70e5d0090b33c6722e62d08d5c418fa9eab89dc064bf1ca8163c240bd068f010b951187e45e5c38bc33c55226f39f6b7bdc4ceaf141789490741e6ee4155ad053da0345e548c6dc3c1fd2ec64ed13dc2f3a7a10f19fa0a150fc669bde0e9c27f486383c7bea7afe523e9f70f407b9022d5ef5624d6eaedc994bec21b82ce653547530da2f766b137cf03aeec + +ModInv = 1e095c1157246f2d9b5e051a58e967b4a9d68ac9b75289fda7eeec8700320c4633cd733bcd9ab60ccf4937b8ffebdf549bd47457d3e26251d8b5fdca03469ff3bb500d0604ab4a06b7f16c4d2539d2810b28d61d821dde772f89bec8fa7d14fe42a709353526edc365a524b81a7d0f1577405f065ad46e1213a7713198f1e1892d8527aab7b4887a0635d3741cecb2fba4cd4dfef01a2c18d0667e70c6e1adbd91aab1367172236cff42e75564cfe66bddc785 +A = 2267a439a53c11328a3932b1ef0e87c9b2d34916cb75d7131b61345b199b32e2831f2276acaff1ca7a19851e680d574bcaab2daa523089fa4d85d117267585b9cd7972acaa9ab04d48e506d4e1cf +M = 30d71e1b514a37dcdb45b181de7b074ab773fffc780c611f1b4ab97a404f3be985eb41c6f594158040078777aa06f0162baecff065643be63449502441f18331d2ee99167285fb136ea6a606f8a91f974405e8638d876bc1912a30095798c1b68919e2f86594e4556b1351cf3c87514fdd6f62b457436a9ee8803e9bf15e0d313aabf2cd1c2138e1af359e3d8d8ce5e03fd6b3b995167c9e752f039ab0bc2ba8473c51f26571a9a33a6ab5a9d3b97655d4cea2 + +ModInv = 114db2371a523dfa3328c12013204ace7a110dcaafd467bc943ecb3d276b1f016e1fa868754017c6f9f4989af7021bf069b2b9ad7e835833801b158de0387f8d8733ae140520bb2d9aad8d25cc375aa2f2f9203a11052b40e987ae76154403df7cba131426fccd7d3c0743cfea29527a2a06e6d496af0afe59e8f82f32359ff5a487a49a39229ccbcad26e3507c973859cd939d6637f71a62076f854973a7fe826276027072b940d1dfbe3efe43c3a892956fd +A = 4f572ba39637ed2e43d2fa9f07d153e42078bfdcc7982833d3170f9f608bed14cc4211460856b1d4229d2c5980c5b14e88a0508d1e621ff3a4d070efe4e02e8438fbe41c9681abf271da75b240c9 +M = 527044727119e55769c2f69e4c6a3cf0a7da7bcf7768133330e75ae23816682f786a4b5e384c3b7db15e8a7b03b55238ca471ecd369714a85a45ab23cdbd5cf3d05fe9ee38d3302463eb829df1c416ba217ceac44a73498136e68517e8cd59680eb01d738deca170e6effd7e1f5376b04cbc4d0d2dd511207c18cc5bd3bef966a6ce40396dd8cea0bed0ab48481d9ff95219ebfa6598efbc3afd22bb7a922bc945695327492f8ee9f3411b1ccb798842b7916a + +ModInv = 6de6d8fd91009601e7b05a494e22d513bd6f10c2d9c38e872d4a86324f1166a13df4328a6a150f7218008b30c8cedfa8b63d634d04555c0bf3450368ed5f9d4b9f4306a32416c9666a7534400686d4115223edc291f3fd412e6b11bd3efd434e593b712213577e18953da5a468811a7c0a880d186ff6d14741cc1a46525fe26e9df9bff0d991416bbff0d6aae374e82c48196301e78845027dfdaa6e2e4d6bebdf740497c2be0e05a0e9420606941dad9849 +A = 1f6b09fe8d79ad290a97dffda3a7d9193bb7a156f5da3ab7cc92141b5678b99e0dd1147ca15c3f5263914467dc680b4130ac2c1709d1cfee643b009b6f8f8d993d3f8d410383f468abc3feff7f74ad +M = b42dc2850b1cafc6502f0d3332d6c6d65a3c9a975ecb9f031ca5c97b0fac7b5b13a3f22d2428a9cf96ce48efc970119b12e69c33523a8988690906c72fda62b4738342e11ae616f0fff99309bd8c29d1f5729e9557667e0b93989a36c47decfb4bc9b9e5a8a8715c42849ce3d6ab7ed8925f8a7da06c29dcb8e79675616d3844df82d6dbbb47f543042bcd5093463b4e7a6fec9cac4811f501adae5780e3946aa1728c8d687fcc0bff8a59b603f2bb3df017 + +ModInv = 5a9480fdd730c2c48ce2f23f979bea8b0dfdca2d1248a0d4d69c8b7ed461482ebf3b1ec3ee1241f637ee3da516d990fe57365295e37077998a0a321b1ef05da7c1bff2c068cb3e9b9c7086d6bd5b9963344214a1f075eaaa25b1b67100986b0ff07a9e50df0dad1d8c8e8fb2854081a0d81588f41fb18a8215bdea1f3cd1eda46a4b4a99fc94cffdd8f728048b1437ba9089553e4f8ef9840e4ee6564e8398d886af3c6dd4be63e301979fa0df1a6f223595 +A = -7fdbd7b409ebb6017e0a34367f2832fea089abe5359314f6737fdf6339d24df7542ab4804373635331e32fc453ec88a22ec95f2250c6b0abdd50bf0528a3e03992e1021f2e1780c6354efc5d8f90f3 +M = d231e8b69e22029ccb3187062b0de332931f0904b1f8f66b8dfd8c1bdc7ee63e7692c58bcba4de15d6ed27f303933269de284892313a7fa69a2eb73abe57f5acd1f6c12b0658bdb1ff6b44d251445d367c45704c553c7b06c78d1f9d34ca11d5c29fa62fe390140824d8bb3f13eda7be1f1f8310bb91ae778093013af44ad18e5a541d7808c1fff821947496b32bbf8a64f9c0a3b262defddbf94f38a9e49a6f35e53dee0471d4063652effec45fce126098 + +ModInv = 41cd16a707afae6c5e32f0a88eac7c4a2efb7f9e1e2ea9742dc67994e536a90e42d79a033c5358c56a59dbc0f1b2f1c265daa74d7b03cc2b155729dc05745a37c7dc6d3346d2889be97e97962a57ae233543f134cbacf4dd3a9f1e5aed96ee697a22ae4466bb24c4b51b7a0386cfa01033891d85961d3dae8cc63afe6870946283470625f5d509c1b16bae34c53aa1a0357d26f6b0b7668d1b7000a69c360226ac0161597b1306317e93b41414461d8b05 +A = -6a228c81a53ef71bed57b8069fd53c2afd8f1d4e75e2c8515cbe18fd477ca2eb36981fd2151102aa9ec89e6b4d4f53cd0097ecafdb7d1f10dd8a76f5091b9b8b88315225f2615df13b8116135dfebb53 +M = 43814ddddf830c1c72b399cd6c4f1e54be89bb8eec86fee5630a84fca305d4bed6604be1b06d8d63207daa2bf71a35623dc57099e403e424e9008137fb7d5d41b07dbb77498ef0b23d50387fb56ec2426753da37dc2da66999275305d747571c2ea7cefbfedb91040d29022460181920e50887d1d69cfe08633025d035db4e347b72dc92cbe3982de366ea396bf92fc9c4ffe850eb6c0d16ba100305a602055c2b3c8312462ba470a72cabcf3d9d134db2 + +ModInv = 3f66a344b42b3fa832802c00462579d837b53a68a4211886d9a518007021326784a6b8ac98f20a22f1597688b95c7c97268d5903e6fe024030dabd97435e9c527b98a99074a565078e7799bccfa96cd37b3511bade000e4d26a3d350048078fe75b87d50d2d48f9c7a16bf66faccf302ed12bc896b30ab0c637efe0f745546c71501df18759b95660a1058b14317f51c69dd203e117ddd6206b3622d59e6eb5bd2c7295e9ced1cb921d7f24c1da1a820f5 +A = 815bc9e3be0fa363c2e38390ffcdde07d6450e552d0fe1b3c8e9dd4bc8a6796330d476eb5d51c104024780b51412ecb10345b73a5840fe470dcf0b3bd6759ed2eb7cc146fd815a7e5ed914470b6227cf +M = ce0557e7c6b68ec899b4211ce627d8c0e61aba4d385af0b1e0a3ef1d1ecb02de74327c54fc66500a9ddea2b678fef2aef9fb99a027c2b33c2ad3697cfca73b2bb03fc6fd11ec83f7a2f1bab57c2c959f33b1511bd8653c1cbc2e7e5083afb602e8a0f4e6a71b371c6602380ac6aa4fc48d0caa7a530bbea01373c73a7898e30b990d5517d07283fd88debe33881acff96440fefd86c0085ddc1522d025d96232d7d200f44783966d986b45dbb670aac5ba + +ModInv = 20a314cb72396388c50719ec775b523ed3f08aaf3d81027325718e3d93da3ab7f1d501268db142f11c078c6a1b81e9a0991eeac594244fe64369f2ee7365439fe3583e534f275f8cac244b2f38694c982c684a619a461c045ae9dc32a8ace2dbcd871a0c49c0dc4be2bb0065ec7941fc405168fc9286be69e233f0450313245dab337b3485b2071b948c46862410c1826167f58e55aa3e09a43c227fcd4486e2b0d6b334e7bcdec795278c6c291aaef18 +A = 876a48d95af7e5c061621eda25d4cd6bd8e2b70b20c63875c74c22bec54b57db8b4b6b7e3846df7b83b23ff38760dc56d23bfe537096bd8897d9b13303ae9da9bca0b5eea6387b743830e31c20b33a0a +M = 58ad658d5672c96d4c4d1947e5e258e8e77b2056f8a0670d87eb7cdc97c206e6ae2ecdcbf0c45efd3364a87dc8202119bcf44993af39fa8975887ab7ebcc5e4c9dd800f316bc8412b4a8717ace29caec70b5f14a17108afd2716c5726f1829e3c0e960dc730eeb72b8f5fddc0d1488be1b1543cf97ac3f3003a241c6320eac18fb803dad658cb40e60f11429feac05cc63ef8464715e683434976d750d1fc448f9da0667a6377a58e23ba0b9a89ceb34f + +ModInv = 1002e6502442388be2780329ca9a2825a3ff94987ceb18a6b010a8ced13d6d1aaa883b8cac6c28d5923428d07a727313995678da6bb2018da952c8b50904ec0c7a466904af0350014eb95abd6e5ec2f546afcb301ed51c5a0e5699f41b0fc91529b404667a687d730f1606db6c8f76dd57330885285bef6ec3aed6c1733bcd93c1fcacb375ae99d88658452dfaff9c0a365309912e118879d4e2204cb3797f86f45344f5a6b5178ab6c3382922cb4b5c +A = -2066821075466e5ea062a67257b703760a63ee67897f694ad94674857bf5f5b694fef40d1a30e1bb9ea9b68986d43336c03020d4d3c282b6f95d7d68b00ec8bda62d9a057c74a205d2aa00973404a3de5a +M = 3d0b5eb25908fdffdc610fe8a5fdca14e4b2e5d1e8d7c4a8684c81237923a4d0272305a8b9b312c02ba748b0e7e6466dfec0d140b6c57ac3ecea7865b85839c024dd27b91b15d93a015de8d1901b9ea587584497d982b4216cb3e7d3c9e8372b1907acf079aeb7ea9bcf5ea2134d822d1c410c923a07e43c764dc82305525aed2c78b88d5941a4aa86f28c7ca27769e9ba451c55189578b93088431e5a39de21669baf95d60be8994d96aea69d33f9f3 + +ModInv = a074078d064cbaa90578a423e0b80c3282d6eadc076fdc9ae0afa41eeb7b4542c17b6504a08d7d14c88fdbc0e50e403041f7881909e01d2e3f2c01394114fadbbc69aa611a0da2e3910e6ab1506b92bbe905d6f66c71c5fa44a06e2555417d8dafc2f434050be3209230e2467048d12d440bf313e97ff6efd6b14e21442304c72795b03ded1404efe4f3323a684c9c8879b583a35846cc2e09daaec621f86b31b5b88e2f7caf88afa4881ece160590b2 +A = 6db9d496e06768e23461972478092ba437caa0fd80cf6c33be65e98aeab04d404798e0494e87d868aa5f9baa30c3560967d20f997cc6cf42316dd20119124ddbf9956993bb033cba55f2183b7861db2aee +M = fe66caba14ac136402ed63c6567027ef035094d91dee0b10c2668c34ad1fafce788ee4e389b18a4df426260eab3907503241a2564ff8a36ee2fcdf00b1b1a26c6108dcc79eb13a080acd328503db7a8b32330e5b92ff4624a57149ecd31395a60526125631ca4d910cb03b1264d4ca205eb39fc4f1b445a2315ab11a8f3d940cfa082034ad99619388ef2a8c7cabc7a46fb01185e3031d65cc5494f02d5e355baf1c5567918bd3376ebc988ef6d84531 + +ModInv = 4a6a212982c45ccdd02a17356a500a061590bcab88cbd75c6bb70835d0b2369ea44c9d729513d9cb5831013984391aa0b1f7b866659f2cba2ece1abec010a54a15a2006964b73546432e919c45d3bbebdf151913388270430e04971bd3e1b404c6fc1f337207653d470bc78d092b6f90263f38fe9c43b473279a0945cbc12a47f8b1a3b2573e79becbfba1bc8202e3c3c1057453ac25e27606a7896b5cf80c65a956c3ab7a47d9eeca4434676ec894b3 +A = 69229957ae5cfa54039037e5e988ab1fb24a27b3926bcddccd553a07bb1686a459b953adf7c63eb0f3e5681ede78d6862d97e0e52ce19fb27981447cc26b0a833cdd8621544087bf51f766c980a913eecb +M = 61e7fe17a774ddce35f3f2b8b304171c296f72b9a440d5402d2ee3b7e61c3ab30289c3966d951a17783b57e373fb1c16248ddf83e67007041d064ae3f9b0621f740b656447768f34d0bff5c80ed06304dfc273fadaf2ee22277d54f084d8ab929d5b69536816eb1b1003c093cd8ae34c73822759761cb184305112a1173f9eedf1705c6db6be038de837101519fb58cd6ca8f982a3ae543f88f3aed90a77c9e168637bb38130ef44e088eea9ec8a7da8 + +ModInv = 7415ad84bbc3bf66f3f3ea15897194459de800cebb282fa1d4f09397656c8fe4e0cfcefb4a86eb70c53eb6972a98ac4a4d3e157ced162ad1155c6d8a54739e99a6134883293583748e3eabb3b70f25c73442bf887fce696f0fa61c6673c880df93c6ff1cddd554fe766669387fbde18db845971d80e336eabf908a8560a2a3c87534222e1b93cde320b31ff6fa555ee88b95a4a1b7db7fbb45764075088bc9c4f0970088f6b0332e9b0d74cc36913f +A = 97cac2af54df7ec4da5b9256ada1cfd068367d5e4de857ae97a2ebb34004b558b787e05739e86996f5a51cce71fa3b1f40c1de6990eec52f22a6fb92ad3f8c2f38155133c68b920d61c42db5ae42a45a62c7 +M = 912b0afbd9841e9a2a250732e87cdac294bad8441946fb5a5610a82a786f811bb6ed12d767edab4d55499c1d239e0d40b2c199a341e59b4044d0770776acb5f033b150a706e3a6613af6436114ac52048297cd44c05447e9be9bf25479ae6e8615b88521d4eef0fc88ba9ccb570791058374aae70d812b5fd20df06a5a98269048527b5881930a04bff29520db8baceb4317a21a93314bd3d58b9558451995133587bbfa4cf5d5fe5214fd1abbd94e + +ModInv = 14f7fa0612976945be4a3d20fd7023aeb5eaaecd55dfcb3effec6da4b94b270f98368816fbf105be6f0df41d9ac6d66326a1cb7f9bb9ec960b1642ba7d7b2c8a74678f35d628f1951fe7cbcfcd7b8b39c3ae99750c8faf68549e567ca0aafa61db196133f667f5b2a0cb9846487aae337ba62b31e320063c6d30efe27dd0ee22c235efed39913a289de821ecd2943fbc23d2816565c4cf6a526587fde612b9235a0a34af82480c3513ed8d0887034d +A = -3bcecf5c107d6a4bf933e1ebe1644aebbac0c358ddf757139c8a0853861a4802f89cfc76e892da528109ace0e79116a45206f57bbdfd99cbd2bb9e6a2523738093af5b4d71c739cf2503fc0eb4f65bd6eed7 +M = 179da085f30404a85bf5d8dae37b86f64fee7fdaaf37289c08f29f326d422ee74b8faabf9de4234e48bf94cdb9f082ffe59fece59084e4c99a5680c5087e6830721d9b59588589c751950c00abaf5f23500a814056b7fe943a95c1c42acdb250955e1bda133b95b81d64c5d596d30391e410f79a59b66b4df3eb384648b7635d88018a0dd98072d3c6e55ab512e2cc987999316fd2bfcdedff5a8ecba35aaedc521498efcb18954cfb620fe8b45857 + +ModInv = 52530c56b801baadafbcb135fbcffcfef3eb4770f2952f5173b89fe367f33387c906a0c47517111631273aa5e1788359659f2de7d979e0fe59782b4b725859f5be701ee7fd2fc152f045269db21011fca6ef9c2a6cfd406700d482f010aad21cb78b9867cff6f94ac64c0d861690434f123cc1d5afa56943a3eaed296e02e951ae6a60149ab2e549b5ec2d51683bc1d27fc82476dfac38bb4cd19d825799d1afc844a1995bbcd0e4ab0cb2ab7ab1d +A = -f2fd783aadbbd46ecf132b153799cd9fd5848e52ad51dc0780784347b5402004e85435cc780b7f03e60dfcfe15b0ad7dbfa9708738ae72eae58e67d730c9e15d43fd2b23a752af02822eaa0cc3ec505c06bb +M = 17e825380b4c8e0f952d5053fc2fd1e5bfff4b87bc4999f65e7a2fb5225f36e283f3eb6659db21735be7db7087439ef8aa1df481b871c53306e9739476787a77bd22d5764decb0287c351f072a657d251b8330ebd8277329f587f164e6301abc9b5e9ece05d8c51120f74747e02a9724837d4e3549baa3f6d6e56b9743ed173c7d4e0206c806b9582d9cc2055360348fc5c446c4755ff995c0ae3edb5fcff4fa392acc3d4f0c161623a6915e4ea512 + +ModInv = 19e0d56928ee3a4b343962f52d5075eead989adc68d680e55902b5005416b3f994c08a871982c107e27c7c27b8a16d919baddc0d219ff8fc2b0e0fb0bfc4576c51bd61c8b69872b46f85b17e94c0b1b90f6bb5cfdf26942ca0e82b5ac437ff73998272637f1bc0a14024b3d1f7bb1fe5edfc250a04aac074fba32f48748bcbb15abd6132f4ce4aaa8074467bc2b7ab180f5240dea49df06ed07753e3d5a2259e93d9177fe0ad423bb67b8b59678b +A = ce08fc3478ec029a375f32aa84eedf8c5113299f1ef5c339a6daed1613b09a8c63ea889ad522c38364265e10633181785d800b8a3b90430c400bd21bde23259213cae772d60cb7af8e1757b5b83155aa6572a3 +M = 4bad0bc873dda6ec39d37692ba9c411eb7d9f9686bb0d991057360bb4c5654203c389845c20116952e5acb14e72dbf6c4653624785ac38d785196b7e2f02e0f14fc6e33ee44050b02b31a1c29b13fe83411102ec296f8a3c0aee0c844bab19f8dd5486b64f9ee5a510c44087054c261e428bf968c65ce359e8a6bf07ebc1a1a365128cc4648eab85dcbb04d467c4914108451d58d25d24b081fecd1b6ae421a56cccfb00673816c13da0a128f8a0 + +ModInv = 33d4cad17e197bdaeb956478872bb03bab89750cea80cf8ef47df0c488d83140b6d4ac74e6d57dda837e62b583ee395eba3ba92e5bd75c05788176258e4800e2949c579137ac74f01de58f006f5760ab99d470d1dcd5a5b6a232c5789467a7f130fb752942a6acbc3c6fd837eff227c0c0f37e18ad1713b9fa35f9c7c6de8f0b3cb5dcf7ddf16c3cd8c3d3a5d1d0ca2595cc9e905455e2a1f36b1e5b06cb78b7eb993e51b8f0b6b91c4e33e4e2cd +A = ce2ae7d4b3f1ee4e71457ad2726607b047bec7cb20cd2baf95831d0e10302debc71157b929b36c35f1bb2009f79eb6f59da38488c4889a3280e4a40dcd0a950e7ae374089a351c9ff019f50c7c508985aa66f +M = 3560b3f7018f4811e659699446efcee4755854dd86fbc4ef892803419ab0f1426e6c098eb6532d1afffbc966e4654ad2da224dba9642265b96ee69d6ec585e64ae613f5e5cfeb3d80c444e24b4a50e8dd2f08d471bd369a0732bcfdd4814bc5e6471b3c97a9991925746e5f56bc0c5ca77f6d62cf1714855389192d24a99512eab4e736ff3a09035646d0b87d242b408bdf3c7fb194f0f2f11931e840c0d41136ea3015a1153c2d156660f463cb2 + +ModInv = 59934db97de16b53d1fb8c823034997eef1c349b89afe0489085d5df8e09b46903a60943f560c76cfcc1810e57794562c2ff1cdcfd5b10cb67840ebd7e01a916b634574bc0b5211089fc10e5b1fbd7afaa1d289455886dd9ad2606fb18de44073c2da178cf2b3323603ee37de27ac92e4a19c772f2a024d564319b3ab408122c3667193ed94b7577ac8752c787b63fb5580da27cbb51b0859d013486e4b2e2ad2476976ce22065ede082c0571ab +A = adc5760d5bae34d7ecbf1b962418a864c3d750f4562ec602b071183b4fc93b2a29f06b081f5227751ba94a679f665c0525f22af9b74a07af87952a6f332e6a84f4c7b7a4cae65c1023150848892c9c2722e92b +M = 72a2b0991d4d584f83e4035dfdeb77299b90c28ea9ac8ee3ee838cbe4bcc1332847c73d607f83512e5ce6f5f4e784c5a6e3ecdeed49e4a73bee1b07a024670312b189eb7d0c316129cb22d4fec2bdd1cd95d479a68cfefee3d45c3bccb4b8b5137c6cc4d1ae085352f48874cca9ed760aededebca196200e0e0aac27d1686f11eddbfd5eb73b503cee4c81b545ce6ce8d6f1962e4c61fe9165e7016a0b3cc578b2c736f218fa0482a7f14afa888c + +ModInv = d516eb8eef7d2ccfabfc6441614f11c79e0634f3f574cf37b939789dff2b5fcce335dc2fdcffaf8a61ecb1cab0645f77023d2749c0da0946ad93507dff459d01ff36b77fafe48a331725f0bd1b57f51a6e6b5ec5e92dedba05d71ab2956ae60767116241d3dd900f146c07261fcd0dbfd78eb38c4b797845ec2a270220ab5315da74d41eaf09a4114693c05f436162f5414d7315810273bb013c7f962e458164cba3aa3632bf645825a9070b40 +A = 5fec1c57cf7fd79c1bc25a610bc5e3fc671519b62074ad83c89a36ca6b8f2a7769724fcc22fbf364942df8a4bea08216a123ca9eef00c67a78377ef1ed4a5e8f83b4ab71ce9a14a0e8516c78b673a2fec9371849 +M = f3d6fce75f4054dd578041094fc86f0c0a22c5ab1869b8cd26dcfc1e33cc5f059dc8e2e2c30d7be95f4e757f0265c0d97b6be4fdc668857eb79b285632c2cdd56bf01f0c3a3bbb485997986b6338c64b3eb20ed889dc1f6ccd6d3fcb9e9f2a15dbd386f3c782a462eda01fb17767ccc124ebb98b992c715c83ac7374bb5afb0c0c155d53e44fcb9bf851fc5b17bdb6a193daa41087adc4e8b69e82de8f92194c481fe94bc2b4f6c48261757c1d + +ModInv = 287851341e09db15ef0d9d4dc01b36f13e736adac86029956e338e5c9c426b860a68677cff3e214650b724c01bbb4b86279ee89f28773bcf764d4c42004083049a304dfd0b1e3742eebc85be94559dc20c21c0fe7a12daf05584111fc1034127ee84b0fb3d5a2ed101cde5c93511fec673490f0d697b14987bfa340d24928c11b4aefca13b1d948d578ba619fc0d0df06e711fc26bb0c01c7a2a7d3aad66e391e27333a548ddc98ff39f3f5cc9 +A = e6e730e3294a6f0e4132e5aea6f41b90c6c2c8e9a7392cacf8f3cacda134705c6e70c753d2d290f314e05440e5cfcf8741be1c237e2ec12739fb5b7c5fa6215271e51306817fc5013a0fac359e39c5e685709625 +M = 2f20d073c5b664408f6b4a6b3119b1eb7c3a17b5f94957c512d178e1331fdee73aa1b7d8f0090092626abe76d73b992bef9c4a74a7d0789efb6ae6fe980ef0b0d2c11e096e086b20ddbf3351757268323a29e60b8b21c54512419906e6aa29d5072a46d04298fb5cdb243ea3a14d6643f67e6cba2ab9f6f3895c9bff2b7b31759b7b3b7a06c9318472b4cb667099c43bf2fd8c8ee89c9b390723a7cac6dbd8d2ddbfc6ff1218a1b4493412e294 + +ModInv = 622d0941bc880d7aff65216ce40b10226240116e7b1c19ff15e3fcc2012c604693b3311e2f1145e9bb2a4380306409b1aef518eac0f44b73b01fb99fe729a68096401c5d6ec0716e5350b9e0e3d9299c9443f88eb0968db4d1aa49300a8b1e52c6fc5b44c75a1585203b63304ce287f29c986e515019637a6850e06792f4551e7d4990ba365ca7d9773dc72f59ca868282ad1304ace926ab7536fea2c0fbe39979e6bec57f30abba3674a2624 +A = -a10d59bdfa355d2762afb68e245572fed09418850c9d7fb21f863d8855480e0ab65115f8c762c7fd8dbd8ff28c382cb9cfb5414003a41ee68029122048936f196f333b8a6084b9e8e7402fb4fb5a463f74c441d7 +M = d6ec61fe06bcb59adcd5fb373a0d03ef16028ae7a6874c8acb0581a3f6e6b6b94ba3bb881e2156f1de0b549f719ec80dcd36af50174fa7b49ff8083698f5ca3e6dd834bd64161b9f42ca7c1029845d348848f6adafb3d7f7a75e73f1126b896c148b4579409c4a8e6ba2ed3b08ebf1d78f45724f6f2b761b1a2711b1c2ae7a41cc4d69446d1970fc1a44a7831ff7ab31321d6a78d3044ab8a73fddcfc6fd232a51942ef357e44eb02b7795893d + +ModInv = 1802aa8c9f136a466199f12e3106bb0d2cc771c98543298a800257e2c54341d985e47464bf0f742c4170ad94a47eb3c9adbb4065bb8fa556289f2ea1aab2a23e1af150fc0e3e362575c61d55f22e02ecdbfffca9a2418a112e069be8831451f8de1a99183a1cd9d6cf6e8eaffa1970719f7fe7961e731915766640df4ac020e7d791bbbc4abb0bf22744437bd09ceddcc2f475fb491fac70aac75967808765874e589a27a9e28d3cbd1da659 +A = d52db474b10cae9473d0d29b6401463ae443e79e07e0691538dc1b5c5904ca8119eaaf5e6437d7b20a17df0e584178631e97e523d5f2d343958d20babacce2f9772c894d3ba7f31d0a36befa6f1b2a539e048e602d +M = 217f0bcded3c6ce825da610dfb1c5a6c7de71051d0bc9a22d28f1eaed27e5a50c23837dba354895631bf85fe8f0ed8b7ebe416b26671ecb0429f7d55f5e0ede50685905dffc59fdf8624d6807c581b952c2a10ea24d6583c56f5068b5b8b541d49de344700174a6ab33ecf839ebadc803d1aeb59c4724a96486f0b8453b3f59f6963a5cbfe847938e6f6d2e106a47348de73b497c06ae44caa1fab8950f0e3317e2cb247ce1668b9bdb6d26e + +ModInv = 3ef9b8beb98e41f65f19d3c6e662be0d83910765f85df4fbed3b5baa5dfacfec78084e8af5ddfc922a06964610df044500cd8f73b3780792b5bfa73c6ea1a68914f37e884cba2b0f2311adf356a003faa776571c13abdcf6b270b391fd4eb8ae223166a053095903743f28493b0921b6c89baae31ec20dd569b0941789f26b64c24e8cc7823b232a0d9bcbbb6c569fdeda36678237a0b26ee3750725870f040aaa86ea65a152056177280954 +A = -814f3a8d28b2d0016d8222815cb87b6a6923fa80909dad532cc879b5b02b17106f25880b8d39787d42b09c70616145d788588a39c85eff63b0c9966944078a17162f375bc261b15c6772685a195becbf9c879c3f50 +M = 7d6c2d2ccf9eb41cf763cf343e35a94da2fb7bf18e04fcf63b4f2c502d06d00e83a0d9c5459246ed186c04dce8878e79199a2c4b2037fd06ee74a6a3869f2e5f01bdd42612e56d3e301924acdd8d910532f9cbd4f744859ce4934486b97471028236a4120ac0656927309dd4035c326c697f98b00b2bf5314d6a71edb6ebb77891455d597dd2efa9f13f5251a3cc5f966a59490fc124297f21704239eeb95a941b59d8d7358ddf4c6fe4f3a7 + +ModInv = 1e8fb5f3a3f85b3531908548b714c294ecce2cf845e68e907ef4dc5ea7483a1b84cdaef0e5a4517d7161704e00059c3b049f62d42854d81b3f9e01f421cab9c6822dda6d5ee8fcd2cf27535488c07d3eee8a2d9e8f48abba02255283396461fd54e26436ea95b9e884f2a40c99f5d1454e4128d538a7e2feeb04d9c322fdcdafb367c92320e38e8c9b53f6b066a1a35aa54f85e94b50170464630d791169951026c993db55e9057590744741 +A = -bfe88584fd9950c32d6251052fdf8d3c9df9b20734c318b8e933c0403b11b7909edb8ad6ec5610dc744becf09e2dd0206adb968d82a2a24b22245883abe9f41566fb6749b3ff0c105414e21ae1156848c667e7db0f +M = a66998be10a6c517eaac617fe437d46af920633cad5c049652de94b330809e9924d2d4a06224bac3dec45ca65d52da1c122e110dbfebfd3d25da4ac83b6dfddfff4701adbc98115a5f6cf04b2777148d525aab5365791d76e95e11fe50c72d18839c717e397881f1573baaa6247b29e0ee1f123e9f06d89ffefbbcebb96f787367a26a3e9a2ef12fc82c0656415a6b7ed2fea79f4da8f30a3202c11c7e6b38992de3520861501c0e33dcf05e + +ModInv = 6aacbe884e8bfda0e73e095e74250aa15114a719f34493087ad4a5db6b59df49d77376f9e400e4fcdaca6320b04fb16a212ccfe1cac186cc3fc66a4d588366064bbeddc21be197b7b3a0bf52485e254bd419bf92af86179fe73c04d6f1b508ad2bf15eb65ebc58718fa30c5e75103bba7e8b100791f22b49300e397231dcac68e8f2f571b49300b66f8a923c6da933104fba611c54419d3bbee347ac106f322ca7892b8524c7436354962b +A = 71a7ca9d89fbcf18192a5088928cc1c964c687fa79c262fb7832b7c6c5f8591d079afc92e19b5a23eb998b652e66d75b67648335b3e6d426d2becc8e53f0cf978655220b2f6e968de480d9eaf6927d6f68fa9ccb62eb +M = 99a87e96321b98f741572796c380f1a6c131c86fa1e021541ce4041b5a2ebeda5102b8a42d52638cfe395bfde681bc169946c5ddc0d7eb22edb1b7f3007c1b47049f1c9ec21d4c77f7f02687f676cce64c17499ddef436e1b79485a7cf498debe5c9474096f8fab417951954143c8aa6a7236e3f4e82a544616f799134c90bb02cf985a39e6b5583748b1d93cd5ef8d2eadd68cbfc8a5d70d1612aa4af6979639d3c1dde7c151722667178 + +ModInv = 2f13fd0ee526fbd80a1ed8cffcdbf22044c7259277a247bfa579cacc2aa9902599329ee116fee499932c8fa126e313254032b2957e14e0953fa63c483d54dbdd60c9bee0a0df0f686f30cf231ef2e4dbe7c9a1a309dd69f16c2248473240fc343bed0556c30f5ece5d52391323f571ce111722f4891141ef9e6ec62cd997df69201857f96bb381d2336b84c8686e04d8bab46eec59e9763144be874b5c1a2d6b4ef1b40429f1ae768415e +A = -ec3d9db792a1eb2b808e6a69d4f532c483693b88069cf67783584a2d8c5a6a9baafe750b4b6394f068acda99a606ddd883cbc52fbc95f5947b86a95bc040654b86bb0d48343294ae7d64333524b03bd4f9fa8768d835 +M = 60e47531e76da7c79868691b23d4e3f47171db773993d43a8cd2947f20d15603059c072220e3e87b8f97772a03ad1548620d0fa14237982d9b5d99fd064286fce7a288fae12440704209e9793fb50436ee725ab78419510cdfbb40206b3b9f24eee36e54a6e55a6bd8a59e195167cf3abec7b03737a6b52de02d2d52fd04f14e1a7430a40fe7dc71c43529cf6fc49d162dcf940465769ce56c132d3df4e40c03b6e422ac90f8bf14b7445 + +ModInv = 6bbbf773404a839da04ae444cda8cbe5a03cd214bf0390f9e7b6d4cc2132be614ca72fcfdff7c962e950e123ccd946e51ef67edf03dadc453272f36d19362fc0bddc549675593f81e8cee75ef9f01d16e34e2d744ec50587067459ae389b00646d50dcb65926ed3c58993a9d63acefa2dbbe0f3674dbf13b6abb21c8ceb0cee323c2d97f9039f2848779122e63ac4e1eea91ee3c1fbd8ac8fedc53edbbca068a57a8c3063a6345439adc +A = 81f4347958b4f820df5c471fe38126744bea1e07e7f8d71260df4331f321fe41d2bddb26943502c794819bb19b38f782bcffad3fd9f43764e1a32ff839e64852aa02274491c4edbc9c6612eda61f33e60d4402ce67b621 +M = b4567707bc15a9b863f42b900074ff9015ba629fbf4fc1d9f97223bfeb7c5e39a17068fa8658e94b4517c73d608734ebcfc931a4da9e8499c75c0758cf0f36afa8d78c0cd555860f57aaab9a065bd48f2cda7caac505e056be7611b9bf6ee68b72fdb3e631a2dbcffc52cecebdabf82d64ee2a2e9b2fcbd05f864270544ece51ed33b438e772500379ba88be1df7592a8235be76dcce7500b0d17e3dccaaf1086fb44e5a266076f1188b + +ModInv = 36fc64e8f0107a448e94843474757fdb56aaf3466b5c6696eff542b4e0d0ef3cefb56952f2276f5aeaa0b6326dee185263880166487fc6eddb92473d9946961263557b0de0e57146a4b429f626e7c8aa1ca06b2e2271e473b5a612550d41de2ec9fecf9363fa815f51d073e573d40fe10827150b9afdbd9b29363ce226f4c6f10799d6ce4ed5165be71650464e781c1d8da72e8bb7917841478f10c9d9e757653d3d79dee6ea1b5d3e7b +A = 6bada12a10a8c5e1190a56173922cd34b89c82d983d4a8b19554fc55ba4ce48ca57b1b976f977fc9f6f0c9fdabfbe1cf7b9552f06c24c5f15928847a6aae5ce87d348b005f515d55343c68dd2ec8f028ea81139bc422af +M = d0cf75b9f582ec469ed6286af57d7b6a47e73c333c06e223659263c644ae15e9a5db8c7c57fd33ca06c860b9eead77de474f00fc0446901d9d37e8c01508624002e3a615fa24a4b8e3a0000d152d43e897f9482c78600d25b0c946c63339cf2737a2e343128edc10421170b8fa08ff8c8156f6e5db2965d7d48bcd4f331ad93fc9b18bdca6f3eb54b3a3107a192ec76462f9e0d3e2dd65ed43dd96b802121b140593fe5843367802933a + +ModInv = 4a867e076d6d922298319fa68dd8c4d9933cee93440c92847dabaf33dba63988420bdc06250c3aee9dbde35a39a30a68572c8a1f3d0f4605b371fcb5190e39e5b7bf6e097c00f699c4d8cc47f1f2ad6a207c4306e3354c68607ac5d5d63a7a1d2da93b1fdc389c3c6abfd5f587157c6fa5a1d2cab56a8ecac2aa63bcc01b7c0d2a21a5b83e5586068820ed43ae0058c3ce77dcdffe9f84927c13cc9e8e1cb65b6e2f48df3a73979d8e +A = 7782e733013eb5b88b56e2f18084ab7b5d4da187c998e44d11db5c2a2e6ec3e7abeaac29400e6806749573ff536c87ac15a47ea1afe05422fb81f86ed1a88619fb1df24ec5eb2ad2440ce88f0e4060fe8cf644ce23047005 +M = 531fd0b23ff2436a7ca82c70a5303b39dc60cb47c8ccd1652e89144dc6218476cd5a8e25751a2fa707a10acfd239e01ade8cb269f60b74f00c525717bc5445bce46016f441a301dd7871ee202cf009bd6aa0cfeb80a9025bc344587384bb43ec132bd1d1ba3f4d4627a8fa6b14e22b39dc1ad9ff8f692db2994d9519892f5e0c77b569e728657e073d03cc1510ffdd4da33018e344516859c24692eb4706401df3b88855153a83d9b7 + +ModInv = 1550849b9a47f8d36095b4bbc9d289d4f0c55898c55d28c04edcee2de26ebb1678500c220f15ba640ccd948580c4edd0fb24b2ea397b80e8575d26a99763625c293f7602946988292b4fe536cf1a57b7e0541f90e562d1f83e42f37739831a10934eccec48724ac67cc5e8bb22e83bb8403312b61b130bab7618e57498d3be58403121b18e5b9aed49621fe700dfdbe4a7318db0691556d10b0e475ddb8c61339a4dd53a6a3e4a6b +A = -e4d0839fea1abb18e1ad4a501c6879bd0103f8ab45d6d7e81fbacb9881c915cf94e805feccb81ca17b86472779f9cfc21638ca83df4cfb79df7aad1c1b6e8c710baa1a873a4ed2f3344b9458a702016a72426a5621c7ae467d +M = e2346bda280a5bee366d155d707af60bf2fe9f320d43407c049a85ec7f3c9c189f4535d12a0650288761ce6d8ad7cb8c9b46728e3d6cd9dcf4012e0c7fba3c70170521ee40a77d3d6efc04760030bcf1580104068b8a76d0657e42bc4218d0997c9c5a34d424c89085ad8a44f2d31eb98ba94ac8fa34d917672fe90bc62e7aecaf3cea7cfcda797de3f2a1348e03f1df2e738eb25213501f4f632ac1c08da94f74c895c716a1e8e8 + +ModInv = 25c876a3eb84ddf775045474924ab1ce4bcec043ad2bb03d71fd838207dfb359fae3da7432657054e8c562bfe26c3591167dc444789653690731c40321e5dea8dab782f7a0fa1e3033a4105986208f5b664e5a2632a9cf74f3dd3c3f3565e57bf0a643922e4165ae95447b914bd99f47d2adf5e55932e351d56b46d4805e06241c757ed682a6be6351dc590aa11dd35190c664385d27abb77fec61148a001d6fd7edea905e9b1a48 +A = 52de9a00415ef0c5b6f2361aab4519ba82092a421e6bcaa58b98d526f78cdc4139903fa6a01f7677c079e9828d8d2c206d91b9835f80830263bc491b38aad8110aa9c164a1438f07e0e127e49be267ebcee4dc68229fe6cde4 +M = 7972fe06bbfb2b693840d022878489401a1b16fc3f7bd5a41a044545ce970821ad070772de2e956c407abf83f5b67c70e15ca5e089e7391b46633730afcc1d7927414f3af6c116961ae93c71946ead8da1285b8e2dd0029d7360ff8493f041d0632984fd893ee0f0355d8b62b254dd63035e6d005f59ebdc6e047e19036bebd86324fee4e94cc0e141aea678192a12f00af1f2f9d07712c7e8fe72583c59d27126f68cb73aa68179 + +ModInv = 3d235a9adfc64449aec58159024c952973c5b16fb0a08c6a65de257d4dabda5cf967d8f6d0e2bf1071f4a4b2ff5b293b2974d0666091d796ffca22acfaf5ac505079ccf662b3071e0831a47926962dbbed6b95a8dd286acffbcf76589fb7c2f30f651a6b93e9188cef304f308cb4944b5c002559fd560e095812a78553833a422bf72ead43d1498190e7ddc040f558fbedaa36cac6243aaa6f6cf2f35b962e13cb55d413cc21b +A = -fdd3242e3440a5f5fd99f84a67352c8293ab3899d61a0edcd666dd65ea068e606ff413ce512bfd64e0a1bbc4b652e3a9b2a5fbec843dcc17a9c76b97be784df606441f4a03dd5205b868f3a5d32511e8f4191df9ecccc5ff043d +M = 254dfd83c8b5b634da0d30eb405fbfd6f8eeb889598deac42d07e122eeb39fed04b4997ba726e4b5f99b700caf59c78bfbb54bea7e3c8af4d1eb9f01297bcbb8e5c1d6f5b93b03310915161a32fa0da36270fee38e68216755e3f7182fcb19c107267152fe2b760723da7b1b211575b9d660bcc1fad643ea90c3a7b181c85f09081f002cb3888998f7a7ca36ea6a286a684ef6c6b39a13cf126c678ffc2118ac074f06d7e33fe4 + +ModInv = 5b4d2300d18af579713b31175ff921a88ddd768dc9f833dfb7329cec0ed73ba5a53af4e0c3480d95fc9ffee1a748ed83d550868741e4ca31d73538dcf55f75e7a8dd7932019b20f2481c1efa7ef486f9ae8329f854e3c9573bc2397b933d7c64fc98bb057522167f0511471900d78422820e47583b3e29a3c127163e7bcf93f88e0e03ce79ab8803712d0af0cce71f152cfa15e4461f49b3ed610732c157b120f3dc50380a6e +A = -4e52bf4d12c9484c6a597d6c620caa9db999c5c2e1120f730410d1da3560599b677b60d257b9520857b26478ef9140159b5cec76183d0e70fc8fcbc4aed82ddcbb82533166f232bf76dbb3033fc84a27ca602bf6197596bf54589c +M = c5f914b3ae980c11f39fbbb9c6834d9a38964f21c22e87bd8bbd697cc38d3f4479e7b55c6a42481ecfcfaf74959c61496b435168b96f27bb8f6592fdab338e7cd7d5c57bc3a43fb87c7372af334177a1ddeea01118902912aa0c2a4b0161037ab6f37007fea0dd28c24f40a62aa0ca888f6a8686150b75b1f470bc3f69837fd6db5b4bfa23acd3f6bbb45ddf44ac3f5ce1867032ab57ce2ffe6e4ff82806ffdd47a25bf46335 + +ModInv = aef3a194d42b14fc117c244367f3facda98110cc9909598df08ebbf5f79b3cd629116384a5b6166447b16d119e08b036cd218e8b89a044b23fac2b08e3c8b8bd879e317f72dc3ebf06ef53c50e60584ef8a2d9d1b6e1c3236d2c13da78cb3b2f28d395e653f18ef34fb988eeff402a121ba29770f615c4cc52fba2a5c433e2738adae2d1de8de4319cdb972906f356cf5399bb29e1eba2e19aa6a797e0b8857c4b99688cfdf +A = -f962307227588030c1d9adb5a856480029be204e03bece3db19bca5a8e2ab7eeed8d822471111376989cdc95000e4b6b5940d1a376b1cff66fabc37b98c28958443aebb74befffc2a797de2f22b60d69ef4534baae20312743a65f +M = 858944b2e72c1d9c7c3008fd9d63dd3818702f2aad88022fe2cde5b42892e6ff5b7afffefbe93cd95409aecc01bca4149b9a0c085b882086be899a2fccddee2c065618b72104dd6130274bf272da29e903812cecedfd0261634f5383d5f7a2053e2ce30561348e5606feed631f22c5b10013ea7a7e2763bd929e7267680309001c83765a5d58933415c08e2088dacb05fc72cfb6d45cb5d1b299c3016183b07392eb71f11399 + +ModInv = 54418ed5d2d882d98176bab7d2e676d5f26afe828ce0d0d5665e74c22d4f214168ec4554dedd61a09f744b81b273259c2b0992c85e0634324399fbcf69cbcabd6ef37be619e4be41053e81191d3660d0b8863c549b2fc486fbb6c9fca4e9669773711e37a888337eb9cfdc865a56dbb0edd95bb7eae3c4a5b32888039a3a7e33caa99866781d37f8410d27054e6391fda3bf88e89a7c04cd30610e03bac03822b0e85744a240 +A = 2aea29cd0643cee65c0cdb2d381d88418d13628b2ad3bdfe1964f3a41310079e207ad8b8155015bf0be18c391a897045f1ec8625d87784475295f96fceed7d885cf0f0e42a4b894dfc2e9b2ea9f31e26cf84a7b252415c9c430da4 +M = 837dcab3575bd8b4708ae0d598e7d705dc88f102fb1304c7cdd0947f7c1b55e941a03fd8d5308a97dedc0969b89bad739f573d532c4aa988a5961a31fd7b0e8a2f50e8c9831038c35c89f4b0fcfd9c3c4be23bf7e481f659a9baa145dbec6c88ef12c74fede89719f289fce45a5d66aaf6e9f8c6d3875621b7565d3027892cb9ebde07ade2a9c0e6bdfcd06974b4144fe1d51a16efbea197691d78c255b2c6b0cd774a76483d + +ModInv = e0a31f07dff22dc7697e73a8149107f2d45829af030147bfb00d03baf332cdd4da8a61cdad3105c2d521b304a0351bd7e8c254c9cb83eb09eaf9ade1868b8d1cf952c5d7c5d24dbd81cbd0ef3627f91b44e5ece55f17fcafa3bac665e52cf05d1211c80b0c3c4c707340024a4cbdb9b16d4ba61ea87ba4fa6138393a4207d02a5251668899bc5d56d4086261fa3bf4fe53a575d5a6c296129b0c94020bbd5d94b1dddacff +A = -123f42db596ba498e1cef237103a2fdd5b021c8f9dc81155277efa2eb3c64277543ba5fded8ffab3583629af00e8fb23b11af9821bbb16bca24d56528fe21db0f2a575f4b6038bf89f6f4241db16f20870c647ea0a6580d7eb2edaf2 +M = 27a380fba0e867dd3cf49d671c49e7bdacc2b3005907829a64f71f6f991893e3acbf2299b8da2c0afbad327e561068b6bf89143d32653b83c5122a54033cb9baddcbc22adfb4d26c12e717a2d8eb0cabcfab64bc91c0193e9a5cb4db267c053d18a4fc0f0cf083145063dfbe3156a581da0a2494f2f2e942827e7c0763c4f22e5975f2094ba97a2bb6664254e678f328977e2839b33da45cf3996661d38eca0720824ea1bb + +ModInv = 78d7740f7be82f6e3484507676e2aea43d9bc1c586f01bb8137e2d7baa90fe5a243d7607986f6b62eaf8a0d7c1125bb85494feee87ae4c6bd9a438bd0eeaf1c1ba56db4488626be34b7f7fe70ee5665542c09c8371866b11e38c27732e839504e773790206fe97ecedced72d81511df62d995e5713c8df18d934d0f65e70b0266b52b67e2efd2a3ee3acc2fcf2b50861ba7043f58ed3a7122ccbd3e195950f628b25300095 +A = 15fdf5df02f98abd9c33f11bacee7a0ea27a14fff6eb8e2f77d6c9a9b59dc10d3ea27a78ab819b9a499b8ef64847452b2925115628aa3b877c90dbeda2bb938f894208b39525636ef7cdf4f749f51ee89e1a21f41f4f31754da2de05 +M = 8b0430390294887d363a5db83a4caee904c083bc57304316e67c698668ebb525b4b1a3c6c143a4488fa31375d48c4e39642f3bf308a894ac0bbd563368655379a907036539e9d3b9ffaef4ecfa7942a543dab1502fda05a45513c2066ea41c1176f9674bd9a5402022b36fb3dc3c062e1b453134fbd4a5870d8f2a7d3ae973f99c7571764d6a8fd64a352cfd7e7f9fa2fa5fbc655eced16ee21c9ae0fd5ea7d91caba625e5 + +ModInv = 7d3e1251be6fe1aaab30546e851bb3620f4de1ae79dc5938cf334b88e7696ae5cd9d8ed6ccec6a44ad4bbf5a8610ffb605f3718e95591dba47801870e9511a512438240a80caa9067547901ceb032896cfb8dfd4b5daf455b3049fc7a0d7421b52290c1624b994639efd41a33cba374734a526fb6904b5ae889a6906c293c9c7fd0e5907f7a03c18a493ece7ae1ea9185014664d14489e0c49069be99ea395a97eb4f3ff +A = -71cb6047e9b2f00b2d0d403225b86ce99f563cc92dc6d11c494dc7d16afb8bab6924f19c9c4a12d4668128ad43bb96453211844683862e7b3fe3036d4e618dacdc19013f2e7f0245c9eabc8f0609cf1c44122c6d8511da973740c426f1 +M = b2f0a70137ca797a7de2e251efcef143088ce5062a37d5b94fb122cd010a06f8d63a1bb9e195d4463873a4b3eb450abbabc34fcc75497a28ee26874a5eb78e4b35707ffef2b9c75bcf5094e4ae5a7e736eb8f9387ec83d6a08466c0391adb1ccc29002b63a278b90a4b5199aaef62fc41dd0fce57e581355258516e8cc8b6bac07e9a8fafc40fdfc995183bd41e0afaf80496915159a53149954b823e07ef72d1bc571ca + +ModInv = ac84ff7949b5d2f6b331d92f54c09a644cc51997f9e02e6254bb21e25a62853b48b7d22f9e45529da7c5c56f65dcb983c9dfd854be107918805d9cf1b3b6b89a75a3580375cbd937ebcec899186ccf9da104d88f7be61839f7f74e15417ab0568f88a850a2ed31ffce25397edab6af58d46ad008b87d6b02a71842a339b25d4a24345017ef98081eddb08020077dbba9204b0e02e93ff66f46fa3e023d2c7f4a31e85f7 +A = 6f4725d6ad1106ab9eac16a3729190e2431890fd2eed79898bdd04249a7fe630b4d3bbfa5fe245f8339369da35c04a720e4476e704bbad64d9562ef263d9da64e630d82788eaf84f793039d27c01141a8230732287926bd02b00b61a47 +M = dea7eb920b2755a6b0fb0d7bb9882ccf595cd10aece5985fb9de2ecb3b80c820000dfc21d314a9403e187b88a48802c771c73982b2e74360baa5881d026ac46ba14cc94ed23552e560f37f4f2801351ca3614112dfa2c020f2f2180f794eb0cef59224d43d759a3b611977f53597a1e1db86f0af30bde6f9c6554d1bb93443ab23cf2c98399f709c914c57266dbd448f3701e5379657332a967803da3d7341e0ef2ea032 + +ModInv = 35dce39ec1be045383e3e131d6b9f0c0297eb5de99b7a9190e102dde964cf08ac38aba37c50e8456526ccbf27d50221c08b1415c8ba069ed134d199015475b4558f68c60639d361f8ace3c289bcda8df1ab528307dd486d35ec4b7d2282ce284e48ec0eb05f8303840a1ec2b98a981f99b7d5f8a6d19ff90d9cb660c492becf2ab38f5af8d3b3ac6391fb85072578aeb0664f9501a68868b56bfe5c3f1322af6d802e2f3 +A = fddf6fc3c54c469f6b0efb3dfcca312600482293f2d6d6470be56ed98239d6aa867d8c0ab11d628e19250050d5010fc19ee2446824839d561a32d8b10df64afce2389295128b4e1d5bc28a5d74134ac6517af629529ee2572da24bf01 +M = 381855c1e14a17a2a95763a65b8f37dae5041bf098821a29df0f0b548baac6bad63e97809b79ef1e3310ee765658af9572620a66baf4856776546912658789a9ec29f0a2ac55d79ab06141a33558cdc4b0fe390deeaa54319e5158f032d7da4ecdd1d0ebc9e627a4e78b29a931691814dbf5d2372d624495a8e30ee98cea40bafff7ef6a631def691eee67b54dc5d23c1b9e16a0f6985086d091397d6b0eb77c4c8aac11 + +ModInv = 5863460a87559742d11dd620c750e60fac6c1df442e6e551eb83688afa539fc730bb14eb647e6812ff7a6e7ee12244713e5bd91a384b30c6df884c69357764ba5fed5bad5b7bfb131a989d7779a8b43ad2704bfbb11ca01a39ee22b8f075ee5a7744d33c3e57ff3c2097a99964e885adefd7dedfbd1f254a208e28dc0056c56ce526304247543dad0027559c32cfe6fae7c699b4ed0970560d8567e01a0a19cdb9778 +A = -51198dd5216e1eb1c7bb51f181af23262226225f3232ea0ee4e446e3e7754af2dbd929002ce94b47799c43b9c5db53334eeb5189694f5bd4da7b009dc684d4c9a23d19c1a79c8527a21e56073577d1484999898f1edcc8993c2e4f188212 +M = 7f09dccfcf5eeb44158ef96b351ffa29f25b807ff310cbdccde28e3431af5395f0e9ab61be8bcd60d70159323861a67dcb03c0e95e39ab6d64af51dd33519740ae727784c6fb7f0aed57897efcd376defe40e2670c9da6eb86a1eeaa0ad2ab1c7940c824e92a522b6862ca1911717971cf9e457e933414319efe18f555c7085c18b16fdac19f1e80f119be66ea037d73fb0fbfc15a6adaa9f3f5b64d930e0eeabc4de5 + +ModInv = 474ecdf9bdea17d96a750493912d62e54cee2820d2c6339175d8fe174a6c9b765d2b5f8a2427fa91d3450680a58894c17a3804b323f4090c42048b396ae2fa6613409307a7b7090a45f0df8e47e239d45ca47568facf8cb9d2840b94693e2604bbd5016501750ff1425f7a0bf86ddd99c944e1db95eb78ec190acc77ec6d1b53da11f933fe4ffc848d072a8e270131011fd0a5f031acfd2482dd65baf6c9779a170cee +A = -9a98f81ffa397a39cc36ee7be13986e0a1689229bfc7a6b24d3aa1d4e1ace43c377c6cf97fe2e5052abd64bb7623654af5de8ac9cbd369bceb2d077582e628663940e7d2d6e4f5977b375df009628c5916ccaaed4550b1231fc5387801b9 +M = 69a9c5a27411165848305a496f75b772cb2592cc7fc3ff95e01888deaf43e7cdeee1582787be8cbfbc8d9ee113b8e6150c67e71ce3fa480a4929762a50cd539a0bb843d2ccc4c10695b35ac14a9455de08522d538d5d25ffec8b58aacdf8be24b8f73d21a27024356d49adb1e9b6757cf6ebec4f62c3f64a164305098cc0b485a2d8c594d0cc2dad99c520e2caee61204fc619c95b0b97b7da00b5ac947a9eb8109a81 + +ModInv = 11ad10354ff8f1b0d56e86e529ab146c462477bafed3fa292ef06651be920e278de659bd3c80ea1eeeacfc86820be942f8cb9bef11121ea8840ab5e35931e74be8b29748d4d28490e9c09d56091c465c5e30d67d6a97cff5bf1bcbf8c3d422246b0d566b2a77e5704131218e4ed96fa50693f366ab1e37e79ac5c04febaf48ec4a7a063528eca4c31b749fa049f5681f6148d757c5e5bf8e35da2d48f17c62803ca3d7 +A = -56c4a2315dd0c063fd442b16023ae8359cdf390babdcb1488b38e518fb88b164789bb42fa94832271b16a9f25ccaa74e532ede6a7bf680a5780fbc8692affe937395909591c2765a2915ca5db7f2659e7ca82851d4cf8004a2e06c7d9d11 +M = 41ba96d8749b8a755375c49093571ad50543fc25b9480546572552ce2323f44dd3467e9bc9a6bdf702796663f597c0dc7025a5c869361ad518061c9af3d8cec43b818d910649fca8d80e3d3de07246da7200ce55adb5d0a51d07ee874cfcc7f6effefa838ba7fc225448c80dd9d12bbc5043abd66f0047824a3431fdf7a4b199ada7537bf060199a87bc2ea94dd63fbc5008a675660d866c800dcf243357c35bb01218 + +ModInv = 23b627878d0215741c7ad8c8033901bbe8879b85e1e5bc47b538bc141d5f678cb79745b0830a4af79bbf2a7ea84bb4e4b73b7d229d6538fde1be8484a5d573904cc6d1970d4c554f33c8e58239de9125f34cefaaedb81f3dcd35d73302fc5089b2dff8582f11fe862c3fba39e5fbe605166d64186512bc5b77a8728bb1f7630b71dfb91b1e2a21aa1f15164f4e907bb3a5306ea5e12da1ccee9fc5694127a0d2a91b +A = -7919caba778643fc74ef4c7456d87dbe447ce655913a9714e9c128600819c54ea663eb264e3400e5eeebd24327f336bafb9c48b8d86e67a6f673f216a33b0e64c08f13567cd5cde901eb58fc2756e409d0767db84b49c3f8d78cb084354ebd +M = c26d425c35884ddb6ec11813d18e104858d136b763b748e927ad4f45b2d1ec15cdc66a7586b8d8459ba91c411e7ce566dd1922d3a07da0e62cb0734de602c6f836709354c874e4ce1b4d8e181c863564be0df72908c1838efa0d65007af6f71a0fbf7a0d46ec696a9d7c2e14de8c072b49e553506286db8845d8adec893da8a4336b4eff7be5c00040acdd1dfede2072884ea8d604966a098562046244932c74ab8e + +ModInv = 13e8ed1b2f5a3557ef9f4b1f7688c23d122eb0842c5bf3d12bea0532a201af315f53aa67dd825531f9b8393879147dc5bc7cc6e19d0fd43322bc7d76c65f7a5d3de95ffb06ca2efe2a272fbedcce55947bf5956c96bd2ea1eac5698af677e8616e22fd4e13f290d231ea520963647b78614cbaf005b6cc7af61065c1b22a69c47740b5485ade2923749dc260d6829be19b096c28ff57387854507d81242703d8300b +A = -55bebf932456ba807ca8db25e8f8d45e69cac747b8e0d684d4059e614766778c5f24d0d5fec4ecaa904f8abae34d2ab99cf1c898945030b60b0232879aa5df3c0a8a6a9a98182522c27cfdd7ebe84ea95c31a123958545d680535c3c7b573 +M = b439430c79876c79228523f6024e9e86abd19d150b7f24d2a0efae45e3f9e0e5f8005f6dd4f97d8f4bdb763ad8b7e9ca414ec3a8216b0aed99cb34016e86dee14040030f81826a92cf1e14d94c90d2641ae4b3a94c1a166938123a0f7a8fa96904dc747b2bf5c33add7a66f91176eaa199fa7166b86dc77ed4d8118f8482068b42dbeb1b06b04b80789f960e34772e6ce71e42f01bd70a62145fb833e5e0c8d16ebe + +ModInv = 1119c150aade15701aad902ea27dc7df03ba0a385c345af69250504bb5123f0ccbf4ec159480e7076f5c1645bce96584ac5e6e6a498bff3df5399b30c7ff25ffd695e1303a7bf11e59f2f63b75cee783e9c161a45068c81337302650497347a38190f6083e18a68006f00ac4c9b08962bd73bff34eb81e7005c174389b5b58ae27d0cc932733375cc0bca88cf8eb12d25636dda8319bfc9f19f16b651f5cf4d9c9bf +A = cb9fecac20f7ca6fce78bf1b6a121f77353122b1454a5236b4f1fe176f8ca78024ed09ba84d72e25660c543f5406fd069b661b1f14bfceab67ef0a1e28edb62d46b3e9e258b819a098429c23928e51e33711ba7f5685c8be4adae72deba7eb +M = 835808eaf7f3055114bc7cf586ef546a76f14abae682633b0ebe1e5e7fc201914f89e028494c88df2ea053fe5b78528aebbfd6f417d2e3ede41f7db9c89d43770f8ee2d50e841b2a1cf8eed83a9c4767c2c5054eecae3e3e4da158a2cd8f8bba6b0822b2b681ff9dbf48127024c26b9e9dab458fac287fe0a042a774ed6c58c717852148c708777ec7565e0cf75f2722ad4c1d045a3f69f468bf07543d20b36bdec7 + +ModInv = a8de9d4bd35915a9a11e4a0be693ba5ad2a1303efeb2ff4342e6871050c8ef8798c439fee7cbc3a4a7654f2e9ae99670959822ac5f33cef01d86856c3807234aed6db473183eef4ca953be65401d7fe2cb01248c9ecc626049233103325ab87ccb86f30b57b64ecc38e596db679ac8f0729cf6f26e10a6a38c39322523aa341fcb36564c7cac9987d6e952e7f8cdc23d701927318cfeea2abb60a090ff32042599 +A = 4de30170b4d749c4d841a66eef8dc74da879ff488ce31a9b19eba50b01a9edb0f6704dd835568ca55409835294cd7c941c53f7d7c0cd71e35147289bd97ed27694fdf22341f745ff9f155870388e13dcacf58acdc7e0abf39d625c99399c162d +M = b6ef48dc4f3bdcc0ef6d8d0a3430246b36aa5771b510e9ae7cd7311cf6d77242f346a54af3e3e2e0af03812f80f03f38e014ff855ce7d7ee01f1e0202c2588ae25a94328aa4c5fd017378ae23b58a9912cc3f69a2968df7d4196ac2d04e2a9b4e16325fd83a14c60b7282789238ffa327ceea0e4dd60a06491c93c737c35e9c1c511725b334c3901e631e28488930b2bc264c1d1a025cc0dea6457d186bf54ed94 + +ModInv = 91f021b2f149f69148b6de75fe5c777460183cf2b89ac1e9f65d3f648c1024cc4f3e26e3eb5590985f137840972a1e5f37c88c2a63b3d3bbc07939c21a7c44da94286f9871db6f8f6ba9c914ed6be16ba37acfaca665935eb9b79ad729d01b72ede64765967da6edec62a2264d568be682140ecf8450883abcdbd14a751392cb4b49f0aeec3047e8f9ecab1726d258a8f5904ad986c04a9c1a5effdd9fe83a7d43 +A = -364daf870fb78466d2403fcab14bc40628d82f271bb34d971f41b6dcbc0b016a3eb0f324d2ac9d48076d2b29314222a7a5793093372e98805528e5d31713edbac5fb8ca13fccd08963c2bbb42874dab8fb31036a5e328279a29432a3f60d59b5 +M = 963e92593cec12b9fa015ee812d49c3dc2be257f3e24daae9179a05ea48f0529b9f96fbdabbff1dbb6892f0f6d917f4671feb807da0e89c91b9de09df4e5b8df45acb730177382b4ae9d1aff136ab12bfe1b3d74e5c144a2dd96c4812377b1b799f23339e1ec6ab33d2114c0fb095fe9f46b9b61e181b417f2eb1c7a831d394a0cbf7ca8f74d0049645a1e808d594f49c3016cb3495186cf83880aede9b6945fb0 + +ModInv = 907c9199e777a001d7683d7fb205cdcf1541312d756403e2cae58ca621dc3fb203fb8b60623bfb547c7266312eb5a1258d4bbd650bb443c472f07ac09fb3407c01939d0f00908ca95c5f9f8a04905d25fc60ffc496230576b1443aafd6c262b0c64202a182b3b1870be8457e4746e332d8eb238ee77a9c7820df68076697f0c3123ae3faf16fb70145539d29d194192a9f7b4b059df24fe1710b3aed316699ef +A = a0d2519469b2cce00346b7d3adac716d73351408e61e39a6cb485fa9900bf97b5e30ed15b4bdcce27300a497cf8fd5955fbee04579a2287e0825024d8cef3d12467f9a1edef568f10d39a2b21ce57f9fec4a6f2b2e74e251ae4337fffa16645061 +M = ca2a246a502235fe9ca29de057bcdf4e49c48d3bf8a434569e83231abf0344d621d0efa93e3157646b3855fd46107f6ecc5182ba2ad13f19a0651732d741d1bf58b9ff2834a73a1fff8875522cdc41530288c7fa140213a89676aa3eaab960bbacf46861caf2de2513f5fcced5f90d37e4b80ec42e17e129828f5d8e32a071e1807f864bb0f2c4b9eae28f704c22970885ae2b889724d8455c88de8a086eee8e + +ModInv = 872213aba7b34ac9be985a8eb7b87dc9edd9a48c09f5cfc4fb20b2069d43300167a7ebfd99915590e334adeae5143b86fef773e2d3d64e3a26c8cada83e07472af040f323b98bc4b3a0bd97edf68deda6d3f10dc484a6608dcc26a9f650cc8590282b2b567ca6c47168c7b2acab512c0487c129fc1b59c8a07db569cbda5343b1dee6dc650879bfe8b229a36a5aa93a0ce9d8c42f4320bb27652d66b75f0a2c1 +A = f3fd6897f9ab99a9e929ce8c406d89547ea65a2fc6e8c3f55d76ccf7a9015a0b2341405af10a7b722b2b55927298688a083bc952a8a8986d6d22472a1003847ed59bab85589dd88dde12a76b71a194c4aa1e946c69c3e94422a03227e02ef0f01 +M = e75a59a357a31c2586053f790a663b01378b2b8676628753cbb8b91ea81c2a7886346f1be98dd76f91a951b57701493b746d4d4f3d8ce00c2540626418b2c436d7743807b27b42ab55b776175e03ee654fb5b4c0d60a7882e1ca5191e2ba45d46df94f65449da4c5809c1ed775b9fb3d40ded394fd20b1181290e470401d075c9186f7bd7e2fd40278479def2d1bc443968fc087e92fce419b0646abafafcbb8 + +ModInv = c8d9ec8cbf44344d8b909e419bb15a3e47faca96c0409ffbcfd158f9e204b57c307a6e7774f9d087a5fa5648bb25611c0d0e6a964001b936b3a255ced484c4774dbf9876f0e3754089def5b9953c159d76d0e5d71af56b1aa504f2a75349e9b21b9977e67a38a84a417600e0b47629e5e05959c135bcbec9a4f8ddca034875a547083ab25a470b31dbeee8fff3b3313d7eb66ba473e8e4f8f0f852e00c14a115 +A = 37dcecac94e4e45447b8c74aceb077661fb044d366a799ca20cff15afbdda7c4de86aa6eaf96c17d890bde48a454151ee9d2aae99208f69705bd3fec052001c4f7c605c62ae277e790d78fb05e73c3d7c6c6d52d65e836ee5f2d4e0b626194f80d +M = f9c8477292d65a463021643146c946c6e8c9bc76eb61319a84e272cfbabea49031e4c6f6c986548a7868e3407642b272931fc5492ecf75dcf9bf692a7f051a7d081273a9e75f5e6bc51d587bc0e5b77206044e4a8ba8da06dadb5b5dc37f8bbfa61c6c722472b880cae8fee1e7b63cdbeeb6a298d340f925bef215f4415ed9d999ef665360d2e6e25a6164bb90124c57bcf7a141bef2ac346a8b17c36764252c + +ModInv = 242bd131eb778ec958a3ef9442dc39eee824d944c162a9ac74e8b5e8314b2b76b2751ec4ec8660376ac1d17bd9f8190199cec19008f171edf967cc58809b1de610857937ae02c24b024d0fe334aa59331abbfdcec1db174245fc49fe3b0cf0da9e06299c77027e8278fef4b624aad0fca8af096eeed3be4649c3b4d39d332d8180c58a43178b2b1435b37ebd4cbff17fea693fafec3807b16aa44c443eda96 +A = 9210a777de5a6d09e783bd2acbd970fa3d704152ade8437d3bd9771fbb68f1c41f1cfaa5e0caf83be166cd7d471bfca641d778d1e579e0f6c8b908545c30010a543792276b31d06af566ffda8c7b1c65a08ba3b2fcd9aa1b9b1cad68dbc73539bc9 +M = 6ddd9fb8b674fd2af547f8b03072da91f9a17c08af5497b9708a91713b10221ff237c86eb0f3591757d9383007e1bf288ad50b1b5f49ee2f1cc33dcd704e6bf4675ab0687b8683f6257f94f34bf45086157c922b587e025c53111912e97b09a97ed788bfe7442e7d06e471efdf475f0c942bf62703d396c6fe628c46c9ad55ad8c5ba3e6b85ec829042cd1170619ace37914f92badd50d64b8390ffe80b977 + +ModInv = 2fb8c72834955ce7e09d3a99e294f724364ccb7b66c22db158ce63157b1e1d99b6487151d1d5d51dffb10ec4759ae0ac5446a0479b52d8c65a572de51aae65d2b5dce6580bc2cb7e9a022348d9cb299a30618a24cf05d3e9eef6be6216a0215cc0a1e21799f7298de42e8bc48867a737ac6180bc1c2569fd1a34218dd8809e43e4a86ddcf2a46b242c4cc776c4b6d6552371779f417c101f5e760acb4c01f +A = ede11eefb5c0fe3f7f14e06fc89649f9b43a99fb6ec663bc45c18c1a87369f4b56d2ab00ca3ee9896e777218d06eec35bea10a3bf4d9c097ce1389a5b1d8560d8297d4d495104513e9a493548b905e5c7474fdec65fe721297377222d7283ab5a383 +M = 138b7d86a09d76939d412c25d6e1559c10c03b591e8c2308bb2028cd8d4c489635f0716a3dfe43d27ba20ecfae3e63d07da4792027d9dd804b29624fefc8ef35ae2cd6def04b77aa8323f6a17739631b6ebfdd447364c8959f352e4983b1175698042793a9ba74a4ae0b71d637d8f2005075e8e99662adeefe4237fe0733f5bd72f56ddb589bdd1a845f0d554949efe35fed0d13f6a1e7b1243c1b1d3f578c + +ModInv = 5db0c1924ec59af42d030f0b72637c6a427bae32963602b1b0104fb2f81d861167b323576bdfcff39f33bc4e96d5d4b6cc9098b05b00d5da32e412f24fb2d3befe4f8a453cbe6bcf1f1e45cb0b8c3598f1cc3316e27bb4b31998d1f0095082c71c2eb10cc25e3ecaad022a83503077d9dc60831ffe928b7f7043cbfaba19b25bf819672d75498e9641227dc89dde56bef1d33e5ea4c7cd4c7b35ebab2723 +A = -974cb0f01695ad172171413f8c5eca0664032ddbf46e69217fb7fa543119cd6caa20a15e6e1d2c799d841e7b8b4bfa55fa9ee34a6238a7f90ee941a79e0cbe4e52817def50f1663fba72814e767853097c9ffa9b889007ff42f1bff5e113d36ecca3fd +M = 7d227b40ad06e575727fb008598e3035afac034348ec21ac44d9547867ceee8a8abdac712d7381d4b89f16b223d0f386ff1049080b9e7a92be3ed8bf9594a818f62521602bf850253c9f71757b956a8b5a48bbcd5cac8d6d963460198382c4f550bd9e88471fa81493b8f2aa505bda6e7ed6ab731e9f2b0e2607d85aeae0f7d9c516611185e7d7bb748cfc9a9500b5cfe43f669004eacb78da4a56c09f48 + +ModInv = 70a7eb6e6b46e3c30287c628e526e44a1ccca69b175658eb18ba89154c1c4ab36ae59ec448781d2f1fe710b74d54c4aa5e96b9c57c966a965b4f54b5daeb83029a6db6a54f4bdaa922a43818fc60ee60fdf950f6ccd10631d06368fba9490711069d640605197648e9ac1379acf21defa4d7d0522355d857fe5d5383ac652bbf7c29d46ce5dca34f84308c713e5adbd1773785fba0459cc815c1eecb90a +A = -a421f6c5ee1d4f40f52fb66696d2974684649fd8d1044920bcfa1e62ddea5a995abe3b94da3a2ad716d157b41b52ccd5aa33c824133299074885d9f68eceb3f859a954b2e5fcbbeeaf52ccf09ec15a642f9cb22f34c2a4e70589b118235ed583eae83e +M = 5a5995feb27808259df473fc9eea8858ef103ce03f828e6304b87975aa54910831a6e96bddcb26a14d50687fdae7669d85357e2a5c7ae8928ca97d189f47e83376b478a953bfec4834daf33dcb04c81c098e8f589d1f809c29e2f09809806f014478f061b278ff716cdc414e8c2c64bfcb43d7f33a6fa62a82ff6646697f1f6cdbe60e54ee202a80152611c13efe411199abbab6df4cb20b9e71ebea4e91 + +ModInv = 2d93eb07596996a831cf9a3a9565054b1968d9399db5ca809299208523ccafc60a074e97deefd126a39e1b8532c5957b17a094e10e9099e0e9a054cc531022bb160b1cd96304fdfe4ff717453e77dcfa5f6452d3d111881ec80e8caee4201ac18388dc6bebf9911bcbaa61248282c70c06332915b6cba9fc497c0f648a5296accf0dc95a7bd43be0cc292bfa0977b0d66c2633ad5a3f7fc9d00b099392 +A = 90edb54f33b33287575261cc9109532514a20d0511ebca25217783d282090c70e3a6dd7e6fd7094be5be6384cbc2e894f21758b3f7569f70e73172ad1b943720b483492e82694a546cedabe6f5bdc0fac0cd8becc7cf5766850b86c6fcae3ca8924ce480 +M = 3635b20dc2e804a1f19d1960b575195b20345885220009c7762f3800b681f57a51faa370947552aff68d548275493f7a61580a72ea9226c3fcf5f348eac5a25b934875b2d8b1248439521152725e9044a9746724ddbe2be6a04a47eee01b802e4f804a8f67e4c35ad27b913042384b0ab780e1d43ce2f9a13bba89e99d0ecca9db551dcc177be3366e518b9d493437fb3ccc021ab218f656b7d69913bd + +ModInv = 25d712e8796c0534f5ef5b5a751f5d0531cd5e3f5710fec92360d538e85763be13cd4a3198601cb5c834046ed50ca39320f78e76cd4aa00900bd89cdf1c5b624d4fe95d78ab7632dcb1a7c8f18fce204f7ffcdb93cb4bcadd75bf5950bd9fa5001360bf34168611b0fe76a0d98aca3e225b37cf1552c5e024e8125698c769d48a844c83583ee824144d6fe63ae765dc59c77c1542faef3770b9e68a3 +A = -6e5839c5648d43f0bfd48b156124d3f89b89d3bf9c0e82b81cf0df2355f640b013368839549d1a67eb3676119e7e0b00f40843e70db4579d3950561d9beab2b6bd82c2a8c6c6c51e4a73fbec8d7905308e0c24983c976c0daef32a50bf7f14bf9aabde6bf1 +M = a90a7592af1d9624c6557d439a3557916e52b79a44c10c9b98179a7a3fd3ff068551bd97a484ca638bec15caeb78732111aa91e326e6b8ce9bf30d6025b9ce683a5097eae2ee209db7a550082d44b48f836477fab055c59a00ac8af2b645a67619248f6be4837a35bca070f738732cd99053016774a085aa2aef4a032bf14e940b79be7358c3a9ebf985f7b351b9b3cb4d1decc258d3acde2c8d7f52 + +ModInv = d17f5234e7c20786c8d933cbe33bb1f246d6ab92a7bb52e45ddb6484b7c3091a996d7f14dea398317560f4c16e61b6d9b433820a4ce6e1ee065791d14e72456eb89795f41e188b7abc84275e75001daec6a188e54339d1d0297bd53debad1da6d1a296c2f8c531435ac5105e4713dd0a5c1911f43c1707c834f36d44ac08b6bd43e453f4a26f10438b7df88857073e8b81384019bd29b4957ca5ac89 +A = -b24c92658fb025e384a2d7e7a827eaad417ae27427ee566e35dc883526cf6a58bb3584ef7986dc099d54ec566ae0d31ac622104b23142cc0e5ce24c2b59f12cee57f15d67e1817a34e7e619dccc5c72240cd032d491d2250de5af52c0c349dc9be1aea17dc +M = d8ff08346a93bb77fef77bd709348bc1cc299ba226098153ae088a5cd31ae854445d4615f19c6ec15af795acbb6876a18ebb95eb6732396462d0c8808443181e4b01917072b77d2ff8fd07edf137d9e97f28652f952051bfb6b318eed843fde69832cd0e9c1121cd84740935a199afd3fa2b66b3f7244a4c47f79f3feca1481d55b3ea4d293d99a5f298ad7ac2495be61a0494ee483aa74e956f9aab + +ModInv = c0c4da1bbd012acae7a25a15e20ee0bbda1025ace2307f31fa4640d179b00a9747e21dcafb56389c88b0082e27ab28d6e187c072eeb4c431ca4325831068bdb9f81a1d6e6ab082bb8408a09f8e009bf11d5615bd9e00acb93e5194abe48e5eca5e3509cf0e660b9748eb0a16b7e844750b3ffb0a0ce06a9a22f144c02d811478e2a0305833f1108ead3365d7f18e0b5ed00b7bfebf41f0c409ff41d +A = f6bceb6922ca89f2428f60f27a11d29146e040d8e8612b230a795afbe4ce1bb56ff03eeb3cc0356befab22451859de959fa9982bd6de48cb70e698b525ffcdf0c92f57366ef7c9e2b34fb92428d494aeb15186e1f458a92da48cf7106027da8b528c74098e +M = 70f7d3398839b5454ca1e926efa0cdb43df318f98b739b0e1759221dcfd3f0136854ef42cd7c4af811eda419f0050a93c6337e4cc73262937a605fe915788e11e718e4bff49de87f86fed37487a0202f5159e1be53dfd013ed05a657c610978f0ce2115de97bda0b84045d1f80a7245c28592ab68264e46b8b13c60a7c286381fcdc1f52eda6af5ac52d2aafea894fafee1297f7b7765bc0c39472f1 + +ModInv = 2a08fcb8fab3adb7948064358dabdfdab13ffb0b1c2639a2f766b20576164fa0cf3b4c92ac40f8ad2d77585366fd850954860aa2478c4b7e22ffb7372ed5f9bb94eea2257f3e949093d104952a97abf83b04b8f51a6bcfd4b5f97fbc78afc3aed2ebf5fa6cc7164cf9519df131dd8dd10cdea16890d47faf0689df70df2830aa10bda53f24edae29becf50cbcfe23b9c9fb1d35b4793918ad00a29 +A = b374117f9b3144a1f0a402f4eea62ed48753c852873ba0f42e6188c6f196d30b99fb3eb640b8c71fe0537ca930456346ab1c59d237b2e0c8cc433ca149bdc2c21a69f006dcc1c29429d770b180a42126ced2b88197ed48c4c7a8a663f96673e9e84e5d481589 +M = 7c3a4dc91fd622ca7b743492cf57aec55b4213e0db1979ef3b0f1f23a7197081bc1703e5f43a56919e27f23eaa6749b6a58d339c59b24ad4dc5da52a4db672bb3877168d8b0fea098236b0088f9558f794029b8312892b96f1ac3badc3d1b5138dca47a01d685690b61514ede6b87945b9a46d853761ae35c74b86ec09a621f2563f9d9838c9b21b004bea9468f6370a9c3f955a3b774dc31e0a4f + +ModInv = 2b268ddc660148481ac946e8bcb8e914a0c4d139da86efe4a0de68a06e8c0757aa96694744c9adc0531cc56dcd600693e6e2eeb230084326a3b9d313c70605dfe6ef357da8b2d7fce343b09559488dd181f0530b0dfb2f43e54d3f661401cc3104b34da49557fe11f281539ab2255351f47243ab38fa224424635d32845a348d6bc2be8020319643a9f9af514524980d1275a3366ba49a7cdd6edf +A = bdb979075d24e52c32578263fe5648f593cec87603ec71b1641e3bf32a1c115c8586ee8b6e466e84fa93a48e9346e1b8aa8534849fc243b25a7fe7f7fcb1a48fb627f19035b0d0f4dce92a79c1b90ac7235ae0cfc3c777a1008892d962a3defb4b63b6f28805 +M = 32a07a3b8777936748c8e76c3a2d1d084ad5fe7fd1a41d636daa05b86db0609dd59fa4f9cdd1517ac4f59ef09c23aeb71f85c9b903a8069160e1ded50c3d8626c14a423d1047d93e4839e067fef94b09c76a64cff21a3b113dfde2bf776d6843a174a09ef4ade339953f9da319e80fee144002783b7e8926436b220afe02c1c36748e6f6459fbd5c00696fff650daab4516edc6badffb5de05e7bf + +ModInv = 67c243b8ca3d4919a07d71efd74c1eb93c39433938017ccf8aff7737d7c6001e70f6f5944fcb5b9f292e3e574f970da75908f6c4a87b7394ca68bd76af8b9a718f9591d78b480b298fff6a144e410782e7e5479deb030350dcd118cd836b5aea06b3346a77429278bfed167c31b6cfa12b9723e4d9479425e853aec0717fb9a3dbe646dc237cdd9b2ce327b2452d56b11ae3a285326d28ff9ac9 +A = -52b0141ea572d1b8bf4f1ff3b558e6f66a716b90336569a7459969362bc2be60ae9478ea1480ac9aec27c347573c6df6c465cc313f04245f71a41eca6e983e4f7a9411e404a9f80c2f67d0170751507a87ec1769552778e41760c01b5f39489b851b692901a597 +M = b22443c522a4988aec4619d3fbcfaa3c72f36c9df821f537af68bc80a118d6e98a0c94231f977099dc28a89e23510344e37a5ef7f4aa49e7c7dc9a5eb3016fb2d42c9fa936e25d0fdf192ef33e1b886f5c96496c4350ee5859383b367fe55de9e3e4e587c71009450e9822f6b007ca7b4709ceadf3547ca0014353e9128a0a1ad6b89f0d109e271b400b6dc86d5dc133e810be6a42a72c47e2ff + +ModInv = 2ed29f323372fc87e8c3fe93647060c3c8c3061f829164fe5aacc011b42d256f6ced8083983e02fbbe246ef40e53cad485066f3f2469775c59d72b38edd88b36f566e6de0c5158b72dc4f9e86daede239da044f0aa68009d78e417909a2793b87d5bbf3067dc776521fd83bd429195497c42f7f4324372297b49fd53d9730f41e32db1c6d1cf26ac2382e168547f995c43f5f776d8a94664ad +A = -1b925a5bd9d35bf961265f8281a1848f210be5618bd71c29667cfc207560f6110b556625a33dd10a6ee0e533f65203757d5961ae578f8c43c34aec4ccd0e90952e806097d78a9fa92ca2b8402baa83304c0b0ed53e12df585a350f51fe682c9bc32bea20a54a5d +M = 240656fe31573e57a19cb9ad1a82851d73168bf72eee56516ab0685a35e497bbba38137a8179d1e85dd82a07a6cc338cea045a9ebd1b2d39b5124d0b466bc964b15e69df9ee0356ab8b11c1168a8ca76df208f40e29b67f62302f73247341fb127f5b38903715a1a982b428b6dc577214610c09a399ce5a1b50a6f79df176436cb4c126766117c1294b2ee58b587174edba6c3ea1ad689868ba + +ModInv = a1cfefe95c3a0c927cd9181f1bce9e74bf31ef89559c0569adffe46f9ef1931687aad697d9580bf4fbd352e237d1e81051c1340eb45a97f852c205b2e5c215654daf0d209e823a6cd5da56d64de13bdc8cccad6e83610d579556949ae2bbc914db3c487b78c8711eee7e7da685f9f2b4960ce7dee2d50863f7c680bd8f636e4cc392cd60e591fc2dcf499160ff4bbdf2c52ef1706cf03f8a0ea3 +A = 842c8b3c92ef1743f0e56c41dc00d504c081ddc5f2c8cc2e44d8a3fa435a8a6f659b39649e83a59349861c0aadf2dbd40c49ae777eecf5e17bc5b7e89af5af898d8963133e888ec4b25b07d09281d27c382874888ebed5ca3c5fe351cefeaa88e59fbe784bd02b +M = ce96645acf9b3dbd929cdf7f3be0699a0788876d96715d3e9ad19b4dfeeadfcb4882c28f467085453a2934a86924cafe7e677e1d4d0618a80f1396b5a46ee288feefad0eda89deacb76b60d1e9802e2c064a13fbba12d1e47915619da946f9377775b47005153f555f5f8e30f026c69a2680a9536d80f1126bd9aad86798422bdee6e129d9841c5de45ee38f54b3f030a06366275fb4c227aac3 + +ModInv = 498130661f68d9365fa45579d4bc3b3af9cec181329ddce8b1d1cc1b3392ec7209d85ee21b3d485a17eac2cf81be9f56890a460cb671c2dbe90bdf4c79b72c13bf904b971fb91ae1a8d48238784710ae233de3727d2f9e2e3b81d5970c1d4120a1e9ba230d9d351b794af75ec588fac381233916bd7a6b835987e8dd030749fbd7deca10b1558dc46cc331ea48039b1ed7f5a03d5e6cf964df +A = 9988b767c409afe441d5a7a31642593ce5e07408ad2a96ec3a15f0688bf4c3e23744c8ad10ebaf97033b5b26cd7fd646c2dce4c3d9e1e12bb1dae6b80c2ff821e5f7f00324fcfcb20aad8e7059b953eb8b9554dd25db1e90d0d8ece0c157fa68c30db0e1a515f04f +M = 6c2a815a4b6b0914b0b958bee39eef35cc8b9dce30ca879c0be29d2ed225bea7dd6af12070ffff31946392eeca3015dc913c2bbc5d8f3bbfbe997e9a514933064ee75e106ce397cbaaf026c7081a183ee9c52c663bc83e9c3e00741a96abc5e82d6b37a602b9512caf640840065868cd1341e4d085d3d86932112b128c69aeda398a91bca040189310457a7772d13d0d352c6f2393ca9db294 + +ModInv = 5474694a116b5282f89f771e0790054969910ab94a8817c682bc49823ee6f7a905c47d3df5280abef7d6b665e5e33f122da84c847981e4cda1fedd0a3e3283c72dbf25d41c41906ac968c3d6b3320c0c6449f949a1147878ea4a66cb93aa0d9b6ddee2ed6515e3388cd2b6c835fdc494f6efe5c7b11ffba4268d4bf004fa37a5beabca7d5e59a699f36b0e405d4c68614409f3e414071d340d +A = 42c45ad1c6f277225ffebab1967c176456415e6c96f73f481dfa5c3e085b1c44f049ca07cc4c2a8a31be04729942f824fb47a9f135587cc6bdc5af1ddf10ce7fa252cc5c1cfb68a2e4ce8393cc8c9fdb92355b434b2d7584bca0aab6fa20c54ba48473b0453ddf0f +M = c78549ddf1eba2fa4e91285e9934496a57267b02e3ce509edf47bd64d64f6736e558fc45ab164c885c313af6476d4c41f660cb75ab67cfe7484b82e65e038de723654a947b71077b2c062661a7837da7902b9a36274bed2560108b1c4035f4857b1e6f78e91189bb9cdb4d6fe787746b107edcb4fe420268f338b9e80cfe6ca5cf03db3f9f4c8260eae8bd9b86487d35f948f142ddadf8a251 + +ModInv = 2b42f8fa6131ab1328e5d80b8944cbd731081140cd97d42b631f9dc633265ec025446406e0eb4cbc029a182fccdcc6ce96566bbfb4a32d63e29f152d2f6b4f22d222a46e7adcc0884640e159744d963d8fb68dd666a159788705edf44c8a4defccf3eb7e3d7a1b7ab0c021479428732d8b3d4cdbc82208de8deb5d088825e544c26178f5ab75d7dcb70b72b499386c135d63363b7d051ccc37 +A = a77a429b200bcc4fd1e9d3bd23c698f7deea217e3bc1bc9052690a8740158255386f10bd2079c93bfe64b60696233137b3d583c3e141d5d6f8eb7c8a03e289769e25d2c63046064e241b265ae4648bc25af4f48d7a55aaf5402d1113a34f6118c92e5da38da55429 +M = 41b6f1eaf0f07b6488f24b43a90625a6a7424de7176eb7862867556d7e4c06e841c28f2dcb86b280969b393105803411ae79b8a94f70f68a0e84b8458f286af1493fa87c277d2bc27645623376cfd7398ad645cbd67bfbb6bcdc48da2de49e65b08c54eec42033a83ba6dcf45d36d3dcd3717819ee15f482e0dcc54af85710ebbe28cb9b78828f50d0541016d25d76ee595dde576386e0e64e + +ModInv = 46753a389cd79585d481c7bfe0510eb0a70ff19444b3b921b047f435f243a74bbfb51bb50ecbf2a089ba82b35ace79e79a8ba77fb2abaa75041076ddf38dea6d35e7c7409b37c6dfbc6b4a67a25f1be496b8ad919b3e60e54ac1be570b1a9d807103d2e53bf49b0192a8dfb51561b4c406a8ca5a56daaeb4fd1816bf72c24bfe5caeb9ba2a4d90215a07b20a1ff1bc1bb47891b3f459972e +A = 21daf6cfa18be121c66d7944a5f89625c282c89cd8d5d49a091fca4181551e359898f87739780a65e826d40f451f542e5dc5f9df40c6728b1ccaec3f6460febaed9b6e50c4624c343d3a6bc73be72163e49004885080c74b9d564e73238a9bfa29a7013ab8bb570509 +M = 8d333bf8ca53bfb90189113de62e66985380e3c362efb02efbd689e4b8239a1337fb74bf5c0cad3a0b3aca95128b0465ba8700a2a5163d3a0bf3b402941a6686fb7590033aa16e265b9c42e6698f7910eacd94a42edc911ee21ba870de764940d55bf41dcd6b78d28e7c3a72ee3c99ea9eef5d1f3854c6639cfed9e9d120c11d3e96f6b6538c28837b1d0e4e28e40edf1a196e9452d6e36d + +ModInv = 68f3a899c0a60e539a404b066a3be2481461923369b11294d819a0cbd50d3195ca694d6bfe1021952276d33f3f9ae727e742d5f37adc23574926a61c4af7a9ae4e8eeaa1323a13eda3a33ac857833bdb9b79e4ac80641f11ae0b3d0bbdc63020bb9d3a84ce2e56068b4a7aa6eb9165962bcf6faabfbeab4cc2d607e66bc3395dd525cebe0d44e970c9e3a7bbcea4f7ebe83429782f19fdb5 +A = -ceeb8ad10a090b9d72db30b72a4428ab634c0dab3bd44b3929ed39b4ab7d7220dfff95fb32fa8ae55df59cf7f4246c889b686662f5f1375624abf1f8f37fb859b17e86c7a9ee63cdecb95f20321bc1b3032b4d700493cabe7f5b4c3aac4a5568af9cf865b1912f0a53 +M = 758593ff102ccd182e426d0bcbe4a9023afd1d5335c9ee1ad3bf38047df5ac75f3231d7fee4bda37a68326f9b5251fa36e08176ace11202646d70833e668d4a6cd2a313f42dc01e62a542624d1984c9a0efa6634ce2e2d86dafa22581e6c673cdbc5f7af31f285728db85747d32cfded91f13ec9f208ff49b1127a8b9b32d03b291e8577f84be7b6caaf69bc01d2032e62735ab25f93b3c5 + +ModInv = 2a322de2d6f4df478912bf5f67dbcb7cb0eb50cf43171e63107035204dd706b67e1ebb003c35d1afda5bab657b981f6c7bb0da5bfa2c177e84013b03d1047c17a83e234636d902ee48fccb7e3736fdf6505200904b3aff0275442d550493b225fabf6210c3ef69e80410ac2e1e60abbf48d2df4cf9b8c1bfd9d9cd9e944b32a25dce71ea103a19db65be74612815aca1645ff4ea265316cf +A = -6fd7e6c03ee4debf2f7e1447c9ef025229ad64902b06ec17b3daac0b5d07f0804cc62235e4c9ca24fbd224330d4efd0f18b6a6a44dc0b95672ccc4fccef5b4d9041c70dd8df08f43058e25ad49fef8b9782edd7d2f9368abaf3943fe30322d384fe3ba94604b9f9031 +M = 3057ba53af349ea7815058bbc429001c1c5c149d316ef3bc99eb2f9d497183f0ad764ec1aa17cf2fbdc3518de2405031f02272e2147ad89b3a71bbd064b9ca0aa91b01728f139b29e8d58e86fd3c76aad17c8d6ba698e21b9809f6b962da09a3f59a30eb7a9dde76796b243c4c20ffd69a24cd8aafd74a47a4552b7e7efc4077779e84d8d411f17ffed4f7af670ce6023c86d27f9a561090 + +ModInv = 2b3b144c0236981d0b827d4eafc3d73fa12749aeee4eb457f53c0b28e01942f43516fe8c15bc222f1b8e3f65ccec47b86279eeca365d43b8762a744ea56b1c2b019a6c2931c666abfc3b5570d2c62ba7167d0ef517966b64bf0b02ef0ca3f3f0ae5cefc491b9a33f078423272f30783e742e5c6c2888d48eddc0f7931e7c0e443ebcd053001b00f9955948e4fd37e7d1bbee466d093cf +A = -2dc6571adb1b1332f7e37e31aaed06f441b41c2a5c37c60beaeb47544d5ac900899d7b0a5a2060bf6910e077517a8247e5a3ff4fc17fefff23361a9ba4fab7119dd5392fb95359830a7d75d638d875db2e04d92b67418d151d0f74f5010968aecc54e946874f35153715 +M = cec94b32fd386779548c7c73b941f2d4b6214a48e30ef62523815f1dc7203be09364559ec84f258f50e2ae7765345524c8516658e9cd320336a176118ad6eb5dec3739c743656701730dfdc2bc95f6e558a68822b34b14491638926b2db6319b2d7137d8b388df19ff6397a7d69648702edc6de4d7877f0cd19fbc8005b9a38777a68846c2129c1065a82896c6d706f837121bf7da00c + +ModInv = c4f2f5b9ed8c3bbc7f4e8a74fe126cc8b05ab66602b18a7af20c5839b0c45296424baf512584432054fa3cae5b5d3a024d36edf8dde29865ed1e1af3bd3598db10492a0d0524143e46ff5566970773c0da929e47efc91bdf3670198011b364c1c1c15ebdff785ff6aafbaf98096c6454f2e4d981ae30108f401330c511e5e59580d08dd72026a16b5a8204b2a26fff18dedb596e8c82f +A = df54d8182049a728e32594788e39854853c8ab631a3569627c307310894ba07cd6bca4ac526cac6d3e32fb16927fa1be4d8f61a1964af4f5a40386c3b642369d1519e9f161c2f7dd8b1f92ac9e3236f9bf91639d2392993ed10ee0169305b24e16c8a81c3a5793e32e22 +M = 28998073d8350c9ed0facee1e4993c110e59509f61e119c239f3d802933f8d009b502350818565f794bb47d56d79351cbfbf3ddd11550e13736830ffc80440430d22764ed3bfe26a46c268b941e6ae220bc728d7dcd9daf98089006b71928ae9a97049788a766a819e1ea41c6074bccc3e894483e2ea0aaa91b911a82069fad7e0c25bc2cab85b5233bb34b5296c78e0e2e7ed988281cd + +ModInv = 78e7293faf941d83c06e356018425b133d66173c32550d0073e4dde2481a61d4ef82a8ea7608533dab42727b337b1d7e2a1d8f1ea53e22042a5a9bb07ee9113bd90b7d502083ae36bf7686b4960d9acf606fe89e8d62e82147b2c2e958ac55d6889bee5922d95e9ac459d3ecaa65d147e9d74c4b500859b936c4bff3c29e1db5e42104a2fa7124ef945f6a50611fbcfbcb4cd8aae8 +A = 34c9879c37c6ad10f7266172932517bf53021c3ae936ad0389f33a174b790196934dd848b4e8f20638f53bf2760738b83df0a070b8c7a6f2f90b38a5f4374c16757aa2de7b5df7bf378a2f72abcd20d5d75aef79ca2d78766fbaad9bb1dd00bba8b3a8557b458ddaf6a8e403 +M = ab32a7eedb7a7632a70d1cbe7d53218cc575bc98b400177928991694d2d3d62ab3e474718386635610fd8b3dcee4c5529ecb0ea5e3aab57d9e6ec2f52470c1bf49ec1dab66282a4b48cf718d98397dc85eb43bfa2e530e0ed90494d3edf8e5e27be62f91da431cec81af78b50bdfa689fac17255a41a0d3982f1486bfa882055dde6361bf7ea63b90a439ac2feb08e56b5a44ac797 + +ModInv = 764eca51a55adbdec1d4b7a19428b20e48e673465c6b4b4c1a09a2788a09f69b772d9960160ccbf5be1f76b76a01be2288e2fbd47401355cbd67188d4f696eb744468a36ffe9e96fbe8a184e40933938f5fc483e1f379a8114ca38fe4facb10abd1abcc4bb381164646ca74a5990d2a6b30ddd6756c2ac0fa910a2fb877aadd35b46f47ded4bf0e90c5bf7e3e723894bbdf6127e95 +A = -5cf5dd2db3b995de619b9c317de9a3f4ab42990b2f9e8cc4a7d4a0ba65ff93eed91622869c94b22425d609983b74310e6b98bced232ab127780966912d00b90d7b9e792376994100285faf6eaed8539cde5514c86e98571328c2e63c58e4b7af16a2900b83970ef58778f85b +M = a87c30920213e72461b2af2cbc1320e9ce6e2cccd161bd2243deb23f57dbc53a3e3b4bc434ce154f6da61678e517069dca2545304df0a14be120e35a38262d6db97931d06d6992514c07b6cdca67db41b7ac6152a5d37f03c90ff1a645ad3a1f3765aeb6dc5a4f80836b151b2d55c1c9bbb27cdcf20ff154e95c34f5310ec366b9ecc70084245af8cacd969ace3f40e0daf4c2cad9 + +ModInv = 5b7c354adf438edb3621b4d120afe4c903780395277afe5161d8140814f5ac25b19e21a3321691ba9df99d9a2ae50e4ab450df4a433ff7ebb7e7d9aa5df22706d9ba467e8a219aeca6865832a941147df2c984c3b2b1e49678046f3dabf270593c59f5c59a171c530a2f2a19f1eba9f0f1204ceda80f6195974fa84fd857971f69f44367e800844e763ec6db14262e6bfd1a5b71 +A = ef32195bd648259c29d9ac97539ac8b04a15e7aabb2db2ded591dfe64463642e5e4984dd9745850ac3e187486fd52b52149b6c86ae586417c1215e7208017cf976169a5b8fa26fa16bc4b606bc265b1d9c32a043e9ae2228a859dc9ce90787d5bc7a0559adee1657db4e482e49 +M = 6e1fcdc1264b64bd5add6f2f52f0483e2445731111f63e9a2181adf4a6479eaba63a19fa9d906526ef16331dbcc1a77e393e2cd1200bf74fde0e15f2b7a753fd9452051f5a2f33a58226b3ef9fd0037446379c31839c29d8d0e3569aa29967f746b17a0b79b7362ed629bab75504b33a3f79087304d6b93a203dea87c0fd22b93666c1ec875946698cbb26f3b61d9573ecbc43c9 + +ModInv = 4ed300b034ef2481ffe69933036c8825cf453c75392a0ceaaa3127a9e3c483e70cbc9152a33e5842866f4511924543149d953bf526307428b22f5bd4397537e433a044015c84ce602c424ce235aef48a2243e164506a5b05425eb534a75ba193eb3cc7697822281b9e52888720257dd44c253258dd48ff690175624c5e3ded383df7548662e942ead25a4fe11186adf41fa06dc5 +A = f5795cc22fffb0e346331ed6ea5ae05bf4fab87550a5d3d8fe23a6e957933d50f7729151c4e5627110ff3ae23abf829d82040986f147c4755f0413f610d3b99335eb682ed3cbcef122f2f94f12a59d1391711055fb068deba8d387bbfdd4b35ad28e2a945c82d9beaa66746b65 +M = 53fc4860d6be5bb84efe3d810fd4c00e048fc2a990df361d6a3faf221351792489eba8b35989a0dfbc89f77182d4d9af119ce7429579b4e2d62243463f4362a277e8fb7220c566182babe3953a286555b3b1596dfe4254b146676375b5309b1d547cd2a6b4b0d70fc5b9b1d07b5ef1f6a521852e6bea4dfea84745903e4775d53b68bf97db22fe75b8a19b59c27b01e09554d7fb + +ModInv = 6f7da03ed918b6b18921d58851810e114b39b44caf4af171c931bc1fcefd52b8edc213adde4102e1278250dbfa6f8fa1deb0297eb64d0e2ea43a1d05cdf910e829d70f6e71e4db9f4d30c9b36028d8fb783ee7c6a3d2e2a2b33e2a0d11a9f81cab72a9106630fd3f63917c06322d5446d57df8b1dbf118e7354ffd841abf08c9abe2831fa5a5b6ea1777aa203d934d4adc125a30 +A = -a155081f80445cf26fa9f3a00375abc76baac76c685af1894ac231235eecc7bb8c6ff55261b1b1b945b03c35e030ff844bb23091bc107bf2bf39b112285ac7934118d3433e603cac7bd2b1116103834ed6e3fc788059bc2efa24df602104b8c36232b0a0261e27c870ec621156 +M = 95f0626880af2c577d00047e4106d0b7618594f26830f00e805c77170d45f1f75fee95d2da3753b7dd4a03d29cf25ca273dd93e66261692389e0da7db801805e23b80a19ecbc36f06195eb8f2e4f91de1f25e31f866bf1c222f7a1130c036340cd4276176bcfca3118f415c0650723470eeb6c04a35698e24e86f28ebf036012399b4e4a459063d7e5b49cdd4b31a3680414ea7d + +ModInv = 772e7bdbb3cf14b00eb9338a2b3f7a407d2a5a238b282a53327f51bd381e638e9b0cb130ca6df0fd8e1a9040b5277fd0536db1da2bfc56be1c7a77c762a745043b7e8b3032254c47c7a52da3343097c0a5605cd74d638bad19e20c5e6441f69abdfed0c7879eda74d5c7563ad74eee1ea935b22e64c50bf50b91d8afdfdea6b07e2e44c106ed6c3200a2ce1af0f75194d70e67 +A = -68be7ffe4d55104a2e08f4d87e72ef7c8c6a1ea23c26396023404587ec79a59b2d1990ad19da7c5ec7fbe7284aaeb31bd536d748b6aa00ad7ff23acd1f63a0d4ac7cc6b556cdf17a53609709fc91a96678df7cca5d4a6e1ad21162687b7021efd5277a1fb9ddcf56fd7d8c201571 +M = af212be75978169143c3fde9065aed88ff38bf94d5780703c08b973c1aa0a8bbeec5ab96125dfaa6c12c81dbc736b525432dd0fe2f31cb0457988de36a6a825e0bc2bbc30135ff78b9c955aad75c5e36ffd40363158f0fcc875d13dfa33d170dc8a031e4841951697727d18d67e8cd908c91ede0cf29d12c9c8bdf449a5a73f056cd749783ed44cbf1a56a28974006ac56e012 + +ModInv = 1f0cee4859d848b4176a5a9aea0875c4f2c34baaf41ba4fa265d31c02c633aa08b037309d56613d4b610eaa8f68e7d6bc6edfac73b376dbd5367221cd1bb66f35dd4fae8e752d54019336ebae3996da6a2f4804a33d9514efcf1b37d4f412e0d691433571485a4a7f7c075d2183e706c7f849c86f199e56f88adea187624d076d12d15f06d371d6157d60b4c9697773a13be4 +A = -1ef11903032afff23076ab06200187c9deaa04a75e70a70ce3007e4424db4549e8d7198ceffd92c19b7a664c77c7f992d848303afacb1a98090f81d466c6027cb11f547b041598405554165b5a77615ff35423135d4414d52cfc0599ecae5d8786425a979a762b347b5884f51ab1 +M = 590d14cde13c1efffad54e26d6f365d8db64fa1922e4950646dbde72a803640004d209d72f66fff3eadee322e79fc4df3d18b425c7e43afe8d5274728a7f82d7e3b8b26d96a19e97bad2d4a6826aef3e3b9ead65451de869c83244eff6113bbf1718304e1264f99a852e65c25f8b9d5ce76f535ad9b121984d41d85f033bce10f3760a95e2c29f43cb45d51585ac1078619cb + +ModInv = 48ff6470c7b9db96b259e84948f0cdc709cac7f2f1d9c2b670364f4da50b413f485084ce191b1184b2423d7cdd20019e41259df40071ca67a4b542d73a22548626df646794b074dcf862e7c5fc9ba8c52e26d092865b0efda9471b36697343e93b0c437b827ce3ad94a63847d5ca622b1e73dadd5145f91a75f9a570594880a6544fa583c3bf5d644993f416195969f206e5 +A = -654950e9610142c64515398f8ddd621573ebfb4ea51869a2827c15146194790a9ab23ff75d4cca99df2a364681e753618c5516f16775a42320c03ef90d65be92d228f0303890afcf5ce3219841a294aaa64d61f2fde8e0f83746f640f3ea45bbf167b317a108e51b358c24ff473e5c +M = ec48f221609c1fff3269e9775ecf60ccfba21bab54745e40f2c01ff346851d5b857b1e8d2bfd581a292817991708874f6695aa5e3e3af1a33f444a91cf5d2530472dfbcff1836133528a59f415aa5dcc771a7eec77f02e854f7a159813d5423f78fc4b0f025548453c6053e9d2ce1402e143ab4a4a1e99404188a2f9ef0b6458679fa438a13cc8c45af3a662fbefc6097bc7 + +ModInv = eae9999c8ba99acc2165b8780dab91e197d2f63c65a996ad83e6d61a61d403d4d160d0e8c51cb07fda707e498ca7b7984416d192072fd1ab108d65860cc4b2e82be3fbaeb76e87b34fba243016e35ccbf0923ac4b1ef379d4dc0c3f072f626020552592230eaa7f5f43a0235562d3fdea69ced04d6e5d242e0c2ce0c698eb0250031daef3ed4d5cc42ba4bfe490addc6fa1 +A = -294c6d52201589dc9f20e3093de8ef9ff2aed1878cdea0cafa2f0b4835c1e61c5da29034b16efe23a6524b012649814981bc58c8d1c6ca8e6215b86661dde2885a1c28abdcf5a6238d726eb84bc07dc0b4888be6f935aaa5c92c4272950c8cd24807502baee091525e6674ab63ae1f +M = 325a478e5477b0dcba11876f6d6350ada488d47662328a1fdbc969282958107423d3d231cea56e773478f6a98de8549c474eb079429b4544bdc9b04d90436b5aab5fa5e0669899d8b0e5085908995a173c56977fb51de342ce465723a6dca29cd8a91f4778940de49bd2490f96e5616f604641cc914141af617076cbf4b39df07dd485f36a7a0417d36c4cc74fb992da5258 + +ModInv = 314641770831f93be9e212dce2bb89d309575d59e00c4d1dd53f473e4517f0105a779999bfeb6148f8a4d381bc72063d628315385bce9ec22da90b70ab5ec7ea312a2831df22ebfc8d33c1d150b75d50b6777d44860ab2c03e5fe9040c7dd2a744906a05f67a5f6518363f5b9804013ebea88a5c73b003e00704e76461355d0318d3e6e16df08e1d3cfd763f47244b69ec57 +A = dc022a6b3b66236be3614796fdd48e33f067ce4c23dfb965cd5353274a31d7638137849f5349beea3493766d1b9622b33dde5c8277b9a57b2681bee81ed26f8968cd16a2aa36b1a04397cbd037a2fa22e5fcc551bd3242fdf3fc99da02ec27a43aeb8bb1f1974002fdebaaff3e47a7 +M = 6c66db84ff114e7f62300aad86b32bc03c2a70e384dd3b54f11c578396a080234eb843d750299397cb8836ffbea352154324940eba059bd187de6f486522d36f91016e8f6babf456e53646bfb03dfc64ac8caf130eb35f7c3d45710e2977a372866f8b7c66772ed1d62fba46a5fdfab7f4ce26d8292b3b7d53bb96889c5e0278c72def5301e44923f5a8dcbde6ee819da06c + +ModInv = 48f7581c24f5f29139b8f0b23227bad3ee9ab667c5c3a52f12c9f17d9a98db95df1bd93b0ea1101a6d56bc0d396cc5ca2c9dbd2eec34a39075a5dff69a585167c56d3c39f19ed574c28b9573544308485945456ee9d7cb2fa4e9a18ce9e95377b60cb01cca6e11295624e383aed026050f26cdae73a6dece530b1a9a394f35a049a202bf4723af2cb6a1e7605ca29e754d +A = dc96992802bfa5418a31aea56058236245ffbd69e8dca6666eabb990f70a11a4edef604ba372a8d6c0fb9eb660982118b70902ece43c4cb364a4fa04b432f9612c048b2a6b1584608a9aced35fede715a13f71be62ce2cef7f206cd4ea73e4e071f2494a957eab2d6e91beb41470bca7 +M = 84357dc580fe9b3be98ece1437c18e9b350aaf31b6b1eccf033a8b93a69b64d2cb331372093c76eed2755f39ecb3c78842d084ded8c6a433362a3972b5cabdf5d1a505da1d48fd714fe1184415f4a8f7584dd47ba2df2ba4a5f8573a059bc5c0411c8154be39ee529a435beb0650409326de2634313ddbd9b065bfeed15f46ca43d3714a81a33f2ce7876cdafe9493bd67 + +ModInv = c14e4c037c4fd0c8ece3abef33f37635adbbeacad751503de23d972578d420f78a03eb4031443996257bbaf655dfefde266c6b3e6d2e2012173bbfab21bc9ce4860101834a061db1681fbf12d20d33ac29b6ed2f8b6fb676192a07a0d7aafcc70121196df52e0b7d29eb482a97b3ca99130a51c80fbd76c29adc4d6e381bd7564b97c7bfdd83098d41e3fbbcb58e9ac125 +A = 10b30f188dcde4a5eff9bd9cb1371d487f15ee9df53776e49ad43a19f010356a5b04f90719947539da3ea669bda9f6f1288c7201192089f7976c29723c0f4a5a2e1dcbbb8b881e93c688438da940d6fa2dfe5ca916143c959c2087933bf39341bd20e995ccd5d98a988dc657a3816005 +M = cc03301721ea238f08e783ad1f74e6181b3f12c8b4573f614affc30dd5d7a7c20ad1aa42e9f5a17f03ff2725088b513641c1d3820524466e001285eb0981182691839c623efc48e458110a280867fc28d9766f89ffc7f71aa02c5ab1daab5d460c81e28ac7bda045ebc07edb2ed31ed3f4689f0adde591926605d9b02e117d353da4c7a822cc9f6e10bab07e5e1e0bc2c8 + +ModInv = 30d9faed303e14c13e14c8bd734630c993782954b4d261c810c782676e9a64d9dee7504aa8e565b833103912f7a3a7de48c228ebab5692ed388ff588fe954e845e40ab4b3f0c3f74e310121d86ce14e91ca803be57a8d810b870deedfbc46b9b0944996883bb925637b8740c478c31f0c85eaa5d2cf3486ee5baa5260e79f218d6c55671eb5e39c352033aa389d294eeaf +A = 4ae89869ad0105e65aa90eb7adacaac79b479b13d0b7dd8cc046b13925b9369e843bdf700f53eb847d45ed88d5e35047951dce475b8baf68503942ff1297375a6f6e7496026f5cabc4cbf00a86fc0fddbd2f7b78d377909b443e462be6a3dc26488a9fba4f3e271fdaa5874a0c6276a7 +M = 5dab6af89cc3872191246cc5583d230e259b42705d6c10305ae765ff04afd9cd2603d89861705800ec327c3805de9b1c0d2dfedbff6c732945cc56b8ee4a5d46ea148dd596d8309f3b4cbaef096a9ece71821c8797c0f53ce4de206f13d262ce09cab041ce1f9f277a708af37c70272380cad0125a448e64640373cd9d907bed107f1367c6cdfd1e691e2dcb4e90b41f56 + +ModInv = 410a55623f5fb3a925e29d3f71e26f95a6c50c0e6cc38ce866562aa0e5da6a857367d3e35b268d697e8a0144447043b1c9a18de48532cde720850923e57008bd0d8a2ac80aefb3c97a0cf9aeb3080e22c3573aa5f4e75c5bb7e79a8e7aa12b538cbb273517237fbe537337af1da7dd76b0a4c44cffb3917f42dd8b2aaded19ae596a2f1d010e10e79c1411da9bc8e0b +A = 2111a4b0a1d5516fe27dbba1e06e747460a59cc20b404332299bb815316b32f2cb43d8ef4612fb20f8d373e156d6a550ffe50ff99c41e077f2a52e711126dac912573bb4de15db47116352f795ddc3d6b4c94fa9ef465e9b21668fc05846f1c2aac053678e0f4ea4facaabe1320c3eff8e +M = b6be04ce8a9d0bc948f0aaba02b26cdda20d5cec47e2e12ec05003ba738333e4d13e1579734a9742ca32049eb84810a7837e9575be0bf1067574f125f6b1ad41fb89ac7c4848e399efd74c990e60361e405951c2384e064f0a092fb03ee6d7f8306deb7f8e7d565da23e99884bf1b63a3accee76b8f4e3516a8bec22deca6a110110a66a4c55941b968ebd2885face3 + +ModInv = 10b98e48ff771488ce87247ce738e067ceeb20c5bc1cd66bd8a6e4dd4195e0f2e5fed0d0d268dd9aafbc491d4100ae631bf80a9fb7a9a0558c9e20d43c8d065392f229fe5d095afcc5a84871de30e4c975e1c95730833d84751a367763dbe7b39ab8a0f792beb936ab583774c9c7154a2f100708b4993328a5daa8c62bc15f918bd555ea4d79c367af22e5108e9853fd +A = 3f53905216a1ff9a3be6d10b8c1d681c257e357477203a3f94c228fe665c5ba243d8d550f78ea63b994bc54ba1eb4f3b9c16d22591e0273239941bf2fe7e1773968bd74b97254a4c8e09c5b102396cc4657971115fb665b6d906743e7aeee390f251fe9d0f14c2578f20488b616b119045 +M = 172063536894d75506b83a0f3b5b671085d4a3c57ca57894ca4f71cabf38d2cd6f2c8f3ffd60ccb3c2bd9b5a4402d357cffa0b902eebff4a6d93224c2209c6aa560a88e41bbf0cba04128386df364402ed7c9f54c6c36e3d7a1d04fa5331ae69d918abeedf1137e55e9227cdf50d2f58f0d41c35e28ca3a73fd44271c16854c6bc635d40323d72560e7aa9a96240a7b8 + +ModInv = 36517f8b8f153da06a77680f6912e7dfce59a1f55b5cbf3ac0a3f0c6731e7adf4ba7e44d43f85a449c6e1a4ce4cde829d6308633ec933cf178bfec3c458c5d8f81197f455d8ec1edf6a3749857801c026e84a58b9910a94b7bc38efddd281e53685495b0693241603f21673bd416cfb191b7b84ecd42b0692406f1f14c94b920991d78e4906ec091df9af7aec60608 +A = 50f7210560e77aa92a0e062b6ee361455e1a153e8b617dfa27110aaf6dec82a4745fe7fbd04bf9ba403ac74bede07d4f6d78689055030df02ad0b92664c7d4090185b0499ed8fe2669a4e1b8ff18e72cc5f19a61931c6593eec78305061c48a0e4349a1a81f0e748284be7728c2fb6272181 +M = 47e966d0b03376932982b404be070392148f2eeee054d702bd198067b2ad981e4e0fff9a525e2b358da0160559c4880d457e2d0bf3ae1ca880c483b4f8cdead31c8077ce61620c135d338fc05b8660df5d0f403c4423fe9907f6ea9b749c52310c5a20091a839e418c6340f46cd3b0e60b88f148170923224d590c7a9146677c842425764cfde6c2928a5079d5f165 + +ModInv = 9d601fd745cb06af368484d8ad6cd942fc220c6f1e0dfa6d1ef9e4698081b8958ed624c3ee4c3bfc95a86c34292d8b3de8a1c7271c7d3f4f491f3d4d1a6f143eb9407f9b0199182a3074e7fba731c4dc604e3b32a4470dbe580df3fcf87b34085815e0db20b18fa303f8c192e69fe9c3d790536e46affeba732a24de55b16a88cf50f276dd902e52ddce1a993286a8 +A = 8638fe3094c9a7376fce1c2080d4db6995b39d4c929c9224f42118c562f0eb2dcd1c65f0aba15897d3ae643f5798e38e64008443c5a70a45e15896c5f6c5ee0288e0ab0eacf023b3efd2636cf03c22e0690705f0a6f29e70e73e7b49d0a889cef0ecd66d7c6158d67a5c58840115af1feaa3 +M = e80684f1e066649dbec5106d5988e4a8ccc9e7811705e347c7ef4650f77231cfa6dd3411aa8db8d08e9e84a010a92f1ce0945fbfa34e3aeee978b36a4cbc9f400fc4764cc6bc750ae6397b22688f35a2eb1e0ad14877033ed21c630ff23954edf034421e8adfa88e8cc16708f3784be4a6f116e9f499241e80b1ccc4ff1cd97428d212908d3aebefee41b5ff0c6b15 + +ModInv = 24351714fd4a98b4e9976869613e78fd21b1099f3c87b73af126125d34071d7fe1a3d9847d51f3925f06868447634aa64beaed49e6e22470b4c9e662b7bb5e0c1723f1c78a6320c31643120e77ffc00baf1e9a09b3ad8162c998ced1da147ef003b4a6eeb910d5f416e2b5aea82b3be896b5ae4ae84ed2fae0c965f3fee1e493a57ecab5806c44a8175371a91cf +A = -b9ee4a18821de4510c646a7c63508496d24155f3124c378b712bbdbd96234084e00a432f818398e527b30cff9486d9a00e88370c7fb9b2cc58106a09447cd806896f795a840ec38833a38b29344069a3c12ad369fc53f48f5ef056304e6cc74f84c81fee503d1ce3980608bdc567cc86bf3c3d +M = 1920d730655b0061d1ecb3d74be45edaf1becec7273e4649a2be2a957c0dd705bc80a0908d197e7245a6cc91ccbf1974dba609a9fe85ff864c2923e6ee2899b26ff8a444015a0f6ed349f02acda326f86debba6a195647f873a58c49bcb37699725be5824ad13e629514fcdd46a672bcb10881150568018f10af20672daa0a5979cce10ec7e6e138c229cfc6ecb4 + +ModInv = 5d07663b6a57d559de5f984e086253ad82aa6effa58db2026f82d86becae792bdd530491ff1cebe176648cfb50f15a71c8598a33b66db6a2a658dc62e873ee7be5c1fdaf3c7d54483d9e14e3c1835cb0c5c04df0c8a64a54b7e11a1e48f9616d0a08125f7228e072baaa1c8fbf4bdb167d55f4fe9eeb9828f361ad959d50826200583b1285b116e9c8ea243d1db +A = 834eec0a3de8c807fd2d316bbb2167ed030c13a9a8105fc2c16d57bd0f86b82dae2a354fb35d68be433e98d871968baf0a3a88347c3c0262ac601263fc181bef604f93f0ce8b16557d2554545299f2adcff1b696f3f361febe7ba6eeeee763be0aae90dd08b9c37a3cf8340422c923183606c1 +M = dc02561a37c73958066586bc7b4ea3a7137997e6821aa81b7cbdce895103276442a8d0b96e2b5c62ba1f078c4962f80224f55ccfbd6bb546cce0c95c8ad84640e111ab7515fb5cd7c963feaefcc803221ebdf6ab44e70bb611880377b33aeb9f942115d91b971bbfa39af83a0be27a32bd06cf01b30414ac97cc73de4fe8321288cd6e1df599be7fa3df9686c7df + +ModInv = 9b8a70ba495088c59d70c8a5ab8152d5539fc2e32669aab827aafa14250333612d8321a6acd09b2a41b2c352f87c537545565bf9fb2d2667bc40f36dbdd4bd160a28d195a47ad91bda5ab4fff24426c4593857ee623617b54300ec44cf1d6949b9e31287a3003086148da36922e5580802fef9a279238d02f373bb89a309797c40d0f9a8ff7297e4dda6bc4ca3b +A = -5536710542dbe76f4b3a079d4d4b155886a3a32e2fe759a8d3ee555d58da96adee6704d3de06a4aeaa2e798b85b28a5c2167e77c43205aa5ec79b6d1be25fc12f09d5b26eae19d5617e239f11379292dbc5e6c90e44eb5d26a477c13a04787bd950d23c8b94661cd8d37f94cdf16830ed44bfd +M = 18effbd5ff82ab34b82e738645c94c386356734d0f83edf1d95631c743ae82f6a16ec8d4b3e6fb9a3b52935ed3a2bdae3aca7b5ce8a8485efae9f09962c1577625cb7fb794f54200f3bc6c0d76f79f369be4b72ec7e64723d392aae22bd6f91bfdea94c5e36a40eb9873b6aed8a18a1480738046cff0eb819fec1be167f991e244a951957e9d09eb057d15c1d862 + +ModInv = 15b2cf6e1c0ff6d035762723c4da87b74f15ecc55384a4fa0e44f52ccb1c85425d1c70e110df2fe7aea18f7a7d273e8fb6338a765d471f94a4ea250ce29164afd2fc5644b11f5dbb8996e4c05e671a772e6d9f7116fa8189728510052d098cd05113ed9e62a4a71488f4320864d00b440da02299dfd694d4ea4fa5f29f4a3a877213964a606851f4230633daf9 +A = c5dced57c20764aeb6ecdbd1f8fe3653559de20cbff5b52597cdfeba9a7a9b4136e0557a6febc1709de1ab00fbb637d70b6af48f63ed7a37a5d083f42e992692c3c3fb49c823151ba80d45d43a69b3d503ac435e2d71b4e69aa9a6e0149dc90b67bba85959a36ddb58e65df8e8b47138fba07924 +M = adc9a88d85950c7b81a928108f501b00ecd495ca38e9227175f1fe3251aec44293abafb0eca842eb7937bb386059b88061770714a1a74c650f5c1caf04cd88a4f4db3ee84e8c70ef6bd05b516baefc913ef71004fa43b6c05f142df58dd53df88acade44e28542e18a1ee49f5119f120b016a667ac929171c916affaab6ab0b437a6335d816c8c6242b96c0beb + +ModInv = 855c90256062f142b8bc414ad20fb5138eff2af205b16479da1beaeadf7156dcacecd343e243e0fc38365e566a3ba55456196d53e38ff48c2e2a3af4e11103b90e6f4772c2f3017714ef65b342f30084939d0a81a599c810f2ea349c7433452f34dd71399daeb135b1c153323a281edb75bac4406ecf5cad62048905ba8bbfac5f89e34b4cc0709a191beed9e +A = -bd937f6adac6042bf1769e48386e047f51f926a848024769ee0e37faf565891020642bdf948afe2b1d908f725058dc49fb031f1b4bb447133db936f3b366eb1511a5a59ebcfc5dc934f29564e5af83e43218b3c3f5b5d7697d972356e0e248a0ec7ea6cfd135515aed4e278c81a0c0170cd8017f +M = 7620a084c44855e880941cfac568e2616fee7a5b8baf8975740dc6495b9c5ceb7ece4768d95b5918a2a0bc154d5399be5133fa255a683791b9331efc1cf5bac84026c4c330c236ce4a8e7f68a6e544e5fb428c067ec1e27d60bb81f6f8b0610fd0260d4470e11ea9dca17b123cb997d71e3a8970626ff0a2e325abb9eadcb6d7e7e1162c3e6ee18f7f51809b4d + +ModInv = 6dd565991bd46d366971a3407200041903ff9e836547b101e23bc419506817eae8078ba23c2760e7f7ca225ffc15611fc486998eae28773ca39d6f6ef47185839ae5a20a3419cf4531cd507246da7e58a39de525fb441b6cabdc7b776723e939add9711e5788c22270677309debbabc5e854655610727b0fd385483f987eaf7e9701dce925a1a10eacadbcd +A = 6e26a11cfe6ba07e6dd62f93009b5ad0b52e7b9df291671b912eb0753254265a21e49230598d74ac98440c21b3fb8220fd19b36e2334053d8c88442a859db92ed04b870eb1ad870e3a3ba64ebe7d07ad58f4da378bc5dcd521f1d27f38224746cac6d3a8b1241f88af89d6ebed6833d1474e39b605 +M = 2a673a3bf6f4ecabde84039e36c9ac458c3b185bcfafa6f0d7ac82b7e536ad54f42d57a40d83e7a5cce0ca9896471e849faf4338c271e9eff3c8047c43f8962ef2c81e0fa03ab88edca17a41c6171b7b8a2aaac2998d51a29697e30c0e5855fe6cdd545d84062ab1c4762246213a921c2a09779722d53295faa639aa48cd372dc681c26a04e01aecbb3aeefa + +ModInv = 5d45e45c5781969097d2e8d1edcbcb3f4ae0eef0e41f51e3c0ccb42b4d31d5df58b38495b6d40129ee50b59cfc670f3aa28df4f2ea92813182e9f6ac98f99d7d7c8e2c697238699a63ec305f1c65b6b369ee9937b1b0aad46eea52bafb04028ebcdacd714752510799628505b4fac2b5954064b3b6471ebe4b3142d3b18fb6d43a79aaf26b4b63c5b0d4447f +A = 8d5b127c7d67822328d6e2e77c363c738bfff7707b40da52b63cb5cdf95ed2987d97400d930850467e448d6fce4de7d0fb5a2a343ea0ee7beff992243a97294d787067d77ec609fead9a1dff6cf6c1aae51075ada6df4491cfe50fb4414aff787bc90c0b01d96a556a111e4a3b87dfc363317e2bef +M = e6c68d6470502ee192dd95707d6a72ac6ba8a144a48ab68864ffc87d25046d3be75f664a80aa6abb43bb3f2686326c2fd88d1ae545625c37050d20551273cbaaecd31f9ea3e2705b380649640b62677e12f53a00b4a22455ba2d7c971b48eb04e50bdf7025ae75400f4a6b70e328cd7c9b0d896127cd09a7e9d5e6d44820048f32579cf282b5e66bd9a6a810 + +ModInv = 24b1774f4b11bace2239be25f963b23a9d6bc08cbb79988d1ae4fc82327ab0a3df79d6aa6f630e80294259cb0e9e33146860b9bce2b80a933d76561abaaa89d78735116b044a9b9cb578dc994499c574e6d2ea8637a2f272ad7a0928ead158cbb64d1145468e43892c6678097b6042c57a21ffc42bcdcd1207834395276ae77ca6f1ca49e6bd197779e096b5 +A = 1e1a5271269477cd464c269dd0c7383573d93757657b59a7f7ff1de6a09cee1f7d6af2384eab0b67cc2bc6f327347f173df468fbb47ec422184271de16b278f1bf3a173fae7615473d8f57c48990ae5d5e44c90cab97f54f69c29d122746c0adc478b1febc162197bacc38a24b850cbc8ef39d302b +M = c7ada7e22468a8a528aa3be9e233b9adb8b148ea46387adc3beb2cf0674e727c65305a4d82c19181345d81fc27f26f5feedb75e6779a69aebb1ba196b9e0bdbba510a816cfd48c69ae9ccd7428aff232f92e69ef96c0246b5229fafb545a548152365c4142a14358378a9745c16e1f5918d6600a9d61a161e31341bab09bfc0f52ebc9ce4d2d6399e91178a2 + +ModInv = 1329f853037ad41a90ce5eefb10c81e61744d8c7dbd160e77c6b90c7cb676e58e972ab9c9ff1ecb116287b508e57dd7ee7b64a106b3b785d1633a1c3bbb5acdfa098e681f78f0481f811ebddcd25adba511afee9c6f9815fc34ed6e8ab7a9ea8327549f0e81597ab834b3d95a6a237245365b06495213f38d92a082ed3ff730a5849888abdd200c2dc7bd7 +A = -b53bff44272c43eb5d53d3c3ef34ab59573a32a362e2cd239322f7f17dcc5d12f8a35cdd2398a511fe9b6902569c76d14b09635dcccbcef28f5437bdd121975b1631b7411670d86d7d717a816e9a1f888373336ba0929f86c52a091004ad2e129e76ee9bc6fe6ce118aaefa0f17dfb7fb1ab27a03cf9 +M = 4b7987ca677adfa7792fa178f816e6791210cf3a407e7eb3185ac7a8115e1e45f5a881e31555cdfc6f3dbbdc932f0d308a3dfd9c4ee5dfa9c0a42b9b5c4bd3c24adb54e249ba135d7c2893d8f501dbe3d68bac97dfee5ba27e57e045a12c0a6d6b0797354a941e9fb714d84776aca84302150212803179e9aeb3f447804c12c4a8cb32d468f57235e6057a + +ModInv = 688830647a8437f70ea5c2707146cfc8f0e490f096819f9ac4754d2f4fc5bb5443217f2cec1099ba0d3aa9afe54f0de2d19e2b50052f591b23caa32855a43d0c3f875c0b79686336b1ed874c66afe5cf0811b405ea1b4c7a54370cd193f50e52d2c99ce5a34237ceb1997b4ae456516f58cef038f4973d0530d063171f3d62c5b7d471fb542482c3d91fd2 +A = a6b952597d5ea8950d0d58594bb524d4a1cbf2952a8ac0651bcaef278ec58e870a72f9a3e2451f21e81c1fd5ba6872b10eade25b354abc657478eb3ec312540496175575827ccc19a5f6e575a979bc74e664ef6a45e82c71cab7a02b75fa8d4983e7ae7a44cbe59492455ef338f97fd5bd0372f67285 +M = 8d5545468805acdc9bab659cf3c21db2abc633ce87d785fbba54c577d9967943eab65b8651c5f06d3c86b7a39688fa905f44cc83f6aaef83cbccb1df6ccd069dfcb4e6391d6cb91d305fb334dbb518f7bfc90d9ae2caa18e5de4703ddb95da24c3e75dad9044e623028dfa439af627742b2235e982fead0dccbbc2d06a2c9c1d6aa13eab7cc62fad5f03b3 + +ModInv = 234dd0af2e3cdb1a05c1b065aec7ed852bcccd8f2837d422fec4f22e82078c9d974f57685fe44bbf563cd55f83d2f728e6870122fcab483b7a1b36b4f90c52e0cdc1a369a2e2f760f07ec78897b56a13eb1a2a71f81d9ece1426baaa988c1e29d82fefb5f18e7512bc4303f6b234021dfd5743d136ea22c5784a8c8cbd0d0e363cea91f9bc63eb6a92bf +A = -3b516cb7e5c7d8c963b6d9435b2f3144903bbc5f6831d6d05ceb30e1600132d771306d380dce66712fb86537f799a3301aef3c0dcdd600f4d882d94e8428f99cfa0ea8e862551654c6ed5f815c9ce5b44a412f5993dbad8052b6b0ec7eeaa5c9b657689ca7610827fb925eb4ab1635021598403035a9f +M = ada5099501bcdeb6a4efb151560cb04a24df846a8a3eba372392e5721734d362d0aa68ac0c5aae8049e9758ef93a7245dc8e3b144d087d484273d8108a3a3965606296dd1dd7a0c1026728c106b8ba88a47f7d745eb7324e76aed298cf54ca967c58584c386060a650bd941c78284a71980d218a00826e6dd403310fc1f639603c0837d3ff53309474a6 + +ModInv = 26b04882bbc86addc8e61e64ca5f4846dc61270167ccbe7e75e177071795e1557d949a3a93a51493cac059fbb1ce098f6097bab9e5c1ec21c4ea424624b48a0aa847dc442599de0ad31e278b6c2362801019385e2b0d2e57448c8c768b683d09068a1646bbea030208a6b7d5ca9e3471272c693b7f1d51c0c29fac29d78d816c53482d3b28edcb56a24b +A = 9c9c5093a6bb013ed2513284e6e6e5743211980472203c5acd93e4764edd998a54410d6f2ea7a2c67185bc61135558135d52b84ba06f837faeca0492a104fd72cbf6547b01506f26dab9c2e944888d3325630b394eb7c9fc83e50fed9fa3aa31ca135fcbe7f6aba7260152b2a26d34566f80246f74350e +M = 420695a3b450d08f836b5bf625a6f50c110805083150550b373856003fd922d30fd8a99f0e32f3d2dba166496085281a32cd829a6d366fb65206c61a0649e01a85e42e0444e7f44056c52bfad0a5cba8d2225ebf37cd0a9eb6f536d557b980ce7adbb7e1f21224158e1648e73269900be4a3ddf2e47faa8ed0802890396818b6a002529f6a57aa8fcd4b + +ModInv = 51ac6c58e645870761187cf1494a12bf2cf9a1e924428962737ad217c67eb10a8f1ec49f0c9c994e4c3ef96a671402f882466b8da905bab06d24c9292c24809a1f31ef15b2d291fc46d41c56f543f86ac83ff49b35c41f0419e3c6981bd2663c0f6b63db8d93629e7b157016b7ade8475a460a6db381a40f4b6e192764c689bb353cc5ae07c30d06bcf3 +A = -9b33140246488806b377c5e2ad9dce2a055820f5cbc8d3ee727674498081d019786fe9167af381a234852339931b1d97adb8ce50946362a1cd0d042ecc67ec146696fcedc23283ded6a1cff632f53a2ee52c03572aaaae4816562e7d189eaa472b356cf94c139fc07c50f5a5f82747b63462ad089d27af +M = e607d7271d8937e7aa2f7bce654016a009c8889ea6af1fb709e9176eef5fa757e6a311d80389e8ef4338bb4301645d593c28afdfa038baedb619846db64e13275c71f31a01ac55e6f7ca632575b4f163a6435a99feff28fe5f3ea94a3530e6dfbb818129f9e1d071ff414caf7789723ed25337019f9ef2d4a5f7849ecabd95f7d2150e03e6590d66a44e + +ModInv = a41aad75c6be302ed6d7deae934fa4d8a832be4b919c9e307c28b3d0ffb6ab666b42d21593ccad6438b5f6fb3eabd65f55baed7b35ba8f3f0aa8f9249544e5f818f68fcf973f107140d21d5619860208950f19f347eb46c5bf08dcb23051f3a06c450a5960c2b4d0107e53fe19f1659359def7ebf62d46ac19889fa2ab515cefeca7b53da53aded15 +A = -f2d12a6db21499eec8a1bdc6ca9e66697c24388c438f87836b047a33081b9542766ad4c22018936f05e2007dff36ff6945dca9b41dcb325040cda53e0ba58774633127876f3fac8c0094383f7f6a2b8708d4207cbdd8111f0a8226492a658f4109098b7c306e1a3474cf98610c9aef52acae65101d4dfd15 +M = 79acf7f46f269aa06d8944229eae47d54a8c2287aa0a0525f916a873d02c8b5fa553ce6f171c34ec353af2500d0c9bc9e05fa29c314711048be5b67a96bbbb88a8dd9ddba36973aaa4d28e9dd4d386175cf7bb20f1ad2d56c7223c73d8f341c04816162b0e6e98a33de400f9d0a7bc5881b879913d4d58b179016756c2124a7cd17dcf4368fca2c26a + +ModInv = 3181c5ca960196836b9444582d8fa91eef7d9cf751e585fe143ebc00ac6dc170a3ccd8de34c58c4c48159baa084d6d550d93525416d118945e766987ad5161a574f3cb281b40c32e3d31c09dc36312cdb347f75c4071f0bcc46dfa64803ec050bfeb87c218ae8058e7398b24a597fd6c0f1e99c9e0aa3d7384471545bb4362fa16da345b388ae7f913 +A = c1dd5eb14f035981f36dba24e5ba24864823dc4b5240b845a9cf4be73b8287210960faf351f8db052d8678d64cb1ab4a166278b889c76c94a817b36161f6bd5e8c073547b003f8429dcf9b24e4c5e04b0d0425211172c4e53e9259566f0631d6b26c3bd3404ceb9eb2c6e31662db8f403b646cf0010a4049 +M = 3eedf8fb6b2cfe4db3c00fec4d13dcd4a67a6212a0b58f317bd01a2597c400eca77eb09627ca6c28a5ad722b39147a5093cbfc865f3502f1a08588685c4885350fb08a057f6bb521897e41624d5f11538309185cb71ef39a689451e177742f45ac68ef862f0a9612e8c860495a4bd2dcef9cbb88aed54680b9aedb3f24c6e35ff39f4c9083441ab1e2 + +ModInv = 8a2443647aba0ce5ecd2dfbdba9e5e66561f4aa0506117ecee978007a7b6c5b873f0d3fd3ffe4b8c0a4fc751649b5ff9ed979edc9ab1da9431047e2a9bde3ded68ba08553f4ba446339dae3d4acfbc4214aa023d21cb55172e526a2ad627ed86d97d03ca0f221250892cdd84628c6e717af84dc57d74ceefef6375d9550368c13ffa4aba57c2458d9 +A = -59d5f07fe883520f345a02601f9bdee8c25150961025e68c26d441538330dc6f5bec4ef10494168db13ef87a92fa9d2fd00db3a49a727fb849f0ae554b1945ceed450c3eb2347c09ed014120b65a6c36e615f3a48a95d56628187b7fb33bce04afc16957daa33e3ab9548d3e0db7b29392070fc82c44de3b +M = a6459d36b78e90e08f314f8ae54121ef7d78ec827d9c357d3b1b11696d1d24ebf82fe65aea69fae795e1f992577ec909aa74160ec2953e83d355138dc64e77d01f00e56c826e13a47aef55b9b2974929c7c932a428d1ab5d99516e533358d22909910fca76f3540aeb1505e86b157aaae35b36ee5308757cf5904cccad93039e6f38c8712047bb9d94 + +ModInv = 2872f62d898101afd595f8f17c399d487c4a4eca97fc7f882461cdd00f0c538c27a989faac1d4414a93337566c1ad0a7872b6fa5d756dd051ef4c2e7ea7fb4d085c61d1547a739c1419254e4d363bd6f703ca513c759a84f57c59b2f5ea14dd0640f5f828d11e28fdcc0fa4003e8d55dcbcbb3bb3d1e98e267848457b44e462537bd7920d43fb81a +A = 3a2af53073406b561eb3fc74b610eb0b49dcff799d9be68089596bfa8a4fc2ab16f6fda4fa8f36f3aef6909893f4d201137b08dc257a82146e4f23408bc2f7de7f612fdadbb731d91786a98ceed27c11ccc614bd9bd8379584ea9993144aad683d0b7879e1e3a2a932e7662d7e2c73b9ca8d26015663655b6f +M = aea76de49f17435840cc0b12b9834e77378f61582b40bd3d1c231ce6053078508d21d2d002bbe98dcf7a28ad91f331434e7756e77fa37179c5e243c8a1f4373f7874924b3eabcfb833805c1c982c955b254c4742346e4eb82749a433e74d9f70e594465da13e3e65353e80acee1f6e327b4b4df5bdd96f0b63b07675344c8c1a42bfd29fe1c954b5 + +ModInv = a8eea69dd99869652c6e6a06d94b2abb5d5f56c6dbf36f435c96cb0a1804b6149c1adecb165aade0f3cd2b886a9470732d99c531a3b1d2350cb88336364afefcc50a3034cb7f90abf99b1819950d56d5dae530cdea9171afb84017884583e5916a916014f2afa62f3dcd5eff6f6323cd2953b2cda7d5566b56493cae3a6389c6af05dc3cefec71 +A = 846719d54df05ff2b7fa35d4f47be73fd2fe44df4658f8d493241bb0735a6f8c6086858662f253ef0101034942f021f353e5ee5b6b9190ad980fec1b1be74a8ad36f49f7e01168633577a8c6b145e07ca50236bdbc0a0f09dcfba2d4bd98dc4267f69333b9d2fdeb6a0dc64792c949a2b537191fd8a5cdec7fea +M = cd13dc1904937d9aea3e1c8995f1f1b6e5895fd4e7c39ce22c76b822c00cc9e6257c7c38d13d9060deb47e380cef49df22c7de77233322fbe15a62f3982bc1f84386c8fd6a9d32ca19d0268c397d42e2eb8a6255a98f76332aa811aef78fba3eca27ec8d4b3e58a99e6dd518931788227c5fc8351ed603b846dea621f60bf118fc98d7b11013f9 + +ModInv = 2ba7c828010e6eb1b001dae6cbb7e9269722d9c2bcd5669b61315a0a8615304f07af4325c096d9555a09acb4134ec009732acda7afcc251c379c194cfb56fd3ab8ebe4d9218a65a62924a6a6c0d4c7eb573455b2857715716eb3a1e306af6fca43af9856ceb40eb0923909aae9671fe4f1bfb55dd843f5db5757d9643e0cf710e6f1fd7fccf8fb +A = -df5b408985b265cd6b212e0edb5fb584f8e39b49f32cd2fea6ca83e5481ffa7a2582970474f0fcb16c0ded1cb26d604137aedc1b2a946a153909f5c319648c9d312e3dccd72f0acf123666639b84aebb75f4162b6bf04bed26c2ead0719bc44f4841178cd8848c21ff9cff737bffa8f7a3c2ee4cbede60c16c9c +M = b148db02eac9c3cdab289f3282abe7d80d2acd5b6ca14f23a038174d11171bbe4ef13ad088bdd52054da413fac49170a76c2ff9258883e7f4e934e947e466f4110a664e1096c4f0bb40a813a888736cc2352616023131f309a3c8779e266ec8926c50efad1f1f8719f4123ca671ea7bc940c3b71907e8de13b2bf15600a56e1491e3aae5f34497 + +ModInv = c50e6b398e328961d654769d55a693fa07694a6e5c02c40a97d707de18ff8c634706d00e35e50488f5631a12381d0596f2af14303f5c20283c57fe0d7cc59cd4e761532560b6ca3c72641715f3e0c81d90d8d76a9c6ba726dd3926ff83bd983d12fc685494d175b667de537539acd551b41139fd707f3b7980216fe4cce2eec981866cef2df75 +A = f2b4aac90a29074e5b1d5c495242d36a68704de4c809f0acdf5468b827a439635d2be64a69f43242b65ec4f48496d76afd91a417a858e029c974ef658ba00841138b53934f52e171c6b30641875c3142175a22e8fec8da9cc3fb8f279a7ab2f2aea41891f830dac1ae1e1c5b925bb371c70449305740d4a6d72d +M = 223bbd942bee009f98c3d4d1b7ffdd1f90fc416df1c45c4b299e902c6f218e60aaadd4f3eaa154857b8c2ea6265b95f96d35d06c70e19ff6b06624a0bda768aa88a228a576354710397196a8e334ed919ca1f75785e2e24175d722251635de6c550ac4f34209d4110b6161f259cd0df7ba9bf9ba537a8afec9e2e28d3bfba39687c0f3f06a2450 + +ModInv = 5182a117db85ababd221cb00d0484c63adbd1bfc1b62560fb2fab83d47990691351bde9903afac7b8100e7b22c440c78141f2f57718bb14fcd1facbf720ea09bac606307fc7111339475e3b81bb1ed25a6aedfd8eedc68977507492e90ff8d0cf10c58301f3e5402ecd304bd10f259306602b7fe6700d518e6eb3e35e7881c7154a757f4adbb +A = 7a5b010c343445aeeada1a77db9c048414f8bca5b314d7adba8ac742b5bfaa0191eb01d96e2b2d9907f1dde94e72009bc33429e6e2c81c3e4daa1f540f16dce41d3979c3636ad0cb8181e77aed31f8963dc80f8c6321174a8c1e0e0db24e1fb704bba2d8263eba3068b0edaf3cc4abbd889e3054e56923d1c55663 +M = f5bdb50449fe036774d2aaff8c4b4020ebd0f342a7d2f2c67816e09ca34a515354ea5b973b00452921c762ace16ddb07168ec39a31ac076a94348b8c13c6b15ded79ad62d9c66c82a573648b67161dc0a18b31b54d1d89065d3056ce5737bb04fab380ccad5800b5c57d2798c7efc6154daf60854521cbba20e38f720cd4ee82ff04e028dad0 + +ModInv = 2867344a65c54af21dde32089c4455863dede9047f66077b95c635378a89e58921001cfbd1d2e9aae694d4d0fa9911d09e192cfa95b5ecb9bbb26214831d7eae4dbbd6356e847a6ecf21101baacf8d503205a526145dc63758619e628a011202cd5b058184d2e8898c2bcb84872cc8ee336b239f7a2f1fa5a44eafbf22b3222ca177b017917 +A = -6ba72837440ecece82777a40d0d76da8c85110b0f149975dede067914d2eb4a690c4c319c15e42335e346adb27391943ae007fee1ac7fdb31bf6099e3977bfa0f7e78a3c2597aebd0dbf9b088f6460eae6e4ef941630f1efe04080aa6c40985415bb8e4d599d9d89226fb5a4c3ccae0d02a470c5cd47f6a15ff3f0 +M = 12de8e1721c595b74d5578002154a93f8abca94549f288f38d6d334498513548b78d27469552ffdd847c65ef53e281a2333bda364a518d943471fbc6432f89a68f7392205395d16f5f20737a083e3ea74305ea26829047062fa2c0b53c02375703ab12139a9c7864ae9acfebf7925af88247c82cafa21e59c21a351f2c0032967412910003d9 + +ModInv = 6b3717e1c10a946bc482cab67f6e158f18a9cd498be01e0f37030518ff5dd5ab72bc39f39755a85ec2baa0574a5ec4dc2b03cd710de71bcd9a90f5854e10a82c3b04737a2724c66edb2bec3c4d796701b2e1468752c000dee203d0f95eb74f1ff0a02a939480679173d302b435d4ed65e607cdbc23d98854f0c7faa5781339847badec4bfaf7 +A = 5d17bc1999cb66437e7b7456feabc2e7ae577e9e463cd9300686d1aee594c5dce2a77d3326a72c122c842328ca866478dca859d7644e4c9bf3a46c57d1a9f5d3c9a2c23254d8f5ced5d498d0abec3f6f87ee7bf50553878883f3233bfaaa0ecd60d71c66d5623017cde702c201963727ad6c6a9745d348fcea7c43 +M = 8cc2facf4017c629e8a9ee03a9222efdb04f02b12ea1ed899127a70df6b54d9cfc965c897203663d1c5762cc6b0eba5ebf4543a700df09757c90e6241423858ea820cd6693bb3a78ade71b928b836360cda7acab5bf5db71d0e65ef6e29ed952778d80762278c0ee06bd39169a00f95a7c0e24863476ba91b078df359bc5d1ed9d2d3e3b3626 + +ModInv = 777b6c1976ce35a1958e9d36c0dc42f32282d18498460712cf0dae88de0076f83b5444427746aff152d8f99d89b5d3d1e20cedcb400e12544f1cc9747e078a79a172ddd404c8673ee074d18053892a728f15235eec3fc26c860a7221746a02db06d553d0b31f0cb73811bab8aa2dfe2bd9b01da1c0a3a791cc21b9f1203611427454d0b55b +A = -17abf35d5111539f035089bc3489109ffd7b5c4dd241fb4502ed3b51b731be45fcceedc550e03bf191cad5a9f7cb825464fd2689cb976cce29bb5adc3d7eadb671dee00bbfdaeabca1eb222acc7aa53c7c9d5d0678bd5461ce01685793a7633412e6ce612f52bf065caea2e11546f4d2e0a937ecf87561fc1eeef3b9 +M = 7b822ab4602b37f8dcae59fcfe61843fd8d760d840a03d8ff154baa79de4b697613b866d2921d0552b481b5368662c80705492019928e78fb519c2fce66ca8ee23f2edcae51672c85b726cb0fc94e60a7ecfd95262c079fae321673011c209bff98258fbb3bc994044d7864d44ef93abd9e8b45b2b353a2c9306cdf06047ffeb4a717be021 + +ModInv = 3fb165d0a06dea19eaa060e792d4dd5489d03bbb550145f27f892cee895833083d6da5641d1f6f333857431fe69df6f470c34cc9975b4cff2dfe37e2d3c7cd386858883ddd7510cbf9cece53fd9a08a5cfc0066043a2cd096f65c567961c05262a05a4353e86897155afbf9e1edeb51011fd0fa3734aee17ab46e00367a709cf0cb4e8bf +A = 74fadf846e5c9f317ea76313746d176bc0c518165e9f26922f55945fd5609bc3ad08772232447817e61f36c7f162b6c8586ee02e17572c8c5c1926985edcd89cb859affcaab7b527b9d3ca85909f6d7f37f9c7be0e4a03dbad53732f42bcc33922eb040f85032a93bcdc019b0bcc689aee5da01bdc32e5acb4f9e6d78f +M = 62bcca07b96ea1ecb09b7f5eb48db5a83e969fe9c9d8c8d8f2eac4dd60ae5d9c7d40fe8f952d415a5284d4693b259e23019dfbf9248bbd896118b559463499638721e6e387483370a53633ef17029d9984471aca0e67e0103f87b85453371e4fe15b9fd47f33ba2ceac0b07bb36d8c4e437f0a01c5798c4996fa2d2e71313217b6027696 + +ModInv = 7461c181b33672a74f0197cba22599782855caf46d59b8cb0201c332e348ddf990317065f0c142cf662241cded2e680180a0b60e27ffa68d1bec4587430b42c625112976066a32b41ce1c05ae8bbb9068b32a2bd6dd15fdd1f76c81d5ea55b1f0ef441ff687f59b73ff9ca138fb01e5d9fb17df0880eb7e9457801a4d3c5d8c3f54ed +A = adb40a6cc8782edc6fd57543afabcc5604a33a481fd25dd18982aa8bfa01ae54d49633f89baffb05a81d7d24563aade19b1a5d3e238b3d9ef14dabd69cb938c92c57215c58da6ffe6666fa72766dfa900d4688e108832a6f30c077c8cd55101cd4685a5c468964c38c4119613698c2a7af9eab79b0056dd177d2c700d84d +M = 17c5b049342bb129070b45408e57181bddf7cbb45697ceb2db1a99e6026f9d2d1a44aa8b65edcafbabae1237d9599af21248b3c55f009fcfbd2409b775537d77ef456c892a486ad560aaa5c3d6543d05f68f2f33756584e354bbe7b10827306a6d28ecb5d23309b6d2590dfd9f0e25762c5366248a141c7ccb3b72bfcb60e4f96b0e5c + +ModInv = 20acd0aeda594a12de0be7757360ab80a31f22569dd982247e9d0291a8a9a1328df7e0ae5270291bcb82fc0a4e1b68a4b5c984fa733627852606b0a6d983c0e5ea8c0f75785b36f2d62b541747496bc1c9bb39b47fe4c7ad66983752c3c9ce0222cc61caf5029b913f126d8debdeb6ce02df98a6ea0420fdb59cbcb4752a4dae0e988 +A = -bf30b55f5d1ff30765a8bcb1ccbe07d7ef810cfc3dc1e11502669b98537e32f6ffa49275dc84c7fb7f2c66a2ffa0c60f8fe0a62695279070962c5fdd707eb8d3af23681c2889290464c5c9307bec60973af4e709be9c8e3b7512175dbc22f1d5effedcda26fb32b27cadc29f12fbc2b9546e0f0220f3edb7f1d5cbf15150 +M = 1345b0e9c2b43197c59b7a6f3f382d40f8ce02e1c29267dcd91c8f19832774212c0feaafdd271c68193578e726fffca2e4103919dadcefe0b3027f905949f304dca1ab260db342ed25d1989c8d81a9e520ad2abbcbcddc80819e8de8bc71f23002c45aefe90ebcbcb30e039ce26b09a7e0b4cdb3d8c88ab7063e8d7e3c1131ec137e65 + +ModInv = 1aca5a462529cdc717d2ed10e12843a54f686912239ff0b4025dcf016503882139fbbadc1a399ef589269332742c6d925db185470cf6ca9953fdf4c8b671d5b7cebc8c043aee4ef5f123c28c0582558d03b2e3a5c4010f7914b46233fd83c657ddfb01b014e5f55d840b79d5bbdfa5b681d29923d1f80da37b8b1eed4f496da530d +A = 7c349d38e3ee614204439253ea771ede4a8f88ca7d4a778a0b60a502e9a47eab53372c58435c6a978053a01cd672c9fc66ce02975f8fb3ac9dd15cdf9d70f12444fb01d3bdc021b6214042a94cc30ef34de6440ce235401a3a8d85ecdb2606c447a6fbb54b9c5214b67b93571d9d6a71f2223ff559a0f9f65923cd85132c85 +M = 708b209042fee6851111c610bdec57590ad14cc53886731f2346b8e3de2a705f5f611a7f2c5bd44d67bbede7a3573ae22351e253ea7d3fa7e1e65f50ce9939527456c8a0cc5625c8585d188d89c0dde361941b824530598fd79f601618e03ae241c1fd0bdd721a7e73c8bc08990924ae05b837bfbe440a67f5e58956140e25927068 + +ModInv = a6c03079c70a5ba37f7cd6f4eaf2403881d08fe55b126720681e46e3aba92950114421af440df80de364ab414e8fcfdb0a314e6257b34ae8a3f49527d99918bd9a2f3908af5011c3d9ffc56f7ccdfc164f08ffcd16b3310e881dad7335f5298cc32fcc7c324eb2912cff46bbff3f6b1383f9b9d831dff603e8c4de42ffa3735fe756 +A = 19018bbf1acc8382b4ef4e292a463c7e0269edac79ca6e13f46772956fba87323d4226340b4be408177665168afbbf4661fdbb36cc93f53cf7a04ace50324fc41a0d5ad0e721c6c4ef664b80c29d6e2add81c2e051fbafdcfbbb5eeb6dbeda7a7c7ca485c6eecdbd37c64d13dd0cb9fecef7077cc3c602030c06ab2e21172d +M = e5445f7db1ff69ef7335372477b244926a424df37ea24cc8eb38754d6c2d741de2ef2bf4b077c98fb7e2040525d06dcbc86f376d37e8c6ef96d9dd56002675053087a3ee7d60b106728823e686672355aca2a0edf46df8790ba95a8e3ffc98782bf7dd69cf342265e6d6fc5d96cc82bdb47203d28c0976bb95db567433089217873d + +ModInv = 10f260e0570ca0b6ce265d1f2bd242a39bae5cb58007c98aef8a06619b4c460eab3d3fc1d272be03307c51194edd7983bde804ceef8476828a0a7b571eafa9472a2527ef438c7d20000aacded33b4942877d407964d8427b20fb34357a937cf8f1e1eb9e943d324912d889f061a64682cecd805f6350835a592e2c204048f3f090 +A = 448bce8f963095fd1a609df92e29017c7fd174cb938017452bdf6c649c220aa9653e09f78221d08196c394627a320165c301696ae878eea286a5bda877f3160c08f43bdf7e2b5b16e25acf77593a695d105c864ba75fa96aa8d0ad82a4aa10f42bc27e528f6dfd28bbf31fc4594437e38bb0203c63f4822ebac3a3265d65b94b +M = cf5a263d2f55ff21184ebe64b4231bb874835dfa91c3c6b49a5f3843a25876a0fa57a9a51694bd6cec42e7a5333bf25ba3340d9c892ef78b0f74941859a506583507c897a2be22c030478f66bdd008ceb8582a7a809d736c933dc4f8714ad7d0a459b39884551322a2d896febde135c5475ddf205d5c8eb1c256d01ad0533e0395 + +ModInv = 1b6411de5044d3f743418d4b94d31cbf17dc3de3522d494025033a2a45a1181af1e1f63b2efe10d962f159c0f03b27db1024a1a90fe02b6746129197cd88213339bac3e62f86fcce1891065b93befe01b964cb78d7c8e677e273c2d1859ce20d91aee0258efbcb2f6c7c306d962f4172b604de7a14052a424a57e4cf38e2b33f +A = -2768dd7cad1a2fb79863b7e6c6cc32d94a23e12368dfaab154beaf95ccb620d9a01894934cfb6e77edcb46d03f636e22c55e6b64bfb749bdeece9af45cb8c92a67ced7384bf4eac10f5dab7e5e834c0f2571f36ec219b61d4485106fdcded4b961cae9a673d45434de52be468a63b18a93d991a72b7bc694eb04e5f7cfcc0b926f +M = 2284e8bc2eb62ce74d035f4ded2fd4695eec1f7d00de9e7bdf3d3d2bf762e4455597b2acb07272715cafab7b1a367a2a15039697fc35550bc51c92fca2ed11a5156277cdf52869d00900ac8416996d5a9b9ec6e3e7716097fb3775e09dd574d258df6f5aebf7d37fd7db4b8b866255d2bc1a8608723b24877954d7616fab6422 + +ModInv = b7416b2cf877e87fb3dfb70646a587d637f72ee854116a23fc4fb6c452351224cf63b791cc9be03ee686d245a088795a7840589e238cb319844cdfe68a2ee12bce088af86c16df193d7b36ae3b0c4f5d4fca2b2771084fab05b23a8c8eb8a961f3052fd82932f4c4265ebf8b9d8f3df251dcf33540bfe98b168899c9318aff6d +A = b3c045741d4cc05ca9abdabadb9019f60ee621834e34ec27a5a7a736218fca397856aa510f19845dc5acba0d5d11cced3cb6d87cab4b3c8284bf53fef322bd45025bb41cb2e641cd1c7aa31bbd50e6fa74bc6e272562540ae83fe8a214ad461558a260a6273aac77fef2ad108f583e20b534897f600b5977440eabbbb235b850a5 +M = fca35c9a955ee20e65ea0c762d1654150907a5a7b3b1fdeda88822245461ca3cc2a91a9aa41ee090a9d2fbe83f09fafdb7b8399353c37f6568e07d07a936da9252036780c161ddcaaebee86e2ddb9d7057253a8f0fc674ea09976024c724a2c5451d77db97b8181901cb1516fd4f1f78845f43e8e0adb9241cfbc2751ff563b4 + +ModInv = 21f61fd242dad254309b7ee23ac2fb8386c8f63309c945e14d8145f621bb0403bfc4f74c09f40130cc4ab76488bb22a8e60d812bdfeea53e1fd34346953a544eb22eae938a59d97e8596015e4c70d7cba617c4857927463cb6819ebefa5f561128274c806b6937c95fb781d687bdf2598a86a856b256c7030363f9d8613f9cac +A = d1cb527368b873271845a11b96b5af58943df54639e7746c569d0be4b44b64eca25a1343b7a08283d17367ecc2199bec3d1c82ca698668859dbdfbf5e98a264ac7c660ee5751f0861d8a3de26ab8c15fe273ac65cd6a4596aad2074c79938264373888113d43be7167b197c2e9634cd5c14418ce6e79556a23f48e121e068c57e4 +M = 63319ae1311b6dcc4705c97a5562bf526e1d55e25222d25abc4e9808f50697d0ec1fb99d6444c49431245ebc59bb1a4c6092f09937a3f39f29a08bac26945c5b76ce1596b0c817302c447ff09b184890e11058325786866975c560579952dd3ddf84c801a9bd3a5dab06755fccc3be9b02cdb5cfeb4341810043e3604bb056c1 + +ModInv = a5e5e9e9a39819f145333fe5686279c17db9aad75ec569abf8cbb52f17c4f5e880bc203fccb31d4f63597405b6a3a5387ac801526b496cfa840937e1a74a4341e88bf03f8262c90f45f55ff924d0962336c4df06e477eef930d82584c961b5c66e5f00303946732302b4d465e5d2a5bb70547302a6fc49ea74e91d09e20bc1 +A = d085b28be5fb923a256b0992f6afdf63c554b8bd34a706b20fe584e16ebcf7bef3d84286fd2e5e2016968c33d20d213fc9276931b01161580cb74eb42ef130df2fd904481e665c574df8e341caab0e00f7043664ad01b7a2f1df488f7ebc7577e5ca369e91f7567d2a8a28cf3b2dc8111a9b6c8015448be9748fa637695b6300f7a1 +M = ef79818117b278758713f21bb161a2a5783fe1489fc4c3bc26de368ee615efd28bd2d9777067139498d14850fc3674d85dfca70a083e9b230529cef6e7759920bb982fe64d88c08c3df1b265bdfaad3a24d93a09b06916c8dd79b5d661dd0b6e0906100b302a985bcda7af125d19e84077a2a3a0e0638240671bb5439fccfd + +ModInv = 69ca3d80fc19af84ad2b8d865d143bba71e38d1f97c58efd7953610807f711e325622688e3d66eb3750877cb2631f2bad67d4a03439f12629b9f152fd44dbaed5bdc8df05791a7f2c1d4dc571ee4e4ce48d9ba4cc16b018248a45454fd60de906f5c89ceec95e1ab1f6edf95897fd3a71e72dc8f048ccefedec3e74801ad3d +A = 17ad6310b9a17a956cd22bd8626a0f122b7d65445496abd4487128344e4ad45e4a0f180d10552a0198cfd108f8dbcbe5a23d273bb07560009cc6ed308b2660e9fd14025e69ec3b36652da84529b2b48e3c21a894869e13879748a2dbfb96117fc2b4f9cfac4ce6e28ce97523bdee45c299d7ba2eecac359cc125a5319a80f565e22c +M = 883f5b05e2ab87b5ac6f2603e9df31469222fe0e057fdfe77ca750160c1dc006e3ea84ef2b30f44ad2ed8fbec6ad94761534b628a3846b8d453da2458da0ced9f9c88faecbfb4853db417414cee2b44f1d6b315faee6b0f3564c4ea3627ef564308424d34113660943c3c9bf76e32576d7cc6294cf4c4b7ffd984fa0c88d3f + +ModInv = a9095e620f2abedb7e04deb2f902c2422f676b2cece788c8b4610f40f4877203ef54766fa4d2e7c29ac5e5947f6dae38a8303963b13c56844bb06108de2407818dfbfb9827ee64358c43a2c6e23dfca9b4d58b63fedfe9929cb48eea63479c390a43681bdbe2dfc00cf808427639c8d05b6c113dc7d1c928604d8c668470f +A = 3d9c386cbf3f1dd65b52b153676420a0a9e7e2243e3476ab905d7b18f31e3b4ae376b839482775294419912e794348de1cf00f2718cc286f19060468aa665378565e5cca78262f7bebdf3b23c9d2fe9e3bbdc20501a1614517f7c221cc823bb5e8e71353dda962faa60f185cbfb41583c59317147019a1d0d0f509ac23a7d2b5e0c9 +M = c13114c8a5955a9b806a192e543bf99b60e98d32ad8a82d36cc71c68331b5402575321b5efb99a54723b6d3cdbfdd2dda14c6e42978e30fa3ef38dff612368aeb269c5a606841001da247b092a092f5abc98cca7719400ded293a6758fb7b1619674f4e4f086dc8f839060ee40cd87e133cc2ffb7dd88819a52fbfa64cc516 + +ModInv = 26e657da0b6073a2548e20fd528ba475b3eca9461d06eda2e3cfd5eacc614f66775543dfff005442c3fc170247e7f6b7ab4b142105f31b86df66f147dc5dd62b4f9430e3659a14354cbfaab0fa0614a6b5314ff4549ea2a6e548beefc3fbb53b12ed421866569f5e1a60734d5fc91375b60c769f1f9d67540d6539b0d7d9 +A = 1c105f86434b16adb9ba449a8684e0766c5bba169882693933f7067527e38774ec2cca271b13cccd2575c4369a6982f38a3ad5df8406df854df458fdace276d372cd51c03b1aebeb1017eca0d105b56350e284beda6f7413d4a1a0b9c8609e34f629eb16457ff5c5a80bde360ba61c02543ab161aeb3467401dfc029088dc571722c61 +M = 2eb8a9f4ec1866d8a3843e8c328eab8fb1db5c1c081dd33873998556ca1f79bdae6c87b93dee379f6a0763a7340cafb42cf646eb189f0d9fa5f5fcbd727ae349c1839555bb8e31e22abba315fee3a6fbbe9b900c63f9919fffc2a2ee8d10f484133423a93583b3531984a1421e90d35b4eee833f2e22f85a96266985a116 + +ModInv = 630e32fb13c20fd61965cd319bfe579149c04f8d4d691dc4b83d92ca8287221a5cff9302ac26396d8d8246946aa70938cf38abfa4c8807b8b0bbc005b2b74fe20d695037cf795e0e59bc7f6e100e8c28b22f22aaaff16cb5faf2f2784a2a82f054b5c4697e10bf44cb4bb60b202f9dae664ac4b9228163b6d2e0df53c27 +A = d9541a6d19c2cbc377f79c4181c14e5b84befe10a7dd62dfa9b6c005e638c247d7e1ed7c568415e1109301819a491bbcd399762bf5c7d5a04f0301518884af2be0c1337931db9d7b2836162b82a35fc263b4204b30bd90ff3fa312647b630f7d42a1324cae8e39e278c19b54aa01f9ef63cd2c0e1089135aebdcd9256ae9713fdfefe7 +M = bf3c14f3ccf065bf843cd6a9f626aafcff691220764ec94eb485601cefef880d484dceade622c9aceab189271ab8800858562dce7998b006bd39e9c3323f971f1fc51e8300d06ad001f246966f41ac3dcd873931d4e3404f1de349bbbcdc341df8e36d689ac84542a6d78165d63f14c32f494940765b6e43fe2fa43027a + +ModInv = 962785b5b56fe463392d4bf1961a2234a22a273e6b07cb357a2d9e8c98dbc1bf78803baf1368113925348f595bf3020a1bb87115e0d65473f279fb12f40550fcc0037aba7151d7963d032224464a00f0b5a5f69ccd5c1b0a6c8082514ada42e1dd717f520eca6bc4e4e7db0838b0a3f969a1b10a3d099ec2f85f64d65a +A = -d02af9e9f642d38ba0404d69acd4f50158c3a66405515bd13567b31def705dcc31d9247c1e32fa1c4ea93b21f0d156a91d363bb1173a076603d1b2290d0871192dcc7fb6944af6c342a528ff8cdd7af0e6873bf8558a9e557a70e3873cff71530ff4d40ee5039515cb2fea2573c3b6b7eb5264df95e73f67abb36654ae06e093ff957795 +M = f2f917ef8ea695a7dd68732befb37f690c5951e04956f29e55f97e4e8e9a91c3615f5d4e41e2c88a44baebd7f31c30c6ae369ffdc27cb584918cf362931b8f8f3b843ab6c9887d29ae5508acebde90c76c0bbae1bbc66f9fe9d61ad9a0aed9519193140df099ba1da29540c377cc2da60ca0282cb465370c69ddc39ee7 + +ModInv = a2efa7764db4999dafb5db27b90882494125f82d7d5ac03700f3bac69f8c75e6bcb404eae1521cce9cc6bd6fa35915d6c01f8a9f136103e137eb59404f18ab13fb6926852f02ef4caea5c9b40b10d2ff0a8da8d6c5167d8cae350cb60d433ece3fed4679fe3474eb5cee16a12df8b06d41d62cc70d596a057425cbaea +A = 729999a56d7c5418794e0c468caea238f56a39d0a5cc0d7218d19958a26bfca61415847a60e6df0299a11d905f100c06f2bf7a8d8c29c8446d485a106e38e734d1d14159081fd2f1c5dfaaa36b37d7972bce59ef0fe8d126e036d634178b18c7d3ac45c2f9a734b258d99ca3eb488d4372ffebae6b33c8779c463a27e350df17526fba27 +M = 115b546101fd78829794adf5b373ee695429b46fb9e268b650c9afd5b0fff5efec5838ec0ccca6ea025a6d77e44365337429bdf709f670235ae4e703cc7c733ea25b971f747aa5971f647d0f0b8faa93ce5189115832ee8f97fd6bb278d373490efe575720515c396d524d9560d078ee0e5e519bb5c44eb93a6a560253 + +ModInv = d3d7795a449526fa06e52b4f35f86a79be6545564e938f2e01dffe9da3b1e29d1cb927ed238ff50771114c627eb1b6771355b7aa36c9a90e510bf8ba8c575c856817c81372de6c7a5f6ce6f1c5d9cdbb251a4dbfbb4f814bb07640e15f07adec3d15e22561b491131961a117fa3f5bfef1ef5a8188e6bdb0b029a33d +A = b1765fd887acb0718f6995e692e5bf6de5e873badc380e8637b6fa2b079607da791a722f477a61583da8606c05fdde9145113ac22462dd0770eb80d50aba8f4c128275024cc40441a79a665c6d382140b4e936d7e89d4eea94e9f9beee7f752b185ae76e3632286f95f9e985f75e9ebb29caf1cd29d7860ef5ddbbbdd02ccab91b1c9eb04f +M = eae70b7b500ffb57371884690147ccda8b3f1af923ebbdf0fa60c10ed31b1f5c33325aef191d1725e3fd103478395c63245f49e92392b3eb2efd1171cf3c9e8b656a30b803029c213c5b590c03f9c510f8586e5c496a25f097385d3208e75defe789a5e1504c70e60ade71a9c8a9a6c708b4bf73844a13047b70a276 + +ModInv = 61ea3b54e0e8f2debfef34756b97f6c1700204f88a169dd9e4dd83c863008074bb845d799973befe96f4697fcccf76c9a808d4d7eb49892a0eafefb727318e730339a6233fcf8ba82971b00953153e552d5f7dd98b88ef0bf7d710fb797c3d9fabcc75525e80616adcadbbee181a16c9589845f72ac388018c63925c +A = -1b89bbd0e6c21ca40dfb5c88c2d4f8df3c791bc70c99df06530cea599963a2508ac60496e70f400ec74adb277705b0d3a75ce5e5fd418b066a04dec5e8ef5d821a9328e8798fa1ab597786d2025f89a64283329a6c6a0a5a9576c1c13aede0af38dcf5d2cd7d1f985b9f4d8e69103f30293986d38da9b0318f0c8599f7ca6402d6232575 +M = 7657e4967c27a82379f940520759f89df78ea6049d67a0e4c501e18e2380aaaac29227bddfc5dcf3ccdb04056d85b5b098ec0f30d9337056d66a33528939783bf53db3f9fec57980f9f7747a5492db8cb8f10618387dece0c9e697580a226ef81cd58c09b6fc4bd71163eb7c9b7ec24acb7a8627f4b55d2741cad61d + +ModInv = 4f47ed6de0ff19dd99a4a3b3dfc1c34f830f443512c915e201b7a0fcafae54a6889f8899368f5b7184d98741a7476ef408f68ad689763e376ef52f88dfe221457cc0fccd742af3de43ae21fa87f739f75ee3f0185f23aa4f819d4779afd22ee339ee790464dde583717ec4a65186d756375f94c3bae1c8bea764f3e7 +A = 44bd17c4f0bd9278f3761de976187965518f2f0729ddbc70472975f7f13114666477dd044b1315b707862927abcba652e387293f1a14a25e8010a0d5797a50a56df3e0a255e1635dc51ee23b041d447f4c11d45c3f0b49d40c33a2b473268d072a7f7ae781b7613e3c8d90974d1a332475dcf58e8e33914dc320c658ab934e5c044d346b0a +M = 4f88801fd2d60e728675b84f694ce1de93b3f74f2dcc406fbdf7a0874667304e46fde103f444e7c50291d5cc37364f6b298da941e90dc013b14baa623476f0ee8c73c325e2914bf79c5962354e50c2fa5a682aabeb044137712135e750a21b69800eae6388286a6a069ce17bcb4b713abdd2d1eb68229943e8affda7 + +ModInv = 245ebfce2406c53335678b002d94bcc10724a047e49c206d97552c82c4a547949395265dfe0b52d4c0bfeea73c2324a7f80083bfdbedb79536c238ac86ae8c65fc58f03605133f807ceb68d70dab3cfa9c5b826b92f2e749f669712b1d0a78c31188ab4af022d52e24afcba3d373be54e8b3f098411ef157c189b +A = a49cb987302ef54d5ee1f8142239c871a91f4923263024d6859bbd95f7208ab93625356354630ad4960bb7be7d86eebb94926384eeb3e56632e72a2e2b5c51c8a4f175f74c7c5f65ab26c3d1df6348f3fa23fe71651fb095901a108362c222ff58c8222856ae17e0c63d7b7febd535e6ec6c8fa07a955dfc40b10e71329d9fe55bb83f96e2eb +M = 1213a18e805099fe24488271b2d95983bc7c4b22619b56846bdd6d52b2700bbb664b17200d6d327118cef625c35a1eed672a538409f01a1d338a65e46a1be82fd193a9e8d1fbf715155c576c266e615f9d6e29b61695996df1a13809167b38de88e8e52e1895409a51bdad76f467239a18089baef558d9572c35af + +ModInv = 964668ff5acaa87a2f6fd8661adc416a5119ec30094c63bbfd74d7a32af2d65d83a2ac72a1f631dd2e5a4fe89550a46044a823306643716c9cc75d25e455eb0fd4a18384754863c8b1bfbcd83ff702db144ff550f0a136f874a44db5cbfcfa4115edf8b91ea9d9806b6ce294d1b0b81284a1116793f6cb74582b81 +A = -8f89c94003132592c984494cc51728ef76f03c3c4277d645b2bec1d4a4ce7304039020b27abb42d41301adbb714a501609e52fe193ce22f8992a7895aa892ee4dce7d0ec21dce4c1ee739618d88d7f868b77f0c27f912d621b2f106f67699e059e6532a4515ce7798c2d5e914c5fed2c0d9ed5102c80de0e89ef1f8a1c6fb1bb4187e4b5100f +M = f145001724f1a146c1115e48cefe33d1ec97851d7345171fe5349814d04b19f8145c9793cfcec67975f88e2186b2b8d5cae62883d1d4ed5fc444fe4ad4551673a1d0bfcf35f005f7dd5697526acc09975ff659460c8dbbceb54be0e768be571775396f91f340080e4a5a85e7b6cdbc43944d70d3edefc6c63c8af2 + +ModInv = 559533076e5b4b9b72b3169318f04d29eb862b96a03f3d1745a93c8e86ceb3532cabba231448f5c63a58b3c1a3c712a9c322a3ee42cd3f638348f6e2a66e134907598ba3e99499bea020ecc14c6887eb31e29176e30e83ad24f06b8110f5678849ea4bfdab6b1c67f754d5e4cf88007d302b01658f027bba5ad7a5 +A = bf2b0eeba2612f368044b63393d3bc997b6c68899beb5a6989288325153049c4bea778c6471b8c0c1f9fb6c9f360a96274d16743b24f0d0aa22625bc10f7976398c1ea79a468cfc6a9788f2d7ec4adb6df0df39658a14a6ea70f8b189bf0f505343c82eae9e2ab0fe5ab6430c1a291738c237545c978b96c59a186c99fca729f9a87e364d2c9 +M = 62c8ce3133dd30530c23b7e92f005bcd3f5cf421689f30c6a3dc73bb1579caece9206de39c509f7e85e9e286d69ea114fb51672b12b3bac14ed4f027a609986a92b4b909e10cbb5a0ac178005f8b795d1809a00aba71acf1bc9903de8c42ae0339ddc4fbba4a14b8c32125b88e71cab7bd7db9b8af6dde3ac20ff4 + +ModInv = 25b38ba97f47c7488d8e78230e3739b680773da11e3519f12f41a9c2acbbd26b321e103e0d035f521a98f9dfc95eb0151e8d72e25b1b46b65366d23739f19c5a59b5eac545c1ab27c45c1c24413f77a21a9435a3d973b5703062bfe2c2953b63389c320e2063b56bf6b5bbbfb11552ee229c0e97d1e4cf4af9ce +A = fb75177118dab2ef14a6e541af4fbe50ed0ad0253b9003bc0c863ad9b07f9a73cf7c6d9d772f407e0fec1f9e0eccf7b9e854aa99d88943ae3792c36c14950adee9ada211b28dc9ef4b8525295e1a4473303ca0176016fdc0ed00c9351d772d451577c8675c053ba440e9bb9997506405bfe1c563c4f025fcdf41237e9965e3de2a6917d0a2524b +M = 7cf0c2aa601e3c71fca768b0e3ff1131f06bd2fac8e19ef7a7c8ac75954813c72137d346670be5d2b26c515730aa3fc8b38632834244ae4e0b96fac92d357c9cb995e406c3bcf65939a99056108f7099235e7d283fbbe7faa014de8fca29a7cdf8eb59d99970603fd9e6c27979ae750cda5e3b3232c8fa3b1bf7 + +ModInv = 1844a66a945ae469bc2e7f7a9a53c435a6f6b05144770c986f0174b5d3f1cbcf1943c1d73846742f2838276c31979edb9afbf564378ea32a0e08ac98e0f0c24ed0c7a203449559baeee2e4b5305204340813e5e8a819e4148537d9411054c54fffbe987cc4b98584a14815cae532e495817d976d05d631cd5032 +A = -da14a60f68ea8f35177e5f2421c0a55137dd2612aca90f4d4c776b1d9b75d704a4c936bbd3f3fa2dd6666d3754fb2edab11c15db48b6f16bc37168783f1f6508318063f3948cbcd41888f7da14a4cbfa1c0ab1f4f79d8ed8b64e6af64c7e9592e33b8b8b0e42aa1240e23aa3c7d35796744a36ddf2717a5d89d43600d42328b31cf80b5235401a +M = 89b9cef1b5ce788c888932bdec502ddd4506fe706d58d579de1ee7048d3a0d6e13c197af98cc4bc86d657198a2c53a44a7e4d5b581bb6236d4f604acbb262c56839be88e368f5fbf9f1c44f969a3d71db0cf3d774f97976d8fa5a51fe3ff1a7347405e86974224f1bae0a21c13a64cfe711502b7c474c084693f + +ModInv = 803a4f73f5b7ce0a3874cfa544805aafd5a55bee4e7af8c5e4a9f25327b972396549a925071775e8d0d3070a5f292caf8f815f7db457a5195806b6832303e651e940aafc701767d5789955ab8febdf3c0912db5dda8abd6f8cd7330f8301348abe6b06baf491e20d3185bbde6371a3a5053e45d64fb7886f237b +A = -f93624a50c55e958163e12dd24d59f6e961061be4a960b67f71590fc77346b298f79a5a57b5776625152e9feb0b0f174f8c4c82f44356dc910e25c7a714d9277d7d9041aed50529b1004f8b5c0fae3a1fe69bb79d330c912a062a823951deab8c41341baf23393ddc9706b0c40c81df579c7162f71584d512e81f861ac8581a39b9155cf426ad9 +M = c79c98458978736f1761845669642cdfd405745130c21f519fcd3f105adc9dbc16f5d301368ed43360f3d54271c276c6e2ecf3c060ad53560f559e2807733141529e0a54384a9a9f9a3591ddbf4ed3001ba271efa3b92b61ebb0db5ebc65d6585198ef3b86e7f0e2ac57195fb3055095d69e7a254313c3bfd992 + +ModInv = 2de650b05439dcc5488883f3c290c9353d7587490859571e7943c5f9064d721711c0591c4cba87ceaf31913a66a77ebe263313bf0a9cc9a3dc70cefa074e81a363b2e55f21ef2f3880bfb60364f19df6c0028d4746cfa03573b26dde44a760ff09c60ce0990e9c4992866ac5910b5423d58c6343981e52cd45 +A = -6add916a8014a3df65b15f38e3f5e16cf6607cb6cc01061d357f01546e6a1635dad8292898d7dc088b0520d4dd8696b504577a93eeda7f0f3dc804bf9e2e232228212861869fa43503922465e827eabe76566c150af38896339ce9e3203dc8561661c4f23a9c8261183ccc945944f59f7a20c69e11e98bd8e4d0718cee490c27e1612d0cbc27c73 +M = 63cd6f3b557fa8aff4e13c1c4f57f16613072d7862274154ce5428523a821f845db581a30cbfda06ae18b4788d83a962acdd0cbe2be07d0a4b30fa789f13d91aceae89e4f5896e1ce08b0c9faa8f199eea9d74ce4c9b1df1e0394db58dbc8bf4e5b2fd2db2f95774a4851b1b5593d7550d4800fca20b394918 + +ModInv = 42901886b3e7c40d71acf8526abfe6a70c13511d43e3aa253339ae781653408d53717db27f30f92253a6c824b7233819fccdb120009d012218519ec5e96b13c7a37cef618f0020c900aeffaac96cb6b6e7b0ab1ad10d08222b3e5e76c3640213145c8a8032230ab722448734b28be2ab342ae87fae03067aa7 +A = -23ea23334e2267024bee63b2c0b2d8a7a103244c3b41b0da9958ac8ec6af14fd6da9d5459e790fa7e96335a8fcad3f43f90d6616080478dce98e54a1cfb7492c5763d8e52b888d113c47c4c1eb2b5e6058f3a309553da63db6a48b93e99a16f77ce008f63303022293a618161119d8a99b4312bd805473ccf2a092af4c6d9257cda74548797e1d2f +M = e08e2b79b5a4d8a2fe9b09ccba4d73cb64d6ad1c864ac218045dccac90a0fc540640faa32546b654ff1267c544f4c2f8fcf679b99a0192c0331ac86259d700b84e52810c96df71f62f081de79743e5491fcbf39470fde8a2834f97b9ed9205506c6aa916893d02526aac666831f05c5b17885ab0cb60bb2536 + +ModInv = 1a08ad3ba11ff328caba64ba96016774002d90d211d5e622bb1ea15264f1310313b335bc53eafbe9c9f1f65882118862b081c3d50f13e3fb9d663ac9143a81a43072a25f229be1b46e8a6095fed58418233a28d549681e32b0b48ea0e1777f5ea9d61bcdd5cba5a603112a48d8284f7f110ae76e395efb6f6d +A = -1daacc81168e78f6589ab0cf42b7dd4770bf9a5fafbdbabc155da7e4e2ee83ae803c7cf6b5fa24947d48a07d297c4d8ff3a5486b0155a215e7198c5f22c96787e2d7c67576b3d74cfbc705abc09b8e7014668da4de82618e0c07e95345f9c1c7bd7197b04734603b77402618b6d0e1690b83d4bd898328938a46bcd6d7b3e080dd9edc0d30a16875 +M = 7740afc4176ad5f5fa2f5eed211572168508a335411bcb17ae610024933a65bc42ef307f39090d67efc987c37dda26ca81ffac9db89237a8654ccfe1eac2749c5f96e29427327cc7fca5a139670a5ec300f6af1357c836f59f536c5f4ed306969a45cf5ddd58d913fb409233b49e25ea132f24a969a8f0162a + +ModInv = 297205eb42c2ad84df7b460e059724fef0f22d479bbc10572741a3a9af6f0485cb8b17acd1e6fd5ad60157f75e4911eda985a4c3feb23972f836a4f9d1d161ebb7a0667f6f3a7f2422a70b2f5f0add98b18b216c2c9fd40509064d330993642534b9904122e9083e8108f07285cdde5239c597f8178a4f05 +A = -ff1f33b2702db2d2e1f3c266e0ce705768b5dc98ba7067bc8b28236092f2f04f08713fb3fb45957b3beb97bde0ac43dc38b96d4e90e65517411ec2764e6d840960b1ff6feb7c329dd135b7f5addc6db7013180457edc1865dcd91705a0d5efe0322965b1b578d6fac7254720cff5942c764c869bd9b803c9484a97a7276366021f8c2ce4f5005f7d8 +M = cfd08ed390febb8aaa650a771c966f8eb03717cb0761ffd78610b4e987825b71c2c47a43686ca24c396229072efc87dc0e2147380f9f9184febe222b1c29a3b87fce52813e95e566c5525df3087a1890cc949607afb680b9ef54ebe71cb01687ac2ddc8b622e3648ad3595a93a8d296df5e298e7e4aceab5 + +ModInv = 4670b22a9901918da55d4801fc058a85fb7853e6df2e3854cb1ae3af42cbb6cd49dd22bfc67bbcd42147bf202405911ce5ac2fcbef07aa8c650e757d96eaf7b28d59602419e77e1495ef1d5b7f568c465a9dcccf328a6161c61f717f695cdeac82ba67ee8dec42faa16de2b7b57e25caa5fd0fde86af5b67 +A = 9be304ee21323122f8b77c366850511abb958c60f69d0807b6e2d8cd84868849d78bac318c7619b053cd3eaab91ca2c0cd9f10cfead74d7669b2cd000b4edf529af21281ddae5f123d4eb4253758526cee99f031570807e1677e08413c17fd467c99ef540bbad4a86c11c04870efea9aab38f50442aecea45b5ccd01d4647a4f5e2658868b73f091a7 +M = f55f0e5feaae067bac50f569e5f9c2777257b810b3932be4ce7697277828ee814da61526627a7aceb5181af180832ce526cf03241f16f14a17296edbdf903bbb5ce10d6c94b757c0b6d0520bcad2f1e5497c0b53f015249f17a72ddefcd02c69c32a8501b794662c06db5c4147037b532bbcb116580d336c + +ModInv = 5bccff021223b106c2f6baa05cbfefe9706ee6e4759fca09ada0108355b2bd8b52a138c09966606c3e8eea75111bd22490bb1930b163c08178994b67577e008bfd9172c3e64d525c65ccc48041fa1286b1e0af5d2335dd9225f0269f10481560c8b92d7426eed90fa218e354b2aed0a7b9f5e5955f8931 +A = a30059024aaa7f36f8898643c7d1a784e9144b438311814956936acf04470a0fa0b33c88399f57ae84e76f8882816e6d8351d743b4eaf69c7d734b70e63e64dc6a6bb70799d80a89180626c91f427b5091d88d786c96845c53d006c6c4d45239bce4db05f201557bf3a8d002c0c7a07e4846adc65391f0c40f3e4fa03cbeca267326d30d841a210f2c1 +M = f3497bec3fad4dc0dd4191d0b649c9acdab642d2fcff9d5e3ba965be75a7612b6f19644a8e55b535d366947467815ae93658e4cf15a283c69a2dba7e8442773f8bd0b0912f15f0f74745a57e2d7b8cb5f45e75b9326b20d167cd5b1f93ad9a51e477724ad11c09a69ae379e254d94d8a8f80a547f05fe8 + +ModInv = 1ddedcac7b37ba742af956d8f0aee4d193d223fa0e2c5beb3e880d23a00167f3f93d3b8d916cac7966a3ed69f064be9f3256936fc7edb0913737005ea6c9eb3598d37fef825435591264b64c508be1180f5a87be04deea61d1ca91191ea1910b24559c4fdad8aa38f7dcc666bb632886527f8fa09c4351 +A = -c65a9dd349da1d6e5569544fa6311ed35e6d8bb942192051c30124be979b329ca3dfdb81ae787c6b2c5364b8aa7741ecb1928ec6aca47aa44b44fd8949d934486838fb5cee81c40f20a988b468798d8d05bbd3a18022587f5dd095c0f2578bfd9cd8d22cebce7e6084cae93bbf0f9dd675176e669065df7de2f5cd31480105ac6c7619a248c186afaff8 +M = 8a60076da6fead07baaf8d8dd93d80f58b346ecb7bb4b41e5e55dc31408bf76634332a2185fe99bda8c5e241ee0f4b65f27385ecfa3b007020f12d520b7d2cde2afdbc12e9ff6856b857ddd2954a6327cb375a94bda73da2af0d1f175106ad3e26059ef682371366213dc209831e82bb8c2e7a89bc909f + +ModInv = 9e7815935e768d84fd0ac7d63c58944a1216d8350c16753dcc3828c7194e258df781a943c9d4ac6fd5cd1d33ccb9f116a0482b0ea221b850d688ceaa5704cbfacc976cbcf29fa6434d5d14d058906c25586bf9856ace232a77231e38c8ed4c1d1f060da4f8b615ad5160bda081422795861631df1c +A = -60e77c1ecc99de5e06269b8b33d42cf4f93f2eace5bbbe7fb00ae059f267ed890b8372ab22644cd81232b757ac0d7725eef95dfbbb69cb20d24658c11926593f83f1a4f55fb60a472a6e3e52c1cff12ce69d74dc551e19779050626afc0f1f5fb9f753ac116f6cefd376775f6e05c8290813ec6f86a32aeac055d71ed0b3f8a94121d8451290fd51480c1ad3 +M = b6dd75ef01c57e4c517e62d9ff85f0f95dc1e11322a7b15bc8144e27bc7ce113753cef876f85ef6a8d7c73c1bd04d82ea0727159448b522846b97c599a026ad25c326a75e6b5566a852be2ff9d24b9c93ce7bfe9367301fbc2b9c843a8fc8164fb46f6b2347048e96849661f5cb1fa87603385fb7d + +ModInv = b70f9519c4ec15fa78e84a0c8cc5603fea604aeaa172886f3f0617fae2e7085bb94f42acf33babd58ae42b509bdb9516271f96e591409dff6f13e7ae5b943a4096a0d929c80377f381592f5d27e6ab1c50a630edcaeb48bce434058d002509b698127e3ce36bb512fbb0006bf16487a0eb844f5fc8 +A = 8fb15bb7165b48ebe0b5f7eb1035f42c19a0b7278f887afc0c1a8f989ba16a95ad326dcd68b6c820c450f08b9ae8cbee1534c0cf81c9a07fe3a6b411eb4d14489020e18aaef7a5990f861705881be7b590d36718c812371c1d7348abec79e810f382f42c2958b54b0481e0d8c25b8b051da33c30a7dbc54ad63724361193205e342fcf830f8f0f4b071ce204 +M = bf56ce2f973f71ca99ab1b89377714f0e23f19dd37d11a83011c0b3975a49c2acf01909fac26227f4003b0e7595dea8eb10b6ba9d6c84be50f22e2fa0e4954514c5548365651f570f6582e4eb2d0d8a6892facedc8446a0650d7160e69211bff47072958e8bddf2cd3a28aa42e43db32321c642123 + +ModInv = 17cf7db0b802f52a2098f765381dfcb72b52cb0636c0337cd0ee45addb477c14a8d1786823ce71eeb1d3e718afc355b076d348bb3fbeb1216abae478b584aa66be4431b79630fde3f2593ebc65001679043e83b498ab1da36b7dcb8bca284023cc41f429a23ef5caa78dce924a1a44bd460a19fd +A = 9e3aec3a5c5bdf39a3fe5124f62000f7d0d1ba907298b41e557b8bb1688a77334c4f286d4c002303aef5f1ef69ddfb35a0c30513ed417f66e9a0eafb46ed194b5d7befe38f6eff9d6130e0fa4733704edf722288bb2c7749d27d10270728c90ee99e80289cc58f1f914bbbcc0c96dde2f42d00787102865bec0727562471eab1091f8feed9b421371698bbbde1 +M = 4ac8a14d865fa60cf72929aae29abcd3953434b959fae3c13cd1921cd97577b5aaedb8163dd1502d8e20c22c4bffd5fbad3aa51acf4a6a140c44a1611bf24a260c465535bc6588549b15d77916cf6e7628d4170f300e9a6824c90082295756ef9668f5dc8b8495daa7115e8be1cba6cd1084e094 + +ModInv = e4b53a7d20ff9dc98bbaea49a38c5f4cbe10132780759642f128d893e7dd4061c4ee1203234af185caa7a1aeb67e39cec342af1e09fba33550754777db8780164072f1675717a545955e87b21da1ad4de230a516366037e2cec7625a4ad3e5c45767dacb7441af5f44ba1978db0889fb7ccdcf +A = -2a31ddf4b26fcd69d7af45dab636f020d3589aaa84ebd38670c4e9812f3d1e6cd8a28e359ac2b7b306cd2f92e2ddb5ed2b19fd9f45109613522f135732b636dc3b6b69b44b3524c12d24119b74d8111ed5fa284c68d17f3f839288eafb9f6410e3f58eed7c99aa2965dc6fee88515549bd43cd4ea8a3f0b302f7f93e3309d784059ae400d4df1ed7bb76d27719 +M = 31cab02d36036a2695879f6290580956b5075e0c9c05c781335933eec9e7de1a3a20154cc608af0950ea0802e7963f610c525d19726b61611dca4d9103f055df21d19adb48ebed29aab07b187836bc39e2df679318c58d4b86274d3676df262369748c1df33faf76a4a3eb13318dc6f7c4c017c8 + +ModInv = be67b1686031a08497389e74639a680cf56c9e64e6c2ca8b152794f4b5195c72b13690e5103f9f262042f40efe3c3350c9c1e121b28b2edc62c1d3342614f4dfd2ee30ab292a924db86d966f5d04f61b819a3d9018097677a3ea8ce9669e4bacb117245538573026d9d01d31f1567ba4a4045 +A = -b6940661e057586cfd13821c35f404cfa1795c928b4ee2c81578533c96066fddf52d007c2a6f8ec52fe0c18fa6227a5b2aed55359cf94b83e940025c6b19a665af65c7c57d934d98c5753c3029c46c2b74d65b19e3989e28e392956b6e2c41a33ba36361d7bf4ff737ab1de3fbb56fdefb50952fce72dafc72e11dbd27326d464d3d20d9a77e84f96377132ba0d0 +M = 340d9d4b205263e708ba1e9600b7d034d772404f9f28f493a4ed28044ec837a64a2ff971dc924877cfb9a3842726e2ebdb7b1c44560a52e79d4beb389586e744ba9fd370c9974b555ccdbecc29b1bd040fc5173098c897562b980ebf0c4035832211b3f95eb0b9d03c3817a95ac01d952a8b65 + +ModInv = 804deda2c85acc8fbc18503873e17a509ea04682826ab2baf9b8bc90fbf45168a78109576d711ac0d7292465c50a5f9a43a1ae290af33413a87185a41473289c29d4cde2965c14166c6db310fdbc647ad6f6af2fbb5357002cba03eb6512c1c4cd1b5a5af0a87f054e1f3b7438890604fda10 +A = 57d9d52035084a5b2e90c5b9ac5a36bd350cafe302ad9fbf3c2d6ed33b49acbed2589a2f64fd1004b0dc2327baccf00fb85aee2c32b6a05a5376face8bf520945838a26edf8c6f2a3cc432fdb6e2981802d0223be518b5f762b1516824c13fbb44fe0c4c99efb4726b48fc46f6c3d3a2696a9f6ef938317474b2df651d5b4fd581657cbfe1a6b89e3d95e2563940 +M = e65e40001ce41c3ec6cb7e77610301ffa86f0eeec6e14262a097ef19f5cd1001f025529ac3a2463c99c4f1b71d52127e3acae2f3168059ea914fbaf0551cd541211950f5932389f22104f385370454df7eb098de7fd1d1705fed56874521bd37eb29e5223f0f203b9a807b84ddedef972352f + +ModInv = 2eed0eebc2a25fe91202fb062c7173423cf6c1ebffef600558c909d30ee778853665ad7064cd74d0424864c3e680d59e0fa3034deaa20bfb26ba1abc90ebc161f30a46caa4d21e68fb5f1ff66bc69b77fb3948a8233ba1c6c5f82fa4453d4e589b2910a47c73d517128ee59c1ca3f8f4e8244 +A = 323410b76e91238b1bf16bb0134a326ca7c43306773c1f1f08e58ee66981d7c5f5aea69619bebf9be0f73009c5dcd90c07332958e53cfcf393c8fc1e4a1a3949ab07f8a4ac802f89d2bcc81832516461cb8cc48e6ed3b0150d9d51c7c6be04013dce5b8536c06ec4f0ddd7ede4f865bcfe484f45f4f44c8a25077a99fc1890aedb73baff48995e6996ce8add1e25 +M = 7cdff7e4745b88a85581f040ab30136d597c2de60de9a15db0eb3af98318fd791cf94179516be86870d7a2921a35a84d6ee6531cb16f839041690f5913f586da0a84bb20b71e4efb8f18f9d4a47d628b48cd3e72e719605f0c3bed62d8f9fb9e59b0f2eea81b5d91767b2dca9c225e1f97267 + +ModInv = b0b1241a7019978432c7919214ffcb7255be7a3db29ee50127e0a0a009a4eab38a503c4e445db1437c6553c92015a52510e509db4f00f2796657dec0baa8da2bfdcebc0ff419d3512b4669a40862d9eaacdaf0cf64f9bd6bc0d419f073bb0ec1c9cb7c20d9c84165cc973707b61e5ff9f780 +A = -4e0d1cbe1397663aa13b774ae82a04b88e36ee6827c2cb80f70eb8fa89c54e54a73e64d3f34ff6436332e310fa2ff1aba89855df6cca8abe7633625fb9ed0e088f6e26810decbb7fea593be9632757ffc9a55ec27fe5c2fcfcae5b2a6a6ea69938e1c31cdf477c8d3f84c31b48e919520394b95133a4a950b4c10deee39eda58604130496a72820b9400d308732cb2 +M = d58353e746c2883e82d158b602261b8ccfa2d52115183072ea83ea66bed2fff43a94e6b85b3af103dc62b29986d5dacbe8831dc0049f84ff9e04a6be8f6d585d44590bb015cf305f9dd004c15be1bc7210e59f93abf1ae81c7b51f0cf2445402602a6700c17ff08ef16347d3987d8e11e163 + +ModInv = 1a2e510b30911dff8199f8d819fbec05f4f3264cc21e6c967b9cea9ca09c495ca463eb482889c3598a436aef215670278e362aae1a367e3eb366dc4404a3d3a46dda7a97e3af64e21a03e52d5db356e54912fc6d37f2e8a202a53da49ce325ad7bdc6dbbbb10c268458d318cdec9bd4b3d21 +A = 505b9ffa26a5ff989b9f91111c89a2cc3ea4c4c775be0b23cc4cb328715e439265ea84e35ddc5dd2fb524c57bb58a2d08383909e70b66223801037a7fa999e8374f4b3394c2d880b38defcc3aace9e125b17309062e9118bb8ec2701a363ee6140c622e9a585b5cea22559ea4bd6a6b5584f3e3235707b77b18a49af00d44d4074160f35b3e79493836e646628a325 +M = 3f3073bc102b101817ce1348800200f7e1f5f93a3e5083c0d89eea6e482f5c443449cc33195a4d0c61fbdec2141535543667f1db4df7ff868b70a846e1e562824fa733c11771fe078088d1dbc9157c370682a55ce89df8eead90d591dfdb0424ec334698eb1b6dc86142c247d940f4d01306 + +ModInv = 3741d571a28131b5c2031bd30e6cd1f1bf06eb6d39b1c3121dd72ca018fa20e358172ae1c5624dac8ca0a6981ed2bd9f71069554734d719bd495d1abd3e85a87f33f2104a58b9c9c0e47cbf20cab2407fb055519945f414219136b5a34f720a1f488f00cc29940516adfa41c0aef8cc22ea3 +A = -a8a3e675b96eca375a0310c19830c925c537631d5f16c1eb248847a0542fdcb028aeca010635798c456e41054c7ca3860ea22076d9564238e4e609e95f20a5d9996b3a1b1143a5c731dce65fc7aa265f68e886cb379bd26a384df4493e8f003cf16d8a725b26ef7085a149a865e14f715aab822065e88768aaffbb4d476c8e8ee2ffbc8b4ff15bc5fa971249ea5f91 +M = 78aafc028e2ed3a5c04ae307bf2003aa5d7b8ed77d16930df27b345d7fd59e9d7b54cf37cd61e62e95d3c941aae632dd0574fad7fc705836cb431578f101fe99977874cb0135bb0c560aca8fd931cf3b4cd5e41d0d5d9863ed4b2132b06a5d4d173311f350c5964b11028c85f28a614bdbac + +ModInv = 324e46e955320127e35dbb1fe2d9a8a264c9438761fd8a59d9635762ee8e0927aa939e0b649924201e204a5f821c2dd962dd8d4a7ba45bbeeef5db79b741e46318aa814ad0ed358bbf0aef012a7b83489e73657365f4890f98f46b0497c22c5803c2d85b6deb712fce3cdf755354cd3008 +A = -117bcc9b132f34b497de715d758126d499e1c889985d8ddba8429dcacafed210f9b61250efa99f1fddae6f32ba6b2000f748301d13f0e93065867e275fc2ee67ed2d2cb53978af6329acec045644546ce90b54cf01613f3ce2c9053170f9009e0b1c1cdd0bd2c0d621d38d1b8eb16c1b2ce4d00d7cb9ab37ff1921d9de2fa4217dcac0497b391421dce31b1782ada391 +M = 330a65e2a44072b266dfbdb300569cb25e75c153889aaa7ecd27abe1885d457e04a7168e3b526227db1bde59efacab07e44fc5256a8db5bcfdaf1918a576be4ae6605f83ae16ed77334aa8a852b5ee5fa97e6e7c01b3502d5bbc35aa6947981b30cfe810b48990512eb899b014d40267d3 + +ModInv = 7f55d45ad5dd9609585b2f0395892b02a30902c5f01ef809ed55b326d157261db15e48f2be17f6c8143abe9765ccfff7f516565f043449ea5297daf0b07e4362abb3f59432469c698d4b9f9833fc03f294098ded8b149b6461933b9bb8a0bbea4d9032226869f61b7be125b092354630eb +A = 7b3308f21322da8d8cce9527d7af308b7669fbb7aeb9281921b4f7a575d2a359332629d1cc684397a3c00f0c9ef9d4e35768645293657d4dc0aca7d343bd0355073fa6c989bf545ad4e147e2dea3d2740fbab52e8c29cb202bbe9055b7728824ad8676e848bdab1b57d40393b994f9b32f3037f6e631a952fb0d9eac56e1324d9771eaac4da60f889740d4d432007303 +M = e7afb92a2cb534d4958dc45d3665c97c96a43fe3451a5925f96b5a5740ba3bb290fc310e4cbfd6f924b1bcf541278fc4fb275d7b941c7014fb18430dba55a09384483fc200c22358ebc10dfb4ca42b8c6f847bcde88622a6c010e3491f4bb2cea7d5f9f9dffbe48ca9d7def8a75515cd90 + +ModInv = 4cfa6c5bc889da4142e89ae17e30daeb7fb4a674d71c1aa108edade8e4f58f4fde2557d093050f1ddfe1dceadf5e69d41d8535f6e39056c3adc405a3559da8715362719be628b006a2f70121cbc9877c1f990c3616d27f136d44be00686077bef5cb17f418b49ce27a83bccea8c477225 +A = fdd009a11f187e72ec6d045256560ec6101f35532f632974c4f8d78e7e1694b7d9773ac7404038f4a64704fd48f0d40ab59bcbf66541c4e2099a38d67723e252ffcf104053a407134a29d77e792f97eee4809fb86b2e1796e899f907078280d7a9ffb764614473d2cd845cc6685b79af586f2e57d17a9475140f4782b8005be07f0b1ed8b38010ee71d4064ab720754a +M = f04f8b5a8bf0db4647c748b8b5a27ee400a7c829d6884f15d181ce6eca9e2538fb0e3ec1c262ca7a3c21b7250fd9abbb6d7b5879ff1c9b5c461a7db20ea94878d0145c86fab0e5daf770ae9fdc11b48bf35ff16deea8d385f0e114bb4f0dc7ee0c4d0de2ef776413bc26fb4a9f940d3d1 + +ModInv = 9bc90044ff9e3f7c3a7e3222fe3118d370af884da7921af1678aad63af341ce46653d3effd732949f770b9a8e93d265bde32a0fa23cd0e861ad7c5f07abf9331bd9cf03d328fdfe9749b8f0e4137c36816febed6d7c41a16d4df55779cb1e3ceec1287f4f382af7667c81e79ed5307b5 +A = -fdf8d861e3b86ea54843134ef274e2ce2e217654e83263e26aca470dff526f1096f979547ef68672d4936eb62d51c2fa6137a786cc5a40e75e014c1c5417164a6288b82bf5bb3fe49a9de655bacc0e42601146e412892629ac7bcb42ea3ad9f316e40cd920d27c77c8e5427909da41970cbbfeb22fd9136f1c6ab0f20adf5464a89ed3a8bdb1d336246aebffcf105e16f3 +M = ebd18a305a8074e4076fe7efd42e91b7ddabfdc7c8388c129e91e7bd5c83eedca8a9f970aa8a0c51440fe606b5818ee649a1461668cee72d534fc9c08b7c14799362e3e319bf15c2500272b013ab1c67af5e2434aacb8b70c449e9b6a2e6e420f28d28ba4bb0833dfa813d4a8e39c8e2 + +ModInv = 97df128cd9b7f1883db70fe33938e1891239097fafd0e65e6107e35bca147509e1efbc573cd8d8a22c9f455eec5084a895616d6a9ccd098950ce31773029473c16be7c39a756a6f7bc811a1500ccbb1803582e58dcebfe9f4b060e58c08c2f98564ddd0304049f627519f45da1a29e95 +A = -10703fff736ef0cb646cd9cce041daf353cfea7b7026389b528aeb0ef413c6a24d98227ffb9b3f93baca214f77a4ed6827a278e07fa11b173ff9c1d02025b91bbc3f7051f76efb51a341b6f6ba9173ac70e02f7c44063a36d69f6cabaca601922ddb96458b842120f0681f03a6a65764d4ee429acad687b6531b11ff7206be9195cc473f4289ff2b13ec8223dcf8c36413 +M = b87615581ac0e31457dd75ab362955d406cbb5f08ebdaffceaee1b91092d5b187709e2b9bad6683e75c91a7f7465aa9dcbc8273b6d9ec7818a1296c0c5f87f2e8c2274468dd6f8aacd8bb12f596bda422050cf49a04442f084065cfd799da89939193edfc50215a8a37ec59bec177350 + +ModInv = 1d0b6689849811c48abee66ea38bc65b45ca550b4d934c879f600cb516d7b14a58b441d13fdb0b2e5782c81e753e19546baca4c06829257f50d5076b138a73b124a56b4e208f8ef751a9ee5b5a8e5b3bb90e6c556dfb32b1c4b5ec18abc24296ee1b753eadb93ae784ae1b8227b94b +A = -2a4772ef409db1a0b145d5a970d79f6b2c4546e29b312b0d6509dcf794b64e6f1a1b0e84ea5ec1f2414e35761b22f3ef894d4930e7786d5284a322fbd0f930188126cec5f11f94439c92ed230af18360ba9995850f0a2f8a286f82fa6e1bd5c6f956f6b7e6294aa67a316182e62e35290f8c1407df80db99425c49fc1cbc054f6623f1ff87e30924f1c0e7e888fe78ef89dd +M = 47bf69925f95e366a53753cb3944a0c840f731c62894f5cc1db24432e314df7ef62d722dff0531fd777b5c904d5e963df8166bdadf45226cd124e83e2eb9118be905974dbad5dc38648cfffdec152afbea23aaa69c6159750cd76b1595ab9140a8939c923608299975573361c71b50 + +ModInv = 22c5c7e28fe82ad820c8c727cd364c7fd4e9f8b2de1daa1fe466d576e7f0d509afeab34deff32f1dde12021463dcedbb9bdce576492387e311b96a7bfb76cd76d75f71fd7ac038de6e135b3f20c3137d6059d278b849d761b90578a211ecad919b6c3ea830d1106f339adda84f93 +A = 71cf823f9d11f2c0a6abfaf1e963c5e8dd3910fca87cb58289db521d54b61f00ecea13e4dab728a1602445b8f1e2f2584b857dbdf574dbebf6551c80a5dc2c46ec7676a54eb0314031684302efcf7c92192e8291978c203da71bef96064a69c65baf15aa973e52ad4ab9ebed3a0b5b9b40d46ed7b65cc4b8e4376b8e11e2ac18c88959ddfc8d8e9ddb3c88f8b2b97a9baada6b +M = 3080655569d0cbd312c3c05ad87121f109aefe50383882bff37716d696e11c309a3d30bc395885d918decd1e2a35a416e3ee8bec201dc66a9d7f1dd32c0750a4236d2fa375fd2edb103806759c55ca8d1ba01cca321554874bbf16d06f41232e80e7056369814b88c97c2ccfa904 + +ModInv = 17ad29d04d86dfdf41bcfde7312cdaf351fc200a27d8caae4e53f0dffe4a75c1d18c51959a696ce60a06160ff324c1f0aad8247cebcc88ff67d4b1111e9b532718c0927e6e20822b6ff9dc70b577b80eb8021e7aeda32b927ef5c6b51fc811dc0946d27d68421945c382503c2b53 +A = -2158ae1503cd18510febacd27b922b84af1b1fd71a3c8bb87a893d4f7b73670c1b8ef28d4b90ff204de9d5b56eb5537880c7c9469def8c79c498c73bf582414898f276f92df0c44911c87b19429c42d8e0f2a10d3cc4ea8d352c305ab07c76abd3f40d5879395e8a78ed5dd90f47ff30c1352ab390ee41d58904cf586436df1ba9e382f7761aa1834d150104728f08d930ab35 +M = 18a0274d7a6bc0bf9717236845a8a4ede9b56236857790b91ace2cd6713a51f3360aac0802660b246bc39a5756699c3939b7cb02f1d8d82a8a541748c07f21b5e46f9e13f1f3659ddf85b4ce12fa7c2016e8d152d133082e0450c79826962df9e93e89d433a3249be5b637085d28 + +ModInv = 1dc02b8a166e966ef97d466eac65641099cc4565beaf0a96592ac5e04b1aa954938b6df81366c4cd57f98844de962ce8a0209145a77c2028fe75c997547793dc03dfd81813a52d4010cab35de1008422df411e930604e158c3b5acc937ce4da3fcab857e1c574bd8b0c19bf02f +A = 9812753454902987b77515e82092948d800d77a47504bb91750d3e5f7eb921de69504b0cb24a62cf2ff92f454dc0a833b0fbd6971c1cdf22943895b9932a75cdace9ae94f3ee59c29f9406f74fd5dc0bc35853ea68707680c89c197661684bda4c4358b636e42f245a1edb97fe69cfaa24b4b5e0c889900715c4b0cf17f2832ca7b42d41218165833ad02ded911d1cbac849b34b +M = 7d92240061e627a01a068d38fb156ae3e884c797599a85b1eaedda6e2480e9814e7ecaa5c61ec887f1747b70913158633878a85fefff6a4d98970685e78203f151d6094f5cb2aebc5b30f04067dd68333dffd144cbe28e8282add1d61fe1a428083fa009cda6e2e1997b6a6984 + +ModInv = 2c5cb3348710cd5d357440844ed01f7c83662960b155393b382f0725ed5b048733422cca3f46f8e0ce344cb011dd2d6a982f8c304d94170f8008843954800bd53d225b9f657a14e5eb6cc49f7965264c828c57612dc8bdc559b91a8554164f2539ce3a3e564d3b7e5e2ee05ff7 +A = -364ee6c23329163a62e16abe0605e4f1b32a93e57fe46517ae3fb142a11a5772d06761d00d8e9bc55329a3cd998079caa18192a40e2ff84a077e3857d233e846dd14237e7763e55b219d06990f679b01365f1976a56791e7dedcd9e4a62814e32d1c83e66bf1f7b8dfd5606d6dacf6a0ac83adba3ee1dda5e65bcd3203312c907ee36cf5b41c83978ca7957746f8cf256485c155 +M = 4752dd2307b3397953aed1541e4e48429b1a76078e7f16ae3aafac22d1d09a4a6dbad65cedfae2565a140d0e9c6c4451d0d0ad63336f3e0e0522487d69be4cefc3c2314414e73faf89e753bd89e87539b0e5cd95ff397aadee0cf93478593a9703a975977182b8c7d34805105d + +ModInv = 5b14be09ff2b4ad2f0a2020f5584da11c3b685f43b899048bab4ba32dbb1c868d695aa5aa0a18751afebe815cbda87d14747a9615069dfcfa7974176271c637ce3178f6b7141b43de66820510c0979705d090740b0f931d3fff3add2f3ed126d176489e43735e58117797372dd +A = -26654f26b52fdd6f1ca00f2bd63e3fbf66d374e47160ed743be2b9dbbe8bcffa924f68200ff62dae3bd89b0663b94162ec6ddb4b71ef5a5b4204c91d4c55e587d8af10500d9ec2fa1743e2c8f82cb2da319af84b23cc13ab6d6914867bd081e42179a8cfe0ea95a4cd80756e237152a4e8c1fcd5aee1ea5073471b2f428c565946ab7d41c4632f9855f7d3a97e48944b982a0053 +M = 8be79c85d05ce6f4b4d05887c9480d1d1b93e0e50280fac4be8076a2133552250ca30a28333d88c1f09d8227e7a9a0ae1b1c2870339dafd4c97e4a724ab4a681765e273500509631c13264a4778af319266156296eb572d0da55101b95e718f5f3b65b49c4a9520ef35505a293 + +ModInv = b474f38b5addb061672b18dfb86ae44db6101ad57b9253d341456dc91be5b0ae1de3499cce1777fe8f2c278d9dd5ea94cf889992b502e70f45cb77ba9649f34ec90fe38d1ea23dc23d483ba5c397c49acda18a79264dee1a7f3a08ce7110d5bf05e1ced2a571464fd139cd0b +A = 47dd53248c665b269ca897696aabd17cba2300eaaedbca13b2611d344cce5ef40cb8d246e1b7d1b772687485161cbfe3060437b48275c03899c098acf4d6073ee85a52b324a9a8a0de3f3d3ff8c137d0213d6d2edf1ab760103e373ed02feb61abd1c88717d93e1a38d0fd10bcca3ad84487dcd20648067c6fa7c49a11910a42a97e82ad5dc5ce59b81ab8872d0f808ea741c70e42 +M = f1931bc05be1b0f455bcc6939e73a7508d235fa2e9ac13c2aa633a572c1d3649fa7164fe3e6e11c57e6d82b0f7ae3de00fd4f784d9689ade9011891530deaa0889f4c4d099e603bff15e1544d26d28365187c9ee97bab45ae18861701f52e36bc026588a8ab8e890f27b2747 + +ModInv = 25282df867ea2c40326b794d331fb856edd232cd6d51bdc7e09b5946c819d0d3d70dd7caf56ba05c2c50d28e2dead7b68f4c726f946fc39373b778f8a46c7cb493f5d4de10ec84a63baca882dd8a704051159ffc25c17708f2ab8ee74ca945e606dc210d8d2b5606ebf87946 +A = c5ecba5c69e82042f106713d9bc922eb06656fe0c347477b325c9f6d9a430f9e9e8c25f50cbfafdaad33348c037f59ccfb76f5dd44fea5f232d27f05161ad3160c82554be9d33ab293ba069304daa0e884fb85a7392a6674bdd3979381d271c630f5c00644a36f4c96934844ee2af0c7786f1e5004849397e219410008e0b84381ac488f641026a222a752696d44e4ac44437f8d6e +M = 25ba32e26789113615feec5f7116feeedb0f9dff34a249d57a34d49227b86dbc5c315dec36327e2e11632b816c321070a63bf256b1c4767c61f300732505a774d41600044134b6822a798ddd7b3edadd07f63ca5c6d18afc1609d0760629a3d357b35a0543cbf9fb4dbff81d + +ModInv = 9a156f693709e6960ed5f258c14bae86796ac5ce68abd882496305f8b459f9e8b601262182aa9503da4695e5b18030fae7ecee67ddf49da72b62f9f6819ef69cb747711d30acad1df7d8505d5861390974947559ce81cbd87ca7e10856769aa8fd653bd909e47171d30755 +A = ced9f6fcfd63cacec32fb74f7a6d4b1e25a09924a6b41578882346c724773ffb7abc8020bef8d11297947e8ea874208d1d71cead888221f0b207b492e3453cef8b5f5db427029987371a7dfbff350cb577703a72db157ab90719af586571cc69f68d6fd7ce0b3d1d293a5bc8650b99c70b29a84d3b1d86614c66802ba1b5670031766565971af3e7da2e9ee34d099c40902f4ee8ec03 +M = da6fd994d50a83717a870be216aae7915ac1e14fc481a7bd861b5545a78f141bbbe0b121de26cef143b947630910bd731ce6ca98d793d7da4dafb5a0a9905c566be7b3df3d25eaf6ba903def768057ce6aac17ccd79ad7dc0d7e2a22f8532c5c2c66cc5ff89398e1ff39de + +ModInv = 18605fdd4fb7039c8779254fed691e47be4b80a001c8e935e16e542971f2b6b8a1ccb6ce69bfffd8a8ddff3a1297704d28c0530f48dc96d49615bf1dc2b366c89a771896189e997c4d7f972248316639ec24eba3f37456b93e8d8f056d51c24626e49ac4a6ecfd67b8e265 +A = -af70b4a233235948f3cb724a5c39f5fad70d51e25e0d19c1adacfd325d986099afed28ca0c28bbd656099d634b3b37d1cf7d2c4a34383e4783a4f2a57204339263a4474734cf4f1020bdc76e8d22a4fd61fe1e1853b5e4e15b3544d40c9b2f54abe60f609adc462c660c27c8aae1feeff07320fbb5e0045eecb5ffb716ed3db2b5ac0a2ad7f91dce8ef58b6590fa518436cca032d392 +M = 6cd83380b359c822c6a1bb44a92b17a1b4165be3a12eb9a03cceb5fd9634914533c74ca66135a06edc62b19e8a086bb6415030e74d36853a3a96d8b0fba2ce4c21dd2c82c2964efa1b8ecf6adf58465d9753c08c9f4b79079f68d236761d612ba9f21453f3f9c9d98a5b35 + +ModInv = 9786cfd0861d3ef284f211af5b4ae072cb052469a2c92b628e928a8bc326403624439a3cc4f7385777a197256420677f29df5c2bfc6ee50128f9909da047567697a9d23c7fd23b24c861c29b6e069ad1ba402a9c79e47e33e3b8df856b2245ec04b24a1c2ec3a628476 +A = -a3df107924da76e0a3e48b004b072f33525697edaaac2184ac9c867429162e8bb1b4d841e8849a020c19ef734f4c633e3697149b9c80299cebc0f433b790e2cfe3b73a234039f873f462ee7c67f8e1d6a40d58e23c3876fb73013ceb77710f0ae6e90840e7c15ab94e175d3278f39f13c93418a5cdd876a8601f13c0e22a97f8b7b0a8192862a051c51f1c9e10c2d74ea6046cf446659d +M = 659d207d2828ac380f81e9110fd10976f4d3953a0abdd509258df1d2594a1ee369647b0e13bd08e27e20f63904e760eb9fa0357b5df2c36a73753e50fe6c5549b54cdd79d06098c324c5311253142c4c82b72c45fb53a9e4f5406fd2fa990fb78f51c0287e89313398f5 + +ModInv = 7bab468cdc9fdb86d070b16f1bb67ab8a40107d003d1706cb3325ecc1d2d87d7de6ccb558c0638584f466740c4dcc16990e5f6e49c85007b9f32112e581e54971fc5aebedc4c765c2c23e73613e44bcb7fbf0d6a84327bcee1e631e0f6ae7c804ead40d3ad0f158bdfb +A = ffb84c959d948154df91ac42bc2ba3e8075bddfcd313d607a5ae7a97b590fd94a57d73756a9a0a6206bf4cda955d9f4f39aecb546b0abbbd790f852a900ee84836c75699a9acc924e235efb6e62dcb4168cd07dee017b14709d7fd31f80a706f4de07bf8bda3d24cbfa0ab1d4d5299090c6526eef26cc569e88b790ac2d42672ed494d63663a98223995325e1efc672f273edf319e70c3 +M = da5081ed759ddc795229642f939cdf0c448d3babf7bdd2df05b199094646d03f933765788685cb4a8a46c166b97eb39b06e31741d0bc08919a19f540c9362e1c2d2918870ae41d613dd36214eb03dc1e0aa59589071942c2f56356051663aaa7108db6bb06608e84c31 + +ModInv = 2f5b57c0826ac78bec79f64e7d3398da3f7698798619d713a30ff52387831ce4f14082fa7c8bdd9b4e54b4f52843ca2ac81f963686129eea5e6aa4eda75e6402a73d3b2dc780434fbe54e1a36b455f3069e01a465e9806de171820c83370597e2ddb0d4fb18518c371 +A = -8fc12c68f410267a37a6ac967c809125a2b33b2c35833151f8466546c7d82a413fb29cdef0f1957a6a213edef87712f18b8079cecef67fdb5d5e756a09f2e74fe5eaf67c533bde27b9b897bec7de4c7d6aa90ce3e1a883372d41c65cf21d862c8309764b798ae66f795a9045eee8cc7aa1385739f1ef7f5b476a594f63d98cba7c07e710d3af9219638f0bbfa6f365e811362a470742298f +M = bff50952efa073d6020ac6dceedb68a6a421581fb3ed910b8428b874087f885bc1483bab3a048c6e481e053f33d6b180ac8c57fed6ccfa5a18bbf9faf406cc63210c2d5d77a909400f026d4da2cebfd483053fd5b540d8909a98ecd3cc591a87d557b184b7eb9718d0 + +ModInv = ac0926cd638ef0575b8220e168d3539abffa04aa3aba973fd52adab709237849384ef70874707da1c67a89bba60b7e034d599d54aa84eb91280cda8ff6bead88a34b765e555f718ca13abe53ac8b9fa6bdaf0dcbd9189a3325266d65d45f59c20995e29944dec3002 +A = 50dad16bd62671d8aa86c7f8ee7815f290bbb75bf1a1e48655ed8857a6f3b3f9574536a120da73b4c28f9b731a72ebac94ed7da235ee2884c6ac5fb062111efcc872e3319787f19886aeddc8274a204f931aa503fe6db29012c066f0c239b70c327376ff5e6ca8cf6098bb5a5a6212a30a30109b806dd264202bf37d525ff90076e9bbd5540c7b064ec4eace046279da8a0fc281d40025ed +M = 1165bdc6f1284c12eeccd8be4897e71d4d84ed009ab64f45c835b1f32ac9b826cf9127c49770a85a637aed7d01899df6433fafc410fee44ba9880b78074da5541510b18d6039cef54450bcf4d45e6501243065e3838ea7edc67080395239f9b4bbeaf092fab1c46053 + +ModInv = b48b3c1a27896716da0bf84e2b4d4a835e78d5f441de716b63615ca49e738af52aa12735c9c053fc489b9b193e066b88597e9b828bbdbbde63e7340bf5ae58a4bfa9691188d503a1eed4b7e17028a459abf5787e747780c7900b3b62473d969adb8f9da1a2a193e1f +A = -ad60947c22b67920107fa92fa87d4a0a8e01baeb28b129a3a20e6e4636c518c8a49aa0cc39e2ab43ee8364124c72a0a01f1aa54a56742e6445d2391596b9329bafa2903c91a39773b25b227e5f4c885598921961c253599d5d86bf29a8e2a0c82e9c3e6314f4d872c2d3fe5bd2d5e46c11f65763d075a2f66def407707011e21eb5c24e20fb8eb18950657847a3fdda38081b21812ce4a55 +M = 205a5a7ab347fc15bac38df8fe81e6b0258997f96ca29f0943256e647fc4376a3a763b09862a6d420e6f89e30a750783769b4e09a4a520377039db8bdc562d17c8235fd11812c1641d53d07006bd6a08ed43d1e58dc36fe74417a4b7b2bef5cc0116e32e0e97fd27ad + +ModInv = 1e9114f3d8566e3fe927c260f0b2cac2d855cbb2206a438a4d59bc99abd8ef69b142f17c4fcfd1afe58555f05e2002d2bf5f8b6837f6ca1a2cf3824005919d24b7f44de96e4c86e4c52ba5c165e1865b5b8d3149a18859bc68f007079586ae528e156c9599a86f9f +A = -85b7eab123856d30a1bc712ee195db011148aad754f49e619453fc896e6ee1b0a6d570d830434f700b11f5dbfb5ea7a5c892dce0a66369e9363d0c50fc39c89ab09be97ca772fb4404da97a96fd0afac0ec42680d295b8494dd8ec7927a5d11e65308c471fe773474515d5ccc0334cdf29dc19e8c00d3ecd48199299f98f6613be6e39b6fb10809b953110f3180cafeff91fb648dc8800c895 +M = 46987f58804fa7fa98a50eb921ab73c3ad3468542222329fc2d912d02fd3ef17e6baddc407af35782687a9e9cf442c69fad4cc0dd177b9b282c29c0062e250a2549fc6773f8a49ae118c78c3e67ed85dbfad384e5cfaf55cfc2c7776d93adabeaeafb14e5063695c + +ModInv = 49ba75836d2ef18816473c519eb302d48ceaad5c4c27a09c2ca12b6e076547e8a80d18ab3767c16b56a11670357671db655414141bf502c440c2c6ad4d68aa09bd06efb8c144926dcef2c5bd97e69ecae6b799ca5cea3a9f2d4ed20f88662c1e66cdcbac84716217 +A = 827f4c9a467e29de989919bbdfa1892bc39a548dada683949833a95aa8259443446519ceba7a0cf8524379eb4d023bd041a7d73e7ff078e0ab64b148ea9664c4acc2ce2aac951c41830c21f3a702365f682d211ac3da507c379732ad2a64a7df317ae44976633ca0dc27e6c7853167f2100ddc4f50a80a3249823981fc115ae3495fc99a3c030f588e800cd51b1c1f64a4243e821a8b0172a6 +M = bdb7322e9cb8d4d111aac75cea2450d0080aaad6aa6e5d1acb4bcc00c1a1603e8e092a97b2beec04a906579d07e3f70d8106788a30102fccaed1d2cb38b91f16226af8549cd1523b2ba15e2bce7e9c19f2a4b22b70b77e0e833c57def9e52c666595a0f9b15ff775 + +ModInv = 9e7730ad992ecec71ce959e4c74fbcadd1b6d13f5e6b162691da217a264f175e7ca4bc89bb1c29a30adfac0236be0d5e85b987fbbc4e32a767d885af11402417b26b48f289e4e57ac8e3fa3fe374de960b3081b154dd3b6e7f275801e0dcd18f31b6dfd0ab597 +A = -97e3b2994de7a80634b69aea351dcbfcce544963817eb34d4342a1dc9490b1a458cc7c7daaf3e1e3f0591532a0c6107791e4c6cfcb7297a58a639a3c09536a0453986269390ca2568acd960fd6504f4d62b57918cbc5662c8ed41c86fdda51aaa4102102c53e2083efedf2d100cd00f98bfd08014bf454c43b697d3534938f293ca2b4fd7922ebd9af1bbd0e01d152ec58f7a6a271de60401138 +M = e986b4eab0958e9e820fe55849eab4f51e993864aff5f37e51a8534430dac66c73b94bf962866dc01f693c8f4e0bef1ab82ee38a1a5a55c212d047cdd4f057005a026426127b70242b6fc2e2270c87123d4994c05a5730cd4971817cfb09ec66b9198420c95a1 + +ModInv = 40c4be0945ff99b8b57ce39e6d05a66763ca9757ee2fb755e2a25efcd6dc4c710cf73e52dd098bdf6805dfe85b953ed93af5971904f10bc0ff684ff81a9b5ffbae34d9b47f7f6efebd9e003854dcb2d7d7832fa13d0f4a48fd7649af18c555991558e6dbf13280 +A = 8275ffcacfbe0a11fb21750e0a6f5b1f034d31640fae20af4612158e44966f44aac7fa225d1aaa07e7b944f0c301bd8ca046beda8dfce196fe94dff661230151d478a823acaca46a892442040bd484c3c42acfd35ef550a313c82b6d47dbabe2ec1f881824e943360be683684b2091f0575ea55e97517ba0fd2774f54911836e5a026dc4fc564835119c4a2c894c35ad89f7c03380ad74ef1e88 +M = 4860e65fd32eb947368b26b4421246a90de29487194279b54f89036b4ce343f88156cda8646622cf03a31be57ebe8878e6be1ad54b4c5322d0836cec33268db838efa4c0c5b59ca8e83a1dae253af900f46d4caef334c1a73b8eef93d1f667e8957420a31941df + +ModInv = 34cd636023529b9cdd26ba7d5b312b8984056d595ac3561f43bdf1ebcae795503103f50475e7bee9f291bc754debf0b61fab78977280d940220c71ffc687b3c281a183c0a8aabaca8d22c39a16690ced0e797e231f738842d5b0112d1fabb6593735a4039c35 +A = a8cda02b4bdcbe211e88884aa1750d16b4b56e65b5a7d5af419b0ba794ed5db7206564cc6902b796a33a794b057bada277e6fa9f2741acc7db85d50653df399e98b901b375205922d71a55cfd5645203397b2abdd06108198c18d68d0a9de081b8761c4cc698c2baa08027ed31f64ff3f02fe9f6afdf36088060a5cd798e89245d7cf5663b50ede87a7cba4b5d9a01b38a89a72001c0e993cfb946 +M = 3f9cedaea471b258b141886fec7e3516634cd7fd136d65a92aa5f58c9c92baa4d20e69c643bc3a35b042b444960d57abf09fc0567f8ca1bf84e725e40dd22fd07e9f6e3c88b9168b472553dee227bca16020bfbeb5c64b38287c58490bb5133e5eec89ee1225 + +ModInv = 812d28a9042c56d6f4a518366cf225577fa946730a33f6c6a2640cfd20be51e066a6adea1a53bd20ec63792a933aebff364f4520dbe86cbd1dd2cea131f7bbf6ea1a9b526f6d6b56ccbd21df0cfda950f4a8371baa24fd5b92a95e6488c7dc47ab0e1266f046 +A = -de122a36f6e26eadf40673b5194b9b5f5c1cf3b308320eb192dfc577969a0a1c1645e9556e3e1e67f5f073277a1c3bbab4c88bbe3d5aabf3f1318e45a26416f3d5538219e337f284f784e3763b8bb461b49558a7bfc47fc8005ffd4058e38940c9cc8b41c1ea6d1d9f0b596b79c9f2b8c523c6063b2551ab83b226a8597d0948328049a6e2b3f02f40c4d14d52e98f825e19514d1101a85070cf1a +M = ef91203634fd739c2228beaf0b6ddd5d24fb265f3a41cb2e0f2f5a975cc30ef8091df62f32c56d4c1e89e57f8cdd5af97e46195865719711a7cd7db4f64c0457d626ac70cb08614414ad23f47c80dea1b1e42669381915a658ef504bcc3ffe2f3add4e549443 + +ModInv = 1b07aa030a994a92653112bdb89d1aa78bb282eef81d82b3d2476ad391ed1e1c9207a26560350bed93a2308bcf5c3c7311e698997163a53707cd3c3078e234e31ed86167a7597d94d4a86251c624fd6345549e4ddcc154414b5594f0546b3b6a615f5ba046d0 +A = -7c9bbf80ca17b703be0e66d868c2cf1d4a2b12b6a20bb02edf0743175e99412607ad5f76ab14759da618fd7bf78a4d9f8f5ffba5f80a0a58994953040e1e30c9ed0248fc9799a707e36d6004762a223c9f90c95ac96628c438183619322fed157cf9c6b16e2d5cabeb959208f0ebd4950cddd9ce97b5bdf073eed1f149f542e935b87017346b4501eaf6141de9ea6670d3da1fc735df5ef7697fb9 +M = 3fc8443658625af0f3e0d9a54a0d7b25331f4d6bfd8fa506bfc51025dbe58e725d57d30aad4b45038e220bc4621b9439852083d9fca716c40a33acd51e6699f9823c118dc10e774520d7e98d7c358a84c15caad14268108727563ff4bb8cf703c9ffe1668271 + +ModInv = 10cc328c8d9260f3da4e4e71875f945a9ad1ffd19026fc18598572582ef4d1034f3dbb6ac637b8f9f37e5b07a0b1da57d14ca36a5b53af20b232e12433199c5fc57c60bdb59d76ee91f73cd2892b59b7ced9b1cbc5b83d5ded9462bdd905e2fd360d0de9df +A = -1332e84d0706e9a925f879f4a75a8ff00ade38a17564a836ada7144c0432dbfbf441921d213a179e4490fbe060a133ee629f1db37ed53b5be62bc27ae8106d3431f394b1f9a61cf67a23ab7374e8cebb0d7676c07b7062504895d564b58754f086c95a983635819fbca07a708d5e643d7da7b158b64ec24131f660b9ee899c7840ca384b482d3a373627fddfc3ba40ec7ef5df2f9a72818c9a0ee699 +M = 70b5d0aa945abbcb5fe26bc9622bb7311aacd975966ab9a98c6a10edbdcd0b5faa81daf4f1acf78103d0028c8193ab696711b46866011f1b9be0f444c3513821aeb402c416bd1ac575ba2a2f37427be3aa9d824e8682e71a6b7fa8a22e7e409fa381758328 + +ModInv = 85cff4e51e6511c40b3dd739c56a66f1b239187cbfca86fb19c6fbcdb3e680c639aa86dca49ea3160d0dd0b14cd2af43cb426b37fd4f583a2b7da8f0263b570849fd4275ac9344eba2e0848c6f9240186f5b813de551d34538a9c7a9884e90c4028d45965 +A = -6dc986a827d549adb4425f023bb8c2275f7d6dff5881ee94832a530600c345935dafc17063bc3bbdc77d93f9db334ad1258e4c917da3fa0d76777c0028613bee9676f718099c62dbaeacceb853a2a8618ea0213829e53855cbf14b0ed30f1a1a2a3544937da3c0a791768de9cd43c204a2570d6d04f714a56d03c0d895b734cd1e53aed9602e277ad4d0421ce31dc15a524a72128912dbce14440113 +M = 104954379bf8c18c60c8ad50a36dd77442abd2ae90e5f6f12c20dfc858ecf6d847579eb77b3f71bc7dd9a8fab57f39d14a51a5e39e07cf66485850632f80e7a3d5b50f023968e9534ed00216fe81c3684adfb7cd6c45f8ce6eaa5eb8d7c99d53ae5d0a4ea6 + +ModInv = 4ba36af8d80c0046b9c0d2837eccab813d2ef13fa69360ee448cc0ad79005a27ac0d30ebe1d3459ab27b4d166ccc54848c24048fd4d2840255bdc917f0970a9964360f487c44763e86b170820045810ca9b54ef552e7966c1d689f49504b46d2f05ce05 +A = a07db958f263dc7643c405467745d0f56f7e2a24b155974efe7bce2eea18e8a69f906dcd8be6b06fb4283ff81489f9638b4e9b8c1f4fc9940fd410ea4bed18925ef45a658c531238bf1409fce4bd03f56798eb9153afe5119c596990515f4734cfcb048a6465650e9bc23881d9b5d7380ac6315dc1cb4fa738560e7a4e3dd9004785ca44e381ae5e1afedaaa9efaacf910ef1443d9a994a649916389ce +M = f13eba18a5530695e3327efac7afc4bb8405d61980e8b0d5b4f20e37a88b038d29566caad3c128340f16cf4a35674165a72e9d8797835c220f4a08265a46d2bd2ccbc8bd924c51ae8c9de355bd6f9f780f2c718c75379f15dc4f8c08ae74b39a9a3ddc1 + +ModInv = 67b24a145f560daa32b3095ffa613c681ed8ace4f904c5605d2a2d4b817f000e62156cde1cf8125aeac397ce7244e672999fc358b699dd925457659b9ead63d02d3b2dfe609405b56c4ccf3eeb5bf68ef8c303c116f165af822cb0ffc4be3d051fe75ee +A = -2650a28be6f86fb289313ac20c8196a98a4769b7067644133c56502e67cfb39d19e7a7e0779aa8e946ff522f58c23c73ae89bd8f32287bec788f4d08beec830c8c441e4fde49488d3028792674df2d835322f777c3b3b46fe296b84fa2a93508630096024441ac1b3fee29570c736ad646fc06301bfd5ff9ec44af2f5e6b5354c4630e8b08ea730cea2cc55d932885e597a98903993aee12198094f694 +M = b4e63a0933b134790087addbcf7db9da18241e895959479635c46059c4a1858f7687bac6be584a2473a5f10c538280cc64f6a0cafae6e4b9b638af1c7c21df6135a3cc33b38475745e9463a50505db7d7949b6aa1514ded3d6b980cba093fc3ac8009065 + +ModInv = 30335f101c72b74751ebebecb8e612d6a41d0fce5c641381faf12c9d9e20c777d1180cccc5e9854a80384bb91a47d0a399e7e3a29071b1d1125cada7e08509b92b230b559a7b354d990fa12621d9f46012df04859a8df890852bab97e5f4413f561ebc6d +A = eee11b641e430ec035efa8b6e46bd90bc0263201de4936716018b5b8670566fdf35270c91b42badb4ea7f3ba72697c2110972ec3147639c247d55abfd904f8303e9f8c4e8a17fb6e96230e058d8b663a7de66c584506df3d87d36918ca7813825ba2020822f021253b428e1de4cbae57fbc0497cf3e72cdee8cac63a7b4cf8f7345280c02ff359197646ec0804288197efa003245964ce737525660d47 +M = 4fc33c4be740c5f5d2886ca697eca423e929c11dc95d10bfac812d9c31d5808ad55c676bf090350917f9016c5cea6d977f7b6c7d7d6f63a6436b745ab4cc6e04af18086758ae34ddb70d1f057962eeb7e6ee9da5031ad42c538d71675168aea632933502 + +ModInv = 115d66031332a8613008ecbc753d61b2fa534e166563198bd8d0ae2a0362dc89bd1c846954655bd9814e45231f1c6400a9f4db79970ec363cd4ace3ca4bbc1920e5bd8baed753962fdaf4a5788238caca193cfc40e2203163a81a3e1669aafa008b436 +A = -463258f229aa62828288f667d9f0a167cd331d8308f856506751ae2a5670f53d0e0018df1cd6da962faa1d43a3f5b7e58d674afe1e08d8226752d4a79d46b3a74b99e2a0e67a19000f71e32d4721f7e30009b431f209d61b9d52a038cca14fc82225106aea199398e19d5bc60ef6cba82e5c46cd05aff8da29abbd3233de6dad0667eae2f2b4b57caea670a06a908b03294c1cfab2ee1e2987968c091c94 +M = 2235efe68ccf7a28c5072b3ae63cae8cdf43f822663c629669f72fdd2cad852c720885d2642d6ede2517dc2a2269def0e8880ba4277bd21d08757baa6aed5db38524387ba89d80b7e947c87671ef6b0285128c3f3b166d0650d3eb6d1ebb0639ba1151 + +ModInv = 3d399490b062f00183bde7bd6d3099cc4d5adf3f94624aaf62cdb21f12f1dbf417def67d212418cfcc790e128c5b231301da1888013577870412c09bcf2427dab5ed07089bfca50bd92b378b7a2bebf49f6a64fef8c62f9ef404791ba4082ae5529300 +A = -beff684caf40d29d4a9d0a00208bb2f4712a5e62966205d7675359c1aa831440a438b2f0d7b293b838af3363dc3d3980cc03a1763c43a4fe60b7304a4afb349ad7ebc496847067eefc437489dad4a85a1752dd2a61c7162fc657a63cc21fa144eefedeb5c9887a7897d24eda147ef95dafbaadb59d305fc802df9f2ef45be5e55715dbf3e2827a4c77c63fc8c1e6592b681433d47399656679ac82910f90 +M = d0b48832e22925b20e870f245b632fd19d9263403cb89df1a53ffe7d135ed80c2ee249254cbf18361629f41ec4cb1dfd4f4ca55f28edbe564720f8139dddadf87c7301fddaaf2407b3997f8a10c58ed7cfc70f5ae01b34876ae3663fb12b94732a4cb3 + +ModInv = 9efde918c86d544bc6a865e65e077766ac39b4482de9394916defa69bdb749c41d220214aecbe07526ed0001879f6ab398e5d337258c30528e340fc6290d28edab05077b9d25895aeef01ef200e6a02bb59db2f16bd53f623699dadc0b4a9b597ad61 +A = -310e99113360110cf5f308afb94d65f8e3fad683ffcec61828f2998c33af56e4a001b5b81b1a01b49ee04c10170ba3bc195e9c5926cc7e2f60cfe4b5af4306eaeb66348d12dff0f5e052b5b37e8175932da313b7209283e2728c68389be45c8e288355eaeb609038cb5595fe35f9842d3ac9f0df568a983f378f29d95ba9bdb1255ecfd4317354418d3c7706f2c45ffc7ac6f2812afce07b1c4d231e619f +M = 13fa7a5822c73bf8cd92f63fd6b759896cd44758cdc278b60562d1798debc8f7eee02113c52703913d2aa25ab57a4584a56e00117fa2811c1bb2dbb57dfa26d69e2e98b6dc164aa5c77bebc53eed6a83d398cd4512f508416b95845e908bc436c27f8c + +ModInv = 135e0099c64fd6bc46d3b0e919435edd9493911f0141f1920f4f787fd4da6e3ca9cd69c3a4d7ebc02f166ace104c4fbbd8577fb186b499ac6d29319f15fb786a1d31b25dc0343b703f76297d8df9ee38c256642c9090dc595ca902e095f07645b896 +A = -303fc7ec5d503eceb2371a8a4770d29b68b79c0f49ddb2df01a1dc619e55e9885890ef49f7fdc6667ffa424d57d38c7adc454dd0c9ffb530b1ca6f04d63ca0692362061794759acd125a8dc7b9d2b3602c3887b01176b058d78c92f06a86f9e35c1ef841ed8d550f4189d71c25b0672e39bd6516565696aa39158ebc78e5ce4c2c718beeb9f0336951cacc729f6df97f405c7b6411b3247a1fa8eb1f7c449e +M = 72909ebfcf64c4c761c6fa7beaa6de7f20ba7227a23efd14d96a3355894a262d411b94e4a3b36b09a6dc106014c3a530fcd8833bfa7392d438167e17a0c0a6052b359ff0e016a8f8efb38377f8ef78291f65bf14782630915d58bc07b5f874d1d897 + +ModInv = 165c07619c6e6891dece14c3823f19fd44db289401c23462e89790022ca4b7bc3acc0ab54bc30aab9b51058f51dc302507c36ea2ebc385b3bf53f2ca5a6f8dd9d869f85e3abb256cbf87c4582d28834a75c546bea81f5f3eee82be80c4fe9ef94ff5 +A = 3180c09504edb280b13053eb3da2314be6f542ef5c520e39154510be170c65fe54e678dd02557117e7853b833686ad610035a34539ba93c854f4cf0786e2f1dd64ed54a34d05247260d6f6d30355ff28880e779bda36829b4dcb29d6cf4de3da0ce9a86e85893a1476055487712671d8552bba0c1dc67fbe0f31416eebf677572ffba6cba008785f38ece4b3e755fbea8c16899677e7e21cb8fb0d01908445 +M = 50ba386cea95576502b590e1fdcabfa77623bda01b9f5c3f78f51642a7c4564739f18d3c03075d10663d73d611bcf3670e4d07a6b8f2ab82843767dfd002bd047bbb9950eee143e23c7cf00d46d38cf990b40e345aea8b4cf5b633aa2d277a4a1bf8 + +ModInv = 1032b4c01738432ba292b14217f8eebe4c690d96d6fcb18b8835094f0b10dc552b7a905bac24d51e74de5019687ca714fdd437bbb9ac71632ef65420a569e82fa970ec319bcc7004a3e2f27956d7ee1c5ae87a0ccb2e0140f37f040c1f421a8c39 +A = -225692e0576246b0dd7720e4fd7845162f59e29e1a47dd9ae958c649336ee4e112f151b30704a88064ea90791217973cdb724e5ec9d290d7c8fc7908d1bdbce8fee432c80f853ded6139ba7ea2f555e744e262efa6e80eb7f830556e377c746325426ee4ec6a01947617d562002297ebb605427c04a6108a6e2882c2ef3ced053b0c9f2c60a2853b69106725955980f62ca9f1950360645b849e761739fff0d4 +M = b96532e75589fb8a41957cc08fc6ef32685353fdac06116d2e60148b011632cc4afc64598bddcab2b80f504398f70e1be7d7cf0fdd7e12280ca79fe9faa454398268d3d2aa05bda3899019793fb63d1f1a1549cef161c0064aa05d34f18b7ef0d9 + +ModInv = d7ea03e213b057f64536b58739d027d4b1ec559663668ba649713052c9d3f3bc4fa01a35797dbfd4134ea8f2719a117a4d55a0f5655b8a6fb67f8043602e7fd36c61c567b89b0dbb300c266a4445378e8edf2efe6200764fc4ee9e67d46ae9711 +A = 352509cc61a528deab33d1a593a3bb950d990a25763c7a9f89f0af59f97399553b1b46f905175c6e54e3c48a172c876dfc2ce10c2f14d2aa2209519ca1b988013674e9d95078cce83bf393fd77f4287ac5fffeff4601fc1f1f758592e5e52e6e0476e809e08054540b9b2628d01d5abe380b0bbb822d94bbaaeece7583370e6ebd5fe3cb7532a720056960828cbeb8deb213d0c48853f968a8cb83eeddd50f88 +M = 2d966307d4ad07bb50604698098b9e804b5c62eb041b21d7338914b0ec8b56220e10c35386f0360b76d2b78d4ab58654754737b3815da7a22f6b31f493d5db0dc0c4888f1d8bf4eb0432ef07a0c74011853ac62899750ba44f9729e8080332ba47 + +ModInv = 3efdfcd68d9a37e0df881dedb187a1d55eb3964b1045f7c54943383ddcb0ef64194e00467a168ca538cf24b5404bfbfb135ea34051f1f5e78e346840c2b97b89aea238e553fe92826a46a98d2f084b7b0cf9d4385a3fae9ea4b54016b901f957e3 +A = -78398376bf990ec20b64cb8dfd15d8c0adc324a44f2efaa62b537ae3d5866c1c6b555d84f3d82d25d0535b2f4d844639c4390d7ab98d20e5b51304ef52ffd163b951a3eae08f395ad31f7681d29d242b8640c3359501b436326dcce9d13b8520e7adf1a6062933924d23c0fdcb8ad285d7b349f2a89afb97ee357ab101fb975ad804ee94945e3dbe2213634ca4e96c91763a2cff52e40788b9d5a5ba1e3c0831 +M = dca2c9cf1fc45ddc85948c3168faedcf31de93a9adc57ad03ef50de935c8f628b702b71002aedfbf757f533ec4e9840cfd7207df64bcbca134c884b0005c727350479c16e1f02297a870adfabff5d96f0b15fe42728be988006714d02c8ba27d1c + +ModInv = 8b173d5d042a2ef104a38504a764b70bec1f867eca4313fc2714dfbd0813270db74d3b59d070bd177a447838b7666c1e070b36aaa59fd1ca2092286db3d85877e8daf50059580805aa4bd451552183adfe76b1cee85d4b71875979152b8ccf60 +A = 966b51b13aed14d0871ee7c927426940d11b182f25a504ed61bd1df91da53fa3b5f18999066911657b3d41655d29932ce25cd30520c23e8034939837c8edd54dd807453ab115e2d750f1d063087ef6930f7d93de646ae8adc12f2d91021dd413524ff0c2c466b51f615ffd295969eaf5bbf406582beb1cb31f999c17fc56c37b4d6b1755e007cb05ab73d65fd555c6e07ac5b042015c286e87bd1958eee398d5e4 +M = cd8b1c337de059bfbd10e2496299d64467f1ed64f34aae0d2315663052b91f8b015d19347be0aa76ea6ea62ec71fe8bc00eebac592dbdc038a5945d96ae2b78e469fb8291dac7cad537a3dc0f57c086a0d966086e9025e50282cbca70a11aa0b + +ModInv = 67e978b423748f18f8c0f6ef07a630da107d354188a5a937ac65dd885e1713b4413572d4a9d4cb790cd683df5c4cdcb57c1e99d8d579629ab0925b9e9875503d02a380926d5812d4b23ff81ff89a6ae9782d78106a0c3ce094975d71bedff9ed +A = -dc51d1853dba24499f4699e1af5f0492e3874051ca5b8673c4207f55b2e2f0d04c3b2808b975f9f082501c6285a08c9beaa22fc625187ca51bf661765a1869ec0255b21213d27aff727927cf1d34d98c87fcfa8852572db39ee4d18091718e6ea0a0b410a4464d7184a71c2c4ec39d0f31f59b4f76bc8b754deffe5ce34c148396f289972f3b509edd2fb70d837fbd86b0ac326e0ff5fe746428c3c8b13848c57b +M = d1d147da6b6a8a9d479ebc5d6ef5e2489f56ced23fff4f4f49da5ed222ed6ec3ba5e0d995d9b310025e114f38f675e5e5f49cdf1297900466ffb09dc2b554e4c877538c89049849b5f97e84bc9857c9b8533f03f1c8bb8afe408db881a510b90 + +ModInv = 3d3edcf1c5d05db972f6fe48c73cfd0cd3df3eb53e102d8421cdcc858d6354ff12745722b3b7e903b22c6a8c0923100f95aff31c2c5480323abb25847a76f78e4ab8a14a3db8ea75795a2c8480bbbdeb7398fceb7f989f4f665dc6a7ac949e21 +A = -27bcf856621013a30191f3de6b92969812a5ebfe8e7229677114eb3fad5bc9fb32c661e788381c4b05d7ce268190806607d81dd477d62c8ec378bbdbf73c52ec84553d7167e78c01861a5be8f95f802910d0d60fe40df5e00e7f5af57a9ead2a18aed7cce8bd8fa4ba769d215296bf6a443831fa5a5390a29b034acd18b940c1b227344a0175a48c0a34d8fe4ae7cac10ec8d74c9d3287a275260b61690de20877 +M = 80f76b6a0cdd16c39f1ebd269edb9a87a56d7e24519a7cd0533462ae3d3b7cce4914f8ac813730e1bbba4ee2d97affe257486870bdd3f65b028a6ff96715beb6b255d37dfd8692cb5f0b837596f9d39622f699d7f7d8470f480c297328569d68 + +ModInv = 23cdf29e65abd0270611afa0b66f3e45849794d51ca3788561f5ac3db576c7dffdeca544d533c5da61ec7ec9af2790b4843452ebc95eafda96735fd0efd5b1177c302ce875004f72b64ca2ac7ae56d50b97e3675ca268786bac9abc59896e3 +A = -c1fad642a24d4276deef383251371486878c36fa34deafa6a78cfebea0f1ab1ec4a026862ed1c94a43bde949266e31f701aa832dfc037e4073834577b6bc35af51a5f963538fac9209a54b07b65a3b7ebcc87cb7ce56fa6b92fd55cbbfe038216ae531bb6f5a4d3b3b758467bb852f8418a612bf25f71d9cc2d59a39c0b5f170bb9f039d0ca7bbe73f4c2d0776e0b19e669fb6a6b5ea2ee6da2adf35ee0d97a7bbb +M = 4ded9a792aaf7a6b4ab36293c233dd85cb49ff3909cf08a83244b33d8243c7eab869bd57f8a8439241886aee8d44d55010408dbec4678a1b2f362ff0242794b9dfa0ea4d8f09a7065da66b702be17974f00144270d91b30eaca170b0d68f22 + +ModInv = 33bdca298f2f4e64a46e916c9c1f7d2ed3f30a22506ba2a4140f3bedce0fa5897bf57c3c234397ca00793bf2fc5889a4373f2fe28db51afe2796883347a75103f8ac0a166335ac8f5d61a8f64875c26ce9a0d0e22fbb395fefc2fe55b4d31d +A = -b27fcd47e9ad1cd63a9c889bf71a2fc3e2884ec0bce3cf2f65b462ea40f1df7c5a372104bca7b0bd2b73444ebd42592f461eb3bbd432e65a60afbab1de4b218ee73f856f6cf560f8800203e45dffcc26e554786d40a4dcba4159bcce67be5fc6fc61cd3a67317a2019ba20ed5c00afcc5a0e267d3f466373422ff230acee2a2feab3e6e3d63b063f1b8a5b823fa3654de6f83060b587a8d504677884244c932141b0 +M = b5c4f4dbf3ef2bb6bf1644f7ec84db5e7e055fa1420ba28a4db414f7a00f26cac0cb142ae27127d13906bd683ecb298d6e2169442267e4fcc77384bcc3ee1b9480ceb795455b85b2d8bf5edba77b4071556cd6873f1492cae9d1472564228b + +ModInv = 36b0044b7624a7c65332335e539c851d9a781d40ba1cf1c586e09a0a13ddec1695305fa88d5ceed4860558e3604e8f1b60f3af95af7ad80d911c674151c44177655809dbf7f92f6b1eeff09a9e361ef92ce434d1bf997eaccdc8fb1d38463b +A = -d5297a35045cb0c07d2938dde1628fd5dfa5438212bd9b561e04308877b3f25e56358207d22ce18e0b3b7ca8769575f83427a089cb3aa87df0bb6455910f8141a23b69d229f4d6f39dbea2fb62d1bd4c05c29f563642a9ea4cdf61a87b8cc63319dd80aa3d46602b14b33172dede85fa8dc8aebbed089c67e11f71ba2fee49b49e599502138c44df256c6e24e2bc3fe3ba384b1072b9fec9f1685b70c94bd9ef4071 +M = 8b8f3073461d5c2b409397ee416fafadde83c76aaf90df04f19e439585a4d192323f5cfca1d235b3b133697685941950afc1f82db316d8ce91ec6d955a036181957d9ccccf7681062742425b4d603dc83eab603cf586c5b5ff2762a8e9bfac + +ModInv = 79a078f49f8b2da5e5e0d14d174200aa797257e79eb562f06cf3bc334dcc9443b71bda117e71e55d3f86cd4eabda0f7fb4bbf5cbb35433a4b4df7f74f2f9cc8dd066758718f1f2f1f9a53012b9d98b2c2df9c689ef0a95440d99df04b199 +A = -62d33dd4a361bc7f91b6e2a0e281178ae93d7d96df23a64ca10f92e78bd0fea236655308393501829ffcc6d4f0e8afebd2fb92da593731816fd0c04fab55f604399ac25e93d0b477162c267ffe1bf424c6461aac2ecd19c8555550c71807f41af2588a86b97f03e24b0c6d1662fe3da5025f17c5dfa7d46286c2ecd06dae63713c9df896754e08b1e22b230abbc5f60a5e1c29dc8add455c467689cf42c04379873fcf +M = d149645db955ab171f1a285634b636fb734d4453da48c73704ebe49489b20dec0cec3418edf933a30cec32282f27bd6196a38d81c1678577b9af15f0beb1c1f58050650077174e3f73cb3c07bb545261ff0a3ca021ec1eaf928f43437d9c + +ModInv = 175c6afc97879fde0b54b9aaaf2fc7d9bc7b992e2274978e047da22426719f758d42bc834e365e3f441306a2daaef612bd7676d956bd3fb11c7d42be9c9a6e5d06d463f32bab1497f2bcefdd460859407ddf513b1d1c3a2e419f0d856ced +A = 33b033bf3195660aaaca7eaed8749c77f92376e82e1317f4ffe4f46c3e793062cbcf6b9fd1c8a29a170ed452f46491f10946e9b181f385bf5ece12aef6aa1fa5c80781c88a94cd6639721c8f66d6ab0d9a1de66ce27caddfab55be20534c6877620005c5186b6e7eef1815701e7792cd7a6ed11ee46607b227db612434302a66c3222db7a2d798f4427158273edd2c6bedc6ada1beb31fe5601abe4d63280a706be6e9 +M = 18653f8c6adbe766141099df1011078fa4cfff350cfee299f533e4c6f6e95d8afac74e29366f61f1029fd0ae20f5f301b2da7913fceb17ece9d9d89f30362ea285e2128197f4bb5ddd49fc715f1d9b12fb3dab6f880f79e1202a004e8aa6 + +ModInv = 60d79f3b5cba1b6062d5d505b2fecab6fd59b9619383996ac940658db7184be5d1e98b82d8e5d51d17a2955ff141edf3695a613c8a255ea27cf9213fe91f4afd99f370843a1fa926336b0578e653595fc0567b04cb7ed823d1089adf5609 +A = c17964b68e43065bf0c8775036c3620a2cc945268c80c101f3806e808a21dd621adc3e0d62243268b5dde15341241b816ca6ae159154243dc79c5b4e9ee59d93c78df177852fb2690bf767f590fb366620e2d653a181fd91c94a31303ce43e0d0c423eec138e5729e32079d4f2fd5f53e1523690476559ca714e0a3b23e5c5f445e35bd1176f8f6003a82ac16c267da9acca3b46fb688131b20cb6ec876ea0f4277384 +M = 7eafcd2afa5173aea648b29f6d7aa1583479e9473e0a754f6e2af4ad845b170bba204af63ef3b9041d5d19107db8a3766cb1c2a22b5ac613388eaee3e6ee61617f864f5a4827ec21f701c3a6f835eeac28bf3a69e4d9de07d33516f27737 + +ModInv = f20e6ab26bd40d7d71f8b8e5f69b8c22931066de9be4dca61a5a9209840d2d51eca6bc0f09ad63428b4b5a9e9fe92efbd74ede8ab343efbd09e3d6408a185e5b32de746aac7b5ec95ec2f132779f28d07bd1ee66d1e3548ee1f9bef94 +A = -e59124f1c4a9e37d9a62ef84873761393b6f8505b67d791c0e01d63f91b6955c311041902fe019079669f99cd09a18a09d21fa0599a52bd5ae092e27db0c0647f0f441524ffed6e7c5cf8e87b88bf7a75bb0c85df00bf546fc8307487487a98ab56fc9e1b4b6c54e4eb311c40d8d6a2443e8d50ac3bd25ad4b97991ab655446f76f0920f014c07daf6a4fe76e57076cc9e6e902fe0209332d965a9f147230041659b443b +M = 2431aff7b61744fd557e970201e854f33c3766c5f55a9c75669991d7fee82d62ebc4335b2d0b6b9de3dc9311c3ed32ef8f532b0beed7155bc76d7be7886e019e5d215a6dfb07df8da808edfbaac2b6ec535e3d1fd6f14ee2576c19a40b + +ModInv = 6887d2e47fb8e43698f50461eda7f1581ff12dbfd97f40e519f4c8c2ca3cd2c7f278f608a901d571aaa331242978ab80c1225481dd7a47f208dc19b65efd5df24da81bee71b24501715a4a3e1f876489aba8a8181fd8775b7d324b5cd +A = bf521384466e2fcdc0a60d03884e3a09733e1344e6635e9e68321257d4e18b8504f94e8dcf05fa3fa20ec607c709d2969cb649568d1ae423f5bf22afdb3f83edbcfc253790b4273190149f17bf91b8cd22b2c50020c8a4a323909c2c453b9f99168e9bd0c556f1631a955160eb7d09265ac7f403667a65e0de6ef6cbc134c4a896f1e30679f422676be5ceead071ec3240ff1932ed4b500d6544c9c3784d9dd32bb0fc4d +M = 76788c6db5df49719b54dbac48e54b56f253ee742680a0516c83c8dd0ef38953082a87394f9776c8bda989c6cf0f551ec7d3a751f4e3b352c65b8dd04664db63da965800d4fcfe6f7d936c517b470d3517753af939573302a95154850a + +ModInv = 2ca859d535c24f2ab5042c867cf1a9d357cc01e9bd91993355280c15de595a2597a972bfdfd6c90e606c01ad54b76c1a1c00a17071adf4161ea9287ae9125db04de432b4dda60a72c19d1695d3d93c9ffd42a558879de9cbd4bd8835 +A = -14fa37d79c6d1d0efc6907b5ea65791207c7e19ebb98b28d76a208c13ce01494be81c7b615305648dade6a64e81863730f96de44d4195c6655c1f586fc76fc99495629dc82564cc4d207b5107d91e986d8a682f39aad650d2d75ba365b8602cd26af559a5a11f4e219df1263eb8fd414233a8e3e2bebd49faabb263d57151bbf1dc39f66d33096e52169d4d047b76c6303d349b2488e7ae23a6bff93380c7e81a764b48455 +M = 501a4072beb2963b7cf761610a657f94e0c83a7f1ae3cdf35fa816e01e9bd34bbed798998db749a6b811fe75fec0358cab6100fe7b02421673575f7125f8c84d03dcc8d975a15b3a907cb4a62bdd306ff362134011bfac45d0ab954e + +ModInv = 59fa16855cf03a66dc37b70cd65f89c93897f1f82a9ad70909021b3ea42f220c8a11b4a32ef308f4c03dfa394faf4da446920571eb6ee80809a47678f060cf200de38909618f3382e72095e353034f504dca94351acc0caa474fe5 +A = -af1242a8ef41f76b5efc6a3096bedc439a1d6520813ef808ab7493deaeb7a2ff4b2e68ec3b78bd4f26c5bb59bad656b4436b0d95b1fdc93d04ba2cfe6942f040548933c4c5816eb6b005cd5f07bc62ba7f3c0be2ccfeff252dc5880cd363fd2a3fef612c34c6bde304ed0e75d8d6ae9a87e203f69179f4f3f9c2317e64e3b687262104c15b8e6d7fb6beb3207991b20c9646c928e70822f2846e8bd81ab8273096df256c41b7 +M = 74976222a8f366a32c7b2cdd1c63b30112874d8edf711633355c13d54975272c917f59685dfee20457d2f746d39be5e2a57eaa2c5a62f45e483ea4dc1e966611d59fd56a962bc7a98be2a9c81267b7592f5758fba7b0d6678b58a1 + +ModInv = ef2c7cd93e06f8bcb550e528d6218c3eb9f3b1700050f2d8fff3826c98f24a2c5d17c823f48ab8d6b79f2768d40957e39582169d7356d04b889b07cd4383b641cbde60e3adff4be5c1bd3123e9e12409d29c024787a6b44cb19010 +A = -4c67825dad8ab3d4276381ab174fcd0464cfaee134be6d7837c070d6065d69567e215f98df1b565abbe4d62a80c776ea450d54c997856ac65e1df77385d10e4e6598044f33abdf66f0b5e0457c59a7568d6fef6140f6a64373eae43656d7e79898ecab5c07ca8a390fe5afe88712d3a77ce6af4bd359779081bd337179946ea87788cd4ff2bf24351ed04b3d24a9a28f15e43b662a393944176e719f744df816b8d188a6fe56 +M = f2ebad265f1a4b07dbd248672f14bfaf408dcfae6ad71f6facfcf0a2cd4cfd0a667ac7ca0d25a3d8a333e5eea149838036f91e1b38c566e47e9ddd1dd77cce211fb6c49abac1f1dc82b67f5dce7cd4772d3ccc036112153495207b + +ModInv = 935d51cfec539c9046257962adebf78089b19b7ba3e616a7cd1611cd11f5dc6e5a84420bbf1301629d6f868ec4e1a6136463971ccb426bf8dd4574b3f0ccb73a36d39c884d01b3e1dcbbd1148e1205e3847c0d26d91f6aedf6005 +A = b6968200e02d18181ad79475cb9acf9c95916e21e70a168f50470d0f7307c6aa8828efa52e79efc03f4058d06fff0d6fd5e615a2fc62c7a0c03784ffe1080154f6ca40d52a76f7db423e794ad3f696b6797101d92ce812451c6bb80518766f4828bef8bd24603db64353ce6d8ebd3d33ecfd8c1eb276de04458bd933b58bd8d297e01353e530f394eff1532e56e3249dacee5490b4d2de047c2e4ad07c0ecd2d62f16923caad +M = d803bad7c9b41c978a48df664f3d6339f57865a5d502cee2161818b8cf60e50522f8e829a7c303b7759e29f043aabdbdf169c03b9e499ba9d14762ce9c8f858a4099ba2123f5341fee3568e412e98d672cd110e8b6cd4822577a0 + +ModInv = 72dbc7dd37b6cd991159529e6e420e2ef8f396631adc16f3130ac93d27f370d07acccfb829cd79d6b5bb2016a78df7a6eec100a9f8da357e8380d3f757b5b5e41746354dab47d34c313f5324fa53360f806c77db6597286fc84 +A = -22d38edbb6a54f535669bee24fecd262724057128e39479ba12cb97c28ea01c854397db40ef938722481350268e277453cfb50695981c14049abdde2c892c15f4289265413c3ee6da0d72e5742310c66f7f776708c2386b93329d9d11235154ac84265eb2cf2d32820a29b3f26d0eafe1fc28c6e3196bc4de5743fdd1f2a8aa67223a6bd3e7794d50ad0189fa1bbd676c3cd2355dc450b731b972c83ed12d6a0e7bf7f24147d93 +M = 3e7ffdbb4777db7c039d82f4f9af5c815263daab1f08053a677483a33c25e0b8c45a5f98dd46970aabbc79af7e63adacc4a4cabc914be82dd17670c5e0d2933e9b7dcde79cc78193ef782e45b3b778262bd3395caadfbd86ca9b + +ModInv = 3955abbe339cb2492e37e5fb2a4581b84f3830a705c95345656a2ae65036458edf14bb21d7a549f7d578c1deab256c20eb986f1b15839a0974c215209bf245382cf1cd1b402d17b6191a8ea058301349241a5c4f3251a2cbbe15 +A = -e4aaadc77c0c826274625cc916010234c5e88de19c62ecb9a01cde0f41a337f9110565b680f43ac18daf924ba95d7f6883766fc7b3ba2a0e2f7da3a86a3092a92126714b7cad7305842e6eb3a4effc682482120081f4bded4a1413ca733914db6148b2507935ef6a692965dc0f51ffd5174f8714af66c2e5d0d10fbdf0bd7284492598c74daefbfc16fd9cd3c65dc1d8eb2cdc6916a52e9af26f53274f92197c474cc666e000bb +M = 8b231be4d8a1c9a2d60c22e192b2c70a8853ddb722c231aa3b98c7bacc9c55bb8abe7d72c6807ba3614fa611d6672a5962be0873e34e062f7171213c21107c80f17f5d9092a23653996cfc7ba107a1e9d2b3320d32eb6eb5dd17 + +ModInv = 19b8f82f1957972eda1cd9568a675aac9f6a02e9176abf2dedbe0e07f3622399f0c7b8a6e43123c1e7889dfd9f3c327c9948bc2481cc682518b090b7a8ea7b6c30714bd264e9be9130f3a834dbe9f2bc0cd6993f46dd4568e36b +A = 9978a1586adf1eaeab280a84927e0eb06c5c283d08465c252ec66372c7a3fc12524915ce485c5e67ee1002cc512891029065e48189f0e6b4dff64cd5291a1341ff79e88058b71ab32c8eb88cdf851d16febdb0be192459f8441490fade339a3d138556815ebe4cda25e16a468cc4703849278e27c3be31eda1256bf9c5b684c92ca51f6aef048eee54594cca9645cd6dfb74f87c0e59ef1d1c22f3299c5d993f09afee5956384d +M = 1be308a2de01881e92ca7a462a2818bd8486ebc656ddd6d4731151dc03915350bb57edee9b8ab58b310d9df4d439c49ebdd8a5c07b00fb2e8c95723d2cf5ea5bf29251cda2f193ee4b3bbbd64918389566e7b147383bcc76eb5a + +ModInv = 106f4c5f6d4aee56f7e7d335c8ebb818beb0890d1bfd9a532d4cb92d492a11e021b8f10c3fe17d5a1f2bec6cb240e79675e2f3d16eaa323314704ba9e8df079e60c6ea62537be793c0a696f30a24be93bb6187d4e82041d9db +A = -fedddcdc943538e7c0de1fe1cba95be4ab03252be33475f173e1ecdb2fac60b092a15c55028817d2114b11ef58f92fb49dcd46ad9077478474a22d2c5ffd5cea8b76c70971c97e1c285bbc489c2f21eadf7ff0083391888d18798a45815cc2e71dff78a48370603d9a1e42d1225b9015c1b7eb02a7a04fdab73e08ca194693b99014decf81788d3428c3a252c05fa5dacaf16199ead4255c4468ecf91ad2a9dad66b2ddd828e919f +M = 2bab270fdb67205920fa3a00a2c31772937671d79d05bc59f2334419f2f3487cda08faedf475a8d7019626bda57b5e924675dffe9a5b30d1259263ffceabb132ad31c8b1268a2af79d9b39ce3dbc4fc62846466fd41e9b9d29 + +ModInv = 113be25e41b5ca5c1a00fd4441da37da38d3e76e6c364c2d57bdf26787b32508ad23df6c715559464acf81a5682ca5c97dd525f937630842a62719cd207725d9f8eb8aa03c00a726765736f086f94b59e11fdb15cfb2f69d0 +A = 67433a8667518339e369ab3d591d3569ab0a0d83b2ff51348161701f10ba53d8e66eb1186613c33da29c4db3d20833556cecc2581bfa530d5d685155e98cd7d9dd23f7b6a801cf8bc2f40b3034775758b2767375fe03e76f643cb56d4ec10fc6fee29f53ebf644bb5c1ed35fca2410fda28718e5623a7a755531ae6dd30a286ec6737b8b2a6a7b5fbb5d75b895f628f2922badb05da83cffb5bab1cd888417a5ecefe37b9e250d03 +M = 759ac68d26ea43fe43ebf96c57b0c751a5ade42791505078bada1298c4cbb452ae2bd4e7abf522dfdc3f12cc0c75ffbff51e5876bf982e524e5a695365d51f25e60490392aa9eb72624f93de30ccd1118fbccfb637cd367ad1 + +ModInv = 12e8fda24c2c0a63a335421e679489b94e89d69b82ed5f72a1505cee0917cb63fda3a8a939b9503d95137658f8bfc2c5d199f415e70b8f0c47a0ab08532208955b5371345eecd666df7505cfb6d665e2346106a46d2dc0b +A = c7967a6626af30b9dbfb3bc80a4818ee86537b2b0bf2530eecd99f5730fa36e992a43524532525ab1b26306e1122298eb1541970ad431b1823609a20e8ca049202bf268b2febed2c7d82affc80bcd823b25437eb9f685df8fb26f29e629c4d01b03160ee5b327b2b31b76fc7ec94b79e82b7fb40fbe1ea46f9cf1f6e353c6a02606f9ff96533fd4828244227229639b7d7e112ae90380c7f80e35fcde2625e03ea7ca299c46ab7318f +M = 2b657633e3804254f59de86bc71a4bfbffd88310b6b5b83a700297cbcbf1cc8a42c1e7ba4d64203ded9eaea7d030c4b5be471f4a9b9fc4cb80a79b1d2261e5e006b44c7cbf8d0dda3b447dc3bf8961cbd1fbd4aec940ac66 + +ModInv = c125f23ea171c6411c0afdf799bd85e4ee986b2db95f9fa3df05723af3329c6240c417a403b466efbd1cbd6196fdc768f2b6595bffda3245c7e011cab2d23783f21b21a79f0e8407ee25cf7d1de3216032a799f8fe34d4e5 +A = 3c521c821b11c9329e312fe31dcc24fe416c33c74ee951d817b6aaae51e021c6e926206c312490e7e54d116de31042b7f181daf2c29cb743f358a2ffd093433c8f506050d98f14bbb6d54a3c87514e89c499385938a1701c9f90748206b7c3b59986f5defd2f2a0efa187811477a5f41f8ad5722455eccb3ac1be7483f5558f439b6bb65f437dd908d8d5dd8489fdd47b585b264cb721bff16a32fc9bff4c5a5a9f83164d119676f68 +M = d1889eac4ed8ef0e45399cb0c5a020533a8f97e821ee76315bcf8cdd26a186484ae1f2bcab0ce670e5786c724fe9cdffd8d703507d89546a148fbe6e838ffd53d7264a6aa746b3e7784332ca182c566421fab3dfacc4c47f + +ModInv = 6f5e78145cef9e527149e5bcfee3439f8fc465bcde658acd5ecb8cc3531cf26a7d95d661497f53984057703241ef6aaf5dea30d441eeb90039d7a62fee0840406e8d693c46470f8c9eb1922f23bfda05e92698e9ce408205 +A = -86355bbb6d9de9b6a3a7c7a3d9179d5e2908760a0b512e2c9b558993d62340a31dcc69852d4280b62b5d6dbc1d8338c778e09063405e730244347461d1094bcca7abb2c99199d442829e968fe66a69fcbbaa0be77e731f494187184d8f5296faee8dee4dc835f34878f191c780bcaa9ae6bd31dbc6433aab095f8ccf4865e53e8fcf8c00b242e920f11e197bbd11f492a5cc3815fab0bc9b4723dfe08cac7762ffb3672bbc4c9274db +M = a7f0227a7cc986a3c4170b14aabcc0fd1b25cf63ebc7807bc229d1904f10aec3b414b3622bbfaabc24097747b9672ec1ab3342d23f6946057e4bac5b6ce71932f03afb865b6f98a99fe300b63df04b2054ef73c03702c9bc + +ModInv = 34ae1a342591f11b93ad5f911310b620d0f50c868aa87b8b63b482da44e8fe628c7811d2f90a6dba1b71e3d61ffede2d8ec642ca8eef8731acad2ea95b85df859e85a057300cd0897322ebebf687dd8e4cd26cbab8e84f +A = 9f7d77e209c050d1ed47a49a6e67276ad31471c7f4c17d59cafc16757f083e757d88864bb41e59d45576772dc58dd7bdd82e60bd7c16c24843c79e1da8d38e3d2c06b6d4c6d44b05ad620dfff8da15fb82d9d3e1d6035975bd2997630a5ba6dc3dff30c1f811daee0d2c51b1ef423f8146d0bb46629e3cfdd5982976dde9c2e530c18235f54f987702bf0a015c2dc24f04e8822d5f6d8c6c80209d1c31be36fdfee710ab7894c563383 +M = 3cb87c22d997789c2faa60d89f7d6e3dfdcc861f0b3520031c1e514fff27844fa7a7f07af3e6afe32888228cfb77b82fe4d272c3c15695d1638e2db77669d8e17d85a1c4eb56a17c2d8656fd38afa43bee6251480fd2dd + +ModInv = 39422a01ec5ae2c44b9bfac0a4d0cd186dc385108c2ab11cb2468a678f67dc7252b64ad2c5e3622e343c6d639849ee7777c9ba698544361c8fa392ef76c589743245e06d6facadffc908bd77cb9b3797c3814bb50d8461 +A = -13ac951a6d7bce14fb6ee73f0988fd2421a62671dfd95a2fa0d50161f9ae5f29b20dbeb92cefb75808419663322622254beabb89d6353768e48156274472d688cdb964b559b8d5f8d77782e95ec22dd31ec26e18d926cbf38782b45870ba3da2286e886596e5f6a275299c29f5c1a897c3534dce49ff11d9c028f84071cc62e404f168ef09c635b4206380cb97fe7a2b30a8ee6471a8afee5115f32e2fc29ae23956e3c0a2f43419f41b +M = 4810605945f84f4ff34dda56f5598dd67e88fa7b80bd0bc9f6955b08cba2d64410c81e1dd4948c246b5da86281298e73465304cd838566e486edc806170e931352c7aeadcffd4f9e5c730bf1ca6962126657bb99b6f096 + +ModInv = 2ffc80d0b7d22c4eea310bb33e04ad98d6bfc3f7aabf9017bd2f6945a71a99f3275a33c57f2dc4f20ff4b1de80171d9248a2a25abdc91c0f47227e7519a7ef6bb070ae875da877e4ed25c2ebd192345c16719617d05879 +A = -3a6e7b42a557f3fd41bb11632ff912c839f677bb22c16064d1b4671c3071249a19db08577958de873271cca0028e125b36f0d4353ce53a656eb9ca35b77b4fe43949d29ccaf2b8fa08bd70dab85277248eaaccc06ef6bf5f9a262ef7e3fb3eb2125c0a7955a07429ae1f97b4f44b23a4d7339cc5960588347cab7d78b369976fdd3179855ea524ff023b50f5f4633504d33136c0af55f8406ff1367327031ef3025de085514989bb2931 +M = f98f98c95bdec1842df3f798019f619a78daf551784340fd9dd5230d3967a0d3466798ae8d6d76b07b805d583004ca64ab873b338dc051230f3e73fc71a91680c8baa510b0ad55bf5fab47927a3ea209e8cdc436880f7e + +ModInv = 84c03e480372506cff8bfdb5e83f53663abfdfd836818309093718430b8d1fb402ce8d6adc4ea8b44a6bc3ba0eba0d39212aec0f2ef2c639cfaa209b18c5bf0471a9125b8de6aa5f415f389d98f984ba1276b066aae +A = -890c95d9c88f9ab5cac9a624b4d8d0ee114b443bd6483a8326e75befb44bed0e0f1c39a7526e0e40e5eea27efd6c01f916821cdee0cadcd3b833b342b22d4a55c8bcd82f09d24bbb3729a2f138a776bc571a986d9edfa2c4f0f4a05aad2cf8b3e41580b94c6d8af32e3d425f8bc5e34e5f2e5e420e6e641013b3d997d44540b0ff0fc40e9f336011df88ad4096d63a3bbd4a9bac166bd6769ee031376b38ced1f2dc14a2e8ae3ecd012210 +M = 992a760e66920ac08fca51ecd93079cf17fe4e7589536506d70e847ab852b1750a1c4a79e8fdc25390a77fa308d5dab83f211994cee88036a22da0338375f3d3eee97d58d2c0a0d0a8f860e6252d90ccb14115e93ed + +ModInv = 7a5afb195e6c9bf09c461f1209ea6384e7c20d945f4ecca6eb3788a03907560357517adb36e6fa01d7852bff997556aea3fb09edae89f53c9e1490e01f5dce6e25fd59e98cb2dd501f14d848aa80cab73eaef91d35e9 +A = 50a80427d3a7ebda161f48e8085bfefcb2e796df4470e455cf34d555b13925f66d32e87dfe5b28b6982a1faf664960a5d010307be743256274a58da3a8a8faefb35833c4eff9f02372ae58e96854f88cf0de184e03f928d43ff14cca4a36532ad1d73240b5c5495cdcb66393beacafe9fec7bff1ad3398773a122386173bb8a5684e3e1edb4c79e8f16fd06e6dc2b8cde1b935afbbdbe942417d3c74ac5e6257f7433b41ad5cb31d5e1acb +M = e2348ae708d5522ea50cd296ea70145687ddabf772a0d784545a169ca0f0e6593fc44ced550f0c86051cc4d5a5fb76105b9c670f90bad2c4b823ca825fc3f20ba8d29979551686b3831027b03bb773c194c021943fab + +ModInv = 17cdd16de30a802f719a2088b02fd1ffea71e8053c7f23387ea7bbfc9ddcb5e047e48a0fa0d4deb2fd6142b72b81932abbf2ba0bbff0b71f09c07b47720c1756194250aab356cd12e6dae6ccc7fb78598c72c424370d +A = 73c61ece48eb164dd409f7842c595cd2eb027b43ac2085b8b9d2991d07d0e4f9fe2019944fb97a5476e67aa41aeb8822c50a5603e1662913b61d622fa668e7d069a426863981b0bde3b85b8953add9a84da95aed202044fb2910980756f5bfc254899bbdbf2a209f3fe178fd53167ceaedc942e09fb706d67cee1f85aa718c12327a55827bdd99434d15822f1b697f3b06761c9e7b642cd7295f40c36f0dcab6bbb9270d2e225cd121ffe3 +M = 27f0184b649bf196b445d9f1975a99db8bbf071054d1822836a11179274438b2244c3c37562b332a986aca2136e2ae689e1101afdbb3d2ec72fdcaaaa5034bc5db1b8f3762d76a98b251a5a9ec831b05e4aa0aa33f0a + +ModInv = 338f1585cda9f5488402407051bc047f08265c5cbe7b26d043636b1d284433a875dd1e00b2e90bb98dedf9d76a42d8f5017e05bd4d089418f15049a62b680a176a741c1a8463b01447217449e12cdf741c63437ffe +A = df5803ac1713df14cb377aec78d51edf2d7d0f4efc473ed19c3df22e43743ca1703be26712fb409ea033e5bf7946e0c01ffbb8365f44081600d8925d8aaab1de82f9586c938ca256079c8fc3b6bcd387cb99bf173d086a854dc7bd29b6f20fbf6766ef6f286e8e0b11a3053b425b3ca667d93d9fedefd6bf743356629536a47e8e5fdbb0cb57343a8b6ae43baa4d913bb895494e375ecc3eef14d3cb3e85de6597278c9833d94cf637bf55a9 +M = 4bc8dd464673a001f28b47f0a3fd987310fcde5fd6d15cf5b993cc57fec568682de79deb1e3a3fa7e81b5a0f8152f1765c9e657133f77df51f45ec880f62c11eaac8ff2b0956b8e287841629cfdb80d203e2180327 + +ModInv = 336114c3c44235959ab2a715b01f2157de66c37a2537ed7fb3c07199b1d65a24ce59d965b640a7f0838d2ab484551144b001aad62d614085a11f9f999ca6bea90abc98ffb91a85af5fbf5cc86292ac52d626be3646 +A = -6b56b45c66b3e98c4b699a0b253c320e69f82528b0362e915d3120a7114cc60d8ced0eab55be38a50e988b481edaeb50be123d63c1c62ea18312e5ad65c97b4ea78e1b4066d5f269b605b5275a9fc5e727aa741023c3e5f319b49c75be076569e052bd9a8d7126bc030563164cb2c8febf9fca14ab2595cfc7dd66b5cb1eb623029ea68171ee2d1fc0afc51e478b578419bcdc64c42447624c343592d604cb974abcb438b2225b9196b1f193 +M = 6540a8978c80a402053a80c6b3bb7b43d1f51d9b42d3b59430c5b448d3a58fd0af823e3b39da74d2f64b863b9c4b30c59e7c4fd0f03a807b6e813a703253d49724977068b4509a4c07bd545668b6c873047305aad7 + +ModInv = 3ceecb459c2f7ce69db01a68a310a01e2792f958ce1a5547ee0d5f4c52341c937f3814349a41c64538b2af6e90b462fe00a813136b4c231bc0443b87bd18ee269ade5d68c585c48a3a419f787de22acf200d62322a +A = dbd11254605a16951446926fd53d5a7df65399a04d2a424b8d24317ae1acdd201d72a9cda6ea2263c7bffda4061aa8574958df19c1f1dc750c42d949991646f44437b819204e22aab63c0f47842a67cb9437a80a65df1cf8792841a5d514c2b5523680d6191ec419ca57e1199e8f4c1f0fc2fb8eb0786a512084ed567ee09181c2efb2ca187be883abf01bbf5542fd78b6073899637238ec19482c7ef972d8a7426141d69d9368cea5033ec3 +M = fda31363f9ca75d6d5826c204514af1722894b775056a7532940da9b25d2e297525e26147ed0d0fcf5657623be9238d77f2293271a1c3199ee5006c2dc106dcde843e3bec6549a755d1fd1215fbb0cf58b752f3a7d + +ModInv = c512d8e1813e1f488222b6473e57839f087386e9875ed0ea41138b265305fb8d60ddaf30bbaa5b4945348cde169439e1a5add404a941b0c4a5c5b920aed8b8c86a7bf2f03941a463bb19fa2ec920ec6db45a45ef +A = -5ab8de6af11b9595a0a6425eb082cd252039f5af6ec1ca0dc7d676d12552868da13a1508d50ab352f46ee4b5572375f5bdd5a1a301b3dfb1e84422532b848de9ead24f65c11bd2f6a9195fbcdfff47463f85d36b9bb8caf0db7e8102a7a842f4839005a812498d0b85f6ab23c6e270066d41d1f61d060c7aa116ac419e328592dbcf38e080c0d5e36f7ec6fa29e3e43aad5325e19e5a97c2b3b68282aa7b95cb7e4552d5a5752203e677d39653 +M = fb3b472630654c8068addc73bd50a563b530543424036d136155f5b046746f2c4fdece85b1fd404e16eb580ae9c83f7ee9cac04df89c88267c0d69f09c306084e0569321197d120bb7f348c21e4a1d6a6d3dd322 + +ModInv = 124fea9b4e6a9627f4352690e0d6cd753a3256a61fceff79484d307d5a5882276cce1e5f0c8e1d43aedbafd1bc3891261607897ba992c3d0b7652abc63544b60f6a5e0ef8c49996be0ce4b2d4d36a1a71943c4fe +A = 1bde12b2a76bf53fc7ccf7a3262141bb3091979414d57ed1292f43d8e02bb4706cd5925eee27a40507e7bd7f188f23cfbeff789e4567026cc98d1742a021c27e01cff65fc07e48c120e2dc7e09d4c08f1d9a3df29415e994fbf08d78a2858f8a4479dfabcb19c75c8edd52199f7a6705d56fccca1225477287bf286ec63549535e6fc1fca7d9eb4a017e9e93a5c25a63c9b9b7f00bcdc011e31a8117a77aa3a058008868e0b75e779325d4b344 +M = bcbf7b0db055189b2e580690ffbfbb4e585d0df04e7b972840550f8ddc874c9f76fa7a7d5615bbeec866e475e1cb453d45d4b255da6641091b92f8cd75d694b8bc78c7f48f270b2ae588d18347f5c8d2b0ac1727 + +ModInv = 6c99f44e356dd2cdf32cd7ed547061b6a2927e1616c23da872a55e549378b23c2520c3f6e45b92de10c5956b603d30a6fe8454e4847c177a4e656b3f97b23316deec5a65ffc59538302815736a6a6cce979778b9 +A = -6590ef5e2029418c23215b3894aa5d28c457667f5e17ccfc7d4addd2f13ac5f78084399fe9189f7e83748e525fc917f358218845613bcd2db2da834c16323645b1faa34bd660877f00f977e4c06bf5e80a86364b402325b2f77367a3bbb8332c5d6c11e7ee8881b0750b01cac04aaf96efa06c51a4f9d6df82e59fc01456ac92bc1200e127d44d7b96d3a8ad0e371147bc250cfafdcd5aa75164f5d10d70cd24f1298bc67cdd4b1187036eaf57 +M = ba121d0915dff8ec7d6b057806a07f7c739132416fded7779fb68fa05b0ee04a814bf22f90ec0d506ad58d07954d72308bf45ebec7fa7511effe780faf6c97deb6963e4f5eddbfb2f209f9e0c93dd8d1aeb25454 + +ModInv = 8ae5ee6d64966189a67e8e52e2ea05b2dd1c190f0abe9f8e7ec305143fa4ed1261be59ed7dd150c44f2de6d287264036ce6b9b945d4310c01e94f4f58294ef29c751f4140a68342977780e4b990d61423132fe +A = 4772df060c653119d09b8cf9ca22c516e05884beca5d38229d163228a0e62c4ed561e7155de11a9b3ecce1497295a496fb0f163b34af657dc72b037dd4f960f9d875596887ea35f31d9f3f4ad012a2e2095bc52c1571a0b0d73cf548d93c4c97345baea4f88ec32717c690ebc9284719283165f4bd3baf998eb5a4bae0672ba9e124d1f45fffc1bfb9c71b8ecca52358d7d01c3c22f07dbf526dbc008fae0c67cba54faf8a79d8678df0f4e4cc0f +M = 9adf5c015a88377cea66973af857eb14cef80272ce7b95c7a97a9f1e88fe5f77c9c23c0e3193598954958070b31d7f2dfab346bdd935057537cfa457ab357ab6b5a55b4182e4d6a1be33c5d175253e53f1bfb1 + +ModInv = 9f803f14be20a5559386fa41d794901c72d0bed0f4de16c5c48b7093e17d6a2e268680a31370c53880293b3e3afd6b062262d387cd7dc3e41579512991ff1ffbaf368762e9abc7e4d7d0119a06c2fe6c15a89 +A = 143e101c3c0b82f6df38ff173222af4ec1477a9619e472ca0fd6ee03b25b92d9f0dc25ba12d2c2461641e57bd8904ba24d40ed6d07171df89afc23cf81003ffef9e629bfcd232be40d99e1ae27c74806ccb1caef6b8ccc32ac0f7b8ef8f4ff6460bf70deea483f5f7127102c2f3c97ba29f7396bf939b67c9d312efe94f8dcc3ab3b11d3d4abcd3907395a8d5b007e94ddc3a9ee3c5b9815f0d0903a51bd2ab733b33690cb9c03b44bef273ba34a +M = 2ecffa691b7208c71c3124e908cba00bd1ec4f21be175d27021b2b7e9357a5ba9caf7fdd3001bc3e160bbad32c867467097a08f6333411ebea885b7a65f114db654df8aab8492ed7aa11fc71df5c8c6b557f35 + +ModInv = dbe28b8b37959b415254ec9963bbfa1fc8ca46ee351c16550b9a0e5669807dec00418a315dd160fd58b8fba0b6d881c340938c3c5184195f437d223385868d4c1f0138b0f5f63b5520e00e3578f36efd88581a +A = 416a1502d66c69e5fcfb796015f8789fb9acf92c15748de226685dab71530a834e6244ab2393a3b6d6faf4abee13ae8dc5dbd5636854b3069d0e261f13332d38c853ca1f647a06d58dbb2a6b5a280ef0d6eb3c0749e70732a2a8fb83e0b680729fc75c0700c41f25041e08d49ccb0d6f2366a5aee9aa7cd330d71d6cfa233a54aa42dd76a89db7995889f8ca4e43b26d13ba4d6ed99b0ce4e8c59b775706541aa6492e3bb57a943488b5df022f6a +M = e6608f57403e3764ea9c612bdbdc23d2f6ca794b4ced1d074710da6a154adb80fc2c5f65b3790ab6dd2c4f1aff84c070a5acdbea67d314a5377f0d1230fe5ed19cec4062079c7c5cc9d53b0a26a26f14b37761 + +ModInv = 71fbc1efd0577efc9a342033597d56582c71e663ee4f49d647498c7f03a469cb6ed6c6147dc2687ad145bab0ec559fa5ccc935bc404838c7872d50e516972400414ed91e966e78096a619d0701a9656d216b +A = a731ac4afc740d3afc966e0c4666f96b5bb1b80c3df73385eac6ff5548a81340697b3ede23e5cbaf4f6979f82e3bb21941c1db31c324eb951fd01b98210413dc5a94c33e7f6fee3c6f7652acd77a23b847ad61918825eeb91a9dcfc8bc6db87f90e1eed93da923698462706a6f54bb7e68f1fe7dd26ef65bf8fca7ffb820e8c6e176ad05ce1c84c3cf17652d197307293b1655f56cba2374568d761ed68a4d71c8e9bedf3eaf4fe634650242d730a9 +M = eee990a08345f542f2158f81e6b928b168e3ff3ac4fc67ec0bfd92fe320d35a0d1cb1e7687f8161e4661ce748f43a04f860fa24fab85243879ef7b315c63d3b9760373b3a70fdb45243a0923db02698a9f22 + +ModInv = 505609ad7579006ac777a72c62ffd2acb0597a147ea8a817b30fe8415d3f23ad7e8807329d59093f795fd795b9f8145b6e341c8580fd10dd05261c524991073314b5f8871f2f26d267d372648fe88763ef25 +A = a5669da86d9d833a85ee3cd6bb2c399e9d45dca7f4d568d91584aa8a294740c8f167a758db4cfdba7b4a99a0bba70a391f03e993c73e639046f32ced9cd8aa91d3ba0a1d4a6a647a3b0f987ac09f62555294e206f839c77ba33be93811dea6e37c07bb6a28d365072904f9c760a3fabf4fccf0b055db9b12ae678b630b6b57f66b4e3f0fb1c419566897df288767f0a6ccac0714ee27dd2178bd3e4fa73506fb8aa80658b5a7ebc10c233160679941 +M = ac5bc62c5d1b14783daf5772c717d0ece79da4a2716ca7b6c972d15cb6c88bcf8fdd72d44276c6018a7f323efb892b77587b9698ca2d47762c7afc06a0e21fc53f7bf0e64c6de6213f072d80122dd5352f3b + +ModInv = 164563d8e74ce68840b2c17b1c8b49ebe03cf404d914a63e6dd8ce99ae12b8c13d57902d794c5f1db41aa74afff41db579bb99c91a405e2ca31372770bed20b5976792cc23ec446379d6fa26f2516fc2c5 +A = -9c337123b7e633c002f1c3d7af0e18b03603e08a2438259ca445fb51fdeecbc46c8d476e7b271e691d4a6fd43384dbd6082c56183b4b4dba53f7707768a8e35e0365f9c297be527482e38bfa3d7a54b7c9f061fba3eea2506281b07410e38c608a5545639fe2883d61c021ce6c288a17a920fa4995faf1aabbe2602ac30a35feee6f3c08c7a66a5c9b1639c03c242d7c5ba29803d6a4ad1150b30e08d84820aee0e2fc418dd49416ac2c0fa52a5d4015 +M = 1bd8a6e3838b2dc2efb3b49ce5cc62d51971d9debacb62a8807e8477874ad83b3072a95bc3fd57a63bcd6e181042cb174c8547125f0cc433de45412a1df9c94c0ad76a48a34e8da3b3975b50f491053dc2 + +ModInv = 14cffcfb4241dcc3e2a25f463137a6973f889ef2e7f72f72a90ea1a21c9be4bae2785d3079f2a0af9b6e514b904e39a955c0974d9dc92485a995951c8c3ca65a5de00f7dc12cda08b30bc4733f0717901d +A = 55f400fa254400c67636749dc31301b4fa6c6efb6e860090b536448aa59d2f4bea5acb6b8710c408d1bc866dc5cccd316b26daf73b6ef28c57cc68f61919ebd787f64b6adc13bfcfe3b3fd84d564ba12a6a245ae47178cb8c67a90555cbb14f9d0333d0fe388fbb8747433777cbbeee4fa6a6572474572ffcba87e092bb4c7bafc617dc091df48f9cd7a0e126c89650a7f6b6a2428f5eb57b81245440b312ee4e57f07e3712476dfe3283e5abb4b30c7 +M = 6c13caad0a6760aebcc9476c3b1a044d8a863a971275129fdaba71f1035bdf576fc40952448a0ae7726954813e6d135923c305e44b1611c04ac69b0763ac3073af85becc9f11bcc81e7220d3f55f679ffa + +ModInv = 2064a64416f41cc776182cb5518b22035813d116143e6216f959bf76396594eddfb376d8eccc1aa8045733690b7f492300661bab3d183879c1a0238e47447174254af5d5c60a96b1a5d45bd9e3082ff2bf +A = -28d3f1b2a139ddb1dac23a992fcf69e1a6ca16ad2af20b846e17eae87501deb328fd96b2a27b1db8817b52befee41149568759816ac619ed887f8012dc2a5d8b36378783d6cfb20495e3086931099f7506046cf129ee58b2a16510e91e3fac5e0c373f61ac3fd5b2faa119e995a1ff783f452015416815e17f96d9d34323ff120fde3897d941bf3094272dadc53e348be865b2515a6949e1fa1a46a40abee6508142789005c85261a62f752e9e2788d1 +M = 26fbb5229a141ba16ff2faf3889b5bb21253af8fcc1080f3c83a9eaca08979e757604af4462dbc4d1e9863761c600f72db6a896298004ed00fedbaeb74d42554e2150b8221639d3c27dcc0e019957b6d0c + +ModInv = 17d9d79f8e07ade97dbd6f270f9b6bf1276e6c66802c1cdd51238dc76b4add539de710001167b8a1aecced9939ea710abd36fb5a6d3015626baa8088b66897c9de2fe8f5dff69fc8b3b3a9ebee0d0a45 +A = 30e8b043a9ecbeb5fce1be3fd59884c3bed211ddfde0d335b5d07b5423b9a095647c7854a2c8f30db3077b6cb2bb0e7a6a9473332b4dfc8c8e0b80eaa5ce1d409740871fd4910d9800ba03c13a56d42b7af6d74f910483d2cba702bcfd535c96ea1d84fd1ef2555b9a38ddf043b703ea84e9c7be5935baac864cf4949d316d50d09413793e87d92c77a91437bea3054720573dc3331c366f7e82c0edf155eba13b1ed234321cc91b494645e9b17c1c59e1 +M = 736e7269bed55bc330fabc12a32d4ecd4e0824e3989608f7a3c3859efb34dbd6eab9b942b46d9fbf3b28cf83819ebf971da622866f1da80df841dfa2b2956545e4195ab00027c5c42885cb2f51cae1ae + +ModInv = 14c69b3310fefb31aa6a42fc6dc7ef23dfd14d2f6c9b4c9a2c208de6e4855376b8d628de3bcf201f5c7c555dc51a1b7dbae347466b2a341aa83db2b5f09ef593b00b07bee8719903b2752166c24f65a +A = a6760d8ecbdd64b1744da83d8bc5c3bd48b857ab34fee3a3de5b8e84bc1681456f4d55f2bbdb1cceb7af5b52cf53ad4aba9e819356dae4a9863122132d13624c33194b27ef7c995c44eacc4103639e2106de4f84c5c06468e023772b6a4cd0eecdd5b242ea1f987ee6eb917c116cd10873a07e790bce171ca22de96dcdc3c132a64492370733afb73a2b36e08bba63bc932afc67758c6fbdecc7668606cfb64d0162b771965a291abfea2067744bce48a1 +M = 807d103d85b36fae1bad61f40ef4dd65301d5d7be90625296debf4095389f8311dc16185cb663580175af7e8dd5400f47e0a4894c5ed13c22f751c3c564d7f2c2cac605066acb91b61061ebe3149115 + +ModInv = 18f6de3081a737cb3efedfcfbef88519e733ddea74efcd42c8d22720d8cef4a980fcbe6ef224a25ef468915976be8f3b47ceb6a1ce4e2da50079a71a3dcb6349cc76f77f211cac7b61a95798b68ec4 +A = 2825332854a30ceba96ed3ae4a2d7562c0ae394427a1311ed6a9c2b56a73cfb416aab27237ec29da8a4f1671d5040dc72cf2ec86613c2ebbd9fbbcc3c3381b8f4ed5c091fe24a0d8d88db0e804eaf5a4d1a2921f42c56b434d0fdf04705ffe9c0a19d4826bd80c232dae62cfda2ec7bae835c62e5723139a6b0183128aa8980536fe63ad451461832b317c02c39a994243601b1a152aedb26271dd03c6fb71f112b7de4cfe9db6a84540a45c24d218173962 +M = bd2ca0d67c8f42b9bb54d131fdb627d4342687be31984bf0cade1c105c3bb7863721cc083741a27d8f61a21eff09bb20b049ad1ab6a3375a51aa78d332ac695682f46dd812dd811229ace098aee7d5 + +ModInv = 1207207ace5509a117249889dbae281fa2d0b3d60b16f9c2045bac8d672f9a300bbdfa8e74037a368d66f01005c020727098544de8e23e1af7edd6277bc25721de8114c3983760c9981d3acbc1bc32 +A = -f8b130b53c0102a18d31dae4756c5ab20f437a341b361b16adfbd0b8ae1cf3f19a11b1cd7ea2c361172ce8059c7c4f2fc32a87839286753fb502be653faf3e34646b8d57b7ecb9269fffea1d6238283f805428b5fc97ed3f30dd647fce4fd9a6eab3c6033ffcda5e11166a8e23bd1576f6c168523dde2c482ee969e5e86e5d6a6035583cc6a7d224b7d08a8f9c25ebba23d57877de60b087c98fdd7ca6d7a30f7e42427747710479c02af7e60240c7bdf738 +M = 314deea3cc58a5e15e948ba3800f2edb66a308ef52c8d860cf6c0c9fb6b1c25310d27ee528316dad51b3bc672648bbc94690f7579ab23c2836083a9d67a0671c99036b01144299c61f3e9bc3276ab7 + +ModInv = 22e6c4e62db5fa1c497f01a07c3d3b61cd20a3377480e5986049f001c81a04b68f2a49a17ea4a4625afda78f06063aab30ef745532ac8d35057594c902084751ebf3ad4c13f6b943c1b01cf263b8 +A = 680b751f3df638f50fc4cc9e89eb9ee0977caeb003fcc26d9b03e0c2d7a84db49c5c48f0c6a56a98e2b6b5d3621b5f8ff4e6f577f7d3816e4b868d83ec4386456620a0899150574c7190c13ae498bc78a5114698c632e77fae733527fbc0f077f9e5bc8c3ba3437ac4237d479ff3fb86d77ddc3fb5f4401bb0e57abd92d14fd3ce40cab0913fadf7ce538855d5070a5a7d8d70869196c99f8c210e1ffd111dae6a98e843392d0480110ac37db9125a0c0bcd0b +M = 90d7529d886ab5149b84ee118900ba620b693288b11995ab5a5a6690c616018cc0a049cac7eb517746bfbc6acf5e2efa46e88b31017f7312abe3ddbec7fc909a1f43882609b08f30429ff63e204b + +ModInv = 6215a0340c6ba21588cd0f16fe2447674a7b7594e64826a410196a88a0a4f7c4f54d9d9ce74e51c196e91c519f88a3c31753c136375588ca1464b40d04e92edefe9e0ba663acf7c70dcb10e76a59 +A = -50cdc3ec954aec65aa088c9c776ef8d597e7c60387491ccd697cf5d65d80d215dfd456995b6e7b209fa2abc69f9a35a3e1505ba7ef3f15732d10a3ebf7fd80618a672e2ca600e369f7a6e0b87b86272a7cb8af46f51307b7c4aa55f8727ddf912381733dc62950e25da32001223fc250d73e754553db1e68a9872dbed94c64f1b0b1b9fa5f7f9c9d9289d21f6787ef313334ad2eec480245b3af4302563c2f922bd8ee605a3f60a19ced00cb0ad653b34097 +M = 822ad361e829cd4ccf813e7b13ff6a4db1f5cde2035cbb990aed934e125dde858eabd581594ed4d48d7228624ce3c3f38746aadfb509c82880343011b96bbcbbe525ce4c13e39c4e802c5af0ab10 + +ModInv = 2b1ff1f6e3fb7bf9d7a55fe23c404840b1c9dc91533b898b1bc21ef0825963b936a031d890af6b7672fc3a36928337bb89dc0f5b91a59adceecdb998a95e29c37789abcebad02de7797657387a0e +A = -422fc104340cd00883b8f718aef270d1dbf3b60c44ba047dc19c1de5bd0d910b39524f66117f4873aaec57ba67d218720eb54363d9d539783aa81799b8176041b540724553606c464b41da1c05b072198aca2503557c14c6cb4b0c0dc7576c98e923ea89e45118a71a530a51be9e4d47455dd503421a303a7e34cf5568fd5a8b095e509c209118c7ed7df60362be5c18ce776737ab9092f413cace80552829a01f1067daa80ca8fa941b4f14d4c805feb2993f +M = 9125b2857ccf60cf6d96946269aadf8c1c0f1d0dd0a0394b9b59d0c3a39ca6343ed4f095f849200bdc7749a0802714fbaa8ba8a642984fd701a3131fc16d523e88ad2b87408f7f3eeaf8c4c7bf81 + +ModInv = e4a9c631d83c044ac6fb88a0495773c6ca00d4427a270062227b68fb76079e8dc9a9da1730c4146f9c64d43d908882f3da87ac6e2171e469c23ad7448b59c89c45cc8ba1c248369a2d4864283 +A = -199bb030083c49e91030c1612ce4ecfc30b5a4e5e3b232e2fe73d597a563c44c3658a7a6d23486cc14fc0e887af71182a06ec7c2741b2aaaeb5be04f2172fe3209314bf03b86936e149c89aa7ab19d21c344e631cc10f53b09bd5f029880669f4df450df5f6aa341d78b51b6bdc91a323a469b545a23445e5275dd465523d540a655c73bf0e89d89e19181d2ab6f54425b78313a317f115561a58c44a46a45826664eec4e045311ff3bce1811790bea7a77621a +M = 3affab60864f7139266b488c4db5e604f8b3887fd1f3b444779ba80c37e7129bfa2cbfeae901a29e71eb38c3e2e19afe85c7b8220f4b4472329a9d6cf7053573f08373e07a295290af70dc7eaf + +ModInv = e90900ee376a40eda36c59634d0064fe4de7f61ebf97bb3c88fd9a9ac5c11e02a637e67081211b44e742d701dca392d86d72d99ff6b4c684a3eff8b2b3f3f40625f3a017bdbbbae10ebf7578a +A = 4e217a0d2bdda68c468a542b9878be1ed8fd20a7f00290de197f3e97990b92b33472110c0a14a1a0bee30ca39f48a597fb8305a5f98f9c2ed76944ec3bf05e7c884c530a5869f100112d7fd9af23f12675e9969a18ef70389f12ea457a7002a3e797ceca23cb749a74edec90ed2951a910db7b393de4749e61dc3fb29836f9e61212e73b1219897d0949b82bc59601005ea858064702688e3a91c7720340aa5959ea9f8b1ad4d60ef19f8377ee749a09ba8ad087 +M = 4dc617d7b0a9b974b5e6aaf737b497b65d8e94f52e836b287d23502d85cdeb71c9743d2902d068c6d2fabf44a03ca33924f073aa5f58b54209a92fb3242dac22afd75d70b36cefbea97ebf6749 + +ModInv = fb291ef1030650231fdde5d1714d9061ffb9d23cf8db994ac5b400576d56937457130a866b38455e21dc28fd70660a733b169f000166a33c3eb4772842e0b1e0b7c4a4dcb24cc45aef58914e7 +A = dde34febb1482677877561d52dc944939637efa7df6c67ce220e756864eddb48a125573fe3f6b9cf61c5c82ac5f72a9b33e7a5b411d691b089f37f3e109fad641b572bcc10c42bc52baea1a73f4780efa5ec2e716724ca87fed21cc41bdfc1de768cfaa52da7ee46fb781fad75d715a309b3a352af5a34ddf9f9a80a5dcfd503bc0907a57e9e4acdd29c4d2104b876d12b0e5d5af45c6481ac5b3b79708353798d68d3cdd3321a47201edea378a69cce0078c003 +M = 13e88477d2390325ffd54066f62b842c477e391dceacbc8a1a8c29abfd15f802f339aef5f2f69b86c29b38da1bb60b39d2cb9290ed7be4d59feeb56bed725c2bb6678aa9be33d46a56f2be1486 + +ModInv = 50eef03de39065968e28c59da9d03e27f38b01d612e08fb2e107f6d69a7fa8105cd2101558e40f09178a0cb1ff57303a9d4760931cedb1e09a7f006ea30bd3b82ec516a01becaef03d3e910d +A = 31a88c600477efe6221e3d59345a2a5153f20eb4b1fd93928c4cb679fe5b68d3ce1e5ce49236eb149e9d52fe571b841d113a984dec0cfa8d147a409bd5ed09bcd0805d900d78b8a90840f4b4ac6e6cd7e62b0d9b3edb24ee019bbca4598a16c23e5cf5d488dbb7696d00a67cf7c2035a66197e2999b569663acd515d2a4adc330c9e4bd777181ebea30c93d3c44af7c63127a908a7a3ef67f7f7f32aca76dc8a49e48f62cdbb921947469c17dd9473462fcc9b4b0d +M = 613281203d70499a6950f4316a4a2fe2ac5559f10e13e256085d7cbb0ffad875dde0aefd30fca1aa40d75bb8cbe0bb907da589179b184b04d3ae9d7fe70d6a6fdd3c23a3b352bfbe4c9429bf + +ModInv = 3641e4c8a8c11f8e2650331f49d5e7e1b589af687bec57e1f8ac980a188784cbea04a360b45369bd4af0c29e2d37df669fc4bc9173117e42bae52cdb72530c55ad7833098b5cf5e5e7eee86b +A = -bc71d97df0d65923a120bc606fa33f70bdce80c994327eef6ad2c9ddb7d04e82113f36f9e5b901743d4a165cc2e023ca454c6877df87f992b344c0a6a6199e21eba16c023c893b41dc90a22f8a79df355e352b5ea49fc6abc97b68e8a2777ae4f4e7ae84f424b2e80ca766924b0327ee5696bd0dcb7b2d60ae1f02058069f74100aa37a6e63af9ab6b378eebef1a40130b4c380b6bf9c8ccafc47c16f6a5b6e78787c241bc05226db4e5519de5d079eab7b8462e37 +M = 98f8e10cc823ee561c470e0354ee2fdccb8e07a3c5c3844da3ca531909eb616cb2fb12684e4e1dba3367d259eb9604844c97f882d52cbe783dba1f86d4a5808e725d1e9f722278ae9fa3590d + +ModInv = 8a58bb08e978a7e67c2d120825fba76db1407f78812d767ffe1eca759af2eba0b6aaf40c7d286c052e565456a5d3254c5484441ed18595d2f89337345d66b6555e09e3b9ce375d9ccc459f +A = -1c956b53e7c7cdc1610d60d76c6b4bcaeb9c09f70b30c9b71a76c171c298681905c58f0c79003777cc8fc54710d52a49540ff7b0874376589d4839f825271294187e48f6844b464aef6b9ae0029dcef2f8d51cb6a33ba0f13633a3e5d95cfcc200b6fdca81066c976a9531b97a78d49a3e8189c1d6f198ee4a51a5b3508f6ea8d8775682fb5ed66b6c2d190871ea91468919f28de2fe84310d6168514e0965c1a35231b6f4518d770cbc20303c2ac1cc402195317d7 +M = a831a0fa44c0b20699c049c9e7ee910d2df2aee1f7b377eac8d74454ac981e3633005fdcf6766b8042a9c74fa783a7f7b25034221e691b56f2a0096912dceeaa3bb6950e4e45192ddec729 + +ModInv = 273e8892aa27d5cd13288353d1e37fbe74716c93942e41c0675572620c73dabdcdcdfe87b9d84a457909214ffbe95e733aba95442fd3394d44135531ea2fa830717db8df8a9cd94d37ee33 +A = 6b0f486a9f22e182b8fd5f6063da92b59f941a3317c0f50a2e7d87da3a14947b9027e293cdae0df5cf4b4aff29f133b1aa513ea4a3de7343123c0c58c5115a354d32f4c26530f68c82a088414ff4ad3a3c446092c61969a9acb4f30022a5b8d49dea9422fdde9a97b6f8938a131237085fa8f9efb4afa4dadc14b437ac9cbc1c4c1b1f65654a8936ac7c555790ae76a924204d37e2027f50f180783edbd3e70439c88cf86b813bb1c39726d135256bc31bd98cb99d42 +M = 890561657768777362690c69d0b22184f6d1ec2828f7e42fb2f982e8c2a0a51fbbac854bbf9b8aa4cfa0ac041f7eac0bf68362273daa7a29a27dab158645575733ab5dd8c9edf79d8329e1 + +ModInv = f2c2fb82fdd34d9c1d3668772532b884fc4cd1bf0413470e53baac9d2fb25cca25cf60f612412a1b9e32dba4fe858bc0ffbb449260ad4864be1c3c0aa509c50492d7ea9798e9e51d1c7 +A = -4b3b4ca2aedec38ea627b48c0b7c0c51e0f3612a53ae4d4f0e803b992d4e990255e0479c60bedd12a8129897fd9004dfcd826f9b5262ca1e51bd1291923ab6adb6632af0253e080939cb99621df26532524110294b840c34d7c66a7cd69b596ba47afcf3795df2599c3f16c701771fe2452c4d5ee1721d76d336f23f0ce73907b20f76dc3c11949a963c089582e3792e4dbc344b8551151b31160d28a73d286afa2d1602debb29aa1e0fba26636d5af8dc7cf576d7d859 +M = 22f877eb94d0767151a589f1f1493f1e66e1427a90d96ffb4bd9f675d70b0ff9a29fac3c29c936ab1b99b8a2e044ff4cf1f1cfdebcee1567c8b76f70cf65c2bc164c24d0e38997a19dfe + +ModInv = a675d3e5a50213291b443c7b26eedcf95c3891e7012f9713e18b31f021e2e5c473f470113b87f6f235c17779dfa925d894144108fd78afc8cc6344b6ff07cdca1051d287a397e5cb059 +A = 2cc8985633738dfc0c8cbd88f30407f04eae7be2e884f065e02ae0b424863926668b442eceaa2a1814824afc1fef643472468b26ab94adf83682363b5804391847d6d0f9ecc3edc025e5027c0faa5cf409c125a65e7881b80e9a05e1605bd4608cee2a6741600f3b813abde79b527a9c46679cc731e01b08fbc86bb60ba31717aa9b5de757e7cbebe0ec1edb22586fa2f167f76fe4742c82f6b98a204738403175f2f7a61af30bd1c055b08107e4180a932cec5745d14d +M = 20bf51b002eae54c1670444e4b1f3d0442696a0f591286937e6e453ab5482af6d5a3b81244a1554d9870235fd75125ab349e7beacd8d9355f22956c50cfa235634f0aa776f4f41f5c35c + +ModInv = 5d3d4243b271051c68b4d0360a1eaf3606f63de4961624e8ace3f580583332e5487cd3997d46e79d232118091b560e8cf42e851b3e0e8728bae7601f3ec0dde2cc4fbaa78ad189968eb2 +A = e6a60bdd947805a044549e6049f8b620e01a7aecca2a5e4e9d55b4f202363cb47f4420080cf661668fdbf16a5715255c8a1925214c254bed72ab18942c46fc7166d4659055f93c60d25bf60b3787d4f16a684825dcca5bc839368adf9a8942154f96f526355acd5a99e70d5840e05724c72f8b6b72b45d073beda0b0775cd797b8011cd0a0f1656bc46d0ae704b94bff4691f96c4a1e26ff9ff1dbe0dc87337b9b5db4aff62ce3bc937e98a3b0654c280a002c2087ffc0 +M = 61302b153b0901b734f21f87728560ff102ded9efa69223a2d0c3e69eba09e45a66e5c4c13d93e6e92b83171dbf6c34ccca316d4a47d91e7f047466bcb678ddd8e70afce464d9a0b5e81 + +ModInv = 397a339c57dc5a7f59a56408fc583be546ee7c6311c394965f9ece2a423ee9b086afbd0b5155a7591d2526fa808a7c4ca1be0e974ebd41190de62c7656b3b4880068a63fa6b87179d1 +A = 5aa9bfb8289661874fbd96adc2a78e0fb201f2fa4a9b15773ac68bf8af9aea916f37051906a30486d5997a435b2e0055c389707dcbc8401a115796ef555c284f14608a35520e147212b413f59b36e48a5ea8cc3443ce93df84055902a7d9582a7e78c754e4a37766f17f237b54a8de6b08a3e1c9fc35b5eeae086e2070f9d19c4e7dc5b3d890dd1e7fa7fed723933aea4db15e1bbc65f21fd2fe4f1cce3fe75c68deece3fe898c72e5720b74ff83d79f74c290d551d4674b +M = 5a5c30d0cc703266432a43044f558934e6b16b4ac282c1e94706eab660a5572cb5e3d09e397c32a6863485224bd1a165967b56f8e530cbdf1d228f473bf886b57a24f24143fae30a59 + +ModInv = a4c98827a9d8d22f194bdc254363592b5ac670ff34d6656dc4cb0fbced31ffa0950ce9dacc2998e7b6809249d829c0b8359ec12615d438103b78a7b63d8bc4086b7436c4b217990a7d +A = -6dff31472f3c1a50e60d09bdefbe6eba29225e57b497d628c43520ecfebf8c77b24a303d0135d47fd1c3b3d197d74ea17084c26b746179c3362f759b0bc9865aa9d485a095557d1f01679b2c89b31365f84778ef93f65a51b246f9378577df30a5c56e14d4506bc87a93230ca3465ae97d0b2300d370da9234e2ca58f5bea67186a921d50c48dac583ebbcff30539c156eef65479a58fbadd016827ff0aa13387080016f6ae67318fa73fd628588ed3426bde73d3db075d8 +M = e31c3252a2891ed5dfbd336960880b2a449f4c371b016dba8eef37b7f0814cc3e6f54952eaf63c60aa1c4fef3b37c285b1533942b52461ef587aab23b26af1fb8272aa16f41b6a251b + +ModInv = 3c7cc10e8d8138942664798151cb3900359c744f561a26d31de7e3ca7c7027bdf0a34b7605d2146c0c2d6e13beaadc87a5919bd13c85545decc5c8d82b4d0f0357626d1988d8830bb4 +A = b5952e05de7e0c2b8b843fe93450372e0caf5fe742400134c9b57d6277c637d5437b047a51bf9f1969da282150379e63aa11c5951251cd5d7759b3aaefe89a911fcbd588ed2e09ad9fb2b37655df56850b33cb187afaa6ed7c9fa6d1de04915b9bfea02030da933e474cf324a5d2c27f58085e24d2841c926c406fcd225e6ebc8b5683076a5a97ab3cf404af45577dd675cbcb6396ebbd132f8096cfb70b183c98f3deca11e633e2f71c2c0a5ec7b59a5cb449e09d9dc464 +M = 5230fafd3823aea7d3f3805854b584137be0f782c4369d714eb373e72db472ee679ab8dae46fa65cb55766038d1f74ff08e206b2d2a14c5a1799a88c2bf170124767b213ddb2ebcf0b + +ModInv = e5c9e69be76852fa99c5cf7251ba0bff17b0c2bfcba6a5f2755ba5a7758d011ad78ed7d31c806a84f13a6c85f2d2b6375f104570961ffff7458db1b096d1518a308032232e0800db +A = -16b3eed7468c40fdda984d01f07c3784f59e0be56c37aea892885c03a0199d2beff834916b0a1f73a3bada54bc14b0c5390493b58a5e27dd829bd8cb1875326b248ebc4ef7e1bf6655363fabf7a9f176153149671ad56b1ae6f015f184b2ac9d268f68b44017f43c0c34d4c3c8adc4ae299a162483fd782671f60d1fd65d1edc5d02dc2776681fd6cdae2d78e106167da10b87b586f46fa3815b1eaff9b44f1b8e1afedead83447b7db6767249972ce94519ce28e738d2b835 +M = f37899e289b6029cb2bdec841d1174f9cb7b2dbd7a19ea26402df2afb03839772cdb3f032ea6577f12f7ac29ef51ebae5e4d6f29abf093039793400dc04b873d76025324f98ca768 + +ModInv = 177525aded6cdaa93ae191d45b6a9f5902acaa052cd361d37999c68a269dd951ad873f0a6604bac4463d961cc183c86460404dc088bd6a77b8b80815cd2a2d0f9d1e5caf00874863 +A = -2de76e52e33daf592efcd0876dad3031bb035f983956d6fd345b7d5f5ed96ceac564a308cded9524e67571f9aca3ee5b0dab78cdae14a535f77946a785ada6e3dffce1efb4782631ae7bb10c1c0dbfb0abf6d0ac61006d1bba3437041049d8f9943a7fb2c49760e3fe06897548c334c9aab946ced026ac68086671f4d03b9a027db020e3ddad48735d69abdbec6d58875a3e22b5c85b656cf8d18ff9f41489a91ced9a4b778c4dbf5eb5767013ebe83eb6a76c87ca18f0fd9d +M = 3bcca77f7d05c6ff7415d2100addb4ff54edf270bf9e12dac65f28f85e64220edde56490237f3f8940822942ba56b064f6fac656e9425b3db97a3d1f10e6f00c0a2a2deaedd88906 + +ModInv = e9843d3f3869f6ae8456f61cd3526ff1e48872239e05af0ae6feb12db3f2690d420b1be4bac23935d081b6ac96e15de2997dbc4f5bbb4b3409653ddf3fe76bc5d4438d925bbb4a3 +A = -15e8b47bc0a5fff647d50a50f50a27c6c63764a794c97f6417bb34c3a795cad573aca37e2bbbe7356b14b2e5c0b93d17698b56daa7176130454ef5aa7a1834e89f87b58a05b0d556c42e64838ba662ef9d319de49fff874e8ed3625883ea807633f604c92ba3994b9664ab337fb6e04aa4810ac87bc2084b9e031f3104758be562db9b76f8ce096314fd6cc9b8434f92bfe8cfc42baef1c02ef6a0efc34919cf5bd235ebd66c9eb292826e7060c00ca395731f36050e0d1017 +M = c55b45402c1c65925439045b893c8500fbd295a27754d085810fd0541440f9495cfca432de56878c19dda551f9ee915fa776f8f9b68b698f0a41a270828374cda10206cc477f2777 + +ModInv = 2dd04d3f49224ed7c4701352423bcb3e96642a88bbe3afe304bde523393512f14ada4d17cdf6823c2864e8af718055842945dbbc8c3562060a008b767e40429f5092b0359fe947 +A = 5f4b44759afcbf5547604a863593901274672ff299065b9442732a80590843c6a915a3f1573cf3b8ac8a1f68d472c650cbe22b5bb97b0aa330a934661e11fdfe7fdf778472d3dbe5b5e1212d412ff91aafe6077b5cd7c6a2f3500367e699e59954b24f889ddb41176156389aca30f81e760086b6bea14d9768da7012ea946f0af80204339f1ba98f12043a0dbfb16ad90f0c69955db8fac705de8333bdba413d450f18ccf666b16741b0aefdfcb4ea09c38cb409a299ff5c0d03 +M = 51ba04b65fe9564a60455517020cfa6e2e87ce9e30beae7875d7e09aa28daeb08f3766d501ed0b2eb898ab852fbaefe53210ebb7b439c72eaeef746be68b86e5413370ba52c602 + +ModInv = 2db8bc142392c2d5cb9ca5cad1fa5722ddc6655706605f241191222752acd5ccbc1a57ebc2ceb4d4b942aba43ac69af1d7b201a7309ca050525177c1e2bd6d0dc0fbe95b60b3 +A = -c76a867c388ff135bcb80ba752741acf589a965a1d6c4933ce7eb6bd0f2d1e36d285acec1d59addf43f0a11d380a283913ac962f488d097e3749a5275b5c6296fa3784af7769e4e00a5c7987a8eb79e62b201077b626eb403a6209f554d23f34b50e4c576621727dc404118ab3b1b7bf98d4263b9da1d450f5022a93b3e24d41284147405d715d7a267f8a48c7bd87ef13189cc2821ba84b3d418a8ab1a5fd7948a6648c91b9293583bdf82158e22324c0af94a12c5be0466780b9 +M = 7ffb7052fee9fe5c2d939efd7855f44460e53d8429a638f49bf38ab49529051084195457529feaa279b9d4b359b466367e1ece9cfa9e2b656d10147c9c123253e2a7fd26d334 + +ModInv = 3a735085fe751747801b2cde0dd6436cf182e37a7bc5a39e093a28e41c09e51f77f97b3b415a367abf6ca3dbf3493e53ab20811471d158040d9fd8283715dc4e68853b1fae69 +A = -d2c484c2511751aca940581920dc566fad1bc5fa3eee2c89d7cffd0b17b6b5a263a754bc03a7eb52304dd9870017944f2a67b9aa6254293554a7828af207493ff8d4ccd15488b6f6353ec17d28ba8c7097bec70f52ab4e30a6dc5bf5901032554c02301cbff3189a1cc52a1e538899108575cfe244900026ed0e624f63af0721a04308f1fb248a0aef93e0a35ff7b251d671c7db85e57c1e877c867d403c712809edec156f0eb9a64c305755e638b803cf84047413dd456c442c0f +M = 76b37c8f440ce9d970479f1ab36ab780894344b52c17b55b5fcc93f28c62adeaef202ce2fa85dc34244d9504f0ca8dc9cc2f94330dd832c32b2cc7c649be96a707468f5750c8 + +ModInv = 8545dea4d8ffbfdd9cfd628af75a6699c6882400ca565441ed035046f7ada92363c144041e597358275e85d512fc9d6a1606f0088a582edfe856cca4b02606da98780f72acef +A = 44cfd8f1ab69f71f4dd75a89e1fdc0fb20c68b4e5aadeaba414f511d06146da68154df41b989a38ffd5b01d15fd55c971805663745bbe59e6c87890eed8b8af72569034082d10ba03afe46b59d5ff404777b5e9fafce3b545c3590ee0590855a1214adffaad76f3cccfe177bfc057f05f1851baa200b912d1f6dc1c8e6fbf027537a92125a6575f0f67376128c3770fda5d9ef58a256fa992fbd5d1ec84c9da189de98ff684558d45031a11e1fe3e6fbc1ce236d52978b8591f8e7 +M = 9676780e7367c7e66a11f344f27a36c18827e401a5a61b17d65ee62f57ccc4054ac5b864837fdb391dad5e0e3c9954b3ff5c5165d584fa207d1c5df4e51c2c3b454a41ee7318 + +ModInv = a9a28a346878a80151ab4b3d86c544d80f69dae4c8b0ac53d6f0c8c4e5c0eede591af3bb596dd9acaff57612348926fd155a26629f23c7529e64b7d5e3309ea94597db84b +A = f91b88f6f9b782759aebcc9fe60b220a262d17fde019de080ac980f8f70a8b5b64a4dc4639c96504c5d9ee6a3b05906919a22186e704ed0345a080b15c63cea38ce68d0e96c291e32f4f89c0315b1aa7fb1cc33efa12358ce11ff72e58e4f5d781d172de97e8a66d8cc72dc069508cde7b63d9cb010bba6bcfc4135acc344a22dd7436f09b322eaf80940d66ce7ffc1d662ddecd2193f7c247961cfbbfc7f589e1657d02eeffd8e87561c385003e518513c1862dfe943b05d0de0d43 +M = c568afc17651278b005b39dec87315f1d99d793fdb5909cacdd8668be8131cab52e9bd46f932fe76a6bd344409b3baeba32b987ab4dfe51a4f2cf2ee53bdd5cefc9b86e32 + +ModInv = 363a200f49c61f4a1191683acfcbde178f8102bcc99cad77037c27d70d4c21f4ca88deea41ae4b9e81fd6acc8f8ec2b3ca26ed1ba9d825f958e5b0ffb922b79b23b45a8954 +A = -c54457da1662c72f75bc89d2e9c801f93a75124a97226b4c63862a6f8f21456cd4a8f35d5858044a9c3f969ef2faf46fc6bd30c7e60c6e3c278ec98838e2146d5b8199e4bbfa958d866153d259df5cd6707b1502059c906dfb1dfe376b3a0d3ba22b0f1bc2b460d5a6cf8fdba3cff65cac42c063547f60ca5f0d65a15e110b1f969f29c2caa93ed9533487c3e8a469437508ce38b3e858c6823f7daa48f0a23d76ea5d6738f42b7222017dd64fe85cf2f76fdacf1f3199381511fa36 +M = 3b41b54eefec5a37360b7f184a1514cef0a304649a4f53b430632b9ee6d8936d42d824e4a661ff0c6809cc3c62519404b9ea6c060d96b1dc66999357c9c4410cfe5622e25f + +ModInv = eb14cff4110d21bfe0cfb1335d2be8acf1c1cce6902e5e2ad7fa095c3a52808bba06ba89953fbecbed0643ddbdcf98f1abbed87ff04dd305e880e9ea1fd2154998cd242b +A = -18bd81b9b0512555dcdb895bfaf73a03d74b6caa1c2cf25b474d5d579ac0fdcc5f82ad1429dbaf8a40e179c0c9eafb1469e143e01cc2b82edff67e7a1e8b36c5749e80cd11baf6ab12bc988300fd220ecc7cfbb8b72decbe409cc792be6259255aa49db60bf7c232d9d380831c967947247090dee97b794420c0adfb2379634b7dd3a70bc4bef4edb940602b4d0e112f10423b4fcda3983167468dd170d96c1c965a1c2355c3673a47ebf7e7abb180521cd88fe273c6f912260ff157 +M = 4308fd9618a40fe08ac427c84cfd0b889be04b569483968c2a0a85fad397b291d411fc7fd724a68528f1be422b657e5c587cfaa1ee2ce68a67ee6488845557e0b69d16342 + +ModInv = 1b06ae994cdfd62f9c1a9cebc955025a4a2f1455eb8d5603aa0f6c07ae393bec2089bba581517c48027e8592c3d4544005ad1551e6085c1323a35e60d785a2b2a02ba82 +A = -a32ee7e954d6f2bdea90d6b8571619e2ae9d1fedd3b52bb8d420960815ac8fb7470635a53a6f9fef34dd4407b6a88ef96aed5e29a76228db7566ab41a2bbdd798321716fe165637eef71dad7363cbd2e7f138a1251d121c3bb561b6f3500cb981f6619dd91bcf99e01fbeea7062d3eb15c037ef4708503f34ac67cef6b22236bb2619c69295753910e26c0334fab61cd7fb71c6aa8fdd334d45cc5b1360ad39d4f7fad55819717900a940727f9f0fd5032140c369da18d1e6e1ea8c55e +M = 453d7a8a9393799693919f96688635f5708c7f6b54de6b12d1ed5757391befcd122e01cd1206984f380b623e33628ba7882025b194ff1e3e7e06ec4236ee724604284521 + +ModInv = 1ad0bc33b0b659f398dca6c26b4f34fd5e256bbaba823c865ef33ed826b94cb4c528fb0679fecf76c5036b6f4bd22984a29cda068bd6bba31fea5ccec01e5026d01d48b5 +A = 65e17f114e2ff93b246f0e3622e76f06b991779fddb8c16a888ed21d0dad23daae1c19893ec87654f5c14e5e48accb2786875a6a5f4eea599e04cb2a7ce1fc8bd65de7162854ff9d4eb4592f1df8a66c7d68c3e548d058f1f2c596929044b8863dc356a7a0a8e23375dc95fe4b5f56def70bdba53a56711a78832e7b0607f89c1a676b6202b48e51859e40ba2d5f3fb715cd74e06d92681fc2dc6860ed304b88401b95a87c0ff819c9ef547c45d023c43793ef52157aedf76f2e3d72a1 +M = 9b04e0fb0fd996e15165d178826c6c549a1163702d5d5652f13a9fbeffe981befd479266b8a50b156e923a5710b7bc34bbe7ac950989676c417ceb4c1e715c0a68ec7313 + +ModInv = 480e19d6abb7932ab378e18f3b8d0cd3274875b2a2b259fcf0806cc51029f5050aa05674f29211f2d3372cfff5e4e3e8126a2164a440e3b32b48ad1c5b792bb7efa2e5 +A = -4bb995245675fe0b754e9c8e1eb20921114e483140eb0aaa1f025001cfa911f2cdae74ddbe43351ba5518144e19c437d76644ca04d1e74c4f3fa6b991703e8021ad0f56e2dc06beea774879548d29074771c5a02fcf6b0cee56836164d3435ab811d6a05ebd23d919be4f652727386ecda47b43e2e9f4b87ec608037ad2747fe34662244ec6592937bee9ca9cc50c2f4eba2c0c13ff61581d58855c3e3fbfecbca952b28b4c37d49d1bf9c368d4131395b8327230b79943c47277929085b +M = ffbae711febed47a740d266186a1a26a3eb167f8a1e228fe17b258eec3bba631f23508a4b3eddd3c721defbde1a3a30bcfa22a3f8606eba2b5e73c19680f97c8aa631c + +ModInv = 72dbf1d41ff642124c8dbfd62b0bb7ec09d2f09744bc0622ee4475e13439ddc52f4cad1a0ad3870d930f7ffcd035b9ba23ef26d626cfe006f72f885b344eaa1a07bbb +A = 89de6d4d9dfd2253cb0f791096d485959a706acbf65780dc6afaf6ea69c4d2b5a66b6aff9444b7cd20bd4204f8adf0e8ee56eb61f698e87385b6151e24883aceedf04581b9b282b123765650f81b08b7107a9ee7f05d6d1addd7575f517a12bc93e88a4489e3a120b568cfcfa594f1231615b9487aa3cf871ed8a6e075d5e9a4c6c1d29109db9d62170c627a5c3edb8e71f9c22b160f986d3e2b8ea10c252ca24d2e55860ef8333dd5cb1a491da1fb5300be4c6a8897b7bf79db8bb1bb6b +M = 248a8830c03b8e5ef78e522e76c9c425602316a272a08fcf43df025c70c9c86f6ffcc2cd76301b1b346e5ab1119bcb823309cfc5f9b4b74705e8968854e90c688fe156 + +ModInv = 2b27f2e23156f1aefbfbee976e143a13cc7d039cf61ba10cbebe33cf901200f2cdaab9b23ea4e7d26d1a91edd8679e7ffc6aa1b84ef66de810583dd3d5a1d5057fd +A = 94841496fc537ea509bded093bd5a6b74dda50712ee1f54885fbfbabfbe9b016681e9c02cf9707f93422498033b655b9dacc2e4c9f8dfe7f9d7adf672afbcd0625a6a1fa2ff47fd1f937162926bfe3839d103cf37f62df179fe8e39d5fdd093a764e50afe39b812f38b0e579a1de6e8011f86159ddc026ede5d8734ff4854409f41da71d70e11ab3f7d2282c602168586fb213160082c679e97d1de061814d180661e379ffd071224991f03d393a939c2e1a1a4ab04de15bb7c82201c7c142 +M = 7ff0581718e5e5a428a2a3c39b8fb2cadb7550a17bacb72a7aac95a713a6ff95b8dfc69fc3d0a04e6f7d5e88f19355a430b20be3b4a9c4354036edf0e6de4cb249a7 + +ModInv = 2ce4288e2457ba8153a9fa07188b6736afb6c506c15bb0e73f34b90803c4570e66ac2353d8386b48d1650fb9f44dc7e11fdd3ddaf50d738741b5719b59549985d93d +A = -62a4c77626de98b32dbfbc6b415c89eb1a9ffc952c18b54a57663e91010797e5cebd40e5a893b5ba84798c573b76480ee57fd7001d9a2f45048acf615b2906a66b3c715b8bcf1cc4437b85a0cc7c4588668d346f7bace7b44ace0871fe53331276d9a39c79acfe9440061279b0c7489a4074271af8eb850e08d3e2084646e9b93d0d8ebdb59da196e2f49e160ce96dd1d1f987079bcf39086c56a5454d1bd63d049a6fc22844ed771e6715656148d92ff0a1e0965fbc172c330b3499e163fb +M = a9cfd8da346d7ebdcd49c1f6aa2df06fb251400a8098c645e7785ac83a04cbc63d6b56067116f6f97caefc98477010ba565ec13a7a0524fce3030910ca53b7b2f694 + +ModInv = 4ab729cc079dee8ecbfc2d5186a0b092bc058350f7b0b48f21b76cea13835aac3913018fc5a87d77c3ade25df323b2d5eb9db7be1fa9e712d9c3c6f5d5a5367717 +A = 6bd7114b08148019368bbc13661c4996eef0267c385a4820b2e285854de3e2e0dc3870ef91248a5e9213ac3096b83bd5bcce80dec8e3580ec565c5081e3a5bcbe76f221aa750ce11cb3f534f04cd0d7a31b4a37bdf6c36af9f65c26dae5f5adec6d75632ed4692d25566445691bdeec073a81d5b2472423720c73419852da51d2986e866e90097a5b911768a7256381e75f6b82cc0ce57ad84057ec75f86ba3d2519e26049750a24fc71489f99781b0d6ca4e92f3cae4c257bf73db75a24bf27 +M = c5ce4637b4348763d58c9c1ddcaee2e58c4d5dc800102798a7d56abf5ba7b6a973c671e462fd176700a11aa2dd898aa0bc7b6d5c8a8fcdc67e19ddf4840d17f930 + +ModInv = 90bd6465d3f2b2c457c32d908b76bde31f69bb20337f92b55470d6bc50979517683609879ae21582993de3d6d4127012418529568f9e7f6feb9227305a202be12d +A = -405ac2777d2c6af46999df6bc058ab82165a56117d0e5975ec0e7ddfb28488486910e16bbb3aa91b34a4d695ef2dccaeea1f35be6d337a91b21e6a76129f260928ad5342d602e1de7b8dd23964dcbc44b83f16ba24cf35f263e4b7a632b4cd76e70568fb1f02ed7997a06d2867199e09f070b3f2b9d087ae479435e7480d514749c3d81a90d8a042c48d0049722c396680293174a0a39b46435edda56f75b46ccdd01692f336e62e717e15475877309125ba3f538c1287551d954b54553abfdb +M = c03d0e4ed45160235845dca5391d46c6fa20827f093d33c52f717998ed4bd41d64de7c545006370caf8111558e6a8cc0e7d482a0bb527c719885dc5d4292f4b2e0 + +ModInv = 4da67f0f6d0fc04c1dc9dc80202600b65e4dde217bd02db16958dbc9fe19a8217dba5a1c7459196c14957370cef0a45d92f4867a150ef878fbd7633dd41d1ecf9a +A = bf378bb8ebc41ce6bcbd4b5255b061f3d466c3865928a193c3ecf03cc8fb384e157f9aab65fdbdd77bea4c84b7520056766068b6d60acde56d41925113405f2c9bc448587c5690e0fb525f5f0ec2037a4221fc9c62ba4c3e73bf33b27a4a1f6a79a1196a7856c4ca4a9f0dc5b18555a77967bc08ea303f4fb45d0e78e1f25e1d587652f76defe109588e9d09002a51f4b218c1b5bf5e6751a74b08122d8b6fdfc71aa70756c32d871e3c4626f0ddfbca44937e544512bcda7759be3509341a4d +M = e4c8d25247fee0f2eb4226e0a7135ce5c2f0fad26cc91a39620d6e306439d9917bd78459da4c5399dfffcd846859985f356b1e994cfed0d734dba9d38a66974c9d + +ModInv = 8476c202f4171864fb8c57227cae473f7bd8aa8ba868f07002771c8605f1abd4ea7eae5e32bf3d9bed42a7681cf83cd017521bf5992b8cdb9f0b3da2d9cec284 +A = 63c47d52079859ff0b22eab6c5cc0a7e70a0833c94bce56077cadad6901543a091e11f079a53cb33348dc4352946cf2f4c9d7a4f098a876896b686e51e7e3e455e51dcce0b4d71826bc8b74ebbbabeaad9de5b2907a73a5a1a728dad4b014a394c2c58f0f001fd7ef87ac8ac56e3ba532c75dae00f2679742b379d76256568c49bcc406a43fe69fb30ba5a236007c541ca043f7f53cc42e009ce17507ffc5ef20c2f6d77099bf86899c983866e8e86cefd1c793ec9a2594a29c5525458471155c4 +M = b817c9fe972a98d92a833e98097f6f572423cc0ae6fa076bb3b97216500f007d48b0c6f7ba0c6b603d546a940d981892a25f6ab0247c3247bfb4fcc0dbd62e61 + +ModInv = 1cf24b0c299617eaf6694960eaaefa36a2ae00594f948f85156678e6b301b0a23e816ce16a9b836a05c9ce1aeba9b105b712cf69a6b86c2661bfe9f5318bb4 +A = 30daa726f4c74f9c5fb2cc7d0aea030ddfc3bc1d1f5924b7a7234dca973b2c79c06f951b75e1b21dff311fc6f789d17d08965bd524f3a65876c698c558555573becc23be69dd5d834147c28f77ea704a10355ecc46953b6f9f7ff19800d1966f86915fc76b87eda9e7b6f90baa495a977ccb44bb347d53f7691f6c5225bb3cab3ccb891ce8713f07d328c5951d19760f62ef19d1ab59a7884784f31d7e65c874a2e00071672728949eeb920e5bcdf6df5b89b33d5533e71cfacfb17d08a4317053ae +M = 5006cc99030c4756520500e189451cf52ed302226dbb780ef5c515a928a59df3c28b6ab0ba13dfb35181ca2c200f7fca7af8eaf7529c229e0c82e0b512c5dd + +ModInv = 516b95dae63e6cc97d7c697d2736a3dda1eee05c095ff4b3fc1c1738a6e56908f1e7b23d77680484ab894f4fa33a72a14f237c040b5addaf97eb9a864011ff +A = -3ce3a93068fff988ebf71d5b2f102caa25a6e83c747b4e1800de8e6c302908486f2c15eb4cbb4f9d8b383eaedddac72c5c87c872866f4f7d59b260d7590966adb9edfc5b7d8bd3db7e03fa297e7b9a028096c3d07bd6cad5434b5bc05a0f4a69e70346e13eea66e8e9f306f8ee10276a614f9bde1e40985dab3af25a3db889eb01920b46097b11a897bd4c1fd552dc03a81d3b33b7ffdfee084556d20b1a65d6e3ea7394e483cd5f09170188f8102f53ac1727353c063dc5efeb572a1c6032c5b3f1 +M = c82f43d34a3d935b5db890808aca6f765b8f81c8a97d7ab0e5919596d2844da72b0b48a7b80d7ac4a7047498bc0d2026986d04d7139cdd33127d216467d488 + +ModInv = a3a77ddb6cb59132835d913f1ce728210ef95f21164931747604123f62101838fadfed0a1d6ab55b9f820fb860b449521f76807ac740739c8a026ad4abef4 +A = -2f5c7d2d0e8494b7aa8138a4529c5391fc7f0398feb0c4f5d050e2b3cd8a9f19e44a4e9e2d41f0120d21233d93ff538a10a97ed9a89fd09cc0d31ab202d00d0244f5ca9c0ddea61b910c58ffb1489b60fd7734623190f55192d0d9641179659c28f2886ae880e7ad4a0efe234ee467c0c7bcfeadfeb47009b1a8e8be250ecbdc6707e60a0159353eb7af8d0c2d8036c7d726426b591c7c4286a33a308b362e52cbd987518ebdb842e94e6cc015e4eb7e84016c9c913d5e7ba9506df735d7226d8096 +M = 65c365675b851bfba38377f397362a9a44d9977852af5f99fa6bb9b011016343bd2a2959559a0dd14d6c672e2b21710a06226cab20d2a24062a94937e10aef + +ModInv = 728312d66712222d8e5b505699f93554c131ea01a06e0d56d767b254495af6ad0025ec73ce588375802eccf628edb1d403d9e80ff550bf65dd2145ce5781 +A = -2f63997d3cfde3cf8a6b8e2bf4642fb53b14ad957f4ddf0cc65fe40f1fe3948b3f6c943a3bc117549a9bd606cd5cbb6432e6e7c6015f5eb1ec8a723f463f9a012476371763e4051d0edadcc7d6809275a156f2b60bd219cbb6a7edeb18b45f51c9532b075118458da428c25ac819fceeae5f8eb2adcdd4ed78c518086638da1f05b5b063e172c5ee560644f2e34721de33df0de019d76ac82d62fe3ea03f702e9d177b19507258917eb562df53386eafc8a6fe423a187d0072e8d366f21a932bd4f49a +M = 81c3c5bab8ee92d49bf6c16b148fadbcdde025b9b8f373bb6b35e3f2bb56af65aa90e85a5606ce6c3a6ac00a51c6625d4ae515c96e7cc4d8d1052b1bc131 + +ModInv = 4d305f409f4b3705d9ddc4795d981313e72b28f47c1a5fbe4dbfd44881dfea0497baf1b4d3d8eaa9dbfb008adfad9cc3ff096925d53244d014d103518f06 +A = 219492aa41a21886d2ba6f831d89b3c7f0629924134507e8553251f413f32bd1a8c50afd9ea9d88eaad1b7e8947b57ad64205abfe0f279841162741f4f211ae1270eaea8786c860d8bd08e1dc2577ddbae52a1d1aa7edfd48267aca8261120ff53c04d6293086e2d8bb19cc192acf98f59c84851fa3045c9d091e9363b15dc221ddb80106ea547de73d701448cbdad4b9491826af665012371c3e220b2fb8f978218d017041bd6bec4d290e05ad3df15c855b411ee9579d7bf4406f4cd77ff6bc35f43 +M = ddaba338bdaecb6e8d4c9602c83775a416b194fd73266230811827978f88068281f0e0a9ad9d95d9c403e53639f93da0ef974abf4df31899637b58933bf3 + +ModInv = a49054bad5c9c45b00128590a132ebca128bf2e7632044f87cf035d7632daa1bc69bd32311be08847dca61664af009df81e42bc2a91e1b52028f47560f +A = -fbd0dacf1cdd1af72ee40da33fd7a29401f275872306689a952fcc2f8db7965f3e028b45043787d51d4abe7109473753793352e4ce48e13abd123a0abd397ff7a35daedade7bbe1fe8cf8cd22f16b7e99597f5b059e94f0ce0a60f45e05529734a65c70ac1c0c6233c94779683980f6fc97c35fbbf3c614f5ae6b3b4a085039f523b8958314b64aec2cc2102950e284df0715a3f6d5f7d8205d5dd0dba11243e308b6ca2afe75cb927312152fbccf3a9ad62fbb7f66f07fb759c064eb89c7542efe67b75 +M = d59bdf0799847f2b7847a3d6d41fac65bde584a5ae285890055d946a9343befde01ae8c5d54737927a82d627de62fb8f2d6a32aaccdee73b0f1061ff67 + +ModInv = 17f1fc470b80f45c93a5b309463d9f46af1cc8d29b0fee76ea7330dadf3357205072914e8527a2005c3a5742011d425052c4f4032cfe63e2dc6979721f +A = -d4380318e4979625de8ee8e1dbfcf3af06ea830f8989464637421c10a45eeaede28334a7467955df1d47bcb5ddd6d1cc654d34d88259623b332d2df856942ca9934148ae7629bd0032e35edaae1f1cbd0686b65712d69eefb8f835e585e89da56c504b04413a65b938909423e5bd8e9da84c88b6c72d8b6f1ac5cfdf1c2e3497a7beb351a289f74b983e57c42a5bd8083841d274d2a9490522dd524d25c1a8158efbd484bfac557dcbdc1caf0406fffb954729ac340f235464a2d06b4ae2458b5876e75d +M = 58fa10d06826d83b2aafd5c6779a8a37a010a2552350b17620e61144ae708cdd575a827afeb0fcb334bf5d9a5be9fac480122a1e7c991c4b09fa583994 + +ModInv = 17c56feb25c059b5a74c9e6bf96b2137fd199943ae610e88cb95492f4b9d6ed3f04e3afdc8cee71e565d7fa3ce27d864beed38f5bbc61866f8b26f39 +A = f5647a765b9b7cf5592a12bd9e1c2937b71cdc4deeebea0f0c51187806cf5d1f072fbb3e3d051b361d15ab2c254a416f9a79657ae9c69e5d30d284f04ba8ac51f95f837fded9d6cb2fb1657c3059633940027fcba36f6146236b566427a9b6114d6eba71b53ebcadf7a058894efc90a80d7d43aa9199db2d81bacfcbc6c74af3e63d4239ac8b4d4c87e0bc150ffd3ac9491cee1dbc8ad8d88b4b54d6428bdfa4608985b39833ccca887d67fa4c0c83beaeac31866bfa0af28791392ea744ea2f2e6337585 +M = 425a1e8334b23ba27968654d6eb7bc7978ec5d093222321a50652a57e144b6e72a3e7cdf3dd5bdcbd92e7f98321f6ba24c5bfb5a069420200d6053ee + +ModInv = 7678f982f3c68dfcdd9d2155f07f6729f7a396d33806ef579f3671b36684a4a35afb2b9ba0c9e599fbabeef04c0ca11a1b1571ca69b3af5b701b6ada +A = 16835acd2b7a28e0ae12dc8f8792239371a7b4e85125a5e88f00f10c3bbb5426b43f6faa44e55ca6a47ba3e63adcdc6123260b9e65a88c3d4abd0596493581e4d5dd087046c82daa2fa3a9e49c9d1b361d226c3a3ff612b2ab68b29b23f965e8babcc01c1444d502c54e873f8753b65a5ee63d0e2075e51b5f50010bff7579ed48cc63e83ac00242372fc605ef1a01103e08074811499eaed7c96f3180942587a631153a98a6b1f4140b4eb2286b587641539317293074ce01641329f363db1079b68190cb +M = 8c5470390ad125ede30eaeb64d9fa8dfec9434f8e1119a22e566b828ae77befb69c8ceec2a3c20054f5924232f8e4703cf640f2000fba50bf76878e1 + +ModInv = 1637d18384a24aef645270d26353a3714d014e723d40729532fb1fbdfbde531f412b288c062a0fd2e4be9aa9483fdad2830c178e4b88dc788b2ae5bf +A = 90b0fe371344c2d17593028b7fb01191c4a9a1baa3444afa4c9816b12705c4ab3db1f6341149ea4fe12d8ae12cebfe883edc1ab0e3ed388373651281b5fc4be3774cdbe422636a14e1b79b838407b0f062aa0334b0ef9167e2636290135e598ae7687927a10704d213d6656d3fcf477e1dde1a88bc9a78c0574cc44590cb5b881c28ce333385d5888da56fa3b707aa6a8980558dcbcaa5d954000d96cee7b641dfb4f2cbb7c1f63f1ffc36967859b694b93f2cddf5b36f136b8e5927520eecba3213f95789 +M = 1682b41f016ec4c10977e06d5c1358f5ebf8eba447186ea8fb4fdc34c0ec000266f16fa0faa6ada5ad75ee68454f44b9a2cd5bcc4a46c50e33d45796 + +ModInv = e02ae7d074da147e821568d3790b0973b90267ac78059a4716be93d4d99353224090ca9288f0b9bb29565348b8371297e7db0a8340874b6077f6a +A = e037615a5c242e7b73f479e55600672e15a51c3451a44e6e86ef3b0636ad5699ebe6bb73d90c11dad9d92caa6234ba0f3e4a903a6401e56aafa05ddfd366b3cda3cd0f1af00d48b777b93a1407d720a2bc40f08500b374bf44e528d1c1b83a1fb20fc50cb45d369c780c081763e062bc00a5234e58d0ad066f4d0f079d9b3316cabec8bb9d74f8b60bc80e7aa3acda93ec8074f66e2cc5e1699c541a185c5a4dc1f981fb0d6d5b2995c357886458547875e0908364d157b0a136d0aaa6a14f0405a8b247d62c +M = 28410dc475930620256ee8db3b1daf93e721336aa23f9196331e4163fc178f04326f2d752608db04eb9ea6dafebb0bd85544249549de5653075159 + +ModInv = 23d17494fe87398c61dd9d8584a95af48595d1babdcd6c59a0567cd6a84394ea2ad72bb73b68de6e55709269a902a3ef36cea30ae3f26a59e1909a +A = 372c23281e654f7b1e52f3a39ea6ef4254e5767e54cb42700b25d41e6c53c1df9ad3246b9111a61c299b76e7c8d282f630b96e60232016b8ef3098d5c602dbb27ee68600e6452c43cbae51fc295ee8e0ab72d3af093d5bd54e5dd1a46bab3b93240022254940a9eeaae855d0a45eabc4eef45ae41db37d751863ec1e4f358a39dccdb9c5c9baab8a1c12a25d56a588ae797512eb253c88795168c4abd82d22f7b70a158ee185f901eb787a905d052155fd852caf20a25e92b04a85b8884c4aa9d161c86da52d +M = 5736707c5019f0a107813f7c69e3b3b56c8ef47cb42e834b17d16e8ae8dbc6ad20649098752a569ee2dd572da122e2ed7681de481b942b6bee0801 + +ModInv = 16c28a3573eb1ee4d2ffa1612a9071272f47bff03524fd713f2e12184b187b4c54b99f6315ff17f4aa006931f9a8449fd444349ce434d582a6c25b +A = -b0905b55270b94bb4018082c2118b1cac4195b93a3f1b417cdc9e3ad8e3c30d63caeca47e3d3d0dffd96efe92fd65af0d35d01c7902baba66da7bde742a5afeb1e2787eeb573f008cc9b2fe311616c7b4bbbef1b4feb856c1a84bc6825fd9f4ef8e952c34ac280f2bbd03d233d309e782f7b129cbec2c7f18ccbcfbc703cf124d4b1df70a7ca4d30ecc0dc207f0c0e0ab16059723c1e5994cf44d8f739e911a2eab45a5e844457a770417032bdaa7867e9bca18242e7cafef771db095d575d142c3772ef91dd +M = 3e85c0156d96e13c0732bd2dab69c46eab2fdd6fbda76b7739a49d41e669ec76656435ab217ef9e990e155d6460a6e734ebe258b736d53f45b2482 + +ModInv = 794f7aa343d733e02b76eda6727324dec51889a988344cae096673e0a381a657720c22c351b3f4c9acc2b71eb2fee82ee95e2a3c7e65b610888e +A = -c5c3be1246f323875bc421d0b76e82da665ec21cd4a02e3a5a3e6bd3e43244b39ba9139d22e1cd2b44604976c2d331d18a1e942358a9ae2c6a5d2a4a2ff3d6a11c95521472b5075e1025edb0d046152f9c9f8feffa24d9453773579e1c6e8592b6f8c625a0ea07701edc42e0151cb14ca82082828f8e3cabb317638c8dab91b38d37782a552eab3d1f2f23d5da9fe41422c78c1082db3eef5e2f97841aa6b99af25cc1c36b8ef09a59d3661bb340329873bfa7b66d34844b9ef4cf55b7b811ec5e6573d0007b32 +M = 911a2b86b53a0cf24566239e37479860c84510f302e5b3c407962fa81c06370096b98135821b69134b7e6e374507a852dd33fb7ad74a190ca177 + +ModInv = 98d8035c8c7646f12d66b767a740681d92f5a81023d6cded0425beb8d25328a11384ec8c3596fda3702794e896ba70c3690fac6f638d041da37 +A = -53611e61f4aca2538f16608d465677747880890563de5c491cb01483301f1fac98d7f9d140bbf55162f30f4f78525a7df109f7aa7302e13418c338017034f13d097276b2657531eac2e07b680da9021e07b8aeba28e0c311e06ec8ecb632abccd1ea16802e71da43687b56b3c775da60c4c404ae2a62f70e6fcf27647465d5ac692094470fd4aac53a00b0878c5ab4bec5d1fdfe2724b4d863ef60d961c3002d6ea8d444d5d3b678b909517c0218b60538aa35ef8a4eb1a8ab2a0bdb680073511d2f42997e44f4 +M = af6c6880ba43fa8a59bab7dde03c321a7fe8cc2d14d23496198e1a1e605ce034854d90abc5da210e0dbc73ea2a2b9812ba20b2b5765e7ec31d0f + +ModInv = ac4ba2464d5032ea9a29931e8ce50b8f0cf658e722564c7f483f42d8372edd15dadba1f14ffd0e74801f0067914e1e03546858012e09daf42083 +A = ce59217dd708b9e3ec44bbf3e225bd16b6ebcc8a1f54c01a0701f78f0763b2f8bee02f93244624191ef0efa6168457e9341fa76d3363a2add46442bd5b837d5f27574b1741b523345c100998eb43952ad958663ef852cb97e95f11b3b971e7363e443b270c86e51a0fc5045f6c25cae9eda3fd450a2eb78c0552de014c9ef1ec4cc937ef77e499b5a164d2c9db146c8d08e5b921cc7e029eb931797e4b363b1914fb4639c2df4e7110cae4231a0bfb6385a26f59849e69118d118c22316943d0c7429e5f2668eb +M = e172cfac990d42b51c92078cd0e14020a1510f7f72a9e6ea8c62c72f74e234cf87a4921ffd31cc1fdf5854626f9d457b25092ef42f42f950fda8 + +ModInv = 9a2692cd68ce8f37ea53638a2c6bad3545a4a2dc75c353e9011832ab6b22a721e76cfaf8fa04a485da9317f169865a10ec19aab2057278f0b +A = -82e79fe07947983e0784e09f7564248dfa97557cc9d92b8f59f151ce2ff1d0e1075ab284d26c908f261573182f1256b9689863b56e43a5b0b4730cc29a7c37b8f2978d4b4fa389ae05d2b453117c1954cff11cab6374841a52e54f541de7bc546b95bfa9770eb15208368e61482e8a07dac153219188d5b3c7660073427309f08e0a2ddf3309817ffdeff98e775e700074758fbc2114d1079eeeb79f7a4d9e5a9d7feb6595abd57318828fd85914c47706b1abe43fddcd01bd93022133ae5897d14c2a8c5f025115 +M = 475cdb4cfbc7b0f83ebf3716949b9ffbd114fd4b431748686cf87c677584d8c605a35a24a2bb3ce0bc1953b4546f90d485aa85d37bc4466cbe + +ModInv = 71c4258e4fd55ad36713bbab4a78f14d758263cdaa85d7449f31a97029094d6625eac296cd8016a102e7ab98343252f6cd5b66037c5fdb12b4 +A = -7f69b13848931e63c7c5bac64a74de424e894a53c92017514b16a9ce44a054e2b821ac8d7152cbdab4191cd7e48aa95c71972ed7447ebb7120a1e5fc56a32b5ec11d50c21f50968ccd9be1e3241f538ea74b40f9f648968db9130f49c2cfcb1a15f396d2f768f284336f5c97a83f57b350f5c9a172abf8541b10924316cf43441a3b47407c8da7471154888d283b134ac9da76c67125d7506e81fef5a742738310a7ba34675be7467e39e4ab178ad146c698e5265063275eaf8a3b9aa8fad86a1b2b2a676e0c26fa +M = 96988ae6251226d62340f31640c094d96ac524422e5216220797823c8a07686b402f38cb475736f708c00498091ea91850c0c343ce6e7818f5 + +ModInv = 1cf417d205d553ecf1b0375bf823c1b65a6bdb22adba7f094cd5e278b9a14bfa8ec8b3b9379920962e23156a45dc4e4b0814455a5b4c67a0ff +A = c3791aedfcc84bf440680b0a2da405110401412287c0fbe70396f02b3aaf607befe9db64911248b9d0a3e4da29c72c417f3a671690f06679c85ce5f82e1a5f6c9ab731b901f5971f183b37857657520da428cad85a504fdff3aeeed8dbacd06ceb6cf9ab0434b0a2b22f912ff3c1b783ae4a32c56fe6fa82d18862ab8b5fd6090d4440d77262927eb6b0a059176f97df3867764ea016391348d7849a48cd9acaa19c94c2edba265f7fd9fdb71376940109e118a5293e841dd1f89572e722fd888b91e19be1df01af +M = 9d96f84a6f545ace2391bdfebfdaa783abf0cf07977387838fd5da00fa94699ad882c90061caedc6f3ceea78360b3c782fd7ac7e489ffd4dfa + +ModInv = 86aa0a1b939f613e323b1ad1abdde2fec234d2e774b0e65c8461853e558c8bd3cc8cad715e846c8b9e342a231205bd3c6bacb72b9f89ad43 +A = b77d4a33714ddcea8fe0ba8cb8841bcf2362c834745982d13b87d9547935e4cd672006b010e0eab8bcdce25e10c7a912284fd31e960e0a2b2818621d07ef6e9f414e4347ea78af47c222d23d3c47d8b0b174145bbc5539aa3750df73c264d6130c44833666f545ce81ff62131b58963bd68e0ac236360dce3f5153e62987151dfccf7c390c84ab54d85668d940c8cd0044c9b262e2b16efe24fde78f809d4e7bfe9baa8734689b0a6b649bd8150c4062573d2c553ba77a079a7a24ba584f08b20044ce6c08cecf8807 +M = ca3a8762aaa5d3c3599f746987c31c85e5be8bc02772ffea21e199931141c1d8d6ecf81da68ba9f34d48931c8d02d5cd07f432e162f79c82 + +ModInv = 6d643b9578748aaad9c59877eff363d3ecfbb87ca3c919699543b4072615c182e5634a542f152f1d15c86c3f50a5f059920d13b19388aa +A = -c612199710ccf0caaa187b8cf5269401461e189f9528d2c959d5c7abe52bbce8c6da7e3053c5f55cd6a5360ea305dac22376d84d6d70262f03346b5575461976d077b7e5f880552073d45d26001f098c461e6d697bd40b629ebbd767b7c0b92571a24a1fd7949eb6e603e075b1dfd69aab4cb93de5b05f601bebe51d89d9089f912d7da7e8d3ec4871b6333c58c238104d2d6f5f775f6d930679e26776efbf3decc4163644f4529457e5162bbd5b2fabb0495eb4d0c28d1e252a5df0862899f0ee89e46c216d2e032975 +M = a7477cedb8a4755a9b488c6f07b2e66a82479aa0ee75eebbcdf1b1b8e2980ac9e9b2424a9a1e30e9560543e4ed35d11cdbc29de61a60f1 + +ModInv = 2d269f12a2e663a307592e9706a7227627f68cafeded174d44ad6ce5de3b722f7db20398dec61c7e14b9690e42d4b85fd8e2a6dac6cd7f +A = -d9ed971303eed0b85175f2114f963bce2f2e0689059abc0e7f2675a6a95e085b54e85a2289c3ef5c6a053e57db59305cac84e6997b385fe5619a287427a8357143ac8d4e51140b8007a8018e586a293e6c43fc7a8e249b50964aa3bde2d9da9fb35aaed7351c9e0be7142a5a0f1cdacd808457e96ca11170dce0f3343aba7ffa6287b9988523a3ec53b13374749beddddc398293cd199892d1247df02fbfcb9a3fbab9924e868a4b0c49e0267d572cf541b7177839393fe3467bb16f7aaa6f7b8a83e3e64e3df881cf91 +M = 9e9d1cfeacb1a1c13021219f974a8f5d7b6f476b52930831c27e861b01a12531817b6c6493509789c1f753204b19b1418915e04059b110 + +ModInv = 440a0d12c58d62513262e335900aa50d890a536abdf915105cb3549cffd782541c6a11c95550a22cba5d5c6b73982362a621df96a76f0 +A = 296f1c7af42ae7fb4aa636aed224b6990e57c9f57459b9cfb865673401cf89ee571e8df5e56671cf4f091bfe36c7c4c64ea1b5e1734394d6fae40ec7c91bdb383f63665c7ad544dec22348ab7b79b2ddb262680eea0fb02ed0b95ebeb9bdaf2a58200f1676483aeb8aa97a1091794bcd48644b26d1ea797115af460ad2e890e5033b9296b3e7513c2d7b2d0ed44dff518f92e2ad78ae04ceef547581752e0e418883c5548f8ca493027a89ab678def34ee9254e099ca209700b1675e466fa2ce3c51f5221d914af7a6a8 +M = 44b7945b3b280d86eaa4772f7581fc0fa83319d20bb5779ed7922c072261a1461d35a9d77a609e21fb2b79968094c86b2e4d0c7f26577d + +ModInv = 14088de6af6c14fe133152e6128efd6e9c077cb9d09641b72e8b806f23e20bedc38fd73ad347f59b65a6de28666c411549389cbfe3f +A = 3b5db1efd267bd215cbaa046bd6235812a4f6022e8a60bc3415d9df837d0db6a8de724318bae2d4fbea8a2eccaddfeb5b5388d19ded6f73a08f44a89e5287397289a1184a17143f9cdb29b28eaffe2af65dc7c89ed9a268e271e6dfd82d796949181cc29d49d78787722c39908685763248e86b845c14c758e2540a1762c093024e6a8bf6e93c6edb5acbc5b94aa86b6859794b098ce7b74d9cbe55d21c5fd53fdf7db24b1243c50c49277dc465a1a29a976b14b965b90926116034839921422ef519f5d7a1208900fce69 +M = 194c6c8a7d260d093dda10b3d2f1031ae9dc0ac0c840a7b18273e855ad908805e4913bbdb546889f0f0c79f97664efc811841085781 + +ModInv = 663dc9c1aaf679d9860dd01f2902f5325c9f82dcf9291b537c968a8268711aacbe359cb6874c3c9b3b263296af56039eeec34b76badd +A = d19d0f90022442556013f63674055571a4b89ecd69173e4cb118cc97aa77747ea2edd76f34c91937974b48e3b900a68be7fb76890ebf3b5176e0836f649100473fa5c5f80db1272e22d7ae7d0a12ee4c3cc8578210b9e18532a9a1c11235f889329bcbb935e02adef0dea0306205472969578af7ff6745ee6b642ddfeb900daad26cb0e7af07d2b931d6a756b5418133d9bc3ce2875df4e245847add96fb99a8d77b5fade58dec3eefb9734530b0d8cc6fdb75f1e471c93ef981a8a85850c1adcbcd3b7de9b89dd7793eae +M = b620c37149474f01fea7db192023bee4196a7c586732920e44ddb021ab1772497f9a0c3f0b14e3ba09bd3af558328eea20578fb19df9 + +ModInv = 37eb0c51bd72e1e24ae66b036d44135cf04baaf82d8449c021e21df0e76e955770623ea35dd2d2c09cb8a9be64bb40fb98510340c8b1 +A = 90e6ed87a45b88de3f1cd2cfb07df8ff16073dd68ee01a535a42668a224f17b0de09b97cdd4350e69a7dc8ae1071b128fd4e6a140dfe5f5d27ce3a6dcc272e1ab2693847a5f71dd70d8129ea3fdebbac984ead7a0096f5a45ee906d7de99957b4c2c7d38af330e913efc6ef77c84645998f0e694c8b682b54ff58be11712bfc64a010a975f01722bfb201f78342b3abf9a8e1e5b0a81cbb7f2b317120ae44c5f4582615f7269a11bef7c25672dc75c90705d99eb9552ecefa012814d5195531494d45def45305db10cdb08 +M = 3b39d34dcfd5bb88d52ab361240b63db8af81e588c957df2a569e26bcfeb7d16b7add73219408b7accef93f958b8f62975bc97a7fd7d + +ModInv = 13c2804b085f11cd9687e8fa22bfe6425513b0c7680bda568bef1e4ca2be1dc17c15b9190722cf02672e7f09dfc5813975c0d4fbf +A = cc08f11da9916ec1385ee45783a6b9e6ed81d2e13358127015a4949f67d163e6216a1ae3453332867432bea7ca10e0c426fa791c35c9a53f59398084790fbe63016a2b017cf32c318aba8bf0c508e973445540f5c5734fbaedca592991278bb2859647f9323e5c04da2321f24cf9dd3f7de0c2ac14add6ca178ed5029912ffa54ae777a11d08b86720aca521d0db82374d876864f6c09538c9b1a81b3e4cbc4f5cf8e7d88084cee8518067b6818a695b89e826ef3262f8514c90733d7bca5cc902900f33f8ef52e83f46c84d +M = 6e1821b140f07963234d9556ab1c1aea4c659da31421bd224c041d59996a6bfad8f36286ab6b31de18e3a9df45aa129bb7b8d5defa + +ModInv = 79ddce7af1ff805c8f191caf34eecc9669c450b3c725786bed6f82d6223fe8a3be22727d63601bf9b9cb7f29a7dda562a077531351 +A = b7525ecf33d77ebc6669188beb22ed5e278682cbb9fa164017a92509e8c2ebfd8a0a42f424f2678eff4ca721e04b71506d0af94b7007e26e5a084ba42e4f806a84e7cdc584251b2ff395fa977ef67f9dea6560abe0f77f95a4a82887e1cc7a8423a8ea2f151a04b2bdf7c4ca103cb11f0574c1414b4e6dea464769f4890669b080cfeb98ec49eebf309b8f1ab156706e64257f74bae5ca1cf5d8b6df5f97b3d026930aa835ac8cbe752212fff21f719e4ddcc28faad192c4527d59558cfb2687c6f640f84087b62f53b85d61 +M = b3602c086f5cee6e359c78353fa47cbc79f62b35e852f9f94f715875e52eb69fb956e29cd3491a57e9c7bddc3dbe6fbb7bfb80ca10 + +ModInv = 19570b41d4ae19acd0adbf67d08a8ae4201940c8be8e0e3b0f9b457aec4e50ab00b523cd5b333a09ae99ef9c47ca9adc4128719919 +A = eb30131004d9178c4c0fe78394e678b2104d2cadec7512efd127730b095d6978d8dc8f760f6e716071d71f38cdd2ec97f67713cddaf812a1cacb74f34d3163dd6422936a5ba959933ee2ea8ce3a967b98b8a2e004dca32dc7d589c249068def49ee9b67ce11dc378785ef914e7a0fce31148c758a9095b0830e18ec7a57d66ade35cbb61cb8eec62ed167e6f760bc9d1787a6011c6bc9cebe3f7d81b8cb4bc0b00a8ee235fc392f9ed9387b61e7026df4e3aa8b88267c471a99e1d27204b1806219f4b822a4a067251397fa1 +M = 9fe710096634633ee52b5a16bae8966ddcb5968fb57321c26cad6fec523a797855d5312b3f786cb7e50e3b78b7ed3def03a4085bae + +ModInv = 11c25c08e65de46270f30ba6c3770bdb657fa0249a06c6ac886dd1d9a4424b83bffeaa1864d9d79746b00477f77338493522c159 +A = -b0ef5e4684fbff7fc0e2259d150383ffcfff4f2c3bc54e80580c11f90c361191ad1a75c0b1a495d752abf0daaf4028d17ea54166906bef8007fb2c74b3046c9830796ebdf77956dc753397f93f2f590e370900e6a4bb12795114231e9247dd20dcf08acd3ea8ed72ddc7eec50255239f25c181f3212bb0b668845a271c9d0d066c52c03891601896b2b0fea977fd1ba2744dcb4f047c568455544807ebfa53550b5a4e5b1fb8eda67efb11b04e6d68b86e2d2eb7e2058b0b8ad5f8b7ac216bf1319ee72b44f467e44132fcb577 +M = aabbe60e7da6d7b9ac478fc2a23b2de3a92cc168e194f0a86fd63afaed7bbe42a6f7575bd83926a5cd36fcba44a4d0b2e755b6ca + +ModInv = 6bdf650525156016ab4784af2c6c82ebb7df0c311fe2f7658262525ea95ff46f01175eaf266912d27c6cbeca88364c2880a0986f +A = -a89d61c89261c42839ba2a5f46003f5c17038925a8b0d4d0c1eebfc4a91e3be4c4ec7ef67b9593eed84ed679e5fcefe96daa5a802f481add3ca3b1f6fb38af05ea3a2635265d9327c729e2b7831df1034f52e611c1cf3713ad61fbc09b9fad9f3ec0b2eb8f5bba0e5d0c458b6e0f401a4926118b8426ff1842fd59e88b9c2a917dd6765d78a229752da46e43d271a37449814acffa71fe1a2b1c9794955e601d404d0ee8f684cf5c65a23d086b9c50d8a6e2756e9afb5f6506df43edfc7b6e7283b31c8efb654f07a08af59c91 +M = 943d1cc6bf47045d0500ba9fe478e70c7001d3498e18331891034d0ec054107ad46c11ccda2021828ea2e13291497b8829cd7760 + +ModInv = 38a1b0c2b9611d7992bfc995d600f36424861355e3e461da7c05ef20c7a3843af8f6fde924b3be27ab738e9dc4c6cca02999e45 +A = 3fc143134bc33bf9abf3f659f59d81c4f1948a8b46793813fd99d1092859de8ef5b93cdce8b6f5630cf86ba2f84c9dacd95c8e536bc89cf635563cf6c8c72b3a7ea91d223b3f66a72e0c1b7c8c1519a9d5211cac2d978989c67adcd267873c3f53e02f09c279cfcb5f0003bfc34887c9ebc4d0d34d183af1e8a5e7b546e5c0c467cd3e0fb57fe4785ca5364ccdc50dbe0e0a30586072b1a7dd36426699efab0b3e5289724808f8dd2fc04b99775ca0c0a1cd906db14fb68349c02bc0030131b5e46adb1eae198c7377c1ff2ac7 +M = 89fb8161f0979fa2479899c28034952d4c50bf55c8bd5962ed11b6d703fdc3e8110ccd7014e6bd85a83e5c4a28676b84020e7142 + +ModInv = 3b966271b38ba74adde6bedc7656472ef2979457f1537a0a217650508c95daec9a2442adc05b4d2db8719050c106b9d5f2b847 +A = edb7bf613bb79d06bc6ca3d13d1b986d8f8592eee88d50c19d7046817c07b2076783822ab002f46ab3f2ea12b008095f045ae0a884b62613639390912c9a9d35f78f1677a901e4a25fa27904bcb0b3f106599490fdb4d5e751f9c33cecd3a54deccc1255f4e9215c39070f8d84803f5e77689ceedc8ff2c23f3048dd82025a17010822fc72ca61ae8895b03c9fd6810e31c99c73bd7f85a85a3c7733594b94c889df9a2596ea73514cb4bf37613b0491da8d723eddcccdb9d7e6c445bd2fb95b35fc6288031a5f658833cb20f9e7 +M = e954a8fcf0dc768708365a14b9406bae4538949ab2ab66f88e28cddc3fb5ba871eefe8ba811b962b0f769b00d18a594590e030 + +ModInv = 7f4c23247c5990700182703f99dc415471421c3130434ff594768d875978470fbf3924f40a1caf45c495f40c6e9f50f4eb2891 +A = -e7a3d621d6ea258004ec907584837b37be2baa39ac3a73aacd1624553011aa13886a6228aa4a78c21d21e494c670887c2a2df25b9bfaae9eeee6083d6ec54b6768c1c457351a4be35c122189f5ce964b7c1b13111fbc087f1de41fb8668a21563e94450617a268174b40c0c932b6259d72faf4c3cc199194f3042801dbde2a1dcafbddb9a28a8458a9e42648c73aa695f519913574db0a1bfaf7a25457757912df2d9bf24797d044a03a78289980dea6007a0cfbc0ad6f1dae102519656d3ad71c5f6710fae5b8dcf703f15722b5 +M = cc493ebf1105b55510922aba3550da4267229f36806809288aff32a3eec0f94bfe61581b5dba88bf32f81beef86b384e43c946 + +ModInv = 965b0e580dd3f389a5953a87af7fb9185b1d07178d1a9fdc05be4c5fd464bbbecd041c3d3b892767472462f596964272577 +A = cafa18857bd75183136ab8cdbeb189e3089b9e96c7f2dd957fc8d9ec34b711e012c1c8be8a3fb9818e5939acea932adf8a2851ee3f22cb8cc81b3bd3ab88f10cf326ea7a8a5b89980bc3f7e2cbdab10f3d6c2dc53dd6cf7422140249dead5937fc3a8433d8fc34dcfe2d010000f5b753e098ad81fa243679406547d5193d49b697cdb7206cad649557b3868426be9909f24fccc94f420846c152990125038a99675e9393e431911781b7a31e154c48cd8b1dcea033734be9f75e39886cd7a06f4bd1d1784578bac6dab05b03d73187 +M = bd85143372679151b415c9ec742f37e0984cbf24942c9a3f2b9012a25af0272243e30aa0349c7a3cd49d58592ce49e115a4 + +ModInv = bb64c5b63e86e4a7565ca2b7b31b70bebf4795f57b52ae275a87151a669982395a32415f84cc7d82ad01a2dd238edd092c05 +A = d1c14eda607c8d5301b154b3c917047478b899e469954fb5d7de81dc3e8eb23dcf56032ad1f9fae63910eff578f24c86806baa7ca7f67d5b8a7701bc82a8339206ada0601d5966a6a3a0ad530727ffcfd04124a02845d4777cf0afcc9fa2bbda34f81283786c5795a63142840219275941a7c643bd63320e0398214ad10fa1dbe78738bc57643c1adcab1c5cb16a4f5f8008c93fb163b9fcb89aa505d5a7684cdad7d9e41206bc263394d0f570ab4983b47c9cbbf901b55cbe968de588e60f60da25b1590cf83d0ffcff597adfd36d +M = dc00f82280ebc6b84b841b7b69ae9668415593491c1eaaec19bf1af710ccbc07cf282381a95bec951045ea7bf808a99ab7ae + +ModInv = 99a543302c9772b098e02931ce86a18e80e656c77d1ddc280e2eae1313ee9ccf5ceb4afd91f5ead91be7a71e92a53ef1e9 +A = 1325825fe645b22333f1abd16dbd59dadc471a4d732e3f9ca2fe1e72cc2d0e2cb94b480645aa7b049791a7edb3eb25103d1661c51ee04aa0f2cf51f0966039b7dacf7bf27422089f6145fb0f4715788e1cbc25f8d35f67cfd77e90168d6bacf677818e5a2817a7e879b5cdfe881ab208d4722db098eb0e0bf654817ba733495a795262659aca1810b30e541a0a7efbcfc4a6a16e66845295c509aea23e9b7b7ca3161bb3e2c426bc3cefc0b9d567f11185f9a04c9a5eb6278201316c7c89602de37ac17dcc7a33ffba9761f1f7fbada7 +M = c23917daa34cea02e73557fc44d8394b92c3a2d265344ee02988a5cb3de84b49c9d2135010499e8eb1eba6ad174b10dd12 + +ModInv = 5f7398a90bd096837d5116021a9983fa535fc18e45e487d2ef1bd49bd312492d8c78b635b2096a66dff64931f0af2acf73 +A = -f907b4f1e622345a61936329591a8b56762d86d89babe531e2c8e8ffd2ef1493b181bfc28b282461ab8257f39a12899684b93086430f76478fda6884bc7b4dfa309210b43d360e470b0245dcb53956cbfa6efdaa14515b64bab6a02f68d1e7d8334f16b35edf25b732fa9c4e3d0508427f95af5c449c07996c9d489639576a0b27c8d700469bcfcaacabd1655ff75a84860e9e0ebcc2870d44b6a77a5450dbd92008f4a59db0d9302d3d0ed868e388c3565595d5c0bfa87b5b4f646ddbefa5f6fc969a3373797831b5a617ffce26c5bd +M = 7102aeac44ec6827e1bda2629d9b0959bdf53cbe90ca31c6499d71ec076bd54a98541ad3d649c1f087cb2431f996f63ad6 + +ModInv = 1fbe4fdd51aba4d6622075a9f0980e6c87d5a9a15743e8963a7c94f637ac6523e01803c13422d3a2d512bf0baf175e8b +A = -538d5eb68d8a960e15b549c2e53c1e4cf45c7a5b602c3d13f890c140983195a7d8e327012dd5ab9329fa14ccca474b84e7139a71c44f7c359eab863b22420ddede0178e5f05264083d370d62c044f77542331b1bfb80d7af682f9147feb8eeb77c3ae74ddf8c2c39814a06c0917b12ab15531876c3ce64f47e5d3b7d2d847ea4a9906536aee1ad0f6f52ec60f1722c3c12d868481418d360a76375137fa416d6d2c00f965a16e2932a04e214c0a02ed0110683437f98cfcd2245733fcb15328e31b23fa5d30f7f53d3735ae5ca89b1c6fd +M = 40f353a3047ae8a4a859fe80d322c1f24c6c32a76f845e9c73c2204a3219a1a021cd94f1a1bbdc34774bb62f36953860 + +ModInv = 2ef2cb54bd96448e8ca4b8a433c80ac4a8c1b1decef0390205d301b572db014b89b41dbaffc7633c06051af50fd1fc5 +A = 56ea6c8bd6337616bb388bc9e25def7b190426860c4662d4073b47a54c89ec6473e3f3a02b54de3a7c8bf8fb1379b294a9a8ff2453fb87a9e8da2fbd86aa2ab0978a24cefcdbb95908f3c646ced9d7394de62268a83d79309a99f9f35a79386abb1585db372ded647cc52f63df25070ded9f8c38435926a304e416e70e4161d80e7849be48a942d2dde09f7f31a4ab86a558a18b748ea489503d655a945a61342f32db0faeffd864fb00f35205c500df48a2ec066072a13733a59b87a8aec0296ad9a1044c1df4cefdc5fe7928e02b249 +M = 246a66515ed76dd216f19edf1a9dc595c45607a66c64dc2d72bf22ea88337db140de400bf16ed3a474cfe0377b7f35bc + +ModInv = 1d34950c704cdb9e2b03276ffad760ac2ed52fe109b62878b4105eeb50c3c73b649b65dd92bbd5790d746f245fa3d9 +A = 4401681e4988faa1b41e31323c6e51254ddc0404cd522f8afc785b5aa5f197d1e52f485f8a17856ec0a350dba6f7b49ea9a532e5881b9b4c795bfea7f304fea01b78b1bbad1fa84c249eabac907d3bd2e1307af8848a67f2098d8d11f6bb582089e615927077af7d0983e674c95434d3fd077adbf9cd1659ef444ed1c61c6d0c07a553676945b3f89ae6aa3c07bbf2976f46e4dc49e8b333ea969d0aed9112f38a01577a2d7df41de5a114c4707a8492c62d04875d5b0850c1f3c098e0748817b4a981f60a4c34bd1dc8483082f889a01129 +M = 4fcaf1ebc474b55d8e183eaaa9ab4d7ec12108e909a16fad1e56f50e1443732637d1afc91e9b1a57eaef5f43aecbe2 + +ModInv = 833710a57d907afa63e61713167daa02d3d6c249bd404b52e1dc6c1bdb577268a98105501cf8b0bf1c870b8c44b157 +A = 2792fd1f8dae7e870b6e751eb7b9b82c9bd945da4467afabd7501ea07e1f045d3532bd84a32aa48c422ade679d566ff8801a3ee38c53ae67c74b26a4a0d6404c7a7140c9572626007a4dc933063fe36fc0b2f3234388157681e22818daaa88e80865adf207753024aa61f9bc125caaa6220c4a49ac4cc5572c4794111cc4aca1e83aaba7c97d3d77a386957497f48218165ebf3e40bf6e945622dc6d30f27a8f275bac2c75cb232d77cb263ee5ba64d1c6afbc0fe8d921103ecfb46bf40ba60e8f3dd37311825d24b7c514e4246e4db73e0f +M = c9adfd441473011f923e1de8a4408bbe463887133db5d4e5cd290b80e0a0a003337e1af07b248bdcde680c2048cb28 + +ModInv = 19e9b329b15a433379ffbd0c6222580ec2eb3c1b5b7ed731618c4d8b67b8fb2c84a6bc6b11da4cae127177bb575025 +A = 54cd2eb2e97193cb5a9175b97442571cf6a6b353de8bf24f736438a78031e06a4e83b6c95c12a9fe6c8a246f32a069d69618010900fee09ad8ca58594ec7a0643109114aafa891fc515b4891417580032027b4d719d840284268b1547099f2d26a70af9eeacb37d7dccbb1b86169370a8d8c46b37ad87570cd627398b4a0a3692f62b4793306f52e896ac920c347bddcac694f40d2df093851631aa51be46777ee49a491b7437a2a961a2652c226eccb93f32cc710eb5f91d2a92b1ca916a4bddd081eb6a3e858b6d3f5d30a5586d4135a0d +M = 64d457275ce0dbf2bacbe5c8dccb29ffbaf937a3fff941eaa34d7fb5c8e2245bc2b16ff8639f82f7693c2c2841a1e0 + +ModInv = 4f919efae42ebc93cb4b59cd2499a12dd86f21f2de66c15516de27f0f1a064b9e5c34599954f6ff640c974f123f5 +A = -433df0bd804efab712271aac3ac4a320e421fea41555cf72f77a7c77494c52ab9fe4ebcac85ce8c57a8574c4f308afe5eeb01c91c0ca75ec6985f0df5cbadfdba714daa8713f951ed754c1385f38cf7f0afa53f168b0da2e30fc72e464d9071101c5b910ee606e33cdb7a4ca839eb009e676a9f3ac3ce1d11246fca468080fd2b70236611f31fa6709fcda9a8ae9112932eb91cee5e0cc41b3d2dddad87655e2a556e123335c67d485a3381cca8a7cbc3650eaf6c3b2f59aa26d6125a226640c24540d9e882ba8d6ed7c29eb8c403c452c3813 +M = 6013ab765ce5f02967d58f13664f938bb53960f99c9f481e4d9fb24119d66411b5952ec922a9d1a55985e2dfd138 + +ModInv = 6064b042ed73d084170a2bdeba3eb4c44960e72214a24f86233b376158f6b6aa6141c52c098a8359e4f26e8f1e0b +A = a640af8399962114dcb3732c880f23fc06a298fcdbb8ba62d2d565d90ec81c89c8a3837e5fccca6643cab2afc81c1db35527dd8257562059a6a5a2f5aa8b64337df08a0979ae27854cd68d7ab3ee96d4f1cb5dbd6f46e1e95ad0ef3bc51b71b1864dd24159bee5bca6616a9b990f1f2fdd316c657f09953056e9f594a68e1dd33c82fc41ba910b85c81f8ed690d8a4f048d38fbd3ade976338b383ef1cad3d8bd68adcceda4342f2f24dacb8f14a3d57d89e84de8572fda1a517cc3a7802a347fe2bb8d0ff9a8ee298b2cfcbae55315b752b87 +M = 75e7422d2398433da0070832ff78f198a93069bd6b0f1b96b98f570cc7369920aabe7462b4c5f2e162de19e7f12c + +ModInv = 24ae43a70776c9175a5c8eec402d14dec0d1b9ab351140246b456ae0afa4f5d52b2d73442ddd7c3087996cb289 +A = -f04c3795e044faf1d054ed40132bc559a6c09856b6a1f001ffca9ba88e7078d4f1f621b54e7ad003b403d16f71980fec3578d1d2488eab3962bb59dfccc7258b4f44230be4e6de11e3e748d9ca824d2e121544a88de4f8a4ff8c7ed0706f610da77b0f3a25c84aa1d84ef2274f32aa21fda320ccae8971f5e8e5d7140c1dd3fb75831b7b2c6c3796965a00e2921a286e5622908db6e96464f6968d1780eb54929167ab9ea8d37b242b3496ed0ce48bab0a32eb8a788ee25f8ad609fb8657455ed67bf832e1ad3a3c250e6e754c76457dba885c1c +M = 6421c28b78fa1cd8766e4c20502e989bda78a69f22e86aab558335ab6f4d0cb10510b86e43d01ce8df171799c5 + +ModInv = 109b43fc8e1c8887c831953dcd2e4c81c94b935cd8cd2d8c20ce514cb62b05618314445d7522f58499c599a0de +A = c549733ebf7a12b5df904c43068b98df7235e01e8a462372be1ab22faaa55c0e1a848c52ec7c166a47b28434826630f58d96b09f71b9fce8d84afb15b0392a21b0a904a94238e1747dceff2bded60ffd43d1d7e366c3b8ee01510b9634a3a85ded28268d3f430d551b33f8bce2da36186eff67dd62dd7d59bf8165e8f984989f2accc1fd3289a2c13c07c7377a599458f91bcf0dba372230eb8f6564c6e37aecce44d2388b0597a29c68db4cbc3ea90b7ca3dfc4fa4cfd5b002e7c25902cd8879bee42c4eda2a0d472cc14d78094dd6c1185a56d +M = d6b8f351aeb211764d8646096628de4d20f467930ad0e73ed9e5633c8e944a7b07be5dc1215d71ef2be9285e2b + +ModInv = 9ee4d2940b0561e09359a8b89fab1077de915c50e994cbf0f3fb531d496e848771da6cd8c01739777b7eaa1 +A = e6f9b545a51d2edad26ad9bd60538f14af420ae4d328775f52b1b2a27aa4a21149eb8436ce11d082e95a1e6507a9a887f54588e27a8dffb36a67c18ad8c77c02009a644ef8f99814141cd18b7b0c5330b5a3892626673f4ff9aeafdee41622ba531d41ca5818d2efd3a4272b5bc682225d00326445562c897626bec50cce9ed4df5be1c003dadd074065cdf7861ea3c91fc7a2038b4f70ddee198f3d23a2ed40a1606d881b785c7288cd75cd6a38f7b98ff10fb1bc890c3d7d955c04db01c0a310337f5f18666aa1df30108de7aeafd829075f75c3 +M = f61312a0ad8264b535618fa5bd997689a460a49bdcaaa89ed4e0bedd07c63b5797ec0149af7f0cdd55fef82 + +ModInv = d7867f419e784a7aa54eb192950f179fe7428ec968718c23bfcb264867fdad2aa1bb29ddb36d5622afc86ef +A = -a3eea815d91a570f0f304684097825699346b200d562d4075b1a78c46aae9d81161fc783b21f569930574891d5c847f81a9a022d044faa4c5bce8b4f9f721ce19e77713f7f8ed9396cc849bddb8fc645ef6b7bc1a6fe703257d27d92eaec52805b39e6e23c41f7d783986f845c1b866eb348e5b3883a15cb2b27362db33920bb4e8fa7aa02ef092a5dd3ba4d6977b40f92649dcd320879c4f5bd40ff5e1673532942166e708cb69663d5f56ed31d5bd669cb5ccc2c690379a710f194c2fa5c6d4cd56129613415e49bc6c412e428fd93dc6ab36bf3 +M = 13d8af82053a7764eed260e29a74ad6e900e9f38b6aa53e4b877244ab8f70b4584ee8eb8fc3727bf28a3974a + +ModInv = 157882339e675c22290d0b5b424a24c60be2a9b00f4458b53a97b390ba176e61eb1f352bcb6c7ee1e13353 +A = 3f3effc0d52c74ddca51dfe79af5b09dd226c87a79a487f1ddd685e953609dfeb8087eca206bbacca8b99cbacf55ad2c684f586a9f6779a8b5c37a1cb58b24a10bd28a9d6706d8a077ff6a1a2fef1b39a6f2d6c3829ff08e2c1a309f4337a039ec1f10b71d7319670c8973b622b995431b6808f592a61742781b498fecba9075d15de57db80f93913ed8e11e450f8d4c23e0ebe9f8aa1c2d35303be72fb629bf66e5ff2fc40f21d67ab3695ecc6cb1ada9079e3a88cac2a09206fac44eb8c61041661afd69959a1ce27b3a34a103a918db18869425a1 +M = 3cc865669985d694313f5ed49c74e4dd2680fa9449f6416a3139b417658643bca1175b9dfd318ac94ad4ba + +ModInv = b0b1b22cdd66bb7fecfa4388d2e583b394ba6c1c78b7e06829723eb5544301cc211708a772939720120eb3 +A = a7849b8f6ff8549b93b138e1bc2e486fbd0cf01db60f3219447526050b9c515b54dcc7a6d6e16d4a27b8592fc889ff339fd3145cb011133184e00ef7958dcf08d0206a106c247ea109ed5973d33dbb718fc8eb72ff587c1401491cf4161f921b5648956da99902925adfba555e7a967b50f2aa79100dfecd038b204c29a0af773f58115432305c40d713f08ab25dc03f98b48e9fadade20c14ae6e601b78e7340bee6d4f5663e0dd6f3472e4f43677f6d5cbbdbe482052728c034c5ad3cbcd4f4528013bfebcbbf2cc2b78eebd7996bb7e27737576eb +M = c1deb34c479181c5b7d34fc9c70d5688d9d87bf8de6029583e698dc7e4381589679224ee8692d0430b0fae + +ModInv = 5c4a55bb179360d557ad1493e5b6e8b13faf30f96e9cf4facd95f7fe4035e4477ee3e9eac7517417dcd +A = -94cd4bd33e3f621e2cc8b0aff31c786fa0317937bd64344a803c0557a7eeaa5c32132b64257ae3fffa3c11a258359d293da77c8ec5246a2f91bf6305cd523c3c6f78372e3ac77cb6fd8dde398494e7caed53cae7a2b80d0178dd07c8377e6b5bca9ab46a138ea76e3a11f8e4647f5b5c4e1af0e63894801db7902fe89d2a0f717eaf539c6d751ba063030a74aa2ae9286063a5869bd435e08dd9f655136b0e47accde2b99dbd6317505653c30a925e32be5ca90d60ff579b9b5c0a80053188e2216d3c22dbed572c6f4b577eccabd684b4230bbb65da1b +M = 38b0b5830fdcb9e70acf13a8860e71516a65e5d23c63f4b3074b8437ea64542d9e9754d74a91b6dda708 + +ModInv = 297b98cfce8600f144815d65f239df6d51816db067b0b37d6f584e9888943b6dc8f72bb71c632702c38b +A = e32cc98de33af808f2072436acb6f87e49f0c0422bfea69eb59c0e6ba36ee9a974f62124b0f29c802dcbcd6fefb5a2f328343a9080960093aa44544f2305974a25b0c742283b340c68eeb4aee0e410828f7d4aa59314e25a38c9914ebfb556b476ffc6fc1ca85e20a990bf41dede52b20f94f315d0f6b039f28f088e442ea4831c6042c39ee8a226aa97becff14f87b54cf8a9ced5c32486c9e4d53be4c0faf71996724e9181b40ff7b00d5029873e7bbea94dc645e9b6c40339e0db6cdba3768bd9c35552ef1e18679c95c8de987daf65f2ab4bd28ab +M = 378d56641e9cb6e14d6e08788897562134a6b6cc2ef566882a94d8af16b761237bd9f231f177b470c2bc + +ModInv = e9ce206fbd8cac14e4bb409e5d9d79b4c860d1b419c36c426a8b1e1ac0dbfd85a6627da32e3e08ff0be7 +A = 42d59b0d0676690f96b9d0d22e6f185c8fc1053a406799bc949921aa324ae382437e3b7bbc4d802ce03c1842bf63db15886ab9972dd4ead0bded05ae20b8565af338d5228d733a6d9f6a91aeb1d7d90ccbf7f467797027fcec62d6850aec3eb0c4e3d2566275fce35c733034fca5e5380d01d91a194a0c3ea9bdc885d730eea6ff2d86bf1e06e3724230914444947b07c813f26ed453df5e64680f1f38b474de1e0c5823896eda5d13aef01397ee68727d865957431e20cd70a1ae5905724944827c31892823430438164fded168e76ab0f4f7e1c21ce9 +M = f51c35cf9ad8f3f1c5e0801296e8c65bc39407f93c6e801d0707cbcae7e4ec130984f21da944ba2c5596 + +ModInv = 5246ee5bb9208328138f7cfd7c59a5bce1d7d358693656147d5cd3c02415507566a4da72a5d6a94dd5 +A = 8388b1e2284b6ec914f1f0d7e0b455cf5c09f46fdc4d720ad5b560bd79ed0e54f97705e37ba24cff9355a6b271c40db0467665f30bf8eac5ed239e247e2699594ef465676f4baac7ed91c9ab69924fae5b434e09a57a739d4262e71aca9368c530afb8e7faff96f31dd57475c23b6d971c4fffad5187659d8a37030138be50ff082d047accae109341207cee1985add20e70028c508a565647e693e9f53f2d69146c00d15abed4b14465cba0203e88ed704853f48cc55484b1a9790dca7a153b55ddb5739f186a0df5e5e6d896cfaf327755c0164dd604e9 +M = dbe0da44fc2e2b8dd0192cbb81758e50408910c8c2a2e59c2fff6bf7ca2447b1bf4c2a1f1c66cf319d + +ModInv = 48c3415252bc88e5d47a6746b8c78201f2b15ea5054fe4bb8351be85c3d176ac928eb7f54582779d1 +A = 6f593c5ba79bbf7febcf72c5064888ef4743c7e251b196543af34670f9657d2478cc7b5c3ed2b895031b481e2c0c5df2c1751d8c1b139923cb53105b4fb7f618d3fece490c7e1f94340a5b28994e77235fe5288f35bcf135513d67a8024b43794bff3d7dc241405d924478c290050224c1d38b081ac594a8870a76654c4d9ed1b41ab262f81facb4cbe23b3c3ada6b616c4b6eb46cf363df933063e4f7358ad1aa2562dffa2c7a3a35153ee0ce517c19c9ad9b24df6e62744adbcdcaf9a3f02ffb85cccb4e0cd47d8d64b06c677f492c7ab381ffdf21accd +M = 167d0110067be8a6853444846420614f83425d60144e7e92b02ec3c0a612adaeb322bc87f35c3f0345 + +ModInv = 29743efb6bc20020e5b4a175dfb51dbaff4fac829b92297b67ce20af77408c267ab91b8ed924941e +A = -fa8aadfd1df0f1f9b018f8da8f9b05cb6eb4e5de7ae37d8901d5b072f00d6dd5ec9330771c0e6ed5e8d1df8d6566ebc5283916e9558c79de125a2924909f38afee691cf4fac2e9b677b7b6ba51afee9709bd55a7235ad0c9f7656872f05ed1beca74ff17469d03b22b0178d8907fee0b3d8c726ea7bb15ddffd98a5a5427f1879ae73e8c96d439009befb953313528a32f4945ba70ddfd4745dfb32d3f5cf3ae85851877094acc09f7de35a5bd2eb992870ee492c1aacfdfc62b6eade5752d1ac0805570a9692a15090b834ff6e28391e6a75bb258ff124298 +M = f70709b4ca82f7adf229af7191e824ed9b89d575b9ffdd20e522dae26094a978ec081526d563e8bb + +ModInv = 22debec7e4a6a4c2b8eeccb2235458eeb8f60a17ded110999a5a9093bc4c94420d7e002b13cc63 +A = 461c92a2a4f0fe8589c0748882670f4853665d2a03beb9dfa5f213e7d13c011d1dc9d353215665168800d0e66b631cfa5a36586def5277b193ea5eb2231cf775a1d79c6206d3e16e483c7ce8436261ba04b7411941da9060fea1e80ff943a0d8e8e887e109b196055aa49a399ec5f98f4f7ff7e404658121ed16f7c0341d7ec36f6194decec2ce162283f1f162012fb16006509d0718a84478772f61d6c4d741fb2176a416c6b3ce0df2ab3ea15c19ad01f180ee045904def3a82d17a5de8d870b163008dcee44129642ee301730f0484ff7b19814480463a801 +M = 2c73e2444694a7ed86a1ee2f4fc272e5030621184dfe4b69ba185fd365272876cb47929b2869d2 + +ModInv = 777f5d2881c1a108a244dbd98e96d2cdc48862ee42c5ed9a67adb3caf157f6051b2f21bbe0b3 +A = -9e87f2abba83dc973d7ab98a2797934c4e65ff62fe3b238bee58379a7b5b39c3b56101f3d012c6359ceb42a49a76d7255127d39fa08e68d2e81b702ebfbefadbfe36a70a7ac970eccfe7ff6931fd1f832394b999844edbfab842e58239658aebfd407087718b36bc9a2c5c6af4f027758ff16992b8c9f4675fb746c4a27909e1c8983139554f6ca7cefdf5c8b9494361c5ff495eff77bd4f49f3d16796f679fce6eca48b3c7793ca16c5cf9cece70c35bc18eba9fa2ea2ee75b76bb10e494fbf06aa6b2a753f1f34db377b40454faee88a0fe1e40a9a2864f659 +M = 12bad673cd1a38b4b3c4e1138f6116753d152214fa318d4e03b60a7ae922bfe3c6694f1cf675bd + +ModInv = 1042dd23987247ef0d8b25ae19222366f71bf9d153a3f39afc0884626a5b1620d7914d02f8e7 +A = d1a369b7fe69a59c3250c7e692bdb1a566ab8befd51f9b8cb8907a14240984903d1546fbea11c15a4159671c10622f438a600618334171460688d839cfaf4e70f3a1fff7f447271d05630efcf6045d0345b30e97bd96c8bf9ea1db12b55ab2b2513ed36e0dfba02bc2dfa5ee878d9b4bb282cb7a0b2a365f2ecf3dc4a695aa15897b829a5be475dc4b6c684fa3b443f7d12423b97c675e86b6c4e9ec03d690a63e6f37c2fd8afe9637714a2a963f5fa5010911315ebb8a4ee06f6340272e1e9084d8643263311887618073363fd65a9d5667f871d023304fffe445 +M = 1a370eefc42e10de8da6b025e711d379f72a1a4f0eb6d3400cc93a90d979e16a21a35267e1a5 + +ModInv = 42aabd9378d5c07ab07360be1ad9ad21b84417140e6a449905132aac298d93eb22ce5beec03d +A = -e9bd3e10b0a4edacbfa9f4abdf9b9c3e9aac25ccc9a741fc2b35b0e2e0beb0be6dca6044c875cc2fb7b7e9f004c42050c2d58b97c2c3921e4007f008506610c52bee575f7ece5bbed6b5d24d204d74090680944cf802589999e3ca18e14a3a144ea7d58a344e961e82da2c5d957b1291a65ca433eb425a0aa72c4db6bda5cc6d9ae7f04031c73f9e5adb3b639f19f3f5abcb7dc99976ffccfa660fb41cdcc6b9cfdbbc6db44433f531c1cf6afe9f59fcae0b87983fc809aee740d08fd703d73f90f23bf39a2a094d133635afd65af15d31b2724c644296fc9178af +M = ff3e71ccfe778d4f8ac84dbdbc400338bbf504558474de3a781711963062dc2232c0256393ac + +ModInv = 3103c1f6e3e318e5a8c956cf562643b1e0b688d2b70ef1eb67d3bb273f8d8d1e91fc6dc6213e +A = db09c96676a55b9610a7777e14492b0d601e1afeca90e84e410700b6f2d38cfdde6d5b01fcedee8ba2851672a777606d9e2c5ef5d8d217773dcd15934d3ee4fc7ea57f4c70febf405d8263a6a7b4c59ea1ce6b55ceee4f974130cd0c02c19e9d82403dd38bd71ca5d68c559d9ecc8cd5dd21afe270fd2bab954cb8f3fa41e2cbe3d6bfdde159592c89c7339669d2ce3ee1157cd592247976ea2f873b28bbbbac296be5b64e0c78bf11049d977e6d683c882a46f64fdb2b38314f1bbdede58ee9380e73638028a03209f4f1e96317ca6203ad0934b54ca03ab62ce9 +M = 6230264578e21d3c8de2bd39b381bfbfd8936f98e54849201a6e933a84b6d6135f1b4b023041 + +ModInv = 225e46d1f63a59cb69c26ac7cf45fc245cd514cdff825e28c18988e06331eac896e4a326db +A = ac897bd3da19bbf6fb939198857707c5fb6b312166ea0bfd9f5e83bae22de3b1f33036508e24548a02c2410ffc5ca577df7ca1d41e377fe73739806c1eebe7f792af9dd4ec9ac1efccc0cd3a9a9432f154f6fd3c1b50137429909bc29340774bf3263df545c8ab1110f2ba96a338ffb8c2ecb12f3b74b034fef3107dc2430e233b512ee35f95c7abe9e865717358b010434b6f0f069290ddf476157528e00409a9508a16d4858099e9251be4135af5ff90fdeca38d8bd9368446c02c212d6512c001b8a942300e9d19569ae2c66a70daf92a0e4a0a26c09a37636409 +M = 59d74d2c14b859d95c77f01932053e7bcfd438c7881dbd539fe2a196a5ed3e2fffa7ca1fbe + +ModInv = 31a171200f51fa71ba35c1c37f1dd315cd52e13d85d517443dc7eacc9380206e14742aff56 +A = 63bf5007a79b2c44b6c4943a477acbe5b4c216fb388c21c24b1869c88eeaa4a36866bf282766295f9978ce08cf3e459fb16de927332e3d35453c276a33c74c488ef4505178812ae784e54cda9df6ffc8544216ca64d7a9c7ebc3edd3994d0c91e4471b5f3fdfcfc7cbfe66ccf3a9a72b78ec2505f9655cf47f93fee90b7b6cef7d0d632a218fa28674eecb3dbf30c57cbfee04fb3952843d160ab1646c0262df9858a548a64a0e2b8b4680e5523295d4749eb8198047d3a74b49c07faf5b019f065161ae7e7b07a275325156c16fee112719d5a1ae07af603050b540 +M = b23d9ea84c17843aeb36d41f5499bfb002af08bf3e65be630ca04f09ac908b9aeacfcfbb21 + +ModInv = 8caf586feeb3b015d4aafda5bd9ab30159f63490cdaf769a8c218122acc19f5b836443 +A = -16387d9e32fbd50b5e6cf907211d5c59e06291dfe9aeb2cafd9289e5e001f3a1de5dd1dd2872e25b7a4fb4fda439da37cef8fefe6e49f3afe549ba72a642eb07ffafd93a78c916a5bad655ea63f857d4cb67be968c28645d35677955c32f6d4e881250d0bcd1fd13501b101d760d26e62ee5d9ff6034960681dacbd7fb7d4e5ae62e7458de469227dee82d080760389a48fb4156c86b9f18a47aa00b64ad77ae57a4a8912abbaf75a8156b9d7cdb44aef56db7758022ae5d6b8d4db18e3b16887d79331f980754c3ad2eabc7cec17ebd9488a67dcedfaacb8a81d2d815 +M = 2534932b25e60fd087a82d42bebd4a53de2a6a011e543b23d994542a281874b5b1068148 + +ModInv = 1d299e01fa466a76e0624491b08a81b636590cb17e53ff04cdb0c4188ac683649333746 +A = e32926c3f39caaaa0979b2d09918aea7e764925f694de6575b37e139f2e2eecca3a4691ca8ce6c04a2408f039790f00ad965578073fe8b6c58d3d5c7184c580e9259bc0aff54df5f40dab952a6d75d1bd3a9a736bedf8266375c68021813fff09afb61f1145dffd6e11730f4d9d2374422096a2ed6517d8b8da6fea32a3c02ac3d62fa7619dbb26555320f2a87d340eaeedff4516fca5ab69499adc3819c5eece14d38c8bfcd3de701026eda11514088071472c5d1922f453eac8a52aaa2550d6d5df1a963d5481164b593661198ebcdf26c297a6ec96a8c1516c48fc5 +M = 41617805aee80a7ff7c78fe85f50badef3489bc44b5245ad135f7593074e42c4c053c9e3 + +ModInv = 757e17f467671a05e764238481510d6bc30886f0fdba9adc00b9a6a2309e49f2b661c4d +A = 9a87299750d4947fae59bd14ab494aa003226549383500909c25014050748b9d6145b8892db84d63a095228472780c4f454c28219f22017d3dd57c3375da0042dec005fd74da88b221900551e192726eb1b00fc5f984e7abae15a21b74350914d55192b7f76fe3946c18ff3de3bfe64333f5f24104740b524865409d2985b94d7a249d55287a610c07f6b825b3dee732fce04921592e1b0ee34335e20266809dc2055792f0fd964828a1d8353945721849b1af79df167e0ef4aef12491d4c156b509e429000096e79122a95c3e23685bd0cd1921298cfdcb46417163c5 +M = b3ea028d87d27184bbd8220f65b14df7d99897171ab791e8d26887703fe51e195010a7f + +ModInv = 922186ce5458db999c21d9647294d32d959186940db989292384a9a3c14f14bb978017 +A = dddd316a58037e7e670c07f19c80fbcac6d6717d08ffb001fb5a58770432915682b0a35b03bc9a21d0ea8635ff269595ddcf8671bff53f67b6c4ce65dc375ec8aa955b5a00946f57f0b270406e02b6f88a9ed942e665fac72e016241865a1d44d9c39c17fb20e056eee992f75acadba4b5a79a3a0a73c64df7217fd74f32b0c139acf454232fed908eff023ca6033be4223ee504d0929f00338c7624e092677ed66995d4936fe9eb44d1cffdb12646d62736e00fe38c15af5e752a8c3a2ad9e8656fc17f4671841548ad4c75445cff62f9be6010f61013240046d36452e3 +M = be9e0f99532025f65e46c2a1bcd6b4d24a712e6c289d44bd636f79ca4c341cdef65a95 + +ModInv = 4608314c64c01d599730dbb697d16090ba95f07de1868c25740a5a79dcd5f112087e99 +A = -a00ae6635872afd737e3ce94aab9a4910e1fd9ca42f841a077c137a2bd6696f657a0c556e9a69182c585ff91cec5dd97ad5371cd27a6bcee242e8a66762ab482b35c37d89132cbf11cdbfbd198daad5267191a2d3f36333e9845a6ea1df91c9a2d82fa024e6a338d2a54374c63c80bac20d2b5dcd648392b5c020cc09d478e6959baddc54e1312c05c974c81133592ab11e7228b51f036764b1bdc25f2eeb3d065d54e34548b04eae1ca69b6bfc346d0ab0ea53f60f2b811cb68c44c8676f61ea95fb6fe65528fa23f0ee3b9b609cb2cf37973a1d796cc13c27570b57d9 +M = 49250c13c11e80bf5fbef673e21321dd3cd5d410abccc838f8c747b5de7ad6671f3b1a + +ModInv = 20b5593a6c45c89c086b3a522a84d8f6633c7cfce56bc897875ae28d1d76b7aadf57 +A = -3e930fcbeeb22a7a09f78edf7f6f543f2f4c11fe96a2377fba3ffc23b8195cccf835bcfca6a5e8d115c145e312506cb3ffb91ab680e99059457f587029071932898acc5692f1157b6d19164b731a3721a2a2b6ce8402e50bb6564c82bdc9f6b96c925b275a789386a976595ce56da97d590005a6c8554fb3645b8438d335834170163bb63fbbfc86921971a43903225fa96e21bd9ded4fff92915bdff29326a568c7d921bd4930ea279312d51d75527715ea7cbfa830476b32d62029c15953f4abb3ed5a0fbbfbccbef169ed9bd35cd777c0461b4a6355954fe9f79ea0ca1a +M = 25621e45a96ce450f981adb21381224ba53abb2cd209d67c7f5edd06fbc41ae093df + +ModInv = 1b7f2b4df8e2d2b9b26e4777dd1ec39083a39b3e5f0749e62e286ff48f39ea4830b1 +A = 56c9b585493a957353f7d37d41946916e03fbe3dfb08010b4a2734f498937d740fee12feaedf527161ceec6d4a583d374dd17286c761e1924a93369b739b6d5b2eaa0d7611334e70562b0f3d37170b9484c3f6b4201ebf3ea3665a08c66e2f868133721ab41bc7c5626d560d45ecbeb8a882d7d1260f6d41c92d7df2a5512e5857cfa835e951647d56447a49d8618311b1483389a14628a9366068c40c2b7c401f160e842a4615ddb4475f74a9d4700a1a8e263ece631e1bc822a1060da0cec2a9d0f3deb659e73eec5a9bc2982542fe4fd25dc0f296405c497c9c969650ed +M = 2e9bb17138cd5e6e2f74a7862264ec160c874914384071f986853934f4027b4a954c + +ModInv = 41980b8a7c84f68cdc701961f0fe51750707cbe2b66fa9edc686911d018d39d3a0ed +A = -f29b92f84fd8c68a0adb1ab1b8f3d059c55271efa67a0e6b3863844130894a7e9db9bfdfad8a7fefaefa01181424aa19f218579bcd8a9bcd62fd76af24a0cbd30efb53a9634beb37efee65324c44774ffb268841abf5efe880be6586033b519863bbbde90a489369092b241bfeee60c8b6d12b236f76087fc24a9fb3ac32c7f9bfae4fe825473a303f8acf87b794b81abacd826a4f31029acf0bee3c80dc3058d3f596dd4a090cb3c76462c4480b3928ea105d308e2e08b89ea96231022696013777c8dde48f4ed26d2e692428e389b1662041215cb91a0e4b4581d78ae0d5 +M = 59a5d58b811ebe4b73f6d7bee44dd7718421a2ed8381b70449cfd38d8686efef7a5e + +ModInv = 336a19ac08891b0bcc1b1ffba1f2f4e0d1555f2d70d7b6496e67dcdfc40bd39bb +A = -c8f5aedad5cf26103654b03f4239468802e5a3864c0d5b9df2dd6a77fe42a978f4a73760736334aca964be115f5787fe05657425907fbdfd640cc0eb259f61a06dfc00e17eac18e92bc5d267c9aaa3f4c495543f74f73e8393fa7c3a8aa55b20db515f81302329a384e6b519ae960d4674047f9147eab1ee04b75334ad011d753ec5953e087cb0edda844877d0ba67204f8ab6698a1b15749a467abed6f4fba0be60298447bede75e4be8057855f3afa9fbe185cef3c7b49f795ccbacf7e665b0701e31f06665f935cb8686289569f1661939e90e1e512710a02a4f30d1bd591 +M = 4dcb06907b44fca56bab076c76ec965610a9aaec83937a71a57cf94399aa050fb1 + +ModInv = c68c44f31f7475daeb21543317297fa08ed1828125c0ab7e1620a0562dac017825 +A = 99d0488b959cd1b03f42d0dfc2c84d16bf88b3691eaa090c3cac6127d7449542b3f85dc0e03a1af598122141f09a83be3c0e76285eda6bd5438ae0f6483afb5a804d7b62c66c512af30d0d008d168ba75f1b22e4747d51451fba086558866ad064ac119bf1ea098cad0144d5f81c1b8315d41e4c95b6208f46bde5e4400820a69d3566c26de59e0f2468bd93d8694a9e0c3cd442fe59c00b7c27c612d6ef4c9b0ad24908eb79959c65355cd24f86a62d9051c4c918e8ad50572479e0319b7fc2cbc8a4d1de321df7584b7a821cc918c02d0729092f3b0f6b941afc78caedb0cd +M = e3b58d031c8dc2a14e6a19a8a7eaf42aa01c53835d073cd495852b0516339bf34e + +ModInv = 24ce38aca668d349e047fd81422b95ab887d2ea1f16e6ae2ff1f918500800b14d0 +A = -1992d0047308ca24eccd522b1ea3d4455b959322cc8ac0d0ca1237a5a6b0026eec14db7a8ebc38a2ab4732a3966a3e302fd793ab0223f31af3438dd8a10acff6c749b9ad075fc0b63fdeb366d594eda5ecd4c917a7a5a293588b680603eefa6040600a37d6ffaf6daa7f7ea89bef7374f0028d4aa1b5bf90559c199bac24795f2f7e69cf06c1910ea259165655007ed1306227574c0ab57140bcdf19e1dc92526eb2be5335821c73753432d04a69c05fd4237ee29979814f262771e9a3e7ce4c401310d354b553aa719b264708c83aec97808e0925c1c9e7c6f4cad7859e5456 +M = 2b3862afacae116db871139033dfeae9203be0bbfef7c0dfadf22843882d17ad3d + +ModInv = a1db3fdf86707ee44c2e5938e1413cc4cb39c140c39d07ac672d414af0d09563 +A = f5ed652326ec8e5aa80d657fbd54f4004f99194c1cb7aae33fbc7e5a06bb08912d5184fe4c7f57d951656540cb99a89b6409b04aae51fe60b69f3f9891a1898d555c8c897b717586c904c9897cecc8b22af2c8dbaec90ce7615fc845db337aec9050d96005bbb82cd822658e1ab71cc99ad029b7c4da5f9fd2d6c08b5949cc30003f348d0acdfe09e86107c42c141e306310e074ba70f8367989c98bbac3761d46bc0a216b03f2b18bbca7eb97f96ecfec4031ef4c4950a7b8f222c6925303873ae1de5765e211bdf76bab1c0ec5664595d98226964c73d557643a725bc6a5c4b +M = c9c651278849bffad65c5b55b97a0fbd2c000b1d18e259d8e374726650130800 + +ModInv = b403412364af50ffe0478f8fa08874b7a55033537f3c51c140dd4db08e4f43d +A = -6338e696d2484897473f9d6a9fb1a59db1f05c85b3f56140bd2ea1e8b3867130b92a68d740aa75174e21f8faeeca12149634fb37116bc541979ccff0a8c1c7805444bc5bc36c63299e8e40926e1eaf941176a39a27cdd338320cb47644da9087578717bd38aa9feaed82e8d49cf7e00942bb73af79649209db5533a31a5c049b71fb3070f0e81ef4f588b3d88b3bd725a910fbf18072b3ce2aaadb20f17ff7824b5ac703f431f62ebdb1f8b08e4433454ec659b0140727ee1b7d85f792daa1c013a02f0270ea06fee5419ff7eec8f73e7e0af4126039280e8667f2607050c07077 +M = 35b45c789739a9cc1a23e78ed92e65803d355cc4b8351fb25347d21338ba151c + +ModInv = 1b85d9b14644cbd70de3f5f72168056f4cf26a1cec1759a335ff055f165df6 +A = -9773b9bdb44f31b868a07a34fa5da6435aafcf8d9690c1863b1fc7a187b0cb27e61bc86672276ef761bed1d2765c0041fccd5e5fe48b9aac7db3703ec1152874af419aadfb4118aeb0dcd273d0dc2e005a2beb13bd5e19d165781fcc210ab82e7700c56045c955ee32cd39f158fca66c0077bffd355bb17c3626bb3dc494ff6df623555d4fcff9ecf172e119a6206d35f01cc24373ed859f26cd1eaf0662f0b326590ab4554483b4ca6e15d6593dcad66dd33a2575f5b1a845e9b82e8528dbca0d8a134943013ce4c92659eb20549e0ef0705c9d57247e9022aa76b080d1ba47ab1 +M = 1e5401616ea6752b36d5608653b301471e683e47a1d3608bc50eb006906753 + +ModInv = 425e97452bc499d9279b1e4d96ed8e82a9777b9aa93a7717a766e4345048 +A = -ed7947f17e0c8a863f6ad193c12009739654b20ec355d7b1d99022db36ac82b462f3a537baba0eecdc6bd05079d31005515698bff6071c0045429d7600da1d286e29adfc7e598c33c0de913cfd1f4126b8ac2ca6f96461f0521e6541f79de43ab1752e5f947371c1a962d8a8fb83abf825b506847d05a90caacb8298718ccbbfcf79827f5722789d8beed2f525c44812347c20d12fb141ca2aab97f8ffcb86bd05f70174edec1068a148a4e770e77ccfb0d89a9ba3897358fee800c496fb7f726768855d3c9559958191bc5069367120cdb58ac65eb025beee445c0ec3c600020b6bd4 +M = 50c72dbadbd6ec5412b6acf2f17671d3d509ce95b6f3345e127bef7f34cf + +ModInv = 104f1df0fa553b49df4ca7c3f828314faa7a8983e2fba5c412fe3535825d +A = -2c6cd5fa45bf5cfcf1beff964a528a3c0db2d454496be51963a3c46dc80614d2922f337b48d2435128e85f175b58e596b7e5073e98627425a6595ad08e74503beeb3501806a29b3f85f48f42a23720651b4f50b1f870703ed30e65c3ed4e1f9d54373894ae76e94344981485d9a0d337dce3fa86fef1e22fe4fd9b5af0634a91fa2fc6dd04ba5bd566a8eb840011a0f934c1d353d7c49d8c4a842be2fc10d4b8f6ffacf47393e42fd1cfc2d70a8c60e3f7a6c6fbae555f52fb09da2f6a2c731cb13a0b967c4f22f421fdb9d204cad08c5f83584b422d9afa92b510c01620f7c11ba9d1 +M = 3ba47ebf948a4a1685cfcd52d7efdaff93cbd193f24414685e560034322e + +ModInv = 3633dfc40d19f47a19e6eeec68fa835dee84f50f11f0f9c9f5eb1f74e37 +A = -d8f376fb3f68f49640cea5ff4ee97747a69c25372b17b887596d7aeeae8444877f7a9bc95598fdbeb72ab751d69c58c23e2ba200614d6e005dab91458433f9e8c74b5c280f5c1bfca2c46ce6db02bc78274bd8c026d81aca53c42861835c3e27e4b552b043365f78b2e808d008200687b4871fdf7effd9705cc1dae612016a3547d7a0ba22f3d6a7cb0356c0d7f3e93c73606d87012b45b77933baa6e1d032098a91d075febfe99bdd7a424ec867b08513cb805a15cc6257d2fdd5a1f31aca200a1fe1bd5ba56b3c70c7ae25746695274a474500ac3f5da5c57545b468315813e32659 +M = 5bb246a077b4db73c628277011b68414218c97a7d4553c887c530d804b60 + +ModInv = 26c1a8c4ecd4e3128e707b423c565f39b1b369d1d528e08af3a045ee41 +A = -6340e7eca3afaffa440b544ea03550b52b88236020e3c3f870d21c169c52e505fed6530df6006aeb6c729e89c96b921b027649468c94481d986bb6adcef79ad7173da6c355af3770096c657cf9273185c4f5ebfd28f4c7c5b626829d959147869aa01ed6060ea9b092f3f8c02347cc73ef068aa43c783fb046f2291e2725ac55df44d8713d9a6498e91dc2bb27f9694ee9654ae5e993a96c53392a3d41cd97444916ccca12702b520fb1c21e58800b9bc49ef9e09a31231b0e122e8d05ccd65c9fecdbf14023abbbc3dea687b406138ae205660090b1306dd77687f327cef5bb4aef0a7d +M = d97e3645f0c9d66b8728a200ad501ccd029bf83d426ffad95b80db93ae + +ModInv = 50e93a5677c87f47b1237e89bf00febdd429b451e2dc0364b51cbf8a6b +A = c5401601a71f992ab78df3c5c4bd2b0c04f4a7ce13590ca563be49721f32760146dfecebdb703a9ac3547c7582d658eabeb56adb4809a5d6346f6db9c22b4f086f311a0bb2a4a5fb9bfa911568633d904a7edd5711500a69001e9d57964f84b7aa6c130cfc25ed085a8c647b713dd4a30e5a9ea1b497e4e722138839a4566374d7a9404f811b62b610232b92ee520bbb58cb705522648acb96d1937ed83a42ccc58cefd19d634209bb724d44abc2e8b8d8b85d1eea8d310e8142e26922d60ff7f7ccb23010e62655842012d99a5febe790411479e4ce9c4dc8ee0f39e37b2288a186049 +M = 9bd21f1a88a2073047775ab0ed3f288163cfe2169eea8da9d6355a875a + +ModInv = 14205409ae3cbd01de25b99d9df6d69744850c5f316e2b6187171d5b +A = -4921d410f1c143516fbf4e711eff4cd54950315207bd2aebfd31e936fe81e67ed22f17cd5d3d91901314570360714aca63c6b1ac85c26dbd92b5d72333da03e34d5a68ace1b01f566872b670bee262cd45f99927542828ad0a534dfca13ebb4bc3bd7ea7f3d5c694dcd1924464af346b4ef29cda4ba765439164335f6f91ea70b6edcb9be12d7005a74310c78c2319907907f16f7dbe408a4990f2c5ecce59b61e1148214487eca6d1de0e050b522c20378c5d99d586d3760208310d56fdfea29c080976c6a8ab99ffbc80470c80834791df3797e9690bcd9707c37a94f73fa10a3a85c031 +M = bcee476a53a97962cf3910744d371974f9777ddf539fa0f88dec868c + +ModInv = 49f9d014569205d35108cf0a5a45f37de62e177513ee19c5c781ed75 +A = 96d1d504357094af5d151276e3e97bd4373416769023e407284e01ea6e94946a949d391d0b8cfe48d41c112b464915a140aefcaea83895cd9949c1def9d1de449f1fa082211990ed533a4adaf6596175314b9945d08d8d7733d317a61dc12a3a1d7af4ed4f21a51a5e1aba905a98078861cfe750647f9f33aa2ff65c89e0d7b020d8a0b24e0c89972e5c96d976394519c98e8fb8b8fd2d38c7de2c6be80a788f2928f280d22811ce11d83971ca0100f96502b98fd94161c3baeb9457fb8afa29d36ac614591432ecd01033facbf77af1342a0d0a9c48bafbc3928674de07580b45de3e6988 +M = 8efe1d8072fa05697ee437718e1919773c3a991f307eda7ab3bc3129 + +ModInv = 1c7dfd775f7290bd204cdc0efb00f768a569b18ad35365ab304e85a4 +A = 140999684a16f54b9e810513fb883f81db158dc7d0e43ecbd00bcee805e2eea4b6e2106867fff6c1d671a9bb6fa1dc19a50d191dcae8396fc9f7b2c37b53cd2a3ff6a85208c11f15f92966570cd21514adebf63aa15e86a1b5562994532d4ef5f32a7f63f3da25bb7d97d1dd3bcb6c5f4ef8eaf0fad4e33f73cbca6351555d99bb49ae73fac23e4670f18b97103c058928af646f3ffc56ac574fc1482c93b2901eb18cc28b6995d7d32a73609e1545625f05a7198d81bd3a7a7f1d16a78a127612483f445a7c4c221c936703e2a197bb3b79ef2ae227a37706b42e219ec96ef963c2d56fe6 +M = b717fd823ef165965a2ea07a3ae1d4df86266fa9f4775e3187a82f4b + +ModInv = 7e7918bc35fb8403652ebbfa3fd6c2f469675c227abf8de00e08d +A = -50538cfb778b159da1734e8b4bc04b95d64109450170d5e468f69ddf4345b23104fdc8ffc7dec6913368ff4b3a2dce47ca608469b68b00ef0df7ae9a1810ff03872dd83320614396a1526c92892af758b67620d676c383354b04296bc6eb53ba556c38b74232d0390cc2300cec0a2460d74a68c97e037395dd5ed2303ab81c510946fc90f0443c866ae3787a94cf18b48be8d1f5634b8a1f1fb654a3cdca4ba97084e38fd314800feeda0dbfc9598311d3cb015d762e757ffaed8b72fd6c65dd5f6068004d6bb4bdcbe529e4b9414c3e1bd2c2168ed09180da3242f4826598bd09bcdbb10398 +M = 100ddd4868ee5e5c8a246976eb195dcbcfe65cad2812d07b61683f + +ModInv = 528f303c32481f39f6729a297842e3bf0901da321b350649b424 +A = -d796984fc9c0526bdd04245cda244cb9714b2873f09fd69220f643f4b33149a5c1249b228afa0f19534b3ca0e6a10524a4137c09908cd70fe6cecff56073bb6af4c8c2ba1a3e5c294d8c82328b66c2502cd6a08c6613092c2da95e282ce89402917fdbf4db29d70f9af2d084aed3d61fac781e00d107df99a280eb36bc9c3f8b6f89870f44cbe0968b9fed76d40be50113c25cf0059b7c5195c6d6f6276cc36884891ba9880be639d3f147fe1dca69f69bcebe813d8ce586cbc47b86ce2aea956326e8142980ba345cc18c94dc0613a44d499b69e8dfc40c6b3dd4e7a444987778b390cea2e316 +M = fe8ff8802a4a29c1bdf325ab4b7b6be2513f4ca03e9ca1b48c55 + +ModInv = aeeebd1179ce38478f7d3fcf6feb8b67b55c8143160d7169ade9 +A = a27d080a2d82a06a4132dd7c1aafa827621a04c3a87d4e10c8cbe7e1e5bf4b245a051c25b031650c1ec124b56ccef903761380c41edbd74227fb70458659e22845501ddccb5aab347b2bc9f86ff9460788e795314b352a7c32d6260f124acc40cf16f6ed8c9c9baebb563603e6f5c6237617139bceb745c28db48e5496f4fbaa6ab687c9e6d81710f1b9d0ff2d31a1256218551caaa9e0f657734b05b86d8169d0a1508da88564c35f25a569037493459a950eb38cf866cdd7cf892b672685f592e010e5c2461fe216875a39f4598c3f8d249add014f78386da70e28b36a3ae03bf731a48a2603 +M = b082706a2fc2d66f253ed3c49d5a43921aa91fcbe9dd8d61e819 + +ModInv = 27b1ae32a8e172437e4a32a69ef597144bc56ef23b335d42e64b +A = bb66fae58dc8e0f87072ae46fe792676dc3fff38438b6e4ad91ee56daafb64e1ecad59603f33212b30ac900a9282c3477e2eb19249e26acb6edb3ea18e8b46b40163b39fd0dce030367701bae92fe39aea314fdc968f55ed8a3e95b26357335e0795003fb71c1f587a2737f0c8e5b121e17a471f1e2b227efe4a47361f98feaa710e635ae4c7c8bd9ab0148433a2c7ecf9c3e4ad2d123e2d63bb24b656e9b9baef0e403bcb23e0ee1951aa0d497858ad47a82e08dd38cd3f2fbc38e1ee0d88564c07c70ee097cb6f63da6e7f81fe3021ed7bb4d2e126cc83137e3feab7e7cd2187fab02ad0210b +M = 53fd483ad89d71aeb0c3a1c09d7294d17acde8c8d3a298dd9eca + +ModInv = 1f52595bf05e1fb1a1206ce23413640000a1e84737aec1d1b +A = -e6082e1c71fa2afe9a17edeaebef2092ffced0c399dbeb189d1b4be8ba1266ec4f3ca5ce09a687358f45ddae2bb738f5d7701c919cca6ea9f857486aed479c127a0d9b1a2c0d3910f1243472d561139fead1e3ec1461b86861ac5a842246a4b41c811e996b3dd69001713ca9fc649f31a3d70867e63ea86291c6450d5341db654b5ddeaeaafce8f207ac867d3f1ceaf9febbea94a4b97ca5550ead6601e20dd48ede7aa7ccee63d3b56f442b9832b4ee9c3fa8fdcaf430148deb6373b0cd2f515f3784dcf154faeb86d067e432bb62b905a2a91583484186e1fb5b1dc052ffcfe15c87c4b89bc01b +M = 55d938f998406b8be405771ea994263164743b62350bc3bbba + +ModInv = 589aadfa12b0b7ba7b414b2acf66bddf6673e26b62f25603 +A = 7ef1bcdc11e3591a84181ea34645f562c30139d32ff602bc6d105280053cec54f587c35c51146813eb849f376fb2ea3b6fa8548972eb66082deed642e5ab97e948ff2ba68f54b2bf12149f61ac16c1644992609d9ebdd1cf9e66e7fd237fb3a56889af2d2d22158d5c6e549738cc461e52148a243f943e0f8fbd407c0efa6162584f54d07dad3a7d478a6f20ca45f54ff7e35f0c5815c6016d780c30a5ac73ad4e0309faef5b4d89b0b9d756176dd762b76e659027b1942adf6c7342523ba5476df43333e4e73318a9a7733f9c3526376bf03799dff97133a6456cf2af7e4e7683ad319296eb3b7269 +M = 89ed56dbc50dba4c235d7387c0e28104ee544ee4f46cd4c3 + +ModInv = 8f79935e164c3532574ebbb87bc975264d4a753e3c2f5f9b +A = -ec7d063b8f14285d4410d674f9d61baac6ff886c4f75d84720bdd354b2cb26f8d821df7a25bae9af2e8632cbb099d67777682d7ca8f72ba2d444858801e9a9c13a5afdf7d265df05ed405d6834d3e066c63e3cb7462411af728a5ef333bb24a26aed9919169fcb5e871b854371e57d4d83f3ac52a3327843a6719c294d8668060af89aa2aac97d3a0ba8d520ea0c26623591823fa449477f1ee222508d03e2ce13cfaa33a10534b470c864372a269b67ebf7357fa4b101c22716c2933cdfbb613ad10924368e97cc8cd3ecf91873180b2a66e5ef41b9d5296c70942fd4bdc4522f8f6f92ce9237a015 +M = faee4ce12d0c19b4353e93dc83c01a520a2375b8626b9d36 + +ModInv = 55b397829f4704db100eb4e7105810c3b56ff861a7e84a +A = -1c88da8bbe91b961b7ccffeb3efa0661cc662206d20fefced9e7cacae2251141318704c68428272b646458639f9301ee758c36ff58b65e2d96e14e8450121a5e7429b548cf22d40bab5e94cca97c9a4d15b8cf5f8f15af2f490c78cd8a530b5e8e1265bd32a22a737e979b3a85eeb165254ff71849212cee69b5228167c51ca06818a45c5515ff60b085500b7debaefec1cddf82f3ead5d7687c40b0bc5920aaa54aabba195bd6873a6241338ee04898f7801eeb6a1499103e17a9dea3968c7599a480b58951c588b9748ee5ffbb4d328d730bf03e9eea7010d3c39255c34b869bb7ab83363a109bd374 +M = a49511d862ca0cd169dbc5a52b4f50cdc60f658b8c128b + +ModInv = 23869111e0437bd21999a2ee41f4c9b1d1833a03bc3159 +A = 775ab1bfa4ea03b6cde2357acadb83b4961ce9a1cfc7e14500c0034825e7882b11fe1615d6f4613a20ea55991011db3e6f552f24702dbfd242dd9ebb29763c7183867c90d3231c26e1d04932158afe3191055c0a6b40c522d2eddefef7735cc20e9921c97aa900cd3d1bdc3f7f83c059c03f0d4a46373863b9ed2f6a626b3360dfed6d4cd4b6f18e8aa6e5d090cd67ceab2e85737340b2bc482999eb711852f6c7326b2da7e58034e766162603254ccdbce0c47993ad042fa7b033d442b4c54996200aa5ddd8cf3215fb56d86c7ac542ac3907e33fe0a5ceb540686bf4ce2afc2fd3b0be1d02ee080945 +M = f486844b9f256967df3ef9c315c8c9daa0c38b280c43d4 + +ModInv = 1a155bcde8f486086d31e0b148938f9d2bf505f55734c4 +A = 4858a709b3efbd9c34f09cbf8ca283430dd5a6529e2d3de7a6380400d77be4bb438c335b09f7627500da9caa8b86a6ad7e3383c2c474df76f81e0e6331f0cf3d6717fd0710bf3d673ebc88ff3c6a20b30dfc16388feb7c559ecb86b48fec28f409b5109ff18395501d6162218c57820f5287f1b8ec279f56ee2340b341cd85d435a6fbebdd07463ca79e17ec0e4f1f8d1b7bb36e4d1b764d0e2801e3fd7fe97693a2068b72e0318d266325728dfaa4a90707b14e3e222776d2ee7e2fd8f4523aa8cf529b4c68b2de3a1a308dc2819cf22072ff887fa56b480f1a55a2aaf302a44b22789042e4958c97a4 +M = f3c000731f35f4ea0cb9dcdb85cf23f2031edcb12b663b + +ModInv = 125122a56eb3a779bf0e30d50632a9f43e70799831c5 +A = -c233a7085a7e4a6f3392184156f456ffcd73cff0b50168630658f4932f2531c10715f61157629c7c9de1bfcda730448b19b01b8ad840a97a463d416142a9afd43b958e6fbc20652296288de906ba67bec393b7d0cd06c80e832b085fb1d2ebc24e44d40ce6224fac82c29fd2eb53b3a166821a4bedd53fa837f9595bff35c7bd4c8724c3f17bebf48680db6d8da2ac10f501e3c24cd6ef36c6595a7d30e095ea8f91786d6ec4d94e188e035774a749b40191528c4e65d5186618280eb6bcaf55be47a288c331e0d78492694c7d2e767a0027c4ee7e85c7e7be0328c78e5abc494bd7364c7dc080459fa4f5 +M = d6f4f6e0d09f5fbee3a4a7911a42d0387b45befe20f3 + +ModInv = ea1aa46e6612ecb304bba6a872046682341534e94d +A = 9afb77e48279d60e03853104ecf907ea1cdb9ec1ff78665da071ad639513e0a38ba71bb694a55e99ba7f74cc7ba88a7fbf45f537bf2175ec272a24020cfa40827e51b7783b1e139039afa43703534b737529c23534682d4d7ca8bbd385f8cf54fada4fd9516351bf5271efab18051849cacfbf524886e0743a22cd709b9a7e87bbeaef8a09bc1677032099d82a39c7ca3359c8e698e28c5472579832abc8d2fb6adc73f0c80f6d9ca6a1dba21ee80f69eb2417a166cb1f76962c0b015be8310df3e598c62ce877a3360629039b7112af284091cce3d30798cb3c78ff05fbc3b4af259acf70f37ec8987140 +M = 2e6b643fddcfd8c62184b87ce8f774892505c2aa4853 + +ModInv = 185be5ebff799478aba1b6cd0382a9ffedcffb70f7 +A = 1ac6dd7a10d19b4f2a243f4d93a8a4c6840d2805c7ef4edaa23f4397a2d17664d19379a7d1f4d4409a51cbbc0a937832c6636f24f5b3c8f48490b5467f852702d34ee1cbe509cbbb9a1ba6b8c310bcc934f369854324bb4a176500bbf879ae46583928a05e0d8312f8da3d63c2bfc85142a0c0bc248484dd6abf686790f36c2ff11fc3290091218e045a1ddcb0bacba569701a33a24bfd798e37b9031ec1e00849d80bd64cc125a2908d06553d70b1ce01f11b02c58684911a5c5dd955debc8d348f16623875881ae93daaf5ef5bba738908acb97ff9f7b961306934e68a9a72fee167945c70cd1b4ec1692b +M = 93296171faadbd44ce6fd6f29f778d1d5d0f0d8df6 + +ModInv = 1d8a507c4c2a0909d8622371e814c9faf716a82033 +A = -9847453683d1bbaea8d6576b1b0a8b1aba4b67c2b2e3e62979bc57fe869da7edb6f049e743d82553d21b1c1e05a17bea5e67abec465f16368f9c0136f156328c377a769c0cf3e80d57b3be2c9ea3835aec275799b2fd9a8612cb9576fb86ba4c45f32cbb0c8ab555f54c6c64ecd965307749aee406b3d55d6097bd8c1b84de6d7853d5f2c2ed0238f3a4d14e5bd52f477a371998b7ab2eb853246ae5dd9af26d39be86739d99925223cd17c9af75e472260bc1200d4c9d9fabac52cdcb3debb68c8b93dd18a7b0d66b30cea2a35061fb08afbe66c5927f29ac398368f78a9d69edfd1250c4fbebd4701ce699 +M = dfb9f9824b7107aaf13cb64e2c8b4146f5c6c3b41a + +ModInv = 47bdf7c0628885403abcb756c9c7baa26e5457 +A = -bda782a27d540ae3b3f474a6b9b3ce6dfae201c3d976b67c18c8244f6a1d25dd58d9494e725518478d67280674fc5af0d29576f530a9782f71736529f916dfca6523c8ca8f06882aaff4be4e8b3aa76e23ce512e90f037e1b7e58fc113823853bc5521a751ad85dd6978dadcd9ea84bd3b8be0278f18fb72c9da3ce64f183d92a953dbffdfb33c3bf38f94ef8563d029b2abd2d8ead0cad0a350c92b6b4dac32122da65d652ec7dd2680dcf4459fafd79e0d9ad27a7f1a3d152b444f84bed29e7176405945a4143a3aefa226f9174b59452f7b7a0032d9ff5754c8aaf7fa33e7c33304551ec1a38a0fcae70cf11 +M = 4f09659158a16be06dc34f46074fe3a3bcc244 + +ModInv = 1201759d53f93566cb80add8028ca991efd881 +A = -8415dd9003fd8fd20db397c4cdf62d80215c0fe0cc638313585065597eb13ed2a68d34ece36c590bbf62e28f624ecad231f3a925d39880a3ff513528846acba28a03645932c29bcc881b1530474aa2675bd02a12ecef363862ab5c79e42ad81e47bbd0cf34b73ba468575ab6accc22cc5c6b553ddaf80274b555f6a2fa3ca7f97e838d972c4f45d29c5797e961b403f19386748d644c43d403b35ecc4f642482a26fa9015e0dd1f68b484e1ae89392250ff37ab00071f34dd098d6d70b9482e407ecb957293ec5cd01eb1cf02aa0f45327327e0fbaaacf522af3f02ee6f537bd5a46505cd8677e29ba7de75bcddb +M = 147b0c814484206431bc7555f5f97f0f5bcdcd + +ModInv = c515ba744bcde15bc75e13fd798f50606be767 +A = dfd6dd7061a2d72993df4c77e0ad545c46f5921ba6fe40fc94c18a7bb8f42d69eb8a3cf7d067cb4419edfb3d072342ef22c7dd1d6d3acf6707ddf3dad071f3676db7092dcaa39539ef39744caffa267fc0d0f24eed3fc83648a08ef6513f17780dd0214564087cff19baace31900493679891bc64203887f44e4883932e3fac78bb38a5ef6d79389c1edb4984a953514b336f9beba7f4fb99428b09c203dc76ee29e3b9d358b7663c36e31bb999c1b5efafd4d8a7d881db01862c1f4ce33151df755add0aa65be631f99dbb89e86dfb4fdeb563bbd1fcd096dd66f276baea7423e3ba664b7caf53592c44efd432f +M = eb365fe4c7551a0acc792bca7f33ab213933d4 + +ModInv = 37f7ef5c7f39234cc53c05c57567f278ac78 +A = fc905e52ec9384821b2032501168fee357dcead6c2eca55ce3434b89f949fc9a5f432952e8bf385bcf886188d58e12e025b372c46cbded2d9c9b6783792ccec9bfd6d89afc7a435cf556ff4ebf17e1de5ec4ca72c5adfe1bcd207fb698901f426af40502b9b8d16c6a4e5c285ccd5d62c2cfee10609ebdeb00f6226dee008f0124ae2c0c08d73c158f8a448ce72a712cba2802a23a43e99fef7befba845db0c7ccbcfbfcdc6c6fa0181130b6a71910939968d6e9654e5d09929ecc21a70efbcacb1f27f52e048cd8d81f864de4d43dac68db2d29cd1361a876486aa51eac3cde295c612169aa716c4b0e587b8e9e09 +M = 73c35e124aab3402cb58abb8efb2d9216ea9 + +ModInv = 5f7dcd019c6aa08e906c80e0e03a0d0abd0 +A = dc4ec10befc026073150f0afeec7628a6b7dcdfda92075b9ad3c302eada130e88595d8817bb9a2e2c25403826eccb22dbdac48618d52253350aa869b0a54d2c6e1c43ef78f3b3dc8f64ec306eab8f2134305c246171026b0846efa46ffdefc1bc337544a06fdf7b8cc992181d7e6a72a03b3eafdfc01fe02b5ea3166b4bf0d23cbe9564f6478b0304882dc0c03768bc5f3472a50da78a319fca22b312f666adf53a14b849036c959051f2b54b95aeb827ef834cf62285f11936fabbd878f95849c2ef4f9b1331273ee5e070acf07f13678be90cf4b0e9f017c15f2008332f9acfe35f6adb025f8c87449d41aca374f +M = f0b0ec979610077b73bd6b94ffdf2073043 + +ModInv = 8cd0929f077faf96e2c2e8052d96f65edf9f +A = a13259d168e0c3cef8a3473c4539151292d3c803ffd09a45c8921ec7dbf66f9b69529ff6b02e252b54572a96e31bc76f50975d74a862025580d56ee4f5de7bc17a0940c7c38e0e8628948d55db4e0e34d8b51d77696936f1c14622d46eba2d51f67dad3a9c738efef75b8dadf0987304caf0fd17c0575157b100269d86fb9735fdcb904bd28cb80b388c680c7c6adb7cf1840a481d4842c2ba51342b937599b3d391acda2ab8a42a05c38d3be175f65eb7a06f4870859783dc0016d04990b79eab4b1e9256680e4b88da10d3308d074ad9d06ad4fec87c1f7683265358096630485bbfe7fbf07b6a3fe459373d5a49 +M = a30b227793efd27ceee7ce35514f3e7cc146 + +ModInv = c4664bfdbae39f91f29373221727c3c33 +A = -3623fb82cb875af57aec518d41d2de096ae72e4a529b0af141a3f7681cd6e0546898af294801939aa33ab5f4f7d89f9192afb77448bfe396aad34a5d081f8ac29811887be22743d1fb3bd65089e895c7350220935815008b4b384ae6fddef6953db958fa3e1e45f60ff26a3099e14b9ed23373986e08f61e4d07a853153d4c31b4f14895dd1d42104956d2398e7d2905f01aff8a177be0b9a1297951f780bff8c42b48c7ed454aebe853c7157e62bc825d856464e564ccb79abe9d5126fdf379a933013aae5294e137060d38e696f7ae9666b9f20ffd34cc9265c91ba4646d4a48e200fe9212db11bada60960c4674fe +M = 7c91de21b40081aeaddedeed4425e7c013 + +ModInv = 1375c5321f6599aae9f4a13df1be90e11b +A = 7b6c9d125febb853a73f8a330241921585351f9f375b5994eed45ca17afd68227cfb69273381c88bbbacf2563db9e2bbeac3851ca241e9c843d39e279a7ee6d91fc40f365cbb3444e0a34ab749d39337519d442636c0472ecb5f89724dbb5559b6bd3aaf56685adf3ecfb635a73747f9e0b4ea7773bae5e0bf2ca51ecc728665223fa426e1cc55bc90e95a17bcdd700b427f32a3a57eaa75e88d1d5dcbaa34b2a3f8019d5c6993235228d0abd363db61f4ef49e37fba9d81b60cd0c7f0d5487aa59ef3e725dba647b057c8f78c7eeaad5e6525e3df327c20f0a2a4454bfb84cb23a94efa2819b409680775a280c5fb2f +M = 76c3c53871d62fd875f4d115d861e1f806 + +ModInv = 226e085a362b04276db35e0f7e5223254d +A = 1a167234225dd95567dd6c36d4cfb64a731baae0679c5a95271a85b1a4891268c4c95e1675979ba3774ef23d5706565f5ee1b471b1bdff42a9c0e70d83716499f7e85cd3c9385f5e74410cdbc0f3a6848d4ba8acc8ee372ff9e7d9b584fee9e4c91ce46e3c41fc42669d906eb2f5e27eba8104e194c5144bfba26452842cb9d70ef94f02ca1d0bea9db5a14e4408f2f8cd2a51c54e64f2ddb13d9ed4517d73f50c16c9b8037f55c4aa3d3d806b4e2af8df9cf03e704aa2105a819cca9eb4a85810d01a47b8cf73943ce10b09978326639f5c0bdb48f2139834c2ecb50bf1a11fe486db83e476bf8f8c0546a019f04e5 +M = 387a5e8e68041023af9affd133279201f8 + +ModInv = 7ea279798582289c2d5e82dee0b330a +A = -57600f68d41c9dd82595a44d90ec320b0974a2746d1c369a303300a4534c6cf5aebfcba17606e3729b0eef1a4c2dd55678c82893f24d1c08d2427aa8542afd69258b667db0f1402cf236be8ffc7fa2891818088f84a8c019f15d101da564e403896765b231d67aa45f04d4f086b120fbef66f748ed51df7fcb83df84be6205399eae1e2ee5e22758cc98e3facf3e332660985f30406553dfdea4e37fef0ab6add20e92c3e02b2d79691d0de47063fe1487b6ec18cdc4558d4831fcff5ab4e6a36bd357d2d9865c9e6d811b2f8cbb49c63d5c536c944da55b065719567b3cae9ddbf385b76ee2b1e9e8e140b9d17e3f62de +M = f9fd500a90ebd3452152f639ebac545 + +ModInv = 27e6cd32e2b829657435821dbdb81b14 +A = -57721688997ae27f2d080fd06ec9584029df020e508daed88eed6af06b035e6e24057356e982634944108e9fa00df59649651f8bba723489a7df1b671cbf988b584dd4af515e6949d8b880dfac2e054a3d53737ba728cefa49a9cc0744fa8e9ac5a8c9974231322c8dfe84744bd6a1fbc89f8f3b9e8f7bddb5737b26f8062a8f749a8846b3a3cc412b485add730e05bad31c662ecd8fd3e12038847e6ad1751fbafc22d604fbd255e770535f100e544b35c2c648ab35897af8a295358a0b9c46c7773ddfae2d74367600d557ae730cc0c0a3a774d4b259d42daa8620c32a5e629176cc270102a2a0cead3dc2789f45d71d +M = 3558148edbfa3ba79d27b7806983cba7 + +ModInv = 1f1acf4ca5f0c500df3684b16c059f88 +A = -91fbd366b143a345a97f67903495507b89f7f63cdd634d3dfacfa61a6e680a8e3136c20f231a1859d2442a5475dd07b93ef8bba16f53fc1ff0adf6c8824500a97f2c472022f8ee2df78cb8f89c15d070ced71312254b4f65cf11b66a1b000577807be3247972a49659703ed8747c355f28867d4ab432f070beacb3462cdf7bc7ec813c84a7f579ded1e4006a0a68a60bb989012a5e76a14e5fc6eadafb67163d59702468d03da16c9f0b52d34bee2452a281cf0500804fdfbf228f4f2a9bead26637b019c4ebcd7dd617e34ad93a9dcd06f14bae6bc1e280068a710da859e5d8b63dad35770919a1c8168a38550863d3f3 +M = 9324b8f490a191364399a265461718c3 + +ModInv = c5d4b3f952b68e1e3607cefd63f0fb +A = bf108f5ddc16aacec54dd141e9cd25db52ade39761c80a1bb5d866cb968b041a7a3b3d0085dca170f82e2724d21541f791381dd8b82be709c6a9b3495a72d14c62c908d6556f3bd42c2faed4040ff096558de2cf4b7c887b7273dc780f9849e8269d52b2af1cba1eacf2ef24ba3f72091c770e412e85c669febe6cfc257b92abd848702b0e567ceb3e0ad28736d434419cac924d8ed3f08f4d435eefd6c24c48d8892332f35240d315b911d1787b9fd32f66d8081ca5202a843a5bd97e8fe65f3f3e061a0b93e041eda4c41b3828c516aae94535c2f91feddb2cd559ba969dd8f6687e0dd89dec7aad49308bb43f22079f69 +M = dcba4451b13efad3390076ff2b2c4a + +ModInv = 5117a87b44526d245debc1d4d9b9a3 +A = -6ec3f7e6f70df7692e0278e0f0f129da549cbffa87c3385a4022d0fb2b9b0d65d7d492586176475a1d657deb7aa9852f771863abb17da55470dd6800255337a0bcb4f59cf3a1d48c76e0675f5ed8b887cd28a58f327532deaafe22990ee929714aed0aa5a96a9c3b7808b4b749c5d44eb562cd3a85819c98b73e76de11362d6560c71016a8bdf4f47084829f96af2cd2e3100fd05d09e6d7850040a73484cb54f9ca76713ae9a927e1056e25818b0708af2c82b62ff13ebc75a6128227ebd53a95df916547f0c96d9dad66bc8834923d78479c4f8cf354db61d18b6670e80774af759c06cf6c9faa7bfc8fb41616c47bc9b3 +M = c29cb3b7202629ae6a2b7e15b3439e + +ModInv = 2a1dfaf03df10696d4cb529b192e4b +A = -1b18f4081b356fb906161a75a4d6ae5a2391a162deb29aed1a03ac410e81f2654876d74ddd653f44172f1576dc232b0525df159b0a934b4675276ba855bb249d12e3025d101a539be964e57dab0bbc0910ac84e312e970da68af9113976e69c2b0a69e94caa75c732c96497e94c00127fc50aaab2b9b645aec62c2d301eaf4c0b72eca378de86eba0f36f2f4bd7c47b2af25818c88dae3a405b1c730a8416e215b87eb19daa61e76317ab5c35361e4a52c37a6d349e56bac15d6f7ef50a3dd88feb9f0e634169cf3d53904a79d53d89752f6a6b7984cfd7cff6a356df6f2647f416d3c9cde57e4b86f8de9c96d08c6092011 +M = 80cfbb2f17d0f2727f8dc803f74a85 + +ModInv = 67f85bfde0c4b1f5fde9804f5752 +A = ac794ecc4101863167c225b2eaa4d24d659c23895d0851c024e5a19406c81b6bfcfa3cf537d4bb8ef9aaecb87f4c34599bcd186d9d49e455286278e19efff6f2c2a0e81faf81cfdc2dd06477a95c6fb6bc2304d74bf89de223e1f7678865b843441bf436394085eaf8061b73c2d7ffab76fa5793a5e057c36f5ce89ef020952429f7c6670b069ae0646dfa22416b1a5fbd7351f122225065af0b3637ee2365f69006b6923a62be25a5ce5e0624c283fe43cd55e262a65c238b0a274e766716804a83d3189a2256bd94902b175b8eb5a18e7cbb000179f059cef742ec37147338e617c48e503cb38db5333f85d5b37b5e7dbec4 +M = 83cd0c9604390fbef6dfcd3dc0d7 + +ModInv = 6850810c00149ce0cf1dbaf41691 +A = d43b39c1c876dae65c0edb8e09b72a6f4e6dfd39f90281a5cbf24377c336e7f62b12c1d6e274ed1513e585b451ce26c834709731261c83c5b65cd07947fd84ebd68d9169b949488c4ede02735dd7a61f39b0adbe12288c0ad5c3816694305580887f0a1db82297710b0631dc890c0dfbb33c9c4207b3b7a511dccda2801302ba031e7321a5445510ed109d9319c986d24d6da857d68466f1f0ed1dda03a0612be5f2f04a36ec09ee2d3758ea65812b606c8c792977c053ebcdf778ae232e2789812d55eadddc2f5bc720408dadb431a6f7f9861a05ba2b0785dd689cb5a066ae58f71a342ebe6f7df59c724159e82974f8147 +M = 8479538fccd2026a9edfa19a3eda + +ModInv = 12ac071fb37c427caa1ffa82be25 +A = -e350896c87944e2715771efc913afc419622e8a1a2c9ca4df3178af974ce1aa4da589eea04f70ccea937dece1a3a133a953d8ce5f020cd39344e89d699c983110d7a42f4329f8b835c8e3b6bfcadcdd37928820d8111e7305140a6bd49611bc4e8c1b463f6f4beca023d0ddb31741bb4fede42185ddc4b56f059b511ab79108371e9a2e9e5ac5752b4ceb08511d764cf7fddabaedb28922164c9b50869df42feda3f40c7e08071ca3f51448e93144924787d80d77fe9e07f83dc116af7e547e5309832c86ef9c3b9924f1c456ec1ae131fcb1c93e9b4ce4a1b34d0c162ae6aa064b15de5e5e6f3eefc5b86a61357348471acdb +M = 874a617d3c7f615378ad9867a664 + +ModInv = 73a07a20288757d83f81d2751 +A = -da575bdedaf59315029e4c63641b3d624e077b1cac757442cb7363541d135008ac9808de2490a07525d7e0ae0e0b58234bb53e1c62fa85cfdfc0f3cea8df9f9ea60f76851880c7de955277f6a0837284ba42621e63e7b0657e3e8649172ed022cc0f302b40610cc08afc48c341750092c4c435dbe95a245dc947fff2863c580c53bc917f21997fd33ba564157362200a8cfdf0515cf49123f34084a42bbe370df2d5977ae61e637b1710aa791d1f287d33467c689784b645aff633dd196671373d21a219daa83edafefad0fd27f7884d21c02db3a97ec8285995a18738e5c2dfcc2910e2d8c5fecd43fd1c9b705931820e8bf93b +M = 86b6668ec499291c056a68447a + +ModInv = 2ec4cb090a4b3a028a51d1dea +A = a4c7fcb35d749ebda4fe5cb3a8e28244cec5bb33c72e018c00f8d4c738d575c0a83db58e77d5e1b69c403978c120f1cb15d7bd3d2bd87b291f0301d3c08100600377c240a32fdacfe3756fd3ea2a5ae403cf325bfcdf63fe99883015ac91985d82f20e4a11e2e11a698b5cec3f7c0e7b8cdf0b962ef907db600a27771530ab4c8c1f5fa5b76d748b9920b1a9428f60f333bdb00abf5a48a21f8cad86afebeb19e90dc7ef219f178037367f77935af14c7a87bfc0cff630313fe7edfa353425e117ba798361d6576c5e6dfe83dd329c5cb6aa8179487b5cb14c455979ef90db149d613760fafc92323d2c15204d3ac88769c3b107 +M = 53413fe79780af04b76ebe7789 + +ModInv = 83f9054a9279d8387d18f45bd +A = f331c517efe3c19d6a1355154fdf09ec837fb794d042a3af3d02c4848f64d6617788c93d672e3ef5ab1cb083b4d5e709d0c1d69305683b95461be39ffe2658e0b56e1484d4f89817097a04afa1a1812759c0b6ea7720d7c9edadc256afe61f6e878e44dbca7899ff153ff2c3e044747248a51429adbd677ea7ac6f2a629fc4abc11aa0acd87e1eafd34f4068d7c12e7d780222e0c446fcf4af417260448c07fba25fb3fc61754567617b86c3a4974c8336170f48ec0fed2db78978276881cee1742839e873da4a98f716fe680296dcba9c7629649b4f3096e5b0680e873cda1386da2d8235ccb1ec1bae60f035cd1887e3ba54ed +M = 2c9882aceecfafacb01e244ab5 + +ModInv = c671a9a405876b8b9c425235 +A = cbcab3621760cea80c5108a17641edab4181207ba61f58b28d386db34d397c770eb7434bf7b00f0de907025ad19f8607c192a259102dfdbbcb64c11ec455fe0da555b1038c28ecb4e986434e6541e148034a6759b8045ecae4932144de99f4167a577ed48aa53aa10eb4ed6cb84253e6ea5c7845d5637f5a7e3f7c2b178ab6d128211878ab9fd79976176cf5f87f6315e35b7810e34b1e96161315f44893fb472820e21475f90ff37c2e35bb8bac38b28e58e5d37b9387759ebb422a41de9d91a2ec9e86a3054f7582bd73fe27fbd0ea974ace0dd5681f6ace02cef975655614b1872768cec6972de55bea4ea258d34040b7c1a6cf +M = ea7d2dfaf8a6ed6e2f31bc7a + +ModInv = 9487298f587cfd38a4769abd +A = -4c27dd9427ecbccebc9457e7b9e340802bcc625e353f080639dca57c68fb10c4506582b330f3c80af19545d61c727258b32aa8fbebedcbb6909f8b59ca5b901204e653b9e2ac1d769b9de6edf5b297766ad5413a9a994b4a905ab09c06845edccceac7d0d916f54ef40daa0cd4a2782f9120c49bdb3b3a7a97fcdf260d05738bcab9c42ad96105d90c4d3701bc92a50d68c67f8f92ea527266e5c63106f3f83afcfe2e096e5cbca3d34c0f5147ce52f9869059113cdbd50f636b80c41eb6e8e32885d384bc122752e69553b89fc8f6ac0dd62689edf9d51bd080cf54d06f11608396a10541c7f4dd2f9907f91345c9a34db973a7dd +M = f149e8f8926cdb707574194a + +ModInv = 11cb7f1566cacd4c201ce0d +A = e02fbf4b429078e3addc549cd61db35298e1b9ff58265718e29075b119f17afe47ed5d037b043d42a75e3eaeac219be628628e3759dc4928d993c213a18cdb3793a7201df8c9c02131825574d8c0bf2f5df5bb942af9fb385e5a73a0d5d87f528e8faf583207419670557dab3d17c93377bac83cedc89b4e6698c50ace4babf12172793d66b320a9163ce61c5f7b1bc8e947a26e95e9044a7088aeeb106f48130c3bae3315bae185e89ae57d27279d7b0d1661f9abcb600c4739e1315562c0703ed8b926fcca00090d3847ca98e7fd8ae782e5c1df76568e59a09cc872750cf3ace61260ea980f88e14c592d2775cc68f5a36a6b2f +M = 21ec522c5baf8e9a775d7926 + +ModInv = 52cf911c15617bf3662718 +A = 24f0f6e93e943310960d99a32e9a26dcafed5f0f6fbbd092a947dc848063ae3d34a668840e1b58c714c80f5cb636e892c03555b7b474624b3862ed4215127c849b3f0680b02eb69583315d044aa93b898cd011005999b16f535a4d461fe60dc8bf78b1c8ff2efb05487de32e74e5579510861ad99519fa99e692bdc95afbf3bdd118f8280ade127da11d2b057e390706bde946c43d97f494c1119dafad1933ab5c0c9974d53435e35fbbb2667fc3f150ce8cc2b36433bf6638315b910f02682a4bd969146a4f8488bdae9995a0c67c1a79c167ff5ec27422f78de98c9e7c56ecef8f54cd4d81a0a5a8726165b939b71137d045a0b5a8 +M = ce1d1ffb9a14ac10bf8f19 + +ModInv = 410121db68d373307ab7aa +A = a183e22f08ff470ac3e9bed60191eab5b4a1bc0c30e81c3311cdc831724ef777df1ba03864e6330ca63d0032ec07777dfb2bccb409ead583fa33127b3481298d143918e04ced381e7b4d6abd4bc4ae7aae9dd6e8bd150727730d00ef66438bd6d77e4a448d81fc714306806e108e411cb41f97e3c7b61d49b2e8ea9fa5db2c8f770a9621ca12723ef29c38fccd61728eef385414e1a98da6fae02d45060e7405f63cd3ceb46df31a073239e94d9a17c098a1677fed772eaf56f9bfa249c7fbbf770595f5306bb74a659669f26a804d06478e19f3b10057df40d27e70bec567d3a6dbc567c3a2fd3eb4d0fc22c5ca866593efaaf68cf +M = fdc0a3cc971e0005fa9e11 + +ModInv = 4a621a4d439e9db5b1ecfb +A = -2a6ae8667642792f5b6303cbf53ca74d83f7b635225f6a05e0b7e5ca59cd73823d13ca60529ee96d739f4a27c34339eb076f8d71c4da139b12917c2242de1af9c4a2cea81bd259b7d6f48b78848e4e3e5b464b6459f39bd12be9cabe9c8568534542fb5234d88ae2d400837f2e1184a3ae49924e06f51dc720f90dd3dd89e156ca6d8c983ccc47a7a26ed3bd7a74d0f20d7c8716214a3e84ae0299ab9a625aefb3ca5b3c28fc869bf8cb65cba1d6a62a12426250a50daf598df92848082e42920f3a2c362491f8c6232718982bd010e9ec53f6e57a2eb8cad9b84cd94c4e5e724e7fc0026b0d502eab84187db0cb2f5b2153c0fa84d1 +M = b663e92aaece715972c734 + +ModInv = b2536becc88b1efcfa3 +A = 60326857755da8e48a9ae9005b98b5a38fda14bc55678fa203e2b2b9d1236cc47d190f78e423d37d8997070581a7cfb1869a622b40118ca3796d92ad3bdef1b64f683234e8a5b12a7c19c4f581db8c2f4fd92b93b01c11ec102a0466f52dba4e429ecbc84d2ce481fc2260c3d33424f2b38f1d0384601ba3cdda880aa1e846010db3ae4b376da3a39f3b3d7bc4b0d781a052ed0bdee526ed9d23d84fac0e1be32c98305531786e084bc613b9237015315d35861564584291c770ad52a91c8c46c70d52f0733d03a3e4a973e144955e246da050b4b671f33562dc021fec3adc696fea29a6ed589981beda890d5384ad25666b81a8191ba1 +M = caa678bd1fddb37b7ce + +ModInv = 189e8d9e37d7c1f8601 +A = -dee4e2b5bbafcf433f956e291df2c880de9b8b1c7290ca14fe951ad2ac7adce88a9baeef1803e9f899306b4b956c4964dd28b0e22ad5e2a323354f8b211bc4d6db934531c158e4f1f8d4a936c6f39bdd7e583a0e9bc5b62af878ef870310de185e61268fc043a6308b8efec17a93250f0a2d0de8a048a4c9a282e239a4eafe9d236a1eae4ebcaa406be754e8da808cf59a263a2cb9edafd341b76a91846173232d17b17ab32741f99e78ffdd9aefd17a84b375dacaa6555eb9d39b1cfa4bca153c9505c9ac7042ad2f4a7e143eea633f82f4e35fe1d653090c33a1ebb93805be07f51224d94b4ff3c24cb429f7e2f5b0d188f967387f77 +M = de61696c2c18942b06a + +ModInv = 572672d065d0a6b2efc1 +A = -6bf3d31bb56801830e097e26fa072f74d0e6e9632eb53b2cc60983c6630cfb3fe201c68eb4acbad52cc623676374914534cc06e988f86338e0be6f8bcf4f15a112d842d36a6c8eaf7a970ddfde8d2bd213489237fa0f452fe281eb284bd31ee3c26f63b4955d5370cb7d6da9df0d0c0d1ea851596b63f2b399245f28907a85acf6bca72726913665ab9d52ac80ee34472a7e955a82aeb57667fcf4e30bb017833c3e8d248eb0049961aa2f130ff9dba3d5431f871e1acbd0054c851408a1aa08861a6c83668be2f811df78f75d91f23f073cedc75ce263baea819fe38044dbb203ad531c4f169159a81f1234edba1fa542ba4d23be2193 +M = e6e079b841da3eb2aba6 + +ModInv = 7d6e0124a5f08d29c9 +A = a7c085f7b02f6e0776e4b1aed6bfbf696863726679a9ec46bd9a9f1aa31e9999e82b95be739980a82203f580998e168562c9e0d541c37e612826454000af132f783f8283e39b344a6072bd8dc44f570020f984c9f96bebfd7fdb4f66816f58e8828a42fd2b1ac9309c4b6cd4498aa4ad9b792ab7b250b519e4d1d31f4a5ecf8352b980cea2d4220afaeb2b0a38840ec0186e30f6cdf7c18aec41ebc7e7c79c28595bd641fc4cd7be99465c71f094a4e4846402568915109e792c95fe933aa00138ebd61c4ac09c0168d20c585f25fb0e76e29ba6d01174c19943d3e0ed95488a3bac43bf0ed0c1b0a9ea400101bb8c1bed5306cdda2dab0b +M = 7fab59e5387fe35cd3 + +ModInv = 15005142ce84615d2d +A = -c9ede55130efa600993311befa20dc8bf1aadfe59dd9022b7139459211d1dd89e4063a21360ceee06aad3c920147d33677549615d0e24bc28110e65dff61fbd5b6eb8204796eae7816f90e65c824a0676465ca1c50383085a63a5b81d99b18dce07439f78edcfcba4f7d1ea72cb8f117c0b7dde801dfa141da47315431057170b011ff4573a86c30d468c3f1083c7cc184e617b6549e992b4b18b3643278391bcaadf35ea79c5d5539bc59ab5abd6ae20de082f5fe8a549fc96e2bcf5ea89415c3505cbfb97f16afa2154033e769688441cc3a37213ad2538b62c062795f9afeddebb89f945999c47107f8188d2d2f963c7d749b75df0853 +M = 5886247da20c354f78 + +ModInv = 349786a5766e0edaf9 +A = -71b8472116cb778503e002185cc66d7bacb10859703e8337cf247dedb4ddcf7a8433aba2a6879a86c95c348a025f1a6668af4c8f0bb9e38961a702d52c795de0cdca1d758f2108216254c99b10a30ff4019e9f90f0542fc331dd0f86ea6f755e7485e839a5505bda22af1064a1b1cab358ecfeb80858fb1ba00db140fd422cc5b30d2008677e120cfcfbf0cd16877ac8de44a95933090a7ab0f722582c3143fef65c87f06e12190a34d485e5a9b9d19b81a2cd55154c7db38d13f2e75fcf64780dfb1d01b3acc0726ae985283ae530ada14781935bb999ee05ba865ef97ebc32ee8752fefc3c8e99ab6949d74f27cf1063bcc050105751bc +M = 6799cd5517481eca0f + +ModInv = 2a08b6a965fcd91d +A = c8fffc2eb05cc228bfd920b7f6682598d7fc56619c764c52739ffb6a5241058d66407da4f29c47952d99d0cdcde6515622a0bac823f39e2358db0607f5b8a15f71d4ad7a188bd24890823b8eba5f6ab62af3126c22c214dba7f5d5010c5b65d775a08b70a5cf6eba342580f2efe613186cbf9af036b5b2328a6300fe8b2ff8b95fc8cbb8e031f81854adefa53851990ba266279615a5346dd9ee5cbf8386b4689f1c147f9fe4459c722c3125140cde90ff46a69163a9c1bfdab586ac0f3e7a8d10121a3a6962c2d529ce9cc06bd96de23ea37ca7f6dcd6c795de723cbd376bbea54e5b56ad56f0afd7c74962227e844370fc899f5d5d1031a5 +M = 304a9100793014b0 + +ModInv = 3f7f35e9d77b884e +A = -a6a02724effc36c56cc56359405ba4ae711b7c710eeb407bf7d3fcfb0627e6d72820078a3291005f29b8df5add9b5bc0516477db4a0013418a4315aab54202de3d88191e9e04644253506023a973eacc60909c50c3d82de949d34f3a36d65f7aa08bd74d23c6661a95c5d0a12aa693465ca247685e0cc72d96b00d091c7db60ee863a52368a1f103e8d822136cd0f6be89ca08c8800ba5257819007a55e5ff68527bb5deebb17412012ed023c155251e6d7e2991f50be81c0ae42b132a91ba987a2f5d802da4ef8f3d902180d23c67c6560819233122991ac7992c53bdbb411d16aeb5da11867c7bbc877e14b99d2003842cc8320d6d19e5b +M = 60df956905053883 + +ModInv = 60813816ef255 +A = 1e095f0607525c26fb2cec07eb56fdc01dc9f65b3468ba1589a8fa4d234e03c9ae5c638f04d57ee60bc8e681a5137b675be02ddd84a6625bd2fe1ef0564e8c5960de8cd811d6412bb55f7246341ed6652b29cb35ee44319fa6d652a0f52008475d6a1bf9c83aeb2a593f25a42182bb998676126898fca48a6511de2337413b871226828c4b56c2e452de3081202901ffc7f27061932aa866ce304f91aff3eca5b772cc0e7a9946c41f1cccc20fb447f3f5eef9d33e47677cec095a99422493d45b6a6661d1d5278345be59b128bce505e69355419db52ac07135e3e1f3e11deaae13096787aa72efe5fae9229eea435457769eb9ba1a7b0e7b47 +M = f313ece76920b + +ModInv = 8684b639a200f6 +A = -45cb2b7768d19b8f449ba3070adb8499f61f65d78372e837a350f6e563f6613f131c4b8ea98d71f8720b2d5576ce2bc16dc5d13a0b43f4def6a7d548458a7c8409417f771d18bedbddcec6e8625b8c1bdbaaabbc495ebda5615ed2a8df51a9f7c4638e2f68a5298bd28383a73744b78974f8d0f43a07fa214e6584a69aea86abc72580db2a2063c2cec01405053406af6893032fa896e9b0094ad82857fe9048fd0756fb345009f825aebded953ec42126a8bd8bf762ef54a12c4e463649e2247e155747c7eb414ffd614f25073b54f91b2a05d43d012836242c9994c0b75f83de046ceade31b4c8b4ce4b7b4501a48cb67b73041fed7b03e258 +M = 89de66a08a0d15 + +ModInv = 8478fe4549a5 +A = -e18d1db1cea2617b741726fa675433e953bfcdf0fa885ebb0a898839b082d2f2ba44b1088931cbb44c7dc51138d2d0f51b700c319dad7471590208b3b085cd97e3a763a2c09bd59ab35b45035bf67cd9b07cfbe86f63f9cb9da966bb6b0ec734d63a8607f0c724f726bf28d5952e776c6c0c1e85cefaeb5804634a562d313fb6acea239df38aaaa867029488d22bd72562ee1ca6c3be52d1e14c64d2379910301a2ec4665fb458c15eedbac79973452393ff19a3044c56931a0e792e43974fcbc177f8b45828454109ed69da220d19ef2140c7c33c9fb7ca78927ad5b10bb3c4aaea8df2933bf779771571c4bf11bff27952350cb3023072ce1455 +M = 951c1cef5cc2 + +ModInv = 516a640041 +A = -f05e8e230fe9a937cb75ba6854316d29d55003856404dcd595515e3f31b0c6cb1ea24ae323d03c22cbd02a798a60729f1ca4d2abbb63b13fc7c796713fcfde7627f7310a233e6eb5770516a80e080341144a7b616a96ed78b91f8a297c6914eca8141c6ab084536032ba3a4d0d9e015a7abdb9d901b7bda93473927b3e1e5a6f8cec552be166d6edc80f2e5a97ea1315dea97e6ebd0bb7a4494c6d1053005126d7a4c07687c93f40c0da560ea279cb9ebe125b2b98cca7a0afebfab3e19698bedb53bfef7fb0ca91a3f0560af8629197db07fdcd6110ebf350f31599fa798ba6b145c11634651c0d7d616dcdb307065cc9a1c0058c242b9620646f +M = 49638482efb8 + +ModInv = 373de6c2efc3 +A = c98a28f01c3cd7fed8420e057e5ef098a1be53749a00b5ec04ab65e17a82e8d908ea008d26823ffc4bc6e4bae6b83b59bdd4604166b89603b28bafff869e7189f6913a70ce87300aa81919b6fc3bd965af6eed9ecefb779300847484c56d0f83e197dd9b793d5b5da3dae5c793844d6594f52198f75e5a2cc54b4ff2247d3903e8826778b1155406d50c905b0e4ca9e095bf8c5cec48b5c602dc85575466190d693ca8136d1e64fe5b83ef4ee323b083364dd5fbe8f3654468a80b1ccce7b9006e6a9fc096eb17992e8cdc4b80ebe4e2876adf4046a6bce168ef401d04bc6f90660e59a4112626c70a70ef52d65a1b8012934e001b19e6ba3cdc0e +M = 538f94c76513 + +ModInv = 56798b8a3 +A = -dbd2809e05a7fcf1cd9b19fd40e1e7bc9b20b882f841ea490e4d7100a0effa5042845831693c817cee33e08cd6040c89ea94b803425e86e5f26b893c68be2176a4afbe9dcc678d0d2c9189748bbb91759f16531c9f8c6f669de89e99b33d54778d6a9739c9d8d00d9118bdeb283f38d06cd7fcf62664afb045fec6d02b60d7f2c8a4415e8c2696a890a242c45b616c5c8ac6bb5dd5e20b0bbdfa20e8b4e8785638ce338c3bd5eb6674d77fa7c2403079e65fdc7454716355fa4a7d58266779becc91e043c8084c5ce983c15d5e8bb5f162bd6bc265c64932bf993496c33897640cf257631c110a75628b6c95dfd987358b3d0ed824ac541fe3d83598 +M = 43e2e8379f + +ModInv = 280733973e +A = -a729359a39ad28310335f5d39e0535bc4f09b9990f7b5538ec879b1727801f029a2d527d05228d7ecb1b50a52549bed1b3d12eebd2d647a6cea7c02b45c69e3eebcb8293b39cc3b80ce26ef9ef404351202306df8e30c99ec431fdea011f8e57e4b9d31fccd241ffdbf06be9a5fed9bf0a673cc82a0cc247e2198f30191c69dd6a82989e2b6a674871bbc4ee063a8190f1bff9894f00023aede780ce811330c2a66626aade5019335cd56363a72b3bf27b314b01cfc4af99e6586ae46614c3fd0f5eb5c2d24e8d55768bf62b2ba1381b795d8fd0e31cbf069dce79628ec9b98ff04f3639edf199da8df6529c0fbf8abe4b4537aa127f43a45afd9be +M = ae015071e9 + +ModInv = a6896c71 +A = c7e27fa50faebc3eeec971e4723826657cc070d69df7e7a4814d87f7ddcd9f066cd753bd041bb65caf9700aa22d7a1cf78db76065c8d02c38d63efe95e806d68dfa73084c8eda258dffc4a04fcd0258b59856db0adb4bec89b3be6a77ffc8e2179469cfe35230d40ec311fd092dbf04877247260d0c2ff2ea3cb854d0c3e970db0447c4aa0dace324514a1ce14c57cf4bf01a65c083e0b9e17ac987df786e4f5c2faba2d8bb97563f96405946c99ce8d43e224caec3d0fd7161d7bb4d1f730511ad669613d88ed3107755b4bec834de953d9402233110b4d35bb30977235921e2082c0d08eff490b4952398d90ca7431db57d1efb871e31fbb32fc5707 +M = b5266aa6 + +ModInv = 39472c61 +A = -1143293e595737da8c74718889b6085223e3213810f7fcf8109c323621dae8461a51b324c85d02f3ca39f275b2ee37fcf828f9401466653b549554c0550819ad854a18d8134b15a42f73c41d3c53550dff793d0ca83192756ef4cd626b9c3ddaa7567cc54a9d802ba4968dd8baada6d46b6e134feff1a8727133b8813a39ff44bd2a2721debfd529d31437dd1505d2bba6c417d4d29ab09a71a3917eb0c599302a7579b9dc08b99cf2873759f6a3684e156f31cee61064ece2dce320810a842d3208f25c253c41cc2a3c53a2808c687ecc88be89846f376bc21ed4da5f4c4d501181d7ec3eab9e8c69a0a35949675cc5fb0716a8ef209ea975887d09df +M = 4283d2c0 + +ModInv = 5a49ef +A = 53bdc34797c42393446abe564059b9ae5c8f1fca7da27744001a6aa45fe0a0f09780597538cbc54be01c0ef8e010faaced226972f683de11ee00366dadc088177abd25fbab1ba70b967adf354788d4dd79d3b5834f4cecb736d877f1caf0ba49c19fc0a9c8beb070e38434d57084ddfa7fa4ffe9ec11c63d5f77bb3a6a06131db61884f42b4b548a84a5b43d43188b3890644f3d4e7b37d72e4af69787709d9b532aba4e6c3686ff0de26a7698065aab0a377f90ade7bc38d756d0055979a2da95a83ec33dd6887e840043e58844c2354e2bb7740a63c1d8fac168fb90d7b938451ee325faa633406bc44dc2a627940eee3cba6f875c2e84496e7857dd87 +M = 63eb18 + +ModInv = 873e78 +A = -22d8c8d223191db66fda084a766f9b1639263e52de231f39cf9a354b1e0232b6e0758bcf5ec21c5c57cb987dec8407d75befe9847142850d30f05abe986775d5ce18ebd90c0265c90f87a381d5dfc823f411f0b7cd55c93c3fbdfb31a36d3a59c162b54e8daa06d0cb0c3078ff5ac509706031bb3fcbe6853c81c7648e7e111b3025829dbeed8dc378970722756e9cc801420c9a57566951a33f196ee3496022e729fb649d4d3628587ec46bc1291e6248070b1913dc19025fcd669f99ff61f8416310d7543a3b64d0a991d86fb8602ac25bf929aa915f0aea68001d5229877f77b22c5c6316f266f24a7a44668ed66887a3a5561782152bf8818ec8d8bc +M = 8d7f51 + +ModInv = 49c141 +A = -89be8eb5140f16f4488157241955b91dddd91389b372a341738c837a7935bef7e268ffe976ab60581ccace1d62e05b4c8012ede7bd0cffb88309fadb890859001ac9406329bc65b00a2d35d148805071950eadec6f117d836e77af67d461e4163207d094499602f0ee99731c94521919e93ad11745ad498893101c593af514aa4e719d3c7dec00a61f933d6c51e370eb9a0a96263ae6c5e818fac0433cbd7dabe929c4a334bfc6cd75e9bb049a79d7a7a3cc8c3d5f169293de8fc88b28756bad6be28e7aa6e99f19950499dd251de512148239292d22e255accb1a466884f3f49249dc28ff90a5aec7978306d03bf38b2ffc80a4df5a51c9bc701e7ea419 +M = 4ac87f + +ModInv = 3689 +A = 22d6f1b2f7e3c5d8b01228758794ff56f3dc1e5ab454991f034d3ce913db63cb9981d335f267e2a19011bf47d0ad488b2e14dc23b8deff9b9d66bf15ec8d6a34613cb3b2a1a79ed1838657a709128695c4baabacf529a3bdf7385745384a466b83c8dabe1eee42c5333576c64921f33dca31bdc9675ed64cd61cb8c77e5c8aa594fd462d6aa8c126da84cff205f73375f6ca79345b8e88b8d0ad50bc69875ec91bce530a6d003d5b671c33a7531f14a805c38d96690531904413fe28cc3fc0a9b6f671fde19ded2d2805203a4f78c5768f3b6fc9d1e6af1eee64497631e346ecccd9c2a80c1e43e90459d0c91756ccab85e77994ed711708addeefd3e824c1 +M = 5592 + +ModInv = 418d +A = -64e9e3e3e7f088411d99e18eb67daec5648c5009ac23485fcb437d2e575b0d18c6da92f384e903c38ed33b1c27d3e45141002ef698e7cd1fc52784276ec104009d67445ce5f27d6507fc13606cae0ef66f7cbe7e0c1022bd9716e0ee84551638a12ea10f616e9bad9bcc1da330bef6ba8ac9811bc40132d020df8b5078b90bfbd11640e21db1f17247acdfe772dcfd3f498c55fd7366507adc0d7c20077e29963683a01fb0ff9a8b9ffb3c8e150f3862a421673c86e2bd63cab27cc9b648c9b7536d79ced02692f834dc965d6ff265bd69a95d69c3fb39e7adfb65301a30ceb7ec27398f70b9829135558764684dc01a3f15f3f3f8476c21f05718691a351d +M = 5cef + +ModInv = 1519 +A = da097c9f54174682ad7b2995dc92d048bb61a937059dd8d2edc1b903a7c25b0d595dcd237d7d5afac93911c30708d929a8c55a4b7d31b971265f9a2f538869451301b6079a6983e1f1a8187118a3d5b93ec71d01b93595603794cb5bf204c5f16b0d87ed1aeaff89c15cc77b11bdaca41e8f9603993e59eabc836032e84a9105279060ccb7370adedbaeb0de19c956d52aacddd845a986ac05fc357e1664b52a3ccd6c09db640a38f3c028cedb52df430cadb3320b9bb8f6d847a359d19634c24996cf023054c29c7e5ebe31418ca9060312b74f83553be40b3bd61e57a01b8e1fc50e0cb6cf4193cdc4a3ce725eed8450ee0a5c1d08695d8789a113c268e5 +M = 1817 + +ModInv = fffe +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffff + +ModInv = 1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffff + +ModInv = fffe +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffff + +ModInv = 1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffff + +ModInv = fffe +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffff + +ModInv = 1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffff + +ModInv = fffe +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffff + +ModInv = 1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffff + +ModInv = fffe +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffff + +ModInv = 1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffff + +ModInv = fffe +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffff + +ModInv = 1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffff + +ModInv = fffe +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffff + +ModInv = 1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffff + +ModInv = fffe +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffff + +ModInv = 1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffff + +ModInv = fffe +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffff + +ModInv = 1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffff + +ModInv = fffe +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffff + +ModInv = 1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffff + +ModInv = fffe +A = fffffffffffffffffffffffffffffffffffe +M = ffff + +ModInv = 1 +A = -fffffffffffffffffffffffffffffffffffe +M = ffff + +ModInv = fffe +A = -1 +M = ffff + +ModInv = fffffffe +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffff + +ModInv = 1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffff + +ModInv = aaaa5554 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffff + +ModInv = 5555aaab +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffff + +ModInv = aaaa5554 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffff + +ModInv = 5555aaab +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffff + +ModInv = fffffffe +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffff + +ModInv = 1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffff + +ModInv = fffffffe +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffff + +ModInv = 1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffff + +ModInv = aaaa5554 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffff + +ModInv = 5555aaab +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffff + +ModInv = aaaa5554 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffff + +ModInv = 5555aaab +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffff + +ModInv = fffffffe +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffff + +ModInv = 1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffff + +ModInv = fffffffe +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffff + +ModInv = 1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffff + +ModInv = aaaa5554 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffff + +ModInv = 5555aaab +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffff + +ModInv = aaaa5554 +A = fffffffffffffffffffffffffffffffffffe +M = ffffffff + +ModInv = 5555aaab +A = -fffffffffffffffffffffffffffffffffffe +M = ffffffff + +ModInv = fffffffe +A = -1 +M = ffffffff + +ModInv = fffffffffffe +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffff + +ModInv = 1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffff + +ModInv = fffffffffffe +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffff + +ModInv = 1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffff + +ModInv = fffffffffffe +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffff + +ModInv = 1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffff + +ModInv = fffffffffffe +A = fffffffffffffffffffffffffffffffffffe +M = ffffffffffff + +ModInv = 1 +A = -fffffffffffffffffffffffffffffffffffe +M = ffffffffffff + +ModInv = fffffffffffe +A = -1 +M = ffffffffffff + +ModInv = fffffffffffffffe +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffff + +ModInv = 1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffff + +ModInv = 8888444422221110 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffff + +ModInv = 7777bbbbddddeeef +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffff + +ModInv = eeeeddddbbbb7776 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffff + +ModInv = 1111222244448889 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffff + +ModInv = aaaaaaaa55555554 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffff + +ModInv = 55555555aaaaaaab +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffff + +ModInv = aaaaaaaa55555554 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffff + +ModInv = 55555555aaaaaaab +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffff + +ModInv = eeeeddddbbbb7776 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffff + +ModInv = 1111222244448889 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffff + +ModInv = 8888444422221110 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffff + +ModInv = 7777bbbbddddeeef +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffff + +ModInv = fffffffffffffffe +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffff + +ModInv = 1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffff + +ModInv = fffffffffffffffe +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffff + +ModInv = 1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffff + +ModInv = 8888444422221110 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffff + +ModInv = 7777bbbbddddeeef +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffff + +ModInv = eeeeddddbbbb7776 +A = fffffffffffffffffffffffffffffffffffe +M = ffffffffffffffff + +ModInv = 1111222244448889 +A = -fffffffffffffffffffffffffffffffffffe +M = ffffffffffffffff + +ModInv = fffffffffffffffe +A = -1 +M = ffffffffffffffff + +ModInv = d6b56b5ab5ad5ad6ad6a +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffff + +ModInv = 294a94a54a52a5295295 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffff + +ModInv = f7bddef77bdeef7bbdee +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffff + +ModInv = 8422108842110844211 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffff + +ModInv = f7bddef77bdeef7bbdee +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffff + +ModInv = 8422108842110844211 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffff + +ModInv = d6b56b5ab5ad5ad6ad6a +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffff + +ModInv = 294a94a54a52a5295295 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffff + +ModInv = d6b56b5ab5ad5ad6ad6a +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffff + +ModInv = 294a94a54a52a5295295 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffff + +ModInv = f7bddef77bdeef7bbdee +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffff + +ModInv = 8422108842110844211 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffff + +ModInv = f7bddef77bdeef7bbdee +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffff + +ModInv = 8422108842110844211 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffff + +ModInv = d6b56b5ab5ad5ad6ad6a +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffff + +ModInv = 294a94a54a52a5295295 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffff + +ModInv = d6b56b5ab5ad5ad6ad6a +A = fffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffff + +ModInv = 294a94a54a52a5295295 +A = -fffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffff + +ModInv = fffffffffffffffffffe +A = -1 +M = ffffffffffffffffffff + +ModInv = aaaaaaaaaaaa555555555554 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffff + +ModInv = 555555555555aaaaaaaaaaab +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffff + +ModInv = fffffffffffffffffffffffe +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffff + +ModInv = 1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffff + +ModInv = fffffffffffffffffffffffe +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffff + +ModInv = 1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffff + +ModInv = aaaaaaaaaaaa555555555554 +A = fffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffff + +ModInv = 555555555555aaaaaaaaaaab +A = -fffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffff + +ModInv = fffffffffffffffffffffffe +A = -1 +M = ffffffffffffffffffffffff + +ModInv = 8102020404080810102020404080 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffff + +ModInv = 7efdfdfbfbf7f7efefdfdfbfbf7f +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffff + +ModInv = fffffffffffffffffffffffffffe +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffff + +ModInv = 1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffff + +ModInv = fdfbefdf7efdf7efbf7efbf7dfbe +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffff + +ModInv = 204102081020810408104082041 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffff + +ModInv = a952952a52a52a54a54a54a94a94 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffff + +ModInv = 56ad6ad5ad5ad5ab5ab5ab56b56b +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffff + +ModInv = fdfbefdf7efdf7efbf7efbf7dfbe +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffff + +ModInv = 204102081020810408104082041 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffff + +ModInv = fffffffffffffffffffffffffffe +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffff + +ModInv = 1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffff + +ModInv = 8102020404080810102020404080 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffff + +ModInv = 7efdfdfbfbf7f7efefdfdfbfbf7f +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffff + +ModInv = 8102020404080810102020404080 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffff + +ModInv = 7efdfdfbfbf7f7efefdfdfbfbf7f +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffff + +ModInv = fffffffffffffffffffffffffffe +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffff + +ModInv = 1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffff + +ModInv = fdfbefdf7efdf7efbf7efbf7dfbe +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffff + +ModInv = 204102081020810408104082041 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffff + +ModInv = a952952a52a52a54a54a54a94a94 +A = fffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffff + +ModInv = 56ad6ad5ad5ad5ab5ab5ab56b56b +A = -fffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffff + +ModInv = fffffffffffffffffffffffffffe +A = -1 +M = ffffffffffffffffffffffffffff + +ModInv = fffffffffffffffffffffffffffffffe +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffff + +ModInv = 1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffff + +ModInv = 80804040202010100808040402020100 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffff + +ModInv = 7f7fbfbfdfdfefeff7f7fbfbfdfdfeff +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffff + +ModInv = a4a49494929252524a4a494929292524 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffff + +ModInv = 5b5b6b6b6d6dadadb5b5b6b6d6d6dadb +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffff + +ModInv = eeeeeeeeddddddddbbbbbbbb77777776 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffff + +ModInv = 11111111222222224444444488888889 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffff + +ModInv = 88888888444444442222222211111110 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffff + +ModInv = 77777777bbbbbbbbddddddddeeeeeeef +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffff + +ModInv = fefefdfdfbfbf7f7efefdfdfbfbf7f7e +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffff + +ModInv = 1010202040408081010202040408081 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffff + +ModInv = dadad6d6b6b6b5b5adad6d6d6b6b5b5a +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffff + +ModInv = 2525292949494a4a525292929494a4a5 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffff + +ModInv = aaaaaaaaaaaaaaaa5555555555555554 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffff + +ModInv = 5555555555555555aaaaaaaaaaaaaaab +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffff + +ModInv = aaaaaaaaaaaaaaaa5555555555555554 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffff + +ModInv = 5555555555555555aaaaaaaaaaaaaaab +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffff + +ModInv = dadad6d6b6b6b5b5adad6d6d6b6b5b5a +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffff + +ModInv = 2525292949494a4a525292929494a4a5 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffff + +ModInv = fefefdfdfbfbf7f7efefdfdfbfbf7f7e +A = fffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffff + +ModInv = 1010202040408081010202040408081 +A = -fffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffff + +ModInv = fffffffffffffffffffffffffffffffe +A = -1 +M = ffffffffffffffffffffffffffffffff + +ModInv = fffffffffffffffffffffffffffffffffffe +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffff + +ModInv = 1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffff + +ModInv = fffffffffffffffffffffffffffffffffffe +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffff + +ModInv = 1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffff + +ModInv = fffffffffffffffffffffffffffffffffffe +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffff + +ModInv = 1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffff + +ModInv = fffffffffffffffffffffffffffffffffffe +A = fffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffff + +ModInv = 1 +A = -fffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffff + +ModInv = fffffffffffffffffffffffffffffffffffe +A = -1 +M = ffffffffffffffffffffffffffffffffffff + +ModInv = f7bdef7bbdef7bdeef7bdef77bdef7bddef7bdee +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffff + +ModInv = 842108442108421108421088421084221084211 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffff + +ModInv = ffbfdff7fbfeff7fbfeff7fdfeff7fdfeffbfdfe +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffff + +ModInv = 40200804010080401008020100802010040201 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffff + +ModInv = a5294a525294a529294a529494a5294a4a5294a4 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffff + +ModInv = 5ad6b5adad6b5ad6d6b5ad6b6b5ad6b5b5ad6b5b +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffff + +ModInv = f7bdef7bbdef7bdeef7bdef77bdef7bddef7bdee +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffff + +ModInv = 842108442108421108421088421084221084211 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffff + +ModInv = 9224491224891244892244912248912448922448 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffff + +ModInv = 6ddbb6eddb76edbb76ddbb6eddb76edbb76ddbb7 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffff + +ModInv = ffbfdff7fbfeff7fbfeff7fdfeff7fdfeffbfdfe +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffff + +ModInv = 40200804010080401008020100802010040201 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffff + +ModInv = a5294a525294a529294a529494a5294a4a5294a4 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffff + +ModInv = 5ad6b5adad6b5ad6d6b5ad6b6b5ad6b5b5ad6b5b +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffff + +ModInv = 9224491224891244892244912248912448922448 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffff + +ModInv = 6ddbb6eddb76edbb76ddbb6eddb76edbb76ddbb7 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffff + +ModInv = 9224491224891244892244912248912448922448 +A = fffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffff + +ModInv = 6ddbb6eddb76edbb76ddbb6eddb76edbb76ddbb7 +A = -fffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffff + +ModInv = fffffffffffffffffffffffffffffffffffffffe +A = -1 +M = ffffffffffffffffffffffffffffffffffffffff + +ModInv = aa954aa954aa554aa554aa552aa552aa552a9552a954 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 556ab556ab55aab55aab55aad55aad55aad56aad56ab +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffff + +ModInv = a4949252494925249492524a492924a492924a492924 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 5b6b6dadb6b6dadb6b6dadb5b6d6db5b6d6db5b6d6db +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 80100100100200200200200400400400400800800800 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 7feffeffeffdffdffdffdffbffbffbffbff7ff7ff7ff +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 84104208210410820841042082104108208410420820 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 7befbdf7defbef7df7befbdf7defbef7df7befbdf7df +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffff + +ModInv = eeddbbb76eeddbbb76eeddbb776edddbb776edddbb76 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 11224448911224448911224488912224488912224489 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 84104208210410820841042082104108208410420820 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 7befbdf7defbef7df7befbdf7defbef7df7befbdf7df +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 80100100100200200200200400400400400800800800 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 7feffeffeffdffdffdffdffbffbffbffbff7ff7ff7ff +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffff + +ModInv = a4949252494925249492524a492924a492924a492924 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 5b6b6dadb6b6dadb6b6dadb5b6d6db5b6d6db5b6d6db +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffff + +ModInv = aa954aa954aa554aa554aa552aa552aa552a9552a954 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 556ab556ab55aab55aab55aad55aad55aad56aad56ab +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffff + +ModInv = fffffffffffffffffffffffffffffffffffffffffffe +A = -1 +M = ffffffffffffffffffffffffffffffffffffffffffff + +ModInv = eeeeeeeeeeeeddddddddddddbbbbbbbbbbbb777777777776 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 111111111111222222222222444444444444888888888889 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = aaaaaaaaaaaaaaaaaaaaaaaa555555555555555555555554 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 555555555555555555555555aaaaaaaaaaaaaaaaaaaaaaab +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = fffffffffffffffffffffffffffffffffffffffffffffffe +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 888888888888444444444444222222222222111111111110 +A = fffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 777777777777bbbbbbbbbbbbddddddddddddeeeeeeeeeeef +A = -fffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = fffffffffffffffffffffffffffffffffffffffffffffffe +A = -1 +M = ffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = f7777bbbbddddeeeef7777bbbbddddeeeef7777bbbbddddeeeee +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 888844442222111108888444422221111088884444222211111 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 9244912449224892249124491248922489244912449224892248 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 6dbb6edbb6ddb76ddb6edbb6edb76ddb76dbb6edbb6ddb76ddb7 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = dad6b6b5adad6b6b5adad6b6b5ad6d6b5b5ad6d6b5b5ad6d6b5a +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 2529494a52529494a52529494a529294a4a529294a4a529294a5 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 8884422211088444221108884422111088442221108844422110 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 777bbdddeef77bbbddeef777bbddeeef77bbdddeef77bbbddeef +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = fff7ff7ff7ff7ffbffbffbffbffdffdffdffdffeffeffeffeffe +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 8008008008004004004004002002002002001001001001001 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = fdf7dfbefbf7df7efbefbf7df7efbefdf7df7efbefdf7dfbefbe +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 208204104082081041040820810410208208104102082041041 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = fff7ff7ff7ff7ffbffbffbffbffdffdffdffdffeffeffeffeffe +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 8008008008004004004004002002002002001001001001001 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 8884422211088444221108884422111088442221108844422110 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 777bbdddeef77bbbddeef777bbddeeef77bbdddeef77bbbddeef +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = dad6b6b5adad6b6b5adad6b6b5ad6d6b5b5ad6d6b5b5ad6d6b5a +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 2529494a52529494a52529494a529294a4a529294a4a529294a5 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = fffffffffffffffffffffffffffffffffffffffffffffffffffe +A = -1 +M = ffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = d5ab56ad56ad5ab55ab56ad56ad5ab56ab56ad5aad5ab56ab56ad5aa +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 2a54a952a952a54aa54a952a952a54a954a952a552a54a954a952a55 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = aaaaaaaaaaaaaaaaaaaaaaaaaaaa5555555555555555555555555554 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 5555555555555555555555555555aaaaaaaaaaaaaaaaaaaaaaaaaaab +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = fffbffdffefff7ffbffefff7ffbffdffefff7ffdffefff7ffbffdffe +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 40020010008004001000800400200100080020010008004002001 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = eddbb76edbb76eddb76eddbb6eddbb76ddbb76edbb76eddb76eddbb6 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 12244891244891224891224491224489224489124489122489122449 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = a952a54a54a952a52a54a952952a54a94a952a54a54a952a52a54a94 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 56ad5ab5ab56ad5ad5ab56ad6ad5ab56b56ad5ab5ab56ad5ad5ab56b +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = aaaaaaaaaaaaaaaaaaaaaaaaaaaa5555555555555555555555555554 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 5555555555555555555555555555aaaaaaaaaaaaaaaaaaaaaaaaaaab +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 80020004000800100020004000800100020004000800100020004000 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 7ffdfffbfff7ffefffdfffbfff7ffefffdfffbfff7ffefffdfffbfff +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = d5ab56ad56ad5ab55ab56ad56ad5ab56ab56ad5aad5ab56ab56ad5aa +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 2a54a952a952a54aa54a952a952a54a954a952a552a54a954a952a55 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = fffffffffffffffffffffffffffffffffffffffffffffffffffffffe +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = fffbffdffefff7ffbffefff7ffbffdffefff7ffdffefff7ffbffdffe +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 40020010008004001000800400200100080020010008004002001 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 88421108422108442108442108842110842210842210844210884210 +A = fffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 77bdeef7bddef7bbdef7bbdef77bdeef7bddef7bddef7bbdef77bdef +A = -fffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = fffffffffffffffffffffffffffffffffffffffffffffffffffffffe +A = -1 +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = d6b5ad6b5ad6ad6b5ad6b5ad5ad6b5ad6b5ab5ad6b5ad6b56b5ad6b5ad6a +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 294a5294a5295294a5294a52a5294a5294a54a5294a5294a94a5294a5295 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 842108421084108421084210421084210842084210842108210842108420 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 7bdef7bdef7bef7bdef7bdefbdef7bdef7bdf7bdef7bdef7def7bdef7bdf +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 842108421084108421084210421084210842084210842108210842108420 +A = fffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 7bdef7bdef7bef7bdef7bdefbdef7bdef7bdf7bdef7bdef7def7bdef7bdf +A = -fffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +A = -1 +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 8000400020001000080004000200010000800040002000100008000400020000 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 7fffbfffdfffeffff7fffbfffdfffeffff7fffbfffdfffeffff7fffbfffdffff +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 8420841082104210420841082108210420841084108210420842084108210420 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 7bdf7bef7defbdefbdf7bef7def7defbdf7bef7bef7defbdf7bdf7bef7defbdf +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = a4a4a4a49494949492929292525252524a4a4a4a494949492929292925252524 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 5b5b5b5b6b6b6b6b6d6d6d6dadadadadb5b5b5b5b6b6b6b6d6d6d6d6dadadadb +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = dadadadad6d6d6d6b6b6b6b6b5b5b5b5adadadad6d6d6d6d6b6b6b6b5b5b5b5a +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 2525252529292929494949494a4a4a4a525252529292929294949494a4a4a4a5 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = fffefffdfffbfff7ffefffdfffbfff7ffefffdfffbfff7ffefffdfffbfff7ffe +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 1000200040008001000200040008001000200040008001000200040008001 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 9248924492249124892449244922491248924492249224912489244922491248 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 6db76dbb6ddb6edb76dbb6dbb6ddb6edb76dbb6ddb6ddb6edb76dbb6ddb6edb7 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = eeeeeeeeeeeeeeeeddddddddddddddddbbbbbbbbbbbbbbbb7777777777777776 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 1111111111111111222222222222222244444444444444448888888888888889 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 8888888888888888444444444444444422222222222222221111111111111110 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 7777777777777777bbbbbbbbbbbbbbbbddddddddddddddddeeeeeeeeeeeeeeef +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = fbdef7def7bef7bdefbdef7def7bdf7bdefbdef7bef7bdf7bdef7def7bef7bde +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 421082108410842104210821084208421042108410842084210821084108421 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = aa54a954a952a552a54a954a952a552a54aa54a952a952a54aa54a952a952a54 +A = fffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 55ab56ab56ad5aad5ab56ab56ad5aad5ab55ab56ad56ad5ab55ab56ad56ad5ab +A = -fffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +A = -1 +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = d6b56b56b56b56b56b5ab5ab5ab5ab5ab5ad5ad5ad5ad5ad5ad6ad6ad6ad6ad6ad6a +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 294a94a94a94a94a94a54a54a54a54a54a52a52a52a52a52a5295295295295295295 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 84104108208208410410420820841041042082082104104208208210410410820820 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 7befbef7df7df7befbefbdf7df7befbefbdf7df7defbefbdf7df7defbefbef7df7df +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = f77777bbbbbddddddeeeeef777777bbbbbdddddeeeeeef77777bbbbbbdddddeeeeee +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 8888844444222222111110888888444442222211111108888844444422222111111 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = fbef7defbdf7befbdf7bef7defbef7defbdf7bef7df7bef7defbdf7defbdf7bef7de +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 4108210420841042084108210410821042084108208410821042082104208410821 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = eddb76ddb76edbb6edbb6eddb76ddb76ddbb6edbb6edbb76ddb76ddb76edbb6edbb6 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 12248922489124491244912248922489224491244912448922489224891244912449 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = ff7f7f7f7fbfbfbfbfdfdfdfdfefefefeff7f7f7f7fbfbfbfbfdfdfdfdfefefefefe +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 808080804040404020202020101010100808080804040404020202020101010101 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = db6d6db5b6d6db5b6d6db5b6d6db5b6d6db6b6dadb6b6dadb6b6dadb6b6dadb6b6da +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 2492924a492924a492924a492924a492924949252494925249492524949252494925 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 92244892244891244891224891224491224489224489124489122489122449122448 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 6ddbb76ddbb76edbb76eddb76eddbb6eddbb76ddbb76edbb76eddb76eddbb6eddbb7 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = d5555aaaab55556aaaad55556aaaad5555aaaab55556aaaab55556aaaad5555aaaaa +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 2aaaa55554aaaa955552aaaa955552aaaa55554aaaa955554aaaa955552aaaa55555 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 92244892244891244891224891224491224489224489124489122489122449122448 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 6ddbb76ddbb76edbb76eddb76eddbb6eddbb76ddbb76edbb76eddb76eddbb6eddbb7 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = db6d6db5b6d6db5b6d6db5b6d6db5b6d6db6b6dadb6b6dadb6b6dadb6b6dadb6b6da +A = fffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 2492924a492924a492924a492924a492924949252494925249492524949252494925 +A = -fffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +A = -1 +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa555555555555555555555555555555555554 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 555555555555555555555555555555555555aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaab +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa555555555555555555555555555555555554 +A = fffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 555555555555555555555555555555555555aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaab +A = -fffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +A = -1 +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 8842108842108442108422108422108421108421088421084421084421084221084211084210 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 77bdef77bdef7bbdef7bddef7bddef7bdeef7bdef77bdef7bbdef7bbdef7bddef7bdeef7bdef +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = a4a4949292524a4a4949292524a494949292524a494929292524a494929252524a4949292524 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 5b5b6b6d6dadb5b5b6b6d6dadb5b6b6b6d6dadb5b6b6d6d6dadb5b6b6d6dadadb5b6b6d6dadb +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = eeeeddddbbbb7776eeeddddbbbb7776eeeddddbbbb7776eeeddddbbbb7776eeeddddbbbb7776 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 1111222244448889111222244448889111222244448889111222244448889111222244448889 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 8040100401004020080200802010040100401008020080200804010040100402008020080200 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 7fbfeffbfeffbfdff7fdff7fdfeffbfeffbfeff7fdff7fdff7fbfeffbfeffbfdff7fdff7fdff +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = ffbfdfeff7fdfeff7fbfdff7fbfdfeff7fdfeff7fbfeff7fbfdfeffbfdfeff7fbfeff7fbfdfe +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 40201008020100804020080402010080201008040100804020100402010080401008040201 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = a952952952952952952a52a52a52a52a52a52a54a54a54a54a54a54a54a94a94a94a94a94a94 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 56ad6ad6ad6ad6ad6ad5ad5ad5ad5ad5ad5ad5ab5ab5ab5ab5ab5ab5ab56b56b56b56b56b56b +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = d6ad5ab56b56ad5ab5ab56ad5ad5ab56ad6ad5ab56b56ad5ab5ab56ad5ad5ab56ad6ad5ab56a +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 2952a54a94a952a54a54a952a52a54a952952a54a94a952a54a54a952a52a54a952952a54a95 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = ffffbfffeffffbfffeffffbfffeffffbfffeffff7fffdffff7fffdffff7fffdffff7fffdfffe +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 400010000400010000400010000400010000800020000800020000800020000800020001 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = ffffbfffeffffbfffeffffbfffeffffbfffeffff7fffdffff7fffdffff7fffdffff7fffdfffe +A = fffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 400010000400010000400010000400010000800020000800020000800020000800020001 +A = -fffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +A = -1 +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = a5294a5294a5294a4a5294a5294a529494a5294a5294a529294a5294a5294a525294a5294a5294a4 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 5ad6b5ad6b5ad6b5b5ad6b5ad6b5ad6b6b5ad6b5ad6b5ad6d6b5ad6b5ad6b5adad6b5ad6b5ad6b5b +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = aa954aa552aa552a954aa554aa552a954aa954aa552a9552a954aa552aa552a954aa554aa552a954 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 556ab55aad55aad56ab55aab55aad56ab556ab55aad56aad56ab55aad55aad56ab55aab55aad56ab +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = edbb6edb76ddb76dbb6edbb6ddb76ddb6edbb6edb76ddb76dbb6edbb6ddb76ddb6edbb6edb76ddb6 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 12449124892248924491244922489224912449124892248924491244922489224912449124892249 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = ffbfeffbfdff7fdfeffbfeff7fdff7fdfeffbfeff7fdff7fbfeffbfeff7fdff7fbfeffbfdff7fdfe +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 401004020080201004010080200802010040100802008040100401008020080401004020080201 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 82040810208102040820408102081020408204081020410204081040810204102040810408102040 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 7dfbf7efdf7efdfbf7dfbf7efdf7efdfbf7dfbf7efdfbefdfbf7efbf7efdfbefdfbf7efbf7efdfbf +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = aa954aa552aa552a954aa554aa552a954aa954aa552a9552a954aa552aa552a954aa554aa552a954 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 556ab55aad55aad56ab55aab55aad56ab556ab55aad56aad56ab55aad55aad56ab55aab55aad56ab +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 84210842108421082108421084210842084210842108421042108421084210841084210842108420 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 7bdef7bdef7bdef7def7bdef7bdef7bdf7bdef7bdef7bdefbdef7bdef7bdef7bef7bdef7bdef7bdf +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = db6d6db6b6db5b6dadb6d6db6b6db5b6dadb6d6db6b6db5b6dadb6d6db6b6db5b6dadb6d6db6b6da +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 249292494924a4925249292494924a4925249292494924a4925249292494924a4925249292494925 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 82040810208102040820408102081020408204081020410204081040810204102040810408102040 +A = fffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 7dfbf7efdf7efdfbf7dfbf7efdf7efdfbf7dfbf7efdfbefdfbf7efbf7efdfbefdfbf7efbf7efdfbf +A = -fffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +A = -1 +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 912244891224448912244891122448912244489122448912224489122448891224489122244891224488 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 6eddbb76eddbbb76eddbb76eeddbb76eddbbb76eddbb76edddbb76eddbb776eddbb76edddbb76eddbb77 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = eddbb76eddbb6eddbb76eddb76eddbb76eddb76eddbb76edbb76eddbb76edbb76eddbb76ddbb76eddbb6 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 122448912244912244891224891224489122489122448912448912244891244891224489224489122449 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 810204081020204081020408081020408102020408102040408102040810102040810204040810204080 +A = fffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 7efdfbf7efdfdfbf7efdfbf7f7efdfbf7efdfdfbf7efdfbfbf7efdfbf7efefdfbf7efdfbfbf7efdfbf7f +A = -fffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +A = -1 +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 8884422110884442211088442221108844221110884422110888442211088444221108844222110884422110 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 777bbddeef77bbbddeef77bbdddeef77bbddeeef77bbddeef777bbddeef77bbbddeef77bbdddeef77bbddeef +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = edb6db76db6db76db6db76db6dbb6db6dbb6db6dbb6db6ddb6db6ddb6db6ddb6db6edb6db6edb6db6edb6db6 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 1249248924924892492489249244924924492492449249224924922492492249249124924912492491249249 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = d55aab555aab556aab556aad556aad556aad55aaad55aab555aab556aab556aab556aad556aad55aaad55aaa +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 2aa554aaa554aa9554aa9552aa9552aa9552aa5552aa554aaa554aa9554aa9554aa9552aa9552aa5552aa555 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 8010020020040080080100200200400800801002002004004008010010020040040080100100200400400800 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 7feffdffdffbff7ff7feffdffdffbff7ff7feffdffdffbffbff7feffeffdffbffbff7feffeffdffbffbff7ff +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = fefdfbf7efefdfbf7efefdfbf7efdfdfbf7efdfdfbf7efdfbfbf7efdfbfbf7efdfbf7f7efdfbf7f7efdfbf7e +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 102040810102040810102040810202040810202040810204040810204040810204080810204080810204081 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = d6b56b5ab5ad5ad6ad6b56b5ab5ad5ad6ad6b56b5ab5ad5ad6ad6b56b5ab5ad5ad6ad6b56b5ab5ad5ad6ad6a +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 294a94a54a52a5295294a94a54a52a5295294a94a54a52a5295294a94a54a52a5295294a94a54a52a5295295 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = d55aab555aab556aab556aad556aad556aad55aaad55aab555aab556aab556aab556aad556aad55aaad55aaa +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 2aa554aaa554aa9554aa9552aa9552aa9552aa5552aa554aaa554aa9554aa9554aa9552aa9552aa5552aa555 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 8410821041082104108210420821042082104208210420841042084104208410420841082084108208410820 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 7bef7defbef7defbef7defbdf7defbdf7defbdf7defbdf7befbdf7befbdf7befbdf7bef7df7bef7df7bef7df +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 8884422110884442211088442221108844221110884422110888442211088444221108844222110884422110 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 777bbddeef77bbbddeef77bbdddeef77bbddeeef77bbddeef777bbddeef77bbbddeef77bbdddeef77bbddeef +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +A = -1 +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = aa54a952a552a54a952a552a54a952a952a54a952a952a54a954a952a54a954a952a54aa54a952a54aa54a952a54 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 55ab56ad5aad5ab56ad5aad5ab56ad56ad5ab56ad56ad5ab56ab56ad5ab56ab56ad5ab55ab56ad5ab55ab56ad5ab +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = db6dadb6dadb6dadb6dadb6d6db6d6db6d6db6d6db6d6db6b6db6b6db6b6db6b6db6b6db5b6db5b6db5b6db5b6da +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 249252492524925249252492924929249292492924929249492494924949249492494924a4924a4924a4924a4925 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = eeeedddddbbbbb77776eeeedddddbbbb77776eeeedddddbbbbb77776eeeeddddbbbbb77776eeeedddddbbbbb7776 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 11112222244444888891111222224444888891111222224444488889111122224444488889111122222444448889 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 88442110844211084421108442110844211084421108442210884221088422108842210884221088422108842210 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 77bbdeef7bbdeef7bbdeef7bbdeef7bbdeef7bbdeef7bbddef77bddef77bddef77bddef77bddef77bddef77bddef +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = edbb6ddb6edb76dbb6ddb6edb76dbb6edb76dbb6ddb6edb76dbb6ddb6edb76ddb6edb76dbb6ddb6edb76dbb6ddb6 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 12449224912489244922491248924491248924492249124892449224912489224912489244922491248924492249 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 81010101010202020202020404040404040808080808081010101010102020202020204040404040408080808080 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 7efefefefefdfdfdfdfdfdfbfbfbfbfbfbf7f7f7f7f7f7efefefefefefdfdfdfdfdfdfbfbfbfbfbfbf7f7f7f7f7f +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 80000080000040000040000020000020000010000010000008000008000004000004000002000002000001000000 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 7fffff7fffffbfffffbfffffdfffffdfffffefffffeffffff7fffff7fffffbfffffbfffffdfffffdfffffeffffff +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = d555556aaaaaad555556aaaaaad555555aaaaaad555555aaaaaab555555aaaaaab5555556aaaaab5555556aaaaaa +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 2aaaaa95555552aaaaa95555552aaaaaa5555552aaaaaa5555554aaaaaa5555554aaaaaa9555554aaaaaa9555555 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = fffffbffffefffff7ffffdfffff7ffffbffffefffffbffffdfffff7ffffdffffefffffbffffefffff7ffffdffffe +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 400001000008000020000080000400001000004000020000080000200001000004000010000080000200001 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = aaaaa555552aaaa955552aaaa955554aaaaa55554aaaaa555552aaaa555552aaaa955554aaaa955554aaaaa55554 +A = fffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 55555aaaaad55556aaaad55556aaaab55555aaaab55555aaaaad5555aaaaad55556aaaab55556aaaab55555aaaab +A = -fffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +A = -1 +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = a4a4a4a4a4a49494949494949292929292925252525252524a4a4a4a4a4a494949494949292929292929252525252524 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 5b5b5b5b5b5b6b6b6b6b6b6b6d6d6d6d6d6dadadadadadadb5b5b5b5b5b5b6b6b6b6b6b6d6d6d6d6d6d6dadadadadadb +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = eeeeeeeeeeeeeeeeeeeeeeeeddddddddddddddddddddddddbbbbbbbbbbbbbbbbbbbbbbbb777777777777777777777776 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 111111111111111111111111222222222222222222222222444444444444444444444444888888888888888888888889 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa555555555555555555555555555555555555555555555554 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 555555555555555555555555555555555555555555555555aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaab +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = dadadadadadad6d6d6d6d6d6b6b6b6b6b6b6b5b5b5b5b5b5adadadadadad6d6d6d6d6d6d6b6b6b6b6b6b5b5b5b5b5b5a +A = fffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 2525252525252929292929294949494949494a4a4a4a4a4a525252525252929292929292949494949494a4a4a4a4a4a5 +A = -fffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +A = -1 +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = eeddbb76edddbb76eddbb776eddbb76edddbb76eddbb776eddbb76eeddbb76eddbbb76eddbb76eeddbb76eddbbb76eddbb76 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 1122448912224489122448891224489122244891224488912244891122448912244489122448911224489122444891224489 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = a49492524949252494925249492524949252494925249492524a492924a492924a492924a492924a492924a492924a492924 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 5b6b6dadb6b6dadb6b6dadb6b6dadb6b6dadb6b6dadb6b6dadb5b6d6db5b6d6db5b6d6db5b6d6db5b6d6db5b6d6db5b6d6db +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 8208104102082041040820810410208204102082041040820810410208204104082041040820810410208204104082081040 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 7df7efbefdf7dfbefbf7df7efbefdf7dfbefdf7dfbefbf7df7efbefdf7dfbefbf7dfbefbf7df7efbefdf7dfbefbf7df7efbf +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 9249224924892492249244924912492449248924922492489249124924492491249224924892492249244924912492449248 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 6db6ddb6db76db6ddb6dbb6db6edb6dbb6db76db6ddb6db76db6edb6dbb6db6edb6ddb6db76db6ddb6dbb6db6edb6dbb6db7 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 8080404020201010080804040202010100808040402020101008080404020201010080804040202010100808040402020100 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 7f7fbfbfdfdfefeff7f7fbfbfdfdfefeff7f7fbfbfdfdfefeff7f7fbfbfdfdfefeff7f7fbfbfdfdfefeff7f7fbfbfdfdfeff +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = d5aad56ab55aad5aad56ab55aad56ad56ab55aad56ad56ab55aad56ab56ab55aad56ab56ab55aad56ab55ab55aad56ab55aa +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 2a552a954aa552a552a954aa552a952a954aa552a952a954aa552a954a954aa552a954a954aa552a954aa54aa552a954aa55 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = fffffefffffefffffdfffffdfffffbfffffbfffff7fffff7ffffefffffefffffdfffffdfffffbfffffbfffff7fffff7ffffe +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 10000010000020000020000040000040000080000080000100000100000200000200000400000400000800000800001 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = fff7ff7ff7ff7ff7ff7ff7ff7ffbffbffbffbffbffbffbffbffdffdffdffdffdffdffdffdffeffeffeffeffeffeffeffeffe +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 8008008008008008008008004004004004004004004004002002002002002002002002001001001001001001001001001 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = d555555aaaaaaad5555556aaaaaab5555556aaaaaab5555555aaaaaaad5555556aaaaaad5555556aaaaaab5555555aaaaaaa +A = fffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 2aaaaaa55555552aaaaaa95555554aaaaaa95555554aaaaaaa55555552aaaaaa95555552aaaaaa95555554aaaaaaa5555555 +A = -fffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +A = -1 +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = a525292929494a4a4a525292929494a4a4a525292929494a4a4a52525292949494a4a52525292949494a4a52525292949494a4a4 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 5adad6d6d6b6b5b5b5adad6d6d6b6b5b5b5adad6d6d6b6b5b5b5adadad6d6b6b6b5b5adadad6d6b6b6b5b5adadad6d6b6b6b5b5b +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = db6db5b6db6b6db6b6db6d6db6dadb6dadb6db5b6db6b6db6b6db6d6db6d6db6dadb6db5b6db5b6db6b6db6d6db6d6db6dadb6da +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 24924a49249492494924929249252492524924a49249492494924929249292492524924a4924a492494924929249292492524925 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 92449224892449224892449224892449124892449124892449124892249124892249124892249124492249124492249124492248 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 6dbb6ddb76dbb6ddb76dbb6ddb76dbb6edb76dbb6edb76dbb6edb76ddb6edb76ddb6edb76ddb6edbb6ddb6edbb6ddb6edbb6ddb7 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = dad6d6b6b5adad6d6b5b5adad6b6b5b5ad6d6b6b5adad6d6b5b5adad6b6b5b5ad6d6b6b5adad6d6b5b5adad6b6b5b5ad6d6b6b5a +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 252929494a52529294a4a52529494a4a52929494a52529294a4a52529494a4a52929494a52529294a4a52529494a4a52929494a5 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = ffffff7fffff7fffffbfffffbfffffdfffffdfffffefffffeffffff7fffff7fffffbfffffbfffffdfffffdfffffefffffefffffe +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 80000080000040000040000020000020000010000010000008000008000004000004000002000002000001000001000001 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = a952952a52a54a54a94a952952a52a54a54a54a94a952952a52a54a54a94a952952a52a52a54a54a94a952952a52a54a54a94a94 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 56ad6ad5ad5ab5ab56b56ad6ad5ad5ab5ab5ab56b56ad6ad5ad5ab5ab56b56ad6ad5ad5ad5ab5ab56b56ad6ad5ad5ab5ab56b56b +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = aaa5552aa5552aa9552aa9552aa9554aa9554aaa554aaa554aaa5552aa5552aa5552aa9552aa9554aa9554aa9554aaa554aaa554 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 555aaad55aaad556aad556aad556aab556aab555aab555aab555aaad55aaad55aaad556aad556aab556aab556aab555aab555aab +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = dad6d6b6b5adad6d6b5b5adad6b6b5b5ad6d6b6b5adad6d6b5b5adad6b6b5b5ad6d6b6b5adad6d6b5b5adad6b6b5b5ad6d6b6b5a +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 252929494a52529294a4a52529494a4a52929494a52529294a4a52529494a4a52929494a52529294a4a52529494a4a52929494a5 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = fbdef7bdefbdef7bdefbdef7bdef7def7bdef7def7bdef7def7bdef7bef7bdef7bef7bdef7bef7bdef7bdf7bdef7bdf7bdef7bde +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 4210842104210842104210842108210842108210842108210842108410842108410842108410842108420842108420842108421 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +A = -1 +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = db6db6db6db6db6db6db6db6db6db6db6db6b6db6db6db6db6db6db6db6db6db6db6db6d6db6db6db6db6db6db6db6db6db6db6db6da +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 249249249249249249249249249249249249492492492492492492492492492492492492924924924924924924924924924924924925 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = db6db6db6db6db6db6db6db6db6db6db6db6b6db6db6db6db6db6db6db6db6db6db6db6d6db6db6db6db6db6db6db6db6db6db6db6da +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 249249249249249249249249249249249249492492492492492492492492492492492492924924924924924924924924924924924925 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = db6db6db6db6db6db6db6db6db6db6db6db6b6db6db6db6db6db6db6db6db6db6db6db6d6db6db6db6db6db6db6db6db6db6db6db6da +A = fffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 249249249249249249249249249249249249492492492492492492492492492492492492924924924924924924924924924924924925 +A = -fffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +A = -1 +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 9122448912244891122448912244891222448912244891222448912244891224448912244891224448912244891224488912244891224488 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 6eddbb76eddbb76eeddbb76eddbb76edddbb76eddbb76edddbb76eddbb76eddbbb76eddbb76eddbbb76eddbb76eddbb776eddbb76eddbb77 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = eeeeeeeeeeeeeeeeeeeeeeeeeeeeddddddddddddddddddddddddddddbbbbbbbbbbbbbbbbbbbbbbbbbbbb7777777777777777777777777776 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 1111111111111111111111111111222222222222222222222222222244444444444444444444444444448888888888888888888888888889 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = ffffffdffffff7fffffeffffffbfffffeffffffdffffff7fffffdffffffbfffffeffffffbffffff7fffffdffffff7fffffeffffffbfffffe +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 2000000800000100000040000010000002000000800000200000040000010000004000000800000200000080000010000004000001 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = a492924a49252494924a492924949252492924a49252494924a492924949252492924a49252494924a492924949252492924a49252494924 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 5b6d6db5b6dadb6b6db5b6d6db6b6dadb6d6db5b6dadb6b6db5b6d6db6b6dadb6d6db5b6dadb6b6db5b6d6db6b6dadb6d6db5b6dadb6b6db +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 8842210844211084221088421108442108842210844211084221088421108442108842210844211084221088421108442108842210844210 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 77bddef7bbdeef7bddef77bdeef7bbdef77bddef7bbdeef7bddef77bdeef7bbdef77bddef7bbdeef7bddef77bdeef7bbdef77bddef7bbdef +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 8888888888888888888888888888444444444444444444444444444422222222222222222222222222221111111111111111111111111110 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 7777777777777777777777777777bbbbbbbbbbbbbbbbbbbbbbbbbbbbddddddddddddddddddddddddddddeeeeeeeeeeeeeeeeeeeeeeeeeeef +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 8000000400000010000000400000010000000400000010000000400000020000000800000020000000800000020000000800000020000000 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 7ffffffbffffffefffffffbffffffefffffffbffffffefffffffbffffffdfffffff7ffffffdfffffff7ffffffdfffffff7ffffffdfffffff +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 9122448912244891122448912244891222448912244891222448912244891224448912244891224448912244891224488912244891224488 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 6eddbb76eddbb76eeddbb76eddbb76edddbb76eddbb76edddbb76eddbb76eddbbb76eddbb76eddbbb76eddbb76eddbb776eddbb76eddbb77 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = aaa9554aaa5552aa9554aaa5552aa9554aaa5554aaa5552aa9554aaa5552aa9554aaa5552aaa5552aa9554aaa5552aa9554aaa5552aa9554 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 5556aab555aaad556aab555aaad556aab555aaab555aaad556aab555aaad556aab555aaad555aaad556aab555aaad556aab555aaad556aab +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 8040100802010040200804010080201004020080201004020080401008020100402008040100402008040100802010040200804010080200 +A = fffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 7fbfeff7fdfeffbfdff7fbfeff7fdfeffbfdff7fdfeffbfdff7fbfeff7fdfeffbfdff7fbfeffbfdff7fbfeff7fdfeffbfdff7fbfeff7fdff +A = -fffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +A = -1 +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 91222444889112224448891222444889112224448891122444889112224448891122244889112224448891122244489112224448891122244488 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 6edddbbb776eedddbbb776edddbbb776eedddbbb776eeddbbb776eedddbbb776eedddbb776eedddbbb776eedddbbb76eedddbbb776eedddbbb77 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 80401004010040100402008020080200802008040100401004010040100802008020080200802010040100401004010040200802008020080200 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 7fbfeffbfeffbfeffbfdff7fdff7fdff7fdff7fbfeffbfeffbfeffbfeff7fdff7fdff7fdff7fdfeffbfeffbfeffbfeffbfdff7fdff7fdff7fdff +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 84104104104208208208208410410410410820820820821041041041042082082082084104104104108208208208210410410410420820820820 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 7befbefbefbdf7df7df7df7befbefbefbef7df7df7df7defbefbefbefbdf7df7df7df7befbefbefbef7df7df7df7defbefbefbefbdf7df7df7df +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = aa954aa552a954aa554aa552a954aa552aa552a954aa552a9552a954aa552a954aa954aa552a954aa554aa552a954aa552aa552a954aa552a954 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 556ab55aad56ab55aab55aad56ab55aad55aad56ab55aad56aad56ab55aad56ab556ab55aad56ab55aab55aad56ab55aad55aad56ab55aad56ab +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = eeddbbb76eeddbbb76eeddbbb76eeddbbb76eeddbbb76eeddbbb76eeddbb776edddbb776edddbb776edddbb776edddbb776edddbb776edddbb76 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 11224448911224448911224448911224448911224448911224448911224488912224488912224488912224488912224488912224488912224489 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = d56aad56aad56aad56aad56aad56aad55aad55aad55aad55aad55aad55aab55aab55aab55aab55aab55aab556ab556ab556ab556ab556ab556aa +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 2a9552a9552a9552a9552a9552a9552aa552aa552aa552aa552aa552aa554aa554aa554aa554aa554aa554aa954aa954aa954aa954aa954aa955 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = a94a54a52a5295294a94a54a52a5295294a94a54a52a5295294a94a54a52a5295294a94a54a52a5295294a94a54a52a5295294a94a54a52a5294 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 56b5ab5ad5ad6ad6b56b5ab5ad5ad6ad6b56b5ab5ad5ad6ad6b56b5ab5ad5ad6ad6b56b5ab5ad5ad6ad6b56b5ab5ad5ad6ad6b56b5ab5ad5ad6b +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = ffbfdff7fbfeff7fdfeffbfdff7fbfeff7fdfeff7fdfeffbfdff7fbfeff7fdfeffbfdff7fbfeff7fbfeff7fdfeffbfdff7fbfeff7fdfeffbfdfe +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 402008040100802010040200804010080201008020100402008040100802010040200804010080401008020100402008040100802010040201 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = a4924924949249249292492492524924924a49249249292492492524924924a49249249492492492524924924a49249249492492492924924924 +A = fffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 5b6db6db6b6db6db6d6db6db6dadb6db6db5b6db6db6d6db6db6dadb6db6db5b6db6db6b6db6db6dadb6db6db5b6db6db6b6db6db6d6db6db6db +A = -fffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +A = -1 +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 922489224892244912449124489224892248912449124491224892248922449124491244892248922489124491244912248922489224491244912448 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 6ddb76ddb76ddbb6edbb6edbb76ddb76ddb76edbb6edbb6eddb76ddb76ddbb6edbb6edbb76ddb76ddb76edbb6edbb6eddb76ddb76ddbb6edbb6edbb7 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = d6b5ad6b5ad6b5ad6b5ad6b56b5ad6b5ad6b5ad6b5ad6b5ab5ad6b5ad6b5ad6b5ad6b5ad5ad6b5ad6b5ad6b5ad6b5ad6ad6b5ad6b5ad6b5ad6b5ad6a +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 294a5294a5294a5294a5294a94a5294a5294a5294a5294a54a5294a5294a5294a5294a52a5294a5294a5294a5294a5295294a5294a5294a5294a5295 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 802008020080100401004010020080200802004010040100200802008020040100401004008020080200401004010040080200802008010040100400 +A = fffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 7fdff7fdff7feffbfeffbfeffdff7fdff7fdffbfeffbfeffdff7fdff7fdffbfeffbfeffbff7fdff7fdffbfeffbfeffbff7fdff7fdff7feffbfeffbff +A = -fffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +A = -1 +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = fffefffdfffbfff7ffefffdfffbfff7ffefffdfffbfff7ffefffdfffbfff7ffefffdfffbfff7ffefffdfffbfff7ffefffdfffbfff7ffefffdfffbfff7ffe +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 1000200040008001000200040008001000200040008001000200040008001000200040008001000200040008001000200040008001000200040008001 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = a4925249292494924a4925249292494924a4925249292494924a4925249292494924a4925249292494924a4925249292494924a4925249292494924a4924 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 5b6dadb6d6db6b6db5b6dadb6d6db6b6db5b6dadb6d6db6b6db5b6dadb6d6db6b6db5b6dadb6d6db6b6db5b6dadb6d6db6b6db5b6dadb6d6db6b6db5b6db +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = eddbb6eddbb6eddb76eddb76eddb76edbb76edbb76edbb76ddbb76ddbb76ddbb6eddbb6eddbb6eddb76eddb76eddb76edbb76edbb76edbb76ddbb76ddbb6 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 1224491224491224891224891224891244891244891244892244892244892244912244912244912248912248912248912448912448912448922448922449 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = aa954aa954aa954aa954aa954aa954aa554aa554aa554aa554aa554aa554aa552aa552aa552aa552aa552aa552aa552a9552a9552a9552a9552a9552a954 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 556ab556ab556ab556ab556ab556ab55aab55aab55aab55aab55aab55aab55aad55aad55aad55aad55aad55aad55aad56aad56aad56aad56aad56aad56ab +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 9249248924924492492449249224924912492491249248924924492492449249224924922492491249248924924892492449249224924922492491249248 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 6db6db76db6dbb6db6dbb6db6ddb6db6edb6db6edb6db76db6dbb6db6dbb6db6ddb6db6ddb6db6edb6db76db6db76db6dbb6db6ddb6db6ddb6db6edb6db7 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = edb6db6db76db6db6dbb6db6db6dbb6db6db6ddb6db6db6edb6db6db6edb6db6db76db6db6db76db6db6dbb6db6db6ddb6db6db6ddb6db6db6edb6db6db6 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 1249249248924924924492492492449249249224924924912492492491249249248924924924892492492449249249224924924922492492491249249249 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = f77bbbddeeef77bbbddeeef777bbdddeef777bbdddeeef77bbbddeeef77bbbdddeef777bbdddeef777bbbddeeef77bbbddeeef777bbdddeef777bbdddeee +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 884442211108844422111088844222110888442221110884442211108844422211088844222110888444221110884442211108884422211088844222111 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = fdf7df7df7df7efbefbefbefbf7df7df7df7dfbefbefbefbefdf7df7df7df7efbefbefbefbf7df7df7df7dfbefbefbefbefdf7df7df7df7efbefbefbefbe +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 208208208208104104104104082082082082041041041041020820820820810410410410408208208208204104104104102082082082081041041041041 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = aaaaaaa5555554aaaaaa95555554aaaaaa95555552aaaaaa55555552aaaaaa5555554aaaaaaa5555554aaaaaa95555552aaaaaa95555552aaaaaa5555554 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 5555555aaaaaab5555556aaaaaab5555556aaaaaad555555aaaaaaad555555aaaaaab5555555aaaaaab5555556aaaaaad5555556aaaaaad555555aaaaaab +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 8884422110884422111088442211088442221108844221108844222110884422110884442211088442211088444221108844221108884422110884422110 +A = fffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 777bbddeef77bbddeeef77bbddeef77bbdddeef77bbddeef77bbdddeef77bbddeef77bbbddeef77bbddeef77bbbddeef77bbddeef777bbddeef77bbddeef +A = -fffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +A = -1 +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = d5556aaab5555aaaad5556aaab5555aaaad5556aaab5555aaaad5556aaab5555aaaad5556aaab5555aaaad5556aaab5555aaaad5556aaab5555aaaad5556aaaa +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 2aaa95554aaaa55552aaa95554aaaa55552aaa95554aaaa55552aaa95554aaaa55552aaa95554aaaa55552aaa95554aaaa55552aaa95554aaaa55552aaa95555 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = d6b5ad5ad6b56b5ad6ad6b5ab5ad6b56b5ad5ad6b5ab5ad6ad6b5ad5ad6b56b5ad6ad6b5ab5ad6b56b5ad5ad6b5ab5ad6ad6b5ad5ad6b56b5ad6ad6b5ab5ad6a +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 294a52a5294a94a5295294a54a5294a94a52a5294a54a5295294a52a5294a94a5295294a54a5294a94a52a5294a54a5295294a52a5294a94a5295294a54a5295 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 84208420841084108210821042104210420842084108410821082108210421042084208410841084108210821042104208420842084108410821082104210420 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 7bdf7bdf7bef7bef7def7defbdefbdefbdf7bdf7bef7bef7def7def7defbdefbdf7bdf7bef7bef7bef7def7defbdefbdf7bdf7bdf7bef7bef7def7defbdefbdf +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 92489248924492449224922491249124892489244924492449224922491249124892489244924492249224922491249124892489244924492249224912491248 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 6db76db76dbb6dbb6ddb6ddb6edb6edb76db76dbb6dbb6dbb6ddb6ddb6edb6edb76db76dbb6dbb6ddb6ddb6ddb6edb6edb76db76dbb6dbb6ddb6ddb6edb6edb7 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = fffffffdfffffff7ffffffdfffffff7ffffffdfffffff7ffffffdfffffff7ffffffefffffffbffffffefffffffbffffffefffffffbffffffefffffffbffffffe +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 2000000080000002000000080000002000000080000002000000080000001000000040000001000000040000001000000040000001000000040000001 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 82081040820410208104082041020810408204102082041020810408204102081040820410208104082041040820410208104082041020810408204102081040 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 7df7efbf7dfbefdf7efbf7dfbefdf7efbf7dfbefdf7dfbefdf7efbf7dfbefdf7efbf7dfbefdf7efbf7dfbefbf7dfbefdf7efbf7dfbefdf7efbf7dfbefdf7efbf +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = fefefefefefefefefdfdfdfdfdfdfdfdfbfbfbfbfbfbfbfbf7f7f7f7f7f7f7f7efefefefefefefefdfdfdfdfdfdfdfdfbfbfbfbfbfbfbfbf7f7f7f7f7f7f7f7e +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 1010101010101010202020202020202040404040404040408080808080808081010101010101010202020202020202040404040404040408080808080808081 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 80808080808080804040404040404040202020202020202010101010101010100808080808080808040404040404040402020202020202020101010101010100 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 7f7f7f7f7f7f7f7fbfbfbfbfbfbfbfbfdfdfdfdfdfdfdfdfefefefefefefefeff7f7f7f7f7f7f7f7fbfbfbfbfbfbfbfbfdfdfdfdfdfdfdfdfefefefefefefeff +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = ffdff7feffbff7fdffbfeffdff7fdffbfeffdff7feffbff7fdff7feffbff7fdffbfeffdff7feffbfeffdff7feffbff7fdffbfeffbff7fdffbfeffdff7feffbfe +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 200801004008020040100200802004010020080100400802008010040080200401002008010040100200801004008020040100400802004010020080100401 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 88442110884221108442110884221108442210884221108442210884221108442210884421108442210884421108442210884421108842210884421108842210 +A = fffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 77bbdeef77bddeef7bbdeef77bddeef7bbddef77bddeef7bbddef77bddeef7bbddef77bbdeef7bbddef77bbdeef7bbddef77bbdeef77bddef77bbdeef77bddef +A = -fffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +A = -1 +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = fbdf7bef7def7defbdf7bef7bef7defbdf7bdf7bef7defbdefbdf7bef7def7defbdf7bef7bef7defbdf7bdf7bef7defbdefbdf7bef7def7defbdf7bef7bef7defbde +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 42084108210821042084108410821042084208410821042104208410821082104208410841082104208420841082104210420841082108210420841084108210421 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = eedddbbb776edddbbb776eeddbbb776eedddbb776eedddbb776eedddbbb76eedddbbb776edddbbb776eeddbbb776eeddbbb776eedddbb776eedddbbb76eedddbbb76 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 112224448891222444889112244488911222448891122244889112224448911222444889122244488911224448891122444889112224488911222444891122244489 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = a4949292524a49292524a49492524a49492924a4949292524949292524a49292524a49492524a49492924a4949292524949292524a49292524a49492524a49492924 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 5b6b6d6dadb5b6d6dadb5b6b6dadb5b6b6d6db5b6b6d6dadb6b6d6dadb5b6d6dadb5b6b6dadb5b6b6d6db5b6b6d6dadb6b6d6dadb5b6d6dadb5b6b6dadb5b6b6d6db +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +A = -1 +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 9224491224491224491224891224891224891244891244891244892244892244892244912244912244912248912248912248912448912448912448922448922448922448 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 6ddbb6eddbb6eddbb6eddb76eddb76eddb76edbb76edbb76edbb76ddbb76ddbb76ddbb6eddbb6eddbb6eddb76eddb76eddb76edbb76edbb76edbb76ddbb76ddbb76ddbb7 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 8010010020020040040040080080100100200200200400400800801001001002002004004008008008010010020020040040040080080100100200200200400400800800 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 7feffeffdffdffbffbffbff7ff7feffeffdffdffdffbffbff7ff7feffeffeffdffdffbffbff7ff7ff7feffeffdffdffbffbffbff7ff7feffeffdffdffdffbffbff7ff7ff +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = a5252529292949494a4a4a525252529292949494a4a4a525252929292949494a4a4a525252929294949494a4a4a5252529292949494a4a4a4a5252529292949494a4a4a4 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 5adadad6d6d6b6b6b5b5b5adadadad6d6d6b6b6b5b5b5adadad6d6d6d6b6b6b5b5b5adadad6d6d6b6b6b6b5b5b5adadad6d6d6b6b6b5b5b5b5adadad6d6d6b6b6b5b5b5b +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = a94a54a5295294a94a52a5294a94a54a5295294a54a52a5294a94a54a5295294a54a52a5294a94a52a5295294a54a52a5294a94a52a5295294a54a5295294a94a52a5294 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 56b5ab5ad6ad6b56b5ad5ad6b56b5ab5ad6ad6b5ab5ad5ad6b56b5ab5ad6ad6b5ab5ad5ad6b56b5ad5ad6ad6b5ab5ad5ad6b56b5ad5ad6ad6b5ab5ad6ad6b56b5ad5ad6b +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = a492524925249292492924949249492494924a4924a492524925249252492924929249492494924a4924a4924a492524925249292492924929249492494924a4924a4924 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 5b6dadb6dadb6d6db6d6db6b6db6b6db6b6db5b6db5b6dadb6dadb6dadb6d6db6d6db6b6db6b6db5b6db5b6db5b6dadb6dadb6d6db6d6db6d6db6b6db6b6db5b6db5b6db +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = aa552a552a952a952a954a954aa54aa54aa552a552a952a952a954a954aa54aa54aa552a552a552a952a954a954a954aa54aa552a552a552a952a954a954a954aa54aa54 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 55aad5aad56ad56ad56ab56ab55ab55ab55aad5aad56ad56ad56ab56ab55ab55ab55aad5aad5aad56ad56ab56ab56ab55ab55aad5aad5aad56ad56ab56ab56ab55ab55ab +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 9249249124924912492491249249124924922492492249249224924922492492249249244924924492492449249244924924492492489249248924924892492489249248 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 6db6db6edb6db6edb6db6edb6db6edb6db6ddb6db6ddb6db6ddb6db6ddb6db6ddb6db6dbb6db6dbb6db6dbb6db6dbb6db6dbb6db6db76db6db76db6db76db6db76db6db7 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = db6d6db6b6dadb6d6db5b6dadb6b6db5b6d6db6b6dadb6d6db5b6dadb6b6db5b6d6db6b6dadb6d6db5b6dadb6b6db5b6d6db6b6dadb6d6db5b6dadb6b6db5b6d6db6b6da +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 2492924949252492924a49252494924a492924949252492924a49252494924a492924949252492924a49252494924a492924949252492924a49252494924a49292494925 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = f7777bbbbbddddeeeeef77777bbbbdddddeeeef77777bbbbbddddeeeeef7777bbbbbdddddeeeef77777bbbbdddddeeeeef7777bbbbbddddeeeeef77777bbbbdddddeeeee +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 888844444222211111088888444422222111108888844444222211111088884444422222111108888844442222211111088884444422221111108888844442222211111 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 8204081020408104081020408102041020408102040810408102040810204102040810204082040810204081020810204081020408204081020408102081020408102040 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 7dfbf7efdfbf7efbf7efdfbf7efdfbefdfbf7efdfbf7efbf7efdfbf7efdfbefdfbf7efdfbf7dfbf7efdfbf7efdf7efdfbf7efdfbf7dfbf7efdfbf7efdf7efdfbf7efdfbf +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 9249249124924912492491249249124924922492492249249224924922492492249249244924924492492449249244924924492492489249248924924892492489249248 +A = fffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 6db6db6edb6db6edb6db6edb6db6edb6db6ddb6db6ddb6db6ddb6db6ddb6db6ddb6db6dbb6db6dbb6db6dbb6db6dbb6db6dbb6db6db76db6db76db6db76db6db76db6db7 +A = -fffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +A = -1 +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 88844222110888442221108844422111088444221110884422211088844222110888442211108844422111088444221108884422211088844222110884442211108844422110 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 777bbdddeef777bbdddeef77bbbddeeef77bbbddeeef77bbdddeef777bbdddeef777bbddeeef77bbbddeeef77bbbddeef777bbdddeef777bbdddeef77bbbddeeef77bbbddeef +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = a5294a5294a5294a5294a5294a525294a5294a5294a5294a5294a529294a5294a5294a5294a5294a529494a5294a5294a5294a5294a5294a4a5294a5294a5294a5294a5294a4 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 5ad6b5ad6b5ad6b5ad6b5ad6b5adad6b5ad6b5ad6b5ad6b5ad6b5ad6d6b5ad6b5ad6b5ad6b5ad6b5ad6b6b5ad6b5ad6b5ad6b5ad6b5ad6b5b5ad6b5ad6b5ad6b5ad6b5ad6b5b +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = edb6ddb6dbb6db76db6edb6ddb6dbb6db76db6edb6ddb6db76db6edb6ddb6dbb6db76db6edb6ddb6dbb6db76db6edb6dbb6db76db6edb6ddb6dbb6db76db6edb6ddb6dbb6db6 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 12492249244924892491249224924492489249124922492489249124922492449248924912492249244924892491249244924892491249224924492489249124922492449249 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = a4a4a49494949292925252524a4a49494949292925252524a4a49494949292925252524a4a4a494949292929252524a4a4a494949292929252524a4a4a494949292929252524 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 5b5b5b6b6b6b6d6d6dadadadb5b5b6b6b6b6d6d6dadadadb5b5b6b6b6b6d6d6dadadadb5b5b5b6b6b6d6d6d6dadadb5b5b5b6b6b6d6d6d6dadadb5b5b5b6b6b6d6d6d6dadadb +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = f7bdef7bdef7bdef7bdef7bdef7bbdef7bdef7bdef7bdef7bdef7bdeef7bdef7bdef7bdef7bdef7bdef77bdef7bdef7bdef7bdef7bdef7bddef7bdef7bdef7bdef7bdef7bdee +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 8421084210842108421084210844210842108421084210842108421108421084210842108421084210884210842108421084210842108422108421084210842108421084211 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = fbefbef7df7defbefbef7df7defbefbef7df7defbefbdf7df7defbefbdf7df7defbefbdf7df7befbefbdf7df7befbefbdf7df7befbef7df7df7befbef7df7df7befbef7df7de +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 4104108208210410410820821041041082082104104208208210410420820821041042082084104104208208410410420820841041082082084104108208208410410820821 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = a5294a5294a5294a5294a5294a525294a5294a5294a5294a5294a529294a5294a5294a5294a5294a529494a5294a5294a5294a5294a5294a4a5294a5294a5294a5294a5294a4 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 5ad6b5ad6b5ad6b5ad6b5ad6b5adad6b5ad6b5ad6b5ad6b5ad6b5ad6d6b5ad6b5ad6b5ad6b5ad6b5ad6b6b5ad6b5ad6b5ad6b5ad6b5ad6b5b5ad6b5ad6b5ad6b5ad6b5ad6b5b +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = a4a4a49494949292925252524a4a49494949292925252524a4a49494949292925252524a4a4a494949292929252524a4a4a494949292929252524a4a4a494949292929252524 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 5b5b5b6b6b6b6d6d6dadadadb5b5b6b6b6b6d6d6dadadadb5b5b6b6b6b6d6d6dadadadb5b5b5b6b6b6d6d6d6dadadb5b5b5b6b6b6d6d6d6dadadb5b5b5b6b6b6d6d6d6dadadb +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 80100100100100100100100100100100100200200200200200200200200200200200200400400400400400400400400400400400400800800800800800800800800800800800 +A = fffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 7feffeffeffeffeffeffeffeffeffeffeffdffdffdffdffdffdffdffdffdffdffdffdffbffbffbffbffbffbffbffbffbffbffbffbff7ff7ff7ff7ff7ff7ff7ff7ff7ff7ff7ff +A = -fffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +A = -1 +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 888888888888888888888888888888888888444444444444444444444444444444444444222222222222222222222222222222222222111111111111111111111111111111111110 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 777777777777777777777777777777777777bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbddddddddddddddddddddddddddddddddddddeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeef +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa555555555555555555555555555555555555555555555555555555555555555555555554 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 555555555555555555555555555555555555555555555555555555555555555555555555aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaab +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeddddddddddddddddddddddddddddddddddddbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb777777777777777777777777777777777776 +A = fffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 111111111111111111111111111111111111222222222222222222222222222222222222444444444444444444444444444444444444888888888888888888888888888888888889 +A = -fffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +A = -1 +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = a94a5294a5294a94a5294a5294a94a5294a5294a54a5294a5294a54a5294a5294a54a5294a5294a52a5294a5294a52a5294a5294a52a5294a5294a5295294a5294a5295294a5294a5294 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 56b5ad6b5ad6b56b5ad6b5ad6b56b5ad6b5ad6b5ab5ad6b5ad6b5ab5ad6b5ad6b5ab5ad6b5ad6b5ad5ad6b5ad6b5ad5ad6b5ad6b5ad5ad6b5ad6b5ad6ad6b5ad6b5ad6ad6b5ad6b5ad6b +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = fdf7df7df7df7dfbefbefbefbefbefdf7df7df7df7df7efbefbefbefbefdf7df7df7df7df7efbefbefbefbefbf7df7df7df7df7efbefbefbefbefbf7df7df7df7df7dfbefbefbefbefbe +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 208208208208204104104104104102082082082082081041041041041020820820820820810410410410410408208208208208104104104104104082082082082082041041041041041 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = ffffffffdffffffffbffffffff7fffffffeffffffffdffffffff7fffffffeffffffffdffffffffbffffffff7fffffffeffffffffbffffffff7fffffffeffffffffdffffffffbfffffffe +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 20000000040000000080000000100000000200000000800000001000000002000000004000000008000000010000000040000000080000000100000000200000000400000001 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = f7bbddef77bbdeef77bddeef77bddeef7bbddef77bbddef77bbdeef77bddeef77bddeef7bbddef77bbdeef77bbdeef77bddeef7bbddeef7bbddef77bbdeef77bbdeef77bddeef7bbddee +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 844221088442110884221108842211084422108844221088442110884221108842211084422108844211088442110884221108442211084422108844211088442110884221108442211 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = dadadad6d6d6b6b6b6b5b5b5adadadad6d6d6b6b6b6b5b5b5adadadad6d6d6b6b6b6b5b5b5adadad6d6d6d6b6b6b5b5b5b5adadad6d6d6d6b6b6b5b5b5b5adadad6d6d6d6b6b6b5b5b5a +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 2525252929294949494a4a4a52525252929294949494a4a4a52525252929294949494a4a4a525252929292949494a4a4a4a525252929292949494a4a4a4a525252929292949494a4a4a5 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 8000100002000040000800010000200004000080001000020000200004000080001000020000400008000100002000040000400008000100002000040000800010000200004000080000 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 7fffeffffdffffbffff7fffeffffdffffbffff7fffeffffdffffdffffbffff7fffeffffdffffbffff7fffeffffdffffbffffbffff7fffeffffdffffbffff7fffeffffdffffbffff7ffff +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = fefdfbfbf7efefdfbfbf7efefdfbf7f7efdfdfbf7f7efdfdfbf7efefdfbfbf7efefdfbfbf7efdfdfbf7f7efdfdfbf7f7efdfbfbf7efefdfbfbf7efefdfbf7f7efdfdfbf7f7efdfdfbf7e +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 102040408101020404081010204080810202040808102020408101020404081010204040810202040808102020408081020404081010204040810102040808102020408081020204081 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = db6d6db6b6db5b6dadb6d6db6b6db5b6dadb6d6db6b6db5b6dadb6d6db6b6db5b6dadb6d6db6b6db5b6dadb6d6db6b6db5b6dadb6d6db6b6db5b6dadb6d6db6b6db5b6dadb6d6db6b6da +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 249292494924a4925249292494924a4925249292494924a4925249292494924a4925249292494924a4925249292494924a4925249292494924a4925249292494924a4925249292494925 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = fff7ff7ff7ff7ff7ff7ff7ff7ff7ff7ff7ff7ffbffbffbffbffbffbffbffbffbffbffbffbffdffdffdffdffdffdffdffdffdffdffdffdffeffeffeffeffeffeffeffeffeffeffeffeffe +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 8008008008008008008008008008008008004004004004004004004004004004004004002002002002002002002002002002002002001001001001001001001001001001001001001 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 8844211084421108442110844211084421108442110844211084421108442110844211084422108842210884221088422108842210884221088422108842210884221088422108842210 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 77bbdeef7bbdeef7bbdeef7bbdeef7bbdeef7bbdeef7bbdeef7bbdeef7bbdeef7bbdeef7bbddef77bddef77bddef77bddef77bddef77bddef77bddef77bddef77bddef77bddef77bddef +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = a4924a4924a4924a4924a4924a4924a4924a4924949249492494924949249492494924949249292492924929249292492924929249292492524925249252492524925249252492524924 +A = fffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 5b6db5b6db5b6db5b6db5b6db5b6db5b6db5b6db6b6db6b6db6b6db6b6db6b6db6b6db6b6db6d6db6d6db6d6db6d6db6d6db6d6db6d6db6dadb6dadb6dadb6dadb6dadb6dadb6dadb6db +A = -fffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +A = -1 +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 80401008020080401004020080201004010080200804010040200804010040200802010040100802008040100402008020100402008020100401008020080401004020080201004010080200 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 7fbfeff7fdff7fbfeffbfdff7fdfeffbfeff7fdff7fbfeffbfdff7fbfeffbfdff7fdfeffbfeff7fdff7fbfeffbfdff7fdfeffbfdff7fdfeffbfeff7fdff7fbfeffbfdff7fdfeffbfeff7fdff +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 84208410821042084108210420841084108210420841082104208410821042104208410821042084108210420842084108210420841082104208410821082104208410821042084108210420 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 7bdf7bef7defbdf7bef7defbdf7bef7bef7defbdf7bef7defbdf7bef7defbdefbdf7bef7defbdf7bef7defbdf7bdf7bef7defbdf7bef7defbdf7bef7def7defbdf7bef7defbdf7bef7defbdf +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = a4a49494929252524a49494929252524a49494929252524a49494929252524a49494929252524a4a494929292524a4a494929292524a4a494929292524a4a494929292524a4a494929292524 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 5b5b6b6b6d6dadadb5b6b6b6d6dadadb5b6b6b6d6dadadb5b6b6b6d6dadadb5b6b6b6d6dadadb5b5b6b6d6d6dadb5b5b6b6d6d6dadb5b5b6b6d6d6dadb5b5b6b6d6d6dadb5b5b6b6d6d6dadb +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 80001000010000200002000020000400004000080000800008000100001000020000200002000040000400004000080000800010000100001000020000200004000040000400008000080000 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 7fffeffffeffffdffffdffffdffffbffffbffff7ffff7ffff7fffeffffeffffdffffdffffdffffbffffbffffbffff7ffff7fffeffffeffffeffffdffffdffffbffffbffffbffff7ffff7ffff +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = aa954aa552a954aa552a9552a954aa552a954aa552aa552a954aa552a954aa552aa552a954aa552a954aa554aa552a954aa552a954aa554aa552a954aa552a954aa954aa552a954aa552a954 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 556ab55aad56ab55aad56aad56ab55aad56ab55aad55aad56ab55aad56ab55aad55aad56ab55aad56ab55aab55aad56ab55aad56ab55aab55aad56ab55aad56ab556ab55aad56ab55aad56ab +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = eddbb76ddbb76ddbb76edbb76edbb76edbb76eddb76eddb76eddb76eddbb6eddbb6eddbb6eddbb76ddbb76ddbb76ddbb76edbb76edbb76edbb76eddb76eddb76eddb76eddbb6eddbb6eddbb6 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 12244892244892244891244891244891244891224891224891224891224491224491224491224489224489224489224489124489124489124489122489122489122489122449122449122449 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = f7bddef77bdeef7bbdef77bddef7bbdeef7bddef77bdeef7bbdef77bddef7bbdeef7bddef77bdeef7bbdef77bddef7bbdeef7bddef77bdeef7bbdef77bddef7bbdeef7bddef77bdeef7bbdee +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 8422108842110844210884221084421108422108842110844210884221084421108422108842110844210884221084421108422108842110844210884221084421108422108842110844211 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = aaaa95554aaaa95554aaaa95554aaaa95554aaaa55554aaaa55554aaaa55554aaaa55554aaaa55552aaaa55552aaaa55552aaaa55552aaaa55552aaa955552aaa955552aaa955552aaa95554 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 55556aaab55556aaab55556aaab55556aaab5555aaaab5555aaaab5555aaaab5555aaaab5555aaaad5555aaaad5555aaaad5555aaaad5555aaaad5556aaaad5556aaaad5556aaaad5556aaab +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa5555555555555555555555555555555555555555555555555555555555555555555555555554 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 5555555555555555555555555555555555555555555555555555555555555555555555555555aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaab +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = ffffffffeffffffffeffffffffeffffffffeffffffffdffffffffdffffffffdffffffffdffffffffbffffffffbffffffffbffffffffbffffffff7ffffffff7ffffffff7ffffffff7fffffffe +A = fffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 100000000100000000100000000100000000200000000200000000200000000200000000400000000400000000400000000400000000800000000800000000800000000800000001 +A = -fffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +A = -1 +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = f777bbbdddeeeef777bbbddddeeef777bbbddddeeef777bbbbdddeeef7777bbbdddeeef7777bbbdddeeeef777bbbdddeeeef777bbbddddeeef777bbbbdddeeef777bbbbdddeeef7777bbbdddeeee +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 88844422211110888444222211108884442222111088844442221110888844422211108888444222111108884442221111088844422221110888444422211108884444222111088884442221111 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 800400200100040020010008002001000800200100080040010008004002000800400200080040020010004002001000400200100080020010008004001000800400100080040020008004002000 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 7ffbffdffefffbffdffefff7ffdffefff7ffdffefff7ffbffefff7ffbffdfff7ffbffdfff7ffbffdffefffbffdffefffbffdffefff7ffdffefff7ffbffefff7ffbffefff7ffbffdfff7ffbffdfff +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 924492249124492249124892249124892449124892449224892449224912449224912489224912489244912489244922489244922491244922491248922491248924491248924492248924492248 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 6dbb6ddb6edbb6ddb6edb76ddb6edb76dbb6edb76dbb6ddb76dbb6ddb6edbb6ddb6edb76ddb6edb76dbb6edb76dbb6ddb76dbb6ddb6edbb6ddb6edb76ddb6edb76dbb6edb76dbb6ddb76dbb6ddb7 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +A = -1 +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 8421084210842108421084210842108410842108421084210842108421084210421084210842108421084210842108420842108421084210842108421084210821084210842108421084210842108420 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 7bdef7bdef7bdef7bdef7bdef7bdef7bef7bdef7bdef7bdef7bdef7bdef7bdefbdef7bdef7bdef7bdef7bdef7bdef7bdf7bdef7bdef7bdef7bdef7bdef7bdef7def7bdef7bdef7bdef7bdef7bdef7bdf +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 8884422110884422110884442211088442211088442211108844221108844221108844422110884422110884422211088442211088442211088844221108844221108844222110884422110884422110 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 777bbddeef77bbddeef77bbbddeef77bbddeef77bbddeeef77bbddeef77bbddeef77bbbddeef77bbddeef77bbdddeef77bbddeef77bbddeef777bbddeef77bbddeef77bbdddeef77bbddeef77bbddeef +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = a4924a492494924929249292492524924a4924a492494924929249292492524924a4924a492494924929249252492524924a49249492494924929249252492524924a492494924949249292492524924 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 5b6db5b6db6b6db6d6db6d6db6dadb6db5b6db5b6db6b6db6d6db6d6db6dadb6db5b6db5b6db6b6db6d6db6dadb6dadb6db5b6db6b6db6b6db6d6db6dadb6dadb6db5b6db6b6db6b6db6d6db6dadb6db +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = aa954aa954aa554aa552aa552a9552a954aa954aa554aa552aa552aa552a9552a954aa954aa554aa552aa552a9552a954aa954aa554aa554aa552aa552a9552a954aa954aa554aa552aa552a9552a954 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 556ab556ab55aab55aad55aad56aad56ab556ab55aab55aad55aad55aad56aad56ab556ab55aab55aad55aad56aad56ab556ab55aab55aab55aad55aad56aad56ab556ab55aab55aad55aad56aad56ab +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = d6ad5ab56ad5ab56ad6ad5ab56ad5ab56ad6ad5ab56ad5ab56ad5ad5ab56ad5ab56ad5ad5ab56ad5ab56ad5ab5ab56ad5ab56ad5ab5ab56ad5ab56ad5ab56b56ad5ab56ad5ab56b56ad5ab56ad5ab56a +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 2952a54a952a54a952952a54a952a54a952952a54a952a54a952a52a54a952a54a952a52a54a952a54a952a54a54a952a54a952a54a54a952a54a952a54a94a952a54a952a54a94a952a54a952a54a95 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = eedddbb776eeddbbb76eedddbb776edddbbb76eeddbbb776edddbb776eeddbbb76eedddbb776edddbbb76eeddbbb776edddbb776eeddbbb76eedddbb776edddbbb76eeddbbb776edddbb776eeddbbb76 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 1122244889112244489112224488912224448911224448891222448891122444891122244889122244489112244488912224488911224448911222448891222444891122444889122244889112244489 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 8020080200802008010040100401004008020080200802004010040100401004008020080200802004010040100401002008020080200802004010040100401002008020080200801004010040100400 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 7fdff7fdff7fdff7feffbfeffbfeffbff7fdff7fdff7fdffbfeffbfeffbfeffbff7fdff7fdff7fdffbfeffbfeffbfeffdff7fdff7fdff7fdffbfeffbfeffbfeffdff7fdff7fdff7feffbfeffbfeffbff +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 9249249224924924892492492249249248924924922492492489249249224924924892492492249249244924924912492492449249249124924924492492491249249244924924912492492449249248 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 6db6db6ddb6db6db76db6db6ddb6db6db76db6db6ddb6db6db76db6db6ddb6db6db76db6db6ddb6db6dbb6db6db6edb6db6dbb6db6db6edb6db6dbb6db6db6edb6db6dbb6db6db6edb6db6dbb6db6db7 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = d6ad5ab56ad5ab56ad6ad5ab56ad5ab56ad6ad5ab56ad5ab56ad5ad5ab56ad5ab56ad5ad5ab56ad5ab56ad5ab5ab56ad5ab56ad5ab5ab56ad5ab56ad5ab56b56ad5ab56ad5ab56b56ad5ab56ad5ab56a +A = fffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 2952a54a952a54a952952a54a952a54a952952a54a952a54a952a52a54a952a54a952a52a54a952a54a952a54a54a952a54a952a54a54a952a54a952a54a94a952a54a952a54a94a952a54a952a54a95 +A = -fffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +A = -1 +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 88442210884421108844211088422110844221108442210884421108844211088422110844221108442210884422108844211088422110884221108442210884422108844211088422110884221108442210 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 77bbddef77bbdeef77bbdeef77bddeef7bbddeef7bbddef77bbdeef77bbdeef77bddeef7bbddeef7bbddef77bbddef77bbdeef77bddeef77bddeef7bbddef77bbddef77bbdeef77bddeef77bddeef7bbddef +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = a94a94a54a54a52a5295295294a94a54a54a52a5295295294a94a54a54a52a5295295294a94a54a54a52a52a5295294a94a94a54a52a52a5295294a94a94a54a52a52a5295294a94a94a54a52a52a5295294 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 56b56b5ab5ab5ad5ad6ad6ad6b56b5ab5ab5ad5ad6ad6ad6b56b5ab5ab5ad5ad6ad6ad6b56b5ab5ab5ad5ad5ad6ad6b56b56b5ab5ad5ad5ad6ad6b56b56b5ab5ad5ad5ad6ad6b56b56b5ab5ad5ad5ad6ad6b +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = a529294a4a529294a4a529294a4a529294a4a529294a4a529294a4a529294a4a529294a4a529294a4a52529494a52529494a52529494a52529494a52529494a52529494a52529494a52529494a52529494a4 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 5ad6d6b5b5ad6d6b5b5ad6d6b5b5ad6d6b5b5ad6d6b5b5ad6d6b5b5ad6d6b5b5ad6d6b5b5ad6d6b5b5adad6b6b5adad6b6b5adad6b6b5adad6b6b5adad6b6b5adad6b6b5adad6b6b5adad6b6b5adad6b6b5b +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = d556aaad556aaad555aaad555aaab555aaab555aaab5556aab5556aaad556aaad556aaad555aaad555aaab555aaab5556aab5556aab5556aaad556aaad555aaad555aaad555aaab555aaab5556aab5556aaa +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 2aa95552aa95552aaa5552aaa5554aaa5554aaa5554aaa9554aaa95552aa95552aa95552aaa5552aaa5554aaa5554aaa9554aaa9554aaa95552aa95552aaa5552aaa5552aaa5554aaa5554aaa9554aaa9555 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = db6db6db5b6db6db6b6db6db6d6db6db6dadb6db6db5b6db6db6b6db6db6b6db6db6d6db6db6dadb6db6db5b6db6db6b6db6db6d6db6db6d6db6db6dadb6db6db5b6db6db6b6db6db6d6db6db6dadb6db6da +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 24924924a4924924949249249292492492524924924a492492494924924949249249292492492524924924a492492494924924929249249292492492524924924a4924924949249249292492492524924925 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 80000400002000010000080000400002000008000040000200001000008000040000100000800004000020000100000800002000010000080000400002000010000040000200001000008000040000200000 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 7ffffbffffdffffefffff7ffffbffffdfffff7ffffbffffdffffefffff7ffffbffffefffff7ffffbffffdffffefffff7ffffdffffefffff7ffffbffffdffffefffffbffffdffffefffff7ffffbffffdfffff +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 84210842084210841084210821084210421084208421084108421082108421042108420842108410842108210842104210842084210841084210821084210421084208421084108421082108421042108420 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 7bdef7bdf7bdef7bef7bdef7def7bdefbdef7bdf7bdef7bef7bdef7def7bdefbdef7bdf7bdef7bef7bdef7def7bdefbdef7bdf7bdef7bef7bdef7def7bdefbdef7bdf7bdef7bef7bdef7def7bdefbdef7bdf +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = ff7f7f7f7f7f7f7f7f7f7fbfbfbfbfbfbfbfbfbfbfdfdfdfdfdfdfdfdfdfdfefefefefefefefefefeff7f7f7f7f7f7f7f7f7f7fbfbfbfbfbfbfbfbfbfbfdfdfdfdfdfdfdfdfdfdfefefefefefefefefefefe +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 808080808080808080804040404040404040404020202020202020202020101010101010101010100808080808080808080804040404040404040404020202020202020202020101010101010101010101 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = fbefbefbdf7df7defbefbef7df7df7befbefbdf7df7defbefbef7df7df7defbefbef7df7df7befbefbdf7df7defbefbef7df7df7befbefbef7df7df7befbefbdf7df7defbefbef7df7df7befbefbdf7df7de +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 4104104208208210410410820820841041042082082104104108208208210410410820820841041042082082104104108208208410410410820820841041042082082104104108208208410410420820821 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = a492492492492924924924924a492492492492924924924924a492492492492924924924924a4924924924925249249249249492492492492524924924924949249249249252492492492494924924924924 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 5b6db6db6db6d6db6db6db6db5b6db6db6db6d6db6db6db6db5b6db6db6db6d6db6db6db6db5b6db6db6db6dadb6db6db6db6b6db6db6db6dadb6db6db6db6b6db6db6db6dadb6db6db6db6b6db6db6db6db +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = d5aad56ad56ab56ab55aad5aad56ad56ab56ab55aad5aad56ad56ab55ab55aad5aad56ad56ab55ab55aad5aad56ab56ab55ab55aad5aad56ab56ab55ab55aad56ad56ab56ab55ab55aad56ad56ab56ab55aa +A = fffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 2a552a952a954a954aa552a552a952a954a954aa552a552a952a954aa54aa552a552a952a954aa54aa552a552a954a954aa54aa552a552a954a954aa54aa552a952a954a954aa54aa552a952a954a954aa55 +A = -fffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +A = -1 +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa555555555555555555555555555555555555555555555555555555555555555555555555555555555554 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 555555555555555555555555555555555555555555555555555555555555555555555555555555555555aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaab +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 810204081020408102040810102040810204081020408102020408102040810204081020204081020408102040810204040810204081020408102040408102040810204081020408081020408102040810204080 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 7efdfbf7efdfbf7efdfbf7efefdfbf7efdfbf7efdfbf7efdfdfbf7efdfbf7efdfbf7efdfdfbf7efdfbf7efdfbf7efdfbfbf7efdfbf7efdfbf7efdfbfbf7efdfbf7efdfbf7efdfbf7f7efdfbf7efdfbf7efdfbf7f +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = fdfbf7efdfbf7efdfbf7efdf7efdfbf7efdfbf7efdfbf7efbf7efdfbf7efdfbf7efdfbf7dfbf7efdfbf7efdfbf7efdfbefdfbf7efdfbf7efdfbf7efdf7efdfbf7efdfbf7efdfbf7efbf7efdfbf7efdfbf7efdfbe +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 20408102040810204081020810204081020408102040810408102040810204081020408204081020408102040810204102040810204081020408102081020408102040810204081040810204081020408102041 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 800200080020004001000400080020008002000400100040008002000800100040010004000800200080010004001000200080020008001000400100020008002000400100040010002000800200040010004000 +A = fffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 7ffdfff7ffdfffbffefffbfff7ffdfff7ffdfffbffefffbfff7ffdfff7ffefffbffefffbfff7ffdfff7ffefffbffefffdfff7ffdfff7ffefffbffefffdfff7ffdfffbffefffbffefffdfff7ffdfffbffefffbfff +A = -fffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +A = -1 +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 9122244889122244889122244889122244889122244889122244889122244889122244889122244889122244489112244489112244489112244489112244489112244489112244489112244489112244489112244488 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 6edddbb776edddbb776edddbb776edddbb776edddbb776edddbb776edddbb776edddbb776edddbb776edddbbb76eeddbbb76eeddbbb76eeddbbb76eeddbbb76eeddbbb76eeddbbb76eeddbbb76eeddbbb76eeddbbb77 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = d6ad6ad5ad5ab5ab5ab56b56ad6ad6ad5ad5ab5ab5ab56b56ad6ad6ad5ad5ab5ab5ab56b56ad6ad6ad5ad5ab5ab56b56b56ad6ad5ad5ad5ab5ab56b56b56ad6ad5ad5ad5ab5ab56b56b56ad6ad5ad5ad5ab5ab56b56a +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 2952952a52a54a54a54a94a952952952a52a54a54a54a94a952952952a52a54a54a54a94a952952952a52a54a54a94a94a952952a52a52a54a54a94a94a952952a52a52a54a54a94a94a952952a52a52a54a54a94a95 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 9111111111111122222222222222244444444444444888888888888889111111111111122222222222222244444444444444488888888888889111111111111112222222222222244444444444444488888888888888 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 6eeeeeeeeeeeeedddddddddddddddbbbbbbbbbbbbbb777777777777776eeeeeeeeeeeeedddddddddddddddbbbbbbbbbbbbbbb77777777777776eeeeeeeeeeeeeeddddddddddddddbbbbbbbbbbbbbbb77777777777777 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 8102040808102040408102020408101020408081020404081020204081020204081010204080810204040810202040810102040808102040408102040408102020408101020408081020404081020204081010204080 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 7efdfbf7f7efdfbfbf7efdfdfbf7efefdfbf7f7efdfbfbf7efdfdfbf7efdfdfbf7efefdfbf7f7efdfbfbf7efdfdfbf7efefdfbf7f7efdfbfbf7efdfbfbf7efdfdfbf7efefdfbf7f7efdfbfbf7efdfdfbf7efefdfbf7f +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = a952952952952952952952952952952952952952952a52a52a52a52a52a52a52a52a52a52a52a52a52a52a54a54a54a54a54a54a54a54a54a54a54a54a54a54a54a94a94a94a94a94a94a94a94a94a94a94a94a94a94 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 56ad6ad6ad6ad6ad6ad6ad6ad6ad6ad6ad6ad6ad6ad5ad5ad5ad5ad5ad5ad5ad5ad5ad5ad5ad5ad5ad5ad5ab5ab5ab5ab5ab5ab5ab5ab5ab5ab5ab5ab5ab5ab5ab56b56b56b56b56b56b56b56b56b56b56b56b56b56b +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = a4924949249292492524924a49249292492524924a49249492492524924a49249492492924924a4924949249292492524924949249292492524924a49249292492524924a49249492492524924a49249492492924924 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 5b6db6b6db6d6db6dadb6db5b6db6d6db6dadb6db5b6db6b6db6dadb6db5b6db6b6db6d6db6db5b6db6b6db6d6db6dadb6db6b6db6d6db6dadb6db5b6db6d6db6dadb6db5b6db6b6db6dadb6db5b6db6b6db6d6db6db +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 9244912449124491244912449124492248922489224892248922489224912449124491244912449124491248922489224892248922489224892449124491244912449124491244922489224892248922489224892248 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 6dbb6edbb6edbb6edbb6edbb6edbb6ddb76ddb76ddb76ddb76ddb76ddb6edbb6edbb6edbb6edbb6edbb6edb76ddb76ddb76ddb76ddb76ddb76dbb6edbb6edbb6edbb6edbb6edbb6ddb76ddb76ddb76ddb76ddb76ddb7 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = eeeeeeeedddddddddbbbbbbbbb777777776eeeeeeeedddddddddbbbbbbbb777777776eeeeeeeedddddddddbbbbbbbbb777777776eeeeeeeeddddddddbbbbbbbbb777777776eeeeeeeedddddddddbbbbbbbbb77777776 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 1111111122222222244444444488888888911111111222222222444444448888888891111111122222222244444444488888888911111111222222224444444448888888891111111122222222244444444488888889 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = eeddbb776eddbbb76eddbbb76edddbb76eeddbb76eeddbb776eddbbb76eddbbb76edddbb76eeddbb76eeddbb776eddbb776eddbbb76edddbb76edddbb76eeddbb776eddbb776eddbbb76edddbb76edddbb76eeddbb76 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 1122448891224448912244489122244891122448911224488912244489122444891222448911224489112244889122448891224448912224489122244891122448891224488912244489122244891222448911224489 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = a4a4a4a4949494929292925252524a4a4a4a4949494929292925252524a4a4a494949494929292925252524a4a4a494949492929292925252524a4a4a494949492929292525252524a4a4a4949494929292925252524 +A = fffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 5b5b5b5b6b6b6b6d6d6d6dadadadb5b5b5b5b6b6b6b6d6d6d6dadadadb5b5b5b6b6b6b6b6d6d6d6dadadadb5b5b5b6b6b6b6d6d6d6d6dadadadb5b5b5b6b6b6b6d6d6d6dadadadadb5b5b5b6b6b6b6d6d6d6dadadadb +A = -fffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +A = -1 +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 80804020100804020100804020201008040201008040201008080402010080402010080402020100804020100804020100804040201008040201008040201010080402010080402010080404020100804020100804020100 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 7f7fbfdfeff7fbfdfeff7fbfdfdfeff7fbfdfeff7fbfdfeff7f7fbfdfeff7fbfdfeff7fbfdfdfeff7fbfdfeff7fbfdfeff7fbfbfdfeff7fbfdfeff7fbfdfefeff7fbfdfeff7fbfdfeff7fbfbfdfeff7fbfdfeff7fbfdfeff +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = a492492492492524924924924929249249249249292492492492494924924924924a4924924924924a49249249249252492492492492524924924924929249249249249492492492492494924924924924a4924924924924 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 5b6db6db6db6dadb6db6db6db6d6db6db6db6db6d6db6db6db6db6b6db6db6db6db5b6db6db6db6db5b6db6db6db6dadb6db6db6db6dadb6db6db6db6d6db6db6db6db6b6db6db6db6db6b6db6db6db6db5b6db6db6db6db +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = f77bbbdddeef777bbbddeeef777bbdddeeef77bbbdddeef777bbbddeeef777bbbddeeef777bbdddeeef77bbbdddeef777bbbddeeef777bbdddeeef777bbdddeeef77bbbdddeef777bbbddeeef777bbdddeeef77bbbdddeee +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 8844422211088844422111088844222111088444222110888444221110888444221110888442221110884442221108884442211108884422211108884422211108844422211088844422111088844222111088444222111 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 80000200000400000800002000004000008000020000040000080000100000400000800001000004000008000010000020000080000100000200000800001000002000004000010000020000040000100000200000400000 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 7ffffdfffffbfffff7ffffdfffffbfffff7ffffdfffffbfffff7ffffefffffbfffff7ffffefffffbfffff7ffffefffffdfffff7ffffefffffdfffff7ffffefffffdfffffbffffefffffdfffffbffffefffffdfffffbfffff +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = aa54a952a54a952a54aa54a952a54a952a54a954a952a54a952a54a952a952a54a952a54a952a552a54a952a54a952a54aa54a952a54a952a54a954a952a54a952a54a952a952a54a952a54a952a552a54a952a54a952a54 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 55ab56ad5ab56ad5ab55ab56ad5ab56ad5ab56ab56ad5ab56ad5ab56ad56ad5ab56ad5ab56ad5aad5ab56ad5ab56ad5ab55ab56ad5ab56ad5ab56ab56ad5ab56ad5ab56ad56ad5ab56ad5ab56ad5aad5ab56ad5ab56ad5ab +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 92244912248912448922449122489124489224491224891244892244912248912448922449122489124489224491224891244892244912248912448922449122489124489224491224891244892244912248912448922448 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 6ddbb6eddb76edbb76ddbb6eddb76edbb76ddbb6eddb76edbb76ddbb6eddb76edbb76ddbb6eddb76edbb76ddbb6eddb76edbb76ddbb6eddb76edbb76ddbb6eddb76edbb76ddbb6eddb76edbb76ddbb6eddb76edbb76ddbb7 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 91122244488911222244488911222444488911222444889111222444889112222444889112224448889112224448891112224448891122244448891122244488891122244488911222244488911222444488911222444888 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 6eedddbbb776eeddddbbb776eedddbbbb776eedddbbb776eeedddbbb776eeddddbbb776eedddbbb7776eedddbbb776eeedddbbb776eedddbbbb776eedddbbb7776eedddbbb776eeddddbbb776eedddbbbb776eedddbbb777 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 80100200400801001002004008010020020040080100200400400801002004004008010020040080080100200400801001002004008010020020040080100200200400801002004004008010020040080080100200400800 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 7feffdffbff7feffeffdffbff7feffdffdffbff7feffdffbffbff7feffdffbffbff7feffdffbff7ff7feffdffbff7feffeffdffbff7feffdffdffbff7feffdffdffbff7feffdffbffbff7feffdffbff7ff7feffdffbff7ff +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 80804020100804020100804020201008040201008040201008080402010080402010080402020100804020100804020100804040201008040201008040201010080402010080402010080404020100804020100804020100 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 7f7fbfdfeff7fbfdfeff7fbfdfdfeff7fbfdfeff7fbfdfeff7f7fbfdfeff7fbfdfeff7fbfdfdfeff7fbfdfeff7fbfdfeff7fbfbfdfeff7fbfdfeff7fbfdfefeff7fbfdfeff7fbfdfeff7fbfbfdfeff7fbfdfeff7fbfdfeff +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +A = -1 +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 842108421084210842108421084210842108210842108421084210842108421084210842084210842108421084210842108421084210421084210842108421084210842108421084108421084210842108421084210842108420 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 7bdef7bdef7bdef7bdef7bdef7bdef7bdef7def7bdef7bdef7bdef7bdef7bdef7bdef7bdf7bdef7bdef7bdef7bdef7bdef7bdef7bdefbdef7bdef7bdef7bdef7bdef7bdef7bdef7bef7bdef7bdef7bdef7bdef7bdef7bdef7bdf +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = a5294a5294a5294a5294a5294a5294a5294a4a5294a5294a5294a5294a5294a5294a529494a5294a5294a5294a5294a5294a5294a529294a5294a5294a5294a5294a5294a5294a525294a5294a5294a5294a5294a5294a5294a4 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 5ad6b5ad6b5ad6b5ad6b5ad6b5ad6b5ad6b5b5ad6b5ad6b5ad6b5ad6b5ad6b5ad6b5ad6b6b5ad6b5ad6b5ad6b5ad6b5ad6b5ad6b5ad6d6b5ad6b5ad6b5ad6b5ad6b5ad6b5ad6b5adad6b5ad6b5ad6b5ad6b5ad6b5ad6b5ad6b5b +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = a5294a5294a5294a5294a5294a5294a5294a4a5294a5294a5294a5294a5294a5294a529494a5294a5294a5294a5294a5294a5294a529294a5294a5294a5294a5294a5294a5294a525294a5294a5294a5294a5294a5294a5294a4 +A = fffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 5ad6b5ad6b5ad6b5ad6b5ad6b5ad6b5ad6b5b5ad6b5ad6b5ad6b5ad6b5ad6b5ad6b5ad6b6b5ad6b5ad6b5ad6b5ad6b5ad6b5ad6b5ad6d6b5ad6b5ad6b5ad6b5ad6b5ad6b5ad6b5adad6b5ad6b5ad6b5ad6b5ad6b5ad6b5ad6b5b +A = -fffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +A = -1 +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 8844211084422108842211084421108842210884221108442110884221088442110844221088422108844211084422108842211084421108442210884221108442110884221088442110844211088422108844211084422108842210 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 77bbdeef7bbddef77bddeef7bbdeef77bddef77bddeef7bbdeef77bddef77bbdeef7bbddef77bddef77bbdeef7bbddef77bddeef7bbdeef7bbddef77bddeef7bbdeef77bddef77bbdeef7bbdeef77bddef77bbdeef7bbddef77bddef +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 9249249248924924924892492492449249249244924924922492492492249249249224924924912492492491249249248924924924892492492449249249244924924924492492492249249249224924924912492492491249249248 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 6db6db6db76db6db6db76db6db6dbb6db6db6dbb6db6db6ddb6db6db6ddb6db6db6ddb6db6db6edb6db6db6edb6db6db76db6db6db76db6db6dbb6db6db6dbb6db6db6dbb6db6db6ddb6db6db6ddb6db6db6edb6db6db6edb6db6db7 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = a4a4949492929252524a4a4949492929252524a4a4949492929252524a4a49492929252524a4a4949492929252524a4a4949492929252524a4a49494929252524a4a4949492929252524a4a4949492929252524a4a49494929292524 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 5b5b6b6b6d6d6dadadb5b5b6b6b6d6d6dadadb5b5b6b6b6d6d6dadadb5b5b6b6d6d6dadadb5b5b6b6b6d6d6dadadb5b5b6b6b6d6d6dadadb5b5b6b6b6d6dadadb5b5b6b6b6d6d6dadadb5b5b6b6b6d6d6dadadb5b5b6b6b6d6d6dadb +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = dad6b5b5ad6b5b5ad6b5b5ad6b5b5ad6b5b5ad6b5b5ad6b6b5ad6b6b5ad6b6b5ad6b6b5ad6b6b5ad6b6b5ad6b6b5ad6d6b5ad6d6b5ad6d6b5ad6d6b5ad6d6b5ad6d6b5ad6d6b5adad6b5adad6b5adad6b5adad6b5adad6b5adad6b5a +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 25294a4a5294a4a5294a4a5294a4a5294a4a5294a4a529494a529494a529494a529494a529494a529494a529494a529294a529294a529294a529294a529294a529294a529294a525294a525294a525294a525294a525294a525294a5 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = a492494924925249249492492524924a492492924924a492492924924a4924949249252492494924925249249492492924924a492492924924a4924929249252492494924925249249492492524924a492492924924a492492924924 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 5b6db6b6db6dadb6db6b6db6dadb6db5b6db6d6db6db5b6db6d6db6db5b6db6b6db6dadb6db6b6db6dadb6db6b6db6d6db6db5b6db6d6db6db5b6db6d6db6dadb6db6b6db6dadb6db6b6db6dadb6db5b6db6d6db6db5b6db6d6db6db +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 8001000100020002000200040004000400080008000800100010001000200020002000400040004000800080008001000100010002000200020004000400040008000800080010001000100020002000200040004000400080008000 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 7ffefffefffdfffdfffdfffbfffbfffbfff7fff7fff7ffefffefffefffdfffdfffdfffbfffbfffbfff7fff7fff7ffefffefffefffdfffdfffdfffbfffbfffbfff7fff7fff7ffefffefffefffdfffdfffdfffbfffbfffbfff7fff7fff +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 8000000000004000000000002000000000001000000000000800000000000400000000000200000000000100000000000080000000000040000000000020000000000010000000000008000000000004000000000002000000000000 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 7fffffffffffbfffffffffffdfffffffffffeffffffffffff7fffffffffffbfffffffffffdfffffffffffeffffffffffff7fffffffffffbfffffffffffdfffffffffffeffffffffffff7fffffffffffbfffffffffffdffffffffffff +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 9111112222222444444488888891111112222224444444888888911111122222224444444888889111111222222244444448888889111112222222444444488888891111112222222444444888888911111122222224444444888888 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 6eeeeedddddddbbbbbbb7777776eeeeeeddddddbbbbbbb7777776eeeeeedddddddbbbbbbb777776eeeeeedddddddbbbbbbb7777776eeeeedddddddbbbbbbb7777776eeeeeedddddddbbbbbb7777776eeeeeedddddddbbbbbbb777777 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = ffffffffffeffffffffffdffffffffffbffffffffffbffffffffff7fffffffffeffffffffffeffffffffffdffffffffffbffffffffff7ffffffffff7fffffffffeffffffffffdffffffffffdffffffffffbffffffffff7fffffffffe +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 100000000002000000000040000000000400000000008000000000100000000001000000000020000000000400000000008000000000080000000001000000000020000000000200000000004000000000080000000001 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 8888844444222221111108888844444222221111088888444442222211111088888444442222111110888884444422222111110888884444222221111108888844444222221111108888444442222211111088888444442222211110 +A = fffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 77777bbbbbdddddeeeeef77777bbbbbdddddeeeef77777bbbbbdddddeeeeef77777bbbbbddddeeeeef77777bbbbbdddddeeeeef77777bbbbdddddeeeeef77777bbbbbdddddeeeeef7777bbbbbdddddeeeeef77777bbbbbdddddeeeef +A = -fffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +A = -1 +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 82040810408102081020408204081040810204102040820408102081020410204082040810208102041020408104081020810204082040810408102041020408204081040810204102040820408102081020410204081040810208102040 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 7dfbf7efbf7efdf7efdfbf7dfbf7efbf7efdfbefdfbf7dfbf7efdf7efdfbefdfbf7dfbf7efdf7efdfbefdfbf7efbf7efdf7efdfbf7dfbf7efbf7efdfbefdfbf7dfbf7efbf7efdfbefdfbf7dfbf7efdf7efdfbefdfbf7efbf7efdf7efdfbf +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = dadad6d6b6b5b5adad6d6b6b5b5adad6d6b6b5b5adad6d6b6b5b5adad6d6b6b6b5b5adad6d6b6b5b5adad6d6b6b5b5adad6d6b6b5b5adad6d6b6b5b5adad6d6d6b6b5b5adad6d6b6b5b5adad6d6b6b5b5adad6d6b6b5b5adad6d6b6b5b5a +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 25252929494a4a5252929494a4a5252929494a4a5252929494a4a525292949494a4a5252929494a4a5252929494a4a5252929494a4a5252929494a4a525292929494a4a5252929494a4a5252929494a4a5252929494a4a5252929494a4a5 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = fbdef7bef7bdefbdef7bdf7bdef7def7bdf7bdef7bef7bdefbdef7bef7bdef7def7bdf7bdef7bef7bdefbdef7bef7bdef7def7bdf7bdef7def7bdefbdef7bef7bdef7def7bdf7bdef7def7bdefbdef7bef7bdefbdef7bdf7bdef7def7bde +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 4210841084210421084208421082108420842108410842104210841084210821084208421084108421042108410842108210842084210821084210421084108421082108420842108210842104210841084210421084208421082108421 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 88422108442108842210844210884221084421088422108442108842110844210884211084421088421108442108842110842210884211084221088421108422108842110842210844211084221084421108422108442110842210844210 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 77bddef7bbdef77bddef7bbdef77bddef7bbdef77bddef7bbdef77bdeef7bbdef77bdeef7bbdef77bdeef7bbdef77bdeef7bddef77bdeef7bddef77bdeef7bddef77bdeef7bddef7bbdeef7bddef7bbdeef7bddef7bbdeef7bddef7bbdef +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = a49492924a49492524a49292524a492925249492924a49492524a49492524a492925249492924a49492924a49492524a492925249492925249492924a49492524a49292524a492925249492924a49492524a49492524a492925249492924 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 5b6b6d6db5b6b6dadb5b6d6dadb5b6d6dadb6b6d6db5b6b6dadb5b6b6dadb5b6d6dadb6b6d6db5b6b6d6db5b6b6dadb5b6d6dadb6b6d6dadb6b6d6db5b6b6dadb5b6d6dadb5b6d6dadb6b6d6db5b6b6dadb5b6b6dadb5b6d6dadb6b6d6db +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = fefefefefdfdfdfdfbfbfbfbf7f7f7f7efefefefdfdfdfdfbfbfbfbf7f7f7f7efefefefdfdfdfdfbfbfbfbf7f7f7f7efefefefdfdfdfdfbfbfbfbf7f7f7f7efefefefdfdfdfdfbfbfbfbf7f7f7f7efefefefdfdfdfdfbfbfbfbf7f7f7f7e +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 1010101020202020404040408080808101010102020202040404040808080810101010202020204040404080808081010101020202020404040408080808101010102020202040404040808080810101010202020204040404080808081 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = ffbfdfeffbfdfeff7fdfeff7fdfeff7fbfeff7fbfeff7fbfdff7fbfdff7fbfdfeffbfdfeffbfdfeff7fdfeff7fdfeff7fbfeff7fbfeff7fbfdff7fbfdff7fbfdfeffbfdfeffbfdfeff7fdfeff7fdfeff7fbfeff7fbfeff7fbfdff7fbfdfe +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 402010040201008020100802010080401008040100804020080402008040201004020100402010080201008020100804010080401008040200804020080402010040201004020100802010080201008040100804010080402008040201 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = fffffffffff7ffffffffff7ffffffffff7ffffffffff7ffffffffffbffffffffffbffffffffffbffffffffffbffffffffffdffffffffffdffffffffffdffffffffffdffffffffffeffffffffffeffffffffffeffffffffffeffffffffffe +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 800000000008000000000080000000000800000000004000000000040000000000400000000004000000000020000000000200000000002000000000020000000000100000000001000000000010000000000100000000001 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 84210421082108410842084210421082108410841084208421042108210841084208421042104210821084108420842104210821084108420842084210421082108410842084210421082108210841084208421042108210841084208420 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 7bdefbdef7def7bef7bdf7bdefbdef7def7bef7bef7bdf7bdefbdef7def7bef7bdf7bdefbdefbdef7def7bef7bdf7bdefbdef7def7bef7bdf7bdf7bdefbdef7def7bef7bdf7bdefbdef7def7def7bef7bdf7bdefbdef7def7bef7bdf7bdf +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = db6b6d6dadb5b6b6d6dadb5b6b6d6dadb5b6b6dadb5b6b6d6dadb5b6b6d6dadb5b6b6d6dadb6b6d6dadb5b6b6d6dadb5b6b6d6dadb5b6b6d6db5b6b6d6dadb5b6b6d6dadb5b6b6d6dadb5b6d6dadb5b6b6d6dadb5b6b6d6dadb5b6b6d6da +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 24949292524a4949292524a4949292524a49492524a4949292524a4949292524a4949292524949292524a4949292524a4949292524a49492924a4949292524a4949292524a4949292524a49292524a4949292524a4949292524a49492925 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = d6b5ad6b56b5ad6b5ab5ad6b5ad5ad6b5ad6ad6b5ad6ad6b5ad6b56b5ad6b5ab5ad6b5ad5ad6b5ad5ad6b5ad6ad6b5ad6b56b5ad6b5ab5ad6b5ab5ad6b5ad5ad6b5ad6ad6b5ad6b56b5ad6b56b5ad6b5ab5ad6b5ad5ad6b5ad6ad6b5ad6a +A = fffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 294a5294a94a5294a54a5294a52a5294a5295294a5295294a5294a94a5294a54a5294a52a5294a52a5294a5295294a5294a94a5294a54a5294a54a5294a52a5294a5295294a5294a94a5294a94a5294a54a5294a52a5294a5295294a5295 +A = -fffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +A = -1 +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = edb6edb6edb6ddb6ddb6ddb6dbb6dbb6dbb6db76db76db76db6edb6edb6edb6ddb6ddb6dbb6dbb6dbb6db76db76db76db6edb6edb6edb6ddb6ddb6ddb6dbb6dbb6db76db76db76db6edb6edb6edb6ddb6ddb6ddb6dbb6dbb6dbb6db76db76db6 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 124912491249224922492249244924492449248924892489249124912491249224922492449244924492489248924892491249124912492249224922492449244924892489248924912491249124922492249224924492449244924892489249 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = fefefefefefefefefefefefefdfdfdfdfdfdfdfdfdfdfdfdfbfbfbfbfbfbfbfbfbfbfbfbf7f7f7f7f7f7f7f7f7f7f7f7efefefefefefefefefefefefdfdfdfdfdfdfdfdfdfdfdfdfbfbfbfbfbfbfbfbfbfbfbfbf7f7f7f7f7f7f7f7f7f7f7f7e +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 10101010101010101010101020202020202020202020202040404040404040404040404080808080808080808080808101010101010101010101010202020202020202020202020404040404040404040404040808080808080808080808081 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 888888888888888888888888888888888888888888888888444444444444444444444444444444444444444444444444222222222222222222222222222222222222222222222222111111111111111111111111111111111111111111111110 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 777777777777777777777777777777777777777777777777bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbddddddddddddddddddddddddddddddddddddddddddddddddeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeef +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = fbdefbdefbdef7def7def7def7bef7bef7bef7bdf7bdf7bdefbdefbdefbdef7def7def7def7bef7bef7bdf7bdf7bdf7bdefbdefbdefbdef7def7def7bef7bef7bef7bdf7bdf7bdf7bdefbdefbdef7def7def7def7bef7bef7bef7bdf7bdf7bde +A = fffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 42104210421082108210821084108410841084208420842104210421042108210821082108410841084208420842084210421042104210821082108410841084108420842084208421042104210821082108210841084108410842084208421 +A = -fffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +A = -1 +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = aa954aa554aa552a9552a954aa954aa552aa552a9552a954aa554aa552aa552a954aa954aa552aa552a9552a954aa554aa552aa552a954aa954aa554aa552a9552a954aa554aa552aa552a954aa954aa554aa552a9552a954aa954aa552aa552a954 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 556ab55aab55aad56aad56ab556ab55aad55aad56aad56ab55aab55aad55aad56ab556ab55aad55aad56aad56ab55aab55aad55aad56ab556ab55aab55aad56aad56ab55aab55aad55aad56ab556ab55aab55aad56aad56ab556ab55aad55aad56ab +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = eddbb76eddbb76eddbb76eddbb76ddbb76eddbb76eddbb76eddbb76edbb76eddbb76eddbb76eddbb76edbb76eddbb76eddbb76eddbb76eddb76eddbb76eddbb76eddbb76eddb76eddbb76eddbb76eddbb76eddbb6eddbb76eddbb76eddbb76eddbb6 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 1224489122448912244891224489224489122448912244891224489124489122448912244891224489124489122448912244891224489122489122448912244891224489122489122448912244891224489122449122448912244891224489122449 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = d56aad56aad56aad56aad56aad56aad56aad56aad56aad56aad55aad55aad55aad55aad55aad55aad55aad55aad55aad55aab55aab55aab55aab55aab55aab55aab55aab55aab55aab556ab556ab556ab556ab556ab556ab556ab556ab556ab556aa +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 2a9552a9552a9552a9552a9552a9552a9552a9552a9552a9552aa552aa552aa552aa552aa552aa552aa552aa552aa552aa554aa554aa554aa554aa554aa554aa554aa554aa554aa554aa954aa954aa954aa954aa954aa954aa954aa954aa954aa955 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 8842108421084210844210842108421084221084210842108421088421084210842108442108421084210842110842108421084210884210842108421084221084210842108421108421084210842108442108421084210842210842108421084210 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 77bdef7bdef7bdef7bbdef7bdef7bdef7bddef7bdef7bdef7bdef77bdef7bdef7bdef7bbdef7bdef7bdef7bdeef7bdef7bdef7bdef77bdef7bdef7bdef7bddef7bdef7bdef7bdeef7bdef7bdef7bdef7bbdef7bdef7bdef7bddef7bdef7bdef7bdef +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = fdf7df7df7df7df7df7efbefbefbefbefbefbefdf7df7df7df7df7df7dfbefbefbefbefbefbefbf7df7df7df7df7df7df7efbefbefbefbefbefbefdf7df7df7df7df7df7dfbefbefbefbefbefbefbf7df7df7df7df7df7df7efbefbefbefbefbefbe +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 208208208208208208104104104104104104102082082082082082082041041041041041041040820820820820820820810410410410410410410208208208208208208204104104104104104104082082082082082082081041041041041041041 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = ff7f7f7f7f7f7f7f7f7f7f7f7fbfbfbfbfbfbfbfbfbfbfbfbfdfdfdfdfdfdfdfdfdfdfdfdfefefefefefefefefefefefeff7f7f7f7f7f7f7f7f7f7f7f7fbfbfbfbfbfbfbfbfbfbfbfbfdfdfdfdfdfdfdfdfdfdfdfdfefefefefefefefefefefefefe +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 80808080808080808080808040404040404040404040404020202020202020202020202010101010101010101010101008080808080808080808080804040404040404040404040402020202020202020202020201010101010101010101010101 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 8000000000000800000000000080000000000008000000000000400000000000040000000000004000000000000400000000000020000000000002000000000000200000000000020000000000001000000000000100000000000010000000000000 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 7ffffffffffff7ffffffffffff7ffffffffffff7ffffffffffffbffffffffffffbffffffffffffbffffffffffffbffffffffffffdffffffffffffdffffffffffffdffffffffffffdffffffffffffeffffffffffffeffffffffffffefffffffffffff +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = a952a54a952a54a952a54a952a54a54a952a54a952a54a952a54a952952a54a952a54a952a54a952a54a54a952a54a952a54a952a54a952a52a54a952a54a952a54a952a54a94a952a54a952a54a952a54a952a52a54a952a54a952a54a952a54a94 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 56ad5ab56ad5ab56ad5ab56ad5ab5ab56ad5ab56ad5ab56ad5ab56ad6ad5ab56ad5ab56ad5ab56ad5ab5ab56ad5ab56ad5ab56ad5ab56ad5ad5ab56ad5ab56ad5ab56ad5ab56b56ad5ab56ad5ab56ad5ab56ad5ad5ab56ad5ab56ad5ab56ad5ab56b +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 9111222224444488891111222224444888891111222224444888891111222244444888891112222244444888891112222244444888911112222244444888911112222244448888911112222444448888911112222444448888911122222444448888 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 6eeedddddbbbbb7776eeeedddddbbbb77776eeeedddddbbbb77776eeeeddddbbbbb77776eeedddddbbbbb77776eeedddddbbbbb7776eeeedddddbbbbb7776eeeedddddbbbb77776eeeeddddbbbbb77776eeeeddddbbbbb77776eeedddddbbbbb7777 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 8842108421084210844210842108421084221084210842108421088421084210842108442108421084210842110842108421084210884210842108421084221084210842108421108421084210842108442108421084210842210842108421084210 +A = fffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 77bdef7bdef7bdef7bbdef7bdef7bdef7bddef7bdef7bdef7bdef77bdef7bdef7bdef7bbdef7bdef7bdef7bdeef7bdef7bdef7bdef77bdef7bdef7bdef7bddef7bdef7bdef7bdeef7bdef7bdef7bdef7bbdef7bdef7bdef7bddef7bdef7bdef7bdef +A = -fffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +A = -1 +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = a494925249492924a4929252494925249492924a492925249492524a492924a492925249492524a492924a492925249492524a492924a494925249492524a492924a494925249492524a492924a494925249492924a492924a494925249492924a492924 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 5b6b6dadb6b6d6db5b6d6dadb6b6dadb6b6d6db5b6d6dadb6b6dadb5b6d6db5b6d6dadb6b6dadb5b6d6db5b6d6dadb6b6dadb5b6d6db5b6b6dadb6b6dadb5b6d6db5b6b6dadb6b6dadb5b6d6db5b6b6dadb6b6d6db5b6d6db5b6b6dadb6b6d6db5b6d6db +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 84108210410821041082104108210410821041082104108210420821042082104208210420821042082104208210420821042084104208410420841042084104208410420841042084104208410820841082084108208410820841082084108208410820 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 7bef7defbef7defbef7defbef7defbef7defbef7defbef7defbdf7defbdf7defbdf7defbdf7defbdf7defbdf7defbdf7defbdf7befbdf7befbdf7befbdf7befbdf7befbdf7befbdf7befbdf7bef7df7bef7df7bef7df7bef7df7bef7df7bef7df7bef7df +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 80080040020020010008008004002002001000800400400200100100080040040020010008008004002002001000800800400200100100080040040020010010008004002002001000800800400200200100080040040020010010008004004002001000 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 7ff7ffbffdffdffefff7ff7ffbffdffdffefff7ffbffbffdffeffefff7ffbffbffdffefff7ff7ffbffdffdffefff7ff7ffbffdffeffefff7ffbffbffdffeffefff7ffbffdffdffefff7ff7ffbffdffdffefff7ffbffbffdffeffefff7ffbffbffdffefff +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 82082041040820820410408208104104082081041020820810410208204104102082041040820820410408208104104082081041020820810410208204104102082041040820820410408208104104082081041020820810410208204104102082041040 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 7df7dfbefbf7df7dfbefbf7df7efbefbf7df7efbefdf7df7efbefdf7dfbefbefdf7dfbefbf7df7dfbefbf7df7efbefbf7df7efbefdf7df7efbefdf7dfbefbefdf7dfbefbf7df7dfbefbf7df7efbefbf7df7efbefdf7df7efbefdf7dfbefbefdf7dfbefbf +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 80004000200010000800040002000100008000400020001000080004000200010000800040002000100008000400020001000080004000200010000800040002000100008000400020001000080004000200010000800040002000100008000400020000 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 7fffbfffdfffeffff7fffbfffdfffeffff7fffbfffdfffeffff7fffbfffdfffeffff7fffbfffdfffeffff7fffbfffdfffeffff7fffbfffdfffeffff7fffbfffdfffeffff7fffbfffdfffeffff7fffbfffdfffeffff7fffbfffdfffeffff7fffbfffdffff +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = f7bbddeef77bbddeef77bbddeef77bddeef77bbddeef77bbddeef77bbdeef77bbddeef77bbddeef77bbddef77bbddeef77bbddeef77bbddeef7bbddeef77bbddeef77bbddeef77bddeef77bbddeef77bbddeef77bbdeef77bbddeef77bbddeef77bbddee +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 8442211088442211088442211088422110884422110884422110884421108844221108844221108844221088442211088442211088442211084422110884422110884422110884221108844221108844221108844211088442211088442211088442211 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = aaaaaa555554aaaaa9555554aaaaa9555552aaaaa5555552aaaaa555554aaaaa9555554aaaaa9555552aaaaa5555552aaaaa555554aaaaaa555554aaaaa9555552aaaaa9555552aaaaa555554aaaaaa555554aaaaa9555552aaaaa9555552aaaaa555554 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 555555aaaaab555556aaaaab555556aaaaad55555aaaaaad55555aaaaab555556aaaaab555556aaaaad55555aaaaaad55555aaaaab555555aaaaab555556aaaaad555556aaaaad55555aaaaab555555aaaaab555556aaaaad555556aaaaad55555aaaaab +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = aaa5552aa5552aa5552aa5552aa9552aa9552aa9552aa9552aa9554aa9554aa9554aa9554aaa554aaa554aaa554aaa554aaa5552aa5552aa5552aa5552aa5552aa9552aa9552aa9552aa9554aa9554aa9554aa9554aa9554aaa554aaa554aaa554aaa554 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 555aaad55aaad55aaad55aaad556aad556aad556aad556aad556aab556aab556aab556aab555aab555aab555aab555aab555aaad55aaad55aaad55aaad55aaad556aad556aad556aad556aab556aab556aab556aab556aab555aab555aab555aab555aab +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 91111112222222444444448888889111111222222224444444888888891111112222222444444448888889111111122222224444444888888891111112222222244444448888889111111122222224444444488888891111112222222244444448888888 +A = fffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 6eeeeeedddddddbbbbbbbb7777776eeeeeeddddddddbbbbbbb77777776eeeeeedddddddbbbbbbbb7777776eeeeeeedddddddbbbbbbb77777776eeeeeeddddddddbbbbbbb7777776eeeeeeedddddddbbbbbbbb7777776eeeeeeddddddddbbbbbbb7777777 +A = -fffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +A = -1 +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 800040002000080004000200008000400020000800040002000080004000100008000400010000800040001000080004000100008000200010000800020001000080002000100008000200010000400020001000040002000100004000200010000400020000 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 7fffbfffdffff7fffbfffdffff7fffbfffdffff7fffbfffdffff7fffbfffeffff7fffbfffeffff7fffbfffeffff7fffbfffeffff7fffdfffeffff7fffdfffeffff7fffdfffeffff7fffdfffeffffbfffdfffeffffbfffdfffeffffbfffdfffeffffbfffdffff +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 888844442222111088884444222111108888444222211110888444422221110888844442221111088884442222111108884444222211108888444422211110888844422221111088844442222111088884444222111108888444222211110888444422221110 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 7777bbbbddddeeef7777bbbbdddeeeef7777bbbddddeeeef777bbbbddddeeef7777bbbbdddeeeef7777bbbddddeeeef777bbbbddddeeef7777bbbbdddeeeef7777bbbddddeeeef777bbbbddddeeef7777bbbbdddeeeef7777bbbddddeeeef777bbbbddddeeef +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = f7777bbbbdddddeeeef7777bbbbbddddeeeeef7777bbbbdddddeeeef77777bbbbddddeeeeef7777bbbbdddddeeeef77777bbbbddddeeeeef7777bbbbbddddeeeef77777bbbbddddeeeeef7777bbbbbddddeeeef77777bbbbdddddeeeef7777bbbbbddddeeeee +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 88884444222221111088884444422221111108888444422222111108888844442222111110888844442222211110888884444222211111088884444422221111088888444422221111108888444442222111108888844442222211110888844444222211111 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = ff7f7fbfbfdfdfdfefeff7f7f7fbfbfdfdfefefeff7f7fbfbfbfdfdfefefeff7f7fbfbfdfdfdfefeff7f7f7fbfbfdfdfdfefeff7f7fbfbfbfdfdfefefeff7f7fbfbfbfdfdfefeff7f7f7fbfbfdfdfdfefeff7f7f7fbfbfdfdfefefeff7f7fbfbfbfdfdfefefe +A = fffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 8080404020202010100808080404020201010100808040404020201010100808040402020201010080808040402020201010080804040402020101010080804040402020101008080804040202020101008080804040202010101008080404040202010101 +A = -fffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +A = -1 +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = edb76dbb6ddb6edb6edb76dbb6ddb6edb6edb76dbb6ddb6edb6edb76dbb6ddb6ddb6edb76dbb6ddb6ddb6edb76dbb6ddb6ddb6edb76dbb6dbb6ddb6edb76dbb6dbb6ddb6edb76dbb6dbb6ddb6edb76db76dbb6ddb6edb76db76dbb6ddb6edb76db76dbb6ddb6edb6 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 1248924492249124912489244922491249124892449224912491248924492249224912489244922492249124892449224922491248924492449224912489244924492249124892449244922491248924892449224912489248924492249124892489244922491249 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 9249249249224924924924492492492489249249249224924924924492492492489249249249124924924924492492492489249249249124924924922492492492489249249249124924924922492492492449249249249124924924922492492492449249249248 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 6db6db6db6ddb6db6db6dbb6db6db6db76db6db6db6ddb6db6db6dbb6db6db6db76db6db6db6edb6db6db6dbb6db6db6db76db6db6db6edb6db6db6ddb6db6db6db76db6db6db6edb6db6db6ddb6db6db6dbb6db6db6db6edb6db6db6ddb6db6db6dbb6db6db6db7 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = db6db6b6db6d6db6dadb6db6b6db6d6db6dadb6db5b6db6d6db6dadb6db5b6db6b6db6dadb6db5b6db6b6db6d6db6db5b6db6b6db6d6db6dadb6db6b6db6d6db6dadb6db5b6db6d6db6dadb6db5b6db6b6db6dadb6db5b6db6b6db6d6db6db5b6db6b6db6d6db6da +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 24924949249292492524924949249292492524924a49249292492524924a49249492492524924a49249492492924924a4924949249292492524924949249292492524924a49249292492524924a49249492492524924a49249492492924924a49249492492924925 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = fbdef7bef7bdef7def7bdefbdef7bdf7bdef7bef7bdef7def7bdefbdef7bdf7bdef7bef7bdef7def7bdefbdef7bdf7bdef7bef7bdef7def7bdefbdef7bdf7bdef7bef7bdef7def7bdefbdef7bdf7bdef7bef7bdef7def7bdefbdef7bdf7bdef7bef7bdef7def7bde +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 421084108421082108421042108420842108410842108210842104210842084210841084210821084210421084208421084108421082108421042108420842108410842108210842104210842084210841084210821084210421084208421084108421082108421 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = ffffffffffff7fffffffffffbfffffffffffdfffffffffffeffffffffffff7fffffffffffbfffffffffffdfffffffffffeffffffffffff7fffffffffffbfffffffffffdfffffffffffeffffffffffff7fffffffffffbfffffffffffdfffffffffffefffffffffffe +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 8000000000004000000000002000000000001000000000000800000000000400000000000200000000000100000000000080000000000040000000000020000000000010000000000008000000000004000000000002000000000001000000000001 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = eddbb76edbb76eddbb6eddbb76edbb76eddb76eddbb76ddbb76eddb76eddbb76ddbb76edbb76eddbb6eddbb76edbb76eddbb6eddbb76ddbb76eddb76eddbb76ddbb76eddb76eddbb6eddbb76edbb76eddbb6eddbb76edbb76eddb76eddbb76ddbb76eddb76eddbb6 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 1224489124489122449122448912448912248912244892244891224891224489224489124489122449122448912448912244912244892244891224891224489224489122489122449122448912448912244912244891244891224891224489224489122489122449 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 8884442221110888442221110888444221110888444222110888444222111088444222111088844422111088844422211088844422211108844422211108884422211108884442221108884442221110884442221110888442221110888444221110888444222110 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 777bbbdddeeef777bbdddeeef777bbbddeeef777bbbdddeef777bbbdddeeef77bbbdddeeef777bbbddeeef777bbbdddeef777bbbdddeeef77bbbdddeeef777bbdddeeef777bbbdddeef777bbbdddeeef77bbbdddeeef777bbdddeeef777bbbddeeef777bbbdddeef +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 9244922491248924491248924492249124492249124892449124892449224912449224912489244912489244922491244922491248924492248924492249124892249124892449224892449224912489224912489244922489244922491248922491248924492248 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 6dbb6ddb6edb76dbb6edb76dbb6ddb6edbb6ddb6edb76dbb6edb76dbb6ddb6edbb6ddb6edb76dbb6edb76dbb6ddb6edbb6ddb6edb76dbb6ddb76dbb6ddb6edb76ddb6edb76dbb6ddb76dbb6ddb6edb76ddb6edb76dbb6ddb76dbb6ddb6edb76ddb6edb76dbb6ddb7 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = a94a5294a5294a5294a94a5294a5294a5294a54a5294a5294a5294a52a5294a5294a5294a52a5294a5294a5294a5295294a5294a5294a5294a94a5294a5294a5294a54a5294a5294a5294a54a5294a5294a5294a52a5294a5294a5294a5295294a5294a5294a5294 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 56b5ad6b5ad6b5ad6b56b5ad6b5ad6b5ad6b5ab5ad6b5ad6b5ad6b5ad5ad6b5ad6b5ad6b5ad5ad6b5ad6b5ad6b5ad6ad6b5ad6b5ad6b5ad6b56b5ad6b5ad6b5ad6b5ab5ad6b5ad6b5ad6b5ab5ad6b5ad6b5ad6b5ad5ad6b5ad6b5ad6b5ad6ad6b5ad6b5ad6b5ad6b +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +A = -1 +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 80040020008004001000800200100040020008004002000800400100080020010004002000800400100080040010008002001000400200080040010008002001000800200100040020008004001000800200100040020010004002000800400100080020010004002000 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 7ffbffdfff7ffbffefff7ffdffefffbffdfff7ffbffdfff7ffbffefff7ffdffefffbffdfff7ffbffefff7ffbffefff7ffdffefffbffdfff7ffbffefff7ffdffefff7ffdffefffbffdfff7ffbffefff7ffdffefffbffdffefffbffdfff7ffbffefff7ffdffefffbffdfff +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 88888888888444444444422222222222111111111108888888888444444444442222222222111111111108888888888844444444442222222222111111111110888888888844444444442222222222211111111110888888888844444444444222222222211111111110 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 77777777777bbbbbbbbbbdddddddddddeeeeeeeeeef7777777777bbbbbbbbbbbddddddddddeeeeeeeeeef77777777777bbbbbbbbbbddddddddddeeeeeeeeeeef7777777777bbbbbbbbbbdddddddddddeeeeeeeeeef7777777777bbbbbbbbbbbddddddddddeeeeeeeeeef +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = fbdefbdef7def7bef7bef7bdf7bdefbdef7def7def7bef7bdf7bdefbdefbdef7def7bef7bdf7bdf7bdefbdef7def7bef7bef7bdf7bdefbdef7def7def7bef7bdf7bdefbdefbdef7def7bef7bdf7bdf7bdefbdef7def7bef7bef7bdf7bdefbdef7def7def7bef7bdf7bde +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 4210421082108410841084208421042108210821084108420842104210421082108410842084208421042108210841084108420842104210821082108410842084210421042108210841084208420842104210821084108410842084210421082108210841084208421 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = fefefdfdfbfbf7f7efefdfdfbfbf7f7efefdfdfbfbf7f7efefdfdfbfbf7f7efefdfdfbfbf7f7efefdfdfbfbf7f7efefdfdfbfbf7f7efefdfdfbfbf7f7efefdfdfbfbf7f7efefdfdfbfbf7f7efefdfdfbfbf7f7efefdfdfbfbf7f7efefdfdfbfbf7f7efefdfdfbfbf7f7e +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 1010202040408081010202040408081010202040408081010202040408081010202040408081010202040408081010202040408081010202040408081010202040408081010202040408081010202040408081010202040408081010202040408081010202040408081 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = a4924924924924925249249249249249292492492492492494924924924924924a4924924924924925249249249249249292492492492492494924924924924924a4924924924924925249249249249249292492492492492494924924924924924a4924924924924924 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 5b6db6db6db6db6dadb6db6db6db6db6d6db6db6db6db6db6b6db6db6db6db6db5b6db6db6db6db6dadb6db6db6db6db6d6db6db6db6db6db6b6db6db6db6db6db5b6db6db6db6db6dadb6db6db6db6db6d6db6db6db6db6db6b6db6db6db6db6db5b6db6db6db6db6db +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 80200400802004008010040080100200801002004010020040100200400802004008010040080100200801002008010020040100200400802004008010040080100400801002008010020040100200400802004008020040080100400801002008010020040100200400 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 7fdffbff7fdffbff7feffbff7feffdff7feffdffbfeffdffbfeffdffbff7fdffbff7feffbff7feffdff7feffdff7feffdffbfeffdffbff7fdffbff7feffbff7feffbff7feffdff7feffdffbfeffdffbff7fdffbff7fdffbff7feffbff7feffdff7feffdffbfeffdffbff +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = a94a94a94a54a54a52a52a5295295294a94a94a54a54a52a52a5295295294a94a94a54a54a54a52a52a5295295294a94a94a54a54a52a52a5295295294a94a94a54a54a52a52a52a5295295294a94a94a54a54a52a52a5295295294a94a94a54a54a52a52a5295295294 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 56b56b56b5ab5ab5ad5ad5ad6ad6ad6b56b56b5ab5ab5ad5ad5ad6ad6ad6b56b56b5ab5ab5ab5ad5ad5ad6ad6ad6b56b56b5ab5ab5ad5ad5ad6ad6ad6b56b56b5ab5ab5ad5ad5ad5ad6ad6ad6b56b56b5ab5ab5ad5ad5ad6ad6ad6b56b56b5ab5ab5ad5ad5ad6ad6ad6b +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = fdfbefdf7efdf7efbf7dfbf7dfbefdf7efdf7efbf7dfbf7dfbefdf7efdf7efbf7dfbf7dfbefdf7efdf7efbf7dfbf7dfbefdf7efdf7efbf7efbf7dfbefdfbefdf7efbf7efbf7dfbefdfbefdf7efbf7efbf7dfbefdfbefdf7efbf7efbf7dfbefdfbefdf7efbf7efbf7dfbe +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 2041020810208104082040820410208102081040820408204102081020810408204082041020810208104082040820410208102081040810408204102041020810408104082041020410208104081040820410204102081040810408204102041020810408104082041 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = d55555555555555aaaaaaaaaaaaaaad555555555555556aaaaaaaaaaaaaab555555555555556aaaaaaaaaaaaaab555555555555555aaaaaaaaaaaaaaad555555555555556aaaaaaaaaaaaaad555555555555556aaaaaaaaaaaaaab555555555555555aaaaaaaaaaaaaaa +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 2aaaaaaaaaaaaaa5555555555555552aaaaaaaaaaaaaa9555555555555554aaaaaaaaaaaaaa9555555555555554aaaaaaaaaaaaaaa5555555555555552aaaaaaaaaaaaaa9555555555555552aaaaaaaaaaaaaa9555555555555554aaaaaaaaaaaaaaa555555555555555 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 92449124491244912449124491244912449224892248922489224892248922489224892449124491244912449124491244912449124892248922489224892248922489224892249124491244912449124491244912449124492248922489224892248922489224892248 +A = fffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 6dbb6edbb6edbb6edbb6edbb6edbb6edbb6ddb76ddb76ddb76ddb76ddb76ddb76ddb76dbb6edbb6edbb6edbb6edbb6edbb6edbb6edb76ddb76ddb76ddb76ddb76ddb76ddb76ddb6edbb6edbb6edbb6edbb6edbb6edbb6edbb6ddb76ddb76ddb76ddb76ddb76ddb76ddb7 +A = -fffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +A = -1 +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = fbefbefbefbefbefbefbefbefbefbefbefbef7df7df7df7df7df7df7df7df7df7df7df7defbefbefbefbefbefbefbefbefbefbefbefbdf7df7df7df7df7df7df7df7df7df7df7df7befbefbefbefbefbefbefbefbefbefbefbef7df7df7df7df7df7df7df7df7df7df7df7de +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 41041041041041041041041041041041041082082082082082082082082082082082082104104104104104104104104104104104104208208208208208208208208208208208208410410410410410410410410410410410410820820820820820820820820820820820821 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 924924924924924924924924924924924924924924924924924924924924924924924924492492492492492492492492492492492492492492492492492492492492492492492492249249249249249249249249249249249249249249249249249249249249249249249248 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 6db6db6db6db6db6db6db6db6db6db6db6db6db6db6db6db6db6db6db6db6db6db6db6dbb6db6db6db6db6db6db6db6db6db6db6db6db6db6db6db6db6db6db6db6db6db6db6db6ddb6db6db6db6db6db6db6db6db6db6db6db6db6db6db6db6db6db6db6db6db6db6db6db7 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = fbefbefbefbefbefbefbefbefbefbefbefbef7df7df7df7df7df7df7df7df7df7df7df7defbefbefbefbefbefbefbefbefbefbefbefbdf7df7df7df7df7df7df7df7df7df7df7df7befbefbefbefbefbefbefbefbefbefbefbef7df7df7df7df7df7df7df7df7df7df7df7de +A = fffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 41041041041041041041041041041041041082082082082082082082082082082082082104104104104104104104104104104104104208208208208208208208208208208208208410410410410410410410410410410410410820820820820820820820820820820820821 +A = -fffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +A = -1 +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = ffbfdfeff7fbfdfeff7fbfdfeff7fbfeff7fbfdfeff7fbfdfeff7fbfdfeff7fdfeff7fbfdfeff7fbfdfeff7fbfdfeffbfdfeff7fbfdfeff7fbfdfeff7fbfdff7fbfdfeff7fbfdfeff7fbfdfeff7fbfeff7fbfdfeff7fbfdfeff7fbfdfeff7fdfeff7fbfdfeff7fbfdfeff7fbfdfe +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 40201008040201008040201008040100804020100804020100804020100802010080402010080402010080402010040201008040201008040201008040200804020100804020100804020100804010080402010080402010080402010080201008040201008040201008040201 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = dadad6d6b6b6b5b5adad6d6d6b6b5b5adadad6d6b6b5b5b5adad6d6b6b6b5b5adad6d6d6b6b5b5adadad6d6b6b5b5b5adad6d6b6b6b5b5adad6d6d6b6b5b5adadad6d6b6b5b5b5adad6d6b6b6b5b5adad6d6d6b6b5b5adadad6d6b6b5b5b5adad6d6b6b6b5b5adad6d6d6b6b5b5a +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 2525292949494a4a525292929494a4a525252929494a4a4a525292949494a4a525292929494a4a525252929494a4a4a525292949494a4a525292929494a4a525252929494a4a4a525292949494a4a525292929494a4a525252929494a4a4a525292949494a4a525292929494a4a5 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 8888444422221111088884444222211110888844442222111108888444422221111088884444222211110888844442222111108888444422221111088884444222211110888844442222111108888444422221111088884444222211110888844442222111108888444422221110 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 7777bbbbddddeeeef7777bbbbddddeeeef7777bbbbddddeeeef7777bbbbddddeeeef7777bbbbddddeeeef7777bbbbddddeeeef7777bbbbddddeeeef7777bbbbddddeeeef7777bbbbddddeeeef7777bbbbddddeeeef7777bbbbddddeeeef7777bbbbddddeeeef7777bbbbddddeeef +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 8204081020408102040810204102040810204081020408102081020408102040810204081040810204081020408102040820408102040810204081020410204081020408102040810208102040810204081020408104081020408102040810204082040810204081020408102040 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 7dfbf7efdfbf7efdfbf7efdfbefdfbf7efdfbf7efdfbf7efdf7efdfbf7efdfbf7efdfbf7efbf7efdfbf7efdfbf7efdfbf7dfbf7efdfbf7efdfbf7efdfbefdfbf7efdfbf7efdfbf7efdf7efdfbf7efdfbf7efdfbf7efbf7efdfbf7efdfbf7efdfbf7dfbf7efdfbf7efdfbf7efdfbf +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = aa54aa54a954a952a952a552a552a54aa54a954a952a952a552a552a54aa54a954a952a952a952a552a54aa54a954a952a952a952a552a54aa54a954a954a952a952a552a54aa54a954a954a952a952a552a54aa54aa54a954a952a952a552a54aa54aa54a954a952a952a552a54 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 55ab55ab56ab56ad56ad5aad5aad5ab55ab56ab56ad56ad5aad5aad5ab55ab56ab56ad56ad56ad5aad5ab55ab56ab56ad56ad56ad5aad5ab55ab56ab56ab56ad56ad5aad5ab55ab56ab56ab56ad56ad5aad5ab55ab55ab56ab56ad56ad5aad5ab55ab55ab56ab56ad56ad5aad5ab +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 8004001000400100040010004001000400100040010004001000400100040010004001000400100040010004001000400100040010004002000800200080020008002000800200080020008002000800200080020008002000800200080020008002000800200080020008002000 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 7ffbffefffbffefffbffefffbffefffbffefffbffefffbffefffbffefffbffefffbffefffbffefffbffefffbffefffbffefffbffefffbffdfff7ffdfff7ffdfff7ffdfff7ffdfff7ffdfff7ffdfff7ffdfff7ffdfff7ffdfff7ffdfff7ffdfff7ffdfff7ffdfff7ffdfff7ffdfff +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = edb76dbb6dbb6ddb6ddb6edb6edb76db76dbb6dbb6ddb6ddb6edb6edb76db76dbb6dbb6ddb6edb6edb76db76dbb6dbb6ddb6ddb6edb6edb76db76dbb6dbb6ddb6ddb6edb6edb76db76dbb6ddb6ddb6edb6edb76db76dbb6dbb6ddb6ddb6edb6edb76db76dbb6dbb6ddb6ddb6edb6 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 1248924492449224922491249124892489244924492249224912491248924892449244922491249124892489244924492249224912491248924892449244922492249124912489248924492249224912491248924892449244922492249124912489248924492449224922491249 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +A = -1 +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 81020408102040810204081020408102020408102040810204081020408102040408102040810204081020408102040808102040810204081020408102040810102040810204081020408102040810202040810204081020408102040810204040810204081020408102040810204080 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 7efdfbf7efdfbf7efdfbf7efdfbf7efdfdfbf7efdfbf7efdfbf7efdfbf7efdfbfbf7efdfbf7efdfbf7efdfbf7efdfbf7f7efdfbf7efdfbf7efdfbf7efdfbf7efefdfbf7efdfbf7efdfbf7efdfbf7efdfdfbf7efdfbf7efdfbf7efdfbf7efdfbfbf7efdfbf7efdfbf7efdfbf7efdfbf7f +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = fefefefefefefefefefefefefefefdfdfdfdfdfdfdfdfdfdfdfdfdfdfbfbfbfbfbfbfbfbfbfbfbfbfbfbf7f7f7f7f7f7f7f7f7f7f7f7f7f7efefefefefefefefefefefefefefdfdfdfdfdfdfdfdfdfdfdfdfdfdfbfbfbfbfbfbfbfbfbfbfbfbfbfbf7f7f7f7f7f7f7f7f7f7f7f7f7f7e +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 1010101010101010101010101010202020202020202020202020202040404040404040404040404040408080808080808080808080808081010101010101010101010101010202020202020202020202020202040404040404040404040404040408080808080808080808080808081 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = aaaaaa95555552aaaaaa5555552aaaaaa5555554aaaaaa5555554aaaaaa9555554aaaaaa95555552aaaaa95555552aaaaaa5555552aaaaaa5555554aaaaaa5555554aaaaaa9555554aaaaaa95555552aaaaa95555552aaaaaa5555552aaaaaa5555554aaaaaa5555554aaaaaa9555554 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 5555556aaaaaad555555aaaaaad555555aaaaaab555555aaaaaab5555556aaaaab5555556aaaaaad555556aaaaaad555555aaaaaad555555aaaaaab555555aaaaaab5555556aaaaab5555556aaaaaad555556aaaaaad555555aaaaaad555555aaaaaab555555aaaaaab5555556aaaaab +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = edb6db6edb6db6ddb6db6dbb6db6db76db6db6edb6db6ddb6db6dbb6db6db76db6db6edb6db6ddb6db6dbb6db6db76db6db6edb6db6ddb6db6dbb6db6db76db6db6edb6db6ddb6db6dbb6db6db76db6db6edb6db6ddb6db6dbb6db6db76db6db6edb6db6ddb6db6dbb6db6db76db6db6 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 12492491249249224924924492492489249249124924922492492449249248924924912492492249249244924924892492491249249224924924492492489249249124924922492492449249248924924912492492249249244924924892492491249249224924924492492489249249 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = dad6b5ad6d6b5ad6b6b5ad6b5b5ad6b5adad6b5ad6d6b5ad6b6b5ad6b5b5ad6b5adad6b5ad6d6b5ad6b6b5ad6b5b5ad6b5adad6b5ad6d6b5ad6b6b5ad6b5b5ad6b5adad6b5ad6d6b5ad6b6b5ad6b5b5ad6b5adad6b5ad6d6b5ad6b6b5ad6b5b5ad6b5adad6b5ad6d6b5ad6b6b5ad6b5a +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 25294a529294a529494a5294a4a5294a525294a529294a529494a5294a4a5294a525294a529294a529494a5294a4a5294a525294a529294a529494a5294a4a5294a525294a529294a529494a5294a4a5294a525294a529294a529494a5294a4a5294a525294a529294a529494a5294a5 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 80808080808080808080808080804040404040404040404040404040202020202020202020202020202010101010101010101010101010100808080808080808080808080808040404040404040404040404040402020202020202020202020202020101010101010101010101010100 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 7f7f7f7f7f7f7f7f7f7f7f7f7f7fbfbfbfbfbfbfbfbfbfbfbfbfbfbfdfdfdfdfdfdfdfdfdfdfdfdfdfdfefefefefefefefefefefefefefeff7f7f7f7f7f7f7f7f7f7f7f7f7f7fbfbfbfbfbfbfbfbfbfbfbfbfbfbfdfdfdfdfdfdfdfdfdfdfdfdfdfdfefefefefefefefefefefefefeff +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = d5555556aaaaaab55555556aaaaaab55555556aaaaaab55555556aaaaaab5555555aaaaaaab5555555aaaaaaab5555555aaaaaaab5555555aaaaaaad5555555aaaaaaad5555555aaaaaaad5555555aaaaaaad5555556aaaaaaad5555556aaaaaaad5555556aaaaaaad5555556aaaaaaa +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 2aaaaaa95555554aaaaaaa95555554aaaaaaa95555554aaaaaaa95555554aaaaaaa55555554aaaaaaa55555554aaaaaaa55555554aaaaaaa55555552aaaaaaa55555552aaaaaaa55555552aaaaaaa55555552aaaaaa955555552aaaaaa955555552aaaaaa955555552aaaaaa95555555 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = db6b6dadb6b6dadb5b6d6db5b6d6db5b6b6dadb6b6dadb6b6d6db5b6d6db5b6d6dadb6b6dadb6b6d6db5b6d6db5b6d6dadb6b6dadb6b6dadb5b6d6db5b6d6db5b6b6dadb6b6dadb6b6d6db5b6d6db5b6b6dadb6b6dadb6b6d6db5b6d6db5b6d6dadb6b6dadb6b6dadb5b6d6db5b6d6da +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 2494925249492524a492924a492924a4949252494925249492924a492924a4929252494925249492924a492924a4929252494925249492524a492924a492924a4949252494925249492924a492924a4949252494925249492924a492924a4929252494925249492524a492924a492925 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa5555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555554 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 5555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaab +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 88884442221110888444222111088844422211108884442221110888444222111088844422221110888444222111088844422211108884442221110888444222111088844422211108884444222111088844422211108884442221110888444222111088844422211108884442221110 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 7777bbbdddeeef777bbbdddeeef777bbbdddeeef777bbbdddeeef777bbbdddeeef777bbbddddeeef777bbbdddeeef777bbbdddeeef777bbbdddeeef777bbbdddeeef777bbbdddeeef777bbbbdddeeef777bbbdddeeef777bbbdddeeef777bbbdddeeef777bbbdddeeef777bbbdddeeef +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = d56ab55aab55aad56aad56ab55aab55aad56aad56ab556ab55aad55aad56ab556ab55aad55aad56aad56ab55aab55aad56aad56ab55aab55aad55aad56ab556ab55aad55aad56ab556ab55aab55aad56aad56ab55aab55aad56aad56ab556ab55aad55aad56ab556ab55aad55aad56aa +A = fffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 2a954aa554aa552a9552a954aa554aa552a9552a954aa954aa552aa552a954aa954aa552aa552a9552a954aa554aa552a9552a954aa554aa552aa552a954aa954aa552aa552a954aa954aa554aa552a9552a954aa554aa552a9552a954aa954aa552aa552a954aa954aa552aa552a955 +A = -fffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +A = -1 +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = a4a49494929252524a4a49492929252524a49494929292524a4a49494929252524a4a49492929252524a49494929292524a4a49494929252524a4a49492929252524a49494929292524a4a49494929252524a4a49492929252524a49494929292524a4a49494929252524a4a494929292524 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 5b5b6b6b6d6dadadb5b5b6b6d6d6dadadb5b6b6b6d6d6dadb5b5b6b6b6d6dadadb5b5b6b6d6d6dadadb5b6b6b6d6d6dadb5b5b6b6b6d6dadadb5b5b6b6d6d6dadadb5b6b6b6d6d6dadb5b5b6b6b6d6dadadb5b5b6b6d6d6dadadb5b6b6b6d6d6dadb5b5b6b6b6d6dadadb5b5b6b6d6d6dadb +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = d5555aaaab55555aaaab55555aaaab55556aaaab55556aaaab55556aaaad55556aaaad55556aaaad55556aaaad5555aaaaad5555aaaaad5555aaaab55555aaaab55555aaaab55556aaaab55556aaaab55556aaaab55556aaaad55556aaaad55556aaaad5555aaaaad5555aaaaad5555aaaaa +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 2aaaa55554aaaaa55554aaaaa55554aaaa955554aaaa955554aaaa955552aaaa955552aaaa955552aaaa955552aaaa555552aaaa555552aaaa55554aaaaa55554aaaaa55554aaaa955554aaaa955554aaaa955554aaaa955552aaaa955552aaaa955552aaaa555552aaaa555552aaaa55555 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 924912492249224924492489248924912492249224924492449248924912491249224924492449248924892491249224922492449248924892491249124922492449244924892491249124922492249244924892489249124922492249244924492489249124912492249244924492489248 +A = fffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 6db6edb6ddb6ddb6dbb6db76db76db6edb6ddb6ddb6dbb6dbb6db76db6edb6edb6ddb6dbb6dbb6db76db76db6edb6ddb6ddb6dbb6db76db76db6edb6edb6ddb6dbb6dbb6db76db6edb6edb6ddb6ddb6dbb6db76db76db6edb6ddb6ddb6dbb6dbb6db76db6edb6edb6ddb6dbb6dbb6db76db7 +A = -fffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +A = -1 +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 8102040408101020404081020204080810202040808102040408101020404081010204080810202040808102020408101020404081010204040810202040808102020408081020404081010204040810102040808102020408081020204081010204040810102040408102020408081020204080 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 7efdfbfbf7efefdfbfbf7efdfdfbf7f7efdfdfbf7f7efdfbfbf7efefdfbfbf7efefdfbf7f7efdfdfbf7f7efdfdfbf7efefdfbfbf7efefdfbfbf7efdfdfbf7f7efdfdfbf7f7efdfbfbf7efefdfbfbf7efefdfbf7f7efdfdfbf7f7efdfdfbf7efefdfbfbf7efefdfbfbf7efdfdfbf7f7efdfdfbf7f +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 8000100001000010000200002000020000200004000040000400004000080000800008000080001000010000100001000020000200002000020000400004000040000400008000080000800008000100001000010000100002000020000200002000040000400004000040000800008000080000 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 7fffeffffeffffeffffdffffdffffdffffdffffbffffbffffbffffbffff7ffff7ffff7ffff7fffeffffeffffeffffeffffdffffdffffdffffdffffbffffbffffbffffbffff7ffff7ffff7ffff7fffeffffeffffeffffeffffdffffdffffdffffdffffbffffbffffbffffbffff7ffff7ffff7ffff +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 8010010010020020020020040040040040080080080080100100100100200200200200400400400400800800800801001001001002002002002004004004004008008008008010010010010020020020020040040040040080080080080100100100100200200200200400400400400800800800 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 7feffeffeffdffdffdffdffbffbffbffbff7ff7ff7ff7feffeffeffeffdffdffdffdffbffbffbffbff7ff7ff7ff7feffeffeffeffdffdffdffdffbffbffbffbff7ff7ff7ff7feffeffeffeffdffdffdffdffbffbffbffbff7ff7ff7ff7feffeffeffeffdffdffdffdffbffbffbffbff7ff7ff7ff +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = eedddbb776edddbb776eeddbbb76eeddbbb776edddbb776edddbbb76eeddbbb76eedddbb776edddbb776eeddbbb76eeddbbb776edddbb776edddbbb76eeddbbb76eedddbb776edddbb776eeddbbb76eeddbbb776edddbb776edddbbb76eeddbbb76eedddbb776edddbb776eeddbbb76eeddbbb76 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 1122244889122244889112244489112244488912224488912224448911224448911222448891222448891122444891122444889122244889122244489112244489112224488912224488911224448911224448891222448891222444891122444891122244889122244889112244489112244489 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = a49492924a49492924a49492924a49492924a49492924a49492924a49492524a49492524a49492524a49492524a49492524a49492524a49492524a49292524a49292524a49292524a49292524a49292524a49292524a492925249492925249492925249492925249492925249492925249492924 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 5b6b6d6db5b6b6d6db5b6b6d6db5b6b6d6db5b6b6d6db5b6b6d6db5b6b6dadb5b6b6dadb5b6b6dadb5b6b6dadb5b6b6dadb5b6b6dadb5b6b6dadb5b6d6dadb5b6d6dadb5b6d6dadb5b6d6dadb5b6d6dadb5b6d6dadb5b6d6dadb6b6d6dadb6b6d6dadb6b6d6dadb6b6d6dadb6b6d6dadb6b6d6db +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 9122244488912224448891222444889112244488911224448891122444889112224488911222448891122244489112224448911222444891122244488912224448891222444889122244488911224448891122444889112224488911222448891122244889112224448911222444891122244488 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 6edddbbb776edddbbb776edddbbb776eeddbbb776eeddbbb776eeddbbb776eedddbb776eedddbb776eedddbbb76eedddbbb76eedddbbb76eedddbbb776edddbbb776edddbbb776edddbbb776eeddbbb776eeddbbb776eedddbb776eedddbb776eedddbb776eedddbbb76eedddbbb76eedddbbb77 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 8842108422108421088421084221084210884210842210842108842108422108421088421084221084210884210842210842108842108422108421084421084211084210844210842110842108442108421108421084421084211084210844210842110842108442108421108421084421084210 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 77bdef7bddef7bdef77bdef7bddef7bdef77bdef7bddef7bdef77bdef7bddef7bdef77bdef7bddef7bdef77bdef7bddef7bdef77bdef7bddef7bdef7bbdef7bdeef7bdef7bbdef7bdeef7bdef7bbdef7bdeef7bdef7bbdef7bdeef7bdef7bbdef7bdeef7bdef7bbdef7bdeef7bdef7bbdef7bdef +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = ffffdffffbffff7fffeffffdffffbffff7fffeffffdffffbffff7fffeffffdffffbffff7fffeffffbffff7fffeffffdffffbffff7fffeffffdffffbffff7fffeffffdffffbffff7fffeffffdffff7fffeffffdffffbffff7fffeffffdffffbffff7fffeffffdffffbffff7fffeffffdffffbfffe +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 200004000080001000020000400008000100002000040000800010000200004000080001000040000800010000200004000080001000020000400008000100002000040000800010000200008000100002000040000800010000200004000080001000020000400008000100002000040001 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = edb6db6db6db6db6dbb6db6db6db6db6db6edb6db6db6db6db6db76db6db6db6db6db6ddb6db6db6db6db6db6edb6db6db6db6db6dbb6db6db6db6db6db6ddb6db6db6db6db6db76db6db6db6db6db6dbb6db6db6db6db6db6edb6db6db6db6db6db76db6db6db6db6db6ddb6db6db6db6db6db6 +A = fffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 1249249249249249244924924924924924912492492492492492489249249249249249224924924924924924912492492492492492449249249249249249224924924924924924892492492492492492449249249249249249124924924924924924892492492492492492249249249249249249 +A = -fffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +A = -1 +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 91111111111111111112222222222222222222244444444444444444444888888888888888888891111111111111111111222222222222222222224444444444444444444488888888888888888889111111111111111111122222222222222222222444444444444444444448888888888888888888 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 6eeeeeeeeeeeeeeeeeeddddddddddddddddddddbbbbbbbbbbbbbbbbbbbb77777777777777777776eeeeeeeeeeeeeeeeeeeddddddddddddddddddddbbbbbbbbbbbbbbbbbbbb77777777777777777776eeeeeeeeeeeeeeeeeeeddddddddddddddddddddbbbbbbbbbbbbbbbbbbbb7777777777777777777 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 80000000000000020000000000000004000000000000000800000000000000100000000000000020000000000000004000000000000000800000000000000100000000000000020000000000000004000000000000000800000000000000100000000000000020000000000000004000000000000000 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 7ffffffffffffffdfffffffffffffffbfffffffffffffff7ffffffffffffffefffffffffffffffdfffffffffffffffbfffffffffffffff7ffffffffffffffefffffffffffffffdfffffffffffffffbfffffffffffffff7ffffffffffffffefffffffffffffffdfffffffffffffffbfffffffffffffff +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = a492924a49252494924a492924949252492924a49252494924a492924949252492924a49252494924a492924949252492924a49252494924a492924949252492924a49252494924a492924949252492924a49252494924a492924949252492924a49252494924a492924949252492924a49252494924 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 5b6d6db5b6dadb6b6db5b6d6db6b6dadb6d6db5b6dadb6b6db5b6d6db6b6dadb6d6db5b6dadb6b6db5b6d6db6b6dadb6d6db5b6dadb6b6db5b6d6db6b6dadb6d6db5b6dadb6b6db5b6d6db6b6dadb6d6db5b6dadb6b6db5b6d6db6b6dadb6d6db5b6dadb6b6db5b6d6db6b6dadb6d6db5b6dadb6b6db +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 80804040202010100808040402020101008080404020201010080804040202010100808040402020101008080404020201010080804040202010100808040402020101008080404020201010080804040202010100808040402020101008080404020201010080804040202010100808040402020100 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 7f7fbfbfdfdfefeff7f7fbfbfdfdfefeff7f7fbfbfdfdfefeff7f7fbfbfdfdfefeff7f7fbfbfdfdfefeff7f7fbfbfdfdfefeff7f7fbfbfdfdfefeff7f7fbfbfdfdfefeff7f7fbfbfdfdfefeff7f7fbfbfdfdfefeff7f7fbfbfdfdfefeff7f7fbfbfdfdfefeff7f7fbfbfdfdfefeff7f7fbfbfdfdfeff +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 92492489249248924924492492449249244924922492492249249224924912492491249249124924892492489249248924924492492449249244924922492492249249224924912492491249249124924892492489249248924924492492449249244924922492492249249224924912492491249248 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 6db6db76db6db76db6dbb6db6dbb6db6dbb6db6ddb6db6ddb6db6ddb6db6edb6db6edb6db6edb6db76db6db76db6db76db6dbb6db6dbb6db6dbb6db6ddb6db6ddb6db6ddb6db6edb6db6edb6db6edb6db76db6db76db6db76db6dbb6db6dbb6db6dbb6db6ddb6db6ddb6db6ddb6db6edb6db6edb6db7 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = fefdfbfbf7efefdfbfbf7efefdfbfbf7efefdfbf7f7efdfdfbf7f7efdfdfbf7f7efdfdfbf7f7efdfbfbf7efefdfbfbf7efefdfbfbf7efefdfbfbf7efdfdfbf7f7efdfdfbf7f7efdfdfbf7f7efdfdfbf7efefdfbfbf7efefdfbfbf7efefdfbfbf7efefdfbf7f7efdfdfbf7f7efdfdfbf7f7efdfdfbf7e +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 1020404081010204040810102040408101020408081020204080810202040808102020408081020404081010204040810102040408101020404081020204080810202040808102020408081020204081010204040810102040408101020404081010204080810202040808102020408081020204081 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 88421084210842108421088421084210842108421088421084210842108421084421084210842108421084421084210842108421084421084210842108421084221084210842108421084221084210842108421084221084210842108421084211084210842108421084211084210842108421084210 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 77bdef7bdef7bdef7bdef77bdef7bdef7bdef7bdef77bdef7bdef7bdef7bdef7bbdef7bdef7bdef7bdef7bbdef7bdef7bdef7bdef7bbdef7bdef7bdef7bdef7bddef7bdef7bdef7bdef7bddef7bdef7bdef7bdef7bddef7bdef7bdef7bdef7bdeef7bdef7bdef7bdef7bdeef7bdef7bdef7bdef7bdef +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = d5aad56ab56ab55aad56ad56ab55aad5aad56ab55ab55aad56ad56ab55aad5aad56ab55ab55aad56ab56ab55aad56ad56ab55ab55aad56ab56ab55aad56ad56ab55aad5aad56ab56ab55aad56ad56ab55aad5aad56ab55ab55aad56ab56ab55aad5aad56ab55ab55aad56ab56ab55aad56ad56ab55aa +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 2a552a954a954aa552a952a954aa552a552a954aa54aa552a952a954aa552a552a954aa54aa552a954a954aa552a952a954aa54aa552a954a954aa552a952a954aa552a552a954a954aa552a952a954aa552a552a954aa54aa552a954a954aa552a552a954aa54aa552a954a954aa552a952a954aa55 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = db6db6db6db6b6db6db6db6dadb6db6db6db6b6db6db6db6dadb6db6db6db6b6db6db6db6dadb6db6db6db6b6db6db6db6dadb6db6db6db6b6db6db6db6d6db6db6db6db5b6db6db6db6d6db6db6db6db5b6db6db6db6d6db6db6db6db5b6db6db6db6d6db6db6db6db5b6db6db6db6d6db6db6db6da +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 2492492492494924924924925249249249249492492492492524924924924949249249249252492492492494924924924925249249249249492492492492924924924924a492492492492924924924924a492492492492924924924924a492492492492924924924924a492492492492924924924925 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = ffeffeffdffdffdffbffbffbff7ff7ff7feffeffeffdffdffdffbffbffbff7ff7ff7feffeffeffdffdffbffbffbff7ff7ff7feffeffeffdffdffdffbffbffbff7ff7ff7feffeffeffdffdffdffbffbff7ff7ff7feffeffeffdffdffdffbffbffbff7ff7ff7feffeffeffdffdffdffbffbffbff7ff7fe +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 100100200200200400400400800800801001001002002002004004004008008008010010010020020040040040080080080100100100200200200400400400800800801001001002002002004004008008008010010010020020020040040040080080080100100100200200200400400400800801 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = fffffff7ffffffbffffffbffffffdffffffeffffffefffffff7ffffff7ffffffbffffffdffffffdffffffeffffffefffffff7ffffffbffffffbffffffdffffffdffffffefffffff7ffffff7ffffffbffffffbffffffdffffffeffffffefffffff7ffffff7ffffffbffffffdffffffdffffffeffffffe +A = fffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 8000000400000040000002000000100000010000000800000080000004000000200000020000001000000100000008000000400000040000002000000200000010000000800000080000004000000400000020000001000000100000008000000800000040000002000000200000010000001 +A = -fffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +A = -1 +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 820408204082040810408104081020810208102041020410204082040820408104081040810208102081020410204102040820408204081040810408102081020810204102041020408204082040810408104081020810208102041020410204082040820408104081040810208102081020410204102040 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 7dfbf7dfbf7dfbf7efbf7efbf7efdf7efdf7efdfbefdfbefdfbf7dfbf7dfbf7efbf7efbf7efdf7efdf7efdfbefdfbefdfbf7dfbf7dfbf7efbf7efbf7efdf7efdf7efdfbefdfbefdfbf7dfbf7dfbf7efbf7efbf7efdf7efdf7efdfbefdfbefdfbf7dfbf7dfbf7efbf7efbf7efdf7efdf7efdfbefdfbefdfbf +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 922489224892248922489224491244912449124491244912248922489224892248922489124491244912449124491244892248922489224892248922449124491244912449124491224892248922489224892248912449124491244912449124489224892248922489224892244912449124491244912448 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 6ddb76ddb76ddb76ddb76ddbb6edbb6edbb6edbb6edbb6eddb76ddb76ddb76ddb76ddb76edbb6edbb6edbb6edbb6edbb76ddb76ddb76ddb76ddb76ddbb6edbb6edbb6edbb6edbb6eddb76ddb76ddb76ddb76ddb76edbb6edbb6edbb6edbb6edbb76ddb76ddb76ddb76ddb76ddbb6edbb6edbb6edbb6edbb7 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 800008000080000400004000020000200002000010000100000800008000040000400004000020000200001000010000080000800008000040000400002000020000100001000010000080000800004000040000200002000020000100001000008000080000400004000040000200002000010000100000 +A = fffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 7ffff7ffff7ffffbffffbffffdffffdffffdffffeffffefffff7ffff7ffffbffffbffffbffffdffffdffffeffffefffff7ffff7ffff7ffffbffffbffffdffffdffffeffffeffffefffff7ffff7ffffbffffbffffdffffdffffdffffeffffefffff7ffff7ffffbffffbffffbffffdffffdffffeffffefffff +A = -fffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +A = -1 +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = db6b6d6dadb6b6d6dadb5b6d6dadb5b6b6dadb5b6b6d6db5b6b6d6dadb6b6d6dadb5b6d6dadb5b6b6dadb5b6b6d6db5b6b6d6dadb6b6d6dadb5b6d6dadb5b6b6dadb5b6b6d6db5b6b6d6dadb6b6d6dadb5b6d6dadb5b6b6dadb5b6b6d6db5b6b6d6dadb6b6d6dadb5b6d6dadb5b6b6dadb5b6b6d6db5b6b6d6da +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 24949292524949292524a49292524a49492524a49492924a4949292524949292524a49292524a49492524a49492924a4949292524949292524a49292524a49492524a49492924a4949292524949292524a49292524a49492524a49492924a4949292524949292524a49292524a49492524a49492924a49492925 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 8001000200020004000400080008001000100020002000400040008000800100010002000200040004000800080010001000200020004000400080008001000100020002000400040008000800100010002000200040004000800080010001000200020004000400080008001000100020002000400040008000 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 7ffefffdfffdfffbfffbfff7fff7ffefffefffdfffdfffbfffbfff7fff7ffefffefffdfffdfffbfffbfff7fff7ffefffefffdfffdfffbfffbfff7fff7ffefffefffdfffdfffbfffbfff7fff7ffefffefffdfffdfffbfffbfff7fff7ffefffefffdfffdfffbfffbfff7fff7ffefffefffdfffdfffbfffbfff7fff +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 8888888888884444444444442222222222221111111111110888888888888444444444444222222222222111111111111088888888888844444444444422222222222211111111111108888888888884444444444442222222222221111111111110888888888888444444444444222222222222111111111110 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 777777777777bbbbbbbbbbbbddddddddddddeeeeeeeeeeeef777777777777bbbbbbbbbbbbddddddddddddeeeeeeeeeeeef777777777777bbbbbbbbbbbbddddddddddddeeeeeeeeeeeef777777777777bbbbbbbbbbbbddddddddddddeeeeeeeeeeeef777777777777bbbbbbbbbbbbddddddddddddeeeeeeeeeeef +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 8020080200401004010020080200401004010020080200801004010020080200801004010040080200801004010040080200802004010040080200802004010040100200802004010040100200802008010040100200802008010040100400802008010040100400802008020040100400802008020040100400 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 7fdff7fdffbfeffbfeffdff7fdffbfeffbfeffdff7fdff7feffbfeffdff7fdff7feffbfeffbff7fdff7feffbfeffbff7fdff7fdffbfeffbff7fdff7fdffbfeffbfeffdff7fdffbfeffbfeffdff7fdff7feffbfeffdff7fdff7feffbfeffbff7fdff7feffbfeffbff7fdff7fdffbfeffbff7fdff7fdffbfeffbff +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = fbef7defbdf7bef7defbdf7bef7defbdf7bef7defbdf7bef7df7bef7defbdf7bef7defbdf7bef7defbdf7bef7defbdf7befbdf7bef7defbdf7bef7defbdf7bef7defbdf7bef7defbdf7defbdf7bef7defbdf7bef7defbdf7bef7defbdf7bef7defbef7defbdf7bef7defbdf7bef7defbdf7bef7defbdf7bef7de +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 410821042084108210420841082104208410821042084108208410821042084108210420841082104208410821042084104208410821042084108210420841082104208410821042082104208410821042084108210420841082104208410821041082104208410821042084108210420841082104208410821 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = dad6b5ad6d6b5ad6b5b5ad6b5adad6b5ad6b6b5ad6b5adad6b5ad6d6b5ad6b5b5ad6b5ad6d6b5ad6b6b5ad6b5adad6b5ad6d6b5ad6b5b5ad6b5ad6d6b5ad6b6b5ad6b5adad6b5ad6b6b5ad6b5b5ad6b5ad6d6b5ad6b6b5ad6b5adad6b5ad6b6b5ad6b5b5ad6b5ad6d6b5ad6b5b5ad6b5adad6b5ad6b6b5ad6b5a +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 25294a529294a5294a4a5294a525294a529494a5294a525294a529294a5294a4a5294a529294a529494a5294a525294a529294a5294a4a5294a529294a529494a5294a525294a529494a5294a4a5294a529294a529494a5294a525294a529494a5294a4a5294a529294a5294a4a5294a525294a529494a5294a5 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = fefefdfdfbfbf7f7f7efefdfdfbfbfbf7f7efefdfdfdfbfbf7f7efefdfdfdfbfbf7f7efefefdfdfbfbf7f7f7efefdfdfbfbf7f7f7efefdfdfbfbfbf7f7efefdfdfdfbfbf7f7efefefdfdfbfbf7f7efefefdfdfbfbf7f7f7efefdfdfbfbfbf7f7efefdfdfbfbfbf7f7efefdfdfdfbfbf7f7efefefdfdfbfbf7f7e +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 101020204040808081010202040404080810102020204040808101020202040408081010102020404080808101020204040808081010202040404080810102020204040808101010202040408081010102020404080808101020204040408081010202040404080810102020204040808101010202040408081 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = dadadadadad6d6d6d6d6b6b6b6b6b6b5b5b5b5b5adadadadadad6d6d6d6d6b6b6b6b6b6b5b5b5b5b5adadadadadad6d6d6d6d6b6b6b6b6b6b5b5b5b5b5adadadadad6d6d6d6d6d6b6b6b6b6b5b5b5b5b5b5adadadadad6d6d6d6d6d6b6b6b6b6b5b5b5b5b5b5adadadadad6d6d6d6d6d6b6b6b6b6b5b5b5b5b5a +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 2525252525292929292949494949494a4a4a4a4a52525252525292929292949494949494a4a4a4a4a52525252525292929292949494949494a4a4a4a4a525252525292929292929494949494a4a4a4a4a4a525252525292929292929494949494a4a4a4a4a4a525252525292929292929494949494a4a4a4a4a5 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = a4924924a4924924949249249492492492924924929249249252492492524924924a4924924a49249249492492492924924929249249252492492524924924a4924924a49249249492492494924924929249249252492492524924924a4924924a49249249492492494924924929249249292492492524924924 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 5b6db6db5b6db6db6b6db6db6b6db6db6d6db6db6d6db6db6dadb6db6dadb6db6db5b6db6db5b6db6db6b6db6db6d6db6db6d6db6db6dadb6db6dadb6db6db5b6db6db5b6db6db6b6db6db6b6db6db6d6db6db6dadb6db6dadb6db6db5b6db6db5b6db6db6b6db6db6b6db6db6d6db6db6d6db6db6dadb6db6db +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = eeddbbb76edddbb76eeddbb776eddbbb76eeddbb776eddbbb76edddbb76eeddbb776edddbb76eeddbb776eddbbb76edddbb76eeddbbb76edddbb76eeddbb776eddbbb76edddbb776eddbbb76edddbb76eeddbb776eddbbb76eeddbb776eddbbb76edddbb76eeddbb776edddbb76eeddbb776eddbbb76edddbb76 +A = fffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 1122444891222448911224488912244489112244889122444891222448911224488912224489112244889122444891222448911224448912224489112244889122444891222448891224448912224489112244889122444891122448891224448912224489112244889122244891122448891224448912224489 +A = -fffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +A = -1 +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = aaaa5554aaa95552aaa5554aaa95552aaa5554aaa95552aaa5554aaa95552aaa5554aaa95552aaa5554aaa95552aaa5554aaa95552aaa5554aaa95552aaa5554aaa95552aaa5554aaa95552aaa5554aaa95552aaa5554aaa95552aaa5554aaa95552aaa5554aaa95552aaa5554aaa95552aaa5554aaa95552aaa5554 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 5555aaab5556aaad555aaab5556aaad555aaab5556aaad555aaab5556aaad555aaab5556aaad555aaab5556aaad555aaab5556aaad555aaab5556aaad555aaab5556aaad555aaab5556aaad555aaab5556aaad555aaab5556aaad555aaab5556aaad555aaab5556aaad555aaab5556aaad555aaab5556aaad555aaab +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 84104208210410820841042082104108208410420821041082084104208210410820841042082104108208410420821041082084104208210410820841042082104108208410420821041082084104208210410820841042082104108208410420821041082084104208210410820841042082104108208410420820 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 7befbdf7defbef7df7befbdf7defbef7df7befbdf7defbef7df7befbdf7defbef7df7befbdf7defbef7df7befbdf7defbef7df7befbdf7defbef7df7befbdf7defbef7df7befbdf7defbef7df7befbdf7defbef7df7befbdf7defbef7df7befbdf7defbef7df7befbdf7defbef7df7befbdf7defbef7df7befbdf7df +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = a49292494924a49252494924a49252492924a4925249292494925249292494924a49292494924a49252494924a49252492924a4925249292494925249292494924a49292494924a49252494924a49252492924a4925249292494925249292494924a49292494924a49252494924a49252492924a4925249292494924 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 5b6d6db6b6db5b6dadb6b6db5b6dadb6d6db5b6dadb6d6db6b6dadb6d6db6b6db5b6d6db6b6db5b6dadb6b6db5b6dadb6d6db5b6dadb6d6db6b6dadb6d6db6b6db5b6d6db6b6db5b6dadb6b6db5b6dadb6d6db5b6dadb6d6db6b6dadb6d6db6b6db5b6d6db6b6db5b6dadb6b6db5b6dadb6d6db5b6dadb6d6db6b6db +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 88844221108884422110888442211088444221108844422110884442211088442221108844222110884422211088442211108844221110884422111088442211088844221108884422110888442211088444221108844422110884442211088442221108844222110884422211088442211108844221110884422110 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 777bbddeef777bbddeef777bbddeef77bbbddeef77bbbddeef77bbbddeef77bbdddeef77bbdddeef77bbdddeef77bbddeeef77bbddeeef77bbddeeef77bbddeef777bbddeef777bbddeef777bbddeef77bbbddeef77bbbddeef77bbbddeef77bbdddeef77bbdddeef77bbdddeef77bbddeeef77bbddeeef77bbddeef +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = db6db6db6db6d6db6db6db6db6b6db6db6db6db5b6db6db6db6d6db6db6db6db6b6db6db6db6db5b6db6db6db6dadb6db6db6db6b6db6db6db6db5b6db6db6db6dadb6db6db6db6d6db6db6db6db5b6db6db6db6dadb6db6db6db6d6db6db6db6db6b6db6db6db6dadb6db6db6db6d6db6db6db6db6b6db6db6db6da +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 249249249249292492492492494924924924924a49249249249292492492492494924924924924a49249249249252492492492494924924924924a49249249249252492492492492924924924924a4924924924925249249249249292492492492494924924924925249249249249292492492492494924924924925 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = a49249249249249249292492492492492492494924924924924924924a49249249249249249252492492492492492494924924924924924924a49249249249249249252492492492492492492924924924924924924a4924924924924924925249249249249249249292492492492492492494924924924924924924 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 5b6db6db6db6db6db6d6db6db6db6db6db6db6b6db6db6db6db6db6db5b6db6db6db6db6db6dadb6db6db6db6db6db6b6db6db6db6db6db6db5b6db6db6db6db6db6dadb6db6db6db6db6db6d6db6db6db6db6db6db5b6db6db6db6db6db6dadb6db6db6db6db6db6d6db6db6db6db6db6db6b6db6db6db6db6db6db +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = a52929494a4a52929494a4a52529494a4a52529494a4a52529294a4a5252929494a5252929494a5252929494a4a52929494a4a52529494a4a52529494a4a52529294a4a52529294a4a5252929494a5252929494a4a52929494a4a52929494a4a52529494a4a52529294a4a52529294a4a5252929494a5252929494a4 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 5ad6d6b6b5b5ad6d6b6b5b5adad6b6b5b5adad6b6b5b5adad6d6b5b5adad6d6b6b5adad6d6b6b5adad6d6b6b5b5ad6d6b6b5b5adad6b6b5b5adad6b6b5b5adad6d6b5b5adad6d6b5b5adad6d6b6b5adad6d6b6b5b5ad6d6b6b5b5ad6d6b6b5b5adad6b6b5b5adad6d6b5b5adad6d6b5b5adad6d6b6b5adad6d6b6b5b +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = a952952952952a52a52a52a52a54a54a54a54a94a94a94a94a952952952952a52a52a52a52a54a54a54a54a94a94a94a94a952952952952a52a52a52a52a54a54a54a54a54a94a94a94a952952952952952a52a52a52a54a54a54a54a54a94a94a94a952952952952952a52a52a52a54a54a54a54a54a94a94a94a94 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 56ad6ad6ad6ad5ad5ad5ad5ad5ab5ab5ab5ab56b56b56b56b56ad6ad6ad6ad5ad5ad5ad5ad5ab5ab5ab5ab56b56b56b56b56ad6ad6ad6ad5ad5ad5ad5ad5ab5ab5ab5ab5ab56b56b56b56ad6ad6ad6ad6ad5ad5ad5ad5ab5ab5ab5ab5ab56b56b56b56ad6ad6ad6ad6ad5ad5ad5ad5ab5ab5ab5ab5ab56b56b56b56b +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 88888884444444222222111111108888888444444222222211111110888888444444422222221111110888888844444422222221111111088888844444442222222111111088888884444444222222111111108888884444444222222211111108888888444444422222211111110888888844444422222221111110 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 7777777bbbbbbbddddddeeeeeeef7777777bbbbbbdddddddeeeeeeef777777bbbbbbbdddddddeeeeeef7777777bbbbbbdddddddeeeeeeef777777bbbbbbbdddddddeeeeeef7777777bbbbbbbddddddeeeeeeef777777bbbbbbbdddddddeeeeeef7777777bbbbbbbddddddeeeeeeef7777777bbbbbbdddddddeeeeeef +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 80804020100804020100804020100804020201008040201008040201008040201008040402010080402010080402010080402010080804020100804020100804020100804020101008040201008040201008040201008040202010080402010080402010080402010080404020100804020100804020100804020100 +A = fffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 7f7fbfdfeff7fbfdfeff7fbfdfeff7fbfdfdfeff7fbfdfeff7fbfdfeff7fbfdfeff7fbfbfdfeff7fbfdfeff7fbfdfeff7fbfdfeff7f7fbfdfeff7fbfdfeff7fbfdfeff7fbfdfefeff7fbfdfeff7fbfdfeff7fbfdfeff7fbfdfdfeff7fbfdfeff7fbfdfeff7fbfdfeff7fbfbfdfeff7fbfdfeff7fbfdfeff7fbfdfeff +A = -fffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +A = -1 +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = a952a54a952a54a952a54a952a54a952a54a54a952a54a952a54a952a54a952a54a952a52a54a952a54a952a54a952a54a952a54a952952a54a952a54a952a54a952a54a952a54a94a952a54a952a54a952a54a952a54a952a54a54a952a54a952a54a952a54a952a54a952a52a54a952a54a952a54a952a54a952a54a94 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 56ad5ab56ad5ab56ad5ab56ad5ab56ad5ab5ab56ad5ab56ad5ab56ad5ab56ad5ab56ad5ad5ab56ad5ab56ad5ab56ad5ab56ad5ab56ad6ad5ab56ad5ab56ad5ab56ad5ab56ad5ab56b56ad5ab56ad5ab56ad5ab56ad5ab56ad5ab5ab56ad5ab56ad5ab56ad5ab56ad5ab56ad5ad5ab56ad5ab56ad5ab56ad5ab56ad5ab56b +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = d5ab56ad5ab56ad5ab56ad5ab56ad5ab56ad56ad5ab56ad5ab56ad5ab56ad5ab56ad5ab55ab56ad5ab56ad5ab56ad5ab56ad5ab56ad56ad5ab56ad5ab56ad5ab56ad5ab56ad5ab56ab56ad5ab56ad5ab56ad5ab56ad5ab56ad5aad5ab56ad5ab56ad5ab56ad5ab56ad5ab56ab56ad5ab56ad5ab56ad5ab56ad5ab56ad5aa +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 2a54a952a54a952a54a952a54a952a54a952a952a54a952a54a952a54a952a54a952a54aa54a952a54a952a54a952a54a952a54a952a952a54a952a54a952a54a952a54a952a54a954a952a54a952a54a952a54a952a54a952a552a54a952a54a952a54a952a54a952a54a954a952a54a952a54a952a54a952a54a952a55 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = eddbb76eddbb76eddbb76eddbb76eddbb76edbb76eddbb76eddbb76eddbb76eddbb76eddb76eddbb76eddbb76eddbb76eddbb76eddbb6eddbb76eddbb76eddbb76eddbb76eddbb76ddbb76eddbb76eddbb76eddbb76eddbb76edbb76eddbb76eddbb76eddbb76eddbb76eddb76eddbb76eddbb76eddbb76eddbb76eddbb6 +A = fffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 122448912244891224489122448912244891244891224489122448912244891224489122489122448912244891224489122448912244912244891224489122448912244891224489224489122448912244891224489122448912448912244891224489122448912244891224891224489122448912244891224489122449 +A = -fffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +A = -1 +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = f7777bbbbddddeeeef7777bbbbddddeeeef7777bbbbddddeeeef7777bbbbddddeeeef7777bbbbddddeeeef7777bbbbddddeeeef7777bbbbddddeeeef7777bbbbddddeeeef7777bbbbddddeeeef7777bbbbddddeeeef7777bbbbddddeeeef7777bbbbddddeeeef7777bbbbddddeeeef7777bbbbddddeeeef7777bbbbddddeeeee +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 888844442222111108888444422221111088884444222211110888844442222111108888444422221111088884444222211110888844442222111108888444422221111088884444222211110888844442222111108888444422221111088884444222211110888844442222111108888444422221111088884444222211111 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = f7bdef7bdef77bdef7bdef7bbdef7bdef7bddef7bdef7bdeef7bdef7bdef77bdef7bdef7bbdef7bdef7bddef7bdef7bdeef7bdef7bdef77bdef7bdef7bbdef7bdef7bddef7bdef7bdeef7bdef7bdef77bdef7bdef7bbdef7bdef7bddef7bdef7bdeef7bdef7bdef77bdef7bdef7bbdef7bdef7bddef7bdef7bdeef7bdef7bdee +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 842108421088421084210844210842108422108421084211084210842108842108421084421084210842210842108421108421084210884210842108442108421084221084210842110842108421088421084210844210842108422108421084211084210842108842108421084421084210842210842108421108421084211 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 8020040080100400801002004010020040080200400801002008010020040100200400801004008010020080100200400802004008010040080100200401002004008020040080100200801002004010020040080100400801002008010020040080200400801004008010020040100200400802004008010020080100200400 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 7fdffbff7feffbff7feffdffbfeffdffbff7fdffbff7feffdff7feffdffbfeffdffbff7feffbff7feffdff7feffdffbff7fdffbff7feffbff7feffdffbfeffdffbff7fdffbff7feffdff7feffdffbfeffdffbff7feffbff7feffdff7feffdffbff7fdffbff7feffbff7feffdffbfeffdffbff7fdffbff7feffdff7feffdffbff +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 8208104082041040820410208104102081040820410408204102082041020810408208104082041020820410208104102081040820410408204102081041020810408208104082041020820410208104082081040820410408204102081041020810408204104082041020820410208104082081040820410208204102081040 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 7df7efbf7dfbefbf7dfbefdf7efbefdf7efbf7dfbefbf7dfbefdf7dfbefdf7efbf7df7efbf7dfbefdf7dfbefdf7efbefdf7efbf7dfbefbf7dfbefdf7efbefdf7efbf7df7efbf7dfbefdf7dfbefdf7efbf7df7efbf7dfbefbf7dfbefdf7efbefdf7efbf7dfbefbf7dfbefdf7dfbefdf7efbf7df7efbf7dfbefdf7dfbefdf7efbf +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = fffffffffffffff7ffffffffffffff7ffffffffffffff7ffffffffffffff7ffffffffffffffbffffffffffffffbffffffffffffffbffffffffffffffbffffffffffffffdffffffffffffffdffffffffffffffdffffffffffffffdffffffffffffffeffffffffffffffeffffffffffffffeffffffffffffffeffffffffffffffe +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 8000000000000008000000000000008000000000000008000000000000004000000000000004000000000000004000000000000004000000000000002000000000000002000000000000002000000000000002000000000000001000000000000001000000000000001000000000000001000000000000001 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 8008004002001000800400200100080040020010008004002001000800400200100080040020010008004004002001000800400200100080040020010008004002001000800400200100080040020010008004002002001000800400200100080040020010008004002001000800400200100080040020010008004002001000 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 7ff7ffbffdffefff7ffbffdffefff7ffbffdffefff7ffbffdffefff7ffbffdffefff7ffbffdffefff7ffbffbffdffefff7ffbffdffefff7ffbffdffefff7ffbffdffefff7ffbffdffefff7ffbffdffefff7ffbffdffdffefff7ffbffdffefff7ffbffdffefff7ffbffdffefff7ffbffdffefff7ffbffdffefff7ffbffdffefff +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = aa54aa54aa54aa54a954a954a954a954a952a952a952a952a552a552a552a552a54aa54aa54aa54a954a954a954a954a952a952a952a952a552a552a552a552a54aa54aa54aa54aa54a954a954a954a952a952a952a952a952a552a552a552a54aa54aa54aa54aa54a954a954a954a952a952a952a952a952a552a552a552a54 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 55ab55ab55ab55ab56ab56ab56ab56ab56ad56ad56ad56ad5aad5aad5aad5aad5ab55ab55ab55ab56ab56ab56ab56ab56ad56ad56ad56ad5aad5aad5aad5aad5ab55ab55ab55ab55ab56ab56ab56ab56ad56ad56ad56ad56ad5aad5aad5aad5ab55ab55ab55ab55ab56ab56ab56ab56ad56ad56ad56ad56ad5aad5aad5aad5ab +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = d5aad5aad5aad5aad56ad56ad56ad56ab56ab56ab56ab56ab55ab55ab55ab55aad5aad5aad5aad5aad56ad56ad56ad56ab56ab56ab56ab56ab55ab55ab55ab55aad5aad5aad5aad56ad56ad56ad56ad56ab56ab56ab56ab55ab55ab55ab55ab55aad5aad5aad5aad56ad56ad56ad56ad56ab56ab56ab56ab55ab55ab55ab55aa +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 2a552a552a552a552a952a952a952a954a954a954a954a954aa54aa54aa54aa552a552a552a552a552a952a952a952a954a954a954a954a954aa54aa54aa54aa552a552a552a552a952a952a952a952a954a954a954a954aa54aa54aa54aa54aa552a552a552a552a952a952a952a952a954a954a954a954aa54aa54aa54aa55 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = aa9552aa552aa554aa954aa9552a9552aa554aa554aa9552a9552aa552aa554aa954aa9552aa552aa554aa554aa9552a9552aa552aa554aa954aa9552aa552aa554aa554aa9552a9552aa554aa554aa954aa9552aa552aa554aa554aa9552a9552aa554aa554aa954aa9552aa552aa554aa954aa9552a9552aa554aa554aa954 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 556aad55aad55aab556ab556aad56aad55aab55aab556aad56aad55aad55aab556ab556aad55aad55aab55aab556aad56aad55aad55aab556ab556aad55aad55aab55aab556aad56aad55aab55aab556ab556aad55aad55aab55aab556aad56aad55aab55aab556ab556aad55aad55aab556ab556aad56aad55aab55aab556ab +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = dad6b5b5ad6b6b5ad6d6b5adad6b5b5ad6b6b5ad6b6b5ad6d6b5adad6b5b5ad6b6b5ad6d6b5ad6d6b5adad6b5b5ad6b6b5ad6d6b5adad6b5adad6b5b5ad6b6b5ad6d6b5adad6b5b5ad6b5b5ad6b6b5ad6d6b5adad6b5b5ad6b6b5ad6b6b5ad6d6b5adad6b5b5ad6b6b5ad6d6b5ad6d6b5adad6b5b5ad6b6b5ad6d6b5adad6b5a +A = fffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 25294a4a529494a529294a525294a4a529494a529494a529294a525294a4a529494a529294a529294a525294a4a529494a529294a525294a525294a4a529494a529294a525294a4a5294a4a529494a529294a525294a4a529494a529494a529294a525294a4a529494a529294a529294a525294a4a529494a529294a525294a5 +A = -fffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +A = -1 +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = 1 +A = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 +M = f0000 + +ModInv = effff +A = -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 +M = f0000 + +ModInv = 1 +A = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 +M = f00000000 + +ModInv = effffffff +A = -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 +M = f00000000 + +ModInv = 1 +A = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 +M = f000000000000 + +ModInv = effffffffffff +A = -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 +M = f000000000000 + +ModInv = 1 +A = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 +M = f0000000000000000 + +ModInv = effffffffffffffff +A = -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 +M = f0000000000000000 + +ModInv = 1 +A = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 +M = f00000000000000000000 + +ModInv = effffffffffffffffffff +A = -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 +M = f00000000000000000000 + +ModInv = 1 +A = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 +M = f000000000000000000000000 + +ModInv = effffffffffffffffffffffff +A = -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 +M = f000000000000000000000000 + +ModInv = 1 +A = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 +M = f0000000000000000000000000000 + +ModInv = effffffffffffffffffffffffffff +A = -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 +M = f0000000000000000000000000000 + +ModInv = 1 +A = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 +M = f00000000000000000000000000000000 + +ModInv = effffffffffffffffffffffffffffffff +A = -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 +M = f00000000000000000000000000000000 + +ModInv = 1 +A = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 +M = f000000000000000000000000000000000000 + +ModInv = effffffffffffffffffffffffffffffffffff +A = -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 +M = f000000000000000000000000000000000000 + +ModInv = 1 +A = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 +M = f0000000000000000000000000000000000000000 + +ModInv = effffffffffffffffffffffffffffffffffffffff +A = -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 +M = f0000000000000000000000000000000000000000 + +ModInv = 1 +A = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 +M = f00000000000000000000000000000000000000000000 + +ModInv = effffffffffffffffffffffffffffffffffffffffffff +A = -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 +M = f00000000000000000000000000000000000000000000 + +ModInv = 1 +A = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 +M = f000000000000000000000000000000000000000000000000 + +ModInv = effffffffffffffffffffffffffffffffffffffffffffffff +A = -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 +M = f000000000000000000000000000000000000000000000000 + +ModInv = 1 +A = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 +M = f0000000000000000000000000000000000000000000000000000 + +ModInv = effffffffffffffffffffffffffffffffffffffffffffffffffff +A = -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 +M = f0000000000000000000000000000000000000000000000000000 + +ModInv = 1 +A = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 +M = f00000000000000000000000000000000000000000000000000000000 + +ModInv = effffffffffffffffffffffffffffffffffffffffffffffffffffffff +A = -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 +M = f00000000000000000000000000000000000000000000000000000000 + +ModInv = 1 +A = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 +M = f000000000000000000000000000000000000000000000000000000000000 + +ModInv = effffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +A = -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 +M = f000000000000000000000000000000000000000000000000000000000000 + +ModInv = 1 +A = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 +M = f0000000000000000000000000000000000000000000000000000000000000000 + +ModInv = effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +A = -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 +M = f0000000000000000000000000000000000000000000000000000000000000000 + +ModInv = 1 +A = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 +M = f00000000000000000000000000000000000000000000000000000000000000000000 + +ModInv = effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +A = -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 +M = f00000000000000000000000000000000000000000000000000000000000000000000 + +ModInv = 1 +A = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 +M = f000000000000000000000000000000000000000000000000000000000000000000000000 + +ModInv = effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +A = -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 +M = f000000000000000000000000000000000000000000000000000000000000000000000000 + +ModInv = 1 +A = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 +M = f0000000000000000000000000000000000000000000000000000000000000000000000000000 + +ModInv = effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +A = -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 +M = f0000000000000000000000000000000000000000000000000000000000000000000000000000 + +ModInv = 1 +A = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 +M = f00000000000000000000000000000000000000000000000000000000000000000000000000000000 + +ModInv = effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +A = -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 +M = f00000000000000000000000000000000000000000000000000000000000000000000000000000000 + +ModInv = 1 +A = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 +M = f000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + +ModInv = effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +A = -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 +M = f000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + +ModInv = 1 +A = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 +M = f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + +ModInv = effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +A = -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 +M = f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + +ModInv = 1 +A = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 +M = f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + +ModInv = effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +A = -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 +M = f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + +ModInv = 1 +A = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 +M = f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + +ModInv = effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +A = -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 +M = f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + +ModInv = 1 +A = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 +M = f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + +ModInv = effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +A = -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 +M = f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + +ModInv = 1 +A = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 +M = f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + +ModInv = effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +A = -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 +M = f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + +ModInv = 1 +A = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 +M = f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + +ModInv = effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +A = -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 +M = f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + +ModInv = 1 +A = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 +M = f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + +ModInv = effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +A = -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 +M = f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + +ModInv = 1 +A = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 +M = f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + +ModInv = effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +A = -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 +M = f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + +ModInv = 1 +A = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 +M = f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + +ModInv = effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +A = -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 +M = f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + +ModInv = 1 +A = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 +M = f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + +ModInv = effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +A = -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 +M = f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + +ModInv = 1 +A = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 +M = f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + +ModInv = effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +A = -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 +M = f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + +ModInv = e000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 +A = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 +M = f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + +ModInv = fffeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +A = -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 +M = f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + +ModInv = e0000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 +A = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 +M = f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + +ModInv = fffffffffffeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +A = -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 +M = f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + +ModInv = e00000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 +A = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 +M = f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + +ModInv = fffffffffffffffffffeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +A = -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 +M = f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + +ModInv = e000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 +A = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 +M = f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + +ModInv = fffffffffffffffffffffffffffeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +A = -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 +M = f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + +ModInv = e0000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 +A = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 +M = f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + +ModInv = fffffffffffffffffffffffffffffffffffeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +A = -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 +M = f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + +ModInv = e00000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 +A = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 +M = f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + +ModInv = fffffffffffffffffffffffffffffffffffffffffffeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +A = -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 +M = f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + +ModInv = e000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 +A = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 +M = f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + +ModInv = fffffffffffffffffffffffffffffffffffffffffffffffffffeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +A = -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 +M = f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + +ModInv = e0000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 +A = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 +M = f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + +ModInv = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +A = -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 +M = f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + +ModInv = e00000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 +A = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 +M = f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + +ModInv = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +A = -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 +M = f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + +ModInv = e000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 +A = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 +M = f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + +ModInv = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +A = -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 +M = f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + +ModInv = e0000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 +A = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 +M = f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + +ModInv = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +A = -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 +M = f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + +ModInv = e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000001 +A = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000000000000000000000000000000000000000000000001 +M = f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + +ModInv = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +A = -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000000000000000000000000000000000000000000000001 +M = f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + +ModInv = e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000001 +A = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000000000000000000000000001 +M = f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + +ModInv = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +A = -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000000000000000000000000001 +M = f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + +ModInv = e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000001 +A = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000000000000001 +M = f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + +ModInv = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +A = -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000000000000001 +M = f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + +ModInv = e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000001 +A = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000000000000000000000000000000000001 +M = f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + +ModInv = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +A = -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000000000000000000000000000000000001 +M = f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + +ModInv = e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000001 +A = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000000000000001 +M = f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + +ModInv = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +A = -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000000000000001 +M = f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + +ModInv = effff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001 +A = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000001 +M = f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + +ModInv = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +A = -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000001 +M = f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + +ModInv = effffffffffffffffffff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000001 +A = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000000000000000000000001 +M = f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + +ModInv = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +A = -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000000000000000000000001 +M = f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + +ModInv = effffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000001 +A = ffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000001 +M = f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + +ModInv = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffffffffffffffffffffffffffffffffffffffffffffffffffff +A = -ffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000001 +M = f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + +ModInv = effffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000001 +A = ffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000001 +M = f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + +ModInv = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffffffffffffffffffffffffffffffffffffffffffffffff +A = -ffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000001 +M = f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + +ModInv = fffffffffffffffffffeffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000001 +A = ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000000000001 +M = f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + +ModInv = e00000000000000000001000000000000000000000000000000000000000000000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffffffffffffffffffffffffffffffffffffffffffff +A = -ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000000000001 +M = f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + +ModInv = fffffffffffffffffffffffffffffffffffffffeffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000001 +A = ffffffffffffffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000001 +M = f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + +ModInv = e000000000000000000000000000000000000000100000000000000000000000000000000000000000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffffffffffffffffffffffffffffffffffffffff +A = -ffffffffffffffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000001 +M = f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + +ModInv = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000001 +A = ffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000001 +M = f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + +ModInv = e0000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffffffffffffffffffffffffffffffffffff +A = -ffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000001 +M = f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + +ModInv = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000001 +A = ffffffffffffffffffffffffffffffffffff000000000000000000000000000000000001 +M = f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + +ModInv = effffffff000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffffffffffffffffffffffffffffffff +A = -ffffffffffffffffffffffffffffffffffff000000000000000000000000000000000001 +M = f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + +ModInv = e000100000000000000000000000000000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffffffffffffffffffffffffffff000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000001 +A = ffffffffffffffffffffffffffffffff00000000000000000000000000000001 +M = f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + +ModInv = fffeffffffffffffffffffffffffffffffff000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffffffffffffffffffffffffffff +A = -ffffffffffffffffffffffffffffffff00000000000000000000000000000001 +M = f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + +ModInv = e0000000000000000000000000000000000010000000000000000000000000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffffffffffffffffffffffff000000000000000000000000000000000000000000000000000000010000000000000000000000000001 +A = ffffffffffffffffffffffffffff0000000000000000000000000001 +M = f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + +ModInv = fffffffffffffffffffffffffffffffffffeffffffffffffffffffffffffffff000000000000000000000000000000000000000000000000000000010000000000000000000000000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffffffffffffffffffffffff +A = -ffffffffffffffffffffffffffff0000000000000000000000000001 +M = f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + +ModInv = effffffffffffffffffff000000000000000000000000000000000000000000000001000000000000000000000000fffffffffffffffffffffffffffffffffffffffffffffffeffffffffffffffffffffffff000000000000000000000000000000000000000000000001000000000000000000000001 +A = ffffffffffffffffffffffff000000000000000000000001 +M = f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + +ModInv = fffffffffffffffffffffffffffffffffffffffffffffffeffffffffffffffffffffffff000000000000000000000000000000000000000000000001000000000000000000000000fffffffffffffffffffffffffffffffffffffffffffffffeffffffffffffffffffffffff +A = -ffffffffffffffffffffffff000000000000000000000001 +M = f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + +ModInv = fffffffffffffffffffffffffffffffffffffffeffffffffffffffffffff000000000000000000000000000000000000000100000000000000000000fffffffffffffffffffffffffffffffffffffffeffffffffffffffffffff000000000000000000000000000000000000000100000000000000000001 +A = ffffffffffffffffffff00000000000000000001 +M = f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + +ModInv = e000000000000000000000000000000000000000100000000000000000000fffffffffffffffffffffffffffffffffffffffeffffffffffffffffffff000000000000000000000000000000000000000100000000000000000000fffffffffffffffffffffffffffffffffffffffeffffffffffffffffffff +A = -ffffffffffffffffffff00000000000000000001 +M = f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + +ModInv = effff000000000000000000000000000000010000000000000000fffffffffffffffffffffffffffffffeffffffffffffffff000000000000000000000000000000010000000000000000fffffffffffffffffffffffffffffffeffffffffffffffff000000000000000000000000000000010000000000000001 +A = ffffffffffffffff0000000000000001 +M = f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + +ModInv = fffffffffffffffffffffffffffffffeffffffffffffffff000000000000000000000000000000010000000000000000fffffffffffffffffffffffffffffffeffffffffffffffff000000000000000000000000000000010000000000000000fffffffffffffffffffffffffffffffeffffffffffffffff +A = -ffffffffffffffff0000000000000001 +M = f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + +ModInv = e00000000000000000001000000000000fffffffffffffffffffffffeffffffffffff000000000000000000000001000000000000fffffffffffffffffffffffeffffffffffff000000000000000000000001000000000000fffffffffffffffffffffffeffffffffffff000000000000000000000001000000000001 +A = ffffffffffff000000000001 +M = f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + +ModInv = fffffffffffffffffffeffffffffffff000000000000000000000001000000000000fffffffffffffffffffffffeffffffffffff000000000000000000000001000000000000fffffffffffffffffffffffeffffffffffff000000000000000000000001000000000000fffffffffffffffffffffffeffffffffffff +A = -ffffffffffff000000000001 +M = f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + +ModInv = e000100000000fffffffffffffffeffffffff000000000000000100000000fffffffffffffffeffffffff000000000000000100000000fffffffffffffffeffffffff000000000000000100000000fffffffffffffffeffffffff000000000000000100000000fffffffffffffffeffffffff000000000000000100000001 +A = ffffffff00000001 +M = f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + +ModInv = fffeffffffff000000000000000100000000fffffffffffffffeffffffff000000000000000100000000fffffffffffffffeffffffff000000000000000100000000fffffffffffffffeffffffff000000000000000100000000fffffffffffffffeffffffff000000000000000100000000fffffffffffffffeffffffff +A = -ffffffff00000001 +M = f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + +ModInv = effff000000010000fffffffeffff000000010000fffffffeffff000000010000fffffffeffff000000010000fffffffeffff000000010000fffffffeffff000000010000fffffffeffff000000010000fffffffeffff000000010000fffffffeffff000000010000fffffffeffff000000010000fffffffeffff000000010001 +A = ffff0001 +M = f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + +ModInv = fffffffeffff000000010000fffffffeffff000000010000fffffffeffff000000010000fffffffeffff000000010000fffffffeffff000000010000fffffffeffff000000010000fffffffeffff000000010000fffffffeffff000000010000fffffffeffff000000010000fffffffeffff000000010000fffffffeffff +A = -ffff0001 +M = f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + +Title = ModInv negative tests (auto) + +ModInv = -1 +A = -64 +M = 1 + +ModInv = -1 +A = -63 +M = 1 + +ModInv = -1 +A = -62 +M = 1 + +ModInv = -1 +A = -61 +M = 1 + +ModInv = -1 +A = -60 +M = 1 + +ModInv = -1 +A = -5f +M = 1 + +ModInv = -1 +A = -5e +M = 1 + +ModInv = -1 +A = -5d +M = 1 + +ModInv = -1 +A = -5c +M = 1 + +ModInv = -1 +A = -5b +M = 1 + +ModInv = -1 +A = -5a +M = 1 + +ModInv = -1 +A = -59 +M = 1 + +ModInv = -1 +A = -58 +M = 1 + +ModInv = -1 +A = -57 +M = 1 + +ModInv = -1 +A = -56 +M = 1 + +ModInv = -1 +A = -55 +M = 1 + +ModInv = -1 +A = -54 +M = 1 + +ModInv = -1 +A = -53 +M = 1 + +ModInv = -1 +A = -52 +M = 1 + +ModInv = -1 +A = -51 +M = 1 + +ModInv = -1 +A = -50 +M = 1 + +ModInv = -1 +A = -4f +M = 1 + +ModInv = -1 +A = -4e +M = 1 + +ModInv = -1 +A = -4d +M = 1 + +ModInv = -1 +A = -4c +M = 1 + +ModInv = -1 +A = -4b +M = 1 + +ModInv = -1 +A = -4a +M = 1 + +ModInv = -1 +A = -49 +M = 1 + +ModInv = -1 +A = -48 +M = 1 + +ModInv = -1 +A = -47 +M = 1 + +ModInv = -1 +A = -46 +M = 1 + +ModInv = -1 +A = -45 +M = 1 + +ModInv = -1 +A = -44 +M = 1 + +ModInv = -1 +A = -43 +M = 1 + +ModInv = -1 +A = -42 +M = 1 + +ModInv = -1 +A = -41 +M = 1 + +ModInv = -1 +A = -40 +M = 1 + +ModInv = -1 +A = -3f +M = 1 + +ModInv = -1 +A = -3e +M = 1 + +ModInv = -1 +A = -3d +M = 1 + +ModInv = -1 +A = -3c +M = 1 + +ModInv = -1 +A = -3b +M = 1 + +ModInv = -1 +A = -3a +M = 1 + +ModInv = -1 +A = -39 +M = 1 + +ModInv = -1 +A = -38 +M = 1 + +ModInv = -1 +A = -37 +M = 1 + +ModInv = -1 +A = -36 +M = 1 + +ModInv = -1 +A = -35 +M = 1 + +ModInv = -1 +A = -34 +M = 1 + +ModInv = -1 +A = -33 +M = 1 + +ModInv = -1 +A = -32 +M = 1 + +ModInv = -1 +A = -31 +M = 1 + +ModInv = -1 +A = -30 +M = 1 + +ModInv = -1 +A = -2f +M = 1 + +ModInv = -1 +A = -2e +M = 1 + +ModInv = -1 +A = -2d +M = 1 + +ModInv = -1 +A = -2c +M = 1 + +ModInv = -1 +A = -2b +M = 1 + +ModInv = -1 +A = -2a +M = 1 + +ModInv = -1 +A = -29 +M = 1 + +ModInv = -1 +A = -28 +M = 1 + +ModInv = -1 +A = -27 +M = 1 + +ModInv = -1 +A = -26 +M = 1 + +ModInv = -1 +A = -25 +M = 1 + +ModInv = -1 +A = -24 +M = 1 + +ModInv = -1 +A = -23 +M = 1 + +ModInv = -1 +A = -22 +M = 1 + +ModInv = -1 +A = -21 +M = 1 + +ModInv = -1 +A = -20 +M = 1 + +ModInv = -1 +A = -1f +M = 1 + +ModInv = -1 +A = -1e +M = 1 + +ModInv = -1 +A = -1d +M = 1 + +ModInv = -1 +A = -1c +M = 1 + +ModInv = -1 +A = -1b +M = 1 + +ModInv = -1 +A = -1a +M = 1 + +ModInv = -1 +A = -19 +M = 1 + +ModInv = -1 +A = -18 +M = 1 + +ModInv = -1 +A = -17 +M = 1 + +ModInv = -1 +A = -16 +M = 1 + +ModInv = -1 +A = -15 +M = 1 + +ModInv = -1 +A = -14 +M = 1 + +ModInv = -1 +A = -13 +M = 1 + +ModInv = -1 +A = -12 +M = 1 + +ModInv = -1 +A = -11 +M = 1 + +ModInv = -1 +A = -10 +M = 1 + +ModInv = -1 +A = -f +M = 1 + +ModInv = -1 +A = -e +M = 1 + +ModInv = -1 +A = -d +M = 1 + +ModInv = -1 +A = -c +M = 1 + +ModInv = -1 +A = -b +M = 1 + +ModInv = -1 +A = -a +M = 1 + +ModInv = -1 +A = -9 +M = 1 + +ModInv = -1 +A = -8 +M = 1 + +ModInv = -1 +A = -7 +M = 1 + +ModInv = -1 +A = -6 +M = 1 + +ModInv = -1 +A = -5 +M = 1 + +ModInv = -1 +A = -4 +M = 1 + +ModInv = -1 +A = -3 +M = 1 + +ModInv = -1 +A = -2 +M = 1 + +ModInv = -1 +A = -1 +M = 1 + +ModInv = -1 +A = 0 +M = 1 + +ModInv = -1 +A = 1 +M = 1 + +ModInv = -1 +A = 2 +M = 1 + +ModInv = -1 +A = 3 +M = 1 + +ModInv = -1 +A = 4 +M = 1 + +ModInv = -1 +A = 5 +M = 1 + +ModInv = -1 +A = 6 +M = 1 + +ModInv = -1 +A = 7 +M = 1 + +ModInv = -1 +A = 8 +M = 1 + +ModInv = -1 +A = 9 +M = 1 + +ModInv = -1 +A = a +M = 1 + +ModInv = -1 +A = b +M = 1 + +ModInv = -1 +A = c +M = 1 + +ModInv = -1 +A = d +M = 1 + +ModInv = -1 +A = e +M = 1 + +ModInv = -1 +A = f +M = 1 + +ModInv = -1 +A = 10 +M = 1 + +ModInv = -1 +A = 11 +M = 1 + +ModInv = -1 +A = 12 +M = 1 + +ModInv = -1 +A = 13 +M = 1 + +ModInv = -1 +A = 14 +M = 1 + +ModInv = -1 +A = 15 +M = 1 + +ModInv = -1 +A = 16 +M = 1 + +ModInv = -1 +A = 17 +M = 1 + +ModInv = -1 +A = 18 +M = 1 + +ModInv = -1 +A = 19 +M = 1 + +ModInv = -1 +A = 1a +M = 1 + +ModInv = -1 +A = 1b +M = 1 + +ModInv = -1 +A = 1c +M = 1 + +ModInv = -1 +A = 1d +M = 1 + +ModInv = -1 +A = 1e +M = 1 + +ModInv = -1 +A = 1f +M = 1 + +ModInv = -1 +A = 20 +M = 1 + +ModInv = -1 +A = 21 +M = 1 + +ModInv = -1 +A = 22 +M = 1 + +ModInv = -1 +A = 23 +M = 1 + +ModInv = -1 +A = 24 +M = 1 + +ModInv = -1 +A = 25 +M = 1 + +ModInv = -1 +A = 26 +M = 1 + +ModInv = -1 +A = 27 +M = 1 + +ModInv = -1 +A = 28 +M = 1 + +ModInv = -1 +A = 29 +M = 1 + +ModInv = -1 +A = 2a +M = 1 + +ModInv = -1 +A = 2b +M = 1 + +ModInv = -1 +A = 2c +M = 1 + +ModInv = -1 +A = 2d +M = 1 + +ModInv = -1 +A = 2e +M = 1 + +ModInv = -1 +A = 2f +M = 1 + +ModInv = -1 +A = 30 +M = 1 + +ModInv = -1 +A = 31 +M = 1 + +ModInv = -1 +A = 32 +M = 1 + +ModInv = -1 +A = 33 +M = 1 + +ModInv = -1 +A = 34 +M = 1 + +ModInv = -1 +A = 35 +M = 1 + +ModInv = -1 +A = 36 +M = 1 + +ModInv = -1 +A = 37 +M = 1 + +ModInv = -1 +A = 38 +M = 1 + +ModInv = -1 +A = 39 +M = 1 + +ModInv = -1 +A = 3a +M = 1 + +ModInv = -1 +A = 3b +M = 1 + +ModInv = -1 +A = 3c +M = 1 + +ModInv = -1 +A = 3d +M = 1 + +ModInv = -1 +A = 3e +M = 1 + +ModInv = -1 +A = 3f +M = 1 + +ModInv = -1 +A = 40 +M = 1 + +ModInv = -1 +A = 41 +M = 1 + +ModInv = -1 +A = 42 +M = 1 + +ModInv = -1 +A = 43 +M = 1 + +ModInv = -1 +A = 44 +M = 1 + +ModInv = -1 +A = 45 +M = 1 + +ModInv = -1 +A = 46 +M = 1 + +ModInv = -1 +A = 47 +M = 1 + +ModInv = -1 +A = 48 +M = 1 + +ModInv = -1 +A = 49 +M = 1 + +ModInv = -1 +A = 4a +M = 1 + +ModInv = -1 +A = 4b +M = 1 + +ModInv = -1 +A = 4c +M = 1 + +ModInv = -1 +A = 4d +M = 1 + +ModInv = -1 +A = 4e +M = 1 + +ModInv = -1 +A = 4f +M = 1 + +ModInv = -1 +A = 50 +M = 1 + +ModInv = -1 +A = 51 +M = 1 + +ModInv = -1 +A = 52 +M = 1 + +ModInv = -1 +A = 53 +M = 1 + +ModInv = -1 +A = 54 +M = 1 + +ModInv = -1 +A = 55 +M = 1 + +ModInv = -1 +A = 56 +M = 1 + +ModInv = -1 +A = 57 +M = 1 + +ModInv = -1 +A = 58 +M = 1 + +ModInv = -1 +A = 59 +M = 1 + +ModInv = -1 +A = 5a +M = 1 + +ModInv = -1 +A = 5b +M = 1 + +ModInv = -1 +A = 5c +M = 1 + +ModInv = -1 +A = 5d +M = 1 + +ModInv = -1 +A = 5e +M = 1 + +ModInv = -1 +A = 5f +M = 1 + +ModInv = -1 +A = 60 +M = 1 + +ModInv = -1 +A = 61 +M = 1 + +ModInv = -1 +A = 62 +M = 1 + +ModInv = -1 +A = 63 +M = 1 + +ModInv = -1 +A = -63 +M = 3 + +ModInv = -1 +A = -60 +M = 3 + +ModInv = -1 +A = -5d +M = 3 + +ModInv = -1 +A = -5a +M = 3 + +ModInv = -1 +A = -57 +M = 3 + +ModInv = -1 +A = -54 +M = 3 + +ModInv = -1 +A = -51 +M = 3 + +ModInv = -1 +A = -4e +M = 3 + +ModInv = -1 +A = -4b +M = 3 + +ModInv = -1 +A = -48 +M = 3 + +ModInv = -1 +A = -45 +M = 3 + +ModInv = -1 +A = -42 +M = 3 + +ModInv = -1 +A = -3f +M = 3 + +ModInv = -1 +A = -3c +M = 3 + +ModInv = -1 +A = -39 +M = 3 + +ModInv = -1 +A = -36 +M = 3 + +ModInv = -1 +A = -33 +M = 3 + +ModInv = -1 +A = -30 +M = 3 + +ModInv = -1 +A = -2d +M = 3 + +ModInv = -1 +A = -2a +M = 3 + +ModInv = -1 +A = -27 +M = 3 + +ModInv = -1 +A = -24 +M = 3 + +ModInv = -1 +A = -21 +M = 3 + +ModInv = -1 +A = -1e +M = 3 + +ModInv = -1 +A = -1b +M = 3 + +ModInv = -1 +A = -18 +M = 3 + +ModInv = -1 +A = -15 +M = 3 + +ModInv = -1 +A = -12 +M = 3 + +ModInv = -1 +A = -f +M = 3 + +ModInv = -1 +A = -c +M = 3 + +ModInv = -1 +A = -9 +M = 3 + +ModInv = -1 +A = -6 +M = 3 + +ModInv = -1 +A = -3 +M = 3 + +ModInv = -1 +A = 0 +M = 3 + +ModInv = -1 +A = 3 +M = 3 + +ModInv = -1 +A = 6 +M = 3 + +ModInv = -1 +A = 9 +M = 3 + +ModInv = -1 +A = c +M = 3 + +ModInv = -1 +A = f +M = 3 + +ModInv = -1 +A = 12 +M = 3 + +ModInv = -1 +A = 15 +M = 3 + +ModInv = -1 +A = 18 +M = 3 + +ModInv = -1 +A = 1b +M = 3 + +ModInv = -1 +A = 1e +M = 3 + +ModInv = -1 +A = 21 +M = 3 + +ModInv = -1 +A = 24 +M = 3 + +ModInv = -1 +A = 27 +M = 3 + +ModInv = -1 +A = 2a +M = 3 + +ModInv = -1 +A = 2d +M = 3 + +ModInv = -1 +A = 30 +M = 3 + +ModInv = -1 +A = 33 +M = 3 + +ModInv = -1 +A = 36 +M = 3 + +ModInv = -1 +A = 39 +M = 3 + +ModInv = -1 +A = 3c +M = 3 + +ModInv = -1 +A = 3f +M = 3 + +ModInv = -1 +A = 42 +M = 3 + +ModInv = -1 +A = 45 +M = 3 + +ModInv = -1 +A = 48 +M = 3 + +ModInv = -1 +A = 4b +M = 3 + +ModInv = -1 +A = 4e +M = 3 + +ModInv = -1 +A = 51 +M = 3 + +ModInv = -1 +A = 54 +M = 3 + +ModInv = -1 +A = 57 +M = 3 + +ModInv = -1 +A = 5a +M = 3 + +ModInv = -1 +A = 5d +M = 3 + +ModInv = -1 +A = 60 +M = 3 + +ModInv = -1 +A = 63 +M = 3 + +ModInv = -1 +A = -64 +M = 5 + +ModInv = -1 +A = -5f +M = 5 + +ModInv = -1 +A = -5a +M = 5 + +ModInv = -1 +A = -55 +M = 5 + +ModInv = -1 +A = -50 +M = 5 + +ModInv = -1 +A = -4b +M = 5 + +ModInv = -1 +A = -46 +M = 5 + +ModInv = -1 +A = -41 +M = 5 + +ModInv = -1 +A = -3c +M = 5 + +ModInv = -1 +A = -37 +M = 5 + +ModInv = -1 +A = -32 +M = 5 + +ModInv = -1 +A = -2d +M = 5 + +ModInv = -1 +A = -28 +M = 5 + +ModInv = -1 +A = -23 +M = 5 + +ModInv = -1 +A = -1e +M = 5 + +ModInv = -1 +A = -19 +M = 5 + +ModInv = -1 +A = -14 +M = 5 + +ModInv = -1 +A = -f +M = 5 + +ModInv = -1 +A = -a +M = 5 + +ModInv = -1 +A = -5 +M = 5 + +ModInv = -1 +A = 0 +M = 5 + +ModInv = -1 +A = 5 +M = 5 + +ModInv = -1 +A = a +M = 5 + +ModInv = -1 +A = f +M = 5 + +ModInv = -1 +A = 14 +M = 5 + +ModInv = -1 +A = 19 +M = 5 + +ModInv = -1 +A = 1e +M = 5 + +ModInv = -1 +A = 23 +M = 5 + +ModInv = -1 +A = 28 +M = 5 + +ModInv = -1 +A = 2d +M = 5 + +ModInv = -1 +A = 32 +M = 5 + +ModInv = -1 +A = 37 +M = 5 + +ModInv = -1 +A = 3c +M = 5 + +ModInv = -1 +A = 41 +M = 5 + +ModInv = -1 +A = 46 +M = 5 + +ModInv = -1 +A = 4b +M = 5 + +ModInv = -1 +A = 50 +M = 5 + +ModInv = -1 +A = 55 +M = 5 + +ModInv = -1 +A = 5a +M = 5 + +ModInv = -1 +A = 5f +M = 5 + +ModInv = -1 +A = -63 +M = 6 + +ModInv = -1 +A = -5d +M = 6 + +ModInv = -1 +A = -57 +M = 6 + +ModInv = -1 +A = -51 +M = 6 + +ModInv = -1 +A = -4b +M = 6 + +ModInv = -1 +A = -45 +M = 6 + +ModInv = -1 +A = -3f +M = 6 + +ModInv = -1 +A = -39 +M = 6 + +ModInv = -1 +A = -33 +M = 6 + +ModInv = -1 +A = -2d +M = 6 + +ModInv = -1 +A = -27 +M = 6 + +ModInv = -1 +A = -21 +M = 6 + +ModInv = -1 +A = -1b +M = 6 + +ModInv = -1 +A = -15 +M = 6 + +ModInv = -1 +A = -f +M = 6 + +ModInv = -1 +A = -9 +M = 6 + +ModInv = -1 +A = -3 +M = 6 + +ModInv = -1 +A = 3 +M = 6 + +ModInv = -1 +A = 9 +M = 6 + +ModInv = -1 +A = f +M = 6 + +ModInv = -1 +A = 15 +M = 6 + +ModInv = -1 +A = 1b +M = 6 + +ModInv = -1 +A = 21 +M = 6 + +ModInv = -1 +A = 27 +M = 6 + +ModInv = -1 +A = 2d +M = 6 + +ModInv = -1 +A = 33 +M = 6 + +ModInv = -1 +A = 39 +M = 6 + +ModInv = -1 +A = 3f +M = 6 + +ModInv = -1 +A = 45 +M = 6 + +ModInv = -1 +A = 4b +M = 6 + +ModInv = -1 +A = 51 +M = 6 + +ModInv = -1 +A = 57 +M = 6 + +ModInv = -1 +A = 5d +M = 6 + +ModInv = -1 +A = 63 +M = 6 + +ModInv = -1 +A = -62 +M = 7 + +ModInv = -1 +A = -5b +M = 7 + +ModInv = -1 +A = -54 +M = 7 + +ModInv = -1 +A = -4d +M = 7 + +ModInv = -1 +A = -46 +M = 7 + +ModInv = -1 +A = -3f +M = 7 + +ModInv = -1 +A = -38 +M = 7 + +ModInv = -1 +A = -31 +M = 7 + +ModInv = -1 +A = -2a +M = 7 + +ModInv = -1 +A = -23 +M = 7 + +ModInv = -1 +A = -1c +M = 7 + +ModInv = -1 +A = -15 +M = 7 + +ModInv = -1 +A = -e +M = 7 + +ModInv = -1 +A = -7 +M = 7 + +ModInv = -1 +A = 0 +M = 7 + +ModInv = -1 +A = 7 +M = 7 + +ModInv = -1 +A = e +M = 7 + +ModInv = -1 +A = 15 +M = 7 + +ModInv = -1 +A = 1c +M = 7 + +ModInv = -1 +A = 23 +M = 7 + +ModInv = -1 +A = 2a +M = 7 + +ModInv = -1 +A = 31 +M = 7 + +ModInv = -1 +A = 38 +M = 7 + +ModInv = -1 +A = 3f +M = 7 + +ModInv = -1 +A = 46 +M = 7 + +ModInv = -1 +A = 4d +M = 7 + +ModInv = -1 +A = 54 +M = 7 + +ModInv = -1 +A = 5b +M = 7 + +ModInv = -1 +A = 62 +M = 7 + +ModInv = -1 +A = -63 +M = 9 + +ModInv = -1 +A = -60 +M = 9 + +ModInv = -1 +A = -5d +M = 9 + +ModInv = -1 +A = -5a +M = 9 + +ModInv = -1 +A = -57 +M = 9 + +ModInv = -1 +A = -54 +M = 9 + +ModInv = -1 +A = -51 +M = 9 + +ModInv = -1 +A = -4e +M = 9 + +ModInv = -1 +A = -4b +M = 9 + +ModInv = -1 +A = -48 +M = 9 + +ModInv = -1 +A = -45 +M = 9 + +ModInv = -1 +A = -42 +M = 9 + +ModInv = -1 +A = -3f +M = 9 + +ModInv = -1 +A = -3c +M = 9 + +ModInv = -1 +A = -39 +M = 9 + +ModInv = -1 +A = -36 +M = 9 + +ModInv = -1 +A = -33 +M = 9 + +ModInv = -1 +A = -30 +M = 9 + +ModInv = -1 +A = -2d +M = 9 + +ModInv = -1 +A = -2a +M = 9 + +ModInv = -1 +A = -27 +M = 9 + +ModInv = -1 +A = -24 +M = 9 + +ModInv = -1 +A = -21 +M = 9 + +ModInv = -1 +A = -1e +M = 9 + +ModInv = -1 +A = -1b +M = 9 + +ModInv = -1 +A = -18 +M = 9 + +ModInv = -1 +A = -15 +M = 9 + +ModInv = -1 +A = -12 +M = 9 + +ModInv = -1 +A = -f +M = 9 + +ModInv = -1 +A = -c +M = 9 + +ModInv = -1 +A = -9 +M = 9 + +ModInv = -1 +A = -6 +M = 9 + +ModInv = -1 +A = -3 +M = 9 + +ModInv = -1 +A = 0 +M = 9 + +ModInv = -1 +A = 3 +M = 9 + +ModInv = -1 +A = 6 +M = 9 + +ModInv = -1 +A = 9 +M = 9 + +ModInv = -1 +A = c +M = 9 + +ModInv = -1 +A = f +M = 9 + +ModInv = -1 +A = 12 +M = 9 + +ModInv = -1 +A = 15 +M = 9 + +ModInv = -1 +A = 18 +M = 9 + +ModInv = -1 +A = 1b +M = 9 + +ModInv = -1 +A = 1e +M = 9 + +ModInv = -1 +A = 21 +M = 9 + +ModInv = -1 +A = 24 +M = 9 + +ModInv = -1 +A = 27 +M = 9 + +ModInv = -1 +A = 2a +M = 9 + +ModInv = -1 +A = 2d +M = 9 + +ModInv = -1 +A = 30 +M = 9 + +ModInv = -1 +A = 33 +M = 9 + +ModInv = -1 +A = 36 +M = 9 + +ModInv = -1 +A = 39 +M = 9 + +ModInv = -1 +A = 3c +M = 9 + +ModInv = -1 +A = 3f +M = 9 + +ModInv = -1 +A = 42 +M = 9 + +ModInv = -1 +A = 45 +M = 9 + +ModInv = -1 +A = 48 +M = 9 + +ModInv = -1 +A = 4b +M = 9 + +ModInv = -1 +A = 4e +M = 9 + +ModInv = -1 +A = 51 +M = 9 + +ModInv = -1 +A = 54 +M = 9 + +ModInv = -1 +A = 57 +M = 9 + +ModInv = -1 +A = 5a +M = 9 + +ModInv = -1 +A = 5d +M = 9 + +ModInv = -1 +A = 60 +M = 9 + +ModInv = -1 +A = 63 +M = 9 + +ModInv = -1 +A = -5f +M = a + +ModInv = -1 +A = -55 +M = a + +ModInv = -1 +A = -4b +M = a + +ModInv = -1 +A = -41 +M = a + +ModInv = -1 +A = -37 +M = a + +ModInv = -1 +A = -2d +M = a + +ModInv = -1 +A = -23 +M = a + +ModInv = -1 +A = -19 +M = a + +ModInv = -1 +A = -f +M = a + +ModInv = -1 +A = -5 +M = a + +ModInv = -1 +A = 5 +M = a + +ModInv = -1 +A = f +M = a + +ModInv = -1 +A = 19 +M = a + +ModInv = -1 +A = 23 +M = a + +ModInv = -1 +A = 2d +M = a + +ModInv = -1 +A = 37 +M = a + +ModInv = -1 +A = 41 +M = a + +ModInv = -1 +A = 4b +M = a + +ModInv = -1 +A = 55 +M = a + +ModInv = -1 +A = 5f +M = a + +ModInv = -1 +A = -63 +M = b + +ModInv = -1 +A = -58 +M = b + +ModInv = -1 +A = -4d +M = b + +ModInv = -1 +A = -42 +M = b + +ModInv = -1 +A = -37 +M = b + +ModInv = -1 +A = -2c +M = b + +ModInv = -1 +A = -21 +M = b + +ModInv = -1 +A = -16 +M = b + +ModInv = -1 +A = -b +M = b + +ModInv = -1 +A = 0 +M = b + +ModInv = -1 +A = b +M = b + +ModInv = -1 +A = 16 +M = b + +ModInv = -1 +A = 21 +M = b + +ModInv = -1 +A = 2c +M = b + +ModInv = -1 +A = 37 +M = b + +ModInv = -1 +A = 42 +M = b + +ModInv = -1 +A = 4d +M = b + +ModInv = -1 +A = 58 +M = b + +ModInv = -1 +A = 63 +M = b + +ModInv = -1 +A = -63 +M = c + +ModInv = -1 +A = -5d +M = c + +ModInv = -1 +A = -57 +M = c + +ModInv = -1 +A = -51 +M = c + +ModInv = -1 +A = -4b +M = c + +ModInv = -1 +A = -45 +M = c + +ModInv = -1 +A = -3f +M = c + +ModInv = -1 +A = -39 +M = c + +ModInv = -1 +A = -33 +M = c + +ModInv = -1 +A = -2d +M = c + +ModInv = -1 +A = -27 +M = c + +ModInv = -1 +A = -21 +M = c + +ModInv = -1 +A = -1b +M = c + +ModInv = -1 +A = -15 +M = c + +ModInv = -1 +A = -f +M = c + +ModInv = -1 +A = -9 +M = c + +ModInv = -1 +A = -3 +M = c + +ModInv = -1 +A = 3 +M = c + +ModInv = -1 +A = 9 +M = c + +ModInv = -1 +A = f +M = c + +ModInv = -1 +A = 15 +M = c + +ModInv = -1 +A = 1b +M = c + +ModInv = -1 +A = 21 +M = c + +ModInv = -1 +A = 27 +M = c + +ModInv = -1 +A = 2d +M = c + +ModInv = -1 +A = 33 +M = c + +ModInv = -1 +A = 39 +M = c + +ModInv = -1 +A = 3f +M = c + +ModInv = -1 +A = 45 +M = c + +ModInv = -1 +A = 4b +M = c + +ModInv = -1 +A = 51 +M = c + +ModInv = -1 +A = 57 +M = c + +ModInv = -1 +A = 5d +M = c + +ModInv = -1 +A = 63 +M = c + +ModInv = -1 +A = -5b +M = d + +ModInv = -1 +A = -4e +M = d + +ModInv = -1 +A = -41 +M = d + +ModInv = -1 +A = -34 +M = d + +ModInv = -1 +A = -27 +M = d + +ModInv = -1 +A = -1a +M = d + +ModInv = -1 +A = -d +M = d + +ModInv = -1 +A = 0 +M = d + +ModInv = -1 +A = d +M = d + +ModInv = -1 +A = 1a +M = d + +ModInv = -1 +A = 27 +M = d + +ModInv = -1 +A = 34 +M = d + +ModInv = -1 +A = 41 +M = d + +ModInv = -1 +A = 4e +M = d + +ModInv = -1 +A = 5b +M = d + +ModInv = -1 +A = -5b +M = e + +ModInv = -1 +A = -4d +M = e + +ModInv = -1 +A = -3f +M = e + +ModInv = -1 +A = -31 +M = e + +ModInv = -1 +A = -23 +M = e + +ModInv = -1 +A = -15 +M = e + +ModInv = -1 +A = -7 +M = e + +ModInv = -1 +A = 7 +M = e + +ModInv = -1 +A = 15 +M = e + +ModInv = -1 +A = 23 +M = e + +ModInv = -1 +A = 31 +M = e + +ModInv = -1 +A = 3f +M = e + +ModInv = -1 +A = 4d +M = e + +ModInv = -1 +A = 5b +M = e + +ModInv = -1 +A = -64 +M = f + +ModInv = -1 +A = -63 +M = f + +ModInv = -1 +A = -60 +M = f + +ModInv = -1 +A = -5f +M = f + +ModInv = -1 +A = -5d +M = f + +ModInv = -1 +A = -5a +M = f + +ModInv = -1 +A = -57 +M = f + +ModInv = -1 +A = -55 +M = f + +ModInv = -1 +A = -54 +M = f + +ModInv = -1 +A = -51 +M = f + +ModInv = -1 +A = -50 +M = f + +ModInv = -1 +A = -4e +M = f + +ModInv = -1 +A = -4b +M = f + +ModInv = -1 +A = -48 +M = f + +ModInv = -1 +A = -46 +M = f + +ModInv = -1 +A = -45 +M = f + +ModInv = -1 +A = -42 +M = f + +ModInv = -1 +A = -41 +M = f + +ModInv = -1 +A = -3f +M = f + +ModInv = -1 +A = -3c +M = f + +ModInv = -1 +A = -39 +M = f + +ModInv = -1 +A = -37 +M = f + +ModInv = -1 +A = -36 +M = f + +ModInv = -1 +A = -33 +M = f + +ModInv = -1 +A = -32 +M = f + +ModInv = -1 +A = -30 +M = f + +ModInv = -1 +A = -2d +M = f + +ModInv = -1 +A = -2a +M = f + +ModInv = -1 +A = -28 +M = f + +ModInv = -1 +A = -27 +M = f + +ModInv = -1 +A = -24 +M = f + +ModInv = -1 +A = -23 +M = f + +ModInv = -1 +A = -21 +M = f + +ModInv = -1 +A = -1e +M = f + +ModInv = -1 +A = -1b +M = f + +ModInv = -1 +A = -19 +M = f + +ModInv = -1 +A = -18 +M = f + +ModInv = -1 +A = -15 +M = f + +ModInv = -1 +A = -14 +M = f + +ModInv = -1 +A = -12 +M = f + +ModInv = -1 +A = -f +M = f + +ModInv = -1 +A = -c +M = f + +ModInv = -1 +A = -a +M = f + +ModInv = -1 +A = -9 +M = f + +ModInv = -1 +A = -6 +M = f + +ModInv = -1 +A = -5 +M = f + +ModInv = -1 +A = -3 +M = f + +ModInv = -1 +A = 0 +M = f + +ModInv = -1 +A = 3 +M = f + +ModInv = -1 +A = 5 +M = f + +ModInv = -1 +A = 6 +M = f + +ModInv = -1 +A = 9 +M = f + +ModInv = -1 +A = a +M = f + +ModInv = -1 +A = c +M = f + +ModInv = -1 +A = f +M = f + +ModInv = -1 +A = 12 +M = f + +ModInv = -1 +A = 14 +M = f + +ModInv = -1 +A = 15 +M = f + +ModInv = -1 +A = 18 +M = f + +ModInv = -1 +A = 19 +M = f + +ModInv = -1 +A = 1b +M = f + +ModInv = -1 +A = 1e +M = f + +ModInv = -1 +A = 21 +M = f + +ModInv = -1 +A = 23 +M = f + +ModInv = -1 +A = 24 +M = f + +ModInv = -1 +A = 27 +M = f + +ModInv = -1 +A = 28 +M = f + +ModInv = -1 +A = 2a +M = f + +ModInv = -1 +A = 2d +M = f + +ModInv = -1 +A = 30 +M = f + +ModInv = -1 +A = 32 +M = f + +ModInv = -1 +A = 33 +M = f + +ModInv = -1 +A = 36 +M = f + +ModInv = -1 +A = 37 +M = f + +ModInv = -1 +A = 39 +M = f + +ModInv = -1 +A = 3c +M = f + +ModInv = -1 +A = 3f +M = f + +ModInv = -1 +A = 41 +M = f + +ModInv = -1 +A = 42 +M = f + +ModInv = -1 +A = 45 +M = f + +ModInv = -1 +A = 46 +M = f + +ModInv = -1 +A = 48 +M = f + +ModInv = -1 +A = 4b +M = f + +ModInv = -1 +A = 4e +M = f + +ModInv = -1 +A = 50 +M = f + +ModInv = -1 +A = 51 +M = f + +ModInv = -1 +A = 54 +M = f + +ModInv = -1 +A = 55 +M = f + +ModInv = -1 +A = 57 +M = f + +ModInv = -1 +A = 5a +M = f + +ModInv = -1 +A = 5d +M = f + +ModInv = -1 +A = 5f +M = f + +ModInv = -1 +A = 60 +M = f + +ModInv = -1 +A = 63 +M = f + +ModInv = -1 +A = -55 +M = 11 + +ModInv = -1 +A = -44 +M = 11 + +ModInv = -1 +A = -33 +M = 11 + +ModInv = -1 +A = -22 +M = 11 + +ModInv = -1 +A = -11 +M = 11 + +ModInv = -1 +A = 0 +M = 11 + +ModInv = -1 +A = 11 +M = 11 + +ModInv = -1 +A = 22 +M = 11 + +ModInv = -1 +A = 33 +M = 11 + +ModInv = -1 +A = 44 +M = 11 + +ModInv = -1 +A = 55 +M = 11 + +ModInv = -1 +A = -63 +M = 12 + +ModInv = -1 +A = -5d +M = 12 + +ModInv = -1 +A = -57 +M = 12 + +ModInv = -1 +A = -51 +M = 12 + +ModInv = -1 +A = -4b +M = 12 + +ModInv = -1 +A = -45 +M = 12 + +ModInv = -1 +A = -3f +M = 12 + +ModInv = -1 +A = -39 +M = 12 + +ModInv = -1 +A = -33 +M = 12 + +ModInv = -1 +A = -2d +M = 12 + +ModInv = -1 +A = -27 +M = 12 + +ModInv = -1 +A = -21 +M = 12 + +ModInv = -1 +A = -1b +M = 12 + +ModInv = -1 +A = -15 +M = 12 + +ModInv = -1 +A = -f +M = 12 + +ModInv = -1 +A = -9 +M = 12 + +ModInv = -1 +A = -3 +M = 12 + +ModInv = -1 +A = 3 +M = 12 + +ModInv = -1 +A = 9 +M = 12 + +ModInv = -1 +A = f +M = 12 + +ModInv = -1 +A = 15 +M = 12 + +ModInv = -1 +A = 1b +M = 12 + +ModInv = -1 +A = 21 +M = 12 + +ModInv = -1 +A = 27 +M = 12 + +ModInv = -1 +A = 2d +M = 12 + +ModInv = -1 +A = 33 +M = 12 + +ModInv = -1 +A = 39 +M = 12 + +ModInv = -1 +A = 3f +M = 12 + +ModInv = -1 +A = 45 +M = 12 + +ModInv = -1 +A = 4b +M = 12 + +ModInv = -1 +A = 51 +M = 12 + +ModInv = -1 +A = 57 +M = 12 + +ModInv = -1 +A = 5d +M = 12 + +ModInv = -1 +A = 63 +M = 12 + +ModInv = -1 +A = -5f +M = 13 + +ModInv = -1 +A = -4c +M = 13 + +ModInv = -1 +A = -39 +M = 13 + +ModInv = -1 +A = -26 +M = 13 + +ModInv = -1 +A = -13 +M = 13 + +ModInv = -1 +A = 0 +M = 13 + +ModInv = -1 +A = 13 +M = 13 + +ModInv = -1 +A = 26 +M = 13 + +ModInv = -1 +A = 39 +M = 13 + +ModInv = -1 +A = 4c +M = 13 + +ModInv = -1 +A = 5f +M = 13 + +ModInv = -1 +A = -5f +M = 14 + +ModInv = -1 +A = -55 +M = 14 + +ModInv = -1 +A = -4b +M = 14 + +ModInv = -1 +A = -41 +M = 14 + +ModInv = -1 +A = -37 +M = 14 + +ModInv = -1 +A = -2d +M = 14 + +ModInv = -1 +A = -23 +M = 14 + +ModInv = -1 +A = -19 +M = 14 + +ModInv = -1 +A = -f +M = 14 + +ModInv = -1 +A = -5 +M = 14 + +ModInv = -1 +A = 5 +M = 14 + +ModInv = -1 +A = f +M = 14 + +ModInv = -1 +A = 19 +M = 14 + +ModInv = -1 +A = 23 +M = 14 + +ModInv = -1 +A = 2d +M = 14 + +ModInv = -1 +A = 37 +M = 14 + +ModInv = -1 +A = 41 +M = 14 + +ModInv = -1 +A = 4b +M = 14 + +ModInv = -1 +A = 55 +M = 14 + +ModInv = -1 +A = 5f +M = 14 + +ModInv = -1 +A = -63 +M = 15 + +ModInv = -1 +A = -62 +M = 15 + +ModInv = -1 +A = -60 +M = 15 + +ModInv = -1 +A = -5d +M = 15 + +ModInv = -1 +A = -5b +M = 15 + +ModInv = -1 +A = -5a +M = 15 + +ModInv = -1 +A = -57 +M = 15 + +ModInv = -1 +A = -54 +M = 15 + +ModInv = -1 +A = -51 +M = 15 + +ModInv = -1 +A = -4e +M = 15 + +ModInv = -1 +A = -4d +M = 15 + +ModInv = -1 +A = -4b +M = 15 + +ModInv = -1 +A = -48 +M = 15 + +ModInv = -1 +A = -46 +M = 15 + +ModInv = -1 +A = -45 +M = 15 + +ModInv = -1 +A = -42 +M = 15 + +ModInv = -1 +A = -3f +M = 15 + +ModInv = -1 +A = -3c +M = 15 + +ModInv = -1 +A = -39 +M = 15 + +ModInv = -1 +A = -38 +M = 15 + +ModInv = -1 +A = -36 +M = 15 + +ModInv = -1 +A = -33 +M = 15 + +ModInv = -1 +A = -31 +M = 15 + +ModInv = -1 +A = -30 +M = 15 + +ModInv = -1 +A = -2d +M = 15 + +ModInv = -1 +A = -2a +M = 15 + +ModInv = -1 +A = -27 +M = 15 + +ModInv = -1 +A = -24 +M = 15 + +ModInv = -1 +A = -23 +M = 15 + +ModInv = -1 +A = -21 +M = 15 + +ModInv = -1 +A = -1e +M = 15 + +ModInv = -1 +A = -1c +M = 15 + +ModInv = -1 +A = -1b +M = 15 + +ModInv = -1 +A = -18 +M = 15 + +ModInv = -1 +A = -15 +M = 15 + +ModInv = -1 +A = -12 +M = 15 + +ModInv = -1 +A = -f +M = 15 + +ModInv = -1 +A = -e +M = 15 + +ModInv = -1 +A = -c +M = 15 + +ModInv = -1 +A = -9 +M = 15 + +ModInv = -1 +A = -7 +M = 15 + +ModInv = -1 +A = -6 +M = 15 + +ModInv = -1 +A = -3 +M = 15 + +ModInv = -1 +A = 0 +M = 15 + +ModInv = -1 +A = 3 +M = 15 + +ModInv = -1 +A = 6 +M = 15 + +ModInv = -1 +A = 7 +M = 15 + +ModInv = -1 +A = 9 +M = 15 + +ModInv = -1 +A = c +M = 15 + +ModInv = -1 +A = e +M = 15 + +ModInv = -1 +A = f +M = 15 + +ModInv = -1 +A = 12 +M = 15 + +ModInv = -1 +A = 15 +M = 15 + +ModInv = -1 +A = 18 +M = 15 + +ModInv = -1 +A = 1b +M = 15 + +ModInv = -1 +A = 1c +M = 15 + +ModInv = -1 +A = 1e +M = 15 + +ModInv = -1 +A = 21 +M = 15 + +ModInv = -1 +A = 23 +M = 15 + +ModInv = -1 +A = 24 +M = 15 + +ModInv = -1 +A = 27 +M = 15 + +ModInv = -1 +A = 2a +M = 15 + +ModInv = -1 +A = 2d +M = 15 + +ModInv = -1 +A = 30 +M = 15 + +ModInv = -1 +A = 31 +M = 15 + +ModInv = -1 +A = 33 +M = 15 + +ModInv = -1 +A = 36 +M = 15 + +ModInv = -1 +A = 38 +M = 15 + +ModInv = -1 +A = 39 +M = 15 + +ModInv = -1 +A = 3c +M = 15 + +ModInv = -1 +A = 3f +M = 15 + +ModInv = -1 +A = 42 +M = 15 + +ModInv = -1 +A = 45 +M = 15 + +ModInv = -1 +A = 46 +M = 15 + +ModInv = -1 +A = 48 +M = 15 + +ModInv = -1 +A = 4b +M = 15 + +ModInv = -1 +A = 4d +M = 15 + +ModInv = -1 +A = 4e +M = 15 + +ModInv = -1 +A = 51 +M = 15 + +ModInv = -1 +A = 54 +M = 15 + +ModInv = -1 +A = 57 +M = 15 + +ModInv = -1 +A = 5a +M = 15 + +ModInv = -1 +A = 5b +M = 15 + +ModInv = -1 +A = 5d +M = 15 + +ModInv = -1 +A = 60 +M = 15 + +ModInv = -1 +A = 62 +M = 15 + +ModInv = -1 +A = 63 +M = 15 + +ModInv = -1 +A = -63 +M = 16 + +ModInv = -1 +A = -4d +M = 16 + +ModInv = -1 +A = -37 +M = 16 + +ModInv = -1 +A = -21 +M = 16 + +ModInv = -1 +A = -b +M = 16 + +ModInv = -1 +A = b +M = 16 + +ModInv = -1 +A = 21 +M = 16 + +ModInv = -1 +A = 37 +M = 16 + +ModInv = -1 +A = 4d +M = 16 + +ModInv = -1 +A = 63 +M = 16 + +ModInv = -1 +A = -5c +M = 17 + +ModInv = -1 +A = -45 +M = 17 + +ModInv = -1 +A = -2e +M = 17 + +ModInv = -1 +A = -17 +M = 17 + +ModInv = -1 +A = 0 +M = 17 + +ModInv = -1 +A = 17 +M = 17 + +ModInv = -1 +A = 2e +M = 17 + +ModInv = -1 +A = 45 +M = 17 + +ModInv = -1 +A = 5c +M = 17 + +ModInv = -1 +A = -63 +M = 18 + +ModInv = -1 +A = -5d +M = 18 + +ModInv = -1 +A = -57 +M = 18 + +ModInv = -1 +A = -51 +M = 18 + +ModInv = -1 +A = -4b +M = 18 + +ModInv = -1 +A = -45 +M = 18 + +ModInv = -1 +A = -3f +M = 18 + +ModInv = -1 +A = -39 +M = 18 + +ModInv = -1 +A = -33 +M = 18 + +ModInv = -1 +A = -2d +M = 18 + +ModInv = -1 +A = -27 +M = 18 + +ModInv = -1 +A = -21 +M = 18 + +ModInv = -1 +A = -1b +M = 18 + +ModInv = -1 +A = -15 +M = 18 + +ModInv = -1 +A = -f +M = 18 + +ModInv = -1 +A = -9 +M = 18 + +ModInv = -1 +A = -3 +M = 18 + +ModInv = -1 +A = 3 +M = 18 + +ModInv = -1 +A = 9 +M = 18 + +ModInv = -1 +A = f +M = 18 + +ModInv = -1 +A = 15 +M = 18 + +ModInv = -1 +A = 1b +M = 18 + +ModInv = -1 +A = 21 +M = 18 + +ModInv = -1 +A = 27 +M = 18 + +ModInv = -1 +A = 2d +M = 18 + +ModInv = -1 +A = 33 +M = 18 + +ModInv = -1 +A = 39 +M = 18 + +ModInv = -1 +A = 3f +M = 18 + +ModInv = -1 +A = 45 +M = 18 + +ModInv = -1 +A = 4b +M = 18 + +ModInv = -1 +A = 51 +M = 18 + +ModInv = -1 +A = 57 +M = 18 + +ModInv = -1 +A = 5d +M = 18 + +ModInv = -1 +A = 63 +M = 18 + +ModInv = -1 +A = -64 +M = 19 + +ModInv = -1 +A = -5f +M = 19 + +ModInv = -1 +A = -5a +M = 19 + +ModInv = -1 +A = -55 +M = 19 + +ModInv = -1 +A = -50 +M = 19 + +ModInv = -1 +A = -4b +M = 19 + +ModInv = -1 +A = -46 +M = 19 + +ModInv = -1 +A = -41 +M = 19 + +ModInv = -1 +A = -3c +M = 19 + +ModInv = -1 +A = -37 +M = 19 + +ModInv = -1 +A = -32 +M = 19 + +ModInv = -1 +A = -2d +M = 19 + +ModInv = -1 +A = -28 +M = 19 + +ModInv = -1 +A = -23 +M = 19 + +ModInv = -1 +A = -1e +M = 19 + +ModInv = -1 +A = -19 +M = 19 + +ModInv = -1 +A = -14 +M = 19 + +ModInv = -1 +A = -f +M = 19 + +ModInv = -1 +A = -a +M = 19 + +ModInv = -1 +A = -5 +M = 19 + +ModInv = -1 +A = 0 +M = 19 + +ModInv = -1 +A = 5 +M = 19 + +ModInv = -1 +A = a +M = 19 + +ModInv = -1 +A = f +M = 19 + +ModInv = -1 +A = 14 +M = 19 + +ModInv = -1 +A = 19 +M = 19 + +ModInv = -1 +A = 1e +M = 19 + +ModInv = -1 +A = 23 +M = 19 + +ModInv = -1 +A = 28 +M = 19 + +ModInv = -1 +A = 2d +M = 19 + +ModInv = -1 +A = 32 +M = 19 + +ModInv = -1 +A = 37 +M = 19 + +ModInv = -1 +A = 3c +M = 19 + +ModInv = -1 +A = 41 +M = 19 + +ModInv = -1 +A = 46 +M = 19 + +ModInv = -1 +A = 4b +M = 19 + +ModInv = -1 +A = 50 +M = 19 + +ModInv = -1 +A = 55 +M = 19 + +ModInv = -1 +A = 5a +M = 19 + +ModInv = -1 +A = 5f +M = 19 + +ModInv = -1 +A = -5b +M = 1a + +ModInv = -1 +A = -41 +M = 1a + +ModInv = -1 +A = -27 +M = 1a + +ModInv = -1 +A = -d +M = 1a + +ModInv = -1 +A = d +M = 1a + +ModInv = -1 +A = 27 +M = 1a + +ModInv = -1 +A = 41 +M = 1a + +ModInv = -1 +A = 5b +M = 1a + +ModInv = -1 +A = -63 +M = 1b + +ModInv = -1 +A = -60 +M = 1b + +ModInv = -1 +A = -5d +M = 1b + +ModInv = -1 +A = -5a +M = 1b + +ModInv = -1 +A = -57 +M = 1b + +ModInv = -1 +A = -54 +M = 1b + +ModInv = -1 +A = -51 +M = 1b + +ModInv = -1 +A = -4e +M = 1b + +ModInv = -1 +A = -4b +M = 1b + +ModInv = -1 +A = -48 +M = 1b + +ModInv = -1 +A = -45 +M = 1b + +ModInv = -1 +A = -42 +M = 1b + +ModInv = -1 +A = -3f +M = 1b + +ModInv = -1 +A = -3c +M = 1b + +ModInv = -1 +A = -39 +M = 1b + +ModInv = -1 +A = -36 +M = 1b + +ModInv = -1 +A = -33 +M = 1b + +ModInv = -1 +A = -30 +M = 1b + +ModInv = -1 +A = -2d +M = 1b + +ModInv = -1 +A = -2a +M = 1b + +ModInv = -1 +A = -27 +M = 1b + +ModInv = -1 +A = -24 +M = 1b + +ModInv = -1 +A = -21 +M = 1b + +ModInv = -1 +A = -1e +M = 1b + +ModInv = -1 +A = -1b +M = 1b + +ModInv = -1 +A = -18 +M = 1b + +ModInv = -1 +A = -15 +M = 1b + +ModInv = -1 +A = -12 +M = 1b + +ModInv = -1 +A = -f +M = 1b + +ModInv = -1 +A = -c +M = 1b + +ModInv = -1 +A = -9 +M = 1b + +ModInv = -1 +A = -6 +M = 1b + +ModInv = -1 +A = -3 +M = 1b + +ModInv = -1 +A = 0 +M = 1b + +ModInv = -1 +A = 3 +M = 1b + +ModInv = -1 +A = 6 +M = 1b + +ModInv = -1 +A = 9 +M = 1b + +ModInv = -1 +A = c +M = 1b + +ModInv = -1 +A = f +M = 1b + +ModInv = -1 +A = 12 +M = 1b + +ModInv = -1 +A = 15 +M = 1b + +ModInv = -1 +A = 18 +M = 1b + +ModInv = -1 +A = 1b +M = 1b + +ModInv = -1 +A = 1e +M = 1b + +ModInv = -1 +A = 21 +M = 1b + +ModInv = -1 +A = 24 +M = 1b + +ModInv = -1 +A = 27 +M = 1b + +ModInv = -1 +A = 2a +M = 1b + +ModInv = -1 +A = 2d +M = 1b + +ModInv = -1 +A = 30 +M = 1b + +ModInv = -1 +A = 33 +M = 1b + +ModInv = -1 +A = 36 +M = 1b + +ModInv = -1 +A = 39 +M = 1b + +ModInv = -1 +A = 3c +M = 1b + +ModInv = -1 +A = 3f +M = 1b + +ModInv = -1 +A = 42 +M = 1b + +ModInv = -1 +A = 45 +M = 1b + +ModInv = -1 +A = 48 +M = 1b + +ModInv = -1 +A = 4b +M = 1b + +ModInv = -1 +A = 4e +M = 1b + +ModInv = -1 +A = 51 +M = 1b + +ModInv = -1 +A = 54 +M = 1b + +ModInv = -1 +A = 57 +M = 1b + +ModInv = -1 +A = 5a +M = 1b + +ModInv = -1 +A = 5d +M = 1b + +ModInv = -1 +A = 60 +M = 1b + +ModInv = -1 +A = 63 +M = 1b + +ModInv = -1 +A = -5b +M = 1c + +ModInv = -1 +A = -4d +M = 1c + +ModInv = -1 +A = -3f +M = 1c + +ModInv = -1 +A = -31 +M = 1c + +ModInv = -1 +A = -23 +M = 1c + +ModInv = -1 +A = -15 +M = 1c + +ModInv = -1 +A = -7 +M = 1c + +ModInv = -1 +A = 7 +M = 1c + +ModInv = -1 +A = 15 +M = 1c + +ModInv = -1 +A = 23 +M = 1c + +ModInv = -1 +A = 31 +M = 1c + +ModInv = -1 +A = 3f +M = 1c + +ModInv = -1 +A = 4d +M = 1c + +ModInv = -1 +A = 5b +M = 1c + +ModInv = -1 +A = -57 +M = 1d + +ModInv = -1 +A = -3a +M = 1d + +ModInv = -1 +A = -1d +M = 1d + +ModInv = -1 +A = 0 +M = 1d + +ModInv = -1 +A = 1d +M = 1d + +ModInv = -1 +A = 3a +M = 1d + +ModInv = -1 +A = 57 +M = 1d + +ModInv = -1 +A = -63 +M = 1e + +ModInv = -1 +A = -5f +M = 1e + +ModInv = -1 +A = -5d +M = 1e + +ModInv = -1 +A = -57 +M = 1e + +ModInv = -1 +A = -55 +M = 1e + +ModInv = -1 +A = -51 +M = 1e + +ModInv = -1 +A = -4b +M = 1e + +ModInv = -1 +A = -45 +M = 1e + +ModInv = -1 +A = -41 +M = 1e + +ModInv = -1 +A = -3f +M = 1e + +ModInv = -1 +A = -39 +M = 1e + +ModInv = -1 +A = -37 +M = 1e + +ModInv = -1 +A = -33 +M = 1e + +ModInv = -1 +A = -2d +M = 1e + +ModInv = -1 +A = -27 +M = 1e + +ModInv = -1 +A = -23 +M = 1e + +ModInv = -1 +A = -21 +M = 1e + +ModInv = -1 +A = -1b +M = 1e + +ModInv = -1 +A = -19 +M = 1e + +ModInv = -1 +A = -15 +M = 1e + +ModInv = -1 +A = -f +M = 1e + +ModInv = -1 +A = -9 +M = 1e + +ModInv = -1 +A = -5 +M = 1e + +ModInv = -1 +A = -3 +M = 1e + +ModInv = -1 +A = 3 +M = 1e + +ModInv = -1 +A = 5 +M = 1e + +ModInv = -1 +A = 9 +M = 1e + +ModInv = -1 +A = f +M = 1e + +ModInv = -1 +A = 15 +M = 1e + +ModInv = -1 +A = 19 +M = 1e + +ModInv = -1 +A = 1b +M = 1e + +ModInv = -1 +A = 21 +M = 1e + +ModInv = -1 +A = 23 +M = 1e + +ModInv = -1 +A = 27 +M = 1e + +ModInv = -1 +A = 2d +M = 1e + +ModInv = -1 +A = 33 +M = 1e + +ModInv = -1 +A = 37 +M = 1e + +ModInv = -1 +A = 39 +M = 1e + +ModInv = -1 +A = 3f +M = 1e + +ModInv = -1 +A = 41 +M = 1e + +ModInv = -1 +A = 45 +M = 1e + +ModInv = -1 +A = 4b +M = 1e + +ModInv = -1 +A = 51 +M = 1e + +ModInv = -1 +A = 55 +M = 1e + +ModInv = -1 +A = 57 +M = 1e + +ModInv = -1 +A = 5d +M = 1e + +ModInv = -1 +A = 5f +M = 1e + +ModInv = -1 +A = 63 +M = 1e + +ModInv = -1 +A = -5d +M = 1f + +ModInv = -1 +A = -3e +M = 1f + +ModInv = -1 +A = -1f +M = 1f + +ModInv = -1 +A = 0 +M = 1f + +ModInv = -1 +A = 1f +M = 1f + +ModInv = -1 +A = 3e +M = 1f + +ModInv = -1 +A = 5d +M = 1f + +ModInv = -1 +A = -63 +M = 21 + +ModInv = -1 +A = -60 +M = 21 + +ModInv = -1 +A = -5d +M = 21 + +ModInv = -1 +A = -5a +M = 21 + +ModInv = -1 +A = -58 +M = 21 + +ModInv = -1 +A = -57 +M = 21 + +ModInv = -1 +A = -54 +M = 21 + +ModInv = -1 +A = -51 +M = 21 + +ModInv = -1 +A = -4e +M = 21 + +ModInv = -1 +A = -4d +M = 21 + +ModInv = -1 +A = -4b +M = 21 + +ModInv = -1 +A = -48 +M = 21 + +ModInv = -1 +A = -45 +M = 21 + +ModInv = -1 +A = -42 +M = 21 + +ModInv = -1 +A = -3f +M = 21 + +ModInv = -1 +A = -3c +M = 21 + +ModInv = -1 +A = -39 +M = 21 + +ModInv = -1 +A = -37 +M = 21 + +ModInv = -1 +A = -36 +M = 21 + +ModInv = -1 +A = -33 +M = 21 + +ModInv = -1 +A = -30 +M = 21 + +ModInv = -1 +A = -2d +M = 21 + +ModInv = -1 +A = -2c +M = 21 + +ModInv = -1 +A = -2a +M = 21 + +ModInv = -1 +A = -27 +M = 21 + +ModInv = -1 +A = -24 +M = 21 + +ModInv = -1 +A = -21 +M = 21 + +ModInv = -1 +A = -1e +M = 21 + +ModInv = -1 +A = -1b +M = 21 + +ModInv = -1 +A = -18 +M = 21 + +ModInv = -1 +A = -16 +M = 21 + +ModInv = -1 +A = -15 +M = 21 + +ModInv = -1 +A = -12 +M = 21 + +ModInv = -1 +A = -f +M = 21 + +ModInv = -1 +A = -c +M = 21 + +ModInv = -1 +A = -b +M = 21 + +ModInv = -1 +A = -9 +M = 21 + +ModInv = -1 +A = -6 +M = 21 + +ModInv = -1 +A = -3 +M = 21 + +ModInv = -1 +A = 0 +M = 21 + +ModInv = -1 +A = 3 +M = 21 + +ModInv = -1 +A = 6 +M = 21 + +ModInv = -1 +A = 9 +M = 21 + +ModInv = -1 +A = b +M = 21 + +ModInv = -1 +A = c +M = 21 + +ModInv = -1 +A = f +M = 21 + +ModInv = -1 +A = 12 +M = 21 + +ModInv = -1 +A = 15 +M = 21 + +ModInv = -1 +A = 16 +M = 21 + +ModInv = -1 +A = 18 +M = 21 + +ModInv = -1 +A = 1b +M = 21 + +ModInv = -1 +A = 1e +M = 21 + +ModInv = -1 +A = 21 +M = 21 + +ModInv = -1 +A = 24 +M = 21 + +ModInv = -1 +A = 27 +M = 21 + +ModInv = -1 +A = 2a +M = 21 + +ModInv = -1 +A = 2c +M = 21 + +ModInv = -1 +A = 2d +M = 21 + +ModInv = -1 +A = 30 +M = 21 + +ModInv = -1 +A = 33 +M = 21 + +ModInv = -1 +A = 36 +M = 21 + +ModInv = -1 +A = 37 +M = 21 + +ModInv = -1 +A = 39 +M = 21 + +ModInv = -1 +A = 3c +M = 21 + +ModInv = -1 +A = 3f +M = 21 + +ModInv = -1 +A = 42 +M = 21 + +ModInv = -1 +A = 45 +M = 21 + +ModInv = -1 +A = 48 +M = 21 + +ModInv = -1 +A = 4b +M = 21 + +ModInv = -1 +A = 4d +M = 21 + +ModInv = -1 +A = 4e +M = 21 + +ModInv = -1 +A = 51 +M = 21 + +ModInv = -1 +A = 54 +M = 21 + +ModInv = -1 +A = 57 +M = 21 + +ModInv = -1 +A = 58 +M = 21 + +ModInv = -1 +A = 5a +M = 21 + +ModInv = -1 +A = 5d +M = 21 + +ModInv = -1 +A = 60 +M = 21 + +ModInv = -1 +A = 63 +M = 21 + +ModInv = -1 +A = -55 +M = 22 + +ModInv = -1 +A = -33 +M = 22 + +ModInv = -1 +A = -11 +M = 22 + +ModInv = -1 +A = 11 +M = 22 + +ModInv = -1 +A = 33 +M = 22 + +ModInv = -1 +A = 55 +M = 22 + +ModInv = -1 +A = -64 +M = 23 + +ModInv = -1 +A = -62 +M = 23 + +ModInv = -1 +A = -5f +M = 23 + +ModInv = -1 +A = -5b +M = 23 + +ModInv = -1 +A = -5a +M = 23 + +ModInv = -1 +A = -55 +M = 23 + +ModInv = -1 +A = -54 +M = 23 + +ModInv = -1 +A = -50 +M = 23 + +ModInv = -1 +A = -4d +M = 23 + +ModInv = -1 +A = -4b +M = 23 + +ModInv = -1 +A = -46 +M = 23 + +ModInv = -1 +A = -41 +M = 23 + +ModInv = -1 +A = -3f +M = 23 + +ModInv = -1 +A = -3c +M = 23 + +ModInv = -1 +A = -38 +M = 23 + +ModInv = -1 +A = -37 +M = 23 + +ModInv = -1 +A = -32 +M = 23 + +ModInv = -1 +A = -31 +M = 23 + +ModInv = -1 +A = -2d +M = 23 + +ModInv = -1 +A = -2a +M = 23 + +ModInv = -1 +A = -28 +M = 23 + +ModInv = -1 +A = -23 +M = 23 + +ModInv = -1 +A = -1e +M = 23 + +ModInv = -1 +A = -1c +M = 23 + +ModInv = -1 +A = -19 +M = 23 + +ModInv = -1 +A = -15 +M = 23 + +ModInv = -1 +A = -14 +M = 23 + +ModInv = -1 +A = -f +M = 23 + +ModInv = -1 +A = -e +M = 23 + +ModInv = -1 +A = -a +M = 23 + +ModInv = -1 +A = -7 +M = 23 + +ModInv = -1 +A = -5 +M = 23 + +ModInv = -1 +A = 0 +M = 23 + +ModInv = -1 +A = 5 +M = 23 + +ModInv = -1 +A = 7 +M = 23 + +ModInv = -1 +A = a +M = 23 + +ModInv = -1 +A = e +M = 23 + +ModInv = -1 +A = f +M = 23 + +ModInv = -1 +A = 14 +M = 23 + +ModInv = -1 +A = 15 +M = 23 + +ModInv = -1 +A = 19 +M = 23 + +ModInv = -1 +A = 1c +M = 23 + +ModInv = -1 +A = 1e +M = 23 + +ModInv = -1 +A = 23 +M = 23 + +ModInv = -1 +A = 28 +M = 23 + +ModInv = -1 +A = 2a +M = 23 + +ModInv = -1 +A = 2d +M = 23 + +ModInv = -1 +A = 31 +M = 23 + +ModInv = -1 +A = 32 +M = 23 + +ModInv = -1 +A = 37 +M = 23 + +ModInv = -1 +A = 38 +M = 23 + +ModInv = -1 +A = 3c +M = 23 + +ModInv = -1 +A = 3f +M = 23 + +ModInv = -1 +A = 41 +M = 23 + +ModInv = -1 +A = 46 +M = 23 + +ModInv = -1 +A = 4b +M = 23 + +ModInv = -1 +A = 4d +M = 23 + +ModInv = -1 +A = 50 +M = 23 + +ModInv = -1 +A = 54 +M = 23 + +ModInv = -1 +A = 55 +M = 23 + +ModInv = -1 +A = 5a +M = 23 + +ModInv = -1 +A = 5b +M = 23 + +ModInv = -1 +A = 5f +M = 23 + +ModInv = -1 +A = 62 +M = 23 + +ModInv = -1 +A = -63 +M = 24 + +ModInv = -1 +A = -5d +M = 24 + +ModInv = -1 +A = -57 +M = 24 + +ModInv = -1 +A = -51 +M = 24 + +ModInv = -1 +A = -4b +M = 24 + +ModInv = -1 +A = -45 +M = 24 + +ModInv = -1 +A = -3f +M = 24 + +ModInv = -1 +A = -39 +M = 24 + +ModInv = -1 +A = -33 +M = 24 + +ModInv = -1 +A = -2d +M = 24 + +ModInv = -1 +A = -27 +M = 24 + +ModInv = -1 +A = -21 +M = 24 + +ModInv = -1 +A = -1b +M = 24 + +ModInv = -1 +A = -15 +M = 24 + +ModInv = -1 +A = -f +M = 24 + +ModInv = -1 +A = -9 +M = 24 + +ModInv = -1 +A = -3 +M = 24 + +ModInv = -1 +A = 3 +M = 24 + +ModInv = -1 +A = 9 +M = 24 + +ModInv = -1 +A = f +M = 24 + +ModInv = -1 +A = 15 +M = 24 + +ModInv = -1 +A = 1b +M = 24 + +ModInv = -1 +A = 21 +M = 24 + +ModInv = -1 +A = 27 +M = 24 + +ModInv = -1 +A = 2d +M = 24 + +ModInv = -1 +A = 33 +M = 24 + +ModInv = -1 +A = 39 +M = 24 + +ModInv = -1 +A = 3f +M = 24 + +ModInv = -1 +A = 45 +M = 24 + +ModInv = -1 +A = 4b +M = 24 + +ModInv = -1 +A = 51 +M = 24 + +ModInv = -1 +A = 57 +M = 24 + +ModInv = -1 +A = 5d +M = 24 + +ModInv = -1 +A = 63 +M = 24 + +ModInv = -1 +A = -4a +M = 25 + +ModInv = -1 +A = -25 +M = 25 + +ModInv = -1 +A = 0 +M = 25 + +ModInv = -1 +A = 25 +M = 25 + +ModInv = -1 +A = 4a +M = 25 + +ModInv = -1 +A = -5f +M = 26 + +ModInv = -1 +A = -39 +M = 26 + +ModInv = -1 +A = -13 +M = 26 + +ModInv = -1 +A = 13 +M = 26 + +ModInv = -1 +A = 39 +M = 26 + +ModInv = -1 +A = 5f +M = 26 + +ModInv = -1 +A = -63 +M = 27 + +ModInv = -1 +A = -60 +M = 27 + +ModInv = -1 +A = -5d +M = 27 + +ModInv = -1 +A = -5b +M = 27 + +ModInv = -1 +A = -5a +M = 27 + +ModInv = -1 +A = -57 +M = 27 + +ModInv = -1 +A = -54 +M = 27 + +ModInv = -1 +A = -51 +M = 27 + +ModInv = -1 +A = -4e +M = 27 + +ModInv = -1 +A = -4b +M = 27 + +ModInv = -1 +A = -48 +M = 27 + +ModInv = -1 +A = -45 +M = 27 + +ModInv = -1 +A = -42 +M = 27 + +ModInv = -1 +A = -41 +M = 27 + +ModInv = -1 +A = -3f +M = 27 + +ModInv = -1 +A = -3c +M = 27 + +ModInv = -1 +A = -39 +M = 27 + +ModInv = -1 +A = -36 +M = 27 + +ModInv = -1 +A = -34 +M = 27 + +ModInv = -1 +A = -33 +M = 27 + +ModInv = -1 +A = -30 +M = 27 + +ModInv = -1 +A = -2d +M = 27 + +ModInv = -1 +A = -2a +M = 27 + +ModInv = -1 +A = -27 +M = 27 + +ModInv = -1 +A = -24 +M = 27 + +ModInv = -1 +A = -21 +M = 27 + +ModInv = -1 +A = -1e +M = 27 + +ModInv = -1 +A = -1b +M = 27 + +ModInv = -1 +A = -1a +M = 27 + +ModInv = -1 +A = -18 +M = 27 + +ModInv = -1 +A = -15 +M = 27 + +ModInv = -1 +A = -12 +M = 27 + +ModInv = -1 +A = -f +M = 27 + +ModInv = -1 +A = -d +M = 27 + +ModInv = -1 +A = -c +M = 27 + +ModInv = -1 +A = -9 +M = 27 + +ModInv = -1 +A = -6 +M = 27 + +ModInv = -1 +A = -3 +M = 27 + +ModInv = -1 +A = 0 +M = 27 + +ModInv = -1 +A = 3 +M = 27 + +ModInv = -1 +A = 6 +M = 27 + +ModInv = -1 +A = 9 +M = 27 + +ModInv = -1 +A = c +M = 27 + +ModInv = -1 +A = d +M = 27 + +ModInv = -1 +A = f +M = 27 + +ModInv = -1 +A = 12 +M = 27 + +ModInv = -1 +A = 15 +M = 27 + +ModInv = -1 +A = 18 +M = 27 + +ModInv = -1 +A = 1a +M = 27 + +ModInv = -1 +A = 1b +M = 27 + +ModInv = -1 +A = 1e +M = 27 + +ModInv = -1 +A = 21 +M = 27 + +ModInv = -1 +A = 24 +M = 27 + +ModInv = -1 +A = 27 +M = 27 + +ModInv = -1 +A = 2a +M = 27 + +ModInv = -1 +A = 2d +M = 27 + +ModInv = -1 +A = 30 +M = 27 + +ModInv = -1 +A = 33 +M = 27 + +ModInv = -1 +A = 34 +M = 27 + +ModInv = -1 +A = 36 +M = 27 + +ModInv = -1 +A = 39 +M = 27 + +ModInv = -1 +A = 3c +M = 27 + +ModInv = -1 +A = 3f +M = 27 + +ModInv = -1 +A = 41 +M = 27 + +ModInv = -1 +A = 42 +M = 27 + +ModInv = -1 +A = 45 +M = 27 + +ModInv = -1 +A = 48 +M = 27 + +ModInv = -1 +A = 4b +M = 27 + +ModInv = -1 +A = 4e +M = 27 + +ModInv = -1 +A = 51 +M = 27 + +ModInv = -1 +A = 54 +M = 27 + +ModInv = -1 +A = 57 +M = 27 + +ModInv = -1 +A = 5a +M = 27 + +ModInv = -1 +A = 5b +M = 27 + +ModInv = -1 +A = 5d +M = 27 + +ModInv = -1 +A = 60 +M = 27 + +ModInv = -1 +A = 63 +M = 27 + +ModInv = -1 +A = -5f +M = 28 + +ModInv = -1 +A = -55 +M = 28 + +ModInv = -1 +A = -4b +M = 28 + +ModInv = -1 +A = -41 +M = 28 + +ModInv = -1 +A = -37 +M = 28 + +ModInv = -1 +A = -2d +M = 28 + +ModInv = -1 +A = -23 +M = 28 + +ModInv = -1 +A = -19 +M = 28 + +ModInv = -1 +A = -f +M = 28 + +ModInv = -1 +A = -5 +M = 28 + +ModInv = -1 +A = 5 +M = 28 + +ModInv = -1 +A = f +M = 28 + +ModInv = -1 +A = 19 +M = 28 + +ModInv = -1 +A = 23 +M = 28 + +ModInv = -1 +A = 2d +M = 28 + +ModInv = -1 +A = 37 +M = 28 + +ModInv = -1 +A = 41 +M = 28 + +ModInv = -1 +A = 4b +M = 28 + +ModInv = -1 +A = 55 +M = 28 + +ModInv = -1 +A = 5f +M = 28 + +ModInv = -1 +A = -52 +M = 29 + +ModInv = -1 +A = -29 +M = 29 + +ModInv = -1 +A = 0 +M = 29 + +ModInv = -1 +A = 29 +M = 29 + +ModInv = -1 +A = 52 +M = 29 + +ModInv = -1 +A = -63 +M = 2a + +ModInv = -1 +A = -5d +M = 2a + +ModInv = -1 +A = -5b +M = 2a + +ModInv = -1 +A = -57 +M = 2a + +ModInv = -1 +A = -51 +M = 2a + +ModInv = -1 +A = -4d +M = 2a + +ModInv = -1 +A = -4b +M = 2a + +ModInv = -1 +A = -45 +M = 2a + +ModInv = -1 +A = -3f +M = 2a + +ModInv = -1 +A = -39 +M = 2a + +ModInv = -1 +A = -33 +M = 2a + +ModInv = -1 +A = -31 +M = 2a + +ModInv = -1 +A = -2d +M = 2a + +ModInv = -1 +A = -27 +M = 2a + +ModInv = -1 +A = -23 +M = 2a + +ModInv = -1 +A = -21 +M = 2a + +ModInv = -1 +A = -1b +M = 2a + +ModInv = -1 +A = -15 +M = 2a + +ModInv = -1 +A = -f +M = 2a + +ModInv = -1 +A = -9 +M = 2a + +ModInv = -1 +A = -7 +M = 2a + +ModInv = -1 +A = -3 +M = 2a + +ModInv = -1 +A = 3 +M = 2a + +ModInv = -1 +A = 7 +M = 2a + +ModInv = -1 +A = 9 +M = 2a + +ModInv = -1 +A = f +M = 2a + +ModInv = -1 +A = 15 +M = 2a + +ModInv = -1 +A = 1b +M = 2a + +ModInv = -1 +A = 21 +M = 2a + +ModInv = -1 +A = 23 +M = 2a + +ModInv = -1 +A = 27 +M = 2a + +ModInv = -1 +A = 2d +M = 2a + +ModInv = -1 +A = 31 +M = 2a + +ModInv = -1 +A = 33 +M = 2a + +ModInv = -1 +A = 39 +M = 2a + +ModInv = -1 +A = 3f +M = 2a + +ModInv = -1 +A = 45 +M = 2a + +ModInv = -1 +A = 4b +M = 2a + +ModInv = -1 +A = 4d +M = 2a + +ModInv = -1 +A = 51 +M = 2a + +ModInv = -1 +A = 57 +M = 2a + +ModInv = -1 +A = 5b +M = 2a + +ModInv = -1 +A = 5d +M = 2a + +ModInv = -1 +A = 63 +M = 2a + +ModInv = -1 +A = -56 +M = 2b + +ModInv = -1 +A = -2b +M = 2b + +ModInv = -1 +A = 0 +M = 2b + +ModInv = -1 +A = 2b +M = 2b + +ModInv = -1 +A = 56 +M = 2b + +ModInv = -1 +A = -63 +M = 2c + +ModInv = -1 +A = -4d +M = 2c + +ModInv = -1 +A = -37 +M = 2c + +ModInv = -1 +A = -21 +M = 2c + +ModInv = -1 +A = -b +M = 2c + +ModInv = -1 +A = b +M = 2c + +ModInv = -1 +A = 21 +M = 2c + +ModInv = -1 +A = 37 +M = 2c + +ModInv = -1 +A = 4d +M = 2c + +ModInv = -1 +A = 63 +M = 2c + +ModInv = -1 +A = -64 +M = 2d + +ModInv = -1 +A = -63 +M = 2d + +ModInv = -1 +A = -60 +M = 2d + +ModInv = -1 +A = -5f +M = 2d + +ModInv = -1 +A = -5d +M = 2d + +ModInv = -1 +A = -5a +M = 2d + +ModInv = -1 +A = -57 +M = 2d + +ModInv = -1 +A = -55 +M = 2d + +ModInv = -1 +A = -54 +M = 2d + +ModInv = -1 +A = -51 +M = 2d + +ModInv = -1 +A = -50 +M = 2d + +ModInv = -1 +A = -4e +M = 2d + +ModInv = -1 +A = -4b +M = 2d + +ModInv = -1 +A = -48 +M = 2d + +ModInv = -1 +A = -46 +M = 2d + +ModInv = -1 +A = -45 +M = 2d + +ModInv = -1 +A = -42 +M = 2d + +ModInv = -1 +A = -41 +M = 2d + +ModInv = -1 +A = -3f +M = 2d + +ModInv = -1 +A = -3c +M = 2d + +ModInv = -1 +A = -39 +M = 2d + +ModInv = -1 +A = -37 +M = 2d + +ModInv = -1 +A = -36 +M = 2d + +ModInv = -1 +A = -33 +M = 2d + +ModInv = -1 +A = -32 +M = 2d + +ModInv = -1 +A = -30 +M = 2d + +ModInv = -1 +A = -2d +M = 2d + +ModInv = -1 +A = -2a +M = 2d + +ModInv = -1 +A = -28 +M = 2d + +ModInv = -1 +A = -27 +M = 2d + +ModInv = -1 +A = -24 +M = 2d + +ModInv = -1 +A = -23 +M = 2d + +ModInv = -1 +A = -21 +M = 2d + +ModInv = -1 +A = -1e +M = 2d + +ModInv = -1 +A = -1b +M = 2d + +ModInv = -1 +A = -19 +M = 2d + +ModInv = -1 +A = -18 +M = 2d + +ModInv = -1 +A = -15 +M = 2d + +ModInv = -1 +A = -14 +M = 2d + +ModInv = -1 +A = -12 +M = 2d + +ModInv = -1 +A = -f +M = 2d + +ModInv = -1 +A = -c +M = 2d + +ModInv = -1 +A = -a +M = 2d + +ModInv = -1 +A = -9 +M = 2d + +ModInv = -1 +A = -6 +M = 2d + +ModInv = -1 +A = -5 +M = 2d + +ModInv = -1 +A = -3 +M = 2d + +ModInv = -1 +A = 0 +M = 2d + +ModInv = -1 +A = 3 +M = 2d + +ModInv = -1 +A = 5 +M = 2d + +ModInv = -1 +A = 6 +M = 2d + +ModInv = -1 +A = 9 +M = 2d + +ModInv = -1 +A = a +M = 2d + +ModInv = -1 +A = c +M = 2d + +ModInv = -1 +A = f +M = 2d + +ModInv = -1 +A = 12 +M = 2d + +ModInv = -1 +A = 14 +M = 2d + +ModInv = -1 +A = 15 +M = 2d + +ModInv = -1 +A = 18 +M = 2d + +ModInv = -1 +A = 19 +M = 2d + +ModInv = -1 +A = 1b +M = 2d + +ModInv = -1 +A = 1e +M = 2d + +ModInv = -1 +A = 21 +M = 2d + +ModInv = -1 +A = 23 +M = 2d + +ModInv = -1 +A = 24 +M = 2d + +ModInv = -1 +A = 27 +M = 2d + +ModInv = -1 +A = 28 +M = 2d + +ModInv = -1 +A = 2a +M = 2d + +ModInv = -1 +A = 2d +M = 2d + +ModInv = -1 +A = 30 +M = 2d + +ModInv = -1 +A = 32 +M = 2d + +ModInv = -1 +A = 33 +M = 2d + +ModInv = -1 +A = 36 +M = 2d + +ModInv = -1 +A = 37 +M = 2d + +ModInv = -1 +A = 39 +M = 2d + +ModInv = -1 +A = 3c +M = 2d + +ModInv = -1 +A = 3f +M = 2d + +ModInv = -1 +A = 41 +M = 2d + +ModInv = -1 +A = 42 +M = 2d + +ModInv = -1 +A = 45 +M = 2d + +ModInv = -1 +A = 46 +M = 2d + +ModInv = -1 +A = 48 +M = 2d + +ModInv = -1 +A = 4b +M = 2d + +ModInv = -1 +A = 4e +M = 2d + +ModInv = -1 +A = 50 +M = 2d + +ModInv = -1 +A = 51 +M = 2d + +ModInv = -1 +A = 54 +M = 2d + +ModInv = -1 +A = 55 +M = 2d + +ModInv = -1 +A = 57 +M = 2d + +ModInv = -1 +A = 5a +M = 2d + +ModInv = -1 +A = 5d +M = 2d + +ModInv = -1 +A = 5f +M = 2d + +ModInv = -1 +A = 60 +M = 2d + +ModInv = -1 +A = 63 +M = 2d + +ModInv = -1 +A = -45 +M = 2e + +ModInv = -1 +A = -17 +M = 2e + +ModInv = -1 +A = 17 +M = 2e + +ModInv = -1 +A = 45 +M = 2e + +ModInv = -1 +A = -5e +M = 2f + +ModInv = -1 +A = -2f +M = 2f + +ModInv = -1 +A = 0 +M = 2f + +ModInv = -1 +A = 2f +M = 2f + +ModInv = -1 +A = 5e +M = 2f + +ModInv = -1 +A = -63 +M = 30 + +ModInv = -1 +A = -5d +M = 30 + +ModInv = -1 +A = -57 +M = 30 + +ModInv = -1 +A = -51 +M = 30 + +ModInv = -1 +A = -4b +M = 30 + +ModInv = -1 +A = -45 +M = 30 + +ModInv = -1 +A = -3f +M = 30 + +ModInv = -1 +A = -39 +M = 30 + +ModInv = -1 +A = -33 +M = 30 + +ModInv = -1 +A = -2d +M = 30 + +ModInv = -1 +A = -27 +M = 30 + +ModInv = -1 +A = -21 +M = 30 + +ModInv = -1 +A = -1b +M = 30 + +ModInv = -1 +A = -15 +M = 30 + +ModInv = -1 +A = -f +M = 30 + +ModInv = -1 +A = -9 +M = 30 + +ModInv = -1 +A = -3 +M = 30 + +ModInv = -1 +A = 3 +M = 30 + +ModInv = -1 +A = 9 +M = 30 + +ModInv = -1 +A = f +M = 30 + +ModInv = -1 +A = 15 +M = 30 + +ModInv = -1 +A = 1b +M = 30 + +ModInv = -1 +A = 21 +M = 30 + +ModInv = -1 +A = 27 +M = 30 + +ModInv = -1 +A = 2d +M = 30 + +ModInv = -1 +A = 33 +M = 30 + +ModInv = -1 +A = 39 +M = 30 + +ModInv = -1 +A = 3f +M = 30 + +ModInv = -1 +A = 45 +M = 30 + +ModInv = -1 +A = 4b +M = 30 + +ModInv = -1 +A = 51 +M = 30 + +ModInv = -1 +A = 57 +M = 30 + +ModInv = -1 +A = 5d +M = 30 + +ModInv = -1 +A = 63 +M = 30 + +ModInv = -1 +A = -62 +M = 31 + +ModInv = -1 +A = -5b +M = 31 + +ModInv = -1 +A = -54 +M = 31 + +ModInv = -1 +A = -4d +M = 31 + +ModInv = -1 +A = -46 +M = 31 + +ModInv = -1 +A = -3f +M = 31 + +ModInv = -1 +A = -38 +M = 31 + +ModInv = -1 +A = -31 +M = 31 + +ModInv = -1 +A = -2a +M = 31 + +ModInv = -1 +A = -23 +M = 31 + +ModInv = -1 +A = -1c +M = 31 + +ModInv = -1 +A = -15 +M = 31 + +ModInv = -1 +A = -e +M = 31 + +ModInv = -1 +A = -7 +M = 31 + +ModInv = -1 +A = 0 +M = 31 + +ModInv = -1 +A = 7 +M = 31 + +ModInv = -1 +A = e +M = 31 + +ModInv = -1 +A = 15 +M = 31 + +ModInv = -1 +A = 1c +M = 31 + +ModInv = -1 +A = 23 +M = 31 + +ModInv = -1 +A = 2a +M = 31 + +ModInv = -1 +A = 31 +M = 31 + +ModInv = -1 +A = 38 +M = 31 + +ModInv = -1 +A = 3f +M = 31 + +ModInv = -1 +A = 46 +M = 31 + +ModInv = -1 +A = 4d +M = 31 + +ModInv = -1 +A = 54 +M = 31 + +ModInv = -1 +A = 5b +M = 31 + +ModInv = -1 +A = 62 +M = 31 + +ModInv = -1 +A = -5f +M = 32 + +ModInv = -1 +A = -55 +M = 32 + +ModInv = -1 +A = -4b +M = 32 + +ModInv = -1 +A = -41 +M = 32 + +ModInv = -1 +A = -37 +M = 32 + +ModInv = -1 +A = -2d +M = 32 + +ModInv = -1 +A = -23 +M = 32 + +ModInv = -1 +A = -19 +M = 32 + +ModInv = -1 +A = -f +M = 32 + +ModInv = -1 +A = -5 +M = 32 + +ModInv = -1 +A = 5 +M = 32 + +ModInv = -1 +A = f +M = 32 + +ModInv = -1 +A = 19 +M = 32 + +ModInv = -1 +A = 23 +M = 32 + +ModInv = -1 +A = 2d +M = 32 + +ModInv = -1 +A = 37 +M = 32 + +ModInv = -1 +A = 41 +M = 32 + +ModInv = -1 +A = 4b +M = 32 + +ModInv = -1 +A = 55 +M = 32 + +ModInv = -1 +A = 5f +M = 32 + +ModInv = -1 +A = -63 +M = 33 + +ModInv = -1 +A = -60 +M = 33 + +ModInv = -1 +A = -5d +M = 33 + +ModInv = -1 +A = -5a +M = 33 + +ModInv = -1 +A = -57 +M = 33 + +ModInv = -1 +A = -55 +M = 33 + +ModInv = -1 +A = -54 +M = 33 + +ModInv = -1 +A = -51 +M = 33 + +ModInv = -1 +A = -4e +M = 33 + +ModInv = -1 +A = -4b +M = 33 + +ModInv = -1 +A = -48 +M = 33 + +ModInv = -1 +A = -45 +M = 33 + +ModInv = -1 +A = -44 +M = 33 + +ModInv = -1 +A = -42 +M = 33 + +ModInv = -1 +A = -3f +M = 33 + +ModInv = -1 +A = -3c +M = 33 + +ModInv = -1 +A = -39 +M = 33 + +ModInv = -1 +A = -36 +M = 33 + +ModInv = -1 +A = -33 +M = 33 + +ModInv = -1 +A = -30 +M = 33 + +ModInv = -1 +A = -2d +M = 33 + +ModInv = -1 +A = -2a +M = 33 + +ModInv = -1 +A = -27 +M = 33 + +ModInv = -1 +A = -24 +M = 33 + +ModInv = -1 +A = -22 +M = 33 + +ModInv = -1 +A = -21 +M = 33 + +ModInv = -1 +A = -1e +M = 33 + +ModInv = -1 +A = -1b +M = 33 + +ModInv = -1 +A = -18 +M = 33 + +ModInv = -1 +A = -15 +M = 33 + +ModInv = -1 +A = -12 +M = 33 + +ModInv = -1 +A = -11 +M = 33 + +ModInv = -1 +A = -f +M = 33 + +ModInv = -1 +A = -c +M = 33 + +ModInv = -1 +A = -9 +M = 33 + +ModInv = -1 +A = -6 +M = 33 + +ModInv = -1 +A = -3 +M = 33 + +ModInv = -1 +A = 0 +M = 33 + +ModInv = -1 +A = 3 +M = 33 + +ModInv = -1 +A = 6 +M = 33 + +ModInv = -1 +A = 9 +M = 33 + +ModInv = -1 +A = c +M = 33 + +ModInv = -1 +A = f +M = 33 + +ModInv = -1 +A = 11 +M = 33 + +ModInv = -1 +A = 12 +M = 33 + +ModInv = -1 +A = 15 +M = 33 + +ModInv = -1 +A = 18 +M = 33 + +ModInv = -1 +A = 1b +M = 33 + +ModInv = -1 +A = 1e +M = 33 + +ModInv = -1 +A = 21 +M = 33 + +ModInv = -1 +A = 22 +M = 33 + +ModInv = -1 +A = 24 +M = 33 + +ModInv = -1 +A = 27 +M = 33 + +ModInv = -1 +A = 2a +M = 33 + +ModInv = -1 +A = 2d +M = 33 + +ModInv = -1 +A = 30 +M = 33 + +ModInv = -1 +A = 33 +M = 33 + +ModInv = -1 +A = 36 +M = 33 + +ModInv = -1 +A = 39 +M = 33 + +ModInv = -1 +A = 3c +M = 33 + +ModInv = -1 +A = 3f +M = 33 + +ModInv = -1 +A = 42 +M = 33 + +ModInv = -1 +A = 44 +M = 33 + +ModInv = -1 +A = 45 +M = 33 + +ModInv = -1 +A = 48 +M = 33 + +ModInv = -1 +A = 4b +M = 33 + +ModInv = -1 +A = 4e +M = 33 + +ModInv = -1 +A = 51 +M = 33 + +ModInv = -1 +A = 54 +M = 33 + +ModInv = -1 +A = 55 +M = 33 + +ModInv = -1 +A = 57 +M = 33 + +ModInv = -1 +A = 5a +M = 33 + +ModInv = -1 +A = 5d +M = 33 + +ModInv = -1 +A = 60 +M = 33 + +ModInv = -1 +A = 63 +M = 33 + +ModInv = -1 +A = -5b +M = 34 + +ModInv = -1 +A = -41 +M = 34 + +ModInv = -1 +A = -27 +M = 34 + +ModInv = -1 +A = -d +M = 34 + +ModInv = -1 +A = d +M = 34 + +ModInv = -1 +A = 27 +M = 34 + +ModInv = -1 +A = 41 +M = 34 + +ModInv = -1 +A = 5b +M = 34 + +ModInv = -1 +A = -35 +M = 35 + +ModInv = -1 +A = 0 +M = 35 + +ModInv = -1 +A = 35 +M = 35 + +ModInv = -1 +A = -63 +M = 36 + +ModInv = -1 +A = -5d +M = 36 + +ModInv = -1 +A = -57 +M = 36 + +ModInv = -1 +A = -51 +M = 36 + +ModInv = -1 +A = -4b +M = 36 + +ModInv = -1 +A = -45 +M = 36 + +ModInv = -1 +A = -3f +M = 36 + +ModInv = -1 +A = -39 +M = 36 + +ModInv = -1 +A = -33 +M = 36 + +ModInv = -1 +A = -2d +M = 36 + +ModInv = -1 +A = -27 +M = 36 + +ModInv = -1 +A = -21 +M = 36 + +ModInv = -1 +A = -1b +M = 36 + +ModInv = -1 +A = -15 +M = 36 + +ModInv = -1 +A = -f +M = 36 + +ModInv = -1 +A = -9 +M = 36 + +ModInv = -1 +A = -3 +M = 36 + +ModInv = -1 +A = 3 +M = 36 + +ModInv = -1 +A = 9 +M = 36 + +ModInv = -1 +A = f +M = 36 + +ModInv = -1 +A = 15 +M = 36 + +ModInv = -1 +A = 1b +M = 36 + +ModInv = -1 +A = 21 +M = 36 + +ModInv = -1 +A = 27 +M = 36 + +ModInv = -1 +A = 2d +M = 36 + +ModInv = -1 +A = 33 +M = 36 + +ModInv = -1 +A = 39 +M = 36 + +ModInv = -1 +A = 3f +M = 36 + +ModInv = -1 +A = 45 +M = 36 + +ModInv = -1 +A = 4b +M = 36 + +ModInv = -1 +A = 51 +M = 36 + +ModInv = -1 +A = 57 +M = 36 + +ModInv = -1 +A = 5d +M = 36 + +ModInv = -1 +A = 63 +M = 36 + +ModInv = -1 +A = -64 +M = 37 + +ModInv = -1 +A = -63 +M = 37 + +ModInv = -1 +A = -5f +M = 37 + +ModInv = -1 +A = -5a +M = 37 + +ModInv = -1 +A = -58 +M = 37 + +ModInv = -1 +A = -55 +M = 37 + +ModInv = -1 +A = -50 +M = 37 + +ModInv = -1 +A = -4d +M = 37 + +ModInv = -1 +A = -4b +M = 37 + +ModInv = -1 +A = -46 +M = 37 + +ModInv = -1 +A = -42 +M = 37 + +ModInv = -1 +A = -41 +M = 37 + +ModInv = -1 +A = -3c +M = 37 + +ModInv = -1 +A = -37 +M = 37 + +ModInv = -1 +A = -32 +M = 37 + +ModInv = -1 +A = -2d +M = 37 + +ModInv = -1 +A = -2c +M = 37 + +ModInv = -1 +A = -28 +M = 37 + +ModInv = -1 +A = -23 +M = 37 + +ModInv = -1 +A = -21 +M = 37 + +ModInv = -1 +A = -1e +M = 37 + +ModInv = -1 +A = -19 +M = 37 + +ModInv = -1 +A = -16 +M = 37 + +ModInv = -1 +A = -14 +M = 37 + +ModInv = -1 +A = -f +M = 37 + +ModInv = -1 +A = -b +M = 37 + +ModInv = -1 +A = -a +M = 37 + +ModInv = -1 +A = -5 +M = 37 + +ModInv = -1 +A = 0 +M = 37 + +ModInv = -1 +A = 5 +M = 37 + +ModInv = -1 +A = a +M = 37 + +ModInv = -1 +A = b +M = 37 + +ModInv = -1 +A = f +M = 37 + +ModInv = -1 +A = 14 +M = 37 + +ModInv = -1 +A = 16 +M = 37 + +ModInv = -1 +A = 19 +M = 37 + +ModInv = -1 +A = 1e +M = 37 + +ModInv = -1 +A = 21 +M = 37 + +ModInv = -1 +A = 23 +M = 37 + +ModInv = -1 +A = 28 +M = 37 + +ModInv = -1 +A = 2c +M = 37 + +ModInv = -1 +A = 2d +M = 37 + +ModInv = -1 +A = 32 +M = 37 + +ModInv = -1 +A = 37 +M = 37 + +ModInv = -1 +A = 3c +M = 37 + +ModInv = -1 +A = 41 +M = 37 + +ModInv = -1 +A = 42 +M = 37 + +ModInv = -1 +A = 46 +M = 37 + +ModInv = -1 +A = 4b +M = 37 + +ModInv = -1 +A = 4d +M = 37 + +ModInv = -1 +A = 50 +M = 37 + +ModInv = -1 +A = 55 +M = 37 + +ModInv = -1 +A = 58 +M = 37 + +ModInv = -1 +A = 5a +M = 37 + +ModInv = -1 +A = 5f +M = 37 + +ModInv = -1 +A = 63 +M = 37 + +ModInv = -1 +A = -5b +M = 38 + +ModInv = -1 +A = -4d +M = 38 + +ModInv = -1 +A = -3f +M = 38 + +ModInv = -1 +A = -31 +M = 38 + +ModInv = -1 +A = -23 +M = 38 + +ModInv = -1 +A = -15 +M = 38 + +ModInv = -1 +A = -7 +M = 38 + +ModInv = -1 +A = 7 +M = 38 + +ModInv = -1 +A = 15 +M = 38 + +ModInv = -1 +A = 23 +M = 38 + +ModInv = -1 +A = 31 +M = 38 + +ModInv = -1 +A = 3f +M = 38 + +ModInv = -1 +A = 4d +M = 38 + +ModInv = -1 +A = 5b +M = 38 + +ModInv = -1 +A = -63 +M = 39 + +ModInv = -1 +A = -60 +M = 39 + +ModInv = -1 +A = -5f +M = 39 + +ModInv = -1 +A = -5d +M = 39 + +ModInv = -1 +A = -5a +M = 39 + +ModInv = -1 +A = -57 +M = 39 + +ModInv = -1 +A = -54 +M = 39 + +ModInv = -1 +A = -51 +M = 39 + +ModInv = -1 +A = -4e +M = 39 + +ModInv = -1 +A = -4c +M = 39 + +ModInv = -1 +A = -4b +M = 39 + +ModInv = -1 +A = -48 +M = 39 + +ModInv = -1 +A = -45 +M = 39 + +ModInv = -1 +A = -42 +M = 39 + +ModInv = -1 +A = -3f +M = 39 + +ModInv = -1 +A = -3c +M = 39 + +ModInv = -1 +A = -39 +M = 39 + +ModInv = -1 +A = -36 +M = 39 + +ModInv = -1 +A = -33 +M = 39 + +ModInv = -1 +A = -30 +M = 39 + +ModInv = -1 +A = -2d +M = 39 + +ModInv = -1 +A = -2a +M = 39 + +ModInv = -1 +A = -27 +M = 39 + +ModInv = -1 +A = -26 +M = 39 + +ModInv = -1 +A = -24 +M = 39 + +ModInv = -1 +A = -21 +M = 39 + +ModInv = -1 +A = -1e +M = 39 + +ModInv = -1 +A = -1b +M = 39 + +ModInv = -1 +A = -18 +M = 39 + +ModInv = -1 +A = -15 +M = 39 + +ModInv = -1 +A = -13 +M = 39 + +ModInv = -1 +A = -12 +M = 39 + +ModInv = -1 +A = -f +M = 39 + +ModInv = -1 +A = -c +M = 39 + +ModInv = -1 +A = -9 +M = 39 + +ModInv = -1 +A = -6 +M = 39 + +ModInv = -1 +A = -3 +M = 39 + +ModInv = -1 +A = 0 +M = 39 + +ModInv = -1 +A = 3 +M = 39 + +ModInv = -1 +A = 6 +M = 39 + +ModInv = -1 +A = 9 +M = 39 + +ModInv = -1 +A = c +M = 39 + +ModInv = -1 +A = f +M = 39 + +ModInv = -1 +A = 12 +M = 39 + +ModInv = -1 +A = 13 +M = 39 + +ModInv = -1 +A = 15 +M = 39 + +ModInv = -1 +A = 18 +M = 39 + +ModInv = -1 +A = 1b +M = 39 + +ModInv = -1 +A = 1e +M = 39 + +ModInv = -1 +A = 21 +M = 39 + +ModInv = -1 +A = 24 +M = 39 + +ModInv = -1 +A = 26 +M = 39 + +ModInv = -1 +A = 27 +M = 39 + +ModInv = -1 +A = 2a +M = 39 + +ModInv = -1 +A = 2d +M = 39 + +ModInv = -1 +A = 30 +M = 39 + +ModInv = -1 +A = 33 +M = 39 + +ModInv = -1 +A = 36 +M = 39 + +ModInv = -1 +A = 39 +M = 39 + +ModInv = -1 +A = 3c +M = 39 + +ModInv = -1 +A = 3f +M = 39 + +ModInv = -1 +A = 42 +M = 39 + +ModInv = -1 +A = 45 +M = 39 + +ModInv = -1 +A = 48 +M = 39 + +ModInv = -1 +A = 4b +M = 39 + +ModInv = -1 +A = 4c +M = 39 + +ModInv = -1 +A = 4e +M = 39 + +ModInv = -1 +A = 51 +M = 39 + +ModInv = -1 +A = 54 +M = 39 + +ModInv = -1 +A = 57 +M = 39 + +ModInv = -1 +A = 5a +M = 39 + +ModInv = -1 +A = 5d +M = 39 + +ModInv = -1 +A = 5f +M = 39 + +ModInv = -1 +A = 60 +M = 39 + +ModInv = -1 +A = 63 +M = 39 + +ModInv = -1 +A = -57 +M = 3a + +ModInv = -1 +A = -1d +M = 3a + +ModInv = -1 +A = 1d +M = 3a + +ModInv = -1 +A = 57 +M = 3a + +ModInv = -1 +A = -3b +M = 3b + +ModInv = -1 +A = 0 +M = 3b + +ModInv = -1 +A = 3b +M = 3b + +ModInv = -1 +A = -63 +M = 3c + +ModInv = -1 +A = -5f +M = 3c + +ModInv = -1 +A = -5d +M = 3c + +ModInv = -1 +A = -57 +M = 3c + +ModInv = -1 +A = -55 +M = 3c + +ModInv = -1 +A = -51 +M = 3c + +ModInv = -1 +A = -4b +M = 3c + +ModInv = -1 +A = -45 +M = 3c + +ModInv = -1 +A = -41 +M = 3c + +ModInv = -1 +A = -3f +M = 3c + +ModInv = -1 +A = -39 +M = 3c + +ModInv = -1 +A = -37 +M = 3c + +ModInv = -1 +A = -33 +M = 3c + +ModInv = -1 +A = -2d +M = 3c + +ModInv = -1 +A = -27 +M = 3c + +ModInv = -1 +A = -23 +M = 3c + +ModInv = -1 +A = -21 +M = 3c + +ModInv = -1 +A = -1b +M = 3c + +ModInv = -1 +A = -19 +M = 3c + +ModInv = -1 +A = -15 +M = 3c + +ModInv = -1 +A = -f +M = 3c + +ModInv = -1 +A = -9 +M = 3c + +ModInv = -1 +A = -5 +M = 3c + +ModInv = -1 +A = -3 +M = 3c + +ModInv = -1 +A = 3 +M = 3c + +ModInv = -1 +A = 5 +M = 3c + +ModInv = -1 +A = 9 +M = 3c + +ModInv = -1 +A = f +M = 3c + +ModInv = -1 +A = 15 +M = 3c + +ModInv = -1 +A = 19 +M = 3c + +ModInv = -1 +A = 1b +M = 3c + +ModInv = -1 +A = 21 +M = 3c + +ModInv = -1 +A = 23 +M = 3c + +ModInv = -1 +A = 27 +M = 3c + +ModInv = -1 +A = 2d +M = 3c + +ModInv = -1 +A = 33 +M = 3c + +ModInv = -1 +A = 37 +M = 3c + +ModInv = -1 +A = 39 +M = 3c + +ModInv = -1 +A = 3f +M = 3c + +ModInv = -1 +A = 41 +M = 3c + +ModInv = -1 +A = 45 +M = 3c + +ModInv = -1 +A = 4b +M = 3c + +ModInv = -1 +A = 51 +M = 3c + +ModInv = -1 +A = 55 +M = 3c + +ModInv = -1 +A = 57 +M = 3c + +ModInv = -1 +A = 5d +M = 3c + +ModInv = -1 +A = 5f +M = 3c + +ModInv = -1 +A = 63 +M = 3c + +ModInv = -1 +A = -3d +M = 3d + +ModInv = -1 +A = 0 +M = 3d + +ModInv = -1 +A = 3d +M = 3d + +ModInv = -1 +A = -5d +M = 3e + +ModInv = -1 +A = -1f +M = 3e + +ModInv = -1 +A = 1f +M = 3e + +ModInv = -1 +A = 5d +M = 3e + +ModInv = -1 +A = -63 +M = 3f + +ModInv = -1 +A = -62 +M = 3f + +ModInv = -1 +A = -60 +M = 3f + +ModInv = -1 +A = -5d +M = 3f + +ModInv = -1 +A = -5b +M = 3f + +ModInv = -1 +A = -5a +M = 3f + +ModInv = -1 +A = -57 +M = 3f + +ModInv = -1 +A = -54 +M = 3f + +ModInv = -1 +A = -51 +M = 3f + +ModInv = -1 +A = -4e +M = 3f + +ModInv = -1 +A = -4d +M = 3f + +ModInv = -1 +A = -4b +M = 3f + +ModInv = -1 +A = -48 +M = 3f + +ModInv = -1 +A = -46 +M = 3f + +ModInv = -1 +A = -45 +M = 3f + +ModInv = -1 +A = -42 +M = 3f + +ModInv = -1 +A = -3f +M = 3f + +ModInv = -1 +A = -3c +M = 3f + +ModInv = -1 +A = -39 +M = 3f + +ModInv = -1 +A = -38 +M = 3f + +ModInv = -1 +A = -36 +M = 3f + +ModInv = -1 +A = -33 +M = 3f + +ModInv = -1 +A = -31 +M = 3f + +ModInv = -1 +A = -30 +M = 3f + +ModInv = -1 +A = -2d +M = 3f + +ModInv = -1 +A = -2a +M = 3f + +ModInv = -1 +A = -27 +M = 3f + +ModInv = -1 +A = -24 +M = 3f + +ModInv = -1 +A = -23 +M = 3f + +ModInv = -1 +A = -21 +M = 3f + +ModInv = -1 +A = -1e +M = 3f + +ModInv = -1 +A = -1c +M = 3f + +ModInv = -1 +A = -1b +M = 3f + +ModInv = -1 +A = -18 +M = 3f + +ModInv = -1 +A = -15 +M = 3f + +ModInv = -1 +A = -12 +M = 3f + +ModInv = -1 +A = -f +M = 3f + +ModInv = -1 +A = -e +M = 3f + +ModInv = -1 +A = -c +M = 3f + +ModInv = -1 +A = -9 +M = 3f + +ModInv = -1 +A = -7 +M = 3f + +ModInv = -1 +A = -6 +M = 3f + +ModInv = -1 +A = -3 +M = 3f + +ModInv = -1 +A = 0 +M = 3f + +ModInv = -1 +A = 3 +M = 3f + +ModInv = -1 +A = 6 +M = 3f + +ModInv = -1 +A = 7 +M = 3f + +ModInv = -1 +A = 9 +M = 3f + +ModInv = -1 +A = c +M = 3f + +ModInv = -1 +A = e +M = 3f + +ModInv = -1 +A = f +M = 3f + +ModInv = -1 +A = 12 +M = 3f + +ModInv = -1 +A = 15 +M = 3f + +ModInv = -1 +A = 18 +M = 3f + +ModInv = -1 +A = 1b +M = 3f + +ModInv = -1 +A = 1c +M = 3f + +ModInv = -1 +A = 1e +M = 3f + +ModInv = -1 +A = 21 +M = 3f + +ModInv = -1 +A = 23 +M = 3f + +ModInv = -1 +A = 24 +M = 3f + +ModInv = -1 +A = 27 +M = 3f + +ModInv = -1 +A = 2a +M = 3f + +ModInv = -1 +A = 2d +M = 3f + +ModInv = -1 +A = 30 +M = 3f + +ModInv = -1 +A = 31 +M = 3f + +ModInv = -1 +A = 33 +M = 3f + +ModInv = -1 +A = 36 +M = 3f + +ModInv = -1 +A = 38 +M = 3f + +ModInv = -1 +A = 39 +M = 3f + +ModInv = -1 +A = 3c +M = 3f + +ModInv = -1 +A = 3f +M = 3f + +ModInv = -1 +A = 42 +M = 3f + +ModInv = -1 +A = 45 +M = 3f + +ModInv = -1 +A = 46 +M = 3f + +ModInv = -1 +A = 48 +M = 3f + +ModInv = -1 +A = 4b +M = 3f + +ModInv = -1 +A = 4d +M = 3f + +ModInv = -1 +A = 4e +M = 3f + +ModInv = -1 +A = 51 +M = 3f + +ModInv = -1 +A = 54 +M = 3f + +ModInv = -1 +A = 57 +M = 3f + +ModInv = -1 +A = 5a +M = 3f + +ModInv = -1 +A = 5b +M = 3f + +ModInv = -1 +A = 5d +M = 3f + +ModInv = -1 +A = 60 +M = 3f + +ModInv = -1 +A = 62 +M = 3f + +ModInv = -1 +A = 63 +M = 3f + +ModInv = -1 +A = -64 +M = 41 + +ModInv = -1 +A = -5f +M = 41 + +ModInv = -1 +A = -5b +M = 41 + +ModInv = -1 +A = -5a +M = 41 + +ModInv = -1 +A = -55 +M = 41 + +ModInv = -1 +A = -50 +M = 41 + +ModInv = -1 +A = -4e +M = 41 + +ModInv = -1 +A = -4b +M = 41 + +ModInv = -1 +A = -46 +M = 41 + +ModInv = -1 +A = -41 +M = 41 + +ModInv = -1 +A = -3c +M = 41 + +ModInv = -1 +A = -37 +M = 41 + +ModInv = -1 +A = -34 +M = 41 + +ModInv = -1 +A = -32 +M = 41 + +ModInv = -1 +A = -2d +M = 41 + +ModInv = -1 +A = -28 +M = 41 + +ModInv = -1 +A = -27 +M = 41 + +ModInv = -1 +A = -23 +M = 41 + +ModInv = -1 +A = -1e +M = 41 + +ModInv = -1 +A = -1a +M = 41 + +ModInv = -1 +A = -19 +M = 41 + +ModInv = -1 +A = -14 +M = 41 + +ModInv = -1 +A = -f +M = 41 + +ModInv = -1 +A = -d +M = 41 + +ModInv = -1 +A = -a +M = 41 + +ModInv = -1 +A = -5 +M = 41 + +ModInv = -1 +A = 0 +M = 41 + +ModInv = -1 +A = 5 +M = 41 + +ModInv = -1 +A = a +M = 41 + +ModInv = -1 +A = d +M = 41 + +ModInv = -1 +A = f +M = 41 + +ModInv = -1 +A = 14 +M = 41 + +ModInv = -1 +A = 19 +M = 41 + +ModInv = -1 +A = 1a +M = 41 + +ModInv = -1 +A = 1e +M = 41 + +ModInv = -1 +A = 23 +M = 41 + +ModInv = -1 +A = 27 +M = 41 + +ModInv = -1 +A = 28 +M = 41 + +ModInv = -1 +A = 2d +M = 41 + +ModInv = -1 +A = 32 +M = 41 + +ModInv = -1 +A = 34 +M = 41 + +ModInv = -1 +A = 37 +M = 41 + +ModInv = -1 +A = 3c +M = 41 + +ModInv = -1 +A = 41 +M = 41 + +ModInv = -1 +A = 46 +M = 41 + +ModInv = -1 +A = 4b +M = 41 + +ModInv = -1 +A = 4e +M = 41 + +ModInv = -1 +A = 50 +M = 41 + +ModInv = -1 +A = 55 +M = 41 + +ModInv = -1 +A = 5a +M = 41 + +ModInv = -1 +A = 5b +M = 41 + +ModInv = -1 +A = 5f +M = 41 + +ModInv = -1 +A = -63 +M = 42 + +ModInv = -1 +A = -5d +M = 42 + +ModInv = -1 +A = -57 +M = 42 + +ModInv = -1 +A = -51 +M = 42 + +ModInv = -1 +A = -4d +M = 42 + +ModInv = -1 +A = -4b +M = 42 + +ModInv = -1 +A = -45 +M = 42 + +ModInv = -1 +A = -3f +M = 42 + +ModInv = -1 +A = -39 +M = 42 + +ModInv = -1 +A = -37 +M = 42 + +ModInv = -1 +A = -33 +M = 42 + +ModInv = -1 +A = -2d +M = 42 + +ModInv = -1 +A = -27 +M = 42 + +ModInv = -1 +A = -21 +M = 42 + +ModInv = -1 +A = -1b +M = 42 + +ModInv = -1 +A = -15 +M = 42 + +ModInv = -1 +A = -f +M = 42 + +ModInv = -1 +A = -b +M = 42 + +ModInv = -1 +A = -9 +M = 42 + +ModInv = -1 +A = -3 +M = 42 + +ModInv = -1 +A = 3 +M = 42 + +ModInv = -1 +A = 9 +M = 42 + +ModInv = -1 +A = b +M = 42 + +ModInv = -1 +A = f +M = 42 + +ModInv = -1 +A = 15 +M = 42 + +ModInv = -1 +A = 1b +M = 42 + +ModInv = -1 +A = 21 +M = 42 + +ModInv = -1 +A = 27 +M = 42 + +ModInv = -1 +A = 2d +M = 42 + +ModInv = -1 +A = 33 +M = 42 + +ModInv = -1 +A = 37 +M = 42 + +ModInv = -1 +A = 39 +M = 42 + +ModInv = -1 +A = 3f +M = 42 + +ModInv = -1 +A = 45 +M = 42 + +ModInv = -1 +A = 4b +M = 42 + +ModInv = -1 +A = 4d +M = 42 + +ModInv = -1 +A = 51 +M = 42 + +ModInv = -1 +A = 57 +M = 42 + +ModInv = -1 +A = 5d +M = 42 + +ModInv = -1 +A = 63 +M = 42 + +ModInv = -1 +A = -43 +M = 43 + +ModInv = -1 +A = 0 +M = 43 + +ModInv = -1 +A = 43 +M = 43 + +ModInv = -1 +A = -55 +M = 44 + +ModInv = -1 +A = -33 +M = 44 + +ModInv = -1 +A = -11 +M = 44 + +ModInv = -1 +A = 11 +M = 44 + +ModInv = -1 +A = 33 +M = 44 + +ModInv = -1 +A = 55 +M = 44 + +ModInv = -1 +A = -63 +M = 45 + +ModInv = -1 +A = -60 +M = 45 + +ModInv = -1 +A = -5d +M = 45 + +ModInv = -1 +A = -5c +M = 45 + +ModInv = -1 +A = -5a +M = 45 + +ModInv = -1 +A = -57 +M = 45 + +ModInv = -1 +A = -54 +M = 45 + +ModInv = -1 +A = -51 +M = 45 + +ModInv = -1 +A = -4e +M = 45 + +ModInv = -1 +A = -4b +M = 45 + +ModInv = -1 +A = -48 +M = 45 + +ModInv = -1 +A = -45 +M = 45 + +ModInv = -1 +A = -42 +M = 45 + +ModInv = -1 +A = -3f +M = 45 + +ModInv = -1 +A = -3c +M = 45 + +ModInv = -1 +A = -39 +M = 45 + +ModInv = -1 +A = -36 +M = 45 + +ModInv = -1 +A = -33 +M = 45 + +ModInv = -1 +A = -30 +M = 45 + +ModInv = -1 +A = -2e +M = 45 + +ModInv = -1 +A = -2d +M = 45 + +ModInv = -1 +A = -2a +M = 45 + +ModInv = -1 +A = -27 +M = 45 + +ModInv = -1 +A = -24 +M = 45 + +ModInv = -1 +A = -21 +M = 45 + +ModInv = -1 +A = -1e +M = 45 + +ModInv = -1 +A = -1b +M = 45 + +ModInv = -1 +A = -18 +M = 45 + +ModInv = -1 +A = -17 +M = 45 + +ModInv = -1 +A = -15 +M = 45 + +ModInv = -1 +A = -12 +M = 45 + +ModInv = -1 +A = -f +M = 45 + +ModInv = -1 +A = -c +M = 45 + +ModInv = -1 +A = -9 +M = 45 + +ModInv = -1 +A = -6 +M = 45 + +ModInv = -1 +A = -3 +M = 45 + +ModInv = -1 +A = 0 +M = 45 + +ModInv = -1 +A = 3 +M = 45 + +ModInv = -1 +A = 6 +M = 45 + +ModInv = -1 +A = 9 +M = 45 + +ModInv = -1 +A = c +M = 45 + +ModInv = -1 +A = f +M = 45 + +ModInv = -1 +A = 12 +M = 45 + +ModInv = -1 +A = 15 +M = 45 + +ModInv = -1 +A = 17 +M = 45 + +ModInv = -1 +A = 18 +M = 45 + +ModInv = -1 +A = 1b +M = 45 + +ModInv = -1 +A = 1e +M = 45 + +ModInv = -1 +A = 21 +M = 45 + +ModInv = -1 +A = 24 +M = 45 + +ModInv = -1 +A = 27 +M = 45 + +ModInv = -1 +A = 2a +M = 45 + +ModInv = -1 +A = 2d +M = 45 + +ModInv = -1 +A = 2e +M = 45 + +ModInv = -1 +A = 30 +M = 45 + +ModInv = -1 +A = 33 +M = 45 + +ModInv = -1 +A = 36 +M = 45 + +ModInv = -1 +A = 39 +M = 45 + +ModInv = -1 +A = 3c +M = 45 + +ModInv = -1 +A = 3f +M = 45 + +ModInv = -1 +A = 42 +M = 45 + +ModInv = -1 +A = 45 +M = 45 + +ModInv = -1 +A = 48 +M = 45 + +ModInv = -1 +A = 4b +M = 45 + +ModInv = -1 +A = 4e +M = 45 + +ModInv = -1 +A = 51 +M = 45 + +ModInv = -1 +A = 54 +M = 45 + +ModInv = -1 +A = 57 +M = 45 + +ModInv = -1 +A = 5a +M = 45 + +ModInv = -1 +A = 5c +M = 45 + +ModInv = -1 +A = 5d +M = 45 + +ModInv = -1 +A = 60 +M = 45 + +ModInv = -1 +A = 63 +M = 45 + +ModInv = -1 +A = -5f +M = 46 + +ModInv = -1 +A = -5b +M = 46 + +ModInv = -1 +A = -55 +M = 46 + +ModInv = -1 +A = -4d +M = 46 + +ModInv = -1 +A = -4b +M = 46 + +ModInv = -1 +A = -41 +M = 46 + +ModInv = -1 +A = -3f +M = 46 + +ModInv = -1 +A = -37 +M = 46 + +ModInv = -1 +A = -31 +M = 46 + +ModInv = -1 +A = -2d +M = 46 + +ModInv = -1 +A = -23 +M = 46 + +ModInv = -1 +A = -19 +M = 46 + +ModInv = -1 +A = -15 +M = 46 + +ModInv = -1 +A = -f +M = 46 + +ModInv = -1 +A = -7 +M = 46 + +ModInv = -1 +A = -5 +M = 46 + +ModInv = -1 +A = 5 +M = 46 + +ModInv = -1 +A = 7 +M = 46 + +ModInv = -1 +A = f +M = 46 + +ModInv = -1 +A = 15 +M = 46 + +ModInv = -1 +A = 19 +M = 46 + +ModInv = -1 +A = 23 +M = 46 + +ModInv = -1 +A = 2d +M = 46 + +ModInv = -1 +A = 31 +M = 46 + +ModInv = -1 +A = 37 +M = 46 + +ModInv = -1 +A = 3f +M = 46 + +ModInv = -1 +A = 41 +M = 46 + +ModInv = -1 +A = 4b +M = 46 + +ModInv = -1 +A = 4d +M = 46 + +ModInv = -1 +A = 55 +M = 46 + +ModInv = -1 +A = 5b +M = 46 + +ModInv = -1 +A = 5f +M = 46 + +ModInv = -1 +A = -47 +M = 47 + +ModInv = -1 +A = 0 +M = 47 + +ModInv = -1 +A = 47 +M = 47 + +ModInv = -1 +A = -63 +M = 48 + +ModInv = -1 +A = -5d +M = 48 + +ModInv = -1 +A = -57 +M = 48 + +ModInv = -1 +A = -51 +M = 48 + +ModInv = -1 +A = -4b +M = 48 + +ModInv = -1 +A = -45 +M = 48 + +ModInv = -1 +A = -3f +M = 48 + +ModInv = -1 +A = -39 +M = 48 + +ModInv = -1 +A = -33 +M = 48 + +ModInv = -1 +A = -2d +M = 48 + +ModInv = -1 +A = -27 +M = 48 + +ModInv = -1 +A = -21 +M = 48 + +ModInv = -1 +A = -1b +M = 48 + +ModInv = -1 +A = -15 +M = 48 + +ModInv = -1 +A = -f +M = 48 + +ModInv = -1 +A = -9 +M = 48 + +ModInv = -1 +A = -3 +M = 48 + +ModInv = -1 +A = 3 +M = 48 + +ModInv = -1 +A = 9 +M = 48 + +ModInv = -1 +A = f +M = 48 + +ModInv = -1 +A = 15 +M = 48 + +ModInv = -1 +A = 1b +M = 48 + +ModInv = -1 +A = 21 +M = 48 + +ModInv = -1 +A = 27 +M = 48 + +ModInv = -1 +A = 2d +M = 48 + +ModInv = -1 +A = 33 +M = 48 + +ModInv = -1 +A = 39 +M = 48 + +ModInv = -1 +A = 3f +M = 48 + +ModInv = -1 +A = 45 +M = 48 + +ModInv = -1 +A = 4b +M = 48 + +ModInv = -1 +A = 51 +M = 48 + +ModInv = -1 +A = 57 +M = 48 + +ModInv = -1 +A = 5d +M = 48 + +ModInv = -1 +A = 63 +M = 48 + +ModInv = -1 +A = -49 +M = 49 + +ModInv = -1 +A = 0 +M = 49 + +ModInv = -1 +A = 49 +M = 49 + +ModInv = -1 +A = -25 +M = 4a + +ModInv = -1 +A = 25 +M = 4a + +ModInv = -1 +A = -64 +M = 4b + +ModInv = -1 +A = -63 +M = 4b + +ModInv = -1 +A = -60 +M = 4b + +ModInv = -1 +A = -5f +M = 4b + +ModInv = -1 +A = -5d +M = 4b + +ModInv = -1 +A = -5a +M = 4b + +ModInv = -1 +A = -57 +M = 4b + +ModInv = -1 +A = -55 +M = 4b + +ModInv = -1 +A = -54 +M = 4b + +ModInv = -1 +A = -51 +M = 4b + +ModInv = -1 +A = -50 +M = 4b + +ModInv = -1 +A = -4e +M = 4b + +ModInv = -1 +A = -4b +M = 4b + +ModInv = -1 +A = -48 +M = 4b + +ModInv = -1 +A = -46 +M = 4b + +ModInv = -1 +A = -45 +M = 4b + +ModInv = -1 +A = -42 +M = 4b + +ModInv = -1 +A = -41 +M = 4b + +ModInv = -1 +A = -3f +M = 4b + +ModInv = -1 +A = -3c +M = 4b + +ModInv = -1 +A = -39 +M = 4b + +ModInv = -1 +A = -37 +M = 4b + +ModInv = -1 +A = -36 +M = 4b + +ModInv = -1 +A = -33 +M = 4b + +ModInv = -1 +A = -32 +M = 4b + +ModInv = -1 +A = -30 +M = 4b + +ModInv = -1 +A = -2d +M = 4b + +ModInv = -1 +A = -2a +M = 4b + +ModInv = -1 +A = -28 +M = 4b + +ModInv = -1 +A = -27 +M = 4b + +ModInv = -1 +A = -24 +M = 4b + +ModInv = -1 +A = -23 +M = 4b + +ModInv = -1 +A = -21 +M = 4b + +ModInv = -1 +A = -1e +M = 4b + +ModInv = -1 +A = -1b +M = 4b + +ModInv = -1 +A = -19 +M = 4b + +ModInv = -1 +A = -18 +M = 4b + +ModInv = -1 +A = -15 +M = 4b + +ModInv = -1 +A = -14 +M = 4b + +ModInv = -1 +A = -12 +M = 4b + +ModInv = -1 +A = -f +M = 4b + +ModInv = -1 +A = -c +M = 4b + +ModInv = -1 +A = -a +M = 4b + +ModInv = -1 +A = -9 +M = 4b + +ModInv = -1 +A = -6 +M = 4b + +ModInv = -1 +A = -5 +M = 4b + +ModInv = -1 +A = -3 +M = 4b + +ModInv = -1 +A = 0 +M = 4b + +ModInv = -1 +A = 3 +M = 4b + +ModInv = -1 +A = 5 +M = 4b + +ModInv = -1 +A = 6 +M = 4b + +ModInv = -1 +A = 9 +M = 4b + +ModInv = -1 +A = a +M = 4b + +ModInv = -1 +A = c +M = 4b + +ModInv = -1 +A = f +M = 4b + +ModInv = -1 +A = 12 +M = 4b + +ModInv = -1 +A = 14 +M = 4b + +ModInv = -1 +A = 15 +M = 4b + +ModInv = -1 +A = 18 +M = 4b + +ModInv = -1 +A = 19 +M = 4b + +ModInv = -1 +A = 1b +M = 4b + +ModInv = -1 +A = 1e +M = 4b + +ModInv = -1 +A = 21 +M = 4b + +ModInv = -1 +A = 23 +M = 4b + +ModInv = -1 +A = 24 +M = 4b + +ModInv = -1 +A = 27 +M = 4b + +ModInv = -1 +A = 28 +M = 4b + +ModInv = -1 +A = 2a +M = 4b + +ModInv = -1 +A = 2d +M = 4b + +ModInv = -1 +A = 30 +M = 4b + +ModInv = -1 +A = 32 +M = 4b + +ModInv = -1 +A = 33 +M = 4b + +ModInv = -1 +A = 36 +M = 4b + +ModInv = -1 +A = 37 +M = 4b + +ModInv = -1 +A = 39 +M = 4b + +ModInv = -1 +A = 3c +M = 4b + +ModInv = -1 +A = 3f +M = 4b + +ModInv = -1 +A = 41 +M = 4b + +ModInv = -1 +A = 42 +M = 4b + +ModInv = -1 +A = 45 +M = 4b + +ModInv = -1 +A = 46 +M = 4b + +ModInv = -1 +A = 48 +M = 4b + +ModInv = -1 +A = 4b +M = 4b + +ModInv = -1 +A = 4e +M = 4b + +ModInv = -1 +A = 50 +M = 4b + +ModInv = -1 +A = 51 +M = 4b + +ModInv = -1 +A = 54 +M = 4b + +ModInv = -1 +A = 55 +M = 4b + +ModInv = -1 +A = 57 +M = 4b + +ModInv = -1 +A = 5a +M = 4b + +ModInv = -1 +A = 5d +M = 4b + +ModInv = -1 +A = 5f +M = 4b + +ModInv = -1 +A = 60 +M = 4b + +ModInv = -1 +A = 63 +M = 4b + +ModInv = -1 +A = -5f +M = 4c + +ModInv = -1 +A = -39 +M = 4c + +ModInv = -1 +A = -13 +M = 4c + +ModInv = -1 +A = 13 +M = 4c + +ModInv = -1 +A = 39 +M = 4c + +ModInv = -1 +A = 5f +M = 4c + +ModInv = -1 +A = -63 +M = 4d + +ModInv = -1 +A = -62 +M = 4d + +ModInv = -1 +A = -5b +M = 4d + +ModInv = -1 +A = -58 +M = 4d + +ModInv = -1 +A = -54 +M = 4d + +ModInv = -1 +A = -4d +M = 4d + +ModInv = -1 +A = -46 +M = 4d + +ModInv = -1 +A = -42 +M = 4d + +ModInv = -1 +A = -3f +M = 4d + +ModInv = -1 +A = -38 +M = 4d + +ModInv = -1 +A = -37 +M = 4d + +ModInv = -1 +A = -31 +M = 4d + +ModInv = -1 +A = -2c +M = 4d + +ModInv = -1 +A = -2a +M = 4d + +ModInv = -1 +A = -23 +M = 4d + +ModInv = -1 +A = -21 +M = 4d + +ModInv = -1 +A = -1c +M = 4d + +ModInv = -1 +A = -16 +M = 4d + +ModInv = -1 +A = -15 +M = 4d + +ModInv = -1 +A = -e +M = 4d + +ModInv = -1 +A = -b +M = 4d + +ModInv = -1 +A = -7 +M = 4d + +ModInv = -1 +A = 0 +M = 4d + +ModInv = -1 +A = 7 +M = 4d + +ModInv = -1 +A = b +M = 4d + +ModInv = -1 +A = e +M = 4d + +ModInv = -1 +A = 15 +M = 4d + +ModInv = -1 +A = 16 +M = 4d + +ModInv = -1 +A = 1c +M = 4d + +ModInv = -1 +A = 21 +M = 4d + +ModInv = -1 +A = 23 +M = 4d + +ModInv = -1 +A = 2a +M = 4d + +ModInv = -1 +A = 2c +M = 4d + +ModInv = -1 +A = 31 +M = 4d + +ModInv = -1 +A = 37 +M = 4d + +ModInv = -1 +A = 38 +M = 4d + +ModInv = -1 +A = 3f +M = 4d + +ModInv = -1 +A = 42 +M = 4d + +ModInv = -1 +A = 46 +M = 4d + +ModInv = -1 +A = 4d +M = 4d + +ModInv = -1 +A = 54 +M = 4d + +ModInv = -1 +A = 58 +M = 4d + +ModInv = -1 +A = 5b +M = 4d + +ModInv = -1 +A = 62 +M = 4d + +ModInv = -1 +A = 63 +M = 4d + +ModInv = -1 +A = -63 +M = 4e + +ModInv = -1 +A = -5d +M = 4e + +ModInv = -1 +A = -5b +M = 4e + +ModInv = -1 +A = -57 +M = 4e + +ModInv = -1 +A = -51 +M = 4e + +ModInv = -1 +A = -4b +M = 4e + +ModInv = -1 +A = -45 +M = 4e + +ModInv = -1 +A = -41 +M = 4e + +ModInv = -1 +A = -3f +M = 4e + +ModInv = -1 +A = -39 +M = 4e + +ModInv = -1 +A = -33 +M = 4e + +ModInv = -1 +A = -2d +M = 4e + +ModInv = -1 +A = -27 +M = 4e + +ModInv = -1 +A = -21 +M = 4e + +ModInv = -1 +A = -1b +M = 4e + +ModInv = -1 +A = -15 +M = 4e + +ModInv = -1 +A = -f +M = 4e + +ModInv = -1 +A = -d +M = 4e + +ModInv = -1 +A = -9 +M = 4e + +ModInv = -1 +A = -3 +M = 4e + +ModInv = -1 +A = 3 +M = 4e + +ModInv = -1 +A = 9 +M = 4e + +ModInv = -1 +A = d +M = 4e + +ModInv = -1 +A = f +M = 4e + +ModInv = -1 +A = 15 +M = 4e + +ModInv = -1 +A = 1b +M = 4e + +ModInv = -1 +A = 21 +M = 4e + +ModInv = -1 +A = 27 +M = 4e + +ModInv = -1 +A = 2d +M = 4e + +ModInv = -1 +A = 33 +M = 4e + +ModInv = -1 +A = 39 +M = 4e + +ModInv = -1 +A = 3f +M = 4e + +ModInv = -1 +A = 41 +M = 4e + +ModInv = -1 +A = 45 +M = 4e + +ModInv = -1 +A = 4b +M = 4e + +ModInv = -1 +A = 51 +M = 4e + +ModInv = -1 +A = 57 +M = 4e + +ModInv = -1 +A = 5b +M = 4e + +ModInv = -1 +A = 5d +M = 4e + +ModInv = -1 +A = 63 +M = 4e + +ModInv = -1 +A = -4f +M = 4f + +ModInv = -1 +A = 0 +M = 4f + +ModInv = -1 +A = 4f +M = 4f + +ModInv = -1 +A = -5f +M = 50 + +ModInv = -1 +A = -55 +M = 50 + +ModInv = -1 +A = -4b +M = 50 + +ModInv = -1 +A = -41 +M = 50 + +ModInv = -1 +A = -37 +M = 50 + +ModInv = -1 +A = -2d +M = 50 + +ModInv = -1 +A = -23 +M = 50 + +ModInv = -1 +A = -19 +M = 50 + +ModInv = -1 +A = -f +M = 50 + +ModInv = -1 +A = -5 +M = 50 + +ModInv = -1 +A = 5 +M = 50 + +ModInv = -1 +A = f +M = 50 + +ModInv = -1 +A = 19 +M = 50 + +ModInv = -1 +A = 23 +M = 50 + +ModInv = -1 +A = 2d +M = 50 + +ModInv = -1 +A = 37 +M = 50 + +ModInv = -1 +A = 41 +M = 50 + +ModInv = -1 +A = 4b +M = 50 + +ModInv = -1 +A = 55 +M = 50 + +ModInv = -1 +A = 5f +M = 50 + +ModInv = -1 +A = -63 +M = 51 + +ModInv = -1 +A = -60 +M = 51 + +ModInv = -1 +A = -5d +M = 51 + +ModInv = -1 +A = -5a +M = 51 + +ModInv = -1 +A = -57 +M = 51 + +ModInv = -1 +A = -54 +M = 51 + +ModInv = -1 +A = -51 +M = 51 + +ModInv = -1 +A = -4e +M = 51 + +ModInv = -1 +A = -4b +M = 51 + +ModInv = -1 +A = -48 +M = 51 + +ModInv = -1 +A = -45 +M = 51 + +ModInv = -1 +A = -42 +M = 51 + +ModInv = -1 +A = -3f +M = 51 + +ModInv = -1 +A = -3c +M = 51 + +ModInv = -1 +A = -39 +M = 51 + +ModInv = -1 +A = -36 +M = 51 + +ModInv = -1 +A = -33 +M = 51 + +ModInv = -1 +A = -30 +M = 51 + +ModInv = -1 +A = -2d +M = 51 + +ModInv = -1 +A = -2a +M = 51 + +ModInv = -1 +A = -27 +M = 51 + +ModInv = -1 +A = -24 +M = 51 + +ModInv = -1 +A = -21 +M = 51 + +ModInv = -1 +A = -1e +M = 51 + +ModInv = -1 +A = -1b +M = 51 + +ModInv = -1 +A = -18 +M = 51 + +ModInv = -1 +A = -15 +M = 51 + +ModInv = -1 +A = -12 +M = 51 + +ModInv = -1 +A = -f +M = 51 + +ModInv = -1 +A = -c +M = 51 + +ModInv = -1 +A = -9 +M = 51 + +ModInv = -1 +A = -6 +M = 51 + +ModInv = -1 +A = -3 +M = 51 + +ModInv = -1 +A = 0 +M = 51 + +ModInv = -1 +A = 3 +M = 51 + +ModInv = -1 +A = 6 +M = 51 + +ModInv = -1 +A = 9 +M = 51 + +ModInv = -1 +A = c +M = 51 + +ModInv = -1 +A = f +M = 51 + +ModInv = -1 +A = 12 +M = 51 + +ModInv = -1 +A = 15 +M = 51 + +ModInv = -1 +A = 18 +M = 51 + +ModInv = -1 +A = 1b +M = 51 + +ModInv = -1 +A = 1e +M = 51 + +ModInv = -1 +A = 21 +M = 51 + +ModInv = -1 +A = 24 +M = 51 + +ModInv = -1 +A = 27 +M = 51 + +ModInv = -1 +A = 2a +M = 51 + +ModInv = -1 +A = 2d +M = 51 + +ModInv = -1 +A = 30 +M = 51 + +ModInv = -1 +A = 33 +M = 51 + +ModInv = -1 +A = 36 +M = 51 + +ModInv = -1 +A = 39 +M = 51 + +ModInv = -1 +A = 3c +M = 51 + +ModInv = -1 +A = 3f +M = 51 + +ModInv = -1 +A = 42 +M = 51 + +ModInv = -1 +A = 45 +M = 51 + +ModInv = -1 +A = 48 +M = 51 + +ModInv = -1 +A = 4b +M = 51 + +ModInv = -1 +A = 4e +M = 51 + +ModInv = -1 +A = 51 +M = 51 + +ModInv = -1 +A = 54 +M = 51 + +ModInv = -1 +A = 57 +M = 51 + +ModInv = -1 +A = 5a +M = 51 + +ModInv = -1 +A = 5d +M = 51 + +ModInv = -1 +A = 60 +M = 51 + +ModInv = -1 +A = 63 +M = 51 + +ModInv = -1 +A = -29 +M = 52 + +ModInv = -1 +A = 29 +M = 52 + +ModInv = -1 +A = -53 +M = 53 + +ModInv = -1 +A = 0 +M = 53 + +ModInv = -1 +A = 53 +M = 53 + +ModInv = -1 +A = -63 +M = 54 + +ModInv = -1 +A = -5d +M = 54 + +ModInv = -1 +A = -5b +M = 54 + +ModInv = -1 +A = -57 +M = 54 + +ModInv = -1 +A = -51 +M = 54 + +ModInv = -1 +A = -4d +M = 54 + +ModInv = -1 +A = -4b +M = 54 + +ModInv = -1 +A = -45 +M = 54 + +ModInv = -1 +A = -3f +M = 54 + +ModInv = -1 +A = -39 +M = 54 + +ModInv = -1 +A = -33 +M = 54 + +ModInv = -1 +A = -31 +M = 54 + +ModInv = -1 +A = -2d +M = 54 + +ModInv = -1 +A = -27 +M = 54 + +ModInv = -1 +A = -23 +M = 54 + +ModInv = -1 +A = -21 +M = 54 + +ModInv = -1 +A = -1b +M = 54 + +ModInv = -1 +A = -15 +M = 54 + +ModInv = -1 +A = -f +M = 54 + +ModInv = -1 +A = -9 +M = 54 + +ModInv = -1 +A = -7 +M = 54 + +ModInv = -1 +A = -3 +M = 54 + +ModInv = -1 +A = 3 +M = 54 + +ModInv = -1 +A = 7 +M = 54 + +ModInv = -1 +A = 9 +M = 54 + +ModInv = -1 +A = f +M = 54 + +ModInv = -1 +A = 15 +M = 54 + +ModInv = -1 +A = 1b +M = 54 + +ModInv = -1 +A = 21 +M = 54 + +ModInv = -1 +A = 23 +M = 54 + +ModInv = -1 +A = 27 +M = 54 + +ModInv = -1 +A = 2d +M = 54 + +ModInv = -1 +A = 31 +M = 54 + +ModInv = -1 +A = 33 +M = 54 + +ModInv = -1 +A = 39 +M = 54 + +ModInv = -1 +A = 3f +M = 54 + +ModInv = -1 +A = 45 +M = 54 + +ModInv = -1 +A = 4b +M = 54 + +ModInv = -1 +A = 4d +M = 54 + +ModInv = -1 +A = 51 +M = 54 + +ModInv = -1 +A = 57 +M = 54 + +ModInv = -1 +A = 5b +M = 54 + +ModInv = -1 +A = 5d +M = 54 + +ModInv = -1 +A = 63 +M = 54 + +ModInv = -1 +A = -64 +M = 55 + +ModInv = -1 +A = -5f +M = 55 + +ModInv = -1 +A = -5a +M = 55 + +ModInv = -1 +A = -55 +M = 55 + +ModInv = -1 +A = -50 +M = 55 + +ModInv = -1 +A = -4b +M = 55 + +ModInv = -1 +A = -46 +M = 55 + +ModInv = -1 +A = -44 +M = 55 + +ModInv = -1 +A = -41 +M = 55 + +ModInv = -1 +A = -3c +M = 55 + +ModInv = -1 +A = -37 +M = 55 + +ModInv = -1 +A = -33 +M = 55 + +ModInv = -1 +A = -32 +M = 55 + +ModInv = -1 +A = -2d +M = 55 + +ModInv = -1 +A = -28 +M = 55 + +ModInv = -1 +A = -23 +M = 55 + +ModInv = -1 +A = -22 +M = 55 + +ModInv = -1 +A = -1e +M = 55 + +ModInv = -1 +A = -19 +M = 55 + +ModInv = -1 +A = -14 +M = 55 + +ModInv = -1 +A = -11 +M = 55 + +ModInv = -1 +A = -f +M = 55 + +ModInv = -1 +A = -a +M = 55 + +ModInv = -1 +A = -5 +M = 55 + +ModInv = -1 +A = 0 +M = 55 + +ModInv = -1 +A = 5 +M = 55 + +ModInv = -1 +A = a +M = 55 + +ModInv = -1 +A = f +M = 55 + +ModInv = -1 +A = 11 +M = 55 + +ModInv = -1 +A = 14 +M = 55 + +ModInv = -1 +A = 19 +M = 55 + +ModInv = -1 +A = 1e +M = 55 + +ModInv = -1 +A = 22 +M = 55 + +ModInv = -1 +A = 23 +M = 55 + +ModInv = -1 +A = 28 +M = 55 + +ModInv = -1 +A = 2d +M = 55 + +ModInv = -1 +A = 32 +M = 55 + +ModInv = -1 +A = 33 +M = 55 + +ModInv = -1 +A = 37 +M = 55 + +ModInv = -1 +A = 3c +M = 55 + +ModInv = -1 +A = 41 +M = 55 + +ModInv = -1 +A = 44 +M = 55 + +ModInv = -1 +A = 46 +M = 55 + +ModInv = -1 +A = 4b +M = 55 + +ModInv = -1 +A = 50 +M = 55 + +ModInv = -1 +A = 55 +M = 55 + +ModInv = -1 +A = 5a +M = 55 + +ModInv = -1 +A = 5f +M = 55 + +ModInv = -1 +A = -2b +M = 56 + +ModInv = -1 +A = 2b +M = 56 + +ModInv = -1 +A = -63 +M = 57 + +ModInv = -1 +A = -60 +M = 57 + +ModInv = -1 +A = -5d +M = 57 + +ModInv = -1 +A = -5a +M = 57 + +ModInv = -1 +A = -57 +M = 57 + +ModInv = -1 +A = -54 +M = 57 + +ModInv = -1 +A = -51 +M = 57 + +ModInv = -1 +A = -4e +M = 57 + +ModInv = -1 +A = -4b +M = 57 + +ModInv = -1 +A = -48 +M = 57 + +ModInv = -1 +A = -45 +M = 57 + +ModInv = -1 +A = -42 +M = 57 + +ModInv = -1 +A = -3f +M = 57 + +ModInv = -1 +A = -3c +M = 57 + +ModInv = -1 +A = -3a +M = 57 + +ModInv = -1 +A = -39 +M = 57 + +ModInv = -1 +A = -36 +M = 57 + +ModInv = -1 +A = -33 +M = 57 + +ModInv = -1 +A = -30 +M = 57 + +ModInv = -1 +A = -2d +M = 57 + +ModInv = -1 +A = -2a +M = 57 + +ModInv = -1 +A = -27 +M = 57 + +ModInv = -1 +A = -24 +M = 57 + +ModInv = -1 +A = -21 +M = 57 + +ModInv = -1 +A = -1e +M = 57 + +ModInv = -1 +A = -1d +M = 57 + +ModInv = -1 +A = -1b +M = 57 + +ModInv = -1 +A = -18 +M = 57 + +ModInv = -1 +A = -15 +M = 57 + +ModInv = -1 +A = -12 +M = 57 + +ModInv = -1 +A = -f +M = 57 + +ModInv = -1 +A = -c +M = 57 + +ModInv = -1 +A = -9 +M = 57 + +ModInv = -1 +A = -6 +M = 57 + +ModInv = -1 +A = -3 +M = 57 + +ModInv = -1 +A = 0 +M = 57 + +ModInv = -1 +A = 3 +M = 57 + +ModInv = -1 +A = 6 +M = 57 + +ModInv = -1 +A = 9 +M = 57 + +ModInv = -1 +A = c +M = 57 + +ModInv = -1 +A = f +M = 57 + +ModInv = -1 +A = 12 +M = 57 + +ModInv = -1 +A = 15 +M = 57 + +ModInv = -1 +A = 18 +M = 57 + +ModInv = -1 +A = 1b +M = 57 + +ModInv = -1 +A = 1d +M = 57 + +ModInv = -1 +A = 1e +M = 57 + +ModInv = -1 +A = 21 +M = 57 + +ModInv = -1 +A = 24 +M = 57 + +ModInv = -1 +A = 27 +M = 57 + +ModInv = -1 +A = 2a +M = 57 + +ModInv = -1 +A = 2d +M = 57 + +ModInv = -1 +A = 30 +M = 57 + +ModInv = -1 +A = 33 +M = 57 + +ModInv = -1 +A = 36 +M = 57 + +ModInv = -1 +A = 39 +M = 57 + +ModInv = -1 +A = 3a +M = 57 + +ModInv = -1 +A = 3c +M = 57 + +ModInv = -1 +A = 3f +M = 57 + +ModInv = -1 +A = 42 +M = 57 + +ModInv = -1 +A = 45 +M = 57 + +ModInv = -1 +A = 48 +M = 57 + +ModInv = -1 +A = 4b +M = 57 + +ModInv = -1 +A = 4e +M = 57 + +ModInv = -1 +A = 51 +M = 57 + +ModInv = -1 +A = 54 +M = 57 + +ModInv = -1 +A = 57 +M = 57 + +ModInv = -1 +A = 5a +M = 57 + +ModInv = -1 +A = 5d +M = 57 + +ModInv = -1 +A = 60 +M = 57 + +ModInv = -1 +A = 63 +M = 57 + +ModInv = -1 +A = -63 +M = 58 + +ModInv = -1 +A = -4d +M = 58 + +ModInv = -1 +A = -37 +M = 58 + +ModInv = -1 +A = -21 +M = 58 + +ModInv = -1 +A = -b +M = 58 + +ModInv = -1 +A = b +M = 58 + +ModInv = -1 +A = 21 +M = 58 + +ModInv = -1 +A = 37 +M = 58 + +ModInv = -1 +A = 4d +M = 58 + +ModInv = -1 +A = 63 +M = 58 + +ModInv = -1 +A = -59 +M = 59 + +ModInv = -1 +A = 0 +M = 59 + +ModInv = -1 +A = 59 +M = 59 + +ModInv = -1 +A = -63 +M = 5a + +ModInv = -1 +A = -5f +M = 5a + +ModInv = -1 +A = -5d +M = 5a + +ModInv = -1 +A = -57 +M = 5a + +ModInv = -1 +A = -55 +M = 5a + +ModInv = -1 +A = -51 +M = 5a + +ModInv = -1 +A = -4b +M = 5a + +ModInv = -1 +A = -45 +M = 5a + +ModInv = -1 +A = -41 +M = 5a + +ModInv = -1 +A = -3f +M = 5a + +ModInv = -1 +A = -39 +M = 5a + +ModInv = -1 +A = -37 +M = 5a + +ModInv = -1 +A = -33 +M = 5a + +ModInv = -1 +A = -2d +M = 5a + +ModInv = -1 +A = -27 +M = 5a + +ModInv = -1 +A = -23 +M = 5a + +ModInv = -1 +A = -21 +M = 5a + +ModInv = -1 +A = -1b +M = 5a + +ModInv = -1 +A = -19 +M = 5a + +ModInv = -1 +A = -15 +M = 5a + +ModInv = -1 +A = -f +M = 5a + +ModInv = -1 +A = -9 +M = 5a + +ModInv = -1 +A = -5 +M = 5a + +ModInv = -1 +A = -3 +M = 5a + +ModInv = -1 +A = 3 +M = 5a + +ModInv = -1 +A = 5 +M = 5a + +ModInv = -1 +A = 9 +M = 5a + +ModInv = -1 +A = f +M = 5a + +ModInv = -1 +A = 15 +M = 5a + +ModInv = -1 +A = 19 +M = 5a + +ModInv = -1 +A = 1b +M = 5a + +ModInv = -1 +A = 21 +M = 5a + +ModInv = -1 +A = 23 +M = 5a + +ModInv = -1 +A = 27 +M = 5a + +ModInv = -1 +A = 2d +M = 5a + +ModInv = -1 +A = 33 +M = 5a + +ModInv = -1 +A = 37 +M = 5a + +ModInv = -1 +A = 39 +M = 5a + +ModInv = -1 +A = 3f +M = 5a + +ModInv = -1 +A = 41 +M = 5a + +ModInv = -1 +A = 45 +M = 5a + +ModInv = -1 +A = 4b +M = 5a + +ModInv = -1 +A = 51 +M = 5a + +ModInv = -1 +A = 55 +M = 5a + +ModInv = -1 +A = 57 +M = 5a + +ModInv = -1 +A = 5d +M = 5a + +ModInv = -1 +A = 5f +M = 5a + +ModInv = -1 +A = 63 +M = 5a + +ModInv = -1 +A = -62 +M = 5b + +ModInv = -1 +A = -5b +M = 5b + +ModInv = -1 +A = -54 +M = 5b + +ModInv = -1 +A = -4e +M = 5b + +ModInv = -1 +A = -4d +M = 5b + +ModInv = -1 +A = -46 +M = 5b + +ModInv = -1 +A = -41 +M = 5b + +ModInv = -1 +A = -3f +M = 5b + +ModInv = -1 +A = -38 +M = 5b + +ModInv = -1 +A = -34 +M = 5b + +ModInv = -1 +A = -31 +M = 5b + +ModInv = -1 +A = -2a +M = 5b + +ModInv = -1 +A = -27 +M = 5b + +ModInv = -1 +A = -23 +M = 5b + +ModInv = -1 +A = -1c +M = 5b + +ModInv = -1 +A = -1a +M = 5b + +ModInv = -1 +A = -15 +M = 5b + +ModInv = -1 +A = -e +M = 5b + +ModInv = -1 +A = -d +M = 5b + +ModInv = -1 +A = -7 +M = 5b + +ModInv = -1 +A = 0 +M = 5b + +ModInv = -1 +A = 7 +M = 5b + +ModInv = -1 +A = d +M = 5b + +ModInv = -1 +A = e +M = 5b + +ModInv = -1 +A = 15 +M = 5b + +ModInv = -1 +A = 1a +M = 5b + +ModInv = -1 +A = 1c +M = 5b + +ModInv = -1 +A = 23 +M = 5b + +ModInv = -1 +A = 27 +M = 5b + +ModInv = -1 +A = 2a +M = 5b + +ModInv = -1 +A = 31 +M = 5b + +ModInv = -1 +A = 34 +M = 5b + +ModInv = -1 +A = 38 +M = 5b + +ModInv = -1 +A = 3f +M = 5b + +ModInv = -1 +A = 41 +M = 5b + +ModInv = -1 +A = 46 +M = 5b + +ModInv = -1 +A = 4d +M = 5b + +ModInv = -1 +A = 4e +M = 5b + +ModInv = -1 +A = 54 +M = 5b + +ModInv = -1 +A = 5b +M = 5b + +ModInv = -1 +A = 62 +M = 5b + +ModInv = -1 +A = -45 +M = 5c + +ModInv = -1 +A = -17 +M = 5c + +ModInv = -1 +A = 17 +M = 5c + +ModInv = -1 +A = 45 +M = 5c + +ModInv = -1 +A = -63 +M = 5d + +ModInv = -1 +A = -60 +M = 5d + +ModInv = -1 +A = -5d +M = 5d + +ModInv = -1 +A = -5a +M = 5d + +ModInv = -1 +A = -57 +M = 5d + +ModInv = -1 +A = -54 +M = 5d + +ModInv = -1 +A = -51 +M = 5d + +ModInv = -1 +A = -4e +M = 5d + +ModInv = -1 +A = -4b +M = 5d + +ModInv = -1 +A = -48 +M = 5d + +ModInv = -1 +A = -45 +M = 5d + +ModInv = -1 +A = -42 +M = 5d + +ModInv = -1 +A = -3f +M = 5d + +ModInv = -1 +A = -3e +M = 5d + +ModInv = -1 +A = -3c +M = 5d + +ModInv = -1 +A = -39 +M = 5d + +ModInv = -1 +A = -36 +M = 5d + +ModInv = -1 +A = -33 +M = 5d + +ModInv = -1 +A = -30 +M = 5d + +ModInv = -1 +A = -2d +M = 5d + +ModInv = -1 +A = -2a +M = 5d + +ModInv = -1 +A = -27 +M = 5d + +ModInv = -1 +A = -24 +M = 5d + +ModInv = -1 +A = -21 +M = 5d + +ModInv = -1 +A = -1f +M = 5d + +ModInv = -1 +A = -1e +M = 5d + +ModInv = -1 +A = -1b +M = 5d + +ModInv = -1 +A = -18 +M = 5d + +ModInv = -1 +A = -15 +M = 5d + +ModInv = -1 +A = -12 +M = 5d + +ModInv = -1 +A = -f +M = 5d + +ModInv = -1 +A = -c +M = 5d + +ModInv = -1 +A = -9 +M = 5d + +ModInv = -1 +A = -6 +M = 5d + +ModInv = -1 +A = -3 +M = 5d + +ModInv = -1 +A = 0 +M = 5d + +ModInv = -1 +A = 3 +M = 5d + +ModInv = -1 +A = 6 +M = 5d + +ModInv = -1 +A = 9 +M = 5d + +ModInv = -1 +A = c +M = 5d + +ModInv = -1 +A = f +M = 5d + +ModInv = -1 +A = 12 +M = 5d + +ModInv = -1 +A = 15 +M = 5d + +ModInv = -1 +A = 18 +M = 5d + +ModInv = -1 +A = 1b +M = 5d + +ModInv = -1 +A = 1e +M = 5d + +ModInv = -1 +A = 1f +M = 5d + +ModInv = -1 +A = 21 +M = 5d + +ModInv = -1 +A = 24 +M = 5d + +ModInv = -1 +A = 27 +M = 5d + +ModInv = -1 +A = 2a +M = 5d + +ModInv = -1 +A = 2d +M = 5d + +ModInv = -1 +A = 30 +M = 5d + +ModInv = -1 +A = 33 +M = 5d + +ModInv = -1 +A = 36 +M = 5d + +ModInv = -1 +A = 39 +M = 5d + +ModInv = -1 +A = 3c +M = 5d + +ModInv = -1 +A = 3e +M = 5d + +ModInv = -1 +A = 3f +M = 5d + +ModInv = -1 +A = 42 +M = 5d + +ModInv = -1 +A = 45 +M = 5d + +ModInv = -1 +A = 48 +M = 5d + +ModInv = -1 +A = 4b +M = 5d + +ModInv = -1 +A = 4e +M = 5d + +ModInv = -1 +A = 51 +M = 5d + +ModInv = -1 +A = 54 +M = 5d + +ModInv = -1 +A = 57 +M = 5d + +ModInv = -1 +A = 5a +M = 5d + +ModInv = -1 +A = 5d +M = 5d + +ModInv = -1 +A = 60 +M = 5d + +ModInv = -1 +A = 63 +M = 5d + +ModInv = -1 +A = -2f +M = 5e + +ModInv = -1 +A = 2f +M = 5e + +ModInv = -1 +A = -64 +M = 5f + +ModInv = -1 +A = -5f +M = 5f + +ModInv = -1 +A = -5a +M = 5f + +ModInv = -1 +A = -55 +M = 5f + +ModInv = -1 +A = -50 +M = 5f + +ModInv = -1 +A = -4c +M = 5f + +ModInv = -1 +A = -4b +M = 5f + +ModInv = -1 +A = -46 +M = 5f + +ModInv = -1 +A = -41 +M = 5f + +ModInv = -1 +A = -3c +M = 5f + +ModInv = -1 +A = -39 +M = 5f + +ModInv = -1 +A = -37 +M = 5f + +ModInv = -1 +A = -32 +M = 5f + +ModInv = -1 +A = -2d +M = 5f + +ModInv = -1 +A = -28 +M = 5f + +ModInv = -1 +A = -26 +M = 5f + +ModInv = -1 +A = -23 +M = 5f + +ModInv = -1 +A = -1e +M = 5f + +ModInv = -1 +A = -19 +M = 5f + +ModInv = -1 +A = -14 +M = 5f + +ModInv = -1 +A = -13 +M = 5f + +ModInv = -1 +A = -f +M = 5f + +ModInv = -1 +A = -a +M = 5f + +ModInv = -1 +A = -5 +M = 5f + +ModInv = -1 +A = 0 +M = 5f + +ModInv = -1 +A = 5 +M = 5f + +ModInv = -1 +A = a +M = 5f + +ModInv = -1 +A = f +M = 5f + +ModInv = -1 +A = 13 +M = 5f + +ModInv = -1 +A = 14 +M = 5f + +ModInv = -1 +A = 19 +M = 5f + +ModInv = -1 +A = 1e +M = 5f + +ModInv = -1 +A = 23 +M = 5f + +ModInv = -1 +A = 26 +M = 5f + +ModInv = -1 +A = 28 +M = 5f + +ModInv = -1 +A = 2d +M = 5f + +ModInv = -1 +A = 32 +M = 5f + +ModInv = -1 +A = 37 +M = 5f + +ModInv = -1 +A = 39 +M = 5f + +ModInv = -1 +A = 3c +M = 5f + +ModInv = -1 +A = 41 +M = 5f + +ModInv = -1 +A = 46 +M = 5f + +ModInv = -1 +A = 4b +M = 5f + +ModInv = -1 +A = 4c +M = 5f + +ModInv = -1 +A = 50 +M = 5f + +ModInv = -1 +A = 55 +M = 5f + +ModInv = -1 +A = 5a +M = 5f + +ModInv = -1 +A = 5f +M = 5f + +ModInv = -1 +A = -63 +M = 60 + +ModInv = -1 +A = -5d +M = 60 + +ModInv = -1 +A = -57 +M = 60 + +ModInv = -1 +A = -51 +M = 60 + +ModInv = -1 +A = -4b +M = 60 + +ModInv = -1 +A = -45 +M = 60 + +ModInv = -1 +A = -3f +M = 60 + +ModInv = -1 +A = -39 +M = 60 + +ModInv = -1 +A = -33 +M = 60 + +ModInv = -1 +A = -2d +M = 60 + +ModInv = -1 +A = -27 +M = 60 + +ModInv = -1 +A = -21 +M = 60 + +ModInv = -1 +A = -1b +M = 60 + +ModInv = -1 +A = -15 +M = 60 + +ModInv = -1 +A = -f +M = 60 + +ModInv = -1 +A = -9 +M = 60 + +ModInv = -1 +A = -3 +M = 60 + +ModInv = -1 +A = 3 +M = 60 + +ModInv = -1 +A = 9 +M = 60 + +ModInv = -1 +A = f +M = 60 + +ModInv = -1 +A = 15 +M = 60 + +ModInv = -1 +A = 1b +M = 60 + +ModInv = -1 +A = 21 +M = 60 + +ModInv = -1 +A = 27 +M = 60 + +ModInv = -1 +A = 2d +M = 60 + +ModInv = -1 +A = 33 +M = 60 + +ModInv = -1 +A = 39 +M = 60 + +ModInv = -1 +A = 3f +M = 60 + +ModInv = -1 +A = 45 +M = 60 + +ModInv = -1 +A = 4b +M = 60 + +ModInv = -1 +A = 51 +M = 60 + +ModInv = -1 +A = 57 +M = 60 + +ModInv = -1 +A = 5d +M = 60 + +ModInv = -1 +A = 63 +M = 60 + +ModInv = -1 +A = -61 +M = 61 + +ModInv = -1 +A = 0 +M = 61 + +ModInv = -1 +A = 61 +M = 61 + +ModInv = -1 +A = -5b +M = 62 + +ModInv = -1 +A = -4d +M = 62 + +ModInv = -1 +A = -3f +M = 62 + +ModInv = -1 +A = -31 +M = 62 + +ModInv = -1 +A = -23 +M = 62 + +ModInv = -1 +A = -15 +M = 62 + +ModInv = -1 +A = -7 +M = 62 + +ModInv = -1 +A = 7 +M = 62 + +ModInv = -1 +A = 15 +M = 62 + +ModInv = -1 +A = 23 +M = 62 + +ModInv = -1 +A = 31 +M = 62 + +ModInv = -1 +A = 3f +M = 62 + +ModInv = -1 +A = 4d +M = 62 + +ModInv = -1 +A = 5b +M = 62 + +ModInv = -1 +A = -63 +M = 63 + +ModInv = -1 +A = -60 +M = 63 + +ModInv = -1 +A = -5d +M = 63 + +ModInv = -1 +A = -5a +M = 63 + +ModInv = -1 +A = -58 +M = 63 + +ModInv = -1 +A = -57 +M = 63 + +ModInv = -1 +A = -54 +M = 63 + +ModInv = -1 +A = -51 +M = 63 + +ModInv = -1 +A = -4e +M = 63 + +ModInv = -1 +A = -4d +M = 63 + +ModInv = -1 +A = -4b +M = 63 + +ModInv = -1 +A = -48 +M = 63 + +ModInv = -1 +A = -45 +M = 63 + +ModInv = -1 +A = -42 +M = 63 + +ModInv = -1 +A = -3f +M = 63 + +ModInv = -1 +A = -3c +M = 63 + +ModInv = -1 +A = -39 +M = 63 + +ModInv = -1 +A = -37 +M = 63 + +ModInv = -1 +A = -36 +M = 63 + +ModInv = -1 +A = -33 +M = 63 + +ModInv = -1 +A = -30 +M = 63 + +ModInv = -1 +A = -2d +M = 63 + +ModInv = -1 +A = -2c +M = 63 + +ModInv = -1 +A = -2a +M = 63 + +ModInv = -1 +A = -27 +M = 63 + +ModInv = -1 +A = -24 +M = 63 + +ModInv = -1 +A = -21 +M = 63 + +ModInv = -1 +A = -1e +M = 63 + +ModInv = -1 +A = -1b +M = 63 + +ModInv = -1 +A = -18 +M = 63 + +ModInv = -1 +A = -16 +M = 63 + +ModInv = -1 +A = -15 +M = 63 + +ModInv = -1 +A = -12 +M = 63 + +ModInv = -1 +A = -f +M = 63 + +ModInv = -1 +A = -c +M = 63 + +ModInv = -1 +A = -b +M = 63 + +ModInv = -1 +A = -9 +M = 63 + +ModInv = -1 +A = -6 +M = 63 + +ModInv = -1 +A = -3 +M = 63 + +ModInv = -1 +A = 0 +M = 63 + +ModInv = -1 +A = 3 +M = 63 + +ModInv = -1 +A = 6 +M = 63 + +ModInv = -1 +A = 9 +M = 63 + +ModInv = -1 +A = b +M = 63 + +ModInv = -1 +A = c +M = 63 + +ModInv = -1 +A = f +M = 63 + +ModInv = -1 +A = 12 +M = 63 + +ModInv = -1 +A = 15 +M = 63 + +ModInv = -1 +A = 16 +M = 63 + +ModInv = -1 +A = 18 +M = 63 + +ModInv = -1 +A = 1b +M = 63 + +ModInv = -1 +A = 1e +M = 63 + +ModInv = -1 +A = 21 +M = 63 + +ModInv = -1 +A = 24 +M = 63 + +ModInv = -1 +A = 27 +M = 63 + +ModInv = -1 +A = 2a +M = 63 + +ModInv = -1 +A = 2c +M = 63 + +ModInv = -1 +A = 2d +M = 63 + +ModInv = -1 +A = 30 +M = 63 + +ModInv = -1 +A = 33 +M = 63 + +ModInv = -1 +A = 36 +M = 63 + +ModInv = -1 +A = 37 +M = 63 + +ModInv = -1 +A = 39 +M = 63 + +ModInv = -1 +A = 3c +M = 63 + +ModInv = -1 +A = 3f +M = 63 + +ModInv = -1 +A = 42 +M = 63 + +ModInv = -1 +A = 45 +M = 63 + +ModInv = -1 +A = 48 +M = 63 + +ModInv = -1 +A = 4b +M = 63 + +ModInv = -1 +A = 4d +M = 63 + +ModInv = -1 +A = 4e +M = 63 + +ModInv = -1 +A = 51 +M = 63 + +ModInv = -1 +A = 54 +M = 63 + +ModInv = -1 +A = 57 +M = 63 + +ModInv = -1 +A = 58 +M = 63 + +ModInv = -1 +A = 5a +M = 63 + +ModInv = -1 +A = 5d +M = 63 + +ModInv = -1 +A = 60 +M = 63 + +ModInv = -1 +A = 63 +M = 63 + +ModInv = -1 +A = 23 +M = 380208a9ad45f23d3b1a11df587fd2803bab6c398d88348a7eed8d14f06d3fef701966a0c381e88f38c0c8fd8712b8bc076f3787b9d179e06c0fd4f5f8130c4237730edfafbd67f9619699cfe1988ad9f06c144a025b413f8a9a021ea648a7dd06839eb905b6e6e307d4bedc51431193e6c3f3391a2b8f1ff1fd42a29755d4c13a902931cd447e35b8b6d8fe442e3d437204e52db2221a58008a05a6c4647159c324c9859b810e766ec9d28663ca828dd5f4b3b2e4b06ce60741c7a87ce42c8218072e8c35bf992dc9e9c616612e7696a6cecc1b78e510617311d8a3c2ce6f447ed4d57b1e2feb89414c343c1027c4d1c386bbc4cd613e30d8f16adf91b7584a + +ModInv = -1 +A = b65c1c28 +M = 5036b6eed9ecb4b2740883ad16e4c8ea32a9275e4e5df38a37a623b9188ac6285a13122e614e2bf47af5d1bfe353adcaf5ae635d5f285f0fca9c82b800d7df8b33410027c7c2b3cb62afee4ee315ca51affec0ca1df3f9daa17ff032fa4dfa5465ae8de42971b791cdd860055bbd38e7e27dc67e9ef54a07562b2cbd4c8453324707362bea1d978d8ca29af482fce799cdb895579cdda3426b77bf23b970fe21e40341123cc414d39dec13f9abb97582c6488b09acb4e16c74ce6f291a26bb9d18ffada062c1fb0cf7b4b4e566177f53c2ae80b07aabbf3b842b5c138b31b03dd52ad61d54ff8f735c37e06c7b2ebe57949530fcd9d6fd1d9b62032801 + +ModInv = -1 +A = -bf4e7af5 +M = 1a4f691640b384ba6826e86ea1fd486af8964b4818b235cb4d83c64a04b202f42bcad1974f7f003ee07c7259207e1e5a8958ad302d3e374b53e5f8d205d415f2663808ad7f4e89322c3e8d9dfd6bf76fe7bb1ae6998f2ffd2376c1fdf21211a7324ea816a38e7741bdaae3beaf019daeeaaaa3bc8075ee326db1e799df8c4efb3b1479939c94b3f4a33b29589d819c90fb79bcd2368bd7159bf6bbb58fc9c24293e113028f427d2bb6dfa23e7a2ac704c2bef1f6b80b367149f97c413aef2f88abaec80760aaf3a947a2d4f33c3b072e1f37fe7b9c6bd788120bc3fd70e87a5538b4486c599cb381b6eb58eea34854702a8d4293433e798a0e81f9b0c + +ModInv = -1 +A = ed13d1e9e3 +M = 4f46d73477cf2f4c29cbf3f63a0eb1b35a6054838e38b52609cbd6c1ebfba18f0ca109de6e6f79d605253f307058f10128d7c5d4ba48faaa1ca724868684d6ecfa4d8a6f090025291ee979f5558d858214dd3bf2723deaa933a0a95decd28f49f414602b49af3aa5d629f1f033f58438d7c47d97c5e2ec79bb0e1dc57c47ba500268bfa986502637205c5a84c812ab06c15930b68adb5a900030e56599e90c3b5ef7475278015f97e1bda755fe1f014ef1d7e893b0c9049e85d62cf30e9ba56dd7d3a0ae54913be582490b3b5320dff019a9067509de6e53b861afb70639f08b7f0a674d3ce0216ce6746772b2c753574d99d19c2507759b36af971e + +ModInv = -1 +A = 550c618a9261 +M = b0589224c23874e9c8e3801943aaf51faf3b7004bee4f7ab81fe968e24341020003f9679a5c140bb7aa4415c367095b9eabb84129d9ca5374379d5bc1dd3d8d74ec82648266838ddec9d4f6ebeb4400873189296772783c8c8d2761eac708b0f3b56079573164a9eeb0203b0f2b5d2a7977bac41ec61502ae1fc8851a264abb921a5c0fadf6031265b9716fc96170a27b1519df2e4d9af707c289904b184cfd6dc3c3bff72b36ba95d5ec73fc31a98c7fd59a0026355459390c87cc36492adbb4bb95cda1a4658622ff19b46db76078d954e504890afe0b0ac88b8e57b47b993f3cfc762b8a158e9f0fcf8e6e9d6a12a8161e5fe1b14343b106980 + +ModInv = -1 +A = 83e99c51e692dc1729cb +M = 53b790afb7f2755630e93eb31d33eb744c09d37958411bc7c1c670e891cb7911759e028d9839fed00b3a7a9ce5b10dc2dc7e533d1fd7afb82e31f8d14015e000315726fdf3481df7bed7ea9f3a863febcbdfd41592abd44eb424c3c28b0ee6b86fe1e98e4edf8f406a5b227c81a04703c34253a74c489d28fa3adf23f8b23208fe1080b595a6483a52e03b07a9e4700c56ad99fe6b7c680b208bd4777ea445037df312bbd8cdb722cf4b447209e37ec94342d8627da9974eb673ecd3b8a887110ebba1ebf017d59f628cb3773fb4bef03922bdb2f30dae01b0ac62e8e6bae4f2291bbcccc33d91ee0a0fb51bbcbc51d1598a6de04cece + +ModInv = -1 +A = -7d69e9c4f718fd250c67f3 +M = 6d040c8381aa977c7a6f75873e9e818bf64649d7bb1a57974c64a267006625f3e026a8305f070f1d4c5d0a9973cb7281273cbde36c48f6be6bc5e74a2e289ec5cae06e3dfa64da9887fb480a3145b71d72f3df8ee1f00714991d662633f2e7f04b7f835daa97c130465164efd8c7dc0760ec5a310c5596fc8cccf391a87535d5752a0bc73fe15d7c1c77b545cee1fd0829522935efbd77ebe9c8f758fa24ea2f48b32a1f88c1977388fd6e80614952f7d2778b841936ef8bf64088b0d61e9c28aa3c357882c281618a142b95460ae1769902abf6c2aca486abc2dfa36f4cfde65a9d316bd42f8067ba44ac8ea44814e3e5dfbc1af89 + +ModInv = -1 +A = -9b576d64c4905c0914c25b99 +M = 59a2b4dd8cc9cdd174019caa0457acabb82557b48817c55c80b3d4fc2439859cc9801d2f28250ebab6f8f33ecae299a6f6056eff6f01835404232e1667fdc2294255f1c02dbcfee5984712a2a1d64d0fb267b7a29a152b676579c3964c6993a11012027fc9174a3140ba58c212f9692fb252f9f8cb8ef660ee0dad1c34c91f4452da6c3109761caf2595894f462530a93c39229c3500f0ada69e8ac0a477ba26042ba9689fdc45b198920595771399ac115596030cae6c028ab19637574cb8dc4835d321c0e55a1fb1559d3b5b6a806097d8d8d5ed264a6630108ed79cda2f6b1d5822d7b023fd7e3642408ea4ff6b17a4b406dd29 + +ModInv = -1 +A = -32a7df32756005002635f5bffffb +M = ec63d15784c5df6a2fea7c8fc16c114094e2b129cbd326d3fc3cb21fbabececd4286fdc91d1da49907b0d009cfb87b19abda1e0a003d8d918e7e14dc9bf8a52e018eeff621e7e84222dae03e6d3d6f894ce5987205e6187762a0b90a6cb16d68da32714c92ac60a0d923512beb42979f15cd1df27cc2935283d36dfc36c8056421e6d341c52ba794de84de33fc3422dcbe01110f9489e6a53fa0cc5e6641cb5467820bc0e52aeda7c3a1c0138b59841e3ce26025a70552e53942601adccb0f2aac70eae998164b0447f9b4d1553cfdce84821d200764cab6bc4b0201b9ef9654a4f9d4641a7dc43a457647c54e6f4abb5e253d + +ModInv = -1 +A = -7aafe6aefc3cfa6bb9c4b5ef5e6f +M = 9bf49f4f7feb318d98a39cb015f112713898a05f9b1c46becdba9dca2090322e88f56db9ac4a3d19a50bd95224f1a6bccd52c817cf9e200994227a15d9fd0c6ef60b0e23d547a32dc64ebadd7112add0a85d1154b30e5e594d366349ba623d131335cf59fcc1267da08ee85d62881d4659f8e12e6b7d51232e05b4a5fc6d6c7be79a52b66a33614733554577d71548bf1d0ba13909011db0b12550486a8c28a75ccbe7bd87ef0c736d6f2d6fcffafe5d2ad68c7e7d21dff8a9294ccf49795d300da1d110598034cdf37686425b1d24ce6b7baef40b43280e82e7b379e1d9f5d22d48a986e1a812f12b0e598e2e7270044a9fde + +ModInv = -1 +A = f1ff7a3c304b3f173f75a07f83d2f947 +M = 8bd6f4c31662425272e5ad1f426fb340329a7093e7b0494ffde5b0d054ce1c8a5365178f78625c241be0d127f972f154e4f336862dddfac7f6011af6a1184c581a078fcd5db37631543324d726e0f0e303f5514ed33572ad716cc0286a1d982a6bbd249d3482413f8de8ad949c8092e22930d15b3b37b0c9f24aa79c014953bb6d483b184120e2328f4c97737e5119460bac2084fcb4cbff681be09a36f0fb9eb0293740d1bd4f282c5fe73dfb5235356eb90fc5c9404cef84db9bf29f39203c0836c0e8f4caf8606f50ad6273175b67b17663b860f0bfa54fabc30f7096f41453bbde4befa2a0fe92e52a10c4f3f288b4 + +ModInv = -1 +A = -df36803098d4dddc368b43ae829092bf +M = 655090b140dc89ddedddcd66348a2638070a0de10f9f6dc4e2ee7f5b69ee9c1add5e981ba64838e21ae7d50a5b7e6daccae97553c59895dc4986013b0414f5d0b69e847bcc739637aca3bc1bf38585e0711e96a097f935e75dcebeca55631c376512fa065378a53115ce425271c782bc8947c263695423d570c589d2552462d4a3f17f391ca0d9d4d6b9f8e43360e2757365d61c428edeab183dde9cc2f869f15fb767e4ab733c92e44daa83831b2359962907914a97b1a3aaf99efae1bbddfd53ab4a390ed5e64a0df9433a96754633d4385f5c91c2d1d78b5dd6450cbad018bf122c0589ee168dc4e8d7c2184d6369ee + +ModInv = -1 +A = -bdc8d611ab45f868ea6ceb3add85102adb +M = eba5af92222bc598d8252f26a2eef70089b127af862b63a58c4f58d8c85468a18c2af2d40bc9cc5ca9e08ddb14ad8cc064bbf3b2ce4a244afac8aa286014b54ab9c8828a7d15385a57225a926c98f8c2dd4057e97fd23cbbd068beb8a7985b23070fd333256cf2b55efa5318c0aec7b4f4c63dae07119a906a0483090561626d5be6b03ed23952a9359da810fca0118ca742a22af370e247aef2691a8ef01cdf1b015d7eb80866bcab96323be23d63aa87625223f19479b2a886a72056f367cdf9f3038438cf6a0f56a0f53794c681373d717e3c5bbd9a94059da57b757903e1a5b1d8ef70ada6b4cc37aad3a902b8da + +ModInv = -1 +A = b2baf268d1c3733a2a5861c461dc31850b2b +M = 97949905c11c6d877b401d643ad210b6ebb1ea102a149a86615520a9f6d0b0667fdb904c0f693afd2908f2a7e0f526222d76f1ae5195586bf943ff99a040854215dfcbeee5d42b261ced860dba3f3c3be4dcc2e1360ecb5ed11f65eddeb535a3c3692abf5604670548861e534313b4e165a1a6267de054395a3eeeabad1031227615fc172f7b028b229955d9d26a7ae7f08025d93857a87d06c291d41db254b2ea7f26144e4b01f6393ac434f6d08ff18d6ca9c505ab59b7bd00cabf5fc14e574e12362b2e88ee716b3a7cd01fce8e2570e3fb2f618e4d3f6e0734450b7363dccb5dcf85b65acf354fcb694d2e2a4e + +ModInv = -1 +A = 42900acf09919063135eec447d92234bfe4d580a +M = 2afc752630a05e43537f904508a89b0c5ee1deba5b69e86635dfd48458fb042a5db00a61a15bde29320ebb8e3b4be9be19c2bd7635d6a36eabb625ed6958ef29a6d7e7ba703757876aca5ddb5d40394659d632deb7a7c94b3412e846bd914ed4839a2567e5a8c6489bda8176cc6bd3fe5b396026d3cda24225e38fe086d5f8c2a73f98a326c56fccf934d553bbe66fdd6f98e36417a8919d4bf365c36c50e64183837aac0582dd5a9af454faf6cfe991a43ec2d748e2dddfe96c9bb36ef9c05907512c6a0cd6ec9d528e63445c98f8b9d2ca7c4b2590ef709c952fc888e54a8adf6a064ebfd9ff1f9bb41e6725 + +ModInv = -1 +A = 82b58e27c0982cd4c9829fedbae18510ccca416a4001 +M = d59d33d1e403ce1fd2c0c9ef67e0f531493821a4afc85b5e5835b12ee7a1309ac5ee51693cd1f334a1f94bdccb3eca6ba3cfd3472ab1fbbc2edef6ea913bfc5fb311a87e76d1808633de6fe128a43e755e729b0ee45d68622c7bee30ee31a392cfe0262bcea08be04cd7506e585eee0bbe03578fe8df494d1d0e465030c4f334ff020d81b94ec1c9e06b140c0950e124139c74705ff0eb3ab90f480b9661aab2acbb5279dc67a720d630f90079a2c99a445b1e12bc2691d41108373580613290e274a37881eb7744f15ee088baaaddc058ef99d4b59e545845e342d4bd3663ca4294da87ece1821f753bc6 + +ModInv = -1 +A = 51fa9629e3b0d130c0aee8efa93758512321c99322a5 +M = 1105d25fe6ff966555bf9f54da6abb03ca8270c12c4a1a87ec7c733d3d81ca0981a4c79461d0b15acadae61c0b6eb593102d4ae44a24188b898b2fbfe26f3075b991d2ba5b772103afb5ec8aea02ef7159f58dc539c2f8009b0a7d529da7122c82ed58ab56b9902d6d1e8f90be37ad76c95a7cfedb04122d2f9de8509f12f375b881eadf6ad32cd278e5b72ebc2054019b44213f380315931a037059a4f63284838c441eb0348b7fb3fbaf93ea89784de05a7780acd39fe834f10063c1bd7703d9e265c9e0406bcbd73d9037debf7e1f221974949b2d7243f3537a536fd66c3e02a61a17946e1350897f88 + +ModInv = -1 +A = -4865c7a33f6100f0de716b9bb2f6535a7e07b6dffce8112d9d11 +M = aecac78ed4713dc75fe7b0fc994096c2fa6478d5f5c2f589dffa028025439f68498a3fb82aab32a4be3a11c2ad215a13fefcf1e447e77e935360a0e7670ad107c9c660b768fcbfaa6163f67b71f484c0ce15b3a78266b12e45a871f1e4f0bc44518b478efa56c73d57bf501b83e10e4cacb3360385e48f3057ca8fec676089b1fec32ae7b907d9370f24733ac8c59d892804b60ff0ccec7a0e2f10fc1a6d8f9114881dec77be1923bee3317960f2a69c2a5bee8f25e975dd5ab9d27b71191573762fca454cd798c0f1edde9ee75f5678498234aea4125db1a1e539b311df9ec0b083745380d4e9 + +ModInv = -1 +A = cc28ef928721ea0e4c092d3238dad5c7d4060e868df8de4770a1e8 +M = 27b2a947b1cab0b58efdb9acdc4aa60b1c95fddd7a73b82d8e2a8b8ddbece5f5651e39b7d55fd3dcbc125f3e0a3f7c4dc4c594144fd4d619c3230c8a1a193fc7baaa66c658858d3fadd6245d61b88959d17a9d2e884739b16dde34a82cd29d6af3dc429cbcb660b201874de74ffa649be9fbf048f76026aac08eebd23f878dbb3bcaf3277c92dc3c5f09aa7347b64cd24dfc3a20ebe8ff2efdde229035402d79f1856b83d936582b5155759e48dea1ed519af9bb5a91f7c60c1fbd4f49e1ae0355aed131cee041c1f58275224a1ed42375969f5257ad90cbca83da845ea241259644903193c3 + +ModInv = -1 +A = 49370f9347bf11f729379e2b57b54f05fafc58a83e395b8e9a0d48 +M = ba0024ba264392a674f05885fbd6b18161993e19aacb6476aa9fb4198c26205ab0c4aaa1df73c3d3023cd36987541a178b004baa2afd0a92287e8ef114ee983e32c684bb91479b3a6461b1913e4eb3bf29649a5b31fa2057d435eac24803482e944fa43a558dbee95a4c19f16acfa78fd78d535c6b83a65d44237157d32c90e59b6b3a3dadde227534b6d94c92ed072f77f2138d2b3e521a61cdd828a3607dc79e4768f4a5f711744076485d5a1033eaf43c2c01e51f51e0663e6b7b0930edbf01163974c9d3b676d6952a0ae3935d8cd51513f3f9472ebab110ac876ad2a47183e41762280b + +ModInv = -1 +A = 67c52fdff0f17cba1c2392f10cc4f3ae39b89a01cfe9d7627bffe1 +M = 4f3cdec8a6403317c573a317c33a4288d40437937618128dad6ea5ee5f2a536c38ea766e8c201862b1c8362cdd5512e118d0a9b4adb4b61152413bb028cd75fb94be726b358c7b66522fcd31fa754cef455425577fcf4b9891098f17b984852887d12d6ac48ffac019410301e049526650fc749fab8c68f82d757295412239c0c9cf11d0746698823c5a7da165621640b23733f887b136b3d9488fd03891fcec454d85e5fa7d9399ee7bbd862ad7bf5c5e9adadfab88a493aab1dd7005e22bf0230a13579010a3d6b813a9dc1e74a3e7d3ea7f17742051ea58bb08d1d9a2b0f75bdeea9944d + +ModInv = -1 +A = 79e41ee87b1b4a0eb5422aa12f3e9786a457a917352be67cdbd76923 +M = 37a53e5c1fe3a3d8fc41bc0412a0989a944032228d68f20e1ba2a44b50a98d24594a7b1d89f1d78a7349eb38bde845bedc2b4869d937db91ac4a3ff2b051956e29be65777f1fdde2447e25fe0bf4db3d4a635fa490a0ad91edf9cd521e49e7fe2085ffcd7e44e299568789e4f060b24df5027d157fb35280250f5a91969be77a59092f5123f415bd357b8c46f9b35e6907188056510999ad79222c34b076eeaced47aec513d752a13a6c7ed42d76cb2f022653bca0d32d70c07f3eeead8a64a939b3d9805ce9250223589096b842a6c19f0660748393b5f9201bbf5b9c60a2e07304c73ace + +ModInv = -1 +A = -dc97e11898f2a504fcc0f6f2473ff1919aa4e5cddb414f659532f707456606fe +M = b045cbbde7b326b5dc92147e7247b8af2116292e80e27686d045762889db43d47f37549d3c9b67ef876b6e580a3f108895731d21c8e9fdc8c7748f7ae10e26b8baf27bebce66d2a037c522a386edc0b13e8fc9081339e7b2c2bc5bf625b617cb98caecd28fecc27da5c09b051583d2de27bba3adb2631bb2c3ca7e74fd542bdf7c9fe89f2706b859f27cbb1c4a913d3f2802056031d70064d8cf2b4fb5aa5490f14f91f89caaaad4d687af06980c19b726f94342cc765cb66021f0fff285334618a90bfa0df0c41b4c67be5087e95e519a1519b0ba20674359d00f104a013f693 + +ModInv = -1 +A = c787b48de7ae21896bc644515cb81876e7e37815bf1bd565e4800c4c2db7fb108ef57bc65 +M = b352efe2227cc8390732f9f50be215e34a6e96faa2f500898faa90c91a2401fa7d2284673592af5784c3051933e7176e264bdcc6d63c8df36ad86a7ba9b8a42afa1a5bd879163abe7b3c83dceaeafac62ca36daef885d22f5e49e2039983d467f6a38ce06567fd862082282d50f3799b5cb5fc07eaf75e44ceb8edeef8b5411d1e7254c9c0ffca88c23f94c49693429df280397c52f7442acd8c8422b057fa867c3530942b1d2bc47a2af0b1edbab5592ea719fd754c3aa5c0b9b255fe624df09ee85b397518545c07750acdb62aa2cda05492ef6df985da8285e9d4 + +ModInv = -1 +A = -dafcbc22ff03513b54732daae54c9f0042882e00dde78769f2fda5b7a5528df9b96d34affc7a +M = 5f297da663853421517d27eab004e4783e67ac2a3a97553666dbfe99567c999ac023249c88a9e55f99808850fea4f52dd869f1c7c912a5ab540c2ef1f78a33e97ae7da9d90e6ec2c1e39c50b23d0bcc54f69c2e0e6c53f9c8290cea7bd9bca09d61dd10c7f0ce04ab7fb9aef8fcd7d9e9f6520aaf93f2b83799e8c7d9747a86c973edbf667556adafc8627c340d69f8e0618aa781e3c3ff18fefa30409787d22c88b33718e982a993d474b4e43c1744628707b035d2487baef8d118f8a1d1185cf28fd9f1308d876c0cef9eb59ab59df84f46876252dab753fcb39 + +ModInv = -1 +A = -3b536f80f892a51053b584a825ecd461bcf6e890084b174961c26f57a818f6282530f650a67fc6db +M = d3316b406afed3e1e2e1e87ce3a2cdbc5cfdd401ce3099d0eb5334f7ed71cef4f72fd683fa4f1f126f8b63cb652346e53c75f9c0041f99a06d07d3b1893cf751143727c86be9a198c6635f19012e45b38c1be0d0f434269348517a35ef467434d3528c5e0acc9a2a560c3ca8d540b62d7926a391f5b8142b00d7c9dd8529c71a35bfe3a962c3b7466ed4f9ef51ff060c3bc883d3e3db290682454cf52051ba011301701215275d6693f0f8f51b55228abddb97d6b1b07db22e4c3c6e09f796665e1ef5dc5770e94316db81d3a0aff2b0d174c26b5e3148bb0c + +ModInv = -1 +A = ae1db86bfe2ae698ec53cf4186452a02e7cf31a6ad59d486e3dc563c4a6ffa021a33a6f0626b39316053eee9 +M = d7d84539289010c37911801846159ff86a721d03cbdad7a1d97f88371019cd8ed0b50b6e274128a4b4097773b3847e254d38a7dcd0425240141a14e3c5b8137c70ed723dfcb701dca892487f15cc2ec0c29b29167bf84d6a3e531153b95aabc3659a5aea8d012044f041a6d0951e58b59970032b0ea4934c9f68dbb047c2084a3f24e17610bff4d45ae10628125df50cfc2b51b97d3ae5c057cf97395469ba80096e906c3091a652f55488c72f4304cfd5a3c60afdaac569286e86f48f67ab850448de71f853f6f601e210ea4c9b621328cd090f9e + +ModInv = -1 +A = -5bd4a749ba9081b581bb3e69f22cecad912c5d50a29ceb2046949c2060fe855c3c278649c3c0f7e9842bc46c5ada +M = 1b47fc89f4cbe808463816d5d478cb2234be77f8bd116c3d44f29d40f9075aedcf113361904981f8b835833a6232e109e7a221ae3f9dd209143489b343d4f4951c7aa9e54f1ef87ca18b908d044a3129e52d08e9593373fb2f1dc8be4bd82a9019648a96db83730a21a5e9f8dd226d0c2e64483694096e920a82ce39143c4e6869ce473a7b50883b71042c9222abb096e4ee39f56d54955f7d7b9a7284465b42bb468aef29d06fe3c582c45b04f2f44fcc10dac4bf5e5bbc40aa6ff3a4d47ea2846bf5aec0d62c849fda359b84e1aef79e5705 + +ModInv = -1 +A = 636032d76cfa97d519e094cd856d187daa12b4d3298e83b94a6efc2c78a6d96267b538a1b860163bbb371f3bac1ad1c6 +M = d6c4656919d9d0df9dd019f36c6eea8ac9e522680d09a2d750df7cab96afeb460a3387c1de2bb7088f4148d04fa9b0763c597b03fdc37f69f273f4585ee24e3f52e24571b481c8ab6dc29b33edc339a70ab1afe386a91890635bad1d8c0058a54f1cbfc1f82ec45dc19c948686ce137cc7b2196d78ccd00f4715e960222d9eebecd4ea1ef480b2dc74acda341a1601c189cfc8b81e731228663a11c5320e76660a9a25386abfcf9008ba037f919d172c44a0aa44754d33a45b2bc9f62353e50a407286cd00004663e79478bbbe2e7ea291 + +ModInv = -1 +A = a3b22e297f1530f41aef5cd2f29d5433dc0d13957dc97f1c0fdc37da2cf2b3e6df1f599a6e413f0e50df3d15a236faa571ab +M = 459bef74026427cfbf89576209a1f358c14be614e6a362f47144eaa2b3a9b96355065b646c90200093c7f3547b1d4f69c797a5a5e4ae3a413f8e48c0399b4011ef8bbd03e8eec194de45fa985178a34fa1f950f104498d692ff7b5fdae594ee04e1ac13a6d075a9f63a7c10dd0392b9d5848aaf27e07cef4501e9e3a3dd42818d91b4833894af25fc7107b8cfa670bba04eb37794ec4fdc7503dbb1580ae84dbabd04fcce6425fd87ae6399a6f35ef6b80a34c74a9e2d8dccfbb87bd8d200434fe714e92fe2b526663d9dcb5f95491 + +ModInv = -1 +A = ef8c87694a7e6675586a08c71b43c0c78f3ef07d33b7bc90e1761c17c18845d01a68d8c980754140f8c4028fd8c0694ec48b2f +M = a32f88b368adfeffe84791638d81ddca389e6b90172cc5ff236413486fbcde757e36b5db395498b0f68510ce1336ec4f8433de9657105371636b1799291b193ffc981a4dd64438081a58d08bd06aeef71f4268d8ca813a9421df9e193b394ea5ca8962b6102a019a0d89d1042190c5f56e559e907d163fe2ff93dd5cf18c0b72c98ffbd54187b9b4ee2fce18baaeca5c210524568879f38b6e496e395914e71d0ec1a95ffaa03658cadf729a32e748ec17bed80b5f5bf169255141bb882d8c0f1f146c3eecfcd9be794ac6acbc61 + +ModInv = -1 +A = f62093aedfc0bc0c6ee743b219aa00a2a25a470a6b4d2b8fe92d5b4f8c93ec4a266c18ab7aa9fabe8c20ecc08440c0c1d36f32eb +M = 7352ac79bae655915a49a331a83ad9f890d9231406e5edd6ca830aeb564730578588db3dbe5a75ea0c2f0c8de48f4f483828495a9b696a60e1ff2dcdee404680db0a2e2d47fe3a6bbaeda0ca9c5a5156b625c670edd119a42832ff8daa5a023eba043ab1bd9eec5f2497fd4f11944c28bec04e20f92dbb54550adf8dd8782021b3eba309f7f3ba790f8fdb4ce82e8149ee216a58f39510906f8c5b1cf525d511834379c4f138b89f9f30e5c51560b4f56a863464471774658f8614676b32e083f7b2a83670cbac32f2fcf8e228 + +ModInv = -1 +A = 290ac93d87f97a0e58c8188b08466656a43bd4e23f82e7beefae8a995246cb5358244137344cebedf31cedb5da5abc1e8a52956349 +M = 139af53234ab703ef5c4943171bccc98fa06dae351b9c93a6fe6fa7f8d9aa10bb899dba2650153d82145799bcabe32853dfb49463b8486c5bdaf3c4a443db87cffe0c94da836eca6caab58c6b2113e471ac295cc14d0481d270518004d250999056348f20eaac628a04cbea6682b0b4d1269edd55df8516eeea085ff77180187e3505f3c97caf110172087814fb736c501346a7b1caff3518b0b3f7e6fe920a9a2ab2ff84ab719acea176e52a3020d5e4e62afce35facfa7974c1e2c5a7a3bdfd16a7fee52f738966059dc52 + +ModInv = -1 +A = af5801cb6c4dd0f1110679f1849dc54e59a2a1e3aa8098596c38059e58391a7d636f7d0a5bcfe5134e0dd57f31b7efad06763b32fa4eab +M = f48bcc2e0c1e19b77717ef3137f8a8efc89648377154ffce68ae0fd88b41ae72ad4390ed2d93634f4d2eed88c7e4771394e1c6ab80bb282b615242a5b8849596b319ac71e2971c12886f34c2f4d0a0c7f352a10e9cea195d8705ae5153138f506e6ec2fbfe69ef33fa4b8ca9351ba528dac89b8cd0750147957d6146221622c14d38f6b65491f14b532a181639391a3ab85b0ae1c5adbb4b6730d6537540027938d3b670471250e136a225ab4e07af7273356d10c1fe310587f8959f4df53afc575e8593ae8d1e3c26fa + +ModInv = -1 +A = 57d6346ee85628b8ccf4a0755e6c3528e1f9ee0545203e4b1377bcd091d747818e590e63fadcb2325083808537c5c711bfbeee5ca3512d +M = 78e8a19c03f3fa715a11d0ff2a19493d8d3cbaf8fb6c6beed42da29842484d7e2e9d0a268cdcbc299a1d83c6e3bfe2962bf8eaf416cc38ff0149ba55ff8149e9fb5f72a009a515381f749b8fdaaaa84ac4dc47aac180095962c04a1a3d63406b08d6a774459e8b75d74bcca59f1f0be67bb1e0f11834cf076b72ef0f39c8af570679f4c2b6827a7e941bd6014ecf82dce1563777670718b147f12d75ab63b0e8fa3b1bba3250138c230f5666c7340832d820ced9e822c9cbe2e508beead88d88464b5ee2a06927113dbc + +ModInv = -1 +A = fb7ea36aaf96c9555c1cf6bcbcfbaacbe30f40ea9cf52f8d3e64fd0fcc251e894ba22d86a2d6ab16dddcfd2e32f25de0da7e62d78518a9cfa9 +M = b948da2b6a7780d2b42907914b3d57c4c1fc855e0237dc0984b33d6c690fab90307664d315319cae32c11f510cc94898dce28625c9ae2e332f20d98064353bd3a30719791e3aca259ee9f3f4decf729b7caec282de2e5bf9ae3922749acaeb5237cd333b953671d51e405bc8277c383342a91bd74a54ea1a03209770d2c00442c15e720718202bda44ed80c7e09dfda8b8fb78ee235f798453a2eb9ea3f2f8d616df39be0ff05fd89571c7b0985a8d96b8062a39777e766b3e33fd4907cafab9b3c32ca10d1748fe + +ModInv = -1 +A = ca21e6358257d2805b71bb1b73189e0e41cb0a53edfca5ed23e2e3b6bd95cb573ae063fef6b36f69e0c87758ffa6f7724419730ce294bf8a338c +M = df12f9dd018b5da58a913d4f939d78b987b9a4b06e81d8fc681d8ad4fae2a05ce96dbf089c7f94887c7c1f926ef02412f4f21456fcfe9fd022a5b07a4feb5bf566bc08acd7d998b2c5f8a88d0f80a3946ecbaca7efb0e6ef8b0891e7aeb9c8b5eef6cf89fcbd4dc91cc34b9ddbe8ff855b3a1cfedec50d63f557a6bb0321f92f60583230aad1382068298726cde6f8435bdbbd0ace63c477aa6024b21e2c437a85c4421599a2801d6b836dc02f3626fc90ce647d297c87539227e41f30fdd8e2f0699e858fd0e5 + +ModInv = -1 +A = ceeafca6d1c8e6f76c8af75591bb5e0449a9ef44651f1918c48824da6494546dabd17843b9a48ef3286aef0e0ee1c3f6994cf33806986c8ef78566c983 +M = 818752391688a9b3bb90f1365e808d7d04712236126d85315c72ca2225c6105f9ecc224480f519f8f21838c697cd1cf892df28b7d36364b2a8234138159d86dd472ec74baee2a3cdc631f94a22d41a83982f5b5c6d6edd54ae09f52415f53adc9352c281f38aea416f71b9fd6c66728b959af579e860582f62ebf79ae07e0caf50174bff84cfdb8a8b469c3deedd653a022d6811ecb71d0d7bc17e845c0cceae0c4995c633e0d9c5b8667e9c6f4912ff3a0acb67947768f2e54449782c6f7d454023ddd7 + +ModInv = -1 +A = -7ee349b263d6a37fb6a3e6dacb49940ba4c0bcc23bb113715bebdad4b936b02b83e48efa1eb0f3c308d7796b534f8b02356f7937cef0bc8b075de6bfa195 +M = 35ee7d6f83177189355537ad721bd43a75ea0643126cb7ecd36845e16ffece5b8ac3ff3549cd1209414426cd1624254d1dd09fbab075cb4eaaf531601c74fc88d2009fa888a9eb5f563e92c369d2f36fb30b2940d8bac6ed73e70065beb16fa6c79161f0260f4a1754a8dae112ebdf9de1c2942014fa2fcbf2dacd2396072529fbc685cc1b1c5f0ed4402b3d07bd5778cc27d22921f7b876be0a9ab65c5f8ef347175a842e4b276a58c170f0a5bcc45563079c6a58bdebdf119211869c592c3f202b26 + +ModInv = -1 +A = -3f79af93105832b2c611c12cc11b23978b4fa5f43a218eb615790b7d1383ef780bcf89df6214ad186202c74e0d96af914db765ce977138d13b12d50e852d65c886b2b5 +M = 4280519f416cdd99ed0b73f49cbb0a1ea63ee4c68ddbc5fadf82c09f23fb60a304192f8f1d91033a9cf7723606549bef8a81ae92f56307de7ba1e083a5a2c3e5a5564e6d0e47c26b66054bded1323a446c70647bbdfc6d760f5900caa0273589ae61da007e644be3e52eb9590bfdade005ed8d32250e146b80d5c809e000c9b98f6b61341eec05f713a1acbdb8919471dd82a4f8de57910a232f5e6725302253979d25320ec231d50efc3ae67cd865d85cc79d7c2ffe2df97a0efe90f448 + +ModInv = -1 +A = -89a312bd9e4da63ac4b1064b210238d448e2d174bef787d4d0d709b4e73f6ca94714a39699d02d5a4ac708ead2581cf5b50d3bf13c14c1b0e7c45542e64e5e0f23635 +M = 9bbc04d9fef7733701ecfbf66d932d8b520e031182629cc3ce1a453b34bbe2b1a3af4158c56103c75275ffda51b6343a877f444f6688bb4d1c73479a391bddaf08e2046bb9a61fd23810e05251536bf82d86f4557ede2b4c33c8f3ef87c121dd84a156ca9e350ab3cd4c05827fc1065b1bcb5826e6e0e6f3e1cdadeab103f918a401ce81ebc8c70043dacb03764e4acf14dfc284297abde81a92da9c6efe48dfb8fab43753488195ba47f0f348e9e9d67dd88ed01e9aa2943ddb0e56c82a + +ModInv = -1 +A = 646509fbebfa7985f405692b37b3876a92c9949d0d11315e77b3b56b96a61b9ed5f23d5a30476bbfc78fa808459c94451a4f3654f11b46bd06478e866cc0728910aa5f9ce2 +M = 56e1e3b9e0da0c32f820fe54fe1f2c77510624fdaa4d86dbd8d7494a5617bf1293e4530c55c51173eae23aaabf4a2bcca97e32bbcd1481039e070fa71429a33fd9d11f65640bd07fe7bf7ebc5a9084ff5cf26b6d21ed362e81530ced160aeed26e1707aa7e5cc6210620834683f3b3ed6142a548124b0c1e625925b4dfb7c2c44af46b0ff684f4b02ee0588204f44f5deacf17a3a21d224a1636fc388ab3dca7a72df8da3af1027652fe5b166621f09b0c173642ea0ab7da7892c633 + +ModInv = -1 +A = 6c2c095bcb20a12ea1a0f4b800c60ddd1e08b6618ecea3b7146fbe1df679c43201435c0e8c31281e84358bd6c94786e1e6c839c750af57de6fc2e7b41335f95ea1aa34bc7b5e47 +M = 3319b39280163d1cbd00ddd9a29c5d9cd3a301da3024944e1084f2cb41d220dabfae485b0977cd8c4a00f26b567024ecdef76e363e2d14697651ef5ee4481efec04bd1fd8f143f1c6afc0c99bee1d1125e10cda07178e8330566e5b46f23d15fbb9c00f535e99eaa571817959392c975a6408e631840bfd5aaeb633b505a02ec4e644c48432ebb9849f66a004efe043d04bb9ea9eee4d13ef7d169534a4d7edc37bdb90c1212e38b4bae743549f00fb0b88e73be867ed474b556 + +ModInv = -1 +A = -b4b2f0fa6e11453953dd4e8d70d9d7c01032ec73ba1c3bf7d6b234bd346ad9f36673491745bef0e0b2a777ccfe243fb07c75d5ccd2c27465cd34bce98998ae8b08fb910b1a1d24b3 +M = 3b407737b71314ab57de2de9161080c700fb715ebe42d9f280012a8f9dc791f36ca51b96bd5902e0a7dcd79a9b9993f73f2d55d1b7eca67b0164caa5887e73d6dc033e7f4b3f98480a890539e8c23edefdc0880c9c934560a26e9c72d07f115d119b77399ae37c4826b008bb690bf6e623b68132051b9b0edac21774d3e085f582c347cdd77ec2ea92e55b3322979a58d4be96e85019e08d208330f99e6b47c3a63eca4c81db1cac752526c8cd3fb7e22c21b3d7852d4d870 + +ModInv = -1 +A = -f0439ec3d961c35a3c20a157cfcd6d036aaa6f3870f1e3c014c64352cf92f1ae0f229935603785b683f22ae746080e25d1673a10efee86295c4c2b829bedddf1e3ce4577e552c51297a3f9 +M = 892ac5c286dd18df2fb3c17faf74316139b6d47523208cfa418645c62fca3824d4286382215fa7d289471f1689c62dc7ade7e03253285f8a88c7e4f87d02ae1c68bd1010f7d1c01f82864481c02fdfe580c0bef3b1466ab2f66e338b3689897f894d737d92a1a251ae43dc9cd89d2229f2eee4905c8e086fd4e4f49f743ac35b219e52a1882fc3effeeb59869d1a1fd44f15b72147187b6ba7c5669913114f26417ca0c07abab8b78334334502a449194dcecff8cb0f + +ModInv = -1 +A = -aa68decc75db297b5bab0522ea7f5476d453af040b72ead1ddc5abda017c27527f84f76160ca831abab9fece7778cc361be8aa880958691fbbfbf02d8bc85a0b9136a5c0af7503633152ccf4 +M = 1087e4905a7cf8c5d641a42d759be41f5ecb54c9b730c07af5deb359de818bd7a55d4bc99e642b55e2107d8a90ac63c20609df424100a523669545e9ac3f566f41639c0c8db9513935fae3f3460bd337a5a79e954e71dcf43fc44c70e83d53c3edd0401447393c462aa30f3ac2b5d8b903afb4f00e64043275455160e58e6e6b98d4a6aa9852cf4987797a302e3d9df33035e2ad7db00081b0abed3901aad45e8d5941b45c85e2b99baa1a752898280ca2a8e40d69 + +ModInv = -1 +A = -a4b6f1b1ab0be35eaa8bc47d81cf7ca3c6db308faca3971f4e9c70f467c46a830dab046137225f67ed79a484ad9d14fc5cb7d167277a52040b6d44745dfcdf75806174312f83793fd1a2b17ca257 +M = b6210059af044b34ca88bc5f72ecd97625d2e09ee2f035e7c2b4e0d766de672a1f95bbb51aef59ce772621ed462694eaae5eb4f9ec2e8d158ba3392a87139e16926dee2e0ede5edc4e856d42ef8b1e33c485b44abccd95029808d2ea4f6b963fbfd0c60291915e178b7ef9bd17ab332094c3345c9caae3237cec62f004dab0b995e88b34aefff46b47a6a85b52a38afefe036565e3f1199dfe6bb477a566fdd5f7e6652320aab0e987948532310536f355bca6 + +ModInv = -1 +A = -62db6751aab311cdb75ab5e0463eb40ca63060a78899d2dd66499497356c5585f31f6b4f3bb0fe579586b546a72473cc4ae65792cf04e24b13c44336b92b9a3e5d12d60838d013e6a07dd1306f0ebd +M = c23197de3a4ed9a4da576e0bdb5af01249cc5d24484c570e52f6cd50023d9c613721d073f21829fddb5004f14ea9e673f48e3bfe321912152522e44d8e9c3f158efcc420ce8ea1015660f2cd97df9d29bce108e99ed54afcbd6063f8ebd8d5540566ab25189697a8d069a18cea48eaf330ebe96a09f2811d0498e5d71a380cff50ae66952459be6134fd3b5f7ec8d308cc47eac3a29dc6f93b294a291c22f3a58d7650a48067ab0e4eaa79b70c7b9d6ded32 + +ModInv = -1 +A = f5139b4864bda737a053b7ab821d2f63047c87d7c6db1f1fec8bf63abdbf042c1b04fc4d088b54a8648d798413f6fa86d6540c9b97b1620b97bbc750eec377ad281deadab0b51cd7404250c25edbb32cf36b69eea321 +M = 9a39ff21c4135dbd10b59338980e83a87f19a64880b31dada1686c834a12d747b8a4c7046b279cd4be912c9a1fef0f950556d71a1a659008e3e751148545f52da5ed726e046c6cba156355e599fed67ccdb5a7a1ae248cff7f4159cb588c0eb40502f1e1f53467c6fa7bd4fb9c5358ab0280bb7fc82fc7b46beb2601a9c8bde80703154a98cf6b31de19f0a3b25b7196783ab7489ba03726b7fb659f584ba728a5dc5abf3da13eed58c3c2 + +ModInv = -1 +A = 7d71ff9fa6f223ac79c46d9bdcdc41d8a81af9be06ae170859ea10a53dfa564e085f9cea6cc57a969e9eb92217943dc9819cfa109c293eca5f394fb84e5d9f78fe614b2db56373f965ab6776a873d5b891f4b35396a383 +M = 6f45576b6ccf5af33f24adf6400339fcaf02e101e487e1d03f99848b325cc53db9dba040824940d1429bcc20bf38813b2b46b6dd9248c9aec0e2de27ba2de4a6ce817a02e8a152e84ab2d8320b86cf97324c0d8adcef3839ee30fc1c83381d17968e005baed71b08bdea2bc2dcd6cfbd1b167e15a33dd09fee45e040ade0aa0c3820e5167dc265be5dc18aa67cfc18c2393f6ab1ce8795d6527ccc7d794be4634202374d740013f6f2d4 + +ModInv = -1 +A = -16455efa1ca1f819e87f9ee200eca5b2833d3f9254c513beacbde4fe504d0c21da2ff9f86fd5236a2a38dbe5709263504b6ffdaa3f4c891e7eeb27ab9f68ed55a0ef84657319cebfcbd166233c486cc2d685f15a2aee0973 +M = c4032df9b9a62c6ef1071d8f1b9cc1ad1dd1bf5369876f7dccf20f228e994d1036556d563d86d0f76f48d6c0fbd4e430875d0789f991b5ca4bd18ebd9ae0dc12ce6b449dcd753c778d2822617d42e1c6cae28a74905b7b56a79b29b6ff4e689c7dbd6d3a776a6abf2244451d681a0f6432ebe6e7a534b7e571c4d8c5969bd3eb230b75459a61037d551cb03fb8c7cf19f55e659580083f7e22343903ce6f650d4caa64b1e9f11e1523 + +ModInv = -1 +A = cc577830738e811026860764bf30aba7cab9378a8722e186df756e9372ce0426215c74e94304a0fded81fe3088e75a90212a3b3b70901de06c2bc486eaa7292e7becef86fc647af15c8d484ff1d60cdbc99a4c11dc2038e3 +M = a877ba00a437c0c298e49845889606f6cc4b83b38dc729f50339a6c24d53fc5e77fed243564bbf816a96ebd854cc3d81e748d0db616eef7565b2b47d7806ec4c8919383b792bff6faeaa523eaa626b1d7f87d94a931dafe3214653a9a2b958fd7ca06ed5385c5b281e3883cd3a73f6aa40a7c7cc682a0b319ebd7304478e410afe9c1ff24657be8d71eadc70a158abe3cea4bc1bb98897ee17064407e640386cc73b2a7460a1695022 + +ModInv = -1 +A = 31b8772c2516a27ace065357a85c415ddb2a10e1e82d5bddb45ca245a7e5b179047003162752f16346299539c1e383288c6b923c176231f6d3d4c122964e17be57910a2f87bd7d591db7c9d6fc5f7956b09f649eebd744df6b +M = a30b5d476c7a7ab0ad506cddb575c7fc04d7d2254b13333a9f691e40e779cb38fe565f3dd579dc22206419c34ae1b9eda47dd6427d0af1674027e7292943270b5c0040aa5f593c1d5f85bb5e7e7c09f393f090fd062cdfcf81976c4badf305b8fd547c61d950d2a4eb94381371c31bef9a8355adf3e12dfa5a05869069f62ee2f469af7556f4305134f639013dc4751d5c07d4bf64bc7c5da224fe12b3dbf9e9a838ecc61f6b21d8 + +ModInv = -1 +A = -5bdc2280be8202db78bbdfd3f878b26d554ca9a2708f32fd76dd8e34045545944acee3b00cfbb3640ad4713619ec4b961270a54c9dbe0e7f812432eebab46d09838ab004662815a7ac337dd7fd507fe6944a9f5f2b7a4aa0dbfa +M = f4dbade262c8be030b396d55675303d82aeab5588dbe97d5d2ae78a1122e2f5f50d4126d207828e830d2c362249b9836a4545669780d9e0435c52aa1dabe47b9ee4ca57276859715069c04d641b277c38ba123d7effecd37acff5936d1281713e47f36c8e2deda036daf81ba372ab93b96fecf4ee79b5b9e22d1eb84befdb87b9ae2b23ac49acf5cf2e0a10fbe753cd6f0f62467ee962a07c3f7d9e045f8cce1ecfc0f76cf6f5b + +ModInv = -1 +A = a1e39f90367859b5bdfd000eab1ae60e7ac16daf3ceacbbaeceeb58c01c5dcea2cbff366ee870de170a9a2f2b57ec6762bb43537b20105d9345a8179bbd672ec78faf3653c37aab1f8f5d712b5948beffe5a30bb1ca63dd96e2 +M = bb96a2e9bada925e8f47ebe8ce23e1dfa9493d76a142b75a5c2bd2f8a08e98344fd75b58e07d5d13d13959c7ab3ea87285d71d0e9734c0aa31341887d9ce21156fe823ca320fd618896373fa2d8ecef0fa719a977a2914673ff001ae9016a65417fc43afa16ab209b21999723ff6ea8a0ce9851c516f8b8636ed9713d12f6f317e8cf9ad5b9dbb07d8b6a9a52835162fa4fa78d83cf786fc19cc01ac190841c570ca4939c45573 + +ModInv = -1 +A = -a1e90dd61eb8492499be6a1a317deb5879ae4f2af1488658c371219975ad26fc14a7880b28c5008d59d2d5803e598d1496562956c6c86e2bda291b5318dac332addddfd893e1fda64ba65da6dfe1dc4153c87333fc536a09b384b09d +M = a3821ea75b0e98ca44fdc745e7075b7a19ff76010703b351c15561aa73f36d581ccb135b225de9d6868836775e095cfc1e9ec8fb1ec1ede142374f70fd33da467d91666e69e1d5ca143ca5ccf939a7b10926f2a9cdd08f4c790c2d8b2756747cbf4cc35dae6fdc9d8a9085ea51b233e812f9db5e7af2a22fbffc7eb23217cd548c8aaf0fcc3c6fdfcca60521faafca4d802536c2c92f6187601bc9e0917630ac21c9cbcd9 + +ModInv = -1 +A = 2f3b9ab5583f3ef33491180ea265be45a68a854988104750ecc99800746ecde97b0c8ba6e4ca6c1b8b7ca436eb6d8a75f5c0063f8ff652cb565e3985a4faa151621318bd004b0492374b47011adf893056700a06dcb271f11ab8da192259222f +M = c88cfc62b2ee5d975f67a8743d4688f53d1434ce1422d520124be69a99429627197679af8587ce9de434a67547db16f7e35fa79d2bb66fe38789e2ee0f8a8148faf922e65703d9507a0ce6967a9a128cae520672b649d12c4f34465b856847988afacdadd18bad997b32e077fb4bad6f6703c229efc2abb962a960baaaf62070774c8564578165746200b16230055f4b91d4766405ea7c94d38fd3f916ed021e32 + +ModInv = -1 +A = ce0a1ece3c9c9f6014d68ae48bdea78c82ef57f95f7d2bc8c94a012d04c69f1851007a5c04b64d710309a0271061690d25cde5778e12d54c042c37224a16e5b01d3aa9f766e0d47797505db31abaeb938c37c2f9caa220e33b2159c25c2c0ae45d2d +M = 46b3658cbf72960f89876eae51c96218ca04681ed68a4a830e64ac3eeb30472a298f1e56073d902f9a916f391954f38553d0005661714fca75c6fd9e46262a4fdd0e3fcac3fce91821e85727404e200788cc73895253ce620bbd5432826430712b9d2cfd690cb4d54a664cd4b6b28739ba464f8fe559e9ef4f9da6ef9f2115d73284ab0bb28508650b589897a500503a40fb98f1a885dca96e046016f96752 + +ModInv = -1 +A = 4ef38f216688279336154c23c31845ffca54dc2b3922858cec6a2ddb6a2fe0ae6f0e4c1c8eb5a352348bd11be315f0f29777fc169fd810a5d2c1afba24a9fd9495565e28bb9e60370e5c7ba7c5ddb5462da7bdb6d3c1f00c224c1c5ec4ce45cec07c05 +M = 96e0d0e4929c51a0ddccc6c7d4b2d9784867e8427af1d80437acef50b432885e80c404443c31e8c1aed735883c0774c5e997392a28c0d49a096cdc336775e2802a9d7810092336ba6aefe4fdfc11fa6b677e94dd0b4edc5cc28f7a3ff3b403447e71e78668b6d7bd1e3a200b6dac2c45e659eae7dca75d293f57669c935889cbb8b04c619532f5d8670add7b1197f6f0bd5ead7f58df05f8efea89de81fa + +ModInv = -1 +A = -185d7cb6a6d9a3bbc989d1b97553eaddca6fc308ac2ab7c5624383e733209081e438dd94307d806a952be4f0e6bec99fcdcdfc9d74b56953dcb71b5b418acf8172b6c976b24154af074c876b885a143218cbf1ec4484e0bbbff48b4a9cd4cb22cc743a1b +M = 795c29fe5ab683153e326404b72f6f4e8f8a522ebc72e62024e15f851882a601550eca044b1411cde01da19b1a275761620bc574445c0493af9dc454c3f51b56f1ff25c4e1a7cc9f8373dc429db37e0b5d59d15131d8bcd511d0bd9342a940664f96242f62f6bc2e538f9ab851c2a294c190b1e47118eb89e68f12dca47a6ba45f8f31184d5fd4e61f8de086e3f244f912c9f78c04cab27758ca0834f1 + +ModInv = -1 +A = -13918efc32624c2bcfcc73191996a0fd977c8140054137aeb7cb1aa459970f04d45810e53f272cb2a5e67dd89c925856010097470b5152b61086c5b669146b57f8ad2e086a0c50cce37e47cbe7346e134e6a3d1a164ae069858c9f1e299bcc044ec2a0b9 +M = 55cdc1337d81cbbdef2a7c485b7656afc17698606e8dd09c2701c995ca76c04521c50e56c54719c9c7cf278fb3792f81f8a6da4a47c0a09adcef3f46974cff1d731b817be1b5deb7bc25c5b6fd9f7fbf95bcb576135fb6f09f966f1a5e59b612359664d869519d0549f473f64409406dedf5855faa2d341a4ce00ccea69b4aad4b5e233456b538441e46ce1927c95b0600e7caaa12c04759238eb79c1f + +ModInv = -1 +A = c23739d79273c850093204e088d25d5214f02d150b7c45d2a535094bd130d620c36fadceb7cb70da917b3f07cddb76322cf7d3d6d55dd6ed1a6ef7fb1104a7158dac4e3f84e599f2a7dfd123b304cb76c5f3ca7477602fc5108561539f4fe99781cc0ce04be3 +M = 44d628945d6fcdc259e137daeee39f8377e6fac99bc457417fd1139d61dbfa6572f81f80bb33205c348093c68aed7d0e6cd357b43afc0f8365ce4abd32e9a90fce345fc3dad9d12b631b64e7baefdc98412e851816718f9946d98402ca10e7bf4c26e4a374609b414bba8828a64e9957e2813dbe0f651ffd6c223f93c4c11f10f59509528528b9eaea8a9b0403744830d6b0c27e4ee66fca5c0c6d + +ModInv = -1 +A = 44e28200c6512365031dbabd4a92ae56d39dbdb157fcbf5198ef180b6d6cd61236d9fdabff4d1a1895c31ba3fab1d7c747f7151c32956afcf6d915b164829eb1467dc9ac59e2ea1cea30a2cff4a657f6ad3c15a006fe901f43522c83259b7cf12000110652d7e047a605 +M = c8f3b1b1364616384dfcf08288fd35f4608824b49d8511945a0263918b7bf201db96ae1cce70316e2e323ac276c862c59a3ef8ff23958095cba7ea53bb15c5a7628d6446f549d3c658f31b5898a1832ecff81811cf52eee46a100767aea716796065e327d13f2ffe3277c348797edf18dcfa6a620ead2c13068b3572a67b652f84dc434fdf727d679c2ba4bd8ba8f773a713641f69e70 + +ModInv = -1 +A = e10c610d29789292879409d48aed6988ab52ed0e8254c7de2a3a523152b02821f0195f7bf27af9953070487ecaca0ef21efc6d59a514750496d769884b039d8431e5524fef5d6104f125eef440e5f9e961db471abbde73cde7bfe26a203c78c8f9a55071e4f8f2d70d07ad +M = 151e65bf435cde2ce8df1abdd3abb33a86b233a7f8b03844ce7f142b23322bdccedc9054a23f47a1846ae4c5449eef4c6b0266fa46b86d6cfcb5e48f21fe787cfecab5e3dd9d13cdf5f0704980268b6ba0d6b840f891b73595f0b702536039cde6fe79e06750d244a6914239678bf1281023f01b06bc415495ee29b4bb3630647098ca5aeedd1adaa75aad6a01efd6e39a5babb06e9a + +ModInv = -1 +A = -38f25a53bd58803c57c763f87d195fd7614bf668b47e85d6f58c3440e6dba4cfe9f181a596096ba41db074a7787fca4e9a652e8ddbdc7f0afbce264377cee92c64c5800418bf21d62c9fd554a8e4e0f4f08ddd486df5a1a92f80c6db2322810d8ba99caaf2a42c00c378d9 +M = c846f1351ce8ed0240977df5976c99e4831ea711db17413648e38216f2724c73af016b11ba6a269521bfab497d2cf8505c9082c49dc5104ecc0ca398b4a36a7d9745dd2cf49c2bfda0b0838ec1f6a1709ce32da409ef8ae3ccdb979b1e396ddaba6b2b6613267f3c6f0769e78bdbaca2abb26f05d00791a589480d78e85bbb09630af841eb548f9ee0ed21242ee32c9faf18e00f381a + +ModInv = -1 +A = -cc06939897448c6500f6fbc7d255ea4f8210ad59aeaf959fe6e6506f90dbbe3f7f20779ef0883049fc44e95c09cb900df913dfc705ea2b15eeb44afd7925ac49d5a1161d21623070d5378ea6d35aa084cb655e172d765172f44c5bd44c00c07e7a9169f093b1ead28ec954 +M = 9e8b37a3312de3c6d50e6a868be321ef6882210c87dfaaaa9b059112f1623dde512412a68ad52fb4c1f58dcd14ba34a9fa0d58facd7c4cae8ad4daed16cf12b6f3f85923c41499cabc316ce341f0783af7fb361416114e86d29615a5ad0a7df013a3c0e40791c06b93a58d8ec7f82770ba76c5ace67f594bd588e8afa5dadc3f7ef7edaa69e72a612b82335ddd64a3a1e1751422b74f + +ModInv = -1 +A = -110d2524ef93e8dcaafa8af20b3f76498a350acc4147b541a84032b8f9496610370970519ff56170606286d71c139f056b50bece7d4fe6fb8e361a754735b18826056192987e7d68f7bba6bece0e45dc0ad0c7268f0fac0cc48cff953941337ee9c51647c45c7092379e50b1 +M = 54a878db1ae1b275481168f17894c489bf819dfa32110bf62de6ae09f6bdac65dea129cad2dae9f5dd768927332da1dc76938733863a09411de14ad4de4611ccebfa93ca1f73df604fd59d483a2a20c666d65bf9de4f08d012de0c2f382ef56264f4aca505dafd13c3958bffb399fb4e4c73821dd3a02dc5e5b7688740143d57af9fe0824a6829ac6610cdd68be09d8b0dbef2270e + +ModInv = -1 +A = 715d3203ba264ea57132349c87d0ddb4b621f1a6b1ab47c25056c04e33c4fcdb0f54033f048a6844e5c585cc5967d2f063a55bb3e272fa5b664a061995635fd5fec25dab949ad84129d5d0595026a09c7d17f560e1efcd7750064dc237e0ba07b3fa9115b264abbb090f24111e6e +M = 334b4b233d49a597359868dbe653bd6e52451ac43072ece42f3541e418ea3bec30d3ed4c759ff0f1cc141edc7f3ec77d3301ca0ac1a22240687d4ebac19774ad87a67da5d80656ffbedc9ab293dd168cc0992f17f75b842f4a0882b2cbaedab08cdf2eb0ffb647669544e2dc9b850814b9cd1f8d20571fe19adb08be86ca1d5f513ffbe494639053f0a1afe766a4c84289b607 + +ModInv = -1 +A = 22fccc5573a292d52a33e4c8e901661742cb858a957146a76e57b7730e2c3790f65b77ef38cc324d4b1bfb72b048bf7668e30dd9d04757a719ef4b3662fb978dfec8f591cfcb77cc48199383db77e7cdcaaf58c3d8a158ed37c552873e5262c3852b2d1fcb1d975e5e954b378132e28067 +M = 79b0576570d349b6be360c7e4e28d324402b50f192e6f19105b475c8041524dcf094325711deb257cba217712d40ecb1b91496c8a66c98e227e2b71466a0e346366ad42177db2017d47e48d39dd10a78169432a3d63d8e88d1c4462b4d7fe7a1ec2a7dc68af226e72ee6cce29ad7253f888d72f0f30e0991ada2bea6f05685154eabf1d50d5f7b017eaca76a1f9200f8 + +ModInv = -1 +A = 725730adb7baa7f321ea09c4efaae829455b848f391f1f3aa2acbf3a57f928cfaa1f588c072b2771b66f6874a4a1878f79ced88d23705742d0337af1da5e56333d7265d489ab485f8be246c8125db5676257cde7cc39130c85965ddbe30cc81697e895cbcd74fe88e7da44ca23d5004db341 +M = e12376ebee0186463d346f041209677c7d604598945a8194c4666802838f3d4b7173dc7adc22307616afcfbe0e756a81480d251e29a3f5a33a555e0cd87be317ace97318d379edf56b77e396281117b8f583fa7e45ebf8a3d65c43ddb282e907bfa75906f29afb8814fff410172ca8c6c3611b414ab869b3a43cc6e52dab44e7b85b8d72a0a99968cf75aa76f84a85 + +ModInv = -1 +A = 633a706a0b534a3a3659b7d8a869691d3d0119e162ee9b658f5fa8de046a5abce16b5304874d0ed8e5f17210efe0f6f31615fa517bc7689f84cc36fe6077b3883e9b8606b82edfd084f26f5ba8cdd34b9993daea0525c1712fe561dd578876782684b533a67b66e1685f1f8a510c11d79b13038d +M = 7b98be39463fd73ed9a75a7ad285f5f3c6ab4040f05970a8d1d3b4d60a571e1759c3a7440124a9705d1bc10d29b360fa8d0adde95a98136fae029848e68bfc9928d0e2090d19f85704e1bf47fb14dab1724b116d855810901d4969e27d4a22e1dadfa0a84631fe4dcf53b592c2c326c7ff260c36bba496c37c71e5b1b34e3f164a95fb872e2ae2ba5a6dd16022 + +ModInv = -1 +A = c988e8d995b9917e964d1a2b164e029ffd529cdbeeefef57502534f2757c39877a62b22248d52cba1e91aa47f19402e85b43aed43ac6334708357f5bafa54bcbc270254815c121fc922d83015ad56a11997488c80f5a3b04ead5937dbac46a9d32dc9c1226f01490ac5ea1bed78322381b4d8966ae2b +M = 60925bb1da34e3cb2cb65289462a19d83b72d5e031027311d203464e8bc5bcf94be5459d55fd5fe4a5b90e577859068f91e16f25eedcfee7345a69025fc2391187d2e80c8ad7edde0c36a7d8820f3ef2c60af395a85b8da854bb81d5e645c8cce157f22f77952f083066999e56ff225ea4b80d2e6df06b90084baef4d837f4120d6fcfb5dbba9c7b94e2bc + +ModInv = -1 +A = 5daa3d2575b9377dd5934a7144b936ad72f7d4cd6cf7e3cfa66febefe56da8a6ffbca093cd8d2d19acde403076ef7a85827869dc7f618df3194eb75d292354b13262ff2c515ba7b1a1e7f7355720753daeef59243f412fd70a8b43add5e5f164fe6b746dc91c1b2c570fd106068770827ec5974287a40e7568 +M = b952e8a72ebbca54451bed17a5982eea0b9a24ffbce12fcf74215bbef7e809c4583cb6d56db1b12390b3ae7901dccef7e37bc8063667eacd756e2ab3eb21e3c9cfa4b65137a4d49f80e71bb60fb3e577f33d0dc79e9a1f56a10f58752d81d0b9be448d3982056968794261df63a98ddb73372b072f947bd50c7c8d783bd2dc402cf05d970b594ddf + +ModInv = -1 +A = -1496c5f739073f8f334a78e339e67f196677c1568b08d26de64c915eb30a7700563a8b36ddfc47adc4910e0e78059b5a694295a7defc6a8961cb2cb8b3e4c65271a53d77ecc375b9a691ac1fc8f6071e9c5710191f33d5b29566b4257721c5c42655e021f8700762a0a7883daca6c8c84190ef3cf040d30bd9 +M = cad2e8acf22f351f0bcdf71799e9d531ece8f9ca54522eb18bfe588cfa035b8c33f31a3cfe77520ebee5f9f2b4cd550d1911466a51bd863e256a35c3f40206bf611bd849179149d08a6d67572490855da917c8434e438a73c98b09c31bbeeafd6964809561dc589afbaa4b5d5f3dec72a0f591419db4af82e5202d1612f1c68e2eea286a969c4bd0 + +ModInv = -1 +A = -ad480c5bbf43c33fb4575fa3c3321adecba1e4a340b5f8cf25bb92d23f64b3139941f720391d51265df854ccab6ea60a4123aeacdea5130a870a0123ff66e19af82785dafadf7fda8624ff2a04cdc88f5b64c0125bb073ea9cfcd991f392937814d39b1423186da678f866771910dd2ba0ec10a5b90639eccc04d179 +M = 1cb7b3a40d9cacd8984c30a0cd865d6a7203226552b7aaf8f86b591be494bc30063d456e6e4e18df45d751e69d3d2e31fc85282a43f821ffefaba30e5bc8eedbb00dc6d3f3be914d246e5b52e09a19219427fbffbb48b5351dd7ecec64445f8ec4385fbe3019f91bde2350ba638e4a3c900d9a3ad2c8d9359ec26c8b912cd8058e4dc98afc + +ModInv = -1 +A = 132dd2f06d709ff659b99e9addd6251140949a6084a0b4917bd813adc8281ca117751da62154a736e04b669eb658245a8ad50c4412ed8b258087e2fd6cd9f9834d1c516d471e9d6626f58d8a1ddef06c4aed047f28afbf75958cebb56857b4c37ec760f9e60b6694051168565df6850737ff25ecff9ca13454b27c02 +M = a775ab31f81f8a70cc239774fe0e94ac051f61ee2599cdd3850a7b6877821e3bd604875f08fd795e4dc020b1daef98fe786ab03a34b365d771a6ef88cab9d67f7862e94bbf7cf32f878466c5cbe76f6a6e63d657bce001b46a2fd8146e1fb6b007c9e44333617f33498ff1fe15658b4183030eab83faa2067dce0b960d57d4311f74c65349 + +ModInv = -1 +A = e79163faeb61edbfb032512b8c8793d94e3b20c4fb0a052bff09fd30ca081bc5cfc9ad1b1b4dc7a251423a633f3d675b376af57ea6cae41f819e97e762f06a36c04f248556434b5b0f6e551d19c214460de20870575cfac77838eaefb9976f19a99cfabcdc5402a97b8ad078d5256357fa15155d21e953ec460fbdcf2d +M = be3b3cf5757d4a7cd321c5e9028a570265230211e61c35239c30378291c2d32d4801c684a9d02a0bc33825760c955071fef030b1f2d0c93eb6ff53fc37ff8279d887d37fa0629093c9873a23e385cf7254b514980cec4c11b7bb1b77166666349dced79293dd90ce140bfd029a828207a75f599fff63838ce5431993c8480c290424df71 + +ModInv = -1 +A = -fac07df3e5cae6554b49dd5e7063bb0293c7a9b5e003af814ffa1dfc121ec66121191eab75df20ebc648ae778fb171e3cefda20d2f4a76ce7fbdee7752f30336f51bf7ed88237e795b83e5c10f0df43dbe5eb8905da74226bbf9f8bdcd613532f9ef23779dc6ab99a58db404a8f90a8d83c290492f2086d0ebf2c163b9 +M = 3edc066a46ac87c058ffa3a7411a457347fdddc107b8e9ff3df0880c0c9f65b222feaeda41842575a519f02d8b413fc492707f7c390b6193fe056b9d7d3cd3a97bc2a33d390afc4bcbcb9892d84c70c905fda313c28222866a9ccb221cef9d3963b306343832e41972069c4ce912e8cf42564fdf45294c6301bf244642033ef81ec7d0af + +ModInv = -1 +A = -9541c1bfc7ab212e03bdad28d47a8e683f2890b123ff0722d1936bcc7b9e0a546c01c9de48fdff113a1e39b95d933df5bb140c5026ae82974e236f761b03feefa67fb51024e217d967b89f01d73d95563c55a0475dd320835e0a7be4a8074706aca7215dc56224d015b2388fdce3e638bca46bd70d89987fc91e855cdff8 +M = 642a1d11a6fffca51bdbee16d2b9aeb7fe7f406d95190819ec4413125e5cfbcc2114b8b33f70f44a13b9da9f4e53bb70ae31c4b0f125a7ef828079a78b624494222becf0217c3b8644a1e6d2818addd94d8d21db70a64be685acb714786e9647eb93cea6360399ef512c58c835156fa714a1e9c0cf17c5775ace364fd7eba0299a5287 + +ModInv = -1 +A = 9a06437a41298a64568e24256988dab1c595c4935751a544d88a1aff269ab25b2cbb818161ebbba4c1b5da82883d80bb022869d57e59721b5c3f00344e5ab1e0ef7b00ba95402ddfcefd2e6fceea00247c6beb2a12166c6984b1c36f2ae9cc69248f67154b041e88c96e053f3a2987d29b8652db47179a9a9e7f65abc703cd +M = b3421b6b91b26eefe8acfc78866030d79e9a06830ad2bbf10bb2e4076c57ffbae66fd59b3a6ec98b8b59fbd11934ff9fbe402c432ac4e8dc5fc6febbe2d9815dd82b24d868bf25f4ba50fe38643eb4fb5931bf1e80774913351bbe5f646d8d569a8384b49162870cf5c903adeee9138e184984c3651b5e4c1de7ba5f33e2c5426ef8 + +ModInv = -1 +A = -8e60501d42e7cd1d57531eaa941d67ae7ad37acc9fae1f126e917dcea1407d838604c041de09fd73d9d5980f7a4b5dc2d8db886d48fbd37faa1eef390271eeafcfd71295f9cbf758ca53a6c4c3a0604145a13ff74ad242931a109c8e4ffa25f65a698691181654adcd0d55ee30d6ca326d4cd6b5a29c7d38e88806527b37823b +M = c7b658b9d610aca25d1b6faf864a70fadd64abdb88620d9a8e66174580257880f525893b1791fd9cf624c6fe33479db6f833ef0f5370ba0cc527fcf0041e191962dc74bc0be925835780702a04223907e5730472ba40ab9ba0778ec15da32d9d6412eea878fbd0b1697cef6cc41311c7bbe99f5a7a770e17da8f3f49e7bb1ed9f3 + +ModInv = -1 +A = -89f3f81fc6c4c6af6358e498cac52de3b4d06dfbb625eface86d97ba1cff91c8d17538e7c0828ea3ccc083f137697b9d693d11d0bea74020b8f1498486d4e718e6ca37d12fd56a43ce4084a9bc9de13c3863204b5120d1eb9708b370c95031743879cd9fad3b27ef19af76d6b58538176505b761c562df2ea45b89fe64db6bb9 +M = ead6eb92bf5c8243d4e8bf91fb03d5839541d9d5977ceb53957c2bbb9e538c11eff1b59bbd9f03d7d35171acff0d59d949336cfcbb1b7b8078ef7c3707fb74f3d95d314df16337361a98601530981b997f27c1bb81f67fbabf6dd62953e62999fbe5b0cce2952517880d4357d562a018b995d7a0012500876b2d3f5254ac08cabf + +ModInv = -1 +A = -c9d8770717e2585f27b2a13df704043041d618befac01360990c25e40a07b8aa964c16f4622ff49b030af42ccc1cd9c8145deecb788569e9e2c16899b99de94e46ac455000009b9bd9a21343fdaf16c9723cfc015cf05f45c42cb0d54ef062da44add5fadfbcb85eb0db23ad962f453c2593afb5e3529190e749622c0a85ff4e000c37 +M = 875f0e90e8fbf659e25d75b027bab56c702054c51b90a4c79920b7a1d1f39a6c38f8a83a922c43d2484f0b4ff3a190beedc8f5229d1069650a037fd4dc239fcf7d518165b03894594b1f7248845e5dfa488d68d953c1f725e6d0dcec646fd1586876ec3ce65610a35b84b752c9dbccf6d329544fc0a74bb450b185b04a32 + +ModInv = -1 +A = 187de3ef0345ff50c061478a489ca562363446d1c19a8667eaba0db0727a7935fcaa78ba22663dc9a4749864f33402fe20e168b66967d0a4037ac4a3691448ef17f9c45237c9a9e966a26032741861351468abd7e3429a16645eb8153279df404c32538413d441a8a8819f300fcd1381f9c60e3d35cac4c028f959e54750b05c4497e84f +M = 803e37c1af582a5fc20a40be631e1f9247f8d5bf9947919415c7f83379bc1de91fba0dcc1a19d59ddb494331f6f5bd25d99a62298ef7755b8f5d58ace9f23b18b107fdaa7aabfcd48b4285d2ff3d21b1ec7ed8ff722fb42aa5e620f0a361eb84e61a5d9537fde28c7f76b3d7effae62d30bd48ad7d0d734356eb080be2 + +ModInv = -1 +A = -7970010c962f10291e61d8ba065debb60932d2587e7c74e5bf5de955014025dbc00598fe2510329a9ac8c0868e24c86cdba3c2a12d30a70fd15d1f317816a2e7dbeed3417942a77dea8bff1eb559302cac59ebd4f4cdf0a50faaa0a2db40b0825a50b6e64223e15490cf9e9964fa88cfe96a9e483e56218c987c6e279080c5c716a8265a49889b0930 +M = dc85c9969d8f809ca66c81adb7edd481b523ceb49d481e4b7c5bf8145575792fadbd4125e5cde2040a9d3ec4d5c98d5a2246b4b108ab75f3616fd2981be76df4c493a495fc91d87348998dc34891b027d6e9cb0dd45823d8e68a518b26575bb2bacfce9317a6fb0483893383e3f448b184a08ce87e321659 + +ModInv = -1 +A = a5844962caf963f13cd425b4b37a7a5074262deee331d2dc6b4fa2d83fd2fd0707285556505e1492ab565198befe3ace962c86352ef19cacc013498fda6e1b1ef298629bd189a325a682155313cac1415449ec1c1445d1511f383a5bc8156d89523c8428e753f36cc5058a474c7afa59e7939206668d4dbb8253c548979f87d0245141049a3f2d32bbe3 +M = debc6a354d5015392e252a8b477bbef0f80c3c093bc907c69604b7e3197d4bd24f6c62c868748dde07f3a9bddb08b1f193cdf6a6fe8a061e1a9e4768e75b03ff278974145164afe8b2220b32b6647c86d9d78d93fa30f2074bb3ae9cba51d589b95f555305e8913e5ebdadda00b3ff96cd8c1964e3819e + +ModInv = -1 +A = -b8310561b3944b71c855384ba2f29046a93c7a0f379b765dbfb0a1e8d9c247161c32a68e59df2f1b4f678c4a8964835379a88e0260f670361b80b697fc0d6f2f62c3b671563d7e5303e8d3965cb2a3febe7f9d422e6ab26285a0f01249e47ff7e0bde7fda41f8351656739ef12c601d3749f0e43826da11ab758aa547be3d9f1df80fb4c98cbdb40fe62b3 +M = 5ea1fabecf12cb2495a31be385b13e95cd58b06dda2399208024e697fccb38fcabc041aaf6f24a4ce9c3fc64563f26b4f061d6a374205f88cc7c5f28542c33f0b60546b8ef1e33354769109c7aad10a2e8492890bdd3a934f720c615fea25ef215c943823cb4579166a6613e0b317c28fae78c27424 + +ModInv = -1 +A = c4b5a3e42116952f0fcbd1a0b09a02a297b150656d4f22380678e102c833b34f8cecee15bd914625ab9a80e72d7365d42479402e1f65056571a7fcbd108dbac02665756ec4b542a61d33bddc8140c2632abfdc8116187daeaa8378a976cab6388506a4a6f523342744a7410146d7d11ec6745fea2fce67876657d94692587216707ba705a0886ac39e4a82 +M = aa180a88deb41f83317aed3ad2571731207787bc65bfe8d267f9f478117c031f68ee52cfb1145a7b6fd1f50b4f839e2142be77d986254b5402170fefa588121096fb393119690a198541df366017172d47eb7c4a9da94b24876760d89e134dfd56eb3eee1d057db660d074cbe69d0b06bc3eb65d5fd7 + +ModInv = -1 +A = ea9cbcd1b58b21f27127a32c7b398da6affd269df4fa302d48d1d661cdbebe5ee916a8774fe887db0e9496d3d61c88ca2c9663f41f3ee1cfe7b4405dabbcd4aa0936926d997dee64d37bc163ac307da1fa9c31d1205e937aefb5703ef1391e6273fb29b3e1e6837410d34785e8cb7f6a0cd6dc4bb25b6fe51007c0f71f4795530b3a06885a63874fedced +M = c670ad9bf76c1ceba771770c2a511f15f7ce0e3af1fbf5a83d07d948e21eaa694ed500efdd4033bb585ceb891470a43a97835510992e3959393a2e7da7fb2cdd5b52512a723cd159b5004212d44f0e86575f9346e1e406fa9ca266c02fc48abecf7f2a89f01e5fa3715389a5e3edd43c6270f2fc9337 + +ModInv = -1 +A = d523b7f944f7081be91da1fb48c83b7fc430108b29e4d8ff97d9822268aebc6341fc1b05acd8f3f7fc532d45f53f2b0a556ac41a5a713e59fa1147df6e21136cb5a727ba68b50ae5bde33be6a0681ef23df8623e052414a56eb4283e825dea76979dde5eef9bec73a5fbc15b98d4960dd3ab2ead728b533fb25af584da31b5e273ba232940adfe8e879ac563 +M = 4347f326cefae68e6cd1b5d07b41aa8df7ec152ba0a9bae7ef7d43f4501d224eec20b9e7efeaa1dc4b65c43f4e29a6270bf88563b6fe3c50faf218c2a76645880f9fdfc72bf278f0ee223076267eeb20d0f8cfdbee5df048000798e4667357789f7d072348e9a79b7eecd3d492f0b2f73b6ffd1804 + +ModInv = -1 +A = 62e63d761cf0462f9b7f21ccad526df6c224ff5a320b3835de6c485a75c10371278a1c84e1589e774d5fba3bcb0abf5c47b6a4f7350d7b7c861eebee320fe60b9e11bd0dfdb8f25d326324b8e508afb1393d3c2d8e5896af0315e57958a13aa514aa0d16cd93eb5a18aa8149c9478f3fc3094cbd19d3dce3899afb910bc1d01dcf3e4307f195e41c649d67a567 +M = b76c9b7cb2b6bf3024843ca9bf763269a2b30aaf83ed7455e85ec880fbbdb721d4963fd75109c5fa0f6be01e412aff10976c356c21cdc53150e33996474ce43ec3d2be3b9a3bd2a2a58252c0f27d1de55ec822a93bc261fc29fef28fb512c19547ef2c6284a78bb055b0d663d9b9dcfe008dba77 + +ModInv = -1 +A = d94baecc011004deb2660b266a1a2dcd21fed3f10da6a75b0f476fbd425856a1a51eecd04d7637a390419a9ccbdcb784ca6d02f2a9c695cb7c7768b369918e3c0c754a40b66df797d4d53da18d7123cccff73bc45bddd25d9d7034fad67f234c109143138ae0daf2b2c376239cb6615e240fa1423e7f4b48705777ef36ee7bc0ef165ca1be9f5a522e9338b16b901f8089 +M = 51a4a22d76daf3e29ca1fedcf6ed48fd4e9eeffecfddeed4f9baf8ad049c20e5b1dfcebefde16aff535602906450bbaa73d7e3510405234ff9877ec2a6ccdee3b5102b43ad820d97b0e207ee3065287039f6a5aea0637edea22a06c33f9a9a422b03366a780c43c0b0969fd626463dcf + +ModInv = -1 +A = -cee41acfc552ad1c52bd8e1dfc850768edcf3d720b98f5d51f4e821bafd57d1c0531d3b4b43aecea9e56676d4de1f87fe9773723641b32e66f6d985a917fb206a8fd338bf1a536346efdd3b17dde0335c021ef777369f1368e055ffff81acda7ec01fa3cfc75ca6ded82f6eee03093f299eee660beade9870e777e8b1e0364ae7a89755bc86739599b64d5688e2971a43cb3 +M = 3eb350b35676b038a81808421399dd4e8d9b54449f1cff6edc1b52453ec6b9d56f0de28ce009d40f767e8f37b7381376b3d74cf1c94c5bb1f89cb91e1cb7ac47518401cbfc4b0376618d4fe22240918215a1c38bb5e158701e775bb3fef7f119d7baee75ebfb84fbad9316e64f5cb4 + +ModInv = -1 +A = 617a8cfca88724966175ec32172d8efe91b2078de8ee77687ab52a437a7eade3cd803df09d13be105def81566bd74461ada0122a2283ba76320f1bad8d7d871d6f9b535ddaf698285851af874c4d7652f7473767291c85cc93d613e3e463617d99894cb2d64b26a416207d47d1b2268d84a2f3195133f8adfca40ab5b1db922f81d559d88b7e8e4087fef66eb65ff696812e +M = b1377618e9bf10b3e5b59c42b23b34ebef47db815572733dec382f17a4c5c0da8ac8e4168bea799abeab8842729050dcf4fc40a9373a1928480df06131c79bb9ae8f848a00a6cb9c92533f040d0bfd5b0ca04fbae9a1232d51dc1acf54428587c4599ac51924a66ab29cab0ffdb627 + +ModInv = -1 +A = -8a2f2804723e20ef7d5d7fe65f11373704c08130fce221ad74ddf177e3993e7e6d1f7db4518d92cd43ba46d75898cc8c274a9ca910f4ba6e4309e1abfbfbd26bc7e949a017644962cf3842727975785e109c57a012e64f972a1726f911ab98308412146de26544f1c7713f79b2a7d3a85555dca47776fc61a5b31011fa23b06e2db16d3bafb51f23c3ef2d2b1a4f230bb47835 +M = a4f45d59d7d2a18f495707060f36cc779e1c8d334f0e171e51f3d4ddae5e1af671c0d7da6391e94c7dc71539651c7b584505e6e3db7dfb6af40fc0d3efb068a42bf1bc299101d1ea44e894996aff9aef056997132e7ac5cb9188304c3bcbdcedf34314a8cb5e9b841cf619f8a782 + +ModInv = -1 +A = -ab47b9ab5c96f6a322e83b0e9ec83557d499f95bb6ae844740964d6882a9e545b96d33c15528ea3da67b4c1518db9aeca1e44eadf310704828711a5483b66d1df36b62c4b86548e5a1384034acf2c429f943e1166c012addb2705b16d3e7653d3bb8ccb008be37a2d5bfa52fca4017f06d14d74d528544fce377004ba54581c9f20b7642db0a8ee43840e82e9d2b16a70982ff1151 +M = 6c12dd138d01f4fdb85fa6c6f1e1958f9e7a95f02cab9d867ca7d7a5001c777f9bcbac47ced1ba008bebd8ce67def901346d7b88a6681d284c8a8b5dec9cbcdc3dbbdd75554c825597c1b62f8c4cd24bb81bdacd2596a94d285e19e91cabf56a2126de01354b9e9fa555edf1 + +ModInv = -1 +A = fdce1962270548969b2f63e267dc1976a5260bddd14f7f998cc834d4b61b9efb10b4da8a190a173687e43cbf0fcabadd7203c2705cb9c55d9ef8b4aec29efaeb0a6574b521c0cbe20077d05e7f3a24a6ed889a034d98afe0b2a7c63c29a8b7498647818a29bce1f340fe4af408415f6cb64abb562e6778019cd72410c1b83a9226bb5449ab145066e9204817d59bbfbb48aebeaceac7 +M = 33a8d39a01f05897005a642a0849ddb0bcace23dfd9bac4444a767626c1e15ae12fe069195a50cacfee3f74c4633f82ced70c9d169bf1f866e2775018a18c9a620d6f1ce5f51bac1a0105d33d14097db0f468ddd0c2bc9ad175f6cc979e44cc7f4163457d8c9c1d73078ce + +ModInv = -1 +A = aa5e8628e00b2a2892ee381236261b4c86a0184fd5f01d1e71e06124b2f31c7a322737d7969df8cba2b75784e61efd2f0f91e9c77316f47c01db8a70a0f307700707a02992fe548573a14bb24c0165024816ef5b411323f289e9d1f7a7ae3a49fd424d4eca63c96dc58bd40fc23d74eff8343eea66cc2337b248a9dd328742acc651cee12140206a769fbd78866f5df8a0b86a4f8e68e2 +M = f13113d8d9b7cc1470af438f890021826fc36896209d54d3a84c76cd571522f1e17f8649c9da6522941a2b310f83d2bb7c31c99b9cebdf2b2e412264f7bc6f2e324112942c261430f956d3c64eea966d366b00d6cd4633c4b50c98a42953d69bbb6137190e17b1c1cb3f + +ModInv = -1 +A = -557f4644b95f6e2139d7f7e00656d84ce9e4c193b93ce6f19f1b8f3d420ec83afc0ecbe431042d56e51631ddf5723e003aabab3a900342410136afb6f80414178810c232365c25315a923d111db9a83c5d4d15d9e238018e95791a8b628a3c0507f05d1d986a98f577031e516f802e183321e2766ad679a872a64afdad7bf5c868591fdacde91a22efc07474a0cd24e0be1f8202ff5ca8f55 +M = 3a3dc627485d06723537cb8d90df90115f07ee40363546b18cba645cd3ffc898f55a9aa477b252a43f372cc414bdf48c657b4de7c3531ed19346852c67ae64f77ed0c140468698143b109d67b3c00079a915270a04818d22c1e04af25ecf31097c01d70ec24c9c41 + +ModInv = -1 +A = -75c3d1177ac7fdd2915b468564d667588dbd843f434ca46764dee549d539c70c4e7ec721f2ba7331e7eb1fe7ec27a516f42d2713e9eae24d610216ad6b8b6c7e120a44c300ade16902d7a2f32b1ba51ebefccf821b110941bbbf51f5431fb0701b1f46c3c35e08c38a825f1c3f6ab507756093e72cfb6ddc63106ca20912cdc0504408f5ab2e61cd0350ba5223a2b581e4642218d2d61a9341d7 +M = 46d7ce4c77565386454aadbf6139227ad198ff0bbf61c898ec28ae24b525bdef21dbc5ae12322e47d133eb63e6941a0f282817b52ed9490edb287169b9df04b3062a7c8e979ece0f33f6bf830be4ba5c5296ea69b309d9084fff150222f2931fa69e40a385485a + +ModInv = -1 +A = 8be3f8f8e9d6839a4cf2a551c9cbb7e8f0200d39328f2a181514ada8cba27f8e14594730d79f34347916b1084c3103f49b8bc6741e968a18e2b618fad8e8121ea25c52c471b150b9bef4d4bda1783047e376a554c6743ebffae378caf5579d68953f7e1445c80d6f1d3ec45a7846d873450699ca6916a14a660571520b8ee9f686c0d0b8fc8f7b1c849971dc9552e7965b00a9c3767cdd9ba5dc1a8c +M = b3fa47042b48bef0465f9be140ae20b9aff59b7e8415d766aa86d21b903956e95209bf5f944fdfc3849d5788e9f01b075be57042141a075375d1bc3fa7134b2b160faede5efbab23053ccb61539506270f9cee99b84ea9562d349954ea57ee4156273eee33 + +ModInv = -1 +A = -77d690f45a59ba8876a2ebc8d8f1f2c73f67a7fb7093a069abe5e70fb318b61334683d398c981527cb7b35ad46451a150d8a69c6cfd92bec656f2b943f2ccb66a4c5ee99a20023bcfa7572a9336364db7bf5a7f19aaa517762cc55d1a22546c5c828ef17c77c5eb97a9034b29c1b0b3e9424a8cb967acadc5da83d2fbb894cc3cd4a9b4ebf68c5ecd6d396b8559806e2be0bf13474e4e5b2a03e8ef8dd34fb +M = e6361a5287d14bd2df3cb3c78bdf5c31d5c4493dfc46987cbe995e29207962b864a8ba371b2e938a37178ff8f01cf60845df2e2da312819b8e73924278dda3aef4277c1789979086bf4145b9ed8bfbd7ed3adf913c66d4711bf08cab64457a70d457 + +ModInv = -1 +A = -8015f338fba0adc85c950cbe1cb9c80f8759d0fd484cb4430a7f65cb225aac1668d5281a775400bf42ce34283c6866eb4ccfbfa97999be7e0e5380a255e5fa51f8f3bf1879eb95c2731b2c25bd8a9d194d5c5986faa29d0e4c98daf16e413c9778fbe7485f11a26853711731fc540ac72a1710818af8354178b73e22eab9251c4cfe782de7d74b9e2b0f1caaf838f274190998578dbbd8ca7aedd71ecbbd14f6c9121a55 +M = 8216602e97f65a839d57aadf1d7a94138fd59ca7a81baa6b76172f3d8648dc95d8ffa9ecfa1371c6f606f7c4834393dbfb03ddb9f90fe3cd85a5faf5945a27e751db07a36f10dd2a0871924026c99c3140d0b4a448977f8069da7cde + +ModInv = -1 +A = -c2ebf14b51208cb192f650d6e8bbcca19704b67bf56ad346c517202b3310fb3625e3a398618547943257b8fdf4b44c4315a5f8e96c7a5106c4a61d7750f0ed3e9c01f46f59c72b51732eb20e41e621ce0da123def2bf8c2e73c6631830a64227f0e1b242e2eeb7d11ebdc98bebca9d89b7e8d3e547826604e83a3bac8bc85c8982fd5883c3466c6f358ad455daf2f6775ac0441a06f2e2021481b5e064db5906f28e7613d5 +M = e4f450fbf1d75ab9793e7c31e4fd10a8fe25b6d93469cefbf9dc64015baee4cf35210b07f9582b9b5a55b7006a6c1f8e7395827cd5462681aa47a5e6e814aada52bb18880ebcc620fe33b778d15b290e6d58fd7a2852a4f5640f981 + +ModInv = -1 +A = c5e5255352c514d4cf27d33e1f819e343e4eb203f77453dd0c77375270637fd70c5c0adc8e42a1100c41b7ecedaddff41fe205c70116a21c97d2214d993184ff8e78c9e782d1f8df81f311ccc529e0af3328b9152b56fcc490ee7d1c525f6896028fd2692a84c5442eefc6775d4bf09436d5462775430a78665e12e3c79cb095dbf600084ffd2d2bb4aad9be80359961e56c3583b4f1bc0f0ce1a8c32e9e3b2e77e0b93daf +M = 768b71167175e2f5cd6071769e8fc46f79f05dc91bcac0255844ed7d38894270d110de9b9b7e1fcbe7958ae40d94dc48effe83251fb16fbd40cfb3f17a028a1f4d7ae5e45305061d3150724106563679812ea0961ee2df968277b361 + +ModInv = -1 +A = 853fcad4c4e01a3d747c15c5f243008f28f2cceeea37fa3b47ad37911e92b49987c48a6c3c2de2c6763dc380f3ad6a5ab7eb77e51f8b4394338899dab26a5804ab82239d034407114584cc82d05bef711f872f1e83495e17dcfbf1cff88f2349915e7a9af05b20c2c3f380cde52d95caa4b3dbc04596070588cde48185500af87003066778fb5f2bf1958a32ab914bdbdc351b14455f732558d1447fb1de4533c7417959ddf6d3c9 +M = 4e2cd0fd34a50ca5e41958a7c34d0d9ced9b3d1f2b540b726b8264d53b0838d92d35165e8557b38f38cc05fd703fe504022c34445572c1c09641c18fba5dedd83aea876e376c91f32a904589af86e8cccc78cf501d706f3d6c + +ModInv = -1 +A = -275c2f87e9b4741d86b9eac2c462edafc42dbf3832a49391715e04496c69ba643e1d7b60d3ea24e58ed39007f9d6e0cac037ed39c5c37d67f4705d1df67270f61e6eace817d117c73204b4bfce17adb427b6dff4e9662350f629b9e5e4fe8380424e0a3f4280005e8466ce864dbce6298ff3047afd571d56e97131ff213ad65e4f8bf30c94d46b0a57657df1ae050b5b6b801cf7a13801c12d8b03c2e19d034e7273a272f2d8c82d0f1bb5658f5cdb +M = 277e68488e53d322431fddb5f7b6010bf1c8d2e770ff5e200bcedf2870d198375a154bb0fe220843c2f2f9e64c7e7dc8a562714a675ffc4e5575b1ba127570388a63aec4a3eb068b071c311a96f68abffe56 + +ModInv = -1 +A = f0929bf9609d7a9c5faa0fec67e77d06a6591591b1ca082343e8b5d15a63952a15f0f9994e707c0baf113f507d336dad61a09c36877b9c7543f4702f3fa746dfca4cb9a793ca2c275a49e4e679ec7bad187cf3ae6ed03d0c7eb5fcce0c61dd5e8bd0ff0528fa94f50d699a290957fd9074ca9742b98b11d167676dc42af07b6da4db6c8588ab413d33e073fdea852ac5c77ad34c107fa8a79896d20e068ef6d7b60d08acc2ac20619c86073d850959d66b +M = 87f0a0f384931b7eda6f484e7e7300d6fe642e7278f24ceb6032afb1cc773145772a55c1a8d6a34b3b25d3f6b97a905bf7474fedf919b5160bd495e703bfdc0374e9195b1b80a3170bff1c9743804d25 + +ModInv = -1 +A = -ac670fa4c02cd84051dbd7c28a6fb6f24da699a61680be16c9dd0fba493de55ec99053235b69906ca70f447a766f7984b9996fabb53ed28a04ef51739c2fac3702d8eaa293eebebc84f6c94c4bb2e2758cb26f18d2f4fd509ea1a21613066f86fa988c58274850b4422257b476aab88c6df1b377ed54eb544be021c9b01fe81dc10683910648a0c01153c1134e3bb905461d6f224003170b4b74e1f88800b39e37b6e2358d0eb61b4a10e9b94f6950234fd9 +M = 3f7922c115d35f90aa11ca9664d263270fd06d279120873d3c099ba5b24005387e53e7650f456a7444c07ead6fda09ad7ba5e1fa71ac9076ecab2362c04af892b4765ae4e5367f075f7295c41dc60c + +ModInv = -1 +A = 90c662ecf8523ad82263d2fd4d522732a676688e7d46a64187fbe78a14fb44a778b94795a9562c532c4af3e1572a85a01a63aff88205634b28c14169e08b87d5955bd2926d57311b98c31261e89a11e1bd3686b3b205d041de28f903bdbd89b380fcad8fcd039fd43beea0e974dae285912f4ba5594304764483b2983b089d48e1fa1b6d23f870111a2392973fca3f38d18e9efa117708580a27e5bd46b6682966e24a83e79e6d8144c61655f8f5c526693c043605 +M = ce09106e8cb8a7d3166e77b6ed7724c53df561e11988c9f4940161dcf6b91d14dbd43e5ecb9eff0464de1ae910a3f89b460609a0fc17830c9541ce1debbbc02b6aeb7e9ae579d8e5d4535eec + +ModInv = -1 +A = -d33896324b23354a558e4048b30621494e9b9cdc431c29a1b02e8ecb3a82c46b6252f0e841560b5d0f88b885762c4cdc69a57d9ef08f7567675da75d5f8dc871e4ba7200472f1b282c394c2411a257876498fa72e2bc212d6286c33327b035c6e3240d0971ccdab94b0e0500fa9462366efbee2ebc37ae15595318ee347b6f67b2cfc47bf777f1e5796a8ba8e5904015acaba0848becd0dd3aaedb8712300a68c4d29923cc17c35d2c0133222ab4be7b69246fe9fb35 +M = 3765eb19f17cacdd11f46d22609b0e027ac83adf712810d7c847ea46a58fa99fa39729af964507867fe689132e116eac5c126e2fee1ca0b8be6f92610f6f987cb16a53bb1dd5eebc53b2f3 + +ModInv = -1 +A = 8c199e94f84209de32bcff8c60b8c26b2886b7741da5132473fc6ceb3545b492b147ede859002bbe63ecfed8815d4e70291129824b110d3e7efe58c4de007dc4edd37d7a06bd2ae55a2ce9c736f22b4c1e0c0eeddbb98798271aead15db7096d4a7154474eb37d10e29242e0b151cb2fc8b68d4b8ec43f20182a5908b8078033dac80dc355f786d9c94e5db6d71209124c4527aa431aecfce6245a9cb415168794554307633722ec15ead351ad9eeaede8be6916b0d50499ed07 +M = 1f83952d61622df63229c14e8f7e30e11f55779d9d4cef9b567f99be9c4e4f384dfba3889579f9cc06e581cc1cb96504cecea46181dd189acfdc2f5ae4b142afee96053226e156 + +ModInv = -1 +A = 1205170c425546c8244704265e82e63f46d582b06b2f6dc90c0b7058f8837ddbcf15f091b1a382f72029ab80d0b6119e4899f76378c2c8dc54acc275d978e4b9ee6e1109a4299094985c537f56aef187e46c94f1f63017dfc1d1ff947298d2cd4b5ac8acabe001a8582fcabc1ee05f0106b041691d7736b4271fa46e5016e082dd24959d5c9b7021f715d8cb20c7b7956224ec623519b377188164378d07396d55f62cdc950e1edf0393f328018161d61ae9a2298bbf146d8a09 +M = 17c6a0623cb6047f49c870798862e624ebd865dc3dce3e51eae20401b448d66d1374f5c9c6b4d5bc89f245bcd862b8212a46e442050c9b75e03a09bdd5d629945ecb7828e93d9e + +ModInv = -1 +A = -4bd08047a0ed30cb16ffb00d3e368c59e5fa267b078cdd3911052848fbbc9026c68cc7b9803ec40a66011a14a9ffe2161a3cd4a5d1381e8abba8e0486f35d813d564b4f09530df5d18b8bf19dd71fc7e9fd33ed50bf6f23ad6ee1389ecd1eea90c72e5ec504f4ead110539030cfceabe2b6f770bbf896f2ca5fbda91b990aa85ee524a96eb97498ad7bdb091d4b0da48e57414ab7ea75b77589f73e3958f676962242dcd1099d8ccecc1cf17f28c81792b6a14e022ed91a213ec3a2e3a +M = 4b9dc635cc22a4bc8cfdda373b8db7e05158f693e676f923bae21ee2ea3cfc2adef28cff4aa823181e3179a99eb97781a1385f6e03723674655887e24cf0cdfbab1671b + +ModInv = -1 +A = 35cc3616657eb197d78bcb1bb25c43a575864343df4b5e4215e64980d89608f7f951e15a90a3358261c2cefdac8e04fc792e486ecf8b685c9192e564bb6c006003e0719b365fb1bb9fc5961aa903f6a815f816b3a8d7318191d6c684f6d681ece56caa1d640e6bbdb038b28790c8a8a431349bf89f044d1e44bcd8083073c14e86d17560c4d2d6f4c681df7fbb4b8b57aee186e79085f5eb42622faca90ec169777088277f7c7aa285384bd77fce6a3550e98b3bf77f24a31e88001dc90f +M = 289903d5dbf6a59ef9757c596268848e74a9661a94d555b2dd7b9bdbf35d894936aca9bf57e05a1b869cae49ade90286cd8210763b7208d1c2bc6b6d601f6e876203ef + +ModInv = -1 +A = -ac6b238ad98ba80fd72323205129beef263d06ace2016285a8a2dc3512148b2bf966269c7ed5a8c76fa1fa23eef732ef51eb806ed94d61d351899c948379803ef702960e7bdfe5962dda78042964e6c6bed64e9b725deb9e575a7bb40aff2ca596e308a64744f66fc62ba5bc7b946ced12d9860e31df46bdcef1785454068906df0c1ffa8ec821a415c166d3d5f467ed281da94a56db9ed322923ae875f5168e083db19a660a74e479e405057c018e34b9a3d73a252e23eaae28ee69c2851d +M = 14a322c49e55c511bd9007cc407af4d06204115569eb1bfb1608c1f18604dab9ff6878319b6b6df2e9033c354267169c18900041fe8bf5700dca427db9a37200f563 + +ModInv = -1 +A = -8373d91729ac99099d9fa91d9388216799feaad3589591fba73239a9f36772e234ff88a30e5677e0e38afc51d3bf46a90428feeef6b31bb50e387d60d8be354f53ff164bbffab882e419810d56169858b153d43b18c6f33b2ce8ede9519b54b3945e5e9652435522725d22afe033a402bc2b657116c2404f57fd6a97f325185baecf2ea81ad09137b4237f1cf17a9c686f749b88dbbb709bd1aa848348bd427cf18e6f0e16d8fb6f24ce7ff83d5c3d3bdf588e0dfb1def0e12f0b21e58eaa341d3 +M = eb9f07e5439b3ae99f38451cb89afc06b925d3be7ff4de27c37c781b6bd231c646032369d12388575ab15f13389af7b64742e491753ab598e641343f8a17566d + +ModInv = -1 +A = 97f66f31798df0ecf5def2a3afad8f57c5b2a40b5ea46ff547299909995e056dc95d94d0efc10239eebe203e81b2c09a9202542257d5f13755fa0a1b1ddf34cee1cb9c69408a9f02c0953a517f73bf85b7fe1a3de579475632bbd0bd923a888ff8af58b1fa36518519a335c64efc78fad296a758bad1cd45b8ee7e15bdda6a7163033e0b0290e614ab51ccafe2d34aaa3daf6e3441e8b3a5acd9fb978f89654bb74fb46ac87695db0b4c9c010404d491766628d0967739fcef8102441e58622508 +M = 3513d246936b2df2e4e43a9a21c3ecf220f323450abbad76ee626a130e769233fbc046d12ad7fc2c8090a37eefd4685a6b56bb74199ad2fd2e675ad9b88b0393 + +ModInv = -1 +A = 6035be5fdfb1d5854d5e31811435ba4694cf94ea285e73b321ca45276fcf811c63934444b96bcd1e619fe4426c93835db48cd6d7d3d92d3b310c239bf4b34f02077abf7aa883b81ea86a06ef9091754217932b193d8de93656ca018d8d804a6ee6ec2747f01cbf5c59f9d18caef3e37758f653e12210f608a2427f540fba217a0682cc08205f2bbe6bc58954dae5420431626347a7a2e5ce74c39080570f1bd183d85d5dbab26c9de6a095a06413da3055bf0e14eaad398c1bfbfe4db1215f9e3a3988 +M = c0e2b144da898f5bf91295ca674f38b827d6eceaf18f0db51fad2f6961d9d38a8e9c24b7f78da79563db1dff86a6c2543ad01e8c7b6d0faa32e2f2f9a2ef + +ModInv = -1 +A = 9d476c323776ed2e6a7a6061bef42783a476cdfb1ffa521a868b638a51efb3a9f68ab68aae594af2fdba72aeda74167bba558b2be95fda97fbdaeb7bfb033c401ed6310708d74fa28aa1b52bae71d2f6f61ff8a27d6ecb60bf0d3b1f145a44925ef4aa26bced53e59a9d06dd88fc1595d9aced2782759d4fb95384e1f61ccfdd6c6071de6c891831e176317ae24cd0cac7cc14bf96e45ddc4daa311dd98121ab7296b2805e3d33d90cdef0efb0be1df6648dbe81d19302fcc0ce99253fca2542c09bc865 +M = 3d91058d76082da5d7b68166d2f06f00b2c371680151b532e323163998ae5d1cd76567228ce4b17bd6d9b245fb3f12ad6df0fb5c0707bc22a27e6c8b15 + +ModInv = -1 +A = -976e3440eec5338508eb5750166e36f2a6c96abab5077c67daf0d8bf6a44e49536cc0317ccec4c665e5016f19dfbacd47d443775b4cc3d2b6c65b71c999390f72b6cab48f4c98e45d743081b513d3a20f430105eadee95d8ceced8c0f70b83f6eaf6f768c3527e0a82eee04d85c5852f164d010c91469db4a07e7747af97c2d1430a5ec6361bcd537c3241b947681a0820c49c0f146cabdb0efb78b593d32f225bc758e01c8c62f51fb9d557eebf976f4d6633f0bdbae0103f23ad52e289b45edd5a4b5a1603a445f3 +M = 93e2d250435a74589998f38738b9a93a67593c26547c15bf766b0a40c92744bf0afc85d07c1c148ae2eaa261d45786319ab7cfc2edf9a4c + +ModInv = -1 +A = 5372dff5594827e57e83a4478a053702344e96db12025be94ec19d2984d8129176d30e05d721510e608ea953105fc14ba45363fce559058a90b4bf4f94b862fdf87ede7e2d3b5354a9d7da85204bc072dc7195769577dcd0722c94af8befb7b7ea4b5b33aa9eb812ef4089a92885d3830684d81bb2cca8cac11acdd38f4b0f34cb8741cdfdcdedb68e67e4267544bcccb02f2cf789f6167e592968adfbd5b8ce1d8460327eba1b3f964d601040cb1c2759d86867f4d402025ab6e4f126c4cfeefe7dc26a4f64a070a2 +M = a3576c4273f330dac77f352c8a8d479e64d9c3089196614d55162e87be24561c43b3d26ddad88ad36782fd5ad7c0ffd80f9217feeedf233f + +ModInv = -1 +A = -bd43cd40d830bffd0fdfa95c5172381d75ed4a6e2bac7a77829673bc96aac2c74e4c7c8608c846a49f0b355d73a2a88cd3afbe558a84c3987e9302ee5e117755dc110bf204a061d9ca4f3e8c926fa365fbec0548418d9f6a890f1d3dc4fe5e41abf7fd48607b3b6c72f1f50ca58a5ef33e15bab6d5682c55aee1f71d0601f4f4ade4f76161f2d7f54b747c121739238f10ad4d8398e70194c3528344754d7d6644c9eeba40e2dc1b448d9a0b00ccb0a34e05d298ec50c055f99986f0515f8081ac855520064682bd804bcb048a97 +M = 52a73a6df9bb36687bc1a414ef73f4eb58e4d8d4124dd9b6a9c52346108dd6fe605639bdac7874bc560c2db9b960cfb048cf60 + +ModInv = -1 +A = 2eec3d1ff95b8c551f0a35359e3c30ca5c42e5dcd4d081c736beacb97d5a5a26c5d4bb53857ae0cdec2cfa50b2a3a22ae9610441156d78887d9d597d943582440b7962a689be5939b28d100d04de9d715c396c12f06c78ed79f4c0b50255a166ddcd352cb86cb2aec4543320734930baccb0ff72b095efbed3603430eff4a29db048821ca51570a05a91eb289bac790359e117fca37bdf8a858c6a98400bc89f25e3c9e5d6c796c1da36d2bb516827a7555e0ddcac69a6a965c40232c935994430c7806fa222569e5ed0b2ecc0fa48 +M = dc4d86f1fbeb91758e814902474fe49ad16287dbcb2fc29710f686ec637407fd2a143d41178a762ec3bc30a97d8508b6d899 + +ModInv = -1 +A = -f1bf685e5a78fa052d0d694b01d8dcbe55c9895179c11807c120c3cb31402be30bb3682671879e9939797bf7b6a2d29cbc3b658a7c3f783e16f21830ffb3004ec64fc51c1a25dc029fc098a86c423ad625905dff851ad3afbaf9eff037318ec99f10b68a90b6efc1d54d9eac6530d8d963f0e73fcd9cd0403011dfe9c18bd14ca4a0182afcaf944abb3c2ce1012e85e12ef17db489e18e9783ac770af82290fc8b9cc0d7e9ec2b75eb6438726f73aa7487c2bc2fe4498c8a1c04c791ab050468716ff42074eea0adf3dda46bb5ad5a57 +M = 3f04b9162416946edcdf61629f9d6770c0f3f6352b43997cf59a3e64d71fa88b94827a160a9608d90d94cbc71588e1bb6a + +ModInv = -1 +A = 79d749c770e4545c4b8dbf15233c51683bc503a3d638de1fde422e069c6d6cf61addf350f60b1dd012e3715f986eb667c75d6410be9f21dffe58ec3c01753ced5a574cc54dd946f32ce59e4d2314b1bf9a046833c10443729f89658e0a119ab8b0361ce8f34940623f4907f9c7f3ac72633a4de171952b74390960ed670efeb0b4fa64c505578587405eb9cae3f615d00696c11db21ab383a415569d6d3f1de728ccf915c4d90673038d46f26df12eedb835c9329d50f08a4b73a1abe037ec50d4a7aec50bcd3c0a66642b3efbf9fcd6c +M = bf4d32df9ebb9135e62357fcdb750422c4fbfee01b300a9ada9958bbdbd59c467188b4e86a437158205487fd19bf75ed + +ModInv = -1 +A = -e4ce186e1a3c1f7c55a9fdb9c449af77e5b26b9785beabdddc205005337566f2927dd88f8c909fc3c62b1779428d9d672b207846c6359c9deae6c438bea82d3aef37921b79bfbd241bb3da1424411df35d0317804dc96ce414a3389bf0676d58e8af44beca6331acb2aafb47ced57b39da5340a9d5470e07b20f7efe3aab9ebb5de037762e784df3da0aaa4037b59deabb15ae192aab23539f80ada02662203794e0f7069ed24c878de900c9aab87899c40db1f487cad05938553412052c865fd0de0b8c9fa1504f43a65b3bcb1df74b8a3a15 +M = 91cde6efb64779e8d087341530f2560d0ffa1ce498c38dbaf76dd5b8104f92dd5f75bc264bd5c2844f73d765f1e5 + +ModInv = -1 +A = b1cb8af81e6aaffab11697b1d5e6498e847bf9853021f31e2cbcda6c3b52256aade65c3455a80e0bfe7135b8c9e67779aa70cac10efdb5e3cad1be495114a40235f241033b9d577dbe6d89e76ec37ed82e78e458a530c32aea3b16c189ee481c47f15db96bb5f2c9d7ae5f97173a7e83f8ec980cfc683d75a0364d5cabad95cc803929c2d82808b6be33dbe3531e2d843a036a595f98aecb7e2af26cb744325fafc8635769e9759643e1fbd5bcfd9eb80de8b9b52ebea0eec430556894a682bd77394d7905dce77d5d6208ebb3b33bf91f4fc62 +M = 8c2ebe0cc61031fe482fddc7bab96a1330ad5fbdd6fac8aec0efcbecb566191875c0c66f3451d002fb95106def + +ModInv = -1 +A = 98f7afdde9a1aec33d4e13fe76aab75deb80bbb20d4e959ba11793f69843015a755369f001978215266859b8cc05d1e2d0847be079f9c7f30c515824d016c998be41f61b701d62894603d6e469bbf98f02ab39d0ec09071ea0cef4dba1cf7355d799297f8c105307f29ef2dc2edd1260313f441de19b28387921bdee41982ea8662bdff02c7fdef7096eabd5df2badb9a0427f43330fdb05785e91bd9535497f32428b2f12602db06e3144a8a1256d3e20ea5a8eb107494ca30d75b2c8fd9d46d0c0a42497bb7e3405e292289f01cb71eb524dee9 +M = 6d0f9748a2d25501f590ded85f3396212f36f9f06d1903d0fdb0d0862778e474ce3b8b83033251c0b7655287 + +ModInv = -1 +A = 9df5105912960426818ec9314f51e67562a453007eb5e16225823ba1ba567f27754892023530544ca15013a8a5c153a3f6a88d0e0b06c90ac0ed8a5c84f959a048142e88fb4f2222b559cfa74b03bc0f007088ef7ea1217ab92e7724dd498f67f2c91cb846183fb38b916cb0a09ae1bf31878f5535a5b030fe4118bc3a75922b72bfdde0f28dd5352629cbc1e85ed780596a8eda939c8f7e3b88be2e2e76c899dd006bbaae4a0094a92d14d24b1bb0a07bdfe39a8422851b9a817f0870b20d2b6cebd7b8f504181a4be2ec0721bb9b0ae3f3be976aeb +M = 354897f874e41b9168e6fc4fc7f1d88e578802e9fb4d6d3ad9d5f4b6fb0ba0dbbeb29789d3f07bd72cb502 + +ModInv = -1 +A = 647476e4ae5633cb4e023384458b1f7f54479e1e1a6db0184538f42766e1ca654520c1edc2956175661ec2ec6c590cecd7a57b2afd0ef1fe95d799177868a416f0a6e8ae9a6b50e4a4f5c83daee359065083a44796b0e84288ea9b5b7a865dbc1507a294e287df17651db2f8cc93ff2b66b70a9ccd2a1fd9ba5b6d61e6000c85a9e94b96de3b4cafda248fcddb13b5476689e6c51674ac3faf069563d4872d7b0156c459bb33426b5c1d0f4f3798994a26d23f0dcdb576329d7d31fc6ed70902a97fc4e2a55e525fdd9c48d767fa4f3121ee09e5d0847e49 +M = 91a5fcc9792cbe36fef816aaeec6c8b632393f91dfd76be357b5d8694c005fc2a0551fcef69445cfa3 + +ModInv = -1 +A = -f7e426eb65a3f9b832484c666e5c0ddd1d57d8484f0d07ae54491b8625bfbf8d8a04eeb9f8c8583fb358305308d7d70f4c78addd51ebaa4aa43908e030e696cc032b257485f69724be9b463cfab674d4cf9b5c8e680836fe966b5ebe678b60394d43312a0dc5623c8a4ed9ab7ffb9920e18911fc12f682f5b7b53f9623562ac045af08ef68f4e05e7706b6ef5e79f79439491c3373f4a42470067329723fe04351121c99fd444db1fb7a0d64e34cd0bd1d06baf391c645d831ba03a598ecb72cf2ee7361d15c8049838ab9cb4672d5aa670cb97e2b601de235 +M = 1daead6809a009f3ade24567bbf2b0ce16c78637486faa8ec2bb1af99a798af3bdeed3bdb18f104d + +ModInv = -1 +A = -5071846d9ce6b61d2a94f1a98a3de8ac8deda9fe43551dd39c86e94f9ded2da4f19c51c0272b372f2f160ad7555173dc418799957162a24b85c6725b6f130892c2b582bb58e1e967ad0eb124dff806db233790bb9373f3f32c4ce76551167a958a3631e16c010d5978c41b609aec929f49cab6ef191db3d2ebcccebd78f144606259885c1e3a7d9cf2ea9b5505c2ef4b5855e9b1e7f9c83a25f925739629c2876787a3e66ab515927e1108e76b1a5fc3afa491feb4666de957ca93f2dd820b682ce7833eb5f46d7f272ed4c57b5030d714db7b580d300b7511 +M = d29b25579706e807c6eae9a137fffa297b103c9aed67db721b3e40e63443dfd1cbe64b518ffe3090 + +ModInv = -1 +A = ddcd3c3470f868894e4f3abfcb631f40fed6d20072000460f85df1133302b9f09f592e814bde16983b67d0cc350c86bda2358bf15bec09ff37ee88369b3cfb04738372e9ef9ecd780b093f5150afab148ac90ee2823cb96f623e45548cbd89a36e790a0c306c82cb434f44c7ba47d0dd0a0649bb9f0cd28b0619fb689f704cc724cbb144732182367d212232d18da5d14029eaa1af052b734fcc155f55d86011afd7a25994bbad230560e717914fd494ea142225af3df8e2fddeb4aaf23050fac4498e3f3d213ac84fedbc7bb36c680f73861f54aa858402a6c7 +M = abe335885f07290492c79abf0377187b33debaebac9b584eb831cdecabcd08ae19cffd09c3b14d + +ModInv = -1 +A = 7f1a8569f28988a56aaa3859ea648d1e657ae4591e21bd8dc29d0da77cc7b2d6d5a489464a95f6feaf5af57c3e850a156e1aa9190c21524c7f78ccb2e29e4730c2c3f546c0362a915991704296625e07798f659294df7556073bcbdcfa3f7a6f203c12e4944fb82f2cc6e9d3dde051c167b19f188dbd0c5b1a4d10420c2171a3695e03a8a5b3a385617d89d948b2a761c6fcaeccac11b6153888d3e9ecdf9af5673c03ccd011f19c5b5e93798bbb46a75121215eb2ca40553ef178f55c16e7af2e8d11e14054e37175a3124b3aea2420849829820db1f331f51c1483 +M = d18b4bf09e9f8156d69eba859d8321d64b36359854850686d593bfbbecf04695bc1de1a96a + +ModInv = -1 +A = -eaf36502f56dc2eea1345510a3b9b14dfcd27fbf23dfc885acd9b81dc71c15f697bd93ff0d00a25d5b771c2574826c6ee11c436ebf67d2db6ab0149cddaaf6a7c116a571725398f390b72e2c35eabeadfa2a1856618a53c14c59bd4297fb1dafedea493bb9e2de240c4a562ebf6a51105c784e0abe1e9d5baae36976b8b01323ad4b962f90680ef512f6a1e7c1bf7504eb9dd6950d88548f0dc2547c10496aa9266d31c1dc77ffc35a956a9ee8ce858f81585c4a41ff95cb03897ff9e278a1e65e7bb2c68db4372a796dee5d091e1d971bdb843765c173bafe24064d5817 +M = 86538b7bd740f8edd462d736ae227ffd54fdfcff1680cc77e32a7d3b5585eefd11a946 + +ModInv = -1 +A = 446c1c36af08855d7844afd19c34452f3d9e06295426352a7d34fde0cf330a23cc375c95b1477a6f4c2ec27bbe354bb26e9006125e1ce2df323953ee1dd5436013cd190220f49204f3dd0b9cb1af5e904c724c0063cddcbd7e3baf78746dbe12198708ddd5c42f1b759cb5a90637a827ddaa48ae1353742ced18b60e426a815734320ed55f53af0939109e2f454d0727d6ce710b74ac09b21866886473bc4a665e0d2ff384bc8f94c79059215457485dd9157c17c337d30a72a90a48be402f5f7202893d2fceff7e6c0dfeac59de41f4d1e48a9ff32aefa615830a036d06b74549 +M = 9b771b47ba0444be26cbab565fb6f29c51258f3d16ef9891cdc61130511338df + +ModInv = -1 +A = dd2689c5c964ae73c3b89f17dbad11838dec4cde461f2e551dcd219348ed9ea8b9b52f985d06a3fe52c750de1d0601122856bd4b221b084e35e0252bc7939ffd3cd6cd87a7c87a55078c098009a0520f9f83a3faf7fcf7f0a0bcbfd0f8a6045613e0e4270c55fc5ba8f1f84841d2ffe2477649527a33a7eac03b76c018f00a6f84f7ea062a933f0c1fcb6422b91bcd661d79c7d80b468376acd8d30d1aa9b5b357dd0e7e79596ca9ce75a929478a21efd8663b25283d72ffb709b06b6235ebf4ec7c4aa589b59bc179d35ba9ab4e5419dbc12ff0c1170cd2ccf69960f82d5ccaa161 +M = 804bd5c301c5c2b1f76720c1f1a650957ff7e122a108bb760fe5efe6293cd7 + +ModInv = -1 +A = 8d0adcb31ad5317e63a98b6f75e37312bf6515131faa12727869623f1b1c88135ff660c3a00cc56076db5ad9a95b1a6e94c0a0a2159820b5fb0b03c77a0c7408f5354c871690880cd59a3c681eb8ecef11ca83bdb3a3feb9d258e9029ea0fcd447c3de7ee6d30aed0cf134d341647ddf66edaf6764afb9ddfdfbb1e5c4770b40be468ad20b99184edeea229247353e8be76c232538e16057124ffd0f993a96f3b874304dc1cf87f548f5a77bb34e9f9073c647cb2f89706f0ceb812cdc5d63e318cb6061f382b59a1240fc4d5a85ac842cb2e05511a4a77333da8a950d43aa9c72a5 +M = 1e6b616df6d6940cb92a31c3ddc4010565a4a559ceadaeadfe2c7da2861660 + +ModInv = -1 +A = c4db38a5f6d2027cab30e53724435cff289dcf8d09878e5ee6ee3389c10411601fdc2021f1ffaa9d5f2628ba5b596763e8147347503224b12db96bc807f8051f1570d4f0864704eb173a46c824c4e4fcac235c8783980748a0420bbf3041b5b30e734bcccd65b7a585e3d49e0859412d5563ee0e70f75f67f30919b1691d8d10f110179f542ab9637bdfe7c3a98d1f2cdf55285bce00f3d5629b4e675b7e24f0dbb3e4f3192da1daee7d1451902352248465d121c65b5fa22777631938d0c8cec706be69276f66a233e5d7948ae58b72839e53a057bca6a0f504fe69c72990232a261166 +M = c16ac0709423d9be78b3da2be4456be2b41aa4877ba7c3d106456298d1 + +ModInv = -1 +A = -2bd5156aec7e0dab30abc3ef17bddc0dae7a6db7f8e648b435d81ffd2642f2a3d3acf93220eff05b6b05d26256614c24812592d51508829e0ccb57df50b30970c5d3d5a1e412e69bc2d2dd698b41ba2ef2d2d7d38248f9a43d7dcfbceeb67bc344ed46a5fbfc2283af204fb11691a6c8c5b94c2cee26fe65982e8088f448d3f54068d28cacd3035e28d9951cf2c126f0ce68ca35e7938ca62badeea972543976fe542801fef1c5f6b2ffcdbdce04ba9a40ce42e46aa8a49d491a5f1a59a9badcb61223dfb819a5146af7b5f72a60a5528277bb89184c89928fa4f0cd451cb9fd137f7ec407f8 +M = 1027de65eb66230bf5b6dad020d9f21f1e8e2b85bacb3015b9d385 + +ModInv = -1 +A = -260465ec5a4030105ebc6cbadd1ce7ef2a92db40c34343f8b81e288b9e8dddd42ceffc6457af38fc6c9e573ba4884b4903b83bdbfab6739cb4df5f8aceac208b77d9a14422a4d4272b864c7b219eb692404494f8f25077993344f0cf256884a8427a8550ad420e8619845a85f2d3bc58a2c12114df36bc433cb6306eebe973e6c70e1ee6160953e22b624ce552529903fcc0060aee830c186b6ecd0a82186e413e0bd0a872ebb265b79116f8f473bab290bba7c8063d797761a4e5087e14a829afcb3233c4ce6219735e2320c47dd631778b2d69779f87ac73384fad7d834c70d80462ffd3dc +M = b69f128e4345e727ad7a9e8d6b9f332efdbb0ed2d0d0aa4022c71d + +ModInv = -1 +A = -6f372e05896adb3c5c2b76f4023b665c5d919019fe9f25e4e8b619dd91a5ce314060c71016f33e5178b9add46262006f46336ea390f051eb6b2cd21e1b0c3721d321c3d41ab5840ecc42912066f94b69661a50a5ca63879a98e501b10a2a389e79e74cf0b54ca60d3b196aeb98a98b4a3bdc06683c677c54f1c7698d92c1eeefcf50fe410d4c64b3b7388b7b28275f81fba6625c8cdd57a8a3b07b90f891677b9ac5b10e45ed03728cc3423ed61c5e1b43d7a86f42a7a53bd690e91f9066af401c6f4e8717f912e96b1a7a0160ad441a6947d715087d43eafbd8fa1a7b32b553d3d0e83ee1f893d3 +M = 6ba5d340c94ce4e6a6b898411481ce8924a277e4402ffb87ec + +ModInv = -1 +A = 1ab0a318d0114156d878233b283e50c4a2c4bdabd6e1c2444862007729b141f333227d6e9665726139b14e9fa3f7bfa7bfed17502541419bde3b0ee1c4f6e3b0d46735ab507a7ca85953bb33b80cc9c4239d3f54aa25e057e8231e74bc8c30fb6a22a763394f8288fa2356bf960a9d3d13e9130bd207cded07473a76f3f27b4b53b931604d85607179fec66b2ab1c7f93d6fb7fa1c382b3872363dd46abe18c723cb08a80a5033a23069be6605eb0869b4aa7655a34e17968a9fe40716debf36180f2697aa49b3cecfc29a02ba8a0b10612924e504fdcfedab705b6c6ed3da9b12bb46ac4a37a8c4 +M = ed10c5843e17bb24ee1cbb38d1201da828d257d34626495cdb + +ModInv = -1 +A = 23163d0cfa8f2f58f2a36def3dcc7aa6cfed029f069d2cccf47e2a0ba0de0e0c995274f2c159b24b81893ab978ed944f5f6101f9db2ccbf571e558fa1e12266540f23fa5d7a84c336f30b84d4cdfa29b399ba6f00457230f438bb863443191b6ab5f42b75c15a5e2c82fd180bd3a5d2435987531de42b3c1fc1a169939734bfea5d065bcf4d132223d267eb9949b7a45ae58eda91b5535b805e5ff4c91feabfdfc98e6a091bbc28ed49ffaff89548c216168f151fb2f19906311ab687f45640876a95f8ac491418f62ea70e18d3ca187d32d66d6073ec5ac3f538a9566ab5f111830618275f19ba063 +M = 5ebc20d0b9be0ee9720e2abb7f1f84eeb93add6e923c03c5 + +ModInv = -1 +A = -c02c1c4c12266e0a678b91762bb9acb8f12b41a70201f0095979af127aad62fdc1f8c3444de93cb483655d77b976dd67132c8648f37b47c92dc4a663e3107ee997cb628dd8c3dbe2d893bbaf7bf60739ad81310df3903c38e8cadb85bce5ba7e688824f408a2abd33b6c8b82ec55d74b810e7930c1d975cba3e366b36af27aacdebb241124dd70a85db4b04a3b6ef18d05c050f52c3856b2f7f30c798d5bc574da8d292813d1b6701aa6c4d42611023454cd5d7d2402bd1a3effae7e70314921e36ff834408cbe20c17c2a5b0a9801e031c92e139a50b05e54de64c52c81a6dd72a9f8d78864a49e1cfedd +M = cfb4e5213c289fea4ca3f7a879678dfb719f713ed60b + +ModInv = -1 +A = -ba037999c23ad15a30abad9d11f1cba27070d9342e3587dfbbc6f63efed585abaf926ada2d743eb1c691686ada2d4a0d860c2edcaba21b963f8d2293005f3ff1383132494409f10d1218d0ac4328ec74f4d519b20e54656c5a9096804f9d1858120329aba04205cf7d265188e6e1d8d84685bc8cac2ee4945331ce7ce5a54c34dc729c808feda44583f9a6c0eaa3ad0a7bbbd397a77ab0b31e0c3a1e358496cfbdb940487c7bedd6e49285a1c061fde3873f1eb46a7d68d5e054e5945983f0c9e17923be2eb26a8d24b86cd18d2121cee7728aa0bcd14cd7b435f07704f691ca92352867c3cacb26c7d163d1 +M = 6430fa0c6f04cf191b3df2828c4701155b30989d5e + +ModInv = -1 +A = -d255d1cb64c9e3b9072121875bdac633e4e6ecbc30da549883cdde80b89146b9f828f96ba4a4f74efd3bd79ed1bff2bbe5b0b941101cd926be1f91e3686d58a89576d53a71551a403d18579e1b9d442e534578b3f88d40b0c339f36bfa5ce49382b58dc881ce3f18a5acb114f68f6448b9d041cf57b5f2be676a658c560d58ba9bdbf91f05fcee2042ef70904faefa6adaaea854f0e0e6edeb0964da3d972e39bd78aebb6dac2918863f868f3b68011f8fd348c7c4cae8099a888765a8a848e2c227683c5aaba332e43f2d27f65c2a9707abc9dadbdb418d4c28fce231013f1d7c7d407b54b274ce1e9bb66351 +M = 36d4b45ba071a78dc74d132bb7883c3de7be4e64 + +ModInv = -1 +A = 1fc8892c8b76b05eab89b29ef571f38d43e1ffde92c88e9149912bfa4fd4fd6a235e311282a509928a8c2fd09530d896d3634f2f4b17cf6ea6721837520ed95985aae5bfd719eaff0d52892e366e554e504a6c7dfcf0587e73382c3d317d6a719f22f15edf5caaa3099a91eca7b5c0ab62b8278a3a1564cfab3b4909a854e9b1bab6aa1b3f827e894aef25133c931d82338150fbcf5b06aa665a2df49dcd9b635d1a4f04ed1b9edaa00f886b683d1faadc620b8c17f4da496f0529cf135794bacc6b36bb4610940f5fc9d021ca8fcefe170101073de5d98121336af914f5d1f99bcf98e4de91dc57364dd32c04 +M = 4dc1b8f67ba1a9cdd9985cee44c5030d71c8b4cd + +ModInv = -1 +A = -a4e062ded1dec668f74063438d6f7190abb052459203b95fcec4cac85b9c956ad42f7474bbf50e3d76e1232c5be7ab3be31e73b2311e9fbfb5c4a6a626e64b128b78c6813213551672b0a93262ca307eb4708875b3936146e4d299c85b8801dd978f0242fec5c485fb9761475a6fb14d6c353155d1d7d6e6f1363dfab52754499a5f54a53e605194d1887eeac887df897df79d7dd3d5f5c15507e62f90a4cffbce2dd00bb211d31a09dd6c2d103efa7a5870edfc572cd7335bec71bb046c2c024472a54e861a3795484004ad94bd3bf5143d0cf92d50413ea62b64e60a86989824fb88261fed5dc170614eeb11 +M = 617b5d0d4047bfc5d9dfc875c6eb66b26119e94d + +ModInv = -1 +A = -968c94d379859583fe85cf83bb6613a473e33c401f3246990843be097c5fb25b017b88ed06cd646b4be4b10bed763e972c8dfc34863e2d9b4baf2c7ade779c7cd30f1c2cdba687f8d1843faab949587c5d51c278405798d75b3a76e6a04ed6ac729ba94a39f4382dfa5424a3dacfbaa110c584ddcae5a351756d7249eb7ded293c7ef1ce3921e1083af546c5658b46a1888b967c1c396fbe344c9c0afe9cb5088fefd38a2b3c4812a8e4901ae3cb4f7c541140915275b9040735cb5c8da0a39c84edd0ee01deacc552756e7f9e7618dab04d06f18eceab4a0198d848af62c20fe0076fdf628369adbbd095b03e5e6769295c23dbdb674b2dff +M = be03e1235d355254 + +ModInv = -1 +A = b4760d34cc8d4461d0b7a49187914a0b797fcde45368ae83617b4483155593ad5731737c5f976d66c38c02ee2998cf43e904ff58d07777aa40b0dcd3d73a7a9038660874545fc94a531f3d346e703603aa1fdcedc20b61156eb2723422f7698431eb05ee568fbba2487d1c994377e93689d0a2be2675824f7a2dab07ad2513a6df930ffb960b8fab2442165d4d3425caa407b0b2b5da8d16fd652d254ff9b12feb8f12e954d03b2fec623878b527b3d2d476163f6112213eda14e1ed98f7607331cb7694f2f7854564bfbd729a4f045aceda33ab9f2cf03fff8102c32f4bea6258a6c55d78377f1f82f5264c3bd5467911e9f6e5011b6cc602d +M = ffd724aabbff43 + +ModInv = -1 +A = fc55066a141e1af9043c2deb778826081b2074fd19c48b0023c82f98148193b3f7944ab64995dd4bce865c1a6103c8e35f15d93a9748c5c82ead4b9dfacd23083c678d2789daa41eeb13b713cbd24fafa7ec283ac3ce94b23344c45f68ade2efa62162114cfd4c6c082701039264cc15391f40393e39c607c8aa609345fd4a5a7ef944e5a86b986b9ed422d7205842167f03bc6bf0f59275660d804a88a6bb1f9af4939fdbca826c455c184c3e7a3d35c17fe2928266e97d30c1df6d36e365e7e0ce0337fdb0a6c341a9f9c8fc32dbabf931a9aedd16f8a1726c825a7024644b8bf214f9a27047a53a8602eb743f03fd7c954258e4482eff239fc725 +M = 239414d1f6 + +ModInv = -1 +A = -73c3ac417e4d253a32129cf724606129b2a02be60004218bf65147e0546d156733329331dfe15cddbf9170cb1a4c6d6aa908a80726a8e0ef2ec5e86924d39b3e7fdc514557f9f092599bbde910446f1ad33e3084678fd2f856a0f9a1c0baf692a014fbdaf55095aadab5f90c31ecadf3ee73f433947efc1dcd2b24ab903d30cfba35533f5359d3bbc635fb09c15261f79827adc2a22272bf4c4c9cea461841cd917919f7c7ea3bd2887c9df1adf9d76ffb125621462092dddd4bf475acd10bf3d514fbbd8cb4299691eeb1316bf48fd32faed002e1e292877641aa9fa9d526ca59e01656388d727223e4727acefb7c236072de2f0add2835f2bce8a791 +M = 18cea336 + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ModInv = -1 +A = -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + From 18a19d81b98400e10feb374dfe1b9f889ea38a3b Mon Sep 17 00:00:00 2001 From: Richard Levitte Date: Thu, 21 May 2026 13:52:02 +0200 Subject: [PATCH 65/69] OSSL_FN: implement internal 'ossl_fn_add_words' and 'ossl_fn_add_words' These functions fulfill the same purpose as 'bn_add_words' and 'bn_sub_words', but adapted to OSSL_FN_ULONG arrays with varying sizes. They are useful for partial calculations where carry and borrow are of interest, but also fulfill a purpose when that's not interesting. Assisted-by: Pi:openai/gpt-5.5 Signed-off-by: Richard Levitte Reviewed-by: Jakub Zelenka Reviewed-by: Igor Ustinov MergeDate: Thu Jul 23 15:02:33 2026 (Merged from https://github.com/openssl/openssl/pull/31479) --- crypto/fn/fn_addsub.c | 301 ++++++++++++++++++++++++++----------- include/crypto/fn_intern.h | 7 + 2 files changed, 218 insertions(+), 90 deletions(-) diff --git a/crypto/fn/fn_addsub.c b/crypto/fn/fn_addsub.c index 2e47623340..ee1c2b2aa1 100644 --- a/crypto/fn/fn_addsub.c +++ b/crypto/fn/fn_addsub.c @@ -12,81 +12,152 @@ #include "../bn/bn_local.h" /* For using the low level bignum functions */ #include "fn_local.h" -/* add of b to a. */ -/* unsigned add of b to a, r can be equal to a or b. */ -int OSSL_FN_add(OSSL_FN *r, const OSSL_FN *a, const OSSL_FN *b) +/* + * ossl_fn_add_words and ossl_fn_sub_words perform fixed-width unsigned + * addition and subtraction of multi-limb integers. + * + * The carry or borrow is always propagated through every limb of both + * operands (and through any extra result limbs when rl exceeds the operand + * sizes). The operation is effectively performed at the precision of the + * wider operand, then truncated to rl limbs — analogous to performing an + * unsigned operation in the wider of the operand types and then casting + * the result to a narrower type. + * + * The returned carry (addition) or borrow (subtraction) is the true + * overflow / borrow out of the most significant processed limb: + * + * - When rl <= max(al, bl), it is the carry / borrow out of max(al, bl) + * limbs. Note that this does NOT indicate whether the result fits in + * rl limbs; non-zero high limbs may have been truncated without + * generating a carry. If the caller needs the exact magnitude, rl + * must be at least max(al, bl). + * + * - For addition, when rl > max(al, bl), the carry is absorbed into the + * result (written to r[max(al,bl)], higher limbs zeroed) and the + * function returns 0. + * + * - For subtraction, when rl > max(al, bl), the borrow is propagated + * through all remaining result limbs (two's complement sign extension) + * and the function returns the borrow out of rl limbs. + */ + +/* unsigned addition of a and b, returns carry if there is one past the result size */ +OSSL_FN_ULONG ossl_fn_add_words(OSSL_FN_ULONG *r, size_t rl, + const OSSL_FN_ULONG *a, size_t al, + const OSSL_FN_ULONG *b, size_t bl) { /* * Addition is commutative, so we switch 'a' and 'b' around to * ensure that 'a' is physically the largest, so a maximum of * work is done with 'bn_add_words' */ - if (a->dsize < b->dsize) { - const OSSL_FN *tmp; + if (al < bl) { + const OSSL_FN_ULONG *tmp; + size_t tmpl; tmp = a; + tmpl = al; a = b; + al = bl; b = tmp; + bl = tmpl; } - /* At this point, we know that a->dsize >= b->dsize */ - size_t max = a->dsize; - size_t min = b->dsize; - size_t rs = r->dsize; - const OSSL_FN_ULONG *ap = a->d; - const OSSL_FN_ULONG *bp = b->d; - OSSL_FN_ULONG *rp = r->d; - /* - * Three stages, after which there's a possible return. - * Each stage is limited by the number of remaining limbs - * in |r|. + * Four stages. * * For each stage, |stage_limbs| is used to hold the number - * of limbs being treated in that stage, and |carry| is - * used to transport the carry from one stage to the other. + * of limbs being treated in that stage, |i| is used as an + * index into the arrays, and |carry| is used to transport + * the carry from one stage to the other. + * + * Note: |stage_limbs| is passed cast to 'int' when calling + * bn_add_words(). This is fine because the maximum size of + * any OSSL_FN_ULONG is BN_MAX_WORDS, which is small enough. + * Should that change some day, there's trouble ahead. */ size_t stage_limbs; OSSL_FN_ULONG carry; + size_t i; - /* Stage 1 */ + /* + * Stage 1: calculate the least min(rl,bl) limbs + * + * This uses bn_add_words, with what performance benefits that gives. + */ - stage_limbs = (min > rs) ? rs : min; - carry = bn_add_words(rp, ap, bp, (int)stage_limbs); - if (stage_limbs == rs) - return 1; + stage_limbs = (bl > rl) ? rl : bl; + carry = bn_add_words(r, a, b, (int)stage_limbs); - /* At this point, we know that |min| limbs have been used so far */ - rp += min; - ap += min; + /* Record the array position past what bn_add_words calculated */ + i = stage_limbs; - /* Stage 2 */ + /* + * Stage 2: calculate min(rl,bl) to bl limbs + * + * Because this loop only engages when rl < bl, it cannot affect r. + * The only purpose of this loop is to propagate carry in this particular + * scenario. + */ - stage_limbs = ((max > rs) ? rs : max) - min; + stage_limbs = bl - stage_limbs; - for (size_t dif = stage_limbs; dif > 0; dif--, ap++, rp++) { - OSSL_FN_ULONG t1 = *ap; - OSSL_FN_ULONG t2 = (t1 + carry) & OSSL_FN_MASK; + for (size_t dif = stage_limbs; dif > 0; dif--, i++) { + OSSL_FN_ULONG t1, t2; - *rp = t2; - carry &= (t2 == 0); - } - if (stage_limbs == rs - min) - return 1; - - /* Stage 3 */ - - /* We know that |max| limbs have been used */ - stage_limbs = rs - max; - - for (size_t dif = stage_limbs; dif > 0; dif--, rp++) { - OSSL_FN_ULONG t1 = 0; - OSSL_FN_ULONG t2 = (t1 + carry) & OSSL_FN_MASK; - - *rp = carry; - carry &= (t2 == 0); + t1 = (a[i] + carry) & OSSL_FN_MASK; + carry = (t1 < carry); + t2 = (b[i] + t1) & OSSL_FN_MASK; + carry |= (t2 < t1); } + assert(i == bl); + + /* + * Stage 3: calculate bl to al limbs + * + * Note: at any time, the end of r may be reached. This is solved + * with a temporary pointer that's set appropriately inside the loop. + */ + + stage_limbs = al - bl; + + for (size_t dif = stage_limbs; dif > 0; dif--, i++) { + OSSL_FN_ULONG tmp = 0; + OSSL_FN_ULONG *rp = (i < rl) ? &r[i] : &tmp; + OSSL_FN_ULONG t1; + + t1 = (a[i] + carry) & OSSL_FN_MASK; + carry = (t1 < carry); + + *rp = t1; + } + + assert(i == al); + + /* If |r| is exhausted, there's nothing more to do */ + if (i >= rl) + return carry; + + /* + * Stage 4: calculate a final carry, for when rl > al + * + * This is relatively simple, compare to earlier loops. + */ + + stage_limbs = rl - al; + + for (size_t dif = stage_limbs; dif > 0; dif--, i++) { + r[i] = carry; + carry = 0; + } + + return carry; +} + +int OSSL_FN_add(OSSL_FN *r, const OSSL_FN *a, const OSSL_FN *b) +{ + (void)ossl_fn_add_words(r->d, r->dsize, a->d, a->dsize, b->d, b->dsize); return 1; } @@ -118,74 +189,124 @@ int OSSL_FN_add_word(OSSL_FN *a, OSSL_FN_ULONG w) return 1; } -/* unsigned subtraction of b from a */ -int OSSL_FN_sub(OSSL_FN *r, const OSSL_FN *a, const OSSL_FN *b) +/* unsigned subtraction of b from a, returns borrow if there is one past the result size */ +OSSL_FN_ULONG ossl_fn_sub_words(OSSL_FN_ULONG *r, size_t rl, + const OSSL_FN_ULONG *a, size_t al, + const OSSL_FN_ULONG *b, size_t bl) { - size_t max = (a->dsize >= b->dsize) ? a->dsize : b->dsize; - size_t min = (a->dsize <= b->dsize) ? a->dsize : b->dsize; - size_t rs = r->dsize; - const OSSL_FN_ULONG *ap = a->d; - const OSSL_FN_ULONG *bp = b->d; - OSSL_FN_ULONG *rp = r->d; + size_t max = (al >= bl) ? al : bl; + size_t min = (al <= bl) ? al : bl; /* - * Three stages, after which there's a possible return. - * Each stage is limited by the number of remaining limbs - * in |r|. + * Four stages. * * For each stage, |stage_limbs| is used to hold the number - * of limbs being treated in that stage, and |borrow| is - * used to transport the borrow from one stage to the other. + * of limbs being treated in that stage, |i| is used as an + * index into the arrays, and |borrow| is used to transport + * the borrow from one stage to the other. + * + * Note: |stage_limbs| is passed cast to 'int' when calling + * bn_sub_words(). This is fine because the maximum size of + * any OSSL_FN_ULONG is BN_MAX_WORDS, which is small enough. + * Should that change some day, there's trouble ahead. */ size_t stage_limbs; OSSL_FN_ULONG borrow; + size_t i; - /* Stage 1 */ + /* + * Stage 1: calculate the least min(rl,al,bl) limbs + * + * This uses bn_sub_words, with what performance benefits that gives. + */ - stage_limbs = (min > rs) ? rs : min; - borrow = bn_sub_words(rp, ap, bp, (int)stage_limbs); - if (stage_limbs == rs) - return 1; + stage_limbs = (min > rl) ? rl : min; + borrow = bn_sub_words(r, a, b, (int)stage_limbs); - /* At this point, we know that |min| limbs have been used so far */ - ap += min; - bp += min; - rp += min; + /* Record the array position past what bn_sub_words calculated */ + i = stage_limbs; - /* Stage 2 */ + /* + * Stage 2: calculate the min(rl,al,bl) to min(al,bl) limbs + * + * Because this loop only engages when rl < min(al,bl), it cannot affect r. + * The only purpose of this loop is to propagate borrow in this particular + * scenario. + */ - const OSSL_FN_ULONG *maxp = (a->dsize >= b->dsize) ? ap : bp; - const OSSL_FN_ULONG s2_mask1 = (a->dsize >= b->dsize) ? OSSL_FN_MASK : 0; + stage_limbs = min - stage_limbs; + + for (size_t dif = stage_limbs; dif > 0; dif--, i++) { + OSSL_FN_ULONG t1, t2; + + t1 = a[i]; + t2 = (t1 - borrow) & OSSL_FN_MASK; + borrow = (t2 > t1); + t1 = b[i]; + t1 = (t2 - t1) & OSSL_FN_MASK; + borrow |= (t1 > t2); + } + + assert(i == min); + + /* + * Stage 3: calculate the min(al,bl) to max(al,bl) limbs + * + * Note: at any time, the end of r may be reached. This is solved + * with a temporary pointer that's set appropriately inside the loop. + */ + + const OSSL_FN_ULONG *maxp = (al >= bl) ? a : b; + const OSSL_FN_ULONG s2_mask1 = (al >= bl) ? OSSL_FN_MASK : 0; const OSSL_FN_ULONG s2_mask2 = ~s2_mask1; - stage_limbs = ((max > rs) ? rs : max) - min; + stage_limbs = max - min; /* calculate the result of borrowing from more significant limbs */ - for (size_t dif = stage_limbs; dif > 0; dif--, maxp++, rp++) { - OSSL_FN_ULONG t1 = (*maxp & s2_mask1); - OSSL_FN_ULONG t2 = (*maxp & s2_mask2); - OSSL_FN_ULONG t3 = (t1 - t2 - borrow) & OSSL_FN_MASK; + for (size_t dif = stage_limbs; dif > 0; dif--, i++) { + OSSL_FN_ULONG tmp = 0; + OSSL_FN_ULONG *rp = (i < rl) ? &r[i] : &tmp; + OSSL_FN_ULONG t1, t2; - *rp = t3; - borrow = (t1 < t2 + borrow); + t1 = maxp[i] & s2_mask1; + t2 = (t1 - borrow) & OSSL_FN_MASK; + borrow = (t2 > t1); + t1 = maxp[i] & s2_mask2; + t1 = (t2 - t1) & OSSL_FN_MASK; + borrow |= (t1 > t2); + + *rp = t1; } - if (stage_limbs == rs - min) - return 1; - /* Stage 3 */ + assert(i == max); - /* We know that |max| limbs have been used */ - stage_limbs = rs - max; + /* If |r| is exhausted, there's nothing more to do */ + if (i >= rl) + return borrow; + + /* + * Stage 4: calculate a final borrow, for when rl > max + * + * This is relatively simple, compare to earlier loops. + */ + + stage_limbs = rl - max; /* Finally, fill in the rest of the result array by borrowing from zeros */ - for (size_t dif = stage_limbs; dif > 0; dif--, rp++) { - OSSL_FN_ULONG t1 = 0; - OSSL_FN_ULONG t2 = (t1 - borrow) & OSSL_FN_MASK; + for (size_t dif = stage_limbs; dif > 0; dif--, i++) { + OSSL_FN_ULONG t1 = (0 - borrow) & OSSL_FN_MASK; - *rp = t2; - borrow &= (t1 == 0); + borrow = (t1 > 0); + + r[i] = t1; } + return borrow; +} + +int OSSL_FN_sub(OSSL_FN *r, const OSSL_FN *a, const OSSL_FN *b) +{ + (void)ossl_fn_sub_words(r->d, r->dsize, a->d, a->dsize, b->d, b->dsize); return 1; } diff --git a/include/crypto/fn_intern.h b/include/crypto/fn_intern.h index 46b5be7077..29bb6e5a0f 100644 --- a/include/crypto/fn_intern.h +++ b/include/crypto/fn_intern.h @@ -46,6 +46,13 @@ bool ossl_fn_is_negative(const OSSL_FN *f); bool ossl_fn_is_dynamically_allocated(const OSSL_FN *f); bool ossl_fn_is_securely_allocated(const OSSL_FN *f); +OSSL_FN_ULONG ossl_fn_add_words(OSSL_FN_ULONG *r, size_t rl, + const OSSL_FN_ULONG *a, size_t al, + const OSSL_FN_ULONG *b, size_t bl); +OSSL_FN_ULONG ossl_fn_sub_words(OSSL_FN_ULONG *r, size_t rl, + const OSSL_FN_ULONG *a, size_t al, + const OSSL_FN_ULONG *b, size_t bl); + #ifdef __cplusplus } #endif From 10a5bb87dc07647b4a1f78632a45ffe5fe635a13 Mon Sep 17 00:00:00 2001 From: Richard Levitte Date: Wed, 20 May 2026 12:20:04 +0200 Subject: [PATCH 66/69] OSSL_FN: Add the modular arithmetic functions - OSSL_FN_mod_add - OSSL_FN_mod_add_quick - OSSL_FN_mod_sub - OSSL_FN_mod_sub_quick - OSSL_FN_mod_mul - OSSL_FN_mod_sqr - OSSL_FN_mod_lshift - OSSL_FN_mod_lshift_quick - OSSL_FN_mod_lshift1 - OSSL_FN_mod_lshift1_quick Related-to: doc/designs/fixed-size-large-numbers.md Issue: https://github.com/openssl/project/issues/1932 Assisted-by: Pi:openai/gpt-5.5 Signed-off-by: Richard Levitte Reviewed-by: Jakub Zelenka Reviewed-by: Igor Ustinov MergeDate: Thu Jul 23 15:02:35 2026 (Merged from https://github.com/openssl/openssl/pull/31479) --- crypto/err/openssl.txt | 1 + crypto/fn/build.info | 2 +- crypto/fn/fn_err.c | 2 + crypto/fn/fn_mod.c | 382 +++++++++++++++++++++++++++++++++++++++++ include/crypto/fn.h | 161 +++++++++++++++++ include/crypto/fnerr.h | 1 + 6 files changed, 548 insertions(+), 1 deletion(-) create mode 100644 crypto/fn/fn_mod.c diff --git a/crypto/err/openssl.txt b/crypto/err/openssl.txt index 099fd75f9e..95d968db1f 100644 --- a/crypto/err/openssl.txt +++ b/crypto/err/openssl.txt @@ -889,6 +889,7 @@ OSSL_ENCODER_R_INCORRECT_PROPERTY_QUERY:100:incorrect property query OSSL_ENCODER_R_MISSING_GET_PARAMS:102:missing get params OSSL_ENCODER_R_UNKNOWN_PARAMETER_NAME:104:unknown parameter name OSSL_FN_R_DIV_BY_ZERO:101:div by zero +OSSL_FN_R_INPUT_NOT_REDUCED:103:input not reduced OSSL_FN_R_BITS_TOO_SMALL:105:bits too small OSSL_FN_R_INVALID_RANGE:106:invalid range OSSL_FN_R_INVALID_SHIFT:102:invalid shift diff --git a/crypto/fn/build.info b/crypto/fn/build.info index 860cc40134..cee3d11f66 100644 --- a/crypto/fn/build.info +++ b/crypto/fn/build.info @@ -3,7 +3,7 @@ $LIBFIPS=../../providers/libfips.a LIBS=$LIBCRYPTO $COMMON=fn_err.c fn_lib.c fn_ctx.c fn_intern.c fn_addsub.c fn_shift.c fn_mul.c \ - fn_sqr.c fn_div.c fn_rand.c + fn_sqr.c fn_div.c fn_rand.c fn_mod.c SOURCE[$LIBCRYPTO]=$COMMON SOURCE[$LIBFIPS]=$COMMON diff --git a/crypto/fn/fn_err.c b/crypto/fn/fn_err.c index d5c81adca6..69c137feac 100644 --- a/crypto/fn/fn_err.c +++ b/crypto/fn/fn_err.c @@ -17,6 +17,8 @@ static const ERR_STRING_DATA OSSL_FN_str_reasons[] = { { ERR_PACK(ERR_LIB_OSSL_FN, 0, OSSL_FN_R_DIV_BY_ZERO), "div by zero" }, { ERR_PACK(ERR_LIB_OSSL_FN, 0, OSSL_FN_R_INVALID_RANGE), "invalid range" }, + { ERR_PACK(ERR_LIB_OSSL_FN, 0, OSSL_FN_R_INPUT_NOT_REDUCED), + "input not reduced" }, { ERR_PACK(ERR_LIB_OSSL_FN, 0, OSSL_FN_R_INVALID_SHIFT), "invalid shift" }, { ERR_PACK(ERR_LIB_OSSL_FN, 0, OSSL_FN_R_RESULT_ARG_TOO_SMALL), diff --git a/crypto/fn/fn_mod.c b/crypto/fn/fn_mod.c new file mode 100644 index 0000000000..4fb8115925 --- /dev/null +++ b/crypto/fn/fn_mod.c @@ -0,0 +1,382 @@ +/* + * Copyright 2026 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#include "internal/cryptlib.h" +#include "internal/nelem.h" +#include "crypto/fnerr.h" +#include "fn_local.h" + +int OSSL_FN_mod_add(OSSL_FN *r, const OSSL_FN *a, const OSSL_FN *b, + const OSSL_FN *m, OSSL_FN_CTX *ctx) +{ + const void *token = OSSL_FN_CTX_start(ctx); + OSSL_FN *t; + int ret = 0; + size_t tl = (a->dsize > b->dsize ? a->dsize : b->dsize) + 1; + + if (token == NULL) + return 0; + if ((t = OSSL_FN_CTX_get_limbs(ctx, tl)) == NULL) + goto err; + + ret = OSSL_FN_add(t, a, b) + && OSSL_FN_mod(r, t, m, ctx); + +err: + OSSL_FN_CTX_end(ctx, token); + return ret; +} + +/* + * OSSL_FN_mod_add variant that may be used if both a and b are less than m. + * The original formula is: + * + * r' = a + b + * r = r′ − m[r′ ≥ m] + * + * This is replaced with addition, subtracting modulus, and conditional move + * depending on whether or not subtraction borrowed. + */ +int OSSL_FN_mod_add_quick(OSSL_FN *r, const OSSL_FN *a, const OSSL_FN *b, + const OSSL_FN *m) +{ + size_t al = a->dsize; + size_t bl = b->dsize; + size_t rl = r->dsize; + size_t ml = m->dsize; + size_t aw = al < ml ? al : ml; + size_t bw = bl < ml ? bl : ml; + OSSL_FN_ULONG storage[2 * 1024 / OSSL_FN_BITS]; + OSSL_FN_ULONG *tp = storage; + OSSL_FN_ULONG *mp = storage + ml; + OSSL_FN_ULONG carry, borrow; + size_t i; + + if (2 * ml > OSSL_NELEM(storage)) { + tp = OPENSSL_malloc_array(2 * ml, sizeof(OSSL_FN_ULONG)); + if (tp == NULL) + return 0; + mp = tp + ml; + } + + /* tp = a + b mod 2^(ml*bits) */ + carry = ossl_fn_add_words(tp, ml, a->d, aw, b->d, bw); + + /* mp = tp - m mod 2^(ml*bits) */ + borrow = ossl_fn_sub_words(mp, ml, tp, ml, m->d, ml); + + /* + * Because a, b < m, we have a + b < 2m. Therefore tp < m whenever + * carry = 1, which forces borrow = 1. The mask carry − borrow thus + * only produces 0 (select tp2) or ~0 (select tp), matching exactly + * whether a + b ≥ m. + * + * Thus, we have the cases: + * + * a + b < m => carry == 0, borrow == 1 + * m <= a+b < 2^(ml*bits) => carry == 0, borrow == 0 + * 2^(ml*bits) <= a+b < 2m => carry == 1, borrow == 1 + * + * If (a + b < m), select tp; otherwise select tp2. Done with the + * help of a mask. + */ + OSSL_FN_ULONG mask = carry - borrow; + size_t end = (rl < ml) ? rl : ml; + for (i = 0; i < end; i++) + r->d[i] = (mask & tp[i]) | (~mask & mp[i]); + /* Make sure to pad r with zeroes when rl > ml */ + for (; i < rl; i++) + r->d[i] = 0; + + if (tp != storage) + OPENSSL_clear_free(tp, 2 * ml * sizeof(OSSL_FN_ULONG)); + else + OPENSSL_cleanse(storage, sizeof(storage)); + + return 1; +} + +int OSSL_FN_mod_sub(OSSL_FN *r, const OSSL_FN *a, const OSSL_FN *b, + const OSSL_FN *m, OSSL_FN_CTX *ctx) +{ + const void *token = OSSL_FN_CTX_start(ctx); + OSSL_FN *am, *bm, *rr = r; + int ret = 0; + + if (token == NULL) + return 0; + if ((am = OSSL_FN_CTX_get_limbs(ctx, m->dsize)) == NULL + || (bm = OSSL_FN_CTX_get_limbs(ctx, m->dsize)) == NULL) + goto err; + + if (r == m && (rr = OSSL_FN_CTX_get_limbs(ctx, m->dsize)) == NULL) + goto err; + + ret = OSSL_FN_mod(am, a, m, ctx) + && OSSL_FN_mod(bm, b, m, ctx) + && OSSL_FN_mod_sub_quick(rr, am, bm, m) + && (rr == r || OSSL_FN_copy_truncate(r, rr) != NULL); + +err: + OSSL_FN_CTX_end(ctx, token); + return ret; +} + +/* + * OSSL_FN_mod_sub variant that may be used if a is less than m, while b is + * of same bit width as m. It's implemented as subtraction followed by two + * conditional additions. + * + * 0 <= a < m + * 0 <= b < 2^w < 2*m + * + * after subtraction + * + * -2*m < r = a - b < m + * + * The original formula is: + * + * r' = a - b + * r'' = r' + m[r' < 0] + * r = r′' + m[r′' < 0] + * + * Because masking techniques are used, this is most efficiently + * carried out with local loops rather than calling functions like + * ossl_fn_add_words(). + */ +int OSSL_FN_mod_sub_quick(OSSL_FN *r, const OSSL_FN *a, const OSSL_FN *b, + const OSSL_FN *m) +{ + if (r == m) { + ERR_raise(ERR_LIB_OSSL_FN, ERR_R_PASSED_INVALID_ARGUMENT); + return 0; + } + + size_t al = a->dsize; + size_t bl = b->dsize; + size_t rl = r->dsize; + size_t ml = m->dsize; + size_t aw = al < ml ? al : ml; + size_t bw = bl < ml ? bl : ml; + OSSL_FN_ULONG storage[1024 / OSSL_FN_BITS]; + OSSL_FN_ULONG *tp = storage; + size_t i; + OSSL_FN_ULONG borrow, carry, ta, mask; + + if (ml > OSSL_NELEM(storage)) { + tp = OPENSSL_malloc_array(ml, sizeof(OSSL_FN_ULONG)); + if (tp == NULL) + return 0; + } + + /* tp = a - b mod 2^(ml*bits) */ + borrow = ossl_fn_sub_words(tp, ml, a->d, aw, b->d, bw); + + /* If borrow, add m */ + for (i = 0, mask = 0 - borrow, carry = 0; i < ml; i++) { + ta = ((m->d[i] & mask) + carry) & OSSL_FN_MASK; + carry = (ta < carry); + tp[i] = (tp[i] + ta) & OSSL_FN_MASK; + carry += (tp[i] < ta); + } + + /* If still borrow, add m again */ + borrow -= carry; + for (i = 0, mask = 0 - borrow, carry = 0; i < ml; i++) { + ta = ((m->d[i] & mask) + carry) & OSSL_FN_MASK; + carry = (ta < carry); + tp[i] = (tp[i] + ta) & OSSL_FN_MASK; + carry += (tp[i] < ta); + } + + for (i = 0; i < rl && i < ml; i++) + r->d[i] = tp[i]; + /* Make sure to pad r with zeroes when rl > ml */ + for (; i < rl; i++) + r->d[i] = 0; + + if (tp != storage) + OPENSSL_clear_free(tp, ml * sizeof(OSSL_FN_ULONG)); + else + OPENSSL_cleanse(storage, sizeof(storage)); + + return 1; +} + +/* slow but works */ +int OSSL_FN_mod_mul(OSSL_FN *r, const OSSL_FN *a, const OSSL_FN *b, + const OSSL_FN *m, OSSL_FN_CTX *ctx) +{ + const void *token = OSSL_FN_CTX_start(ctx); + OSSL_FN *t; + int ret = 0; + + if (token == NULL) + return 0; + + if (a == b) { + size_t tl = 2 * a->dsize; + + if ((t = OSSL_FN_CTX_get_limbs(ctx, tl)) == NULL + || !OSSL_FN_sqr(t, a, ctx)) + goto err; + } else { + size_t tl = a->dsize + b->dsize; + + if ((t = OSSL_FN_CTX_get_limbs(ctx, tl)) == NULL + || !OSSL_FN_mul(t, a, b, ctx)) + goto err; + } + if (!OSSL_FN_mod(r, t, m, ctx)) + goto err; + ret = 1; +err: + OSSL_FN_CTX_end(ctx, token); + return ret; +} + +int OSSL_FN_mod_sqr(OSSL_FN *r, const OSSL_FN *a, const OSSL_FN *m, + OSSL_FN_CTX *ctx) +{ + const void *token = OSSL_FN_CTX_start(ctx); + OSSL_FN *t; + int ret = 0; + + if (token == NULL) + return 0; + if ((t = OSSL_FN_CTX_get_limbs(ctx, (size_t)(2 * a->dsize))) == NULL) + goto err; + + ret = OSSL_FN_sqr(t, a, ctx) + && OSSL_FN_mod(r, t, m, ctx); + +err: + OSSL_FN_CTX_end(ctx, token); + return ret; +} + +int OSSL_FN_mod_lshift1(OSSL_FN *r, const OSSL_FN *a, const OSSL_FN *m, + OSSL_FN_CTX *ctx) +{ + const void *token = OSSL_FN_CTX_start(ctx); + OSSL_FN *t; + int ret = 0; + + if (token == NULL) + return 0; + if ((t = OSSL_FN_CTX_get_limbs(ctx, (size_t)(m->dsize + 1))) == NULL) + goto err; + + ret = OSSL_FN_lshift1(t, a) + && OSSL_FN_mod(r, t, m, ctx); + +err: + OSSL_FN_CTX_end(ctx, token); + return ret; +} + +/* OSSL_FN_mod_lshift1 variant that may be used if a is less than m */ +int OSSL_FN_mod_lshift1_quick(OSSL_FN *r, const OSSL_FN *a, const OSSL_FN *m) +{ + OSSL_FN *t = OSSL_FN_new_limbs((size_t)(m->dsize + 1)); + int ret = 0; + + if (t == NULL) + return 0; + if (!OSSL_FN_lshift1(t, a)) + goto err; + if (OSSL_FN_cmp(t, m) >= 0) { + if (!OSSL_FN_sub(t, t, m)) + goto err; + } + OSSL_FN_copy_truncate(r, t); + ret = 1; +err: + OSSL_FN_free(t); + return ret; +} + +int OSSL_FN_mod_lshift(OSSL_FN *r, const OSSL_FN *a, int n, const OSSL_FN *m, + OSSL_FN_CTX *ctx) +{ + const void *token = OSSL_FN_CTX_start(ctx); + OSSL_FN *ra; + int ret = 0; + + if (token == NULL) + return 0; + if ((ra = OSSL_FN_CTX_get_limbs(ctx, m->dsize)) == NULL) + goto err; + + ret = OSSL_FN_mod(ra, a, m, ctx) + && OSSL_FN_mod_lshift_quick(r, ra, n, m); + +err: + OSSL_FN_CTX_end(ctx, token); + return ret; +} + +/* OSSL_FN_mod_lshift variant that may be used if a is less than m */ +int OSSL_FN_mod_lshift_quick(OSSL_FN *r, const OSSL_FN *a, int n, + const OSSL_FN *m) +{ + OSSL_FN *t = NULL; + int ret = 0; + + if (n <= 0) + return n == 0 ? (OSSL_FN_copy_truncate(r, a) != NULL) : 0; + + t = OSSL_FN_new_limbs((size_t)(m->dsize + 1)); + if (t == NULL) + goto err; + + if (OSSL_FN_copy_truncate(t, a) == NULL) + goto err; + + while (n > 0) { + size_t m_bits = OSSL_FN_num_bits(m); + size_t t_bits = OSSL_FN_num_bits(t); + size_t max_shift; + + /* 0 <= t < m */ + if (m_bits < t_bits) { + ERR_raise(ERR_LIB_OSSL_FN, OSSL_FN_R_INPUT_NOT_REDUCED); + goto err; + } + max_shift = m_bits - t_bits; + + if (max_shift > (size_t)n) + max_shift = (size_t)n; + + if (max_shift) { + int shift = (int)max_shift; + + if (!OSSL_FN_lshift(t, t, shift)) + goto err; + n -= shift; + } else { + if (!OSSL_FN_lshift1(t, t)) + goto err; + n--; + } + + if (OSSL_FN_cmp(t, m) >= 0) { + if (!OSSL_FN_sub(t, t, m)) + goto err; + } + } + + if (OSSL_FN_copy_truncate(r, t) == NULL) + goto err; + ret = 1; + +err: + OSSL_FN_free(t); + return ret; +} diff --git a/include/crypto/fn.h b/include/crypto/fn.h index 8284b7135b..17ebf47efe 100644 --- a/include/crypto/fn.h +++ b/include/crypto/fn.h @@ -670,6 +670,167 @@ int OSSL_FN_div(OSSL_FN *q, OSSL_FN *r, const OSSL_FN *n, const OSSL_FN *d, size_t OSSL_FN_div_ctx_size(const OSSL_FN *q, const OSSL_FN *r, const OSSL_FN *n, const OSSL_FN *d); +/** + * Add two OSSL_FN numbers modulo m. + * + * @param[out] r The OSSL_FN for the result + * @param[in] a The first operand + * @param[in] b The second operand + * @param[in] m The modulus + * @param[in] ctx A context to get temporary OSSL_FN + * instances from. + * @returns 1 on success, 0 on error + * + * @note This function currently requires that the OSSL_FN_CTX has free + * space for one temporary OSSL_FN with max(a->dsize, b->dsize) + 1 + * limbs, plus the requirements of OSSL_FN_mod(), plus one frame + * (currently 32 bytes). + */ +int OSSL_FN_mod_add(OSSL_FN *r, const OSSL_FN *a, const OSSL_FN *b, + const OSSL_FN *m, OSSL_FN_CTX *ctx); + +/** + * Add two OSSL_FN numbers modulo m. This is a quick variant that may be + * used if both a and b are less than m. + * + * @param[out] r The OSSL_FN for the result + * @param[in] a The first operand + * @param[in] b The second operand + * @param[in] m The modulus + * @returns 1 on success, 0 on error + */ +int OSSL_FN_mod_add_quick(OSSL_FN *r, const OSSL_FN *a, const OSSL_FN *b, + const OSSL_FN *m); + +/** + * Subtract two OSSL_FN numbers modulo m. + * + * @param[out] r The OSSL_FN for the result + * @param[in] a The first operand + * @param[in] b The second operand + * @param[in] m The modulus + * @param[in] ctx A context to get temporary OSSL_FN + * instances from. + * @returns 1 on success, 0 on error + * + * @note This function currently requires that the OSSL_FN_CTX has free + * space for two temporary OSSL_FNs with m->dsize limbs each, plus an + * additional temporary OSSL_FN with m->dsize limbs if r == m, plus the + * requirements of OSSL_FN_mod(), plus one frame (currently 32 bytes). + */ +int OSSL_FN_mod_sub(OSSL_FN *r, const OSSL_FN *a, const OSSL_FN *b, + const OSSL_FN *m, OSSL_FN_CTX *ctx); + +/** + * Subtract two OSSL_FN numbers modulo m. This is a quick variant that may + * be used if a is less than m and b is of the same bit width as m. + * + * @param[out] r The OSSL_FN for the result + * @param[in] a The first operand + * @param[in] b The second operand + * @param[in] m The modulus + * @returns 1 on success, 0 on error + */ +int OSSL_FN_mod_sub_quick(OSSL_FN *r, const OSSL_FN *a, const OSSL_FN *b, + const OSSL_FN *m); + +/** + * Multiply two OSSL_FN numbers modulo m. + * + * @param[out] r The OSSL_FN for the result + * @param[in] a The first operand + * @param[in] b The second operand + * @param[in] m The modulus + * @param[in] ctx A context to get temporary OSSL_FN + * instances from. + * @returns 1 on success, 0 on error + * + * @note This function currently requires that the OSSL_FN_CTX has free + * space for one temporary OSSL_FN with a->dsize + b->dsize limbs + * (or 2 * a->dsize limbs if a == b), plus the largest of the + * requirements of OSSL_FN_mul(), OSSL_FN_sqr(), and OSSL_FN_mod(), + * plus one frame (currently 32 bytes). + */ +int OSSL_FN_mod_mul(OSSL_FN *r, const OSSL_FN *a, const OSSL_FN *b, + const OSSL_FN *m, OSSL_FN_CTX *ctx); + +/** + * Square an OSSL_FN number modulo m. + * + * @param[out] r The OSSL_FN for the result + * @param[in] a The operand + * @param[in] m The modulus + * @param[in] ctx A context to get temporary OSSL_FN + * instances from. + * @returns 1 on success, 0 on error + * + * @note This function currently requires that the OSSL_FN_CTX has free + * space for one temporary OSSL_FN with 2 * a->dsize limbs, plus the + * larger of the requirements of OSSL_FN_sqr() and OSSL_FN_mod(), + * plus one frame (currently 32 bytes). + */ +int OSSL_FN_mod_sqr(OSSL_FN *r, const OSSL_FN *a, const OSSL_FN *m, + OSSL_FN_CTX *ctx); + +/** + * Left shift an OSSL_FN number by 1 bit, modulo m. + * + * @param[out] r The OSSL_FN for the result + * @param[in] a The operand + * @param[in] m The modulus + * @param[in] ctx A context to get temporary OSSL_FN + * instances from. + * @returns 1 on success, 0 on error + * + * @note This function currently requires that the OSSL_FN_CTX has free + * space for one temporary OSSL_FN with m->dsize + 1 limbs, plus the + * requirements of OSSL_FN_mod(), plus one frame (currently 32 bytes). + */ +int OSSL_FN_mod_lshift1(OSSL_FN *r, const OSSL_FN *a, const OSSL_FN *m, + OSSL_FN_CTX *ctx); + +/** + * Left shift an OSSL_FN number by 1 bit, modulo m. This is a quick + * variant that may be used if a is less than m. + * + * @param[out] r The OSSL_FN for the result + * @param[in] a The operand + * @param[in] m The modulus + * @returns 1 on success, 0 on error + */ +int OSSL_FN_mod_lshift1_quick(OSSL_FN *r, const OSSL_FN *a, const OSSL_FN *m); + +/** + * Left shift an OSSL_FN number by n bits, modulo m. + * + * @param[out] r The OSSL_FN for the result + * @param[in] a The operand + * @param[in] n The number of bits to shift + * @param[in] m The modulus + * @param[in] ctx A context to get temporary OSSL_FN + * instances from. + * @returns 1 on success, 0 on error + * + * @note This function currently requires that the OSSL_FN_CTX has free + * space for one temporary OSSL_FN with m->dsize limbs, plus the + * requirements of OSSL_FN_mod(), plus one frame (currently 32 bytes). + */ +int OSSL_FN_mod_lshift(OSSL_FN *r, const OSSL_FN *a, int n, const OSSL_FN *m, + OSSL_FN_CTX *ctx); + +/** + * Left shift an OSSL_FN number by n bits, modulo m. This is a quick + * variant that may be used if a is less than m. + * + * @param[out] r The OSSL_FN for the result + * @param[in] a The operand + * @param[in] n The number of bits to shift + * @param[in] m The modulus + * @returns 1 on success, 0 on error + */ +int OSSL_FN_mod_lshift_quick(OSSL_FN *r, const OSSL_FN *a, int n, + const OSSL_FN *m); + /** * Calculate modulo of two OSSL_FN numbers. Truncates the result to fit in r. * diff --git a/include/crypto/fnerr.h b/include/crypto/fnerr.h index f192256e68..e1741ccdc3 100644 --- a/include/crypto/fnerr.h +++ b/include/crypto/fnerr.h @@ -25,6 +25,7 @@ int ossl_err_load_OSSL_FN_strings(void); * OSSL_FN reason codes. */ #define OSSL_FN_R_DIV_BY_ZERO 101 +#define OSSL_FN_R_INPUT_NOT_REDUCED 103 #define OSSL_FN_R_BITS_TOO_SMALL 105 #define OSSL_FN_R_INVALID_RANGE 106 #define OSSL_FN_R_INVALID_SHIFT 102 From 74084eb28e01a46358044cac6b91af21753329ef Mon Sep 17 00:00:00 2001 From: Richard Levitte Date: Wed, 20 May 2026 15:19:01 +0200 Subject: [PATCH 67/69] Add unit tests for OSSL_FN modular arithmetic functions Assisted-by: Pi:moonshotai/kimi-k2.6 Assisted-by: Pi:openai/gpt-5.5 Signed-off-by: Richard Levitte Reviewed-by: Jakub Zelenka Reviewed-by: Igor Ustinov MergeDate: Thu Jul 23 15:02:37 2026 (Merged from https://github.com/openssl/openssl/pull/31479) --- test/fn_api_test.c | 816 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 816 insertions(+) diff --git a/test/fn_api_test.c b/test/fn_api_test.c index 5bec9eed2c..8dcddd7b8d 100644 --- a/test/fn_api_test.c +++ b/test/fn_api_test.c @@ -137,6 +137,16 @@ struct test_case_st { #define EXTENDED_LIMB_MINUS_ONE ((OSSL_FN_ULONG)-1) }; +struct mod_op_test_st { + const OSSL_FN_ULONG *a; + size_t a_size; + const OSSL_FN_ULONG *b; + size_t b_size; + const OSSL_FN_ULONG *m; + size_t m_size; + int n; +}; + /* $num0 + $num0 == 0x10000000000000002 */ static const OSSL_FN_ULONG ex_add_num0_num0[] = { OSSL_FN_ULONG64_C(0x00000000, 0x00000002), @@ -2734,6 +2744,803 @@ err: return ret; } +static struct mod_op_test_st test_mod_add_cases[] = { + { num0, LIMBSOF(num0), num1, LIMBSOF(num1), num2, LIMBSOF(num2), 0 }, + { num2, LIMBSOF(num2), num3, LIMBSOF(num3), num2, LIMBSOF(num2), 0 }, + { num4, LIMBSOF(num4), num0, LIMBSOF(num0), num3, LIMBSOF(num3), 0 }, + { num5, LIMBSOF(num5), num5, LIMBSOF(num5), num6, LIMBSOF(num6), 0 }, +}; + +static struct mod_op_test_st test_mod_sub_cases[] = { + { num0, LIMBSOF(num0), num1, LIMBSOF(num1), num2, LIMBSOF(num2), 0 }, + { num3, LIMBSOF(num3), num2, LIMBSOF(num2), num2, LIMBSOF(num2), 0 }, + { num3, LIMBSOF(num3), num3, LIMBSOF(num3), num2, LIMBSOF(num2), 0 }, + { num5, LIMBSOF(num5), num4, LIMBSOF(num4), num6, LIMBSOF(num6), 0 }, +}; + +static struct mod_op_test_st test_mod_mul_cases[] = { + { num0, LIMBSOF(num0), num1, LIMBSOF(num1), num2, LIMBSOF(num2), 0 }, + { num2, LIMBSOF(num2), num3, LIMBSOF(num3), num2, LIMBSOF(num2), 0 }, + { num0, LIMBSOF(num0), num0, LIMBSOF(num0), num3, LIMBSOF(num3), 0 }, + { num5, LIMBSOF(num5), num5, LIMBSOF(num5), num6, LIMBSOF(num6), 0 }, +}; + +static struct mod_op_test_st test_mod_sqr_cases[] = { + { num0, LIMBSOF(num0), NULL, 0, num2, LIMBSOF(num2), 0 }, + { num2, LIMBSOF(num2), NULL, 0, num2, LIMBSOF(num2), 0 }, + { num5, LIMBSOF(num5), NULL, 0, num6, LIMBSOF(num6), 0 }, +}; + +static struct mod_op_test_st test_mod_lshift1_cases[] = { + { num0, LIMBSOF(num0), NULL, 0, num2, LIMBSOF(num2), 0 }, + { num2, LIMBSOF(num2), NULL, 0, num3, LIMBSOF(num3), 0 }, + { num5, LIMBSOF(num5), NULL, 0, num6, LIMBSOF(num6), 0 }, +}; + +static struct mod_op_test_st test_mod_lshift_cases[] = { + { num0, LIMBSOF(num0), NULL, 0, num2, LIMBSOF(num2), 1 }, + { num0, LIMBSOF(num0), NULL, 0, num2, LIMBSOF(num2), 3 }, + { num2, LIMBSOF(num2), NULL, 0, num3, LIMBSOF(num3), 5 }, + { num5, LIMBSOF(num5), NULL, 0, num6, LIMBSOF(num6), 7 }, +}; + +static int test_mod_add(int i) +{ + struct mod_op_test_st *tc = &test_mod_add_cases[i]; + size_t m_size = tc->m_size; + OSSL_FN_CTX *ctx = NULL; + OSSL_FN *fa = NULL, *fb = NULL, *fm = NULL; + OSSL_FN *r_gen = NULL, *r_quick = NULL, *expected = NULL; + OSSL_FN *tmp = NULL, *fa_red = NULL, *fb_red = NULL; + int ret = 0; + const OSSL_FN_ULONG *u_gen, *u_quick, *u_exp; + + ctx = OSSL_FN_CTX_new(NULL, 4, 8, 8 * m_size + 8); + if (!TEST_ptr(ctx)) + goto err; + + fa = OSSL_FN_new_limbs(m_size); + fb = OSSL_FN_new_limbs(m_size); + fm = OSSL_FN_new_limbs(m_size); + r_gen = OSSL_FN_new_limbs(m_size); + r_quick = OSSL_FN_new_limbs(m_size); + expected = OSSL_FN_new_limbs(m_size); + fa_red = OSSL_FN_new_limbs(m_size); + fb_red = OSSL_FN_new_limbs(m_size); + tmp = OSSL_FN_new_limbs(m_size + 1); + if (!TEST_ptr(fa) || !TEST_ptr(fb) || !TEST_ptr(fm) + || !TEST_ptr(r_gen) || !TEST_ptr(r_quick) || !TEST_ptr(expected) + || !TEST_ptr(fa_red) || !TEST_ptr(fb_red) || !TEST_ptr(tmp)) + goto err; + + if (!TEST_true(ossl_fn_set_words(fa, tc->a, tc->a_size)) + || !TEST_true(ossl_fn_set_words(fb, tc->b, tc->b_size)) + || !TEST_true(ossl_fn_set_words(fm, tc->m, tc->m_size))) + goto err; + + /* expected = (a + b) mod m */ + if (!TEST_true(OSSL_FN_add(tmp, fa, fb))) + goto err; + if (!TEST_true(OSSL_FN_mod(expected, tmp, fm, ctx))) + goto err; + + /* general = mod_add(a, b, m, ctx) */ + if (!TEST_true(OSSL_FN_mod_add(r_gen, fa, fb, fm, ctx))) + goto err; + + /* reduce a and b for quick variant */ + if (!TEST_true(OSSL_FN_mod(fa_red, fa, fm, ctx)) + || !TEST_true(OSSL_FN_mod(fb_red, fb, fm, ctx))) + goto err; + + /* quick = mod_add_quick(a_red, b_red, m) */ + if (!TEST_true(OSSL_FN_mod_add_quick(r_quick, fa_red, fb_red, fm))) + goto err; + + u_gen = ossl_fn_get_words(r_gen); + u_quick = ossl_fn_get_words(r_quick); + u_exp = ossl_fn_get_words(expected); + + if (!TEST_mem_eq(u_gen, m_size * OSSL_FN_BYTES, + u_exp, m_size * OSSL_FN_BYTES)) + goto err; + if (!TEST_mem_eq(u_quick, m_size * OSSL_FN_BYTES, + u_exp, m_size * OSSL_FN_BYTES)) + goto err; + if (!TEST_mem_eq(u_gen, m_size * OSSL_FN_BYTES, + u_quick, m_size * OSSL_FN_BYTES)) + goto err; + + ret = 1; + +err: + OSSL_FN_CTX_free(ctx); + OSSL_FN_free(fa); + OSSL_FN_free(fb); + OSSL_FN_free(fm); + OSSL_FN_free(r_gen); + OSSL_FN_free(r_quick); + OSSL_FN_free(expected); + OSSL_FN_free(fa_red); + OSSL_FN_free(fb_red); + OSSL_FN_free(tmp); + return ret; +} + +static int test_mod_sub(int i) +{ + struct mod_op_test_st *tc = &test_mod_sub_cases[i]; + size_t m_size = tc->m_size; + OSSL_FN_CTX *ctx = NULL; + OSSL_FN *fa = NULL, *fb = NULL, *fm = NULL; + OSSL_FN *r_gen = NULL, *r_quick = NULL, *expected = NULL; + OSSL_FN *tmp = NULL, *fa_red = NULL, *fb_red = NULL; + int ret = 0; + const OSSL_FN_ULONG *u_gen, *u_quick, *u_exp; + + ctx = OSSL_FN_CTX_new(NULL, 4, 8, 8 * m_size + 8); + if (!TEST_ptr(ctx)) + goto err; + + fa = OSSL_FN_new_limbs(m_size); + fb = OSSL_FN_new_limbs(m_size); + fm = OSSL_FN_new_limbs(m_size); + r_gen = OSSL_FN_new_limbs(m_size); + r_quick = OSSL_FN_new_limbs(m_size); + expected = OSSL_FN_new_limbs(m_size); + fa_red = OSSL_FN_new_limbs(m_size); + fb_red = OSSL_FN_new_limbs(m_size); + tmp = OSSL_FN_new_limbs(m_size); + if (!TEST_ptr(fa) || !TEST_ptr(fb) || !TEST_ptr(fm) + || !TEST_ptr(r_gen) || !TEST_ptr(r_quick) || !TEST_ptr(expected) + || !TEST_ptr(fa_red) || !TEST_ptr(fb_red) || !TEST_ptr(tmp)) + goto err; + + if (!TEST_true(ossl_fn_set_words(fa, tc->a, tc->a_size)) + || !TEST_true(ossl_fn_set_words(fb, tc->b, tc->b_size)) + || !TEST_true(ossl_fn_set_words(fm, tc->m, tc->m_size))) + goto err; + + /* expected = (a - b) mod m */ + if (!TEST_true(OSSL_FN_sub(tmp, fa, fb))) + goto err; + if (!TEST_true(OSSL_FN_mod(expected, tmp, fm, ctx))) + goto err; + + /* general = mod_sub(a, b, m, ctx) */ + if (!TEST_true(OSSL_FN_mod_sub(r_gen, fa, fb, fm, ctx))) + goto err; + + /* reduce a and b for quick variant */ + if (!TEST_true(OSSL_FN_mod(fa_red, fa, fm, ctx)) + || !TEST_true(OSSL_FN_mod(fb_red, fb, fm, ctx))) + goto err; + + /* quick = mod_sub_quick(a_red, b_red, m) */ + if (!TEST_true(OSSL_FN_mod_sub_quick(r_quick, fa_red, fb_red, fm))) + goto err; + + u_gen = ossl_fn_get_words(r_gen); + u_quick = ossl_fn_get_words(r_quick); + u_exp = ossl_fn_get_words(expected); + + if (!TEST_mem_eq(u_gen, m_size * OSSL_FN_BYTES, + u_exp, m_size * OSSL_FN_BYTES)) + goto err; + if (!TEST_mem_eq(u_quick, m_size * OSSL_FN_BYTES, + u_exp, m_size * OSSL_FN_BYTES)) + goto err; + if (!TEST_mem_eq(u_gen, m_size * OSSL_FN_BYTES, + u_quick, m_size * OSSL_FN_BYTES)) + goto err; + + ret = 1; + +err: + OSSL_FN_CTX_free(ctx); + OSSL_FN_free(fa); + OSSL_FN_free(fb); + OSSL_FN_free(fm); + OSSL_FN_free(r_gen); + OSSL_FN_free(r_quick); + OSSL_FN_free(expected); + OSSL_FN_free(fa_red); + OSSL_FN_free(fb_red); + OSSL_FN_free(tmp); + return ret; +} + +static int test_mod_mul(int i) +{ + struct mod_op_test_st *tc = &test_mod_mul_cases[i]; + size_t m_size = tc->m_size; + OSSL_FN_CTX *ctx = NULL; + OSSL_FN *fa = NULL, *fb = NULL, *fm = NULL; + OSSL_FN *r = NULL, *expected = NULL, *tmp = NULL; + int ret = 0; + const OSSL_FN_ULONG *u_r, *u_exp; + + ctx = OSSL_FN_CTX_new(NULL, 4, 8, 8 * m_size + 8); + if (!TEST_ptr(ctx)) + goto err; + + fa = OSSL_FN_new_limbs(m_size); + fb = OSSL_FN_new_limbs(m_size); + fm = OSSL_FN_new_limbs(m_size); + r = OSSL_FN_new_limbs(m_size); + expected = OSSL_FN_new_limbs(m_size); + tmp = OSSL_FN_new_limbs(m_size * 2); + if (!TEST_ptr(fa) || !TEST_ptr(fb) || !TEST_ptr(fm) + || !TEST_ptr(r) || !TEST_ptr(expected) || !TEST_ptr(tmp)) + goto err; + + if (!TEST_true(ossl_fn_set_words(fa, tc->a, tc->a_size)) + || !TEST_true(ossl_fn_set_words(fb, tc->b, tc->b_size)) + || !TEST_true(ossl_fn_set_words(fm, tc->m, tc->m_size))) + goto err; + + /* expected = (a * b) mod m */ + if (!TEST_true(OSSL_FN_mul(tmp, fa, fb, ctx))) + goto err; + if (!TEST_true(OSSL_FN_mod(expected, tmp, fm, ctx))) + goto err; + + /* r = mod_mul(a, b, m, ctx) */ + if (!TEST_true(OSSL_FN_mod_mul(r, fa, fb, fm, ctx))) + goto err; + + u_r = ossl_fn_get_words(r); + u_exp = ossl_fn_get_words(expected); + + if (!TEST_mem_eq(u_r, m_size * OSSL_FN_BYTES, + u_exp, m_size * OSSL_FN_BYTES)) + goto err; + + ret = 1; + +err: + OSSL_FN_CTX_free(ctx); + OSSL_FN_free(fa); + OSSL_FN_free(fb); + OSSL_FN_free(fm); + OSSL_FN_free(r); + OSSL_FN_free(expected); + OSSL_FN_free(tmp); + return ret; +} + +static int test_mod_sqr(int i) +{ + struct mod_op_test_st *tc = &test_mod_sqr_cases[i]; + size_t m_size = tc->m_size; + OSSL_FN_CTX *ctx = NULL; + OSSL_FN *fa = NULL, *fm = NULL; + OSSL_FN *r = NULL, *expected = NULL, *tmp = NULL; + int ret = 0; + const OSSL_FN_ULONG *u_r, *u_exp; + + ctx = OSSL_FN_CTX_new(NULL, 4, 8, 8 * m_size + 8); + if (!TEST_ptr(ctx)) + goto err; + + fa = OSSL_FN_new_limbs(m_size); + fm = OSSL_FN_new_limbs(m_size); + r = OSSL_FN_new_limbs(m_size); + expected = OSSL_FN_new_limbs(m_size); + tmp = OSSL_FN_new_limbs(m_size * 2); + if (!TEST_ptr(fa) || !TEST_ptr(fm) + || !TEST_ptr(r) || !TEST_ptr(expected) || !TEST_ptr(tmp)) + goto err; + + if (!TEST_true(ossl_fn_set_words(fa, tc->a, tc->a_size)) + || !TEST_true(ossl_fn_set_words(fm, tc->m, tc->m_size))) + goto err; + + /* expected = (a * a) mod m */ + if (!TEST_true(OSSL_FN_sqr(tmp, fa, ctx))) + goto err; + if (!TEST_true(OSSL_FN_mod(expected, tmp, fm, ctx))) + goto err; + + /* r = mod_sqr(a, m, ctx) */ + if (!TEST_true(OSSL_FN_mod_sqr(r, fa, fm, ctx))) + goto err; + + u_r = ossl_fn_get_words(r); + u_exp = ossl_fn_get_words(expected); + + if (!TEST_mem_eq(u_r, m_size * OSSL_FN_BYTES, + u_exp, m_size * OSSL_FN_BYTES)) + goto err; + + ret = 1; + +err: + OSSL_FN_CTX_free(ctx); + OSSL_FN_free(fa); + OSSL_FN_free(fm); + OSSL_FN_free(r); + OSSL_FN_free(expected); + OSSL_FN_free(tmp); + return ret; +} + +static int test_mod_lshift1(int i) +{ + struct mod_op_test_st *tc = &test_mod_lshift1_cases[i]; + size_t m_size = tc->m_size; + OSSL_FN_CTX *ctx = NULL; + OSSL_FN *fa = NULL, *fm = NULL; + OSSL_FN *r_gen = NULL, *r_quick = NULL, *expected = NULL; + OSSL_FN *tmp = NULL, *fa_red = NULL; + int ret = 0; + const OSSL_FN_ULONG *u_gen, *u_quick, *u_exp; + + ctx = OSSL_FN_CTX_new(NULL, 4, 8, 8 * m_size + 8); + if (!TEST_ptr(ctx)) + goto err; + + fa = OSSL_FN_new_limbs(m_size); + fm = OSSL_FN_new_limbs(m_size); + r_gen = OSSL_FN_new_limbs(m_size); + r_quick = OSSL_FN_new_limbs(m_size); + expected = OSSL_FN_new_limbs(m_size); + tmp = OSSL_FN_new_limbs(m_size + 1); + fa_red = OSSL_FN_new_limbs(m_size); + if (!TEST_ptr(fa) || !TEST_ptr(fm) + || !TEST_ptr(r_gen) || !TEST_ptr(r_quick) || !TEST_ptr(expected) + || !TEST_ptr(tmp) || !TEST_ptr(fa_red)) + goto err; + + if (!TEST_true(ossl_fn_set_words(fa, tc->a, tc->a_size)) + || !TEST_true(ossl_fn_set_words(fm, tc->m, tc->m_size))) + goto err; + + /* expected = (a + a) mod m */ + if (!TEST_true(OSSL_FN_add(tmp, fa, fa))) + goto err; + if (!TEST_true(OSSL_FN_mod(expected, tmp, fm, ctx))) + goto err; + + /* general = mod_lshift1(a, m, ctx) */ + if (!TEST_true(OSSL_FN_mod_lshift1(r_gen, fa, fm, ctx))) + goto err; + + /* reduce a for quick variant */ + if (!TEST_true(OSSL_FN_mod(fa_red, fa, fm, ctx))) + goto err; + + /* quick = mod_lshift1_quick(a_red, m) */ + if (!TEST_true(OSSL_FN_mod_lshift1_quick(r_quick, fa_red, fm))) + goto err; + + u_gen = ossl_fn_get_words(r_gen); + u_quick = ossl_fn_get_words(r_quick); + u_exp = ossl_fn_get_words(expected); + + if (!TEST_mem_eq(u_gen, m_size * OSSL_FN_BYTES, + u_exp, m_size * OSSL_FN_BYTES)) + goto err; + if (!TEST_mem_eq(u_quick, m_size * OSSL_FN_BYTES, + u_exp, m_size * OSSL_FN_BYTES)) + goto err; + if (!TEST_mem_eq(u_gen, m_size * OSSL_FN_BYTES, + u_quick, m_size * OSSL_FN_BYTES)) + goto err; + + ret = 1; + +err: + OSSL_FN_CTX_free(ctx); + OSSL_FN_free(fa); + OSSL_FN_free(fm); + OSSL_FN_free(r_gen); + OSSL_FN_free(r_quick); + OSSL_FN_free(expected); + OSSL_FN_free(tmp); + OSSL_FN_free(fa_red); + return ret; +} + +static int test_mod_lshift(int i) +{ + struct mod_op_test_st *tc = &test_mod_lshift_cases[i]; + size_t m_size = tc->m_size; + OSSL_FN_CTX *ctx = NULL; + OSSL_FN *fa = NULL, *fm = NULL; + OSSL_FN *r_gen = NULL, *r_quick = NULL, *expected = NULL; + OSSL_FN *tmp = NULL, *fa_red = NULL, *pow2n = NULL; + OSSL_FN_ULONG pow2_word; + int ret = 0; + const OSSL_FN_ULONG *u_gen, *u_quick, *u_exp; + + ctx = OSSL_FN_CTX_new(NULL, 4, 8, 8 * m_size + 8); + if (!TEST_ptr(ctx)) + goto err; + + fa = OSSL_FN_new_limbs(m_size); + fm = OSSL_FN_new_limbs(m_size); + r_gen = OSSL_FN_new_limbs(m_size); + r_quick = OSSL_FN_new_limbs(m_size); + expected = OSSL_FN_new_limbs(m_size); + tmp = OSSL_FN_new_limbs(m_size + 1); + fa_red = OSSL_FN_new_limbs(m_size); + pow2n = OSSL_FN_new_limbs(1); + if (!TEST_ptr(fa) || !TEST_ptr(fm) + || !TEST_ptr(r_gen) || !TEST_ptr(r_quick) || !TEST_ptr(expected) + || !TEST_ptr(tmp) || !TEST_ptr(fa_red) || !TEST_ptr(pow2n)) + goto err; + + if (!TEST_true(ossl_fn_set_words(fa, tc->a, tc->a_size)) + || !TEST_true(ossl_fn_set_words(fm, tc->m, tc->m_size))) + goto err; + + pow2_word = ((OSSL_FN_ULONG)1) << tc->n; + if (!TEST_true(ossl_fn_set_words(pow2n, &pow2_word, 1))) + goto err; + + /* expected = (a * 2^n) mod m */ + if (!TEST_true(OSSL_FN_mul(tmp, fa, pow2n, ctx))) + goto err; + if (!TEST_true(OSSL_FN_mod(expected, tmp, fm, ctx))) + goto err; + + /* general = mod_lshift(a, n, m, ctx) */ + if (!TEST_true(OSSL_FN_mod_lshift(r_gen, fa, tc->n, fm, ctx))) + goto err; + + /* reduce a for quick variant */ + if (!TEST_true(OSSL_FN_mod(fa_red, fa, fm, ctx))) + goto err; + + /* quick = mod_lshift_quick(a_red, n, m) */ + if (!TEST_true(OSSL_FN_mod_lshift_quick(r_quick, fa_red, tc->n, fm))) + goto err; + + u_gen = ossl_fn_get_words(r_gen); + u_quick = ossl_fn_get_words(r_quick); + u_exp = ossl_fn_get_words(expected); + + if (!TEST_mem_eq(u_gen, m_size * OSSL_FN_BYTES, + u_exp, m_size * OSSL_FN_BYTES)) + goto err; + if (!TEST_mem_eq(u_quick, m_size * OSSL_FN_BYTES, + u_exp, m_size * OSSL_FN_BYTES)) + goto err; + if (!TEST_mem_eq(u_gen, m_size * OSSL_FN_BYTES, + u_quick, m_size * OSSL_FN_BYTES)) + goto err; + + ret = 1; + +err: + OSSL_FN_CTX_free(ctx); + OSSL_FN_free(fa); + OSSL_FN_free(fm); + OSSL_FN_free(r_gen); + OSSL_FN_free(r_quick); + OSSL_FN_free(expected); + OSSL_FN_free(tmp); + OSSL_FN_free(fa_red); + OSSL_FN_free(pow2n); + return ret; +} + +static const OSSL_FN_ULONG mod_secp128r1_p[] = { + OSSL_FN_ULONG64_C(0xffffffff, 0xffffffff), + OSSL_FN_ULONG64_C(0xfffffffd, 0xffffffff), +}; +static const OSSL_FN_ULONG mod_secp128r1_a[] = { + OSSL_FN_ULONG64_C(0xffffffff, 0xfffffffc), + OSSL_FN_ULONG64_C(0xfffffff7, 0xffffffff), +}; +static const OSSL_FN_ULONG mod_secp128r1_x2[] = { + OSSL_FN_ULONG64_C(0x7f04aa75, 0x6b2f9496), + OSSL_FN_ULONG64_C(0x74e2ecb0, 0x826a5208), +}; +static const OSSL_FN_ULONG mod_secp128r1_x2_plus_a[] = { + OSSL_FN_ULONG64_C(0x7f04aa75, 0x6b2f9493), + OSSL_FN_ULONG64_C(0x74e2ecaa, 0x826a5208), +}; + +static const OSSL_FN_ULONG mod_sub_wide_a[] = { + OSSL_FN_ULONG_C(0x7), +#if OSSL_FN_BYTES == 4 + OSSL_FN_ULONG_C(0), +#endif + OSSL_FN_ULONG_C(0x1), +}; +static const OSSL_FN_ULONG mod_sub_wide_b[] = { + OSSL_FN_ULONG_C(0x1), +}; +static const OSSL_FN_ULONG mod_sub_wide_m[] = { + OSSL_FN_ULONG64_C(0xffffffff, 0xffffffc5), +}; +static const OSSL_FN_ULONG mod_sub_wide_expected[] = { + OSSL_FN_ULONG_C(0x41), +}; +static const OSSL_FN_ULONG mod_sub_negative_a[] = { + OSSL_FN_ULONG_C(0x1), +}; +static const OSSL_FN_ULONG mod_sub_negative_b[] = { + OSSL_FN_ULONG_C(0x3), +}; +static const OSSL_FN_ULONG mod_sub_negative_m[] = { + OSSL_FN_ULONG_C(0x5), +}; +static const OSSL_FN_ULONG mod_sub_negative_expected[] = { + OSSL_FN_ULONG_C(0x3), +}; + +static int test_mod_quick_wide_operands(void) +{ + size_t m_size = LIMBSOF(mod_secp128r1_p); + size_t wide_size = m_size + 2; + OSSL_FN *fa = NULL, *fb = NULL, *fm = NULL; + OSSL_FN *r = NULL, *expected = NULL; + const OSSL_FN_ULONG *u_r = NULL, *u_exp = NULL; + int ret = 0; + + fa = OSSL_FN_new_limbs(wide_size); + fb = OSSL_FN_new_limbs(m_size); + fm = OSSL_FN_new_limbs(m_size); + r = OSSL_FN_new_limbs(wide_size); + expected = OSSL_FN_new_limbs(wide_size); + if (!TEST_ptr(fa) || !TEST_ptr(fb) || !TEST_ptr(fm) + || !TEST_ptr(r) || !TEST_ptr(expected)) + goto err; + + if (!TEST_true(ossl_fn_set_words(fa, mod_secp128r1_x2, + LIMBSOF(mod_secp128r1_x2))) + || !TEST_true(ossl_fn_set_words(fb, mod_secp128r1_a, + LIMBSOF(mod_secp128r1_a))) + || !TEST_true(ossl_fn_set_words(fm, mod_secp128r1_p, + LIMBSOF(mod_secp128r1_p))) + || !TEST_true(ossl_fn_set_words(expected, mod_secp128r1_x2_plus_a, + LIMBSOF(mod_secp128r1_x2_plus_a))) + || !TEST_true(pollute(r, 0, wide_size)) + || !TEST_true(OSSL_FN_mod_add_quick(r, fa, fb, fm))) + goto err; + + u_r = ossl_fn_get_words(r); + u_exp = ossl_fn_get_words(expected); + if (!TEST_mem_eq(u_r, wide_size * OSSL_FN_BYTES, + u_exp, wide_size * OSSL_FN_BYTES)) + goto err; + + if (!TEST_true(ossl_fn_set_words(fa, mod_secp128r1_x2_plus_a, + LIMBSOF(mod_secp128r1_x2_plus_a))) + || !TEST_true(ossl_fn_set_words(expected, mod_secp128r1_x2, + LIMBSOF(mod_secp128r1_x2))) + || !TEST_true(pollute(r, 0, wide_size)) + || !TEST_true(OSSL_FN_mod_sub_quick(r, fa, fb, fm))) + goto err; + + u_r = ossl_fn_get_words(r); + u_exp = ossl_fn_get_words(expected); + if (!TEST_mem_eq(u_r, wide_size * OSSL_FN_BYTES, + u_exp, wide_size * OSSL_FN_BYTES)) + goto err; + + ret = 1; +err: + OSSL_FN_free(fa); + OSSL_FN_free(fb); + OSSL_FN_free(fm); + OSSL_FN_free(r); + OSSL_FN_free(expected); + return ret; +} + +static int test_mod_sub_general_wide_operands(void) +{ + OSSL_FN_CTX *ctx = NULL; + OSSL_FN *fa = NULL, *fb = NULL, *fm = NULL; + OSSL_FN *r = NULL, *expected = NULL; + const OSSL_FN_ULONG *u_r = NULL, *u_exp = NULL; + int ret = 0; + + ctx = OSSL_FN_CTX_new(NULL, 4, 8, 32); + fa = OSSL_FN_new_limbs(LIMBSOF(mod_sub_wide_a)); + fb = OSSL_FN_new_limbs(LIMBSOF(mod_sub_wide_b)); + fm = OSSL_FN_new_limbs(LIMBSOF(mod_sub_wide_m)); + r = OSSL_FN_new_limbs(LIMBSOF(mod_sub_wide_m)); + expected = OSSL_FN_new_limbs(LIMBSOF(mod_sub_wide_m)); + if (!TEST_ptr(ctx) || !TEST_ptr(fa) || !TEST_ptr(fb) || !TEST_ptr(fm) + || !TEST_ptr(r) || !TEST_ptr(expected)) + goto err; + + if (!TEST_true(ossl_fn_set_words(fa, mod_sub_wide_a, + LIMBSOF(mod_sub_wide_a))) + || !TEST_true(ossl_fn_set_words(fb, mod_sub_wide_b, + LIMBSOF(mod_sub_wide_b))) + || !TEST_true(ossl_fn_set_words(fm, mod_sub_wide_m, + LIMBSOF(mod_sub_wide_m))) + || !TEST_true(ossl_fn_set_words(expected, mod_sub_wide_expected, + LIMBSOF(mod_sub_wide_expected))) + || !TEST_true(pollute(r, 0, LIMBSOF(mod_sub_wide_m))) + || !TEST_true(OSSL_FN_mod_sub(r, fa, fb, fm, ctx))) + goto err; + + u_r = ossl_fn_get_words(r); + u_exp = ossl_fn_get_words(expected); + if (!TEST_mem_eq(u_r, LIMBSOF(mod_sub_wide_m) * OSSL_FN_BYTES, + u_exp, LIMBSOF(mod_sub_wide_m) * OSSL_FN_BYTES)) + goto err; + + if (!TEST_true(ossl_fn_set_words(fa, mod_sub_negative_a, + LIMBSOF(mod_sub_negative_a))) + || !TEST_true(ossl_fn_set_words(fb, mod_sub_negative_b, + LIMBSOF(mod_sub_negative_b))) + || !TEST_true(ossl_fn_set_words(fm, mod_sub_negative_m, + LIMBSOF(mod_sub_negative_m))) + || !TEST_true(ossl_fn_set_words(expected, mod_sub_negative_expected, + LIMBSOF(mod_sub_negative_expected))) + || !TEST_true(pollute(r, 0, LIMBSOF(mod_sub_negative_m))) + || !TEST_true(OSSL_FN_mod_sub(r, fa, fb, fm, ctx))) + goto err; + + u_r = ossl_fn_get_words(r); + u_exp = ossl_fn_get_words(expected); + if (!TEST_mem_eq(u_r, LIMBSOF(mod_sub_negative_m) * OSSL_FN_BYTES, + u_exp, LIMBSOF(mod_sub_negative_m) * OSSL_FN_BYTES)) + goto err; + + ret = 1; +err: + OSSL_FN_CTX_free(ctx); + OSSL_FN_free(fa); + OSSL_FN_free(fb); + OSSL_FN_free(fm); + OSSL_FN_free(r); + OSSL_FN_free(expected); + return ret; +} + +static int test_mod_ops_result_size(int i) +{ + size_t m_size = LIMBSOF(num7); + size_t r_size = i == 0 ? m_size - 1 : i == 1 ? m_size + : m_size + 2; + OSSL_FN_CTX *ctx = NULL; + OSSL_FN *fa = NULL, *fb = NULL, *fm = NULL, *expected = NULL; + OSSL_FN *r_gen = NULL, *r_quick = NULL, *tmp = NULL, *fa_red = NULL; + OSSL_FN *fb_red = NULL, *pow2n = NULL; + OSSL_FN_ULONG pow2_word = 1 << 7; + const OSSL_FN_ULONG *u_gen = NULL, *u_quick = NULL, *u_exp = NULL; + int ret = 0; + + ctx = OSSL_FN_CTX_new(NULL, 6, 12, 16 * m_size + 16); + if (!TEST_ptr(ctx)) + goto err; + + fa = OSSL_FN_new_limbs(m_size); + fb = OSSL_FN_new_limbs(m_size); + fm = OSSL_FN_new_limbs(m_size); + expected = OSSL_FN_new_limbs(r_size); + r_gen = OSSL_FN_new_limbs(r_size); + r_quick = OSSL_FN_new_limbs(r_size); + tmp = OSSL_FN_new_limbs(2 * m_size); + fa_red = OSSL_FN_new_limbs(m_size); + fb_red = OSSL_FN_new_limbs(m_size); + pow2n = OSSL_FN_new_limbs(1); + if (!TEST_ptr(fa) || !TEST_ptr(fb) || !TEST_ptr(fm) + || !TEST_ptr(expected) || !TEST_ptr(r_gen) || !TEST_ptr(r_quick) + || !TEST_ptr(tmp) || !TEST_ptr(fa_red) || !TEST_ptr(fb_red) + || !TEST_ptr(pow2n)) + goto err; + + if (!TEST_true(ossl_fn_set_words(fa, num5, LIMBSOF(num5))) + || !TEST_true(ossl_fn_set_words(fb, num5, LIMBSOF(num5))) + || !TEST_true(ossl_fn_set_words(fm, num7, LIMBSOF(num7))) + || !TEST_true(ossl_fn_set_words(pow2n, &pow2_word, 1))) + goto err; + +#define CHECK_MOD_OP_RESULT(opname) \ + do { \ + u_gen = ossl_fn_get_words(r_gen); \ + u_quick = ossl_fn_get_words(r_quick); \ + u_exp = ossl_fn_get_words(expected); \ + if (!TEST_mem_eq(u_gen, r_size * OSSL_FN_BYTES, \ + u_exp, r_size * OSSL_FN_BYTES)) { \ + TEST_note("%s general, r_size = %zu", opname, r_size); \ + goto err; \ + } \ + if (!TEST_mem_eq(u_quick, r_size * OSSL_FN_BYTES, \ + u_exp, r_size * OSSL_FN_BYTES)) { \ + TEST_note("%s quick, r_size = %zu", opname, r_size); \ + goto err; \ + } \ + } while (0) + + if (!TEST_true(pollute(expected, 0, r_size)) + || !TEST_true(pollute(r_gen, 0, r_size)) + || !TEST_true(pollute(r_quick, 0, r_size)) + || !TEST_true(OSSL_FN_add(tmp, fa, fb)) + || !TEST_true(OSSL_FN_mod(expected, tmp, fm, ctx)) + || !TEST_true(OSSL_FN_mod_add(r_gen, fa, fb, fm, ctx)) + || !TEST_true(OSSL_FN_mod(fa_red, fa, fm, ctx)) + || !TEST_true(OSSL_FN_mod(fb_red, fb, fm, ctx)) + || !TEST_true(OSSL_FN_mod_add_quick(r_quick, fa_red, fb_red, fm))) + goto err; + CHECK_MOD_OP_RESULT("mod_add"); + + if (!TEST_true(ossl_fn_set_words(fa, num5, LIMBSOF(num5))) + || !TEST_true(ossl_fn_set_words(fb, num4, LIMBSOF(num4))) + || !TEST_true(pollute(expected, 0, r_size)) + || !TEST_true(pollute(r_gen, 0, r_size)) + || !TEST_true(pollute(r_quick, 0, r_size)) + || !TEST_true(OSSL_FN_sub(tmp, fa, fb)) + || !TEST_true(OSSL_FN_mod(expected, tmp, fm, ctx)) + || !TEST_true(OSSL_FN_mod_sub(r_gen, fa, fb, fm, ctx)) + || !TEST_true(OSSL_FN_mod(fa_red, fa, fm, ctx)) + || !TEST_true(OSSL_FN_mod(fb_red, fb, fm, ctx)) + || !TEST_true(OSSL_FN_mod_sub_quick(r_quick, fa_red, fb_red, fm))) + goto err; + CHECK_MOD_OP_RESULT("mod_sub"); + + if (!TEST_true(ossl_fn_set_words(fb, num5, LIMBSOF(num5))) + || !TEST_true(pollute(expected, 0, r_size)) + || !TEST_true(pollute(r_gen, 0, r_size)) + || !TEST_true(pollute(r_quick, 0, r_size)) + || !TEST_true(OSSL_FN_mul(tmp, fa, fb, ctx)) + || !TEST_true(OSSL_FN_mod(expected, tmp, fm, ctx)) + || !TEST_true(OSSL_FN_mod_mul(r_gen, fa, fb, fm, ctx)) + || !TEST_true(OSSL_FN_mod_mul(r_quick, fa, fb, fm, ctx))) + goto err; + CHECK_MOD_OP_RESULT("mod_mul"); + + if (!TEST_true(pollute(expected, 0, r_size)) + || !TEST_true(pollute(r_gen, 0, r_size)) + || !TEST_true(pollute(r_quick, 0, r_size)) + || !TEST_true(OSSL_FN_sqr(tmp, fa, ctx)) + || !TEST_true(OSSL_FN_mod(expected, tmp, fm, ctx)) + || !TEST_true(OSSL_FN_mod_sqr(r_gen, fa, fm, ctx)) + || !TEST_true(OSSL_FN_mod_sqr(r_quick, fa, fm, ctx))) + goto err; + CHECK_MOD_OP_RESULT("mod_sqr"); + + if (!TEST_true(pollute(expected, 0, r_size)) + || !TEST_true(pollute(r_gen, 0, r_size)) + || !TEST_true(pollute(r_quick, 0, r_size)) + || !TEST_true(OSSL_FN_add(tmp, fa, fa)) + || !TEST_true(OSSL_FN_mod(expected, tmp, fm, ctx)) + || !TEST_true(OSSL_FN_mod_lshift1(r_gen, fa, fm, ctx)) + || !TEST_true(OSSL_FN_mod(fa_red, fa, fm, ctx)) + || !TEST_true(OSSL_FN_mod_lshift1_quick(r_quick, fa_red, fm))) + goto err; + CHECK_MOD_OP_RESULT("mod_lshift1"); + + if (!TEST_true(pollute(expected, 0, r_size)) + || !TEST_true(pollute(r_gen, 0, r_size)) + || !TEST_true(pollute(r_quick, 0, r_size)) + || !TEST_true(OSSL_FN_mul(tmp, fa, pow2n, ctx)) + || !TEST_true(OSSL_FN_mod(expected, tmp, fm, ctx)) + || !TEST_true(OSSL_FN_mod_lshift(r_gen, fa, 7, fm, ctx)) + || !TEST_true(OSSL_FN_mod(fa_red, fa, fm, ctx)) + || !TEST_true(OSSL_FN_mod_lshift_quick(r_quick, fa_red, 7, fm))) + goto err; + CHECK_MOD_OP_RESULT("mod_lshift"); + +#undef CHECK_MOD_OP_RESULT + + ret = 1; + +err: + OSSL_FN_CTX_free(ctx); + OSSL_FN_free(fa); + OSSL_FN_free(fb); + OSSL_FN_free(fm); + OSSL_FN_free(expected); + OSSL_FN_free(r_gen); + OSSL_FN_free(r_quick); + OSSL_FN_free(tmp); + OSSL_FN_free(fa_red); + OSSL_FN_free(fb_red); + OSSL_FN_free(pow2n); + return ret; +} + int setup_tests(void) { ADD_ALL_TESTS(test_add, 17); @@ -2777,6 +3584,15 @@ int setup_tests(void) ADD_ALL_TESTS(test_rand_range, OSSL_NELEM(range_words)); ADD_TEST(test_rand_range_zero); ADD_TEST(test_rand_range_exactly_sized); + ADD_ALL_TESTS(test_mod_add, OSSL_NELEM(test_mod_add_cases)); + ADD_ALL_TESTS(test_mod_sub, OSSL_NELEM(test_mod_sub_cases)); + ADD_ALL_TESTS(test_mod_mul, OSSL_NELEM(test_mod_mul_cases)); + ADD_ALL_TESTS(test_mod_sqr, OSSL_NELEM(test_mod_sqr_cases)); + ADD_ALL_TESTS(test_mod_lshift1, OSSL_NELEM(test_mod_lshift1_cases)); + ADD_ALL_TESTS(test_mod_lshift, OSSL_NELEM(test_mod_lshift_cases)); + ADD_TEST(test_mod_quick_wide_operands); + ADD_TEST(test_mod_sub_general_wide_operands); + ADD_ALL_TESTS(test_mod_ops_result_size, 3); return 1; } From 7a888692249e96992e2fb26974a1bb6a4ed0637e Mon Sep 17 00:00:00 2001 From: Richard Levitte Date: Fri, 10 Jul 2026 09:10:59 +0200 Subject: [PATCH 68/69] OSSL_FN: Add modular context sizing The modular OSSL_FN operations are layered on top of each other, but the sizing of the required OSSL_FN_CTX arena was not available as operation-specific helpers, mirroring OSSL_FN_div_ctx_size(), OSSL_FN_mul_ctx_size(), and OSSL_FN_sqr_ctx_size(). Add ctx-size helpers for the modular operations and compose them from lower-level helpers. Each helper returns arena payload bytes, accounts for its own live temporaries, and adds the maximum nested requirement while those temporaries are live. Assisted-by: Pi:openai/gpt-5.5 Assisted-by: Pi:z-ai/glm-5.2 Signed-off-by: Richard Levitte Reviewed-by: Jakub Zelenka Reviewed-by: Igor Ustinov MergeDate: Thu Jul 23 15:02:39 2026 (Merged from https://github.com/openssl/openssl/pull/31479) --- crypto/fn/fn_mod.c | 182 ++++++++++++++++++++++++++++++++++++++++++++ include/crypto/fn.h | 93 +++++++++++++++++++++- 2 files changed, 273 insertions(+), 2 deletions(-) diff --git a/crypto/fn/fn_mod.c b/crypto/fn/fn_mod.c index 4fb8115925..110e8dc6b3 100644 --- a/crypto/fn/fn_mod.c +++ b/crypto/fn/fn_mod.c @@ -9,9 +9,56 @@ #include "internal/cryptlib.h" #include "internal/nelem.h" +#include "internal/safe_math.h" #include "crypto/fnerr.h" #include "fn_local.h" +OSSL_SAFE_MATH_ADDU(size_t, size_t, OSSL_SAFE_MATH_MAXU(size_t)) +OSSL_SAFE_MATH_MULU(size_t, size_t, OSSL_SAFE_MATH_MAXU(size_t)) + +static size_t ctx_add_size(size_t a, size_t b) +{ + int err = 0; + size_t r = safe_add_size_t(a, b, &err); + + return err == 0 ? r : 0; +} + +static size_t ctx_max_size(size_t a, size_t b) +{ + return a > b ? a : b; +} + +/* + * The *_ctx_size helpers below use local OSSL_FN headers with only |dsize| + * set to represent temporaries that the corresponding operation allocates + * with OSSL_FN_CTX_get_limbs(). This is enough for nested ctx-size helpers, + * which only inspect operand sizes. + */ +size_t OSSL_FN_mod_add_ctx_size(const OSSL_FN *r, const OSSL_FN *a, + const OSSL_FN *b, const OSSL_FN *m) +{ + size_t tl, own_size, nested_size; + + if (r == NULL || a == NULL || b == NULL || m == NULL) + return 0; + int err = 0; + + tl = safe_add_size_t(a->dsize > b->dsize ? a->dsize : b->dsize, + 1, &err); + if (err != 0 || ossl_fn_totalsize(tl) == 0) + return 0; + + OSSL_FN t = { .dsize = (int)tl }; + + own_size = OSSL_FN_CTX_size(1, 1, tl); + nested_size = OSSL_FN_mod_ctx_size(r, &t, m); + if (own_size == 0 || nested_size == 0) + return 0; + + return ctx_add_size(own_size, nested_size); +} + int OSSL_FN_mod_add(OSSL_FN *r, const OSSL_FN *a, const OSSL_FN *b, const OSSL_FN *m, OSSL_FN_CTX *ctx) { @@ -102,6 +149,32 @@ int OSSL_FN_mod_add_quick(OSSL_FN *r, const OSSL_FN *a, const OSSL_FN *b, return 1; } +size_t OSSL_FN_mod_sub_ctx_size(const OSSL_FN *r, const OSSL_FN *a, + const OSSL_FN *b, const OSSL_FN *m) +{ + size_t ml, n_numbers, own_size, mod_a_size, mod_b_size, nested_size; + + if (r == NULL || a == NULL || b == NULL || m == NULL) + return 0; + + ml = m->dsize; + n_numbers = (r == m) ? 3 : 2; + if (ossl_fn_totalsize(ml) == 0) + return 0; + + OSSL_FN am = { .dsize = (int)ml }; + OSSL_FN bm = { .dsize = (int)ml }; + + own_size = OSSL_FN_CTX_size(1, n_numbers, n_numbers * ml); + mod_a_size = OSSL_FN_mod_ctx_size(&am, a, m); + mod_b_size = OSSL_FN_mod_ctx_size(&bm, b, m); + nested_size = ctx_max_size(mod_a_size, mod_b_size); + if (own_size == 0 || nested_size == 0) + return 0; + + return ctx_add_size(own_size, nested_size); +} + int OSSL_FN_mod_sub(OSSL_FN *r, const OSSL_FN *a, const OSSL_FN *b, const OSSL_FN *m, OSSL_FN_CTX *ctx) { @@ -209,6 +282,44 @@ int OSSL_FN_mod_sub_quick(OSSL_FN *r, const OSSL_FN *a, const OSSL_FN *b, return 1; } +size_t OSSL_FN_mod_mul_ctx_size(const OSSL_FN *r, const OSSL_FN *a, + const OSSL_FN *b, const OSSL_FN *m) +{ + size_t tl, own_size, mul_size, mod_size, nested_size; + + if (r == NULL || a == NULL || b == NULL || m == NULL) + return 0; + + if (a == b) { + int err = 0; + + tl = safe_mul_size_t(2, a->dsize, &err); + if (err != 0 || ossl_fn_totalsize(tl) == 0) + return 0; + OSSL_FN t = { .dsize = (int)tl }; + + mul_size = OSSL_FN_sqr_ctx_size(&t, a); + mod_size = OSSL_FN_mod_ctx_size(r, &t, m); + } else { + int err = 0; + + tl = safe_add_size_t(a->dsize, b->dsize, &err); + if (err != 0 || ossl_fn_totalsize(tl) == 0) + return 0; + OSSL_FN t = { .dsize = (int)tl }; + + mul_size = OSSL_FN_mul_ctx_size(&t, a, b); + mod_size = OSSL_FN_mod_ctx_size(r, &t, m); + } + + own_size = OSSL_FN_CTX_size(1, 1, tl); + nested_size = ctx_max_size(mul_size, mod_size); + if (own_size == 0 || nested_size == 0) + return 0; + + return ctx_add_size(own_size, nested_size); +} + /* slow but works */ int OSSL_FN_mod_mul(OSSL_FN *r, const OSSL_FN *a, const OSSL_FN *b, const OSSL_FN *m, OSSL_FN_CTX *ctx) @@ -241,6 +352,31 @@ err: return ret; } +size_t OSSL_FN_mod_sqr_ctx_size(const OSSL_FN *r, const OSSL_FN *a, + const OSSL_FN *m) +{ + size_t tl, own_size, sqr_size, mod_size, nested_size; + + if (r == NULL || a == NULL || m == NULL) + return 0; + int err = 0; + + tl = safe_mul_size_t(2, a->dsize, &err); + if (err != 0 || ossl_fn_totalsize(tl) == 0) + return 0; + + OSSL_FN t = { .dsize = (int)tl }; + + own_size = OSSL_FN_CTX_size(1, 1, tl); + sqr_size = OSSL_FN_sqr_ctx_size(&t, a); + mod_size = OSSL_FN_mod_ctx_size(r, &t, m); + nested_size = ctx_max_size(sqr_size, mod_size); + if (own_size == 0 || nested_size == 0) + return 0; + + return ctx_add_size(own_size, nested_size); +} + int OSSL_FN_mod_sqr(OSSL_FN *r, const OSSL_FN *a, const OSSL_FN *m, OSSL_FN_CTX *ctx) { @@ -261,6 +397,29 @@ err: return ret; } +size_t OSSL_FN_mod_lshift1_ctx_size(const OSSL_FN *r, const OSSL_FN *a, + const OSSL_FN *m) +{ + size_t tl, own_size, nested_size; + + if (r == NULL || a == NULL || m == NULL) + return 0; + int err = 0; + + tl = safe_add_size_t(m->dsize, 1, &err); + if (err != 0 || ossl_fn_totalsize(tl) == 0) + return 0; + + OSSL_FN t = { .dsize = (int)tl }; + + own_size = OSSL_FN_CTX_size(1, 1, tl); + nested_size = OSSL_FN_mod_ctx_size(r, &t, m); + if (own_size == 0 || nested_size == 0) + return 0; + + return ctx_add_size(own_size, nested_size); +} + int OSSL_FN_mod_lshift1(OSSL_FN *r, const OSSL_FN *a, const OSSL_FN *m, OSSL_FN_CTX *ctx) { @@ -302,6 +461,29 @@ err: return ret; } +size_t OSSL_FN_mod_lshift_ctx_size(const OSSL_FN *r, const OSSL_FN *a, + int n, const OSSL_FN *m) +{ + size_t ml, own_size, nested_size; + + if (r == NULL || a == NULL || m == NULL) + return 0; + (void)n; + + ml = m->dsize; + if (ossl_fn_totalsize(ml) == 0) + return 0; + + OSSL_FN ra = { .dsize = (int)ml }; + + own_size = OSSL_FN_CTX_size(1, 1, ml); + nested_size = OSSL_FN_mod_ctx_size(&ra, a, m); + if (own_size == 0 || nested_size == 0) + return 0; + + return ctx_add_size(own_size, nested_size); +} + int OSSL_FN_mod_lshift(OSSL_FN *r, const OSSL_FN *a, int n, const OSSL_FN *m, OSSL_FN_CTX *ctx) { diff --git a/include/crypto/fn.h b/include/crypto/fn.h index 17ebf47efe..76f71b4f1e 100644 --- a/include/crypto/fn.h +++ b/include/crypto/fn.h @@ -689,6 +689,21 @@ size_t OSSL_FN_div_ctx_size(const OSSL_FN *q, const OSSL_FN *r, int OSSL_FN_mod_add(OSSL_FN *r, const OSSL_FN *a, const OSSL_FN *b, const OSSL_FN *m, OSSL_FN_CTX *ctx); +/** + * Calculate the arena payload size that OSSL_FN_mod_add() needs. + * + * @param[in] r The OSSL_FN for the result + * @param[in] a The first operand + * @param[in] b The second operand + * @param[in] m The modulus + * @returns The arena payload size, in bytes. + * @retval 0 on arithmetic overflow or invalid input. + * + * The returned size includes any frame budget needed by OSSL_FN_mod_add(). + */ +size_t OSSL_FN_mod_add_ctx_size(const OSSL_FN *r, const OSSL_FN *a, + const OSSL_FN *b, const OSSL_FN *m); + /** * Add two OSSL_FN numbers modulo m. This is a quick variant that may be * used if both a and b are less than m. @@ -721,6 +736,21 @@ int OSSL_FN_mod_add_quick(OSSL_FN *r, const OSSL_FN *a, const OSSL_FN *b, int OSSL_FN_mod_sub(OSSL_FN *r, const OSSL_FN *a, const OSSL_FN *b, const OSSL_FN *m, OSSL_FN_CTX *ctx); +/** + * Calculate the arena payload size that OSSL_FN_mod_sub() needs. + * + * @param[in] r The OSSL_FN for the result + * @param[in] a The first operand + * @param[in] b The second operand + * @param[in] m The modulus + * @returns The arena payload size, in bytes. + * @retval 0 on arithmetic overflow or invalid input. + * + * The returned size includes any frame budget needed by OSSL_FN_mod_sub(). + */ +size_t OSSL_FN_mod_sub_ctx_size(const OSSL_FN *r, const OSSL_FN *a, + const OSSL_FN *b, const OSSL_FN *m); + /** * Subtract two OSSL_FN numbers modulo m. This is a quick variant that may * be used if a is less than m and b is of the same bit width as m. @@ -754,6 +784,21 @@ int OSSL_FN_mod_sub_quick(OSSL_FN *r, const OSSL_FN *a, const OSSL_FN *b, int OSSL_FN_mod_mul(OSSL_FN *r, const OSSL_FN *a, const OSSL_FN *b, const OSSL_FN *m, OSSL_FN_CTX *ctx); +/** + * Calculate the arena payload size that OSSL_FN_mod_mul() needs. + * + * @param[in] r The OSSL_FN for the result + * @param[in] a The first operand + * @param[in] b The second operand + * @param[in] m The modulus + * @returns The arena payload size, in bytes. + * @retval 0 on arithmetic overflow or invalid input. + * + * The returned size includes any frame budget needed by OSSL_FN_mod_mul(). + */ +size_t OSSL_FN_mod_mul_ctx_size(const OSSL_FN *r, const OSSL_FN *a, + const OSSL_FN *b, const OSSL_FN *m); + /** * Square an OSSL_FN number modulo m. * @@ -772,6 +817,20 @@ int OSSL_FN_mod_mul(OSSL_FN *r, const OSSL_FN *a, const OSSL_FN *b, int OSSL_FN_mod_sqr(OSSL_FN *r, const OSSL_FN *a, const OSSL_FN *m, OSSL_FN_CTX *ctx); +/** + * Calculate the arena payload size that OSSL_FN_mod_sqr() needs. + * + * @param[in] r The OSSL_FN for the result + * @param[in] a The operand + * @param[in] m The modulus + * @returns The arena payload size, in bytes. + * @retval 0 on arithmetic overflow or invalid input. + * + * The returned size includes any frame budget needed by OSSL_FN_mod_sqr(). + */ +size_t OSSL_FN_mod_sqr_ctx_size(const OSSL_FN *r, const OSSL_FN *a, + const OSSL_FN *m); + /** * Left shift an OSSL_FN number by 1 bit, modulo m. * @@ -789,6 +848,21 @@ int OSSL_FN_mod_sqr(OSSL_FN *r, const OSSL_FN *a, const OSSL_FN *m, int OSSL_FN_mod_lshift1(OSSL_FN *r, const OSSL_FN *a, const OSSL_FN *m, OSSL_FN_CTX *ctx); +/** + * Calculate the arena payload size that OSSL_FN_mod_lshift1() needs. + * + * @param[in] r The OSSL_FN for the result + * @param[in] a The operand + * @param[in] m The modulus + * @returns The arena payload size, in bytes. + * @retval 0 on arithmetic overflow or invalid input. + * + * The returned size includes any frame budget needed by + * OSSL_FN_mod_lshift1(). + */ +size_t OSSL_FN_mod_lshift1_ctx_size(const OSSL_FN *r, const OSSL_FN *a, + const OSSL_FN *m); + /** * Left shift an OSSL_FN number by 1 bit, modulo m. This is a quick * variant that may be used if a is less than m. @@ -818,6 +892,21 @@ int OSSL_FN_mod_lshift1_quick(OSSL_FN *r, const OSSL_FN *a, const OSSL_FN *m); int OSSL_FN_mod_lshift(OSSL_FN *r, const OSSL_FN *a, int n, const OSSL_FN *m, OSSL_FN_CTX *ctx); +/** + * Calculate the arena payload size that OSSL_FN_mod_lshift() needs. + * + * @param[in] r The OSSL_FN for the result + * @param[in] a The operand + * @param[in] n The number of bits to shift + * @param[in] m The modulus + * @returns The arena payload size, in bytes. + * @retval 0 on arithmetic overflow or invalid input. + * + * The returned size includes any frame budget needed by OSSL_FN_mod_lshift(). + */ +size_t OSSL_FN_mod_lshift_ctx_size(const OSSL_FN *r, const OSSL_FN *a, + int n, const OSSL_FN *m); + /** * Left shift an OSSL_FN number by n bits, modulo m. This is a quick * variant that may be used if a is less than m. @@ -854,8 +943,8 @@ static inline int OSSL_FN_mod(OSSL_FN *r, const OSSL_FN *n, const OSSL_FN *d, * Calculate the arena payload size that OSSL_FN_mod() needs. * * @param[in] r The OSSL_FN for the remainder - * @param[in] n The first operand (numerator) - * @param[in] d The second operand (denominator) + * @param[in] n The numerator + * @param[in] d The denominator * @returns The arena payload size, in bytes. * @retval 0 on arithmetic overflow or invalid input. * From 95b4936aa1d825c687e8347a1793ec9730812424 Mon Sep 17 00:00:00 2001 From: Richard Levitte Date: Fri, 10 Jul 2026 12:58:23 +0200 Subject: [PATCH 69/69] OSSL_FN: Add mod_mul and mod_sqr stanza tests Add file_modmul() and file_modsqr() to test/fntest.c, using the existing bntest.c counterparts as a template. The ModMul and ModSqr stanzas in bnmod.txt now exercise OSSL_FN_mod_mul() and OSSL_FN_mod_sqr() through the stanza-driven test harness, providing a real call site for the new modular operations. Because OSSL_FN is unsigned, the operands are passed as absolute values (via bn_get_ossl_fn()). For mod_mul, if the operands have different signs, the non-negative modular residue is recovered with BN_sub(ret, m, ret) after release, keeping the sign logic at the BIGNUM boundary. No sign fixup is needed for mod_sqr since squaring is always non-negative. Include bnmod.txt in 11-test_fn.t so the mod stanzas are run as part of the regular test suite. Related-to: doc/designs/fixed-size-large-numbers.md Issue: https://github.com/openssl/project/issues/1932 Assisted-by: Pi:z-ai/glm-5.2 Signed-off-by: Richard Levitte Reviewed-by: Jakub Zelenka Reviewed-by: Igor Ustinov MergeDate: Thu Jul 23 15:02:40 2026 (Merged from https://github.com/openssl/openssl/pull/31479) --- test/fntest.c | 112 +++++++++++++++++++++++++++++++++++++- test/recipes/11-test_fn.t | 2 +- 2 files changed, 111 insertions(+), 3 deletions(-) diff --git a/test/fntest.c b/test/fntest.c index 4f32e33390..da6a9e54df 100644 --- a/test/fntest.c +++ b/test/fntest.c @@ -566,6 +566,114 @@ err: return st; } +static int file_modmul(STANZA *s) +{ + BIGNUM *a = NULL, *b = NULL, *m = NULL, *mod_mul = NULL, *ret = NULL; + OSSL_FN *af = NULL, *bf = NULL, *rf = NULL, *mf = NULL; + OSSL_FN_CTX *ctx = NULL; + int a_neg = 0, b_neg = 0, st = 0; + int r_acq = 0; + int nlimbs = 0; + + if (!TEST_ptr(a = getBN(s, "A")) + || !TEST_ptr(b = getBN(s, "B")) + || !TEST_ptr(m = getBN(s, "M")) + || !TEST_ptr(mod_mul = getBN(s, "ModMul")) + || !TEST_ptr(ret = BN_new())) + goto err; + + a_neg = BN_is_negative(a); + b_neg = BN_is_negative(b); + nlimbs = limbs(m); + + if (!TEST_ptr(af = bn_get_ossl_fn(a)) + || !TEST_ptr(bf = bn_get_ossl_fn(b)) + || !TEST_ptr(mf = bn_get_ossl_fn(m)) + || !TEST_ptr(rf = bn_acquire_ossl_fn(ret, nlimbs))) + goto err; + r_acq = 1; + + if (!TEST_ptr(ctx = OSSL_FN_CTX_new_size(NULL, + OSSL_FN_mod_mul_ctx_size(rf, af, bf, mf)))) + goto err; + + /* + * OSSL_FN is unsigned, so the multiplication is on absolute values. + * If the operands have different signs, the non-negative modular + * residue of A * B is M - ((|A| * |B|) mod M), unless that is zero. + */ + if (!TEST_true(OSSL_FN_mod_mul(rf, af, bf, mf, ctx))) + goto err; + bn_release(ret, nlimbs); + r_acq = 0; + if ((a_neg ^ b_neg) && !BN_is_zero(ret)) { + if (!TEST_true(BN_sub(ret, m, ret))) + goto err; + } + if (!equalBN("A * B (mod M)", mod_mul, ret)) + goto err; + + st = 1; +err: + if (r_acq) + bn_release(ret, nlimbs); + OSSL_FN_CTX_free(ctx); + BN_free(a); + BN_free(b); + BN_free(m); + BN_free(mod_mul); + BN_free(ret); + return st; +} + +static int file_modsqr(STANZA *s) +{ + BIGNUM *a = NULL, *m = NULL, *mod_sqr = NULL, *ret = NULL; + OSSL_FN *af = NULL, *rf = NULL, *mf = NULL; + OSSL_FN_CTX *ctx = NULL; + int st = 0; + int r_acq = 0; + int nlimbs = 0; + + if (!TEST_ptr(a = getBN(s, "A")) + || !TEST_ptr(m = getBN(s, "M")) + || !TEST_ptr(mod_sqr = getBN(s, "ModSqr")) + || !TEST_ptr(ret = BN_new())) + goto err; + + nlimbs = limbs(m); + + if (!TEST_ptr(af = bn_get_ossl_fn(a)) + || !TEST_ptr(mf = bn_get_ossl_fn(m)) + || !TEST_ptr(rf = bn_acquire_ossl_fn(ret, nlimbs))) + goto err; + r_acq = 1; + + if (!TEST_ptr(ctx = OSSL_FN_CTX_new_size(NULL, + OSSL_FN_mod_sqr_ctx_size(rf, af, mf)))) + goto err; + + /* + * Squaring is always non-negative, so no sign fixup is needed. + */ + if (!TEST_true(OSSL_FN_mod_sqr(rf, af, mf, ctx))) + goto err; + bn_release(ret, nlimbs); + r_acq = 0; + if (!equalBN("A^2 (mod M)", mod_sqr, ret)) + goto err; + + st = 1; +err: + if (r_acq) + bn_release(ret, nlimbs); + OSSL_FN_CTX_free(ctx); + BN_free(a); + BN_free(m); + BN_free(mod_sqr); + BN_free(ret); + return st; +} static FILETEST filetests[] = { { "Sum", file_sum, 0 }, { "LShift1", file_lshift1, 0 }, @@ -574,8 +682,8 @@ static FILETEST filetests[] = { { "Square", file_square, 0 }, { "Product", file_product, 0 }, { "Quotient", file_quotient, 0 }, - { "ModMul", NULL, 0 }, - { "ModSqr", NULL, 0 }, + { "ModMul", file_modmul, 0 }, + { "ModSqr", file_modsqr, 0 }, { "ModExp", NULL, 0 }, { "Exp", NULL, 0 }, { "ModSqrt", NULL, 0 }, diff --git a/test/recipes/11-test_fn.t b/test/recipes/11-test_fn.t index 1eff2e7640..d7a4b99fc0 100644 --- a/test/recipes/11-test_fn.t +++ b/test/recipes/11-test_fn.t @@ -12,7 +12,7 @@ use warnings; use OpenSSL::Test qw/:DEFAULT srctop_file/; setup("test_fn"); -my @files = qw( bnmul.txt bnshift.txt bnsum.txt ); +my @files = qw( bnmul.txt bnshift.txt bnsum.txt bnmod.txt ); plan tests => scalar(@files);