Initial commit
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..53eaa21
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,2 @@
+/target
+**/*.rs.bk
diff --git a/.gitmodules b/.gitmodules
new file mode 100644
index 0000000..ad2597c
--- /dev/null
+++ b/.gitmodules
@@ -0,0 +1,3 @@
+[submodule "boringssl/boringssl"]
+ path = boringssl/boringssl
+ url = https://boringssl.googlesource.com/boringssl
diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644
index 0000000..b572595
--- /dev/null
+++ b/CHANGELOG.md
@@ -0,0 +1,13 @@
+<!-- Copyright 2018 Google LLC
+
+Use of this source code is governed by an MIT-style
+license that can be found in the LICENSE file or at
+https://opensource.org/licenses/MIT. -->
+
+# Changelog
+
+All notable changes to this project will be documented in this file.
+
+The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/).
+
+## [Unreleased]
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
new file mode 100644
index 0000000..e06004a
--- /dev/null
+++ b/CONTRIBUTING.md
@@ -0,0 +1,193 @@
+<!-- Copyright 2018 Google LLC
+
+Use of this source code is governed by an MIT-style
+license that can be found in the LICENSE file or at
+https://opensource.org/licenses/MIT. -->
+
+# Contributing
+
+## Code Guidelines
+
+### Unsafe
+
+`unsafe` is not allowed, except for in the `boringssl` module. We
+`#[forbid(unsafe)]` in all other modules, so code that uses `unsafe` outside of
+that module should fail to compile. For details on how to use `unsafe` in the
+`boringssl` module, see the doc comment on that module.
+
+### `#[must_use]`
+
+The `#[must_use]` directive causes the compiler to emit a warning if code calls
+a function but does not use its return value. It is a very useful lint against
+failing to properly act on the result of cryptographic operations. A
+`#[must_use]` directive should go on:
+- All functions/methods (including in trait definitions) which return a value
+ and are visible outside of the crate
+- In the `boringssl` module:
+ - All functions/methods (including in trait definitions) which return a value
+ and are visible outside of the `boringssl` module or are exported from the
+ `raw` or `wrapper` modules to the top-level `boringssl` module
+
+`#[must_use]` may also be used on types, but should be evaluated on a
+case-by-case basis. A few things to keep in mind:
+- All functions defined in `mundane` which return values have `#[must_use]` on
+ them, so the case of a type returned by a function defined in `mundane` is
+ already covered.
+- Unlike on functions, `#[must_use]` on types affects code other than the
+ immediate caller since code outside of this crate may return types which are
+ defined in this crate.
+
+Thus, `#[must_use]` should only be used on a type when it's desired for
+functions defined outside of this crate which return the type to have
+`#[must_use]` behavior.
+
+As a general rule of thumb, this should be restricted to types which could be
+used to make security decisions. For example, digests and signatures should have
+`#[must_use]`, while keys should not have it.
+
+*TODO(joshlf): Re-evaluate this policy? Maybe we want to put `#[must_use]` on
+more types?*
+
+### Insecure
+
+Some clients require access to insecure operations in order to interoperate with
+legacy applications. While we provide these operations, we do so with a few
+caveats:
+- We only provide the bare minimum required. For example, while we provide
+ HMAC-SHA1, we do not provide SHA-1 on its own, as it is not needed.
+- We attempt to make it as difficult as possible for somebody to use an insecure
+ operation unintentionally, as detailed in the next section.
+
+#### Adding Insecure Operations
+
+We use a number of mechanisms to make it less likely for somebody to use an
+insecure operation unintentionally or without understanding the implications.
+They are:
+- Use of Rust's `#[deprecated]` attribute so that code which uses insecure
+ operations will produce a compiler warning
+- Naming of insecure types, functions, and methods with an "insecure" prefix so
+ that their use will stand out in code, and their insecurity will stand out
+ when reading their documentation
+- Documentation comments that stress the operation's insecurity
+- Placing all insecure operations in their own `insecure` module so that users
+ are unlikely to accidentally come across an insecure operation while browsing
+ other documentation
+- Placing the `insecure` module behind a feature flag which is disabled by
+ default
+
+The whole is also more than the sum of the parts. Taken together, these
+mechanisms serve to give an appropriate air of gravitas to insecure operations.
+Users should feel uneasy - like they're wading into dangerous and subtle
+territory (because they are!). They should be made to feel the gravity of the
+situation, and to appreciate the importance of carefully considering whether
+using an insecure operation is appropriate.
+
+##### Deprecation
+
+Rust provides the `#[deprecated]`
+[attribute](https://doc.rust-lang.org/reference/attributes.html) which can be
+placed on items including modules, types, functions, methods, and traits. If a
+deprecated item is imported or used, it will cause a compiler warning (two,
+actually - one for the import, and one for the use in code).
+
+In `mundane`, all insecure operations must be marked with a `#[deprecated]`
+attribute with an appropriate message. This includes all items that a user could
+ever interact with - types, functions, methods, etc. If it has a `pub` in front
+of it, it needs a deprecation attribute. For example:
+
+```rust
+#[deprecated(note = "Foo is considered insecure")]
+pub struct InsecureFooResult;
+
+impl InsecureFooResult {
+ #[deprecated(note = "Foo is considered insecure")]
+ pub fn insecure_frobnicate(&self) { ... }
+}
+
+#[deprecated(note = "Foo is considered insecure")]
+pub fn insecure_foo() -> InsecureFooResult { ... }
+```
+
+##### Naming
+
+Every user-facing Rust item associated with an insecure operation carries an
+"insecure" prefix on its name. For types and traits, this is of the form
+`Insecure`, while for functions, methods, and modules, it's of the form
+`insecure_`. See the example from the previous section for a demonstration of
+this naming.
+
+The justification for this is twofold. First, it makes it so that, while reading
+documentation, it's unlikely for even a casual reader to miss that what they're
+reading about is a special case that should be carefully considered. Second, it
+makes it very obvious when reading or reviewing code that makes use of insecure
+operations.
+
+##### Documentation
+
+Every documentation comment on an insecure operation should have the following
+structure:
+
+```rust
+/// INSECURE: <summary of operation>
+///
+/// # Security
+///
+/// <operation> is considered insecure, and should only be used for compatibility
+/// with legacy applications.
+///
+/// <further documentation if necessary>
+```
+
+As with naming, this serves to lessen the likelihood that a user will use an
+insecure operation without realizing what they're doing.
+
+##### Module Isolation
+
+All insecure operations are exposed through a top-level `insecure` module, which
+is itself marked with a deprecation attribute, and carries appropriate
+module-level documentation.
+
+Unfortunately, due to Rust's visibility rules, making this work involves a bit
+of a dance. For reasons of practicality, insecure operations are defined
+alongside their secure counterparts. For example, the `InsecureHmacSha1` type is
+defined in the `hmac` module, and the `InsecureSha1Digest` type is defined in
+the `hash` module. A programmer's first inclination might be to mark these as
+`pub(crate)` and attempt to re-export them from the `insecure` module.
+Unfortunately, Rust forbids this.
+
+Instead, we take the somewhat circuitous approach of putting an insecure
+operation inside of its own `pub(crate)` module (e.g.,
+`hmac::insecure_hmac_sha1`). Inside of this module, the insecure operation can be
+`pub` rather than `pub(crate)`. This, in turn, allows the `insecure` module to
+re-export the item without running afoul of the compiler. It's an awkward dance,
+but it makes it so that insecure operations can only be accessed through the
+`insecure` module, which is a big win.
+
+##### Feature Gating
+
+By default, the `insecure` module is not present. The user must explicitly
+enable the `insecure` feature in order to enable the module.
+
+## Contributor License Agreement
+
+Contributions to this project must be accompanied by a Contributor License
+Agreement. You (or your employer) retain the copyright to your contribution;
+this simply gives us permission to use and redistribute your contributions as
+part of the project. Head over to <https://cla.developers.google.com/> to see
+your current agreements on file or to sign a new one.
+
+You generally only need to submit a CLA once, so if you've already submitted one
+(even if it was for a different project), you probably don't need to do it
+again.
+
+## Code reviews
+
+All submissions, including submissions by project members, require review. We
+use GitHub pull requests for this purpose. Consult
+[GitHub Help](https://help.github.com/articles/about-pull-requests/) for more
+information on using pull requests.
+
+## Community Guidelines
+
+This project follows [Google's Open Source Community
+Guidelines](https://opensource.google.com/conduct/).
\ No newline at end of file
diff --git a/Cargo.toml b/Cargo.toml
new file mode 100644
index 0000000..1dd61ac
--- /dev/null
+++ b/Cargo.toml
@@ -0,0 +1,23 @@
+# Copyright 2018 Google LLC
+#
+# Use of this source code is governed by an MIT-style
+# license that can be found in the LICENSE file or at
+# https://opensource.org/licenses/MIT.
+
+[package]
+name = "mundane"
+# remember to update html_root_url
+# TODO(joshlf): use version-sync crate to test this in CI
+version = "0.2.0"
+authors = ["Joshua Liebow-Feeser <joshlf@google.com>"]
+description = "Cryptography which is easy to use and hard to misuse"
+readme = "README.md"
+license-file = "LICENSE"
+keywords = ["boringssl"]
+categories = ["cryptography"]
+repository = "https://github.com/google/mundane"
+
+[features]
+insecure = []
+kdf = []
+rand-bytes = []
diff --git a/DESIGN.md b/DESIGN.md
new file mode 100644
index 0000000..f9ae5a5
--- /dev/null
+++ b/DESIGN.md
@@ -0,0 +1,197 @@
+<!-- Copyright 2018 Google LLC
+
+Use of this source code is governed by an MIT-style
+license that can be found in the LICENSE file or at
+https://opensource.org/licenses/MIT. -->
+
+# Design of the `mundane` crate
+
+`mundane` has the following design goals, in this order:
+- To be difficult to misuse
+- To be ergonomic
+- To be performant
+
+This document describes both the overall philosophy, and also specific design
+patterns used to achieve these goals
+
+# Philosophy
+
+Cryptography is famously subtle and easy to get wrong. And when cryptography is
+done wrong, the results can be catastrophic.
+
+Experience has shown that most programmers, not being familiar with the
+subtleties of cryptography, will unknowingly misuse cryptographic libraries if
+they are allowed. This is one example of a broader trend - that it's difficult
+to get something right if getting it wrong doesn't affect whether your program
+runs. It's the same reason that error handling code is so often buggy in
+otherwise well-written programs. Misuse of cryptography, like buggy error
+handling, is unlikely to show up in tests, and unlikely to affect the
+correctness of a program under normal conditions. But unlike error handling,
+most programmers aren't familiar with the requirements of using cryptography
+securely, and getting it wrong can be absolutely fatal.
+
+Given this realization, `mundane` takes the approach of giving the programmer
+the fewest degrees of freedom possible. Doing the right thing should be easy and
+feel natural. Doing the wrong thing should feel difficult and ideally be
+entirely impossible. This philosophy motivates the design patterns which are
+explored in the next section.
+
+# Design Patterns
+
+## Do work for the user
+
+Some cryptographic operations have setup phases, require generating random
+values, computing key schedules, etc. While many cryptographic APIs split these
+into multiple steps that must be performed by the user in the right order,
+prefer APIs which perform all setup steps on behalf of the user. This reduces
+the opportunities for the user to make a mistake.
+
+For example, the scrypt password-based key derivation function takes a salt.
+When generating a key from a new password, the salt should always be randomly
+generated anew. Instead of taking the salt as an argument, as many cryptographic
+APIs do, we generate the salt as part of the generation function -
+`scrypt_generate` - so that the user is not given the opportunity to improperly
+generate it.
+
+As another example, while scrypt can be used as a general-purpose key derivation
+function, we expose it specifically for password verification. Thus, instead of
+having the API expose the ability to take a password and a salt and generate a
+hash, leaving it up to the user to verify that the calculated hash matches the
+expected one, our API takes a password, a salt, and a hash, computes the new
+hash, checks it against the expected one, and returns a boolean. Not only does
+this ensure that the comparison is not accidentally skipped, it also allows us
+to ensure that the comparison is performed using a constant-time comparison
+function, which is a subtle detail that is often overlooked by users.
+
+## Types
+
+All cryptographic operations have data associated with them. A hash function
+takes a byte sequence and outputs a digest. A signature functions takes a
+private key and a digest, and outputs a signature.
+
+These types of data usually have strict definitions of what operations are valid
+or secure to perform on them. The Rust type system provides a powerful mechanism
+to enforce that users cannot use these cryptographic objects other than as
+intended.
+
+### Opaque types
+
+The easiest way to restrict the set of allowed operations on a type is to make
+it opaque - that is, to create a struct with private fields, and provide only
+the minimum set of methods or trait implementations needed. For example, instead
+of representing a SHA-256 digest as a `[u8; 32]`, we represent it as an opaque
+struct, `Sha256Digest`, which has a private `[u8; 32]` field.
+
+Given such an opaque type, we can be judicious about methods or trait
+implementations to provide. For example, a SHA-256 digest should be comparable
+for equality with other SHA-256 digests, and so `Sha256Digest` implements `Eq`
+for itself. However, comparing with digests from other hash functions is not a
+cryptographically meaningful operation, so it doesn't implement `Eq` for other
+types of digests. Similarly, the `EcdsaSignature` type provides only a
+constructor and a getter, as no other operations (including comparison between
+signatures) are meaningful.
+
+It will usually be necessary to allow the user to access a non-opaque
+representation (such as a byte array for hash digests). However, it is
+sufficient to only provide constructors and getters. For example, the `Digest`
+trait provides a `from_bytes(bytes: [u8; Self::DIGEST_LEN]) -> Self`
+constructor, and a `bytes(&self) -> [u8; Self::DIGEST_LEN]` getter, but does not
+provide, for example, `bytes_mut(&mut self) -> &mut [u8; Self::DIGEST_LEN]`.
+
+### Use distinct types even if they have the same operations
+
+Sometimes, distinct cryptographic objects will have the same representations and
+operations allowed on them. For example, both RIPEMD-160 and SHA-1 produce
+20-byte digests. Even if this happens, distinct Rust types should still be used.
+Since it is never valid to compare a RIPEMD-160 digest to a SHA-1 digest,
+representing them with the same Rust type would allow operations that are not
+valid. Representing them with distinct Rust types ensures that they are not
+spuriously used together in an invalid or insecure way.
+
+### Use the most restrictive type
+
+At some point, it will be necessary to accept or provide a non-opaque
+representation so that input can be gathered from the outside world or output to
+it. When this happens, use the most restrictive type in order to avoid having
+to perform validation at runtime.
+
+For example, hash digests have a fixed length. Thus, their constructors accept
+(and their getters produce) fixed-length byte arrays. If, instead,
+variable-length byte slices were used, it would be necessary a) to document the
+length requirement, b) to validate the length during construction, and panic if
+it failed, and c) to promise to the user to always produce slices of a
+particular length. By using fixed-length arrays, we allow the type system to
+guarantee that input will always be valid - so we don't need to perform any
+validation - and to guarantee that the output will always conform to what is
+documented - so the user doesn't need to simply trust our documentation.
+
+### Put as much as possible in the type system
+
+If a distinction exists between two cryptographic objects, always try to encode
+that distinction in the type system if possible (of course, don't go over board;
+ergonomics and other considerations are important too).
+
+For example, most cryptography libraries provide a single elliptic curve private
+key type. However, elliptic curve keys have a curve parameter, and two keys over
+different curves are not interchangable - they might as well be completely
+different cryptosystems. Thus, we provide a `PCurve` trait which is implemented
+by various curve types, and our private key type, `EcKey` is parametrized on
+such a type - `EcKey<C: PCurve>`.
+
+## Errors
+
+Error return values from cryptographic functions are an infamous source of
+vulnerabilities. As with any system, the error handling logic of a program is
+often the last consideration of a programmer, and is rarely exercised in tests.
+More so than most systems, however, failure to properly handle errors from
+cryptographic functions can easily lead to catastrophic vulnerabilities.
+
+In order to avoid an opportunity for error values to be misused, we follow
+the following design guidelines:
+- Always use the Rust `Result` type to report errors. This may be a no-brainer,
+ but it means that, if the user wants to extract the return value from a
+ function, they *must* handle errors (at the very least, by calling `unwrap` or
+ `expect`, and thus panicking on failure). This contrasts with a language like
+ C, in which failing to check status return codes is easy and a common source
+ of bugs.
+- Collapse the distinction between "verification failed" and "verification
+ encountered an error." When verifying cryptographic objects like comparing
+ digests, verifying signatures, etc, there can sometimes be errors that are not
+ the same as a verification failure. For example, a verification routine might
+ fail to allocate memory, or it might fail to parse an encoded signature.
+ Instead of having a verification routine provide three possible return values
+ (verification succeeded, verification failed, or error encountered) we
+ collapse the last two into a single one - verification failed. That way, the
+ user is never given the opportunity to try to make subtle error-handling
+ decisions that might lead to them mistakenly accepting an invalid signature as
+ valid.
+- If an error requires particularly subtle error-handling, prefer panicking or
+ aborting the process. When cryptographic operations fail in a way that would
+ require reporting an error to the user (in other words, there's no valid
+ non-error interpretation like in the case of signature verification), and
+ handling that failure is particularly error-prone, it may be justified to make
+ the function's API infallible, and instead panic or abort the process on
+ error. BoringSSL famously does this when failing to read randomness (e.g.,
+ from `/dev/urandom`), as this has historically been a source of
+ vulnerabilities.
+
+## Attributes
+
+Rust has two attributes which will cause compiler warnings in user code
+if elements of the `mundane` API are misused.
+- The `#[must_use]` attribute on a function causes a compiler warning if a user
+ calls the function and discards the result. We put this attribute on all
+ functions which return values, as it is always suspicious to call a
+ side-effect-free function and ignore its result (most of our functions which
+ return values are side-effect free). This is especially useful in cases like
+ signature or hash verification, where failure to check the return value from a
+ function could lead to a catastrophic vulnerability (the iOS [`goto fail` TLS
+ verification
+ bug](https://nakedsecurity.sophos.com/2014/02/24/anatomy-of-a-goto-fail-apples-ssl-bug-explained-plus-an-unofficial-patch/)
+ is a famous example of this).
+
+ Similarly, `#[must_use]` on a type will cause a compiler warning if a user
+ ever calls a function which returns that type and discards the result.
+- The `#[deprecated]` attribute causes a warning whenever an item is imported or
+ used anywhere in code. We make liberal use of this attribute for our insecure,
+ legacy-only operations like SHA-1. See `CONTRIBUTING.md` for more details.
\ No newline at end of file
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..e5ccb02
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,18 @@
+Copyright 2018 Google LLC. All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software is furnished to do so,
+subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..652edb3
--- /dev/null
+++ b/README.md
@@ -0,0 +1,48 @@
+<!-- Copyright 2018 Google LLC
+
+Use of this source code is governed by an MIT-style
+license that can be found in the LICENSE file or at
+https://opensource.org/licenses/MIT. -->
+
+# mundane
+
+`mundane` is a Rust cryptography library backed by BoringSSL that is difficult
+to misuse, ergonomic, and performant (in that order).
+
+## Dependencies
+
+`mundane` vendors a copy of the BoringSSL source, so BoringSSL does not need to
+be installed locally in order to build. However, the BoringSSL build system has
+the following dependencies:
+- [CMake](https://cmake.org/download/) 2.8.11 or later
+- Perl 5.6.1 or later. See [BoringSSL's build
+ instructions](https://boringssl.googlesource.com/boringssl/+/master/BUILDING.md)
+ for what to do if CMake fails to find Perl on your system.
+- Either Make or [Ninja](https://ninja-build.org/). Ninja is preferable, as it
+ makes compilation significantly faster; if both are present, Ninja will be
+ used. On Windows, Ninja is required.
+- A C compiler
+- Go
+- To build the x86 and x86_64 assembly, your assembler must support AVX2
+ instructions and `MOVBE`. If using GNU binutils, you must have 2.22 or later.
+
+In order to avoid errors at link time due to conflicting symbols, we build
+BoringSSL with a custom prefix for all of its symbols which is based on the name
+and version of this crate. That way, even if multiple different versions of
+`mundane` are present in the same dependency graph, none of the symbols from one
+version's BoringSSL will conflict with the symbols from another version's
+BoringSSL.
+
+## Supported platforms
+
+`mundane` supports being built on and for Linux and Mac. Windows support is
+under development. Cross-compilation is not supported.
+
+## License
+
+Everything outside of the `boringssl/boringssl` directory is licensed under an
+MIT license which can be found in the `LICENSE` file. Everything in the
+`boringssl/boringssl` directory is licensed with a license that can be found in
+the `boringssl/boringssl/LICENSE` file.
+
+Disclaimer: mundane is not an officially supported Google product.
diff --git a/boringssl/README.md b/boringssl/README.md
new file mode 100644
index 0000000..d462c91
--- /dev/null
+++ b/boringssl/README.md
@@ -0,0 +1,96 @@
+<!-- Copyright 2018 Google LLC
+
+Use of this source code is governed by an MIT-style
+license that can be found in the LICENSE file or at
+https://opensource.org/licenses/MIT. -->
+
+# boringssl
+
+This directory contains source code and Rust bindings for Google's
+[BoringSSL](https://boringssl.googlesource.com/boringssl/) library.
+
+## Versions
+
+BoringSSL is vendored here, so each version of `mundane` will depend on a
+particular version of BoringSSL. Each new release will usually vendor the latest
+version of BoringSSL in order to pick up bug fixes and improvements.
+
+## Bindings
+
+Rust bindings live in `boringssl.rs`. This file is included from the main
+`mundane` source code using a `#[path]` attribute.
+
+These bindings are auto-generated using the `bindgen.sh` script, although some
+manual intervention is required. In particular, after running `bindgen.sh`, each
+public function must be annotated with a `#[link_name]` attribute (the reason
+for these attributes is explained in the following section). For example, given
+the following bindgen output:
+
+```rust
+extern "C" {
+ pub fn CBS_init(cbs: *mut CBS, data: *const u8, len: usize);
+}
+```
+
+We add a `#[link_name]` attribute as follows, where X.Y.Z is the current crate
+version.
+
+```rust
+extern "C" {
+ #[link_name = "__RUST_MUNDANE_X_Y_Z_CBS_init"]
+ pub fn CBS_init(cbs: *mut CBS, data: *const u8, len: usize);
+}
+```
+
+## Symbol Prefixing
+
+Normally, the C build system does not allow multiple copies of the same codebase
+to be linked together since the namespace for C symbols is global at link time.
+In order to avoid this problem, we compile BoringSSL with a custom symbol prefix
+specific to the crate version. This document describes the details of how this
+works.
+
+### Prefixing
+
+Each BoringSSL symbol is given a prefix of `__RUST_MUNDANE_X_Y_Z_`, where the
+current crate version number is X.Y.Z. This way, if two different versions of
+the crate are present during a build, no C symbol will be defined under the same
+name in both builds of BoringSSL.
+
+### Two-phase build
+
+BoringSSL's build system has built-in support for symbol prefixing. However, it
+requires that the caller provide a list of symbols which need to be prefixed.
+Since the set of symbols present is highly platform-dependent, a static list
+would be very brittle and error-prone. Instead, we discover the symbols
+dynamically at build time by doing a two-phase build.
+
+In the first phase, we build BoringSSL as normal, with no symbol prefixing.
+Then, using a Go program provided by BoringSSL, we scrape the list of symbols
+from the build artifacts. Using this list, we run the build again - the second
+phase - this time using BoringSSL's symbol prefixing feature. We use the
+artifacts from the second build when performing the final Rust build.
+
+### Library names
+
+We instruct Rust to use the appropriate build artifacts using the linker path.
+The linker path is used in a manner similar to the binary `$PATH` in Unix
+systems. When a library is requested, the linker searches for a build artifact
+of the appropriate name, stopping its search once it has found the appropriate
+library. For example, given the argument `-l foo`, the linker would search for a
+file called `libfoo.a`.
+
+In order to ensure that the linker is able to find all copies of the BoringSSL
+build artifacts, we give them unique names. If we didn't, only the first
+artifact found in the filesystem would be used. Currently, we only link against
+the `crypto` library, which, in the normal build system, is stored in
+`libcrypto.a`. In order to make sure that all versions of this library are found
+by the linker - one per version of the crate - we rename them just as we rename
+symbols. For crate version x.y.z, we rename `libcrypto.a` to
+`libcrypto_x_y_z.a`, and instruct the linker to look for the `crypto_x_y_z`
+library.
+
+### Testing
+
+In order to test that symbol prefixing is working properly, use the
+`test_symbol_conflicts.sh` script in this directory.
\ No newline at end of file
diff --git a/boringssl/bindgen.h b/boringssl/bindgen.h
new file mode 100644
index 0000000..8297e68
--- /dev/null
+++ b/boringssl/bindgen.h
@@ -0,0 +1,17 @@
+// Copyright 2018 Google LLC
+//
+// Use of this source code is governed by an MIT-style
+// license that can be found in the LICENSE file or at
+// https://opensource.org/licenses/MIT.
+
+#include <openssl/bytestring.h>
+#include <openssl/curve25519.h>
+#include <openssl/ec.h>
+#include <openssl/ec_key.h>
+#include <openssl/ecdsa.h>
+#include <openssl/err.h>
+#include <openssl/evp.h>
+#include <openssl/hmac.h>
+#include <openssl/mem.h>
+#include <openssl/rand.h>
+#include <openssl/sha.h>
diff --git a/boringssl/bindgen.sh b/boringssl/bindgen.sh
new file mode 100755
index 0000000..c7ef530
--- /dev/null
+++ b/boringssl/bindgen.sh
@@ -0,0 +1,145 @@
+#!/bin/bash
+
+# Copyright 2018 Google LLC
+#
+# Use of this source code is governed by an MIT-style
+# license that can be found in the LICENSE file or at
+# https://opensource.org/licenses/MIT.
+
+set -e
+
+# cd to the directory this script lives in
+readonly SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
+cd "$SCRIPT_DIR"
+
+if [ $# -ne 3 ]; then
+ echo "Usage: $0 <major> <minor> <patch>" >&2
+ exit 1
+fi
+
+MAJOR="$1"
+MINOR="$2"
+PATCH="$3"
+
+# TODO(joshlf):
+# - Use the --use-core flag once std isn't required (see
+# https://github.com/rust-lang-nursery/rust-bindgen/issues/1015)
+
+# Only include the symbols we want. It's important that we take the minimum
+# dependency on BoringSSL so that we provide the minimum burden for them. The
+# more symbols we depend on, the more likely it is that a change that they want
+# to make will affect us, which they will care about, making them either expend
+# effort in a graceful transition or decide to abandon the change. Thus, instead
+# of whitelisting broad classes of symbols, we explicitly whitelist the exact
+# list of symbols that mundane depends on.
+WHITELIST="(CBB|\
+CBB_cleanup|\
+CBB_data|\
+CBB_init|\
+CBB_len|\
+CBS|\
+CBS_init|\
+CBS_len|\
+CRYPTO_memcmp|\
+ECDSA_sign|\
+ECDSA_size|\
+ECDSA_verify|\
+EC_GROUP|\
+EC_GROUP_get_curve_name|\
+EC_GROUP_new_by_curve_name|\
+EC_KEY|\
+EC_KEY_free|\
+EC_KEY_generate_key|\
+EC_KEY_get0_group|\
+EC_KEY_marshal_private_key|\
+EC_KEY_new|\
+EC_KEY_parse_private_key|\
+EC_KEY_set_group|\
+EC_KEY_up_ref|\
+EC_curve_nid2nist|\
+ED25519_PRIVATE_KEY_LEN|\
+ED25519_PUBLIC_KEY_LEN|\
+ED25519_SIGNATURE_LEN|\
+ED25519_keypair|\
+ED25519_keypair_from_seed|\
+ED25519_sign|\
+ED25519_verify|\
+ERR_print_errors_cb|\
+EVP_MD|\
+EVP_PBE_scrypt|\
+EVP_PKEY|\
+EVP_PKEY_assign_EC_KEY|\
+EVP_PKEY_free|\
+EVP_PKEY_get1_EC_KEY|\
+EVP_PKEY_new|\
+EVP_PKEY_up_ref|\
+EVP_marshal_public_key|\
+EVP_parse_public_key|\
+EVP_sha1|\
+EVP_sha256|\
+EVP_sha384|\
+EVP_sha512|\
+HMAC_CTX|\
+HMAC_CTX_cleanup|\
+HMAC_CTX_init|\
+HMAC_Final|\
+HMAC_Init_ex|\
+HMAC_Update|\
+HMAC_size|\
+NID_X9_62_prime256v1|\
+NID_secp384r1|\
+NID_secp521r1|\
+RAND_bytes|\
+PKCS5_PBKDF2_HMAC|\
+SHA_CTX|\
+SHA_DIGEST_LENGTH|\
+SHA1_Final|\
+SHA1_Init|\
+SHA1_Update|\
+SHA256_CTX|\
+SHA256_DIGEST_LENGTH|\
+SHA256_Final|\
+SHA256_Init|\
+SHA256_Update|\
+SHA512_CTX|\
+SHA384_DIGEST_LENGTH|\
+SHA384_Final|\
+SHA384_Init|\
+SHA384_Update|\
+SHA512_CTX|\
+SHA512_DIGEST_LENGTH|\
+SHA512_Final|\
+SHA512_Init|\
+SHA512_Update)"
+
+# NOTE(joshlf): Currently, we don't pass --target since none of the symbols
+# we're linking against are architecture-specific (TODO: are any of them
+# word-size-specific?). If this ever becomes a problem, then the thing to do is
+# probably to generate different files for different platforms
+# (boringssl_x86_64.rs, boringssl_arm64.rs, etc) and conditionally compile them
+# depending on target.
+bindgen bindgen.h --whitelist-function "$WHITELIST" --whitelist-type "$WHITELIST" \
+ --whitelist-var "$WHITELIST" -o boringssl.rs -- -I ./boringssl/include
+
+TMP="$(mktemp)"
+
+# Prepend copyright comment, #[allow] for various warnings we don't care about,
+# and a line telling Rust to link against libcrypto.
+cat >> "$TMP" <<'EOF'
+// Copyright 2018 Google LLC
+//
+// Use of this source code is governed by an MIT-style
+// license that can be found in the LICENSE file or at
+// https://opensource.org/licenses/MIT.
+
+#![allow(non_camel_case_types)]
+#![allow(non_snake_case)]
+#![allow(non_upper_case_globals)]
+
+#[link(name = "crypto_${MAJOR}_${MINOR}_${PATCH}")] extern {}
+
+EOF
+cat boringssl.rs >> "$TMP"
+
+mv "$TMP" boringssl.rs
+rustfmt boringssl.rs
diff --git a/boringssl/boringssl b/boringssl/boringssl
new file mode 160000
index 0000000..892a31b
--- /dev/null
+++ b/boringssl/boringssl
@@ -0,0 +1 @@
+Subproject commit 892a31b5fb6f621903681f4f597156e3db3526fe
diff --git a/boringssl/boringssl.rs b/boringssl/boringssl.rs
new file mode 100644
index 0000000..714ef5f
--- /dev/null
+++ b/boringssl/boringssl.rs
@@ -0,0 +1,1219 @@
+// Copyright 2018 Google LLC
+//
+// Use of this source code is governed by an MIT-style
+// license that can be found in the LICENSE file or at
+// https://opensource.org/licenses/MIT.
+
+// Some symbols are only used with certain features enabled, so we need to
+// suppress the unused warning when those features aren't enabled.
+#![allow(unused)]
+// Only necessary for test_symbol_conflict.sh, which exposes these symbols
+// through mundane's public interface.
+#![allow(missing_docs)]
+#![allow(non_camel_case_types)]
+#![allow(non_snake_case)]
+#![allow(non_upper_case_globals)]
+
+#[link(name = "crypto_0_2_0")]
+extern "C" {}
+
+/* automatically generated by rust-bindgen */
+
+pub const ED25519_PRIVATE_KEY_LEN: u32 = 64;
+pub const ED25519_PUBLIC_KEY_LEN: u32 = 32;
+pub const ED25519_SIGNATURE_LEN: u32 = 64;
+pub const NID_X9_62_prime256v1: u32 = 415;
+pub const NID_secp384r1: u32 = 715;
+pub const NID_secp521r1: u32 = 716;
+pub const SHA_DIGEST_LENGTH: u32 = 20;
+pub const SHA256_DIGEST_LENGTH: u32 = 32;
+pub const SHA384_DIGEST_LENGTH: u32 = 48;
+pub const SHA512_DIGEST_LENGTH: u32 = 64;
+pub type CBB = cbb_st;
+pub type CBS = cbs_st;
+#[repr(C)]
+#[derive(Debug, Copy, Clone)]
+pub struct dh_st {
+ _unused: [u8; 0],
+}
+pub type DH = dh_st;
+#[repr(C)]
+#[derive(Debug, Copy, Clone)]
+pub struct dsa_st {
+ _unused: [u8; 0],
+}
+pub type DSA = dsa_st;
+#[repr(C)]
+#[derive(Debug, Copy, Clone)]
+pub struct ec_group_st {
+ _unused: [u8; 0],
+}
+pub type EC_GROUP = ec_group_st;
+#[repr(C)]
+#[derive(Debug, Copy, Clone)]
+pub struct ec_key_st {
+ _unused: [u8; 0],
+}
+pub type EC_KEY = ec_key_st;
+#[repr(C)]
+#[derive(Debug, Copy, Clone)]
+pub struct engine_st {
+ _unused: [u8; 0],
+}
+pub type ENGINE = engine_st;
+pub type EVP_MD_CTX = env_md_ctx_st;
+#[repr(C)]
+#[derive(Debug, Copy, Clone)]
+pub struct env_md_st {
+ _unused: [u8; 0],
+}
+pub type EVP_MD = env_md_st;
+#[repr(C)]
+#[derive(Debug, Copy, Clone)]
+pub struct evp_pkey_asn1_method_st {
+ _unused: [u8; 0],
+}
+pub type EVP_PKEY_ASN1_METHOD = evp_pkey_asn1_method_st;
+#[repr(C)]
+#[derive(Debug, Copy, Clone)]
+pub struct evp_pkey_ctx_st {
+ _unused: [u8; 0],
+}
+pub type EVP_PKEY_CTX = evp_pkey_ctx_st;
+pub type EVP_PKEY = evp_pkey_st;
+pub type HMAC_CTX = hmac_ctx_st;
+#[repr(C)]
+#[derive(Debug, Copy, Clone)]
+pub struct rsa_st {
+ _unused: [u8; 0],
+}
+pub type RSA = rsa_st;
+pub type SHA256_CTX = sha256_state_st;
+pub type SHA512_CTX = sha512_state_st;
+pub type SHA_CTX = sha_state_st;
+#[repr(C)]
+#[derive(Debug, Copy, Clone)]
+pub struct cbs_st {
+ pub data: *const u8,
+ pub len: usize,
+}
+#[test]
+fn bindgen_test_layout_cbs_st() {
+ assert_eq!(
+ ::std::mem::size_of::<cbs_st>(),
+ 16usize,
+ concat!("Size of: ", stringify!(cbs_st))
+ );
+ assert_eq!(
+ ::std::mem::align_of::<cbs_st>(),
+ 8usize,
+ concat!("Alignment of ", stringify!(cbs_st))
+ );
+ assert_eq!(
+ unsafe { &(*(::std::ptr::null::<cbs_st>())).data as *const _ as usize },
+ 0usize,
+ concat!(
+ "Offset of field: ",
+ stringify!(cbs_st),
+ "::",
+ stringify!(data)
+ )
+ );
+ assert_eq!(
+ unsafe { &(*(::std::ptr::null::<cbs_st>())).len as *const _ as usize },
+ 8usize,
+ concat!(
+ "Offset of field: ",
+ stringify!(cbs_st),
+ "::",
+ stringify!(len)
+ )
+ );
+}
+extern "C" {
+ #[link_name = "__RUST_MUNDANE_0_2_0_CBS_init"]
+ pub fn CBS_init(cbs: *mut CBS, data: *const u8, len: usize);
+}
+extern "C" {
+ #[link_name = "__RUST_MUNDANE_0_2_0_CBS_len"]
+ pub fn CBS_len(cbs: *const CBS) -> usize;
+}
+#[repr(C)]
+#[derive(Debug, Copy, Clone)]
+pub struct cbb_buffer_st {
+ pub buf: *mut u8,
+ pub len: usize,
+ pub cap: usize,
+ pub can_resize: ::std::os::raw::c_char,
+ pub error: ::std::os::raw::c_char,
+}
+#[test]
+fn bindgen_test_layout_cbb_buffer_st() {
+ assert_eq!(
+ ::std::mem::size_of::<cbb_buffer_st>(),
+ 32usize,
+ concat!("Size of: ", stringify!(cbb_buffer_st))
+ );
+ assert_eq!(
+ ::std::mem::align_of::<cbb_buffer_st>(),
+ 8usize,
+ concat!("Alignment of ", stringify!(cbb_buffer_st))
+ );
+ assert_eq!(
+ unsafe { &(*(::std::ptr::null::<cbb_buffer_st>())).buf as *const _ as usize },
+ 0usize,
+ concat!(
+ "Offset of field: ",
+ stringify!(cbb_buffer_st),
+ "::",
+ stringify!(buf)
+ )
+ );
+ assert_eq!(
+ unsafe { &(*(::std::ptr::null::<cbb_buffer_st>())).len as *const _ as usize },
+ 8usize,
+ concat!(
+ "Offset of field: ",
+ stringify!(cbb_buffer_st),
+ "::",
+ stringify!(len)
+ )
+ );
+ assert_eq!(
+ unsafe { &(*(::std::ptr::null::<cbb_buffer_st>())).cap as *const _ as usize },
+ 16usize,
+ concat!(
+ "Offset of field: ",
+ stringify!(cbb_buffer_st),
+ "::",
+ stringify!(cap)
+ )
+ );
+ assert_eq!(
+ unsafe { &(*(::std::ptr::null::<cbb_buffer_st>())).can_resize as *const _ as usize },
+ 24usize,
+ concat!(
+ "Offset of field: ",
+ stringify!(cbb_buffer_st),
+ "::",
+ stringify!(can_resize)
+ )
+ );
+ assert_eq!(
+ unsafe { &(*(::std::ptr::null::<cbb_buffer_st>())).error as *const _ as usize },
+ 25usize,
+ concat!(
+ "Offset of field: ",
+ stringify!(cbb_buffer_st),
+ "::",
+ stringify!(error)
+ )
+ );
+}
+#[repr(C)]
+#[derive(Debug, Copy, Clone)]
+pub struct cbb_st {
+ pub base: *mut cbb_buffer_st,
+ pub child: *mut CBB,
+ pub offset: usize,
+ pub pending_len_len: u8,
+ pub pending_is_asn1: ::std::os::raw::c_char,
+ pub is_top_level: ::std::os::raw::c_char,
+}
+#[test]
+fn bindgen_test_layout_cbb_st() {
+ assert_eq!(
+ ::std::mem::size_of::<cbb_st>(),
+ 32usize,
+ concat!("Size of: ", stringify!(cbb_st))
+ );
+ assert_eq!(
+ ::std::mem::align_of::<cbb_st>(),
+ 8usize,
+ concat!("Alignment of ", stringify!(cbb_st))
+ );
+ assert_eq!(
+ unsafe { &(*(::std::ptr::null::<cbb_st>())).base as *const _ as usize },
+ 0usize,
+ concat!(
+ "Offset of field: ",
+ stringify!(cbb_st),
+ "::",
+ stringify!(base)
+ )
+ );
+ assert_eq!(
+ unsafe { &(*(::std::ptr::null::<cbb_st>())).child as *const _ as usize },
+ 8usize,
+ concat!(
+ "Offset of field: ",
+ stringify!(cbb_st),
+ "::",
+ stringify!(child)
+ )
+ );
+ assert_eq!(
+ unsafe { &(*(::std::ptr::null::<cbb_st>())).offset as *const _ as usize },
+ 16usize,
+ concat!(
+ "Offset of field: ",
+ stringify!(cbb_st),
+ "::",
+ stringify!(offset)
+ )
+ );
+ assert_eq!(
+ unsafe { &(*(::std::ptr::null::<cbb_st>())).pending_len_len as *const _ as usize },
+ 24usize,
+ concat!(
+ "Offset of field: ",
+ stringify!(cbb_st),
+ "::",
+ stringify!(pending_len_len)
+ )
+ );
+ assert_eq!(
+ unsafe { &(*(::std::ptr::null::<cbb_st>())).pending_is_asn1 as *const _ as usize },
+ 25usize,
+ concat!(
+ "Offset of field: ",
+ stringify!(cbb_st),
+ "::",
+ stringify!(pending_is_asn1)
+ )
+ );
+ assert_eq!(
+ unsafe { &(*(::std::ptr::null::<cbb_st>())).is_top_level as *const _ as usize },
+ 26usize,
+ concat!(
+ "Offset of field: ",
+ stringify!(cbb_st),
+ "::",
+ stringify!(is_top_level)
+ )
+ );
+}
+extern "C" {
+ #[link_name = "__RUST_MUNDANE_0_2_0_CBB_init"]
+ pub fn CBB_init(cbb: *mut CBB, initial_capacity: usize) -> ::std::os::raw::c_int;
+}
+extern "C" {
+ #[link_name = "__RUST_MUNDANE_0_2_0_CBB_cleanup"]
+ pub fn CBB_cleanup(cbb: *mut CBB);
+}
+extern "C" {
+ #[link_name = "__RUST_MUNDANE_0_2_0_CBB_data"]
+ pub fn CBB_data(cbb: *const CBB) -> *const u8;
+}
+extern "C" {
+ #[link_name = "__RUST_MUNDANE_0_2_0_CBB_len"]
+ pub fn CBB_len(cbb: *const CBB) -> usize;
+}
+extern "C" {
+ #[link_name = "__RUST_MUNDANE_0_2_0_ED25519_keypair"]
+ pub fn ED25519_keypair(out_public_key: *mut u8, out_private_key: *mut u8);
+}
+extern "C" {
+ #[link_name = "__RUST_MUNDANE_0_2_0_ED25519_sign"]
+ pub fn ED25519_sign(
+ out_sig: *mut u8, message: *const u8, message_len: usize, private_key: *const u8,
+ ) -> ::std::os::raw::c_int;
+}
+extern "C" {
+ #[link_name = "__RUST_MUNDANE_0_2_0_ED25519_verify"]
+ pub fn ED25519_verify(
+ message: *const u8, message_len: usize, signature: *const u8, public_key: *const u8,
+ ) -> ::std::os::raw::c_int;
+}
+extern "C" {
+ #[link_name = "__RUST_MUNDANE_0_2_0_ED25519_keypair_from_seed"]
+ pub fn ED25519_keypair_from_seed(
+ out_public_key: *mut u8, out_private_key: *mut u8, seed: *const u8,
+ );
+}
+extern "C" {
+ #[link_name = "__RUST_MUNDANE_0_2_0_EC_GROUP_new_by_curve_name"]
+ pub fn EC_GROUP_new_by_curve_name(nid: ::std::os::raw::c_int) -> *mut EC_GROUP;
+}
+extern "C" {
+ #[link_name = "__RUST_MUNDANE_0_2_0_EC_GROUP_get_curve_name"]
+ pub fn EC_GROUP_get_curve_name(group: *const EC_GROUP) -> ::std::os::raw::c_int;
+}
+extern "C" {
+ #[link_name = "__RUST_MUNDANE_0_2_0_EC_curve_nid2nist"]
+ pub fn EC_curve_nid2nist(nid: ::std::os::raw::c_int) -> *const ::std::os::raw::c_char;
+}
+extern "C" {
+ #[link_name = "__RUST_MUNDANE_0_2_0_EC_KEY_new"]
+ pub fn EC_KEY_new() -> *mut EC_KEY;
+}
+extern "C" {
+ #[link_name = "__RUST_MUNDANE_0_2_0_EC_KEY_free"]
+ pub fn EC_KEY_free(key: *mut EC_KEY);
+}
+extern "C" {
+ #[link_name = "__RUST_MUNDANE_0_2_0_EC_KEY_up_ref"]
+ pub fn EC_KEY_up_ref(key: *mut EC_KEY) -> ::std::os::raw::c_int;
+}
+extern "C" {
+ #[link_name = "__RUST_MUNDANE_0_2_0_EC_KEY_get0_group"]
+ pub fn EC_KEY_get0_group(key: *const EC_KEY) -> *const EC_GROUP;
+}
+extern "C" {
+ #[link_name = "__RUST_MUNDANE_0_2_0_EC_KEY_set_group"]
+ pub fn EC_KEY_set_group(key: *mut EC_KEY, group: *const EC_GROUP) -> ::std::os::raw::c_int;
+}
+extern "C" {
+ #[link_name = "__RUST_MUNDANE_0_2_0_EC_KEY_generate_key"]
+ pub fn EC_KEY_generate_key(key: *mut EC_KEY) -> ::std::os::raw::c_int;
+}
+extern "C" {
+ #[link_name = "__RUST_MUNDANE_0_2_0_EC_KEY_parse_private_key"]
+ pub fn EC_KEY_parse_private_key(cbs: *mut CBS, group: *const EC_GROUP) -> *mut EC_KEY;
+}
+extern "C" {
+ #[link_name = "__RUST_MUNDANE_0_2_0_EC_KEY_marshal_private_key"]
+ pub fn EC_KEY_marshal_private_key(
+ cbb: *mut CBB, key: *const EC_KEY, enc_flags: ::std::os::raw::c_uint,
+ ) -> ::std::os::raw::c_int;
+}
+extern "C" {
+ #[link_name = "__RUST_MUNDANE_0_2_0_ECDSA_sign"]
+ pub fn ECDSA_sign(
+ type_: ::std::os::raw::c_int, digest: *const u8, digest_len: usize, sig: *mut u8,
+ sig_len: *mut ::std::os::raw::c_uint, key: *const EC_KEY,
+ ) -> ::std::os::raw::c_int;
+}
+extern "C" {
+ #[link_name = "__RUST_MUNDANE_0_2_0_ECDSA_verify"]
+ pub fn ECDSA_verify(
+ type_: ::std::os::raw::c_int, digest: *const u8, digest_len: usize, sig: *const u8,
+ sig_len: usize, key: *const EC_KEY,
+ ) -> ::std::os::raw::c_int;
+}
+extern "C" {
+ #[link_name = "__RUST_MUNDANE_0_2_0_ECDSA_size"]
+ pub fn ECDSA_size(key: *const EC_KEY) -> usize;
+}
+pub type ERR_print_errors_callback_t = ::std::option::Option<
+ unsafe extern "C" fn(
+ str: *const ::std::os::raw::c_char,
+ len: usize,
+ ctx: *mut ::std::os::raw::c_void,
+ ) -> ::std::os::raw::c_int,
+>;
+extern "C" {
+ #[link_name = "__RUST_MUNDANE_0_2_0_ERR_print_errors_cb"]
+ pub fn ERR_print_errors_cb(
+ callback: ERR_print_errors_callback_t, ctx: *mut ::std::os::raw::c_void,
+ );
+}
+pub type CRYPTO_refcount_t = u32;
+extern "C" {
+ #[link_name = "__RUST_MUNDANE_0_2_0_EVP_sha1"]
+ pub fn EVP_sha1() -> *const EVP_MD;
+}
+extern "C" {
+ #[link_name = "__RUST_MUNDANE_0_2_0_EVP_sha256"]
+ pub fn EVP_sha256() -> *const EVP_MD;
+}
+extern "C" {
+ #[link_name = "__RUST_MUNDANE_0_2_0_EVP_sha384"]
+ pub fn EVP_sha384() -> *const EVP_MD;
+}
+extern "C" {
+ #[link_name = "__RUST_MUNDANE_0_2_0_EVP_sha512"]
+ pub fn EVP_sha512() -> *const EVP_MD;
+}
+#[repr(C)]
+#[derive(Debug, Copy, Clone)]
+pub struct evp_md_pctx_ops {
+ _unused: [u8; 0],
+}
+#[repr(C)]
+#[derive(Debug, Copy, Clone)]
+pub struct env_md_ctx_st {
+ pub digest: *const EVP_MD,
+ pub md_data: *mut ::std::os::raw::c_void,
+ pub pctx: *mut EVP_PKEY_CTX,
+ pub pctx_ops: *const evp_md_pctx_ops,
+}
+#[test]
+fn bindgen_test_layout_env_md_ctx_st() {
+ assert_eq!(
+ ::std::mem::size_of::<env_md_ctx_st>(),
+ 32usize,
+ concat!("Size of: ", stringify!(env_md_ctx_st))
+ );
+ assert_eq!(
+ ::std::mem::align_of::<env_md_ctx_st>(),
+ 8usize,
+ concat!("Alignment of ", stringify!(env_md_ctx_st))
+ );
+ assert_eq!(
+ unsafe { &(*(::std::ptr::null::<env_md_ctx_st>())).digest as *const _ as usize },
+ 0usize,
+ concat!(
+ "Offset of field: ",
+ stringify!(env_md_ctx_st),
+ "::",
+ stringify!(digest)
+ )
+ );
+ assert_eq!(
+ unsafe { &(*(::std::ptr::null::<env_md_ctx_st>())).md_data as *const _ as usize },
+ 8usize,
+ concat!(
+ "Offset of field: ",
+ stringify!(env_md_ctx_st),
+ "::",
+ stringify!(md_data)
+ )
+ );
+ assert_eq!(
+ unsafe { &(*(::std::ptr::null::<env_md_ctx_st>())).pctx as *const _ as usize },
+ 16usize,
+ concat!(
+ "Offset of field: ",
+ stringify!(env_md_ctx_st),
+ "::",
+ stringify!(pctx)
+ )
+ );
+ assert_eq!(
+ unsafe { &(*(::std::ptr::null::<env_md_ctx_st>())).pctx_ops as *const _ as usize },
+ 24usize,
+ concat!(
+ "Offset of field: ",
+ stringify!(env_md_ctx_st),
+ "::",
+ stringify!(pctx_ops)
+ )
+ );
+}
+extern "C" {
+ #[link_name = "__RUST_MUNDANE_0_2_0_EVP_PKEY_new"]
+ pub fn EVP_PKEY_new() -> *mut EVP_PKEY;
+}
+extern "C" {
+ #[link_name = "__RUST_MUNDANE_0_2_0_EVP_PKEY_free"]
+ pub fn EVP_PKEY_free(pkey: *mut EVP_PKEY);
+}
+extern "C" {
+ #[link_name = "__RUST_MUNDANE_0_2_0_EVP_PKEY_up_ref"]
+ pub fn EVP_PKEY_up_ref(pkey: *mut EVP_PKEY) -> ::std::os::raw::c_int;
+}
+extern "C" {
+ #[link_name = "__RUST_MUNDANE_0_2_0_EVP_PKEY_assign_EC_KEY"]
+ pub fn EVP_PKEY_assign_EC_KEY(pkey: *mut EVP_PKEY, key: *mut EC_KEY) -> ::std::os::raw::c_int;
+}
+extern "C" {
+ #[link_name = "__RUST_MUNDANE_0_2_0_EVP_PKEY_get1_EC_KEY"]
+ pub fn EVP_PKEY_get1_EC_KEY(pkey: *const EVP_PKEY) -> *mut EC_KEY;
+}
+extern "C" {
+ #[link_name = "__RUST_MUNDANE_0_2_0_EVP_parse_public_key"]
+ pub fn EVP_parse_public_key(cbs: *mut CBS) -> *mut EVP_PKEY;
+}
+extern "C" {
+ #[link_name = "__RUST_MUNDANE_0_2_0_EVP_marshal_public_key"]
+ pub fn EVP_marshal_public_key(cbb: *mut CBB, key: *const EVP_PKEY) -> ::std::os::raw::c_int;
+}
+extern "C" {
+ #[link_name = "__RUST_MUNDANE_0_2_0_PKCS5_PBKDF2_HMAC"]
+ pub fn PKCS5_PBKDF2_HMAC(
+ password: *const ::std::os::raw::c_char, password_len: usize, salt: *const u8,
+ salt_len: usize, iterations: ::std::os::raw::c_uint, digest: *const EVP_MD, key_len: usize,
+ out_key: *mut u8,
+ ) -> ::std::os::raw::c_int;
+}
+extern "C" {
+ #[link_name = "__RUST_MUNDANE_0_2_0_EVP_PBE_scrypt"]
+ pub fn EVP_PBE_scrypt(
+ password: *const ::std::os::raw::c_char, password_len: usize, salt: *const u8,
+ salt_len: usize, N: u64, r: u64, p: u64, max_mem: usize, out_key: *mut u8, key_len: usize,
+ ) -> ::std::os::raw::c_int;
+}
+#[repr(C)]
+#[derive(Copy, Clone)]
+pub struct evp_pkey_st {
+ pub references: CRYPTO_refcount_t,
+ pub type_: ::std::os::raw::c_int,
+ pub pkey: evp_pkey_st__bindgen_ty_1,
+ pub ameth: *const EVP_PKEY_ASN1_METHOD,
+}
+#[repr(C)]
+#[derive(Copy, Clone)]
+pub union evp_pkey_st__bindgen_ty_1 {
+ pub ptr: *mut ::std::os::raw::c_void,
+ pub rsa: *mut RSA,
+ pub dsa: *mut DSA,
+ pub dh: *mut DH,
+ pub ec: *mut EC_KEY,
+ _bindgen_union_align: u64,
+}
+#[test]
+fn bindgen_test_layout_evp_pkey_st__bindgen_ty_1() {
+ assert_eq!(
+ ::std::mem::size_of::<evp_pkey_st__bindgen_ty_1>(),
+ 8usize,
+ concat!("Size of: ", stringify!(evp_pkey_st__bindgen_ty_1))
+ );
+ assert_eq!(
+ ::std::mem::align_of::<evp_pkey_st__bindgen_ty_1>(),
+ 8usize,
+ concat!("Alignment of ", stringify!(evp_pkey_st__bindgen_ty_1))
+ );
+ assert_eq!(
+ unsafe { &(*(::std::ptr::null::<evp_pkey_st__bindgen_ty_1>())).ptr as *const _ as usize },
+ 0usize,
+ concat!(
+ "Offset of field: ",
+ stringify!(evp_pkey_st__bindgen_ty_1),
+ "::",
+ stringify!(ptr)
+ )
+ );
+ assert_eq!(
+ unsafe { &(*(::std::ptr::null::<evp_pkey_st__bindgen_ty_1>())).rsa as *const _ as usize },
+ 0usize,
+ concat!(
+ "Offset of field: ",
+ stringify!(evp_pkey_st__bindgen_ty_1),
+ "::",
+ stringify!(rsa)
+ )
+ );
+ assert_eq!(
+ unsafe { &(*(::std::ptr::null::<evp_pkey_st__bindgen_ty_1>())).dsa as *const _ as usize },
+ 0usize,
+ concat!(
+ "Offset of field: ",
+ stringify!(evp_pkey_st__bindgen_ty_1),
+ "::",
+ stringify!(dsa)
+ )
+ );
+ assert_eq!(
+ unsafe { &(*(::std::ptr::null::<evp_pkey_st__bindgen_ty_1>())).dh as *const _ as usize },
+ 0usize,
+ concat!(
+ "Offset of field: ",
+ stringify!(evp_pkey_st__bindgen_ty_1),
+ "::",
+ stringify!(dh)
+ )
+ );
+ assert_eq!(
+ unsafe { &(*(::std::ptr::null::<evp_pkey_st__bindgen_ty_1>())).ec as *const _ as usize },
+ 0usize,
+ concat!(
+ "Offset of field: ",
+ stringify!(evp_pkey_st__bindgen_ty_1),
+ "::",
+ stringify!(ec)
+ )
+ );
+}
+#[test]
+fn bindgen_test_layout_evp_pkey_st() {
+ assert_eq!(
+ ::std::mem::size_of::<evp_pkey_st>(),
+ 24usize,
+ concat!("Size of: ", stringify!(evp_pkey_st))
+ );
+ assert_eq!(
+ ::std::mem::align_of::<evp_pkey_st>(),
+ 8usize,
+ concat!("Alignment of ", stringify!(evp_pkey_st))
+ );
+ assert_eq!(
+ unsafe { &(*(::std::ptr::null::<evp_pkey_st>())).references as *const _ as usize },
+ 0usize,
+ concat!(
+ "Offset of field: ",
+ stringify!(evp_pkey_st),
+ "::",
+ stringify!(references)
+ )
+ );
+ assert_eq!(
+ unsafe { &(*(::std::ptr::null::<evp_pkey_st>())).type_ as *const _ as usize },
+ 4usize,
+ concat!(
+ "Offset of field: ",
+ stringify!(evp_pkey_st),
+ "::",
+ stringify!(type_)
+ )
+ );
+ assert_eq!(
+ unsafe { &(*(::std::ptr::null::<evp_pkey_st>())).pkey as *const _ as usize },
+ 8usize,
+ concat!(
+ "Offset of field: ",
+ stringify!(evp_pkey_st),
+ "::",
+ stringify!(pkey)
+ )
+ );
+ assert_eq!(
+ unsafe { &(*(::std::ptr::null::<evp_pkey_st>())).ameth as *const _ as usize },
+ 16usize,
+ concat!(
+ "Offset of field: ",
+ stringify!(evp_pkey_st),
+ "::",
+ stringify!(ameth)
+ )
+ );
+}
+extern "C" {
+ #[link_name = "__RUST_MUNDANE_0_2_0_HMAC_CTX_init"]
+ pub fn HMAC_CTX_init(ctx: *mut HMAC_CTX);
+}
+extern "C" {
+ #[link_name = "__RUST_MUNDANE_0_2_0_HMAC_CTX_cleanup"]
+ pub fn HMAC_CTX_cleanup(ctx: *mut HMAC_CTX);
+}
+extern "C" {
+ #[link_name = "__RUST_MUNDANE_0_2_0_HMAC_Init_ex"]
+ pub fn HMAC_Init_ex(
+ ctx: *mut HMAC_CTX, key: *const ::std::os::raw::c_void, key_len: usize, md: *const EVP_MD,
+ impl_: *mut ENGINE,
+ ) -> ::std::os::raw::c_int;
+}
+extern "C" {
+ #[link_name = "__RUST_MUNDANE_0_2_0_HMAC_Update"]
+ pub fn HMAC_Update(
+ ctx: *mut HMAC_CTX, data: *const u8, data_len: usize,
+ ) -> ::std::os::raw::c_int;
+}
+extern "C" {
+ #[link_name = "__RUST_MUNDANE_0_2_0_HMAC_Final"]
+ pub fn HMAC_Final(
+ ctx: *mut HMAC_CTX, out: *mut u8, out_len: *mut ::std::os::raw::c_uint,
+ ) -> ::std::os::raw::c_int;
+}
+extern "C" {
+ #[link_name = "__RUST_MUNDANE_0_2_0_HMAC_size"]
+ pub fn HMAC_size(ctx: *const HMAC_CTX) -> usize;
+}
+#[repr(C)]
+#[derive(Debug, Copy, Clone)]
+pub struct hmac_ctx_st {
+ pub md: *const EVP_MD,
+ pub md_ctx: EVP_MD_CTX,
+ pub i_ctx: EVP_MD_CTX,
+ pub o_ctx: EVP_MD_CTX,
+}
+#[test]
+fn bindgen_test_layout_hmac_ctx_st() {
+ assert_eq!(
+ ::std::mem::size_of::<hmac_ctx_st>(),
+ 104usize,
+ concat!("Size of: ", stringify!(hmac_ctx_st))
+ );
+ assert_eq!(
+ ::std::mem::align_of::<hmac_ctx_st>(),
+ 8usize,
+ concat!("Alignment of ", stringify!(hmac_ctx_st))
+ );
+ assert_eq!(
+ unsafe { &(*(::std::ptr::null::<hmac_ctx_st>())).md as *const _ as usize },
+ 0usize,
+ concat!(
+ "Offset of field: ",
+ stringify!(hmac_ctx_st),
+ "::",
+ stringify!(md)
+ )
+ );
+ assert_eq!(
+ unsafe { &(*(::std::ptr::null::<hmac_ctx_st>())).md_ctx as *const _ as usize },
+ 8usize,
+ concat!(
+ "Offset of field: ",
+ stringify!(hmac_ctx_st),
+ "::",
+ stringify!(md_ctx)
+ )
+ );
+ assert_eq!(
+ unsafe { &(*(::std::ptr::null::<hmac_ctx_st>())).i_ctx as *const _ as usize },
+ 40usize,
+ concat!(
+ "Offset of field: ",
+ stringify!(hmac_ctx_st),
+ "::",
+ stringify!(i_ctx)
+ )
+ );
+ assert_eq!(
+ unsafe { &(*(::std::ptr::null::<hmac_ctx_st>())).o_ctx as *const _ as usize },
+ 72usize,
+ concat!(
+ "Offset of field: ",
+ stringify!(hmac_ctx_st),
+ "::",
+ stringify!(o_ctx)
+ )
+ );
+}
+extern "C" {
+ #[link_name = "__RUST_MUNDANE_0_2_0_CRYPTO_memcmp"]
+ pub fn CRYPTO_memcmp(
+ a: *const ::std::os::raw::c_void, b: *const ::std::os::raw::c_void, len: usize,
+ ) -> ::std::os::raw::c_int;
+}
+extern "C" {
+ #[link_name = "__RUST_MUNDANE_0_2_0_RAND_bytes"]
+ pub fn RAND_bytes(buf: *mut u8, len: usize) -> ::std::os::raw::c_int;
+}
+extern "C" {
+ #[link_name = "__RUST_MUNDANE_0_2_0_SHA1_Init"]
+ pub fn SHA1_Init(sha: *mut SHA_CTX) -> ::std::os::raw::c_int;
+}
+extern "C" {
+ #[link_name = "__RUST_MUNDANE_0_2_0_SHA1_Update"]
+ pub fn SHA1_Update(
+ sha: *mut SHA_CTX, data: *const ::std::os::raw::c_void, len: usize,
+ ) -> ::std::os::raw::c_int;
+}
+extern "C" {
+ #[link_name = "__RUST_MUNDANE_0_2_0_SHA1_Final"]
+ pub fn SHA1_Final(md: *mut u8, sha: *mut SHA_CTX) -> ::std::os::raw::c_int;
+}
+#[repr(C)]
+#[derive(Copy, Clone)]
+pub struct sha_state_st {
+ pub __bindgen_anon_1: sha_state_st__bindgen_ty_1,
+ pub Nl: u32,
+ pub Nh: u32,
+ pub data: [u8; 64usize],
+ pub num: ::std::os::raw::c_uint,
+}
+#[repr(C)]
+#[derive(Copy, Clone)]
+pub union sha_state_st__bindgen_ty_1 {
+ pub h: [u32; 5usize],
+ pub __bindgen_anon_1: sha_state_st__bindgen_ty_1__bindgen_ty_1,
+ _bindgen_union_align: [u32; 5usize],
+}
+#[repr(C)]
+#[derive(Debug, Copy, Clone)]
+pub struct sha_state_st__bindgen_ty_1__bindgen_ty_1 {
+ pub h0: u32,
+ pub h1: u32,
+ pub h2: u32,
+ pub h3: u32,
+ pub h4: u32,
+}
+#[test]
+fn bindgen_test_layout_sha_state_st__bindgen_ty_1__bindgen_ty_1() {
+ assert_eq!(
+ ::std::mem::size_of::<sha_state_st__bindgen_ty_1__bindgen_ty_1>(),
+ 20usize,
+ concat!(
+ "Size of: ",
+ stringify!(sha_state_st__bindgen_ty_1__bindgen_ty_1)
+ )
+ );
+ assert_eq!(
+ ::std::mem::align_of::<sha_state_st__bindgen_ty_1__bindgen_ty_1>(),
+ 4usize,
+ concat!(
+ "Alignment of ",
+ stringify!(sha_state_st__bindgen_ty_1__bindgen_ty_1)
+ )
+ );
+ assert_eq!(
+ unsafe {
+ &(*(::std::ptr::null::<sha_state_st__bindgen_ty_1__bindgen_ty_1>())).h0 as *const _
+ as usize
+ },
+ 0usize,
+ concat!(
+ "Offset of field: ",
+ stringify!(sha_state_st__bindgen_ty_1__bindgen_ty_1),
+ "::",
+ stringify!(h0)
+ )
+ );
+ assert_eq!(
+ unsafe {
+ &(*(::std::ptr::null::<sha_state_st__bindgen_ty_1__bindgen_ty_1>())).h1 as *const _
+ as usize
+ },
+ 4usize,
+ concat!(
+ "Offset of field: ",
+ stringify!(sha_state_st__bindgen_ty_1__bindgen_ty_1),
+ "::",
+ stringify!(h1)
+ )
+ );
+ assert_eq!(
+ unsafe {
+ &(*(::std::ptr::null::<sha_state_st__bindgen_ty_1__bindgen_ty_1>())).h2 as *const _
+ as usize
+ },
+ 8usize,
+ concat!(
+ "Offset of field: ",
+ stringify!(sha_state_st__bindgen_ty_1__bindgen_ty_1),
+ "::",
+ stringify!(h2)
+ )
+ );
+ assert_eq!(
+ unsafe {
+ &(*(::std::ptr::null::<sha_state_st__bindgen_ty_1__bindgen_ty_1>())).h3 as *const _
+ as usize
+ },
+ 12usize,
+ concat!(
+ "Offset of field: ",
+ stringify!(sha_state_st__bindgen_ty_1__bindgen_ty_1),
+ "::",
+ stringify!(h3)
+ )
+ );
+ assert_eq!(
+ unsafe {
+ &(*(::std::ptr::null::<sha_state_st__bindgen_ty_1__bindgen_ty_1>())).h4 as *const _
+ as usize
+ },
+ 16usize,
+ concat!(
+ "Offset of field: ",
+ stringify!(sha_state_st__bindgen_ty_1__bindgen_ty_1),
+ "::",
+ stringify!(h4)
+ )
+ );
+}
+#[test]
+fn bindgen_test_layout_sha_state_st__bindgen_ty_1() {
+ assert_eq!(
+ ::std::mem::size_of::<sha_state_st__bindgen_ty_1>(),
+ 20usize,
+ concat!("Size of: ", stringify!(sha_state_st__bindgen_ty_1))
+ );
+ assert_eq!(
+ ::std::mem::align_of::<sha_state_st__bindgen_ty_1>(),
+ 4usize,
+ concat!("Alignment of ", stringify!(sha_state_st__bindgen_ty_1))
+ );
+ assert_eq!(
+ unsafe { &(*(::std::ptr::null::<sha_state_st__bindgen_ty_1>())).h as *const _ as usize },
+ 0usize,
+ concat!(
+ "Offset of field: ",
+ stringify!(sha_state_st__bindgen_ty_1),
+ "::",
+ stringify!(h)
+ )
+ );
+}
+#[test]
+fn bindgen_test_layout_sha_state_st() {
+ assert_eq!(
+ ::std::mem::size_of::<sha_state_st>(),
+ 96usize,
+ concat!("Size of: ", stringify!(sha_state_st))
+ );
+ assert_eq!(
+ ::std::mem::align_of::<sha_state_st>(),
+ 4usize,
+ concat!("Alignment of ", stringify!(sha_state_st))
+ );
+ assert_eq!(
+ unsafe { &(*(::std::ptr::null::<sha_state_st>())).Nl as *const _ as usize },
+ 20usize,
+ concat!(
+ "Offset of field: ",
+ stringify!(sha_state_st),
+ "::",
+ stringify!(Nl)
+ )
+ );
+ assert_eq!(
+ unsafe { &(*(::std::ptr::null::<sha_state_st>())).Nh as *const _ as usize },
+ 24usize,
+ concat!(
+ "Offset of field: ",
+ stringify!(sha_state_st),
+ "::",
+ stringify!(Nh)
+ )
+ );
+ assert_eq!(
+ unsafe { &(*(::std::ptr::null::<sha_state_st>())).data as *const _ as usize },
+ 28usize,
+ concat!(
+ "Offset of field: ",
+ stringify!(sha_state_st),
+ "::",
+ stringify!(data)
+ )
+ );
+ assert_eq!(
+ unsafe { &(*(::std::ptr::null::<sha_state_st>())).num as *const _ as usize },
+ 92usize,
+ concat!(
+ "Offset of field: ",
+ stringify!(sha_state_st),
+ "::",
+ stringify!(num)
+ )
+ );
+}
+extern "C" {
+ #[link_name = "__RUST_MUNDANE_0_2_0_SHA256_Init"]
+ pub fn SHA256_Init(sha: *mut SHA256_CTX) -> ::std::os::raw::c_int;
+}
+extern "C" {
+ #[link_name = "__RUST_MUNDANE_0_2_0_SHA256_Update"]
+ pub fn SHA256_Update(
+ sha: *mut SHA256_CTX, data: *const ::std::os::raw::c_void, len: usize,
+ ) -> ::std::os::raw::c_int;
+}
+extern "C" {
+ #[link_name = "__RUST_MUNDANE_0_2_0_SHA256_Final"]
+ pub fn SHA256_Final(md: *mut u8, sha: *mut SHA256_CTX) -> ::std::os::raw::c_int;
+}
+#[repr(C)]
+#[derive(Copy, Clone)]
+pub struct sha256_state_st {
+ pub h: [u32; 8usize],
+ pub Nl: u32,
+ pub Nh: u32,
+ pub data: [u8; 64usize],
+ pub num: ::std::os::raw::c_uint,
+ pub md_len: ::std::os::raw::c_uint,
+}
+#[test]
+fn bindgen_test_layout_sha256_state_st() {
+ assert_eq!(
+ ::std::mem::size_of::<sha256_state_st>(),
+ 112usize,
+ concat!("Size of: ", stringify!(sha256_state_st))
+ );
+ assert_eq!(
+ ::std::mem::align_of::<sha256_state_st>(),
+ 4usize,
+ concat!("Alignment of ", stringify!(sha256_state_st))
+ );
+ assert_eq!(
+ unsafe { &(*(::std::ptr::null::<sha256_state_st>())).h as *const _ as usize },
+ 0usize,
+ concat!(
+ "Offset of field: ",
+ stringify!(sha256_state_st),
+ "::",
+ stringify!(h)
+ )
+ );
+ assert_eq!(
+ unsafe { &(*(::std::ptr::null::<sha256_state_st>())).Nl as *const _ as usize },
+ 32usize,
+ concat!(
+ "Offset of field: ",
+ stringify!(sha256_state_st),
+ "::",
+ stringify!(Nl)
+ )
+ );
+ assert_eq!(
+ unsafe { &(*(::std::ptr::null::<sha256_state_st>())).Nh as *const _ as usize },
+ 36usize,
+ concat!(
+ "Offset of field: ",
+ stringify!(sha256_state_st),
+ "::",
+ stringify!(Nh)
+ )
+ );
+ assert_eq!(
+ unsafe { &(*(::std::ptr::null::<sha256_state_st>())).data as *const _ as usize },
+ 40usize,
+ concat!(
+ "Offset of field: ",
+ stringify!(sha256_state_st),
+ "::",
+ stringify!(data)
+ )
+ );
+ assert_eq!(
+ unsafe { &(*(::std::ptr::null::<sha256_state_st>())).num as *const _ as usize },
+ 104usize,
+ concat!(
+ "Offset of field: ",
+ stringify!(sha256_state_st),
+ "::",
+ stringify!(num)
+ )
+ );
+ assert_eq!(
+ unsafe { &(*(::std::ptr::null::<sha256_state_st>())).md_len as *const _ as usize },
+ 108usize,
+ concat!(
+ "Offset of field: ",
+ stringify!(sha256_state_st),
+ "::",
+ stringify!(md_len)
+ )
+ );
+}
+extern "C" {
+ #[link_name = "__RUST_MUNDANE_0_2_0_SHA384_Init"]
+ pub fn SHA384_Init(sha: *mut SHA512_CTX) -> ::std::os::raw::c_int;
+}
+extern "C" {
+ #[link_name = "__RUST_MUNDANE_0_2_0_SHA384_Update"]
+ pub fn SHA384_Update(
+ sha: *mut SHA512_CTX, data: *const ::std::os::raw::c_void, len: usize,
+ ) -> ::std::os::raw::c_int;
+}
+extern "C" {
+ #[link_name = "__RUST_MUNDANE_0_2_0_SHA384_Final"]
+ pub fn SHA384_Final(md: *mut u8, sha: *mut SHA512_CTX) -> ::std::os::raw::c_int;
+}
+extern "C" {
+ #[link_name = "__RUST_MUNDANE_0_2_0_SHA512_Init"]
+ pub fn SHA512_Init(sha: *mut SHA512_CTX) -> ::std::os::raw::c_int;
+}
+extern "C" {
+ #[link_name = "__RUST_MUNDANE_0_2_0_SHA512_Update"]
+ pub fn SHA512_Update(
+ sha: *mut SHA512_CTX, data: *const ::std::os::raw::c_void, len: usize,
+ ) -> ::std::os::raw::c_int;
+}
+extern "C" {
+ #[link_name = "__RUST_MUNDANE_0_2_0_SHA512_Final"]
+ pub fn SHA512_Final(md: *mut u8, sha: *mut SHA512_CTX) -> ::std::os::raw::c_int;
+}
+#[repr(C)]
+#[derive(Copy, Clone)]
+pub struct sha512_state_st {
+ pub h: [u64; 8usize],
+ pub Nl: u64,
+ pub Nh: u64,
+ pub u: sha512_state_st__bindgen_ty_1,
+ pub num: ::std::os::raw::c_uint,
+ pub md_len: ::std::os::raw::c_uint,
+}
+#[repr(C)]
+#[derive(Copy, Clone)]
+pub union sha512_state_st__bindgen_ty_1 {
+ pub d: [u64; 16usize],
+ pub p: [u8; 128usize],
+ _bindgen_union_align: [u64; 16usize],
+}
+#[test]
+fn bindgen_test_layout_sha512_state_st__bindgen_ty_1() {
+ assert_eq!(
+ ::std::mem::size_of::<sha512_state_st__bindgen_ty_1>(),
+ 128usize,
+ concat!("Size of: ", stringify!(sha512_state_st__bindgen_ty_1))
+ );
+ assert_eq!(
+ ::std::mem::align_of::<sha512_state_st__bindgen_ty_1>(),
+ 8usize,
+ concat!("Alignment of ", stringify!(sha512_state_st__bindgen_ty_1))
+ );
+ assert_eq!(
+ unsafe { &(*(::std::ptr::null::<sha512_state_st__bindgen_ty_1>())).d as *const _ as usize },
+ 0usize,
+ concat!(
+ "Offset of field: ",
+ stringify!(sha512_state_st__bindgen_ty_1),
+ "::",
+ stringify!(d)
+ )
+ );
+ assert_eq!(
+ unsafe { &(*(::std::ptr::null::<sha512_state_st__bindgen_ty_1>())).p as *const _ as usize },
+ 0usize,
+ concat!(
+ "Offset of field: ",
+ stringify!(sha512_state_st__bindgen_ty_1),
+ "::",
+ stringify!(p)
+ )
+ );
+}
+#[test]
+fn bindgen_test_layout_sha512_state_st() {
+ assert_eq!(
+ ::std::mem::size_of::<sha512_state_st>(),
+ 216usize,
+ concat!("Size of: ", stringify!(sha512_state_st))
+ );
+ assert_eq!(
+ ::std::mem::align_of::<sha512_state_st>(),
+ 8usize,
+ concat!("Alignment of ", stringify!(sha512_state_st))
+ );
+ assert_eq!(
+ unsafe { &(*(::std::ptr::null::<sha512_state_st>())).h as *const _ as usize },
+ 0usize,
+ concat!(
+ "Offset of field: ",
+ stringify!(sha512_state_st),
+ "::",
+ stringify!(h)
+ )
+ );
+ assert_eq!(
+ unsafe { &(*(::std::ptr::null::<sha512_state_st>())).Nl as *const _ as usize },
+ 64usize,
+ concat!(
+ "Offset of field: ",
+ stringify!(sha512_state_st),
+ "::",
+ stringify!(Nl)
+ )
+ );
+ assert_eq!(
+ unsafe { &(*(::std::ptr::null::<sha512_state_st>())).Nh as *const _ as usize },
+ 72usize,
+ concat!(
+ "Offset of field: ",
+ stringify!(sha512_state_st),
+ "::",
+ stringify!(Nh)
+ )
+ );
+ assert_eq!(
+ unsafe { &(*(::std::ptr::null::<sha512_state_st>())).u as *const _ as usize },
+ 80usize,
+ concat!(
+ "Offset of field: ",
+ stringify!(sha512_state_st),
+ "::",
+ stringify!(u)
+ )
+ );
+ assert_eq!(
+ unsafe { &(*(::std::ptr::null::<sha512_state_st>())).num as *const _ as usize },
+ 208usize,
+ concat!(
+ "Offset of field: ",
+ stringify!(sha512_state_st),
+ "::",
+ stringify!(num)
+ )
+ );
+ assert_eq!(
+ unsafe { &(*(::std::ptr::null::<sha512_state_st>())).md_len as *const _ as usize },
+ 212usize,
+ concat!(
+ "Offset of field: ",
+ stringify!(sha512_state_st),
+ "::",
+ stringify!(md_len)
+ )
+ );
+}
diff --git a/boringssl/test_symbol_conflict.sh b/boringssl/test_symbol_conflict.sh
new file mode 100755
index 0000000..15a0f14
--- /dev/null
+++ b/boringssl/test_symbol_conflict.sh
@@ -0,0 +1,238 @@
+#!/bin/bash
+
+# Copyright 2018 Google LLC
+#
+# Use of this source code is governed by an MIT-style
+# license that can be found in the LICENSE file or at
+# https://opensource.org/licenses/MIT.
+
+# This script tests that a build with multiple versions of the mundane crate in
+# the same build graph works properly. It performs the following steps:
+# - Create a temporary directory
+# - Create two copies of mundane - mundane-v1, and mundane-v2 - which directly
+# expose the boringssl::ffi module so that dependent crates can access the raw
+# symbols
+# - Create two crates, one depending on mundane-v1, and one on mundane-v2, each
+# of which exposes all of the BoringSSL symbols from mundane
+# - Create a top-level program which depends on both of these crates
+# - Have the top-level program's main call all of the mundane functions from
+# each of the crates
+# - Produce a release build, which forces linking, to make sure that linking
+# these two versions of the library at the same time works properly
+
+set -e
+
+# the directory this script lives in
+readonly SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
+CRATE_ROOT="${SCRIPT_DIR}/.."
+
+TMP="$(mktemp -d)"
+cd "$TMP"
+
+# NOTE: The -L means to follow symlinks
+cp -LR "$CRATE_ROOT" mundane-v1
+cp -LR "$CRATE_ROOT" mundane-v2
+echo "$TMP"
+
+#
+# Make mundane crates
+#
+
+# Update the Cargo.toml versions and names in place to be distinct
+sed -i '' -e 's/^name =.*/name = "mundane-v1"/' mundane-v1/Cargo.toml
+sed -i '' -e 's/^version =.*/version = "1.0.0"/' mundane-v1/Cargo.toml
+sed -i '' -e 's/^name =.*/name = "mundane-v2"/' mundane-v2/Cargo.toml
+sed -i '' -e 's/^version =.*/version = "2.0.0"/' mundane-v2/Cargo.toml
+
+# Update the link directive to use the right version number
+sed -i '' -e 's/#[link(name = "crypto_[0-9]*_[0-9]*_[0-9]*")]/#[link(name = "crypto_1_0_0")]/' mundane-v1/boringssl/boringssl.rs
+sed -i '' -e 's/#[link(name = "crypto_[0-9]*_[0-9]*_[0-9]*")]/#[link(name = "crypto_2_0_0")]/' mundane-v2/boringssl/boringssl.rs
+# Update the link_name directives to use the right version number
+sed -i '' -e 's/__RUST_MUNDANE_[0-9]*_[0-9]*_[0-9]*_/__RUST_MUNDANE_1_0_0_/' mundane-v1/boringssl/boringssl.rs
+sed -i '' -e 's/__RUST_MUNDANE_[0-9]*_[0-9]*_[0-9]*_/__RUST_MUNDANE_2_0_0_/' mundane-v2/boringssl/boringssl.rs
+# Mark the ffi module as public
+sed -i '' -e 's/^mod ffi;$/pub mod ffi;/' mundane-v1/src/boringssl/mod.rs
+sed -i '' -e 's/^mod ffi;$/pub mod ffi;/' mundane-v2/src/boringssl/mod.rs
+# Make mundane directly expose the ffi module
+echo "pub use boringssl::ffi;" >> mundane-v1/src/lib.rs
+echo "pub use boringssl::ffi;" >> mundane-v2/src/lib.rs
+
+#
+# Make crates which depend on mundane
+#
+
+# Usage: make_crate <crate name> <dep name>
+function make_crate {
+ CRATE_NAME="$1"
+ DEP_NAME="$2"
+ DEP_NAME_RS="$(echo ${DEP_NAME} | tr - _)"
+
+ mkdir "$CRATE_NAME"
+ mkdir "${CRATE_NAME}/src"
+ # Re-export all symbols from mundane
+ cat >> "${CRATE_NAME}/src/lib.rs" <<EOF
+extern crate ${DEP_NAME_RS};
+
+pub use ${DEP_NAME_RS}::ffi::*;
+EOF
+
+ cat >> "${CRATE_NAME}/Cargo.toml" <<EOF
+[package]
+name = "${CRATE_NAME}"
+version = "0.0.0"
+
+[dependencies]
+${DEP_NAME} = { path = "../${DEP_NAME}" }
+EOF
+}
+
+make_crate depends-mundane-v1 mundane-v1
+make_crate depends-mundane-v2 mundane-v2
+
+#
+# Make top-level crate
+#
+
+cat >> Cargo.toml <<EOF
+[package]
+name = "mundane-version-test"
+version = "0.0.0"
+
+[dependencies]
+depends-mundane-v1 = { path = "./depends-mundane-v1" }
+depends-mundane-v2 = { path = "./depends-mundane-v2" }
+EOF
+
+# The body of main() is generated with the following scripts:
+# rg -U 'extern "C" \{\n[^\n]*\n pub fn [0-9A-Za-z_]*([^)]*)' boringssl.rs | grep '^ *pub fn' | sed -e 's/.*pub fn \([^(]*\).*/println!("{:?}", depends_mundane_v1::\1 as *const ());/'
+# rg -U 'extern "C" \{\n[^\n]*\n pub fn [0-9A-Za-z_]*([^)]*)' boringssl.rs | grep '^ *pub fn' | sed -e 's/.*pub fn \([^(]*\).*/println!("{:?}", depends_mundane_v2::\1 as *const ());/'
+
+mkdir src
+cat >> src/main.rs <<EOF
+extern crate depends_mundane_v1;
+extern crate depends_mundane_v2;
+
+fn main() {
+println!("{:?}", depends_mundane_v1::ERR_print_errors_cb as *const ());
+println!("{:?}", depends_mundane_v1::CBS_init as *const ());
+println!("{:?}", depends_mundane_v1::CBS_len as *const ());
+println!("{:?}", depends_mundane_v1::CBB_init as *const ());
+println!("{:?}", depends_mundane_v1::CBB_cleanup as *const ());
+println!("{:?}", depends_mundane_v1::CBB_data as *const ());
+println!("{:?}", depends_mundane_v1::CBB_len as *const ());
+println!("{:?}", depends_mundane_v1::ED25519_keypair as *const ());
+println!("{:?}", depends_mundane_v1::ED25519_sign as *const ());
+println!("{:?}", depends_mundane_v1::ED25519_verify as *const ());
+println!("{:?}", depends_mundane_v1::ED25519_keypair_from_seed as *const ());
+println!("{:?}", depends_mundane_v1::EVP_sha1 as *const ());
+println!("{:?}", depends_mundane_v1::EVP_sha256 as *const ());
+println!("{:?}", depends_mundane_v1::EVP_sha384 as *const ());
+println!("{:?}", depends_mundane_v1::EVP_sha512 as *const ());
+println!("{:?}", depends_mundane_v1::EC_GROUP_new_by_curve_name as *const ());
+println!("{:?}", depends_mundane_v1::EC_GROUP_get_curve_name as *const ());
+println!("{:?}", depends_mundane_v1::EC_curve_nid2nist as *const ());
+println!("{:?}", depends_mundane_v1::EC_KEY_new as *const ());
+println!("{:?}", depends_mundane_v1::EC_KEY_free as *const ());
+println!("{:?}", depends_mundane_v1::EC_KEY_up_ref as *const ());
+println!("{:?}", depends_mundane_v1::EC_KEY_get0_group as *const ());
+println!("{:?}", depends_mundane_v1::EC_KEY_set_group as *const ());
+println!("{:?}", depends_mundane_v1::EC_KEY_generate_key as *const ());
+println!("{:?}", depends_mundane_v1::EC_KEY_parse_private_key as *const ());
+println!("{:?}", depends_mundane_v1::EC_KEY_marshal_private_key as *const ());
+println!("{:?}", depends_mundane_v1::ECDSA_sign as *const ());
+println!("{:?}", depends_mundane_v1::ECDSA_verify as *const ());
+println!("{:?}", depends_mundane_v1::ECDSA_size as *const ());
+println!("{:?}", depends_mundane_v1::EVP_PKEY_new as *const ());
+println!("{:?}", depends_mundane_v1::EVP_PKEY_free as *const ());
+println!("{:?}", depends_mundane_v1::EVP_PKEY_up_ref as *const ());
+println!("{:?}", depends_mundane_v1::EVP_PKEY_assign_EC_KEY as *const ());
+println!("{:?}", depends_mundane_v1::EVP_PKEY_get1_EC_KEY as *const ());
+println!("{:?}", depends_mundane_v1::EVP_parse_public_key as *const ());
+println!("{:?}", depends_mundane_v1::EVP_marshal_public_key as *const ());
+println!("{:?}", depends_mundane_v1::PKCS5_PBKDF2_HMAC as *const ());
+println!("{:?}", depends_mundane_v1::EVP_PBE_scrypt as *const ());
+println!("{:?}", depends_mundane_v1::HMAC_CTX_init as *const ());
+println!("{:?}", depends_mundane_v1::HMAC_CTX_cleanup as *const ());
+println!("{:?}", depends_mundane_v1::HMAC_Init_ex as *const ());
+println!("{:?}", depends_mundane_v1::HMAC_Update as *const ());
+println!("{:?}", depends_mundane_v1::HMAC_Final as *const ());
+println!("{:?}", depends_mundane_v1::HMAC_size as *const ());
+println!("{:?}", depends_mundane_v1::CRYPTO_memcmp as *const ());
+println!("{:?}", depends_mundane_v1::RAND_bytes as *const ());
+println!("{:?}", depends_mundane_v1::SHA1_Init as *const ());
+println!("{:?}", depends_mundane_v1::SHA1_Update as *const ());
+println!("{:?}", depends_mundane_v1::SHA1_Final as *const ());
+println!("{:?}", depends_mundane_v1::SHA256_Init as *const ());
+println!("{:?}", depends_mundane_v1::SHA256_Update as *const ());
+println!("{:?}", depends_mundane_v1::SHA256_Final as *const ());
+println!("{:?}", depends_mundane_v1::SHA384_Init as *const ());
+println!("{:?}", depends_mundane_v1::SHA384_Update as *const ());
+println!("{:?}", depends_mundane_v1::SHA384_Final as *const ());
+println!("{:?}", depends_mundane_v1::SHA512_Init as *const ());
+println!("{:?}", depends_mundane_v1::SHA512_Update as *const ());
+println!("{:?}", depends_mundane_v1::SHA512_Final as *const ());
+println!("{:?}", depends_mundane_v2::ERR_print_errors_cb as *const ());
+println!("{:?}", depends_mundane_v2::CBS_init as *const ());
+println!("{:?}", depends_mundane_v2::CBS_len as *const ());
+println!("{:?}", depends_mundane_v2::CBB_init as *const ());
+println!("{:?}", depends_mundane_v2::CBB_cleanup as *const ());
+println!("{:?}", depends_mundane_v2::CBB_data as *const ());
+println!("{:?}", depends_mundane_v2::CBB_len as *const ());
+println!("{:?}", depends_mundane_v2::ED25519_keypair as *const ());
+println!("{:?}", depends_mundane_v2::ED25519_sign as *const ());
+println!("{:?}", depends_mundane_v2::ED25519_verify as *const ());
+println!("{:?}", depends_mundane_v2::ED25519_keypair_from_seed as *const ());
+println!("{:?}", depends_mundane_v2::EVP_sha1 as *const ());
+println!("{:?}", depends_mundane_v2::EVP_sha256 as *const ());
+println!("{:?}", depends_mundane_v2::EVP_sha384 as *const ());
+println!("{:?}", depends_mundane_v2::EVP_sha512 as *const ());
+println!("{:?}", depends_mundane_v2::EC_GROUP_new_by_curve_name as *const ());
+println!("{:?}", depends_mundane_v2::EC_GROUP_get_curve_name as *const ());
+println!("{:?}", depends_mundane_v2::EC_curve_nid2nist as *const ());
+println!("{:?}", depends_mundane_v2::EC_KEY_new as *const ());
+println!("{:?}", depends_mundane_v2::EC_KEY_free as *const ());
+println!("{:?}", depends_mundane_v2::EC_KEY_up_ref as *const ());
+println!("{:?}", depends_mundane_v2::EC_KEY_get0_group as *const ());
+println!("{:?}", depends_mundane_v2::EC_KEY_set_group as *const ());
+println!("{:?}", depends_mundane_v2::EC_KEY_generate_key as *const ());
+println!("{:?}", depends_mundane_v2::EC_KEY_parse_private_key as *const ());
+println!("{:?}", depends_mundane_v2::EC_KEY_marshal_private_key as *const ());
+println!("{:?}", depends_mundane_v2::ECDSA_sign as *const ());
+println!("{:?}", depends_mundane_v2::ECDSA_verify as *const ());
+println!("{:?}", depends_mundane_v2::ECDSA_size as *const ());
+println!("{:?}", depends_mundane_v2::EVP_PKEY_new as *const ());
+println!("{:?}", depends_mundane_v2::EVP_PKEY_free as *const ());
+println!("{:?}", depends_mundane_v2::EVP_PKEY_up_ref as *const ());
+println!("{:?}", depends_mundane_v2::EVP_PKEY_assign_EC_KEY as *const ());
+println!("{:?}", depends_mundane_v2::EVP_PKEY_get1_EC_KEY as *const ());
+println!("{:?}", depends_mundane_v2::EVP_parse_public_key as *const ());
+println!("{:?}", depends_mundane_v2::EVP_marshal_public_key as *const ());
+println!("{:?}", depends_mundane_v2::PKCS5_PBKDF2_HMAC as *const ());
+println!("{:?}", depends_mundane_v2::EVP_PBE_scrypt as *const ());
+println!("{:?}", depends_mundane_v2::HMAC_CTX_init as *const ());
+println!("{:?}", depends_mundane_v2::HMAC_CTX_cleanup as *const ());
+println!("{:?}", depends_mundane_v2::HMAC_Init_ex as *const ());
+println!("{:?}", depends_mundane_v2::HMAC_Update as *const ());
+println!("{:?}", depends_mundane_v2::HMAC_Final as *const ());
+println!("{:?}", depends_mundane_v2::HMAC_size as *const ());
+println!("{:?}", depends_mundane_v2::CRYPTO_memcmp as *const ());
+println!("{:?}", depends_mundane_v2::RAND_bytes as *const ());
+println!("{:?}", depends_mundane_v2::SHA1_Init as *const ());
+println!("{:?}", depends_mundane_v2::SHA1_Update as *const ());
+println!("{:?}", depends_mundane_v2::SHA1_Final as *const ());
+println!("{:?}", depends_mundane_v2::SHA256_Init as *const ());
+println!("{:?}", depends_mundane_v2::SHA256_Update as *const ());
+println!("{:?}", depends_mundane_v2::SHA256_Final as *const ());
+println!("{:?}", depends_mundane_v2::SHA384_Init as *const ());
+println!("{:?}", depends_mundane_v2::SHA384_Update as *const ());
+println!("{:?}", depends_mundane_v2::SHA384_Final as *const ());
+println!("{:?}", depends_mundane_v2::SHA512_Init as *const ());
+println!("{:?}", depends_mundane_v2::SHA512_Update as *const ());
+println!("{:?}", depends_mundane_v2::SHA512_Final as *const ());
+}
+EOF
+
+cargo build --release
+
+cd -
+rm -rf "$TMP"
\ No newline at end of file
diff --git a/build.rs b/build.rs
new file mode 100644
index 0000000..6662e83
--- /dev/null
+++ b/build.rs
@@ -0,0 +1,256 @@
+// Copyright 2018 Google LLC
+//
+// Use of this source code is governed by an MIT-style
+// license that can be found in the LICENSE file or at
+// https://opensource.org/licenses/MIT.
+
+// This build script is responsible for building BoringSSL with the appropriate
+// symbol prefix. See boringssl/README.md for details.
+
+use std::env;
+use std::fs;
+use std::process::{Command, Stdio};
+
+// Relative to CARGO_MANIFEST_DIR
+const BORINGSSL_SRC: &str = "boringssl/boringssl";
+
+// Relative to OUT_DIR
+const BUILD_DIR_1: &str = "boringssl/build_1";
+const BUILD_DIR_2: &str = "boringssl/build_2";
+const SYMBOL_FILE: &str = "boringssl/symbols.txt";
+
+fn env(name: &str) -> String {
+ let var = env::var(name).expect(&format!("missing required environment variable {}", name));
+ println!("cargo:rerun-if-env-changed={}", var);
+ var
+}
+
+fn main() {
+ validate_dependencies();
+
+ let manifest_dir = env("CARGO_MANIFEST_DIR");
+ let abs_boringssl_src = format!("{}/{}", manifest_dir, BORINGSSL_SRC);
+
+ let out_dir = env("OUT_DIR");
+ let abs_build_dir_1 = format!("{}/{}", out_dir, BUILD_DIR_1);
+ let abs_build_dir_2 = format!("{}/{}", out_dir, BUILD_DIR_2);
+ let abs_symbol_file = format!("{}/{}", out_dir, SYMBOL_FILE);
+
+ fs::create_dir_all(&abs_build_dir_1).expect("failed to create first build directory");
+ fs::create_dir_all(&abs_build_dir_2).expect("failed to create second build directory");
+
+ let major = env("CARGO_PKG_VERSION_MAJOR");
+ let minor = env("CARGO_PKG_VERSION_MINOR");
+ let patch = env("CARGO_PKG_VERSION_PATCH");
+ let version_string = format!("{}_{}_{}", major, minor, patch);
+ let prefix = format!("__RUST_MUNDANE_{}", version_string);
+ let cmake_version_flag = format!("-DBORINGSSL_PREFIX={}", prefix);
+
+ let built_with = built_with(&abs_build_dir_1);
+ let have_ninja = have_ninja();
+ let build = |build_dir, flags: &[&str]| {
+ fn with_ninja<'a, 'b>(flags: &'a [&'b str]) -> Vec<&'b str> {
+ let mut flags = flags.to_vec();
+ flags.push("-GNinja");
+ flags
+ }
+
+ env::set_current_dir(build_dir).expect("failed to cd to build directory");
+ // If we've already run a build, then we need to build with the same
+ // tool the second time around, or cmake will complain. There's
+ // technically a chance that, after having built, the user uninstalled
+ // the build tool, but that's unlikely enough that it's not worth
+ // introducing the complexity necessary to support that use case.
+ match built_with {
+ Some(BuildSystem::Ninja) => {
+ run("cmake", &with_ninja(flags));
+ run("ninja", &["crypto"]);
+ }
+ Some(BuildSystem::Make) => {
+ run("cmake", flags);
+ run("make", &["crypto"]);
+ }
+ None => {
+ if have_ninja {
+ run("cmake", &with_ninja(flags));
+ run("ninja", &["crypto"]);
+ } else {
+ run("cmake", flags);
+ run("make", &["crypto"]);
+ }
+ }
+ }
+ };
+
+ build(&abs_build_dir_1, &[&abs_boringssl_src]);
+
+ // 'go run' requires that we're cd'd into a subdirectory of the Go module
+ // root in order for Go modules to work
+ let orig = env::current_dir().expect("could not get current directory");
+ env::set_current_dir(&format!("{}/util", &abs_boringssl_src))
+ .expect("could not set current directory");
+ run(
+ "go",
+ &[
+ "run",
+ "read_symbols.go",
+ "-out",
+ &abs_symbol_file,
+ &format!("{}/crypto/libcrypto.a", &abs_build_dir_1),
+ ],
+ );
+ env::set_current_dir(orig).expect("could not set current directory");
+
+ build(
+ &abs_build_dir_2,
+ &[
+ &abs_boringssl_src,
+ &cmake_version_flag,
+ "-DBORINGSSL_PREFIX_SYMBOLS=../symbols.txt",
+ ],
+ );
+
+ // NOTE(joshlf): We symlink rather than renaming so that the BoringSSL build
+ // system won't notice that libcrypto.a is gone and spuriously attempt to
+ // rebuild.
+ #[cfg(unix)]
+ let res = std::os::unix::fs::symlink(
+ format!("{}/crypto/libcrypto.a", abs_build_dir_2),
+ format!("{}/crypto/libcrypto_{}.a", abs_build_dir_2, version_string),
+ );
+ #[cfg(windows)]
+ let res = std::os::windows::fs::symlink_file(
+ format!("{}/crypto/libcrypto.a", abs_build_dir_2),
+ format!("{}/crypto/libcrypto_{}.a", abs_build_dir_2, version_string),
+ );
+ // If symlinking isn't available, we fall back to renaming.
+ #[cfg(not(any(unix, windows)))]
+ let res = fs::rename(
+ format!("{}/crypto/libcrypto.a", abs_build_dir_2),
+ format!("{}/crypto/libcrypto_{}.a", abs_build_dir_2, version_string),
+ );
+
+ if let Err(err) = res {
+ // If the error is an AlreadyExists error, that just means we've already
+ // compiled before. Renaming to an existing file works without error, so
+ // it's OK that our panic message only mentions symlinking.
+ if err.kind() != std::io::ErrorKind::AlreadyExists {
+ panic!("could not symlink to libcrypto.a: {}", err)
+ }
+ }
+
+ println!("cargo:rustc-link-search=native={}/crypto", abs_build_dir_2);
+}
+
+// Validates that dependencies which we invoke directly are present, or panics
+// with an error message. Does not check for dependencies of BoringSSL's build
+// system.
+fn validate_dependencies() {
+ let go = have_go();
+ let cmake = have_cmake();
+ let ninja = have_ninja();
+ let make = have_make();
+
+ if !go {
+ panic!(
+ "
+
+Missing build dependency Go (1.11 or higher).
+
+"
+ );
+ }
+ if !cmake {
+ panic!(
+ "
+
+Missing build dependency CMake.
+
+"
+ );
+ }
+ if cfg!(windows) && !ninja {
+ panic!(
+ "
+
+Building on Windows requires the Ninja tool. See https://ninja-build.org/.
+
+"
+ );
+ }
+ if !make && !ninja {
+ panic!(
+ "
+
+Building requires either Make or Ninja (https://ninja-build.org/).
+
+"
+ );
+ }
+}
+
+// Runs a command and panic if it fails.
+fn run(cmd: &str, args: &[&str]) {
+ let output = Command::new(cmd)
+ .args(args)
+ .stdout(Stdio::inherit())
+ .stderr(Stdio::inherit())
+ .output()
+ .expect(&format!("failed to invoke {}", cmd));
+ if !output.status.success() {
+ panic!("{} failed with status {}", cmd, output.status);
+ }
+}
+
+// Is Go installed?
+fn have_go() -> bool {
+ have("go", &["version"])
+}
+
+// Is CMake installed?
+fn have_cmake() -> bool {
+ have("cmake", &["--version"])
+}
+
+// Is Ninja installed?
+fn have_ninja() -> bool {
+ have("ninja", &["--version"])
+}
+
+// Is Make installed?
+fn have_make() -> bool {
+ have("make", &["--version"])
+}
+
+// Checks whether a program is installed by running it.
+//
+// `have` checks whether `name` is installed by running it with the provided
+// `args`. It must exist successfully.
+fn have(name: &str, args: &[&str]) -> bool {
+ Command::new(name)
+ .args(args)
+ .output()
+ .map(|output| output.status.success())
+ .unwrap_or(false)
+}
+
+enum BuildSystem {
+ Ninja,
+ Make,
+}
+
+// Checks which build tool was used for the previous build.
+fn built_with(abs_dir: &str) -> Option<BuildSystem> {
+ let is_file = |file| {
+ fs::metadata(format!("{}/{}", abs_dir, file))
+ .map(|meta| meta.is_file())
+ .unwrap_or(false)
+ };
+ if is_file("build.ninja") {
+ Some(BuildSystem::Ninja)
+ } else if is_file("Makefile") {
+ Some(BuildSystem::Make)
+ } else {
+ None
+ }
+}
diff --git a/src/boringssl/abort.rs b/src/boringssl/abort.rs
new file mode 100644
index 0000000..d422c91
--- /dev/null
+++ b/src/boringssl/abort.rs
@@ -0,0 +1,200 @@
+// Copyright 2018 Google LLC
+//
+// Use of this source code is governed by an MIT-style
+// license that can be found in the LICENSE file or at
+// https://opensource.org/licenses/MIT.
+
+//! Macros and functions that abort instead of unwinding.
+//!
+//! Writing `unsafe` code which retains memory safety in the face of unwinding
+//! is [notoriously
+//! difficult](https://doc.rust-lang.org/nightly/nomicon/exception-safety.html).
+//! This module provides panic-related macros and functions that abort rather
+//! than unwind. These are used in place of unwinding-based macros and functions
+//! so that we can avoid the high probability of us getting unwind-safe code
+//! wrong.
+
+use std::fmt::Debug;
+
+macro_rules! assert_abort {
+ ($cond:expr) => ({
+ let cond = $cond;
+ let cond_str = stringify!($cond);
+ assert_abort!(cond, "{}", cond_str);
+ });
+ ($cond:expr,) => ({
+ assert_abort!($cond);
+ });
+ ($cond:expr, $msg:expr, $($arg:tt)*) => ({
+ if !($cond) {
+ panic_abort!(concat!("assertion failed: ", $msg), $($arg)*);
+ }
+ });
+}
+
+macro_rules! assert_abort_eq {
+ ($left:expr, $right:expr) => ({
+ match (&$left, &$right) {
+ (left_val, right_val) => {
+ if !(*left_val == *right_val) {
+ panic_abort!(r#"assertion failed: `(left == right)`
+ left: `{:?}`,
+ right: `{:?}`"#, left_val, right_val)
+ }
+ }
+ }
+ });
+ ($left:expr, $right:expr,) => ({
+ assert_eq!($left, $right)
+ });
+ ($left:expr, $right:expr, $($arg:tt)+) => ({
+ match (&($left), &($right)) {
+ (left_val, right_val) => {
+ if !(*left_val == *right_val) {
+ panic_abort!(r#"assertion failed: `(left == right)`
+ left: `{:?}`,
+ right: `{:?}`: {}"#, left_val, right_val,
+ format_args!($($arg)+))
+ }
+ }
+ }
+ });
+}
+
+#[allow(unused)]
+macro_rules! unimplemented_abort {
+ () => {{
+ panic_abort!("not yet implemented")
+ }};
+}
+
+macro_rules! unreachable_abort {
+ () => {{
+ panic_abort!("internal error: entered unreachable code")
+ }};
+}
+
+macro_rules! panic_abort {
+ () => ({
+ panic_abort!("explicit panic")
+ });
+ ($msg:expr) => ({
+ eprintln!("{}", $msg);
+ ::std::process::abort();
+ });
+ ($msg:expr,) => ({
+ panic_abort!($msg)
+ });
+ ($fmt:expr, $($arg:tt)+) => ({
+ panic_abort!(format!($fmt, $($arg)+));
+ });
+}
+
+// Redefine normal panic/assert macros so their use will cause a compiler error.
+
+#[allow(unused)]
+macro_rules! panic {
+ ($($x:tt)*) => {
+ compile_error!("use panic_abort! instead of panic! in boringssl module")
+ };
+}
+
+#[allow(unused)]
+macro_rules! assert {
+ ($($x:tt)*) => {
+ compile_error!("use assert_abort! instead of assert! in boringssl module")
+ };
+}
+
+#[allow(unused)]
+macro_rules! assert_eq {
+ ($($x:tt)*) => {
+ compile_error!("use assert_abort_eq! instead of assert_eq! in boringssl module")
+ };
+}
+
+#[allow(unused)]
+macro_rules! assert_ne {
+ ($($x:tt)*) => {
+ compile_error!("use assert_abort_ne! instead of assert_ne! in boringssl module")
+ };
+}
+
+#[allow(unused)]
+macro_rules! unimplemented {
+ ($($x:tt)*) => {
+ compile_error!("use unimplemented_abort! instead of unimplemented! in boringssl module")
+ };
+}
+
+#[allow(unused)]
+macro_rules! unreachable {
+ ($($x:tt)*) => {
+ compile_error!("use unreachable_abort! instead of unreachable! in boringssl module")
+ };
+}
+
+// unwrap and expect
+
+// TODO(joshlf): Is there a way (maybe with clippy) that we can cause warnings
+// or errors if this module ever uses unwrap or expect?
+
+pub trait UnwrapAbort {
+ type Item;
+
+ fn unwrap_abort(self) -> Self::Item;
+ fn expect_abort(self, msg: &str) -> Self::Item;
+}
+
+// The implementations for Option and Result are adapted from the Rust standard library.
+impl<T> UnwrapAbort for Option<T> {
+ type Item = T;
+
+ fn unwrap_abort(self) -> T {
+ match self {
+ Some(val) => val,
+ None => panic_abort!("called `Option::unwrap_abort()` on a `None` value"),
+ }
+ }
+
+ fn expect_abort(self, msg: &str) -> T {
+ // This is a separate function to reduce the code size of alloc_expect itself
+ #[inline(never)]
+ #[cold]
+ fn failed(msg: &str) -> ! {
+ panic_abort!("{}", msg);
+ }
+
+ match self {
+ Some(val) => val,
+ None => failed(msg),
+ }
+ }
+}
+
+impl<T, E: Debug> UnwrapAbort for Result<T, E> {
+ type Item = T;
+
+ fn unwrap_abort(self) -> T {
+ match self {
+ Ok(val) => val,
+ Err(err) => {
+ result_unwrap_failed("called `Result::unwrap_abort()` on an `Err` value", err)
+ }
+ }
+ }
+
+ fn expect_abort(self, msg: &str) -> T {
+ match self {
+ Ok(val) => val,
+ Err(err) => result_unwrap_failed(msg, err),
+ }
+ }
+}
+
+// This is a separate function to reduce the code size of alloc_{expect,unwrap}
+#[inline(never)]
+#[cold]
+fn result_unwrap_failed<E: Debug>(msg: &str, err: E) -> ! {
+ panic_abort!("{}: {:?}", msg, err)
+}
diff --git a/src/boringssl/mod.rs b/src/boringssl/mod.rs
new file mode 100644
index 0000000..2327577
--- /dev/null
+++ b/src/boringssl/mod.rs
@@ -0,0 +1,743 @@
+// Copyright 2018 Google LLC
+//
+// Use of this source code is governed by an MIT-style
+// license that can be found in the LICENSE file or at
+// https://opensource.org/licenses/MIT.
+
+//! The BoringSSL API.
+//!
+//! This module provides a safe access to the BoringSSL API.
+//!
+//! It accomplishes this using the following structure:
+//! - The internal `raw` module provides nearly-raw access to the BoringSSL API.
+//! For each function in the BoringSSL API, it exposes an equivalent Rust
+//! function which performs error checking. Functions which return pointers
+//! return `Result<NonNull<T>, BoringError>`, functions which return status
+//! codes return `Result<(), BoringError>`, etc. This API makes it less likely
+//! to accidentally forget to check for null pointers or error status codes.
+//! - The internal `wrapper` module provides types which wrap C objects and
+//! handle many of the details of their lifecycles. These include
+//! `CStackWrapper`, which handles initializing and destructing
+//! stack-allocated C objects; `CHeapWrapper`, which is analogous to Rust's
+//! `Box` or `Rc`, and handles allocation, reference counting, and freeing;
+//! and `CRef`, which is analogous to a Rust reference.
+//! - This module builds on top of the `raw` and `wrapper` modules to provide a
+//! safe API. This allows us to `#![forbid(unsafe_code)]` in the rest of the
+//! crate, which in turn means that this is the only module whose memory
+//! safety needs to be manually verified.
+//!
+//! # Usage
+//!
+//! Each type, `T`, from the BoringSSL API is exposed as either a
+//! `CStackWrapper<T>`, a `CHeapWrapper<T>`, or a `CRef<T>`. Each function from
+//! the BoringSSL API which operates on a particular type is exposed as a method
+//! on the wrapped version of that type. For example, the BoringSSL `CBS_len`
+//! function operates on a `CBS`; we provide the `cbs_len` method on the
+//! `CStackWrapper<CBS>` type. While BoringSSL functions that operate on a
+//! particular type take the form `TYPE_method`, the Rust equivalents are all
+//! lower-case - `type_method`.
+//!
+//! Some functions which do not make sense as methods are exposed as bare
+//! functions. For example, the BoringSSL `ECDSA_sign` function is exposed as a
+//! bare function as `ecdsa_sign`.
+//!
+//! Types which can be constructed without arguments implement `Default`. Types
+//! which require arguments to be constructed provide associated functions which
+//! take those arguments and return a new instance of that type. For example,
+//! the `CHeapWrapper<EC_KEY>::ec_key_parse_private_key` function parses a
+//! private key from an input stream and returns a new `CHeapWrapper<EC_KEY>`.
+//!
+//! # API Guidelines
+//!
+//! This module is meant to be as close as possible to a direct set of FFI
+//! bindings while still providing a safe API. While memory safety is handled
+//! internally, and certain error conditions which could affect memory safety
+//! are checked internally (and cause the process to abort if they fail), most
+//! errors are returned from the API, as they are considered business logic,
+//! which is outside the scope of this module.
+
+// NOTES on safety requirements of the BoringSSL API:
+// - Though it may not be explicitly documented, calling methods on uinitialized
+// values is UB. Remember, this is C! Always initialize (usually via XXX_init
+// or a similarly-named function) before calling any methods or functions.
+// - Any BoringSSL documentation that says "x property must hold" means that, if
+// that property doesn't hold, it may cause UB - you are not guaranteed that
+// it will be detected and an error will be returned.
+
+// NOTE(joshlf): It's important to define this module before the abort module,
+// or else all of the assertions that are auto-generated by bindgen would result
+// in compilation errors.
+#[path = "../../boringssl/boringssl.rs"]
+mod ffi;
+#[macro_use]
+mod abort;
+#[macro_use]
+mod wrapper;
+mod raw;
+
+// C types
+pub use boringssl::ffi::{CBB, CBS, EC_GROUP, EC_KEY, EVP_MD, EVP_PKEY, HMAC_CTX, SHA256_CTX,
+ SHA512_CTX, SHA_CTX};
+// C constants
+pub use boringssl::ffi::{NID_X9_62_prime256v1, NID_secp384r1, NID_secp521r1,
+ ED25519_PRIVATE_KEY_LEN, ED25519_PUBLIC_KEY_LEN, ED25519_SIGNATURE_LEN,
+ SHA256_DIGEST_LENGTH, SHA384_DIGEST_LENGTH, SHA512_DIGEST_LENGTH,
+ SHA_DIGEST_LENGTH};
+// wrapper types
+pub use boringssl::wrapper::{CHeapWrapper, CRef, CStackWrapper};
+
+use std::ffi::CStr;
+use std::fmt::{self, Debug, Display, Formatter};
+use std::num::NonZeroUsize;
+use std::os::raw::{c_char, c_int, c_uint, c_void};
+use std::{mem, ptr, slice};
+
+use boringssl::abort::UnwrapAbort;
+use boringssl::raw::{CBB_data, CBB_init, CBB_len, CBS_init, CBS_len, CRYPTO_memcmp, ECDSA_sign,
+ ECDSA_size, ECDSA_verify, EC_GROUP_get_curve_name,
+ EC_GROUP_new_by_curve_name, EC_KEY_generate_key, EC_KEY_get0_group,
+ EC_KEY_marshal_private_key, EC_KEY_parse_private_key, EC_KEY_set_group,
+ EC_curve_nid2nist, ED25519_keypair, ED25519_keypair_from_seed, ED25519_sign,
+ ED25519_verify, ERR_print_errors_cb, EVP_PBE_scrypt, EVP_PKEY_assign_EC_KEY,
+ EVP_PKEY_get1_EC_KEY, EVP_marshal_public_key, EVP_parse_public_key,
+ HMAC_CTX_init, HMAC_Final, HMAC_Init_ex, HMAC_Update, HMAC_size, RAND_bytes,
+ SHA384_Init};
+
+impl CStackWrapper<CBB> {
+ /// Creates a new `CBB` and initializes it with `CBB_init`.
+ ///
+ /// `cbb_new` can only fail due to OOM.
+ #[must_use]
+ pub fn cbb_new(initial_capacity: usize) -> Result<CStackWrapper<CBB>, BoringError> {
+ unsafe {
+ let mut cbb = mem::uninitialized();
+ CBB_init(&mut cbb, initial_capacity)?;
+ Ok(CStackWrapper::new(cbb))
+ }
+ }
+
+ /// Invokes a callback on the contents of a `CBB`.
+ ///
+ /// `cbb_with_data` accepts a callback, and invokes that callback, passing a
+ /// slice of the current contents of this `CBB`.
+ #[must_use]
+ pub fn cbb_with_data<O, F: Fn(&[u8]) -> O>(&self, with_data: F) -> O {
+ unsafe {
+ // NOTE: The return value of CBB_data is only valid until the next
+ // operation on the CBB. This method is safe because the slice
+ // reference cannot outlive this function body, and thus cannot live
+ // beyond another method call that could invalidate the buffer.
+ let len = CBB_len(self.as_const());
+ if len == 0 {
+ // If len is 0, then CBB_data could technically return a null
+ // pointer. Constructing a slice from a null pointer is likely
+ // invalid, so we do this instead.
+ with_data(&[])
+ } else {
+ // Since the length is non-zero, CBB_data should not return a
+ // null pointer.
+ let ptr = CBB_data(self.as_const()).unwrap_abort();
+ // TODO(joshlf): Can with_data use this to smuggle out the
+ // reference, outliving the lifetime of self?
+ with_data(slice::from_raw_parts(ptr.as_ptr(), len))
+ }
+ }
+ }
+}
+
+impl CStackWrapper<CBS> {
+ /// The `CBS_len` function.
+ #[must_use]
+ pub fn cbs_len(&self) -> usize {
+ unsafe { CBS_len(self.as_const()) }
+ }
+
+ /// Invokes a callback on a temporary `CBS`.
+ ///
+ /// `cbs_with_temp_buffer` constructs a `CBS` from the provided byte slice,
+ /// and invokes a callback on the `CBS`. The `CBS` is destructed before
+ /// `cbs_with_temp_buffer` returns.
+ // TODO(joshlf): Holdover until we figure out how to put lifetimes in CStackWrappers.
+ #[must_use]
+ pub fn cbs_with_temp_buffer<O, F: Fn(&mut CStackWrapper<CBS>) -> O>(
+ bytes: &[u8], with_cbs: F,
+ ) -> O {
+ unsafe {
+ let mut cbs = mem::uninitialized();
+ CBS_init(&mut cbs, bytes.as_ptr(), bytes.len());
+ let mut cbs = CStackWrapper::new(cbs);
+ with_cbs(&mut cbs)
+ }
+ }
+}
+
+impl CRef<'static, EC_GROUP> {
+ /// The `EC_GROUP_new_by_curve_name` function.
+ #[must_use]
+ pub fn ec_group_new_by_curve_name(nid: c_int) -> Result<CRef<'static, EC_GROUP>, BoringError> {
+ unsafe { Ok(CRef::new(EC_GROUP_new_by_curve_name(nid)?)) }
+ }
+}
+
+impl<'a> CRef<'a, EC_GROUP> {
+ /// The `EC_GROUP_get_curve_name` function.
+ #[must_use]
+ pub fn ec_group_get_curve_name(&self) -> c_int {
+ unsafe { EC_GROUP_get_curve_name(self.as_const()) }
+ }
+}
+
+/// The `EC_curve_nid2nist` function.
+#[must_use]
+pub fn ec_curve_nid2nist(nid: c_int) -> Result<&'static CStr, BoringError> {
+ unsafe { Ok(CStr::from_ptr(EC_curve_nid2nist(nid)?.as_ptr())) }
+}
+
+impl CHeapWrapper<EC_KEY> {
+ /// The `EC_KEY_generate_key` function.
+ #[must_use]
+ pub fn ec_key_generate_key(&mut self) -> Result<(), BoringError> {
+ unsafe { EC_KEY_generate_key(self.as_mut()) }
+ }
+
+ /// The `EC_KEY_parse_private_key` function.
+ ///
+ /// If `group` is `None`, then the group pointer argument to
+ /// `EC_KEY_parse_private_key` will be NULL.
+ #[must_use]
+ pub fn ec_key_parse_private_key(
+ cbs: &mut CStackWrapper<CBS>, group: Option<CRef<'static, EC_GROUP>>,
+ ) -> Result<CHeapWrapper<EC_KEY>, BoringError> {
+ unsafe {
+ Ok(CHeapWrapper::new_from(EC_KEY_parse_private_key(
+ cbs.as_mut(),
+ group.map(|g| g.as_const()).unwrap_or(ptr::null()),
+ )?))
+ }
+ }
+
+ /// The `EC_KEY_get0_group` function.
+ #[must_use]
+ #[allow(clippy::needless_lifetimes)] // to be more explicit
+ pub fn ec_key_get0_group<'a>(&'a self) -> Result<CRef<'a, EC_GROUP>, BoringError> {
+ // get0 doesn't increment the refcount; the lifetimes ensure that the
+ // returned CRef can't outlive self
+ unsafe { Ok(CRef::new(EC_KEY_get0_group(self.as_const())?)) }
+ }
+
+ /// The `EC_KEY_set_group` function.
+ #[must_use]
+ pub fn ec_key_set_group(&mut self, group: &CRef<'static, EC_GROUP>) -> Result<(), BoringError> {
+ unsafe { EC_KEY_set_group(self.as_mut(), group.as_const()) }
+ }
+
+ /// The `EC_KEY_marshal_private_key` function.
+ #[must_use]
+ pub fn ec_key_marshal_private_key(
+ &self, cbb: &mut CStackWrapper<CBB>,
+ ) -> Result<(), BoringError> {
+ unsafe { EC_KEY_marshal_private_key(cbb.as_mut(), self.as_const(), 0) }
+ }
+}
+
+/// The `ECDSA_sign` function.
+///
+/// `ecdsa_sign` returns the number of bytes written to `sig`.
+///
+/// # Panics
+///
+/// `ecdsa_sign` panics if `sig` is shorter than the minimum required signature
+/// size given by `ecdsa_size`, or if `key` doesn't have a group set.
+#[must_use]
+pub fn ecdsa_sign(
+ digest: &[u8], sig: &mut [u8], key: &CHeapWrapper<EC_KEY>,
+) -> Result<usize, BoringError> {
+ unsafe {
+ // If we call ECDSA_sign with sig.len() < min_size, it will invoke UB.
+ // ECDSA_size fails if the key doesn't have a group set.
+ let min_size = ecdsa_size(key).unwrap_abort();
+ assert_abort!(sig.len() >= min_size.get());
+
+ let mut sig_len: c_uint = 0;
+ ECDSA_sign(
+ 0,
+ digest.as_ptr(),
+ digest.len(),
+ sig.as_mut_ptr(),
+ &mut sig_len,
+ key.as_const(),
+ )?;
+ // ECDSA_sign guarantees that it only needs ECDSA_size bytes for the
+ // signature.
+ assert_abort!(sig_len as usize <= min_size.get());
+ Ok(sig_len as usize)
+ }
+}
+
+/// The `ECDSA_verify` function.
+#[must_use]
+pub fn ecdsa_verify(digest: &[u8], sig: &[u8], key: &CHeapWrapper<EC_KEY>) -> bool {
+ unsafe {
+ ECDSA_verify(
+ 0,
+ digest.as_ptr(),
+ digest.len(),
+ sig.as_ptr(),
+ sig.len(),
+ key.as_const(),
+ )
+ }
+}
+
+/// The `ECDSA_size` function.
+#[must_use]
+pub fn ecdsa_size(key: &CHeapWrapper<EC_KEY>) -> Result<NonZeroUsize, BoringError> {
+ unsafe { ECDSA_size(key.as_const()) }
+}
+
+/// The `ED25519_keypair` function.
+#[must_use]
+pub fn ed25519_keypair() -> [u8; ED25519_PRIVATE_KEY_LEN as usize] {
+ let mut public_unused = [0u8; ED25519_PUBLIC_KEY_LEN as usize];
+ let mut private = [0u8; ED25519_PRIVATE_KEY_LEN as usize];
+ unsafe {
+ ED25519_keypair(
+ (&mut public_unused[..]).as_mut_ptr(),
+ (&mut private[..]).as_mut_ptr(),
+ )
+ };
+ private
+}
+
+/// The `ED25519_sign` function.
+#[must_use]
+pub fn ed25519_sign(message: &[u8], private_key: &[u8; 64]) -> Result<[u8; 64], BoringError> {
+ let mut sig = [0u8; 64];
+ unsafe { ED25519_sign(&mut sig, message.as_ptr(), message.len(), private_key)? };
+ Ok(sig)
+}
+
+/// The `ED25519_keypair_from_seed` function.
+#[must_use]
+pub fn ed25519_keypair_from_seed(seed: &[u8; 32]) -> ([u8; 32], [u8; 64]) {
+ let mut public = [0u8; 32];
+ let mut private = [0u8; 64];
+ unsafe {
+ ED25519_keypair_from_seed(
+ (&mut public[..]).as_mut_ptr(),
+ (&mut private[..]).as_mut_ptr(),
+ (&seed[..]).as_ptr(),
+ )
+ };
+ (public, private)
+}
+
+/// The `ED25519_verify` function.
+#[must_use]
+pub fn ed25519_verify(message: &[u8], signature: &[u8; 64], public_key: &[u8; 32]) -> bool {
+ unsafe { ED25519_verify(message.as_ptr(), message.len(), signature, public_key) }
+}
+
+impl CHeapWrapper<EVP_PKEY> {
+ /// The `EVP_parse_public_key` function.
+ #[must_use]
+ pub fn evp_parse_public_key(
+ cbs: &mut CStackWrapper<CBS>,
+ ) -> Result<CHeapWrapper<EVP_PKEY>, BoringError> {
+ unsafe { Ok(CHeapWrapper::new_from(EVP_parse_public_key(cbs.as_mut())?)) }
+ }
+
+ /// The `EVP_marshal_public_key` function.
+ #[must_use]
+ pub fn evp_marshal_public_key(&self, cbb: &mut CStackWrapper<CBB>) -> Result<(), BoringError> {
+ unsafe { EVP_marshal_public_key(cbb.as_mut(), self.as_const()) }
+ }
+
+ /// The `EVP_PKEY_assign_EC_KEY` function.
+ #[must_use]
+ pub fn evp_pkey_assign_ec_key(&mut self, ec_key: CHeapWrapper<EC_KEY>) {
+ unsafe {
+ // NOTE: It's very important that we use 'into_mut' here so that
+ // ec_key's refcount is not decremented. That's because
+ // EVP_PKEY_assign_EC_KEY doesn't increment the refcount of its
+ // argument.
+ let key = ec_key.into_mut();
+ // EVP_PKEY_assign_EC_KEY only fails if key is NULL.
+ EVP_PKEY_assign_EC_KEY(self.as_mut(), key).unwrap_abort()
+ }
+ }
+
+ /// The `EVP_PKEY_get1_EC_KEY` function.
+ #[must_use]
+ pub fn evp_pkey_get1_ec_key(&mut self) -> Result<CHeapWrapper<EC_KEY>, BoringError> {
+ // NOTE: It's important that we use get1 here, as it increments the
+ // refcount of the EC_KEY before returning a pointer to it.
+ unsafe { Ok(CHeapWrapper::new_from(EVP_PKEY_get1_EC_KEY(self.as_mut())?)) }
+ }
+}
+
+/// The `EVP_PBE_scrypt` function.
+#[allow(non_snake_case)]
+#[must_use]
+pub fn evp_pbe_scrypt(
+ password: &[u8], salt: &[u8], N: u64, r: u64, p: u64, max_mem: usize, out_key: &mut [u8],
+) -> Result<(), BoringError> {
+ unsafe {
+ EVP_PBE_scrypt(
+ password.as_ptr() as *const c_char,
+ password.len(),
+ salt.as_ptr(),
+ salt.len(),
+ N,
+ r,
+ p,
+ max_mem,
+ out_key.as_mut_ptr(),
+ out_key.len(),
+ )
+ }
+}
+
+/// The `PKCS5_PBKDF2_HMAC` function.
+#[cfg(feature = "kdf")]
+#[must_use]
+pub fn pkcs5_pbkdf2_hmac(
+ password: &[u8], salt: &[u8], iterations: c_uint, digest: &CRef<'static, EVP_MD>,
+ out_key: &mut [u8],
+) -> Result<(), BoringError> {
+ unsafe {
+ raw::PKCS5_PBKDF2_HMAC(
+ password.as_ptr() as *const c_char,
+ password.len(),
+ salt.as_ptr(),
+ salt.len(),
+ iterations,
+ digest.as_const(),
+ out_key.len(),
+ out_key.as_mut_ptr(),
+ )
+ }
+}
+
+impl CStackWrapper<SHA512_CTX> {
+ /// Initializes a new `CStackWrapper<SHA512_CTX>` as a SHA-384 hash.
+ ///
+ /// The BoringSSL `SHA512_CTX` is used for both the SHA-512 and SHA-384 hash
+ /// functions. The implementation of `Default` for
+ /// `CStackWrapper<SHA512_CTX>` produces a context initialized for a SHA-512
+ /// hash. In order to produce a context for a SHA-384 hash, use this
+ /// constructor instead.
+ #[must_use]
+ pub fn sha384_new() -> CStackWrapper<SHA512_CTX> {
+ unsafe {
+ let mut ctx = mem::uninitialized();
+ SHA384_Init(&mut ctx);
+ CStackWrapper::new(ctx)
+ }
+ }
+}
+
+macro_rules! impl_evp_digest {
+ (#[$doc:meta] $name:ident, $raw_name:ident) => {
+ #[$doc]
+ #[must_use]
+ pub fn $name() -> CRef<'static, EVP_MD> {
+ unsafe { CRef::new(::boringssl::raw::$raw_name()) }
+ }
+ };
+}
+
+impl CRef<'static, EVP_MD> {
+ impl_evp_digest!(
+ /// The `EVP_sha1` function.
+ evp_sha1,
+ EVP_sha1
+ );
+ impl_evp_digest!(
+ /// The `EVP_sha256` function.
+ evp_sha256,
+ EVP_sha256
+ );
+ impl_evp_digest!(
+ /// The `EVP_sha384` function.
+ evp_sha384,
+ EVP_sha384
+ );
+ impl_evp_digest!(
+ /// The `EVP_sha512` function.
+ evp_sha512,
+ EVP_sha512
+ );
+}
+
+impl CStackWrapper<HMAC_CTX> {
+ /// Initializes a new `HMAC_CTX`.
+ ///
+ /// `hmac_ctx_new` initializes a new `HMAC_CTX` using `HMAC_CTX_init` and
+ /// then further initializes it with `HMAC_CTX_Init_ex`. It can only fail
+ /// due to OOM.
+ #[must_use]
+ pub fn hmac_ctx_new(
+ key: &[u8], md: &CRef<'static, EVP_MD>,
+ ) -> Result<CStackWrapper<HMAC_CTX>, BoringError> {
+ unsafe {
+ let mut ctx = mem::uninitialized();
+ HMAC_CTX_init(&mut ctx);
+ HMAC_Init_ex(
+ &mut ctx,
+ key.as_ptr() as *const c_void,
+ key.len(),
+ md.as_const(),
+ )?;
+ Ok(CStackWrapper::new(ctx))
+ }
+ }
+
+ /// The `HMAC_Update` function.
+ #[must_use]
+ pub fn hmac_update(&mut self, data: &[u8]) {
+ unsafe { HMAC_Update(self.as_mut(), data.as_ptr(), data.len()) }
+ }
+
+ // NOTE(joshlf): We require exactly the right length (as opposed to just
+ // long enough) so that we don't have to have hmac_final return a length.
+
+ /// The `HMAC_Final` function.
+ ///
+ /// # Panics
+ ///
+ /// `hmac_final` panics if `out` is not exactly the right length (as defined
+ /// by `HMAC_size`).
+ #[must_use]
+ pub fn hmac_final(&mut self, out: &mut [u8]) {
+ unsafe {
+ let size = HMAC_size(self.as_const());
+ assert_abort_eq!(out.len(), size);
+ let mut size = 0;
+ // HMAC_Final is documented to fail on allocation failure, but an
+ // internal comment states that it's infallible. In either case, we
+ // want to panic. Normally, for allocation failure, we'd put the
+ // unwrap higher in the stack, but since this is supposed to be
+ // infallible anyway, we put it here.
+ //
+ // TODO(joshlf): Remove this comment once HMAC_Final is documented
+ // as being infallible.
+ HMAC_Final(self.as_mut(), out.as_mut_ptr(), &mut size).unwrap_abort();
+ // Guaranteed to be the value returned by HMAC_size.
+ assert_abort_eq!(out.len(), size as usize);
+ }
+ }
+}
+
+/// Implements `CStackWrapper` for a hash context type.
+///
+/// The caller provides doc comments, a public method name, and a private
+/// function name (from the `raw` module) for an update function and a final
+/// function (e.g., `SHA256_Update` and `SHA256_Final`). Note that, as multiple
+/// impl blocks are allowed for a particular type, the same context type may be
+/// used multiple times. This is useful because both SHA-384 and SHA-512 use the
+/// `SHA512_CTX` context type.
+macro_rules! impl_hash {
+ ($ctx:ident, $digest_len:ident, #[$update_doc:meta] $update:ident, $update_raw:ident, #[$final_doc:meta] $final:ident, $final_raw:ident) => {
+ impl CStackWrapper<$ctx> {
+ #[$update_doc]
+ pub fn $update(&mut self, data: &[u8]) {
+ unsafe {
+ ::boringssl::raw::$update_raw(
+ self.as_mut(),
+ data.as_ptr() as *const c_void,
+ data.len(),
+ )
+ }
+ }
+
+ #[$final_doc]
+ #[must_use]
+ pub fn $final(
+ &mut self,
+ ) -> [u8; ::boringssl::ffi::$digest_len as usize] {
+ unsafe {
+ let mut md: [u8; ::boringssl::ffi::$digest_len as usize] = mem::uninitialized();
+ // SHA1_Final promises to return 1. SHA256_Final,
+ // SHA384_Final, and SHA512_Final all document that they
+ // only fail due to programmer error. The only input to the
+ // function which could cause this is the context. I suspect
+ // that the error condition is that XXX_Final is called
+ // twice without resetting, but I'm not sure. Until we
+ // figure it out, let's err on the side of caution and abort
+ // here.
+ //
+ // TODO(joshlf): Figure out how XXX_Final can fail.
+ ::boringssl::raw::$final_raw((&mut md[..]).as_mut_ptr(), self.as_mut()).unwrap_abort();
+ md
+ }
+ }
+ }
+ };
+ (@doc_string $s:expr) => (#[doc="The `"] #[doc=$s] #[doc="` function."]);
+}
+
+impl_hash!(
+ SHA_CTX,
+ SHA_DIGEST_LENGTH,
+ /// The `SHA1_Update` function.
+ sha1_update,
+ SHA1_Update,
+ /// The `SHA1_Final` function.
+ sha1_final,
+ SHA1_Final
+);
+impl_hash!(
+ SHA256_CTX,
+ SHA256_DIGEST_LENGTH,
+ /// The `SHA256_Update` function.
+ sha256_update,
+ SHA256_Update,
+ /// The `SHA256_Final` function.
+ sha256_final,
+ SHA256_Final
+);
+impl_hash!(
+ SHA512_CTX,
+ SHA384_DIGEST_LENGTH,
+ /// The `SHA384_Update` function.
+ sha384_update,
+ SHA384_Update,
+ /// The `SHA384_Final` function.
+ sha384_final,
+ SHA384_Final
+);
+impl_hash!(
+ SHA512_CTX,
+ SHA512_DIGEST_LENGTH,
+ /// The `SHA512_Update` function.
+ sha512_update,
+ SHA512_Update,
+ /// The `SHA512_Final` function.
+ sha512_final,
+ SHA512_Final
+);
+
+/// The `CRYPTO_memcmp` function.
+///
+/// `crypto_memcmp` first verifies that `a.len() == b.len()` before calling
+/// `CRYPTO_memcmp`.
+#[must_use]
+pub fn crypto_memcmp(a: &[u8], b: &[u8]) -> bool {
+ if a.len() != b.len() {
+ return false;
+ }
+ unsafe {
+ CRYPTO_memcmp(
+ a.as_ptr() as *const c_void,
+ b.as_ptr() as *const c_void,
+ a.len(),
+ ) == 0
+ }
+}
+
+/// The `RAND_bytes` function.
+pub fn rand_bytes(buf: &mut [u8]) {
+ unsafe { RAND_bytes(buf.as_mut_ptr(), buf.len()) }
+}
+
+/// An error generated by BoringSSL.
+///
+/// The `Debug` impl prints a stack trace. Each element of the trace corresponds
+/// to a function within BoringSSL which voluntarily pushed itself onto the
+/// stack. In this sense, it is not the same as a normal stack trace. Each
+/// element of the trace is of the form `[thread id]:error:[error code]:[library
+/// name]:OPENSSL_internal:[reason string]:[file]:[line number]:[optional string
+/// data]`.
+///
+/// The `Display` impl prints the first element of the stack trace.
+///
+/// Some BoringSSL functions do not record any error in the error stack. Errors
+/// generated from such functions are printed as `error calling <function name>`
+/// for both `Debug` and `Display` impls.
+pub struct BoringError {
+ stack_trace: Vec<String>,
+}
+
+impl BoringError {
+ /// Consumes the error stack.
+ ///
+ /// `f` is the name of the function that failed. If the error stack is empty
+ /// (some BoringSSL functions do not push errors onto the stack when
+ /// returning errors), the returned `BoringError` will simply note that the
+ /// named function failed; both the `Debug` and `Display` implementations
+ /// will return `error calling f`, where `f` is the value of the `f`
+ /// argument.
+ #[must_use]
+ fn consume_stack(f: &str) -> BoringError {
+ let stack_trace = {
+ let trace = get_error_stack_trace();
+ if trace.is_empty() {
+ vec![format!("error calling {}", f)]
+ } else {
+ trace
+ }
+ };
+ BoringError { stack_trace }
+ }
+
+ /// The number of frames in the stack trace.
+ ///
+ /// Guaranteed to be at least 1.
+ #[must_use]
+ pub fn stack_depth(&self) -> usize {
+ self.stack_trace.len()
+ }
+}
+
+fn get_error_stack_trace() -> Vec<String> {
+ // Credit to agl@google.com for this implementation.
+
+ unsafe extern "C" fn error_callback(s: *const c_char, s_len: usize, ctx: *mut c_void) -> c_int {
+ let stack_trace = ctx as *mut Vec<String>;
+ let s = ::std::slice::from_raw_parts(s as *const u8, s_len - 1);
+ (*stack_trace).push(String::from_utf8_lossy(s).to_string());
+ 1
+ }
+
+ let mut stack_trace = Vec::new();
+ unsafe {
+ ERR_print_errors_cb(
+ Some(error_callback),
+ &mut stack_trace as *mut _ as *mut c_void,
+ )
+ };
+ stack_trace
+}
+
+impl Display for BoringError {
+ fn fmt(&self, f: &mut Formatter) -> Result<(), fmt::Error> {
+ write!(f, "{}", self.stack_trace[0])
+ }
+}
+
+impl Debug for BoringError {
+ fn fmt(&self, f: &mut Formatter) -> Result<(), fmt::Error> {
+ for elem in &self.stack_trace {
+ writeln!(f, "{}", elem)?;
+ }
+ Ok(())
+ }
+}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+ use util::should_fail;
+
+ #[test]
+ fn test_boring_error() {
+ CStackWrapper::cbs_with_temp_buffer(&[], |cbs| {
+ should_fail(
+ CHeapWrapper::evp_parse_public_key(cbs),
+ "boringssl::EVP_parse_public_key",
+ "public key routines:OPENSSL_internal:DECODE_ERROR",
+ );
+ });
+ }
+}
diff --git a/src/boringssl/raw.rs b/src/boringssl/raw.rs
new file mode 100644
index 0000000..76ea6db
--- /dev/null
+++ b/src/boringssl/raw.rs
@@ -0,0 +1,401 @@
+// Copyright 2018 Google LLC
+//
+// Use of this source code is governed by an MIT-style
+// license that can be found in the LICENSE file or at
+// https://opensource.org/licenses/MIT.
+
+//! Almost-raw bindings to the BoringSSL API.
+//!
+//! The `raw` module provides bindings to the BoringSSL API which add a little
+//! bit of safety beyond the safety provided by completely raw bindings by
+//! ensuring that all return values are checked for errors, and converting these
+//! C-style return values into Rust `Result`s.
+//!
+//! This module also directly re-exports any raw bindings which are infallible
+//! (e.g., `void` functions).
+
+// infallible functions
+pub use boringssl::ffi::{CBB_cleanup, CBB_len, CBS_init, CBS_len, CRYPTO_memcmp,
+ EC_GROUP_get_curve_name, ED25519_keypair, ED25519_keypair_from_seed,
+ ERR_print_errors_cb, HMAC_CTX_init, HMAC_size};
+
+use std::num::NonZeroUsize;
+use std::os::raw::{c_char, c_int, c_uint, c_void};
+use std::ptr::{self, NonNull};
+
+use boringssl::ffi::{self, CBB, CBS, EC_GROUP, EC_KEY, EVP_MD, EVP_PKEY, HMAC_CTX, SHA512_CTX};
+
+use boringssl::wrapper::CInit;
+use boringssl::BoringError;
+
+// bytestring.h
+
+impl_traits!(CBB, CDestruct => CBB_cleanup);
+impl_traits!(CBS, CDestruct => _);
+
+#[allow(non_snake_case)]
+#[must_use]
+pub unsafe fn CBB_init(cbb: *mut CBB, initial_capacity: usize) -> Result<(), BoringError> {
+ one_or_err("CBB_init", ffi::CBB_init(cbb, initial_capacity))
+}
+
+#[allow(non_snake_case)]
+#[must_use]
+pub unsafe fn CBB_data(cbb: *const CBB) -> Result<NonNull<u8>, BoringError> {
+ ptr_or_err("CBB_init", ffi::CBB_data(cbb) as *mut _)
+}
+
+// curve25519.h
+
+#[allow(non_snake_case)]
+#[must_use]
+pub unsafe fn ED25519_sign(
+ out: *mut [u8; 64], message: *const u8, message_len: usize, private_key: *const [u8; 64],
+) -> Result<(), BoringError> {
+ one_or_err(
+ "ED25519_sign",
+ ffi::ED25519_sign(
+ out as *mut u8,
+ message,
+ message_len,
+ private_key as *const u8,
+ ),
+ )
+}
+
+#[allow(non_snake_case)]
+#[must_use]
+pub unsafe fn ED25519_verify(
+ message: *const u8, message_len: usize, signature: *const [u8; 64], public_key: *const [u8; 32],
+) -> bool {
+ match ffi::ED25519_verify(
+ message,
+ message_len,
+ signature as *const u8,
+ public_key as *const u8,
+ ) {
+ 0 => false,
+ 1 => true,
+ // ED25519_verify promises to only return 0 or 1
+ _ => unreachable_abort!(),
+ }
+}
+
+// digest.h
+
+macro_rules! evp_digest {
+ ($name:ident) => {
+ #[allow(non_snake_case)]
+ #[must_use]
+ pub unsafe fn $name() -> NonNull<EVP_MD> {
+ // These return pointers to statically-allocated objects, so should
+ // never fail.
+ use boringssl::abort::UnwrapAbort;
+ ptr_or_err(stringify!($name), ffi::$name() as *mut _).unwrap_abort()
+ }
+ };
+}
+
+evp_digest!(EVP_sha1);
+evp_digest!(EVP_sha256);
+evp_digest!(EVP_sha384);
+evp_digest!(EVP_sha512);
+
+// ec.h
+
+#[allow(non_snake_case)]
+#[must_use]
+pub unsafe fn EC_GROUP_new_by_curve_name(nid: c_int) -> Result<NonNull<EC_GROUP>, BoringError> {
+ ptr_or_err(
+ "EC_GROUP_new_by_curve_name",
+ ffi::EC_GROUP_new_by_curve_name(nid),
+ )
+}
+
+// ec_key.h
+
+impl_traits!(EC_KEY, CNew => EC_KEY_new, CUpRef => EC_KEY_up_ref, CFree => EC_KEY_free);
+impl_traits!(EVP_PKEY, CNew => EVP_PKEY_new, CUpRef => EVP_PKEY_up_ref, CFree => EVP_PKEY_free);
+
+#[allow(non_snake_case)]
+#[must_use]
+pub unsafe fn EC_curve_nid2nist(nid: c_int) -> Result<NonNull<c_char>, BoringError> {
+ ptr_or_err("EC_curve_nid2nist", ffi::EC_curve_nid2nist(nid) as *mut _)
+}
+
+#[allow(non_snake_case)]
+#[must_use]
+pub unsafe fn EC_KEY_generate_key(key: *mut EC_KEY) -> Result<(), BoringError> {
+ one_or_err("EC_KEY_generate_key", ffi::EC_KEY_generate_key(key))
+}
+
+#[allow(non_snake_case)]
+#[must_use]
+pub unsafe fn EC_KEY_get0_group(key: *const EC_KEY) -> Result<NonNull<EC_GROUP>, BoringError> {
+ ptr_or_err("EC_KEY_get0_group", ffi::EC_KEY_get0_group(key) as *mut _)
+}
+
+#[allow(non_snake_case)]
+#[must_use]
+pub unsafe fn EC_KEY_marshal_private_key(
+ cbb: *mut CBB, key: *const EC_KEY, enc_flags: c_uint,
+) -> Result<(), BoringError> {
+ one_or_err(
+ "EC_KEY_marshal_private_key",
+ ffi::EC_KEY_marshal_private_key(cbb, key, enc_flags),
+ )
+}
+
+#[allow(non_snake_case)]
+#[must_use]
+pub unsafe fn EC_KEY_parse_private_key(
+ cbs: *mut CBS, group: *const EC_GROUP,
+) -> Result<NonNull<EC_KEY>, BoringError> {
+ ptr_or_err(
+ "EC_KEY_parse_private_key",
+ ffi::EC_KEY_parse_private_key(cbs, group),
+ )
+}
+
+#[allow(non_snake_case)]
+#[must_use]
+pub unsafe fn EC_KEY_set_group(
+ key: *mut EC_KEY, group: *const EC_GROUP,
+) -> Result<(), BoringError> {
+ one_or_err("EC_KEY_set_group", ffi::EC_KEY_set_group(key, group))
+}
+
+// ecdsa.h
+
+#[allow(non_snake_case)]
+#[must_use]
+pub unsafe fn ECDSA_sign(
+ type_: c_int, digest: *const u8, digest_len: usize, sig: *mut u8, sig_len: *mut c_uint,
+ key: *const EC_KEY,
+) -> Result<(), BoringError> {
+ one_or_err(
+ "ECDSA_sign",
+ ffi::ECDSA_sign(type_, digest, digest_len, sig, sig_len, key),
+ )
+}
+
+#[allow(non_snake_case)]
+#[must_use]
+pub unsafe fn ECDSA_size(key: *const EC_KEY) -> Result<NonZeroUsize, BoringError> {
+ NonZeroUsize::new(ffi::ECDSA_size(key)).ok_or_else(|| BoringError::consume_stack("ECDSA_size"))
+}
+
+#[allow(non_snake_case)]
+#[must_use]
+pub unsafe fn ECDSA_verify(
+ type_: c_int, digest: *const u8, digest_len: usize, sig: *const u8, sig_len: usize,
+ key: *const EC_KEY,
+) -> bool {
+ match ffi::ECDSA_verify(type_, digest, digest_len, sig, sig_len, key) {
+ 1 => true,
+ 0 => false,
+ // ECDSA_verify promises to only return 0 or 1
+ _ => unreachable_abort!(),
+ }
+}
+
+// evp.h
+
+#[allow(non_snake_case)]
+#[must_use]
+pub unsafe fn EVP_marshal_public_key(
+ cbb: *mut CBB, key: *const EVP_PKEY,
+) -> Result<(), BoringError> {
+ one_or_err(
+ "EVP_marshal_public_key",
+ ffi::EVP_marshal_public_key(cbb, key),
+ )
+}
+
+#[allow(non_snake_case)]
+#[must_use]
+pub unsafe fn EVP_parse_public_key(cbs: *mut CBS) -> Result<NonNull<EVP_PKEY>, BoringError> {
+ ptr_or_err("EVP_parse_public_key", ffi::EVP_parse_public_key(cbs))
+}
+
+#[allow(non_snake_case)]
+#[must_use]
+pub unsafe fn EVP_PKEY_assign_EC_KEY(
+ pkey: *mut EVP_PKEY, key: *mut EC_KEY,
+) -> Result<(), BoringError> {
+ one_or_err(
+ "EVP_PKEY_assign_EC_KEY",
+ ffi::EVP_PKEY_assign_EC_KEY(pkey, key),
+ )
+}
+
+#[allow(non_snake_case)]
+#[must_use]
+pub unsafe fn EVP_PKEY_get1_EC_KEY(pkey: *mut EVP_PKEY) -> Result<NonNull<EC_KEY>, BoringError> {
+ ptr_or_err("EVP_PKEY_get1_EC_KEY", ffi::EVP_PKEY_get1_EC_KEY(pkey))
+}
+
+#[allow(non_snake_case)]
+#[allow(clippy::too_many_arguments)]
+#[must_use]
+pub unsafe fn EVP_PBE_scrypt(
+ password: *const c_char, password_len: usize, salt: *const u8, salt_len: usize, N: u64, r: u64,
+ p: u64, max_mem: usize, out_key: *mut u8, key_len: usize,
+) -> Result<(), BoringError> {
+ one_or_err(
+ "EVP_PBE_scrypt",
+ ffi::EVP_PBE_scrypt(
+ password,
+ password_len,
+ salt,
+ salt_len,
+ N,
+ r,
+ p,
+ max_mem,
+ out_key,
+ key_len,
+ ),
+ )
+}
+
+#[cfg(feature = "kdf")]
+#[allow(non_snake_case)]
+#[allow(clippy::too_many_arguments)]
+#[must_use]
+pub unsafe fn PKCS5_PBKDF2_HMAC(
+ password: *const c_char, password_len: usize, salt: *const u8, salt_len: usize,
+ iterations: c_uint, digest: *const EVP_MD, key_len: usize, out_key: *mut u8,
+) -> Result<(), BoringError> {
+ one_or_err(
+ "PKCS5_PBKDF2_HMAC",
+ ffi::PKCS5_PBKDF2_HMAC(
+ password,
+ password_len,
+ salt,
+ salt_len,
+ iterations,
+ digest,
+ key_len,
+ out_key,
+ ),
+ )
+}
+
+// hmac.h
+
+// NOTE: We don't implement CInit because some functions that take an HMAC_CTX
+// pointer have extra invariants beyond simply having called HMAC_CTX_init. If
+// we implemented CInit, then safe code would be able to construct a
+// CStackWrapper<HMAC_CTX> using Default::default, and then pass a pointer to
+// that object to functions that require extra initialization, leading to
+// usoundness.
+impl_traits!(HMAC_CTX, CDestruct => HMAC_CTX_cleanup);
+
+#[allow(non_snake_case)]
+#[must_use]
+pub unsafe fn HMAC_Init_ex(
+ ctx: *mut HMAC_CTX, key: *const c_void, key_len: usize, md: *const EVP_MD,
+) -> Result<(), BoringError> {
+ one_or_err(
+ "HMAC_Init_ex",
+ ffi::HMAC_Init_ex(ctx, key, key_len, md, ptr::null_mut()),
+ )
+}
+
+#[allow(non_snake_case)]
+#[must_use]
+pub unsafe fn HMAC_Update(ctx: *mut HMAC_CTX, data: *const u8, data_len: usize) {
+ // HMAC_Update promises to return 1.
+ assert_abort_eq!(ffi::HMAC_Update(ctx, data, data_len), 1);
+}
+
+#[allow(non_snake_case)]
+#[must_use]
+pub unsafe fn HMAC_Final(
+ ctx: *mut HMAC_CTX, out: *mut u8, out_len: *mut c_uint,
+) -> Result<(), BoringError> {
+ one_or_err("HMAC_Final", ffi::HMAC_Final(ctx, out, out_len))
+}
+
+// rand.h
+
+#[allow(non_snake_case)]
+#[must_use]
+pub unsafe fn RAND_bytes(buf: *mut u8, len: usize) {
+ // RAND_bytes promises to return 1.
+ assert_abort_eq!(ffi::RAND_bytes(buf, len), 1);
+}
+
+// sha.h
+
+#[allow(non_snake_case)]
+#[must_use]
+pub unsafe fn SHA384_Init(ctx: *mut SHA512_CTX) {
+ // SHA384_Init promises to return 1.
+ assert_abort_eq!(ffi::SHA384_Init(ctx), 1);
+}
+
+// Implemented manually (rather than via impl_traits! or c_init!) so that we can
+// assert_abort_eq! that the return value is 1.
+unsafe impl CInit for ffi::SHA_CTX {
+ unsafe fn init(ctx: *mut Self) {
+ // SHA1_Init promises to return 1.
+ assert_abort_eq!(ffi::SHA1_Init(ctx), 1);
+ }
+}
+unsafe impl CInit for ffi::SHA256_CTX {
+ unsafe fn init(ctx: *mut Self) {
+ // SHA256_Init promises to return 1.
+ assert_abort_eq!(ffi::SHA256_Init(ctx), 1);
+ }
+}
+unsafe impl CInit for ffi::SHA512_CTX {
+ unsafe fn init(ctx: *mut Self) {
+ // SHA512_Init promises to return 1.
+ assert_abort_eq!(ffi::SHA512_Init(ctx), 1);
+ }
+}
+
+// implement no-op destructors
+impl_traits!(SHA_CTX, CDestruct => _);
+impl_traits!(SHA256_CTX, CDestruct => _);
+impl_traits!(SHA512_CTX, CDestruct => _);
+
+macro_rules! sha {
+ ($ctx:ident, $update:ident, $final:ident) => {
+ #[allow(non_snake_case)]
+ pub unsafe fn $update(ctx: *mut ffi::$ctx, data: *const c_void, len: usize) {
+ // All XXX_Update functions promise to return 1.
+ assert_abort_eq!(ffi::$update(ctx, data, len), 1);
+ }
+ #[allow(non_snake_case)]
+ pub unsafe fn $final(md: *mut u8, ctx: *mut ffi::$ctx) -> Result<(), BoringError> {
+ one_or_err(stringify!($final), ffi::$final(md, ctx))
+ }
+ };
+}
+
+sha!(SHA_CTX, SHA1_Update, SHA1_Final);
+sha!(SHA256_CTX, SHA256_Update, SHA256_Final);
+sha!(SHA512_CTX, SHA384_Update, SHA384_Final);
+sha!(SHA512_CTX, SHA512_Update, SHA512_Final);
+
+// utility functions
+
+// If code is 1, returns Ok, otherwise returns Err. f should be the name of the
+// function that returned this value.
+#[must_use]
+pub fn one_or_err(f: &str, code: c_int) -> Result<(), BoringError> {
+ if code == 1 {
+ Ok(())
+ } else {
+ Err(BoringError::consume_stack(f))
+ }
+}
+
+// If ptr is non-NULL, returns Ok, otherwise returns Err. f should be the name
+// of the function that returned this value.
+fn ptr_or_err<T>(f: &str, ptr: *mut T) -> Result<NonNull<T>, BoringError> {
+ NonNull::new(ptr).ok_or_else(|| BoringError::consume_stack(f))
+}
diff --git a/src/boringssl/wrapper.rs b/src/boringssl/wrapper.rs
new file mode 100644
index 0000000..2c63130
--- /dev/null
+++ b/src/boringssl/wrapper.rs
@@ -0,0 +1,370 @@
+// Copyright 2018 Google LLC
+//
+// Use of this source code is governed by an MIT-style
+// license that can be found in the LICENSE file or at
+// https://opensource.org/licenses/MIT.
+
+use std::marker::PhantomData;
+use std::mem;
+use std::ptr::NonNull;
+
+/// A trait that can be used to ensure that users of the boringssl module can't
+/// implement a trait.
+///
+/// See the [API Guidelines] for details.
+///
+/// [API Guidelines]: https://rust-lang-nursery.github.io/api-guidelines/future-proofing.html#sealed-traits-protect-against-downstream-implementations-c-sealed
+pub trait Sealed {}
+
+macro_rules! sealed {
+ ($name:ident) => {
+ impl ::boringssl::wrapper::Sealed for ::boringssl::raw::ffi::$name {}
+ };
+}
+
+macro_rules! impl_traits {
+ (@inner $name:ident, CNew => $fn:tt) => {
+ c_new!($name, $fn);
+ };
+ (@inner $name:ident, CUpRef => $fn:tt) => {
+ c_up_ref!($name, $fn);
+ };
+ (@inner $name:ident, CFree => $fn:tt) => {
+ c_free!($name, $fn);
+ };
+ (@inner $name:ident, CInit => $fn:tt) => {
+ c_init!($name, $fn);
+ };
+ (@inner $name:ident, CDestruct => $fn:tt) => {
+ c_destruct!($name, $fn);
+ };
+ (@inner $name:ident, $trait:ident => $fn:tt) => {
+ compile_error!(concat!("unrecognized trait ", stringify!($trait)));
+ };
+ ($name:ident, $($trait:ident => $fn:tt),*) => {
+ sealed!($name);
+ $(impl_traits!(@inner $name, $trait => $fn);)*
+ };
+}
+
+/// A C object from the BoringSSL API which can be allocated and constructed.
+pub unsafe trait CNew: Sealed {
+ /// Returns a new, constructed, heap-allocated object, or NULL on failure.
+ ///
+ /// This should not be called directly; instead, use `new`.
+ #[deprecated = "do not call new_raw directly; instead, call new"]
+ unsafe fn new_raw() -> *mut Self;
+
+ /// Returns a new, constructed, heap-allocated object, or `None` on failure.
+ #[must_use]
+ unsafe fn new() -> Option<NonNull<Self>> {
+ #[allow(deprecated)]
+ NonNull::new(Self::new_raw())
+ }
+}
+
+macro_rules! c_new {
+ ($name:ident, $new:ident) => {
+ unsafe impl ::boringssl::wrapper::CNew for ::boringssl::raw::ffi::$name {
+ unsafe fn new_raw() -> *mut Self {
+ ::boringssl::raw::ffi::$new()
+ }
+ }
+ };
+}
+
+/// A C object from the BoringSSL API which has a reference count that can be
+/// increased.
+pub unsafe trait CUpRef: Sealed {
+ /// Increases an object's reference count.
+ unsafe fn up_ref(slf: *mut Self);
+}
+
+macro_rules! c_up_ref {
+ ($name:ident, $up_ref:ident) => {
+ unsafe impl ::boringssl::wrapper::CUpRef for ::boringssl::raw::ffi::$name {
+ unsafe fn up_ref(slf: *mut Self) {
+ use boringssl::abort::UnwrapAbort;
+ ::boringssl::raw::one_or_err(
+ stringify!($up_ref),
+ ::boringssl::raw::ffi::$up_ref(slf),
+ ).unwrap_abort()
+ }
+ }
+ };
+}
+
+/// A C object from the BoringSSL API which can be freed.
+pub unsafe trait CFree: Sealed {
+ /// Frees a heap-allocated object.
+ ///
+ /// If this is a reference-counted object, `free` decrements the reference
+ /// count, and frees the object if it reaches zero. Otherwise, if this is
+ /// not a reference-counted object, it frees it.
+ unsafe fn free(slf: *mut Self);
+}
+
+macro_rules! c_free {
+ ($name:ident, $free:ident) => {
+ unsafe impl ::boringssl::wrapper::CFree for ::boringssl::raw::ffi::$name {
+ unsafe fn free(slf: *mut Self) {
+ ::boringssl::raw::ffi::$free(slf)
+ }
+ }
+ };
+}
+
+/// A C object from the BoringSSL API which can be initialized.
+pub unsafe trait CInit: Sealed {
+ /// Initializes an uninitialized object.
+ ///
+ /// # Safety
+ ///
+ /// `init` must not be called on an initialized object.
+ unsafe fn init(slf: *mut Self);
+}
+
+#[allow(unused)] // TODO: Remove once it's used in the 'raw' module
+macro_rules! c_init {
+ ($name:ident, $init:ident) => {
+ unsafe impl ::boringssl::wrapper::CInit for ::boringssl::raw::ffi::$name {
+ unsafe fn init(slf: *mut Self) {
+ ::boringssl::raw::ffi::$init(slf)
+ }
+ }
+ };
+}
+
+/// A C object from the BoringSSL API which can be destructed.
+pub unsafe trait CDestruct: Sealed {
+ /// Destructs an initialized object.
+ ///
+ /// # Safety
+ ///
+ /// `slf` must be an initialized object. After a call to `destruct`, `slf`
+ /// is uninitialized.
+ unsafe fn destruct(slf: *mut Self);
+}
+
+macro_rules! c_destruct {
+ ($name:ident, _) => {
+ unsafe impl ::boringssl::wrapper::CDestruct for ::boringssl::raw::ffi::$name {
+ unsafe fn destruct(_slf: *mut Self) {}
+ }
+ };
+ ($name:ident, $destruct:tt) => {
+ unsafe impl ::boringssl::wrapper::CDestruct for ::boringssl::raw::ffi::$name {
+ unsafe fn destruct(slf: *mut Self) {
+ ::boringssl::raw::ffi::$destruct(slf)
+ }
+ }
+ };
+}
+
+/// A wrapper around a pointer to a heap-allocated, constructed C object from
+/// the BoringSSL API.
+///
+/// `CHeapWrapper` maintains the invariant that the object it references is
+/// always allocated and constructed. This means that:
+/// - If the object can be reference counted, `CHeapWrapper` implements `Clone`
+/// by incrementing the reference count, and decrementing on `Drop`.
+/// - If the object cannot be reference counted, `CHeapWrapper` does not
+/// implement `Clone`, but will still free the object on `Drop`.
+///
+/// `CHeapWrapper`s are not thread-safe; they do not implement `Send` or `Sync`.
+pub struct CHeapWrapper<C: CFree> {
+ // NOTE: NonNull ensures that CHeapWrapper is !Send + !Sync. If this struct
+ // is changed, make sure it's still !Send + !Sync.
+ obj: NonNull<C>,
+}
+
+impl<C: CFree> CHeapWrapper<C> {
+ /// Takes ownership of a constructed object.
+ ///
+ /// # Safety
+ ///
+ /// `obj` must point to an allocated, constructed object. The caller must
+ /// ensure that, when the returned `CHeapWrapper` is dropped, it is safe to
+ /// call `C::free` on `obj`. In most cases, this means that the caller
+ /// should not free `obj`, and instead consider ownership of `obj` to have
+ /// transferred to the new `CHeapWrapper`.
+ ///
+ /// The caller must also ensure that no pointers to the object will ever be
+ /// used by other threads so long as this `CHeapWrapper` exists.
+ #[must_use]
+ pub unsafe fn new_from(obj: NonNull<C>) -> CHeapWrapper<C> {
+ CHeapWrapper { obj }
+ }
+
+ #[must_use]
+ pub fn as_mut(&mut self) -> *mut C {
+ self.obj.as_ptr()
+ }
+
+ #[must_use]
+ pub fn as_const(&self) -> *const C {
+ self.obj.as_ptr()
+ }
+
+ /// Consumes this `CHeapWrapper` and return the underlying pointer.
+ ///
+ /// The object will not be freed. Instead, the caller takes logical
+ /// ownership of the object.
+ #[must_use]
+ pub fn into_mut(self) -> *mut C {
+ // NOTE: This method safe for the same reason that mem::forget is safe:
+ // it's equivalent to sending it to a thread that goes to sleep forever
+ // or creating a Rc cycle or some other silly-but-safe behavior.
+ let ptr = self.obj.as_ptr();
+ mem::forget(self);
+ ptr
+ }
+}
+
+impl<C: CNew + CFree> Default for CHeapWrapper<C> {
+ fn default() -> CHeapWrapper<C> {
+ // TODO(joshlf): In order for this to be safe, CNew must provide the
+ // safety guarantee that it's always safe to call CNew::new and then
+ // later to call CFree::free on that object (e.g., see the safety
+ // comment on CStackWrapper::new).
+ unsafe {
+ use boringssl::abort::UnwrapAbort;
+ let obj = C::new().expect_abort("could not allocate object");
+ CHeapWrapper { obj }
+ }
+ }
+}
+
+impl<C: CUpRef + CFree> Clone for CHeapWrapper<C> {
+ fn clone(&self) -> CHeapWrapper<C> {
+ unsafe { C::up_ref(self.obj.as_ptr()) };
+ CHeapWrapper { obj: self.obj }
+ }
+}
+
+impl<C: CFree> Drop for CHeapWrapper<C> {
+ fn drop(&mut self) {
+ unsafe { C::free(self.obj.as_ptr()) };
+ }
+}
+
+/// A wrapper around a pointer to a C object from the BoringSSL API.
+///
+/// Unlike `CHeapWrapper` or `CStackWrapper`, `CRef` does not own the pointed-to
+/// object, but merely borrows it like a normal Rust reference. The only reason
+/// to use `CRef<C>` instead of a `&C` is to make it so that access to the `C`
+/// is unsafe, as `CRef` only exposes a raw pointer accessor for its object.
+///
+/// `CRef` maintains the invariant that the object it references is always
+/// allocated and constructed, and that mutable access to the object is disabled
+/// for the lifetime of the `CRef`.
+pub struct CRef<'a, C> {
+ // NOTE: NonNull ensures that CHeapWrapper is !Send + !Sync. If this struct
+ // is changed, make sure it's still !Send + !Sync.
+ obj: NonNull<C>,
+ // Make sure CRef has the lifetime 'a.
+ _lifetime: PhantomData<&'a ()>,
+}
+
+impl<'a, C> CRef<'a, C> {
+ /// Creates a new `CRef` from a raw pointer.
+ ///
+ /// # Safety
+ ///
+ /// `obj` must point to an allocated, constructed object. The caller must
+ /// ensure that, for the lifetime, `'a`, `obj` will continue to point to the
+ /// same allocated, constructed object, and that mutable access to the
+ /// object will be disallowed.
+ ///
+ /// The caller must also ensure that no other pointers to the object will
+ /// ever be sent to other threads so long as this `CRef` exists.
+ #[must_use]
+ pub unsafe fn new(obj: NonNull<C>) -> CRef<'a, C> {
+ CRef {
+ obj,
+ _lifetime: PhantomData,
+ }
+ }
+
+ #[must_use]
+ pub fn as_const(&self) -> *const C {
+ self.obj.as_ptr()
+ }
+}
+
+/// A wrapper around a constructed C object from the BoringSSL API.
+///
+/// `CStackWrapper` maintains the invariant that the object it contains is
+/// always constructed. The object is destructed on `Drop`.
+///
+/// `CStackWrapper`s are not thread-safe; they do not implement `Send` or
+/// `Sync`.
+pub struct CStackWrapper<C: CDestruct> {
+ obj: C,
+ // Make sure CStackWrapper doesn't implement Send or Sync regardless of C.
+ _no_sync: PhantomData<*mut ()>,
+}
+
+impl<C: CDestruct> CStackWrapper<C> {
+ /// Constructs a new `CStackWrapper`.
+ ///
+ /// # Safety
+ ///
+ /// `obj` must be constructed, and it must be safe for `C::destruct` to be
+ /// called on `obj` when this `CStackWrapper` is dropped.
+ #[must_use]
+ pub unsafe fn new(obj: C) -> CStackWrapper<C> {
+ CStackWrapper {
+ obj,
+ _no_sync: PhantomData,
+ }
+ }
+
+ #[must_use]
+ pub fn as_mut(&mut self) -> *mut C {
+ &mut self.obj
+ }
+
+ #[must_use]
+ pub fn as_const(&self) -> *const C {
+ &self.obj
+ }
+}
+
+impl<C: CInit + CDestruct> Default for CStackWrapper<C> {
+ // TODO(joshlf): In order for this to be safe, CInit must provide the safety
+ // guarantee that it's always safe to call CInit::init and then later to
+ // call CDestruct::destruct on that object (e.g., see the safety comment on
+ // CStackWrapper::new).
+ fn default() -> CStackWrapper<C> {
+ unsafe {
+ let mut obj: C = mem::uninitialized();
+ C::init(&mut obj);
+ CStackWrapper {
+ obj,
+ _no_sync: PhantomData,
+ }
+ }
+ }
+}
+
+impl<C: CDestruct> Drop for CStackWrapper<C> {
+ fn drop(&mut self) {
+ unsafe { C::destruct(&mut self.obj) }
+ }
+}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+ use boringssl::EC_KEY;
+
+ #[test]
+ fn test_heap_wrapper_into_mut() {
+ // Test that CHeapWrapper::into_mut doesn't free the pointer. If it
+ // does, then EC_KEY::free is likely (though not guaranteed) to abort
+ // when it finds the refcount at 0.
+ let key = CHeapWrapper::<EC_KEY>::default();
+ unsafe { EC_KEY::free(key.into_mut()) };
+ }
+}
diff --git a/src/hash.rs b/src/hash.rs
new file mode 100644
index 0000000..39ecef6
--- /dev/null
+++ b/src/hash.rs
@@ -0,0 +1,4389 @@
+// Copyright 2018 Google LLC
+//
+// Use of this source code is governed by an MIT-style
+// license that can be found in the LICENSE file or at
+// https://opensource.org/licenses/MIT.
+
+//! Cryptographic hash functions.
+
+use std::fmt::{self, Debug, Display, Formatter};
+
+use boringssl::{self, CStackWrapper};
+
+pub(crate) mod inner {
+ use boringssl::{CRef, EVP_MD};
+
+ pub trait Hasher {
+ fn evp_md() -> CRef<'static, EVP_MD>;
+ }
+
+ pub trait Digest {
+ /// Returns a digest of all zeroes.
+ ///
+ /// This is not exposed to the user since the all-zeroes digest is only
+ /// useful in implementing this crate (namely, being able to create a
+ /// digest to use as an out buffer), and isn't actually a meaningful
+ /// digest in the sense of being the output of a hash function.
+ fn zero() -> Self;
+
+ /// Returns a reference to the bytes of the digest.
+ ///
+ /// We do this instead of AsRef<[u8]> because the latter would expose
+ /// the as_ref method to the user.
+ ///
+ /// NOTE: This method is only used by signature implementations, and
+ /// should be removed once const generics enable the Digest::bytes
+ /// method to return `[u8; Self::DIGEST_LEN]` rather than an opaque
+ /// associated type.
+ fn as_ref(&self) -> &[u8];
+
+ /// Returns a mutable reference to the bytes of the digest.
+ ///
+ /// We do this instead of AsMut<[u8]> because the latter would expose
+ /// the as_mut method to the user.
+ fn as_mut(&mut self) -> &mut [u8];
+ }
+}
+
+/// A cryptographic hash function.
+#[must_use]
+pub trait Hasher: Default + self::inner::Hasher {
+ /// The output digest.
+ #[must_use]
+ type Digest: Digest;
+
+ /// Adds bytes to the hash.
+ fn update(&mut self, bytes: &[u8]);
+
+ /// Returns the digest of the bytes added so far.
+ #[must_use]
+ fn finish(self) -> Self::Digest;
+
+ /// Computes the hash of a sequence of bytes.
+ ///
+ /// `hash` creates a new instance of this hash function, adds `bytes` to it,
+ /// and then computes the digest.
+ #[must_use]
+ fn hash(bytes: &[u8]) -> Self::Digest {
+ let mut h = Self::default();
+ h.update(bytes);
+ h.finish()
+ }
+}
+
+/// The output of a `Hash`.
+#[must_use]
+pub trait Digest: Eq + PartialEq + Display + Debug + Sized + self::inner::Digest {
+ /// The length in bytes of this digest.
+ const DIGEST_LEN: usize;
+
+ /// The byte array equivalent of this digest.
+ ///
+ /// `Bytes` is guaranteed to be `[u8; DIGEST_LEN]`. Once const generics are
+ /// supported, this type will be removed and replaced with `[u8;
+ /// DIGEST_LEN]`.
+ type Bytes;
+
+ /// Constructs a new digest from bytes.
+ #[must_use]
+ fn from_bytes(bytes: Self::Bytes) -> Self;
+
+ /// Returns the bytes of this digest.
+ #[must_use]
+ fn bytes(&self) -> Self::Bytes;
+}
+
+// NOTE: InsecureSha1 is not publicly available; it is only used in HMAC-SHA1.
+#[cfg(feature = "insecure")]
+#[deprecated(note = "SHA-1 is considered insecure")]
+#[derive(Default)]
+pub(crate) struct InsecureSha1 {
+ ctx: CStackWrapper<boringssl::SHA_CTX>,
+}
+
+#[cfg(feature = "insecure")]
+pub(crate) mod insecure_sha1_digest {
+ use boringssl;
+
+ /// INSECURE: The digest output by the SHA-1 hash function.
+ ///
+ /// # Security
+ ///
+ /// SHA-1 is considered insecure, and should only be used for compatibility
+ /// with legacy applications.
+ #[deprecated(note = "SHA-1 is considered insecure")]
+ pub struct InsecureSha1Digest(pub(crate) [u8; boringssl::SHA_DIGEST_LENGTH as usize]);
+}
+
+/// The SHA-256 hash function.
+#[derive(Default)]
+#[must_use]
+pub struct Sha256 {
+ ctx: CStackWrapper<boringssl::SHA256_CTX>,
+}
+
+impl_debug!(Sha256, "Sha256");
+
+/// The digest output by the SHA-256 hash function.
+#[must_use]
+pub struct Sha256Digest(pub(crate) [u8; boringssl::SHA256_DIGEST_LENGTH as usize]);
+
+/// The SHA-384 hash function.
+#[must_use]
+pub struct Sha384 {
+ ctx: CStackWrapper<boringssl::SHA512_CTX>,
+}
+
+impl_debug!(Sha384, "Sha384");
+
+impl Default for Sha384 {
+ fn default() -> Sha384 {
+ // The Default impl for CStackWrapper<boringssl::SHA512_CTX> initializes
+ // it for a SHA-512 hash. Thus, we have to implement Default manually
+ // instead of deriving Default on Sha384.
+ Sha384 {
+ ctx: CStackWrapper::sha384_new(),
+ }
+ }
+}
+
+/// The digest output by the SHA-384 hash function.
+#[must_use]
+pub struct Sha384Digest(pub(crate) [u8; boringssl::SHA384_DIGEST_LENGTH as usize]);
+
+/// The SHA-512 hash function.
+#[derive(Default)]
+#[must_use]
+pub struct Sha512 {
+ ctx: CStackWrapper<boringssl::SHA512_CTX>,
+}
+
+impl_debug!(Sha512, "Sha512");
+
+/// The digest output by the SHA-512 hash function.
+#[must_use]
+pub struct Sha512Digest(pub(crate) [u8; boringssl::SHA512_DIGEST_LENGTH as usize]);
+
+/// Implements the `Hash` and `Digest` traits.
+///
+/// The caller provides the name of the hash type and the name and byte length
+/// of the digest type. The caller also provides the names of methods on the
+/// hash type's `ctx` field to update and finalize the hash. These correspond
+/// to, e.g., the BoringSSL `SHA256_Update` and `SHA256_Final` functions.
+/// Finally, the caller provides the name of the `CRef` constructor to construct
+/// a `CRef<'static, EVP_MD>` for this hash type.
+///
+/// For the digest type, the traits `PartialEq`, `Eq`, `Display`, and `Debug`
+/// are also implemented.
+macro_rules! impl_hash {
+ ($name:ident, $digest_name:path, $digest_len:path, $update:ident, $final:ident, $evp_md:ident) => {
+ #[allow(deprecated)]
+ impl ::util::Sealed for $name {}
+ #[allow(deprecated)]
+ impl Hasher for $name {
+ type Digest = $digest_name;
+ fn update(&mut self, bytes: &[u8]) {
+ #[allow(deprecated)]
+ self.ctx.$update(bytes);
+ }
+ fn finish(mut self) -> Self::Digest {
+ #[allow(deprecated)]
+ $digest_name(self.ctx.$final())
+ }
+ }
+ #[allow(deprecated)]
+ impl self::inner::Hasher for $name {
+ fn evp_md() -> ::boringssl::CRef<'static, ::boringssl::EVP_MD> {
+ ::boringssl::CRef::$evp_md()
+ }
+ }
+ #[allow(deprecated)]
+ impl self::inner::Digest for $digest_name {
+ fn zero() -> Self {
+ $digest_name([0; $digest_len as usize])
+ }
+ fn as_ref(&self) -> &[u8] {
+ &self.0[..]
+ }
+ fn as_mut(&mut self) -> &mut [u8] {
+ &mut self.0[..]
+ }
+ }
+ #[allow(deprecated)]
+ impl Digest for $digest_name {
+ const DIGEST_LEN: usize = $digest_len as usize;
+ type Bytes = [u8; $digest_len as usize];
+
+ fn from_bytes(bytes: Self::Bytes) -> Self {
+ $digest_name(bytes)
+ }
+ fn bytes(&self) -> Self::Bytes {
+ self.0
+ }
+ }
+ #[allow(deprecated)]
+ impl PartialEq for $digest_name {
+ fn eq(&self, other: &Self) -> bool {
+ boringssl::crypto_memcmp(&self.0, &other.0)
+ }
+ }
+ #[allow(deprecated)]
+ impl Eq for $digest_name {}
+ #[allow(deprecated)]
+ impl Display for $digest_name {
+ fn fmt(&self, f: &mut Formatter) -> Result<(), fmt::Error> {
+ for byte in &self.0[..] {
+ write!(f, "{:x}", byte)?;
+ }
+ Ok(())
+ }
+ }
+ #[allow(deprecated)]
+ impl Debug for $digest_name {
+ fn fmt(&self, f: &mut Formatter) -> Result<(), fmt::Error> {
+ Display::fmt(self, f)
+ }
+ }
+ };
+}
+
+#[cfg(feature = "insecure")]
+impl_hash!(
+ InsecureSha1,
+ self::insecure_sha1_digest::InsecureSha1Digest,
+ boringssl::SHA_DIGEST_LENGTH,
+ sha1_update,
+ sha1_final,
+ evp_sha1
+);
+impl_hash!(
+ Sha256,
+ Sha256Digest,
+ boringssl::SHA256_DIGEST_LENGTH,
+ sha256_update,
+ sha256_final,
+ evp_sha256
+);
+impl_hash!(
+ Sha384,
+ Sha384Digest,
+ boringssl::SHA384_DIGEST_LENGTH,
+ sha384_update,
+ sha384_final,
+ evp_sha384
+);
+impl_hash!(
+ Sha512,
+ Sha512Digest,
+ boringssl::SHA512_DIGEST_LENGTH,
+ sha512_update,
+ sha512_final,
+ evp_sha512
+);
+
+#[cfg(test)]
+mod tests {
+ #[cfg(feature = "insecure")]
+ use super::insecure_sha1_digest::*;
+ use super::*;
+
+ #[test]
+ fn test_constants() {
+ assert_eq!(<Sha256 as Hasher>::Digest::DIGEST_LEN, 32);
+ assert_eq!(<Sha384 as Hasher>::Digest::DIGEST_LEN, 48);
+ assert_eq!(<Sha512 as Hasher>::Digest::DIGEST_LEN, 64);
+
+ assert_eq!(<Sha256 as Hasher>::Digest::DIGEST_LEN, 32);
+ assert_eq!(<Sha384 as Hasher>::Digest::DIGEST_LEN, 48);
+ assert_eq!(<Sha512 as Hasher>::Digest::DIGEST_LEN, 64);
+
+ #[cfg(feature = "insecure")]
+ {
+ #[allow(deprecated)]
+ let len = <InsecureSha1 as Hasher>::Digest::DIGEST_LEN;
+ assert_eq!(len, 20);
+
+ #[allow(deprecated)]
+ let len = InsecureSha1Digest::DIGEST_LEN;
+ assert_eq!(len, 20);
+ }
+ }
+
+ #[test]
+ fn test_hash() {
+ struct TestCase {
+ input: &'static [u8],
+ #[cfg(feature = "insecure")]
+ #[allow(deprecated)]
+ sha1: <InsecureSha1 as Hasher>::Digest,
+ sha256: <Sha256 as Hasher>::Digest,
+ sha384: <Sha384 as Hasher>::Digest,
+ sha512: <Sha512 as Hasher>::Digest,
+ }
+
+ for case in TEST_CASES.iter() {
+ fn test<H: Hasher>(input: &'static [u8], digest: &H::Digest) {
+ let got = H::hash(input);
+ assert_eq!(&got, digest, "input: {:?}", input);
+ // Also use this as an opportunity to test Digest::from_bytes
+ // and Digest::as_ref.
+ assert_eq!(
+ H::Digest::from_bytes(got.bytes()),
+ H::Digest::from_bytes(digest.bytes()),
+ "input: {:?}",
+ input
+ );
+ // Test that adding bytes incrementally works too.
+ let mut hash = H::default();
+ for b in input {
+ hash.update(&[*b]);
+ }
+ assert_eq!(&hash.finish(), digest, "input: {:?}", input);
+ }
+ #[cfg(feature = "insecure")]
+ #[allow(deprecated)]
+ test::<InsecureSha1>(case.input, &case.sha1);
+ test::<Sha256>(case.input, &case.sha256);
+ test::<Sha384>(case.input, &case.sha384);
+ test::<Sha512>(case.input, &case.sha512);
+ }
+
+ macro_rules! test_case {
+ ($input:expr, $sha1:expr, $sha256:expr, $sha384:expr, $sha512:expr) => {
+ #[allow(deprecated)]
+ TestCase {
+ input: &$input,
+ #[cfg(feature = "insecure")]
+ sha1: InsecureSha1Digest($sha1),
+ sha256: Sha256Digest($sha256),
+ sha384: Sha384Digest($sha384),
+ sha512: Sha512Digest($sha512),
+ }
+ };
+ }
+
+ // These test cases were generated using the following script. Each is a
+ // randomly-generated input, with each length between 1 and 128 bytes
+ // represented.
+ //
+ // # Generate 10000 bytes/20000 hex characters of random data
+ // function rand { dd if=/dev/urandom bs=1 count=10000 | hexdump -ve '1/1 "%.2x"'; }
+ //
+ // # Convert hex to raw bytes
+ // function hex_to_bytes { perl -pe 's/([0-9a-f]{2})/chr hex $1/gie'; }
+ //
+ // # Convert hex to a Rust array
+ // function hex_to_array { echo -n "["; while read -n 2 c; do echo -n "0x${c},";
+ // done; echo "]"; }
+ //
+ // # Usage: hash <input-hex> <hash>
+ // function hash { echo -n $(echo -n "$1" | hex_to_bytes | openssl dgst "-${2}" \
+ // | cut -d ' ' -f 1) | hex_to_array; }
+ //
+ // # Only even numbers of hex characters
+ // for i in `seq 2 2 256`; do
+ // INPUT=$(rand 2>/dev/null | head -c $i);
+ // echo 'test_case!'"($(echo -n ${INPUT} | hex_to_array), \
+ // $(hash ${INPUT} sha256), $(hash ${INPUT} sha384), $(hash ${INPUT} sha512)),";
+ // done
+ const TEST_CASES: &[TestCase] = &[
+ test_case!(
+ [0x81,],
+ [
+ 0xa3, 0xf2, 0x94, 0x23, 0x5f, 0xe5, 0x42, 0x20, 0x05, 0xae, 0x9b, 0xc3, 0xa0,
+ 0xd1, 0xbf, 0xfe, 0x12, 0xcf, 0xe3, 0x53,
+ ],
+ [
+ 0x59, 0x1b, 0x7c, 0xc9, 0x50, 0x37, 0x82, 0x2d, 0xec, 0x5a, 0x4d, 0x59, 0x3a,
+ 0x2e, 0x2e, 0x8b, 0x19, 0xc0, 0x7d, 0xdd, 0x25, 0x70, 0xe5, 0x69, 0x90, 0x03,
+ 0xd1, 0x7f, 0x14, 0xc4, 0x40, 0xa6,
+ ],
+ [
+ 0x1f, 0xe1, 0x9e, 0x83, 0xb5, 0x18, 0xc0, 0x34, 0x22, 0x46, 0x83, 0xc9, 0x6c,
+ 0x86, 0x90, 0x8e, 0x49, 0x1c, 0x09, 0x12, 0xdb, 0xfb, 0x2f, 0xb5, 0x10, 0xa2,
+ 0xa3, 0x56, 0xd8, 0xf7, 0xc0, 0x20, 0x0e, 0x16, 0x42, 0xcd, 0x74, 0x61, 0x28,
+ 0x1d, 0x9b, 0xa0, 0x6f, 0x6c, 0x70, 0x18, 0x0a, 0xd6,
+ ],
+ [
+ 0xc8, 0x41, 0x85, 0xc9, 0xa7, 0x89, 0x2e, 0x69, 0x44, 0x20, 0x9f, 0x89, 0xdb,
+ 0x2e, 0xec, 0xf4, 0x5d, 0x62, 0x2c, 0xf4, 0xcf, 0xff, 0x0c, 0xae, 0xb9, 0x2e,
+ 0x79, 0x51, 0xe3, 0x42, 0x54, 0x95, 0xb5, 0x07, 0xd1, 0x0b, 0xec, 0x92, 0x7e,
+ 0xce, 0x25, 0x31, 0xf2, 0x09, 0x58, 0x8f, 0xc6, 0xfa, 0x37, 0x51, 0x9f, 0xcd,
+ 0x82, 0xfa, 0xd4, 0x91, 0x66, 0xfe, 0x46, 0x89, 0x8a, 0x77, 0x73, 0x12,
+ ]
+ ),
+ test_case!(
+ [0xb0, 0x04,],
+ [
+ 0x6c, 0x1a, 0x3e, 0x76, 0xc0, 0xf3, 0x02, 0x1e, 0x96, 0xa8, 0x23, 0x6f, 0xae,
+ 0x9f, 0x61, 0x1d, 0xaa, 0x6a, 0xb9, 0x4f,
+ ],
+ [
+ 0xe8, 0xd9, 0x86, 0xb6, 0x05, 0x45, 0x24, 0xfc, 0x92, 0xe3, 0xac, 0xd6, 0x82,
+ 0x13, 0x76, 0x42, 0xdb, 0x72, 0x63, 0x07, 0x7f, 0xe5, 0xbd, 0x9d, 0x03, 0xa3,
+ 0xc2, 0xd1, 0x02, 0xd9, 0x4e, 0x47,
+ ],
+ [
+ 0xb7, 0xc9, 0xcf, 0x0e, 0xa1, 0xd7, 0x10, 0x1a, 0x23, 0xf2, 0x30, 0x9f, 0x35,
+ 0x89, 0xfd, 0x96, 0x48, 0x3c, 0xdf, 0x3f, 0x92, 0x84, 0x25, 0xbe, 0xf3, 0xb6,
+ 0xdf, 0xdd, 0xa9, 0x53, 0x04, 0xe2, 0x1b, 0x94, 0x05, 0xe7, 0xc2, 0xa4, 0xde,
+ 0x77, 0x0c, 0xea, 0xb2, 0xd1, 0x34, 0x6d, 0x24, 0x7b,
+ ],
+ [
+ 0xeb, 0xe3, 0xe7, 0x18, 0xe7, 0xef, 0xfc, 0xa8, 0x76, 0x4c, 0xd0, 0x6d, 0x64,
+ 0x52, 0xd1, 0x57, 0x6a, 0x2e, 0x2b, 0xcc, 0xc8, 0x53, 0xe2, 0x62, 0x91, 0xfa,
+ 0x8a, 0x8a, 0x9a, 0xf0, 0x7e, 0x3b, 0x56, 0xa1, 0xf9, 0x6e, 0x51, 0xe5, 0x4b,
+ 0x52, 0xc2, 0xfe, 0x48, 0xb8, 0x3d, 0xa7, 0xb9, 0x11, 0xd7, 0x96, 0xa0, 0xa6,
+ 0xf7, 0x61, 0xb3, 0xd9, 0x21, 0x78, 0x48, 0x7f, 0x21, 0x0a, 0xfe, 0x7a,
+ ]
+ ),
+ test_case!(
+ [0xdd, 0x6f, 0x24,],
+ [
+ 0x1b, 0xb4, 0x6d, 0x86, 0xef, 0xb7, 0xc8, 0x0f, 0x38, 0xd1, 0x9b, 0x36, 0xc1,
+ 0xe2, 0x22, 0xa6, 0xee, 0x97, 0x4d, 0x14,
+ ],
+ [
+ 0x69, 0xe1, 0x07, 0x53, 0x8a, 0xb7, 0x44, 0x1c, 0xd0, 0xeb, 0x6a, 0x1f, 0x4f,
+ 0x55, 0xe7, 0x1b, 0xdc, 0x6b, 0x1f, 0xe0, 0xa5, 0xae, 0x16, 0x89, 0x83, 0x29,
+ 0xdc, 0x86, 0x51, 0x1f, 0x03, 0x60,
+ ],
+ [
+ 0xe6, 0x08, 0xf5, 0x30, 0x24, 0x0d, 0x9c, 0xd6, 0x0b, 0x91, 0x58, 0x22, 0x01,
+ 0x88, 0x6c, 0x50, 0x15, 0xef, 0x6f, 0xbc, 0x62, 0x6c, 0x2a, 0xfa, 0xa0, 0x1d,
+ 0xc2, 0xa5, 0xf6, 0x57, 0x9f, 0x35, 0x61, 0x02, 0xa8, 0x2c, 0x07, 0x11, 0x21,
+ 0xf2, 0x10, 0xf9, 0x37, 0x04, 0xdf, 0xe4, 0xa5, 0xa9,
+ ],
+ [
+ 0x08, 0x1a, 0x0f, 0xda, 0xae, 0x84, 0xd5, 0xe1, 0x39, 0xa8, 0xa7, 0xd7, 0x1f,
+ 0xd3, 0xe9, 0x2a, 0x7e, 0x47, 0xd1, 0x5f, 0xe7, 0xf3, 0x16, 0xdc, 0x1b, 0x21,
+ 0x1b, 0xeb, 0xbd, 0xec, 0xbb, 0xf2, 0x3a, 0xfb, 0xda, 0x51, 0x7c, 0xdb, 0x95,
+ 0x87, 0x32, 0xdb, 0x44, 0xfd, 0xce, 0xe9, 0x25, 0xee, 0x85, 0x48, 0x3c, 0x1d,
+ 0x95, 0x60, 0x88, 0xcb, 0x45, 0x30, 0xa9, 0x0e, 0x6b, 0xea, 0x23, 0x6d,
+ ]
+ ),
+ test_case!(
+ [0x5a, 0x37, 0x17, 0x5b,],
+ [
+ 0x06, 0xf9, 0x8e, 0x7e, 0xc1, 0xc6, 0x31, 0x29, 0xef, 0x02, 0x17, 0x93, 0x70,
+ 0x34, 0x3e, 0x8f, 0x17, 0xca, 0xa7, 0x2c,
+ ],
+ [
+ 0xe6, 0x91, 0x73, 0xa1, 0xc0, 0xbb, 0xce, 0xc0, 0x7d, 0xef, 0x7e, 0x20, 0x48,
+ 0x02, 0xf9, 0x96, 0x8f, 0x0b, 0xc6, 0x47, 0x1a, 0x17, 0x84, 0x50, 0x4d, 0xd3,
+ 0xf7, 0x85, 0xe7, 0x4e, 0x83, 0xa7,
+ ],
+ [
+ 0x1a, 0x1b, 0x23, 0x3f, 0x2f, 0x38, 0x91, 0x35, 0x28, 0xfa, 0x8a, 0x64, 0xf6,
+ 0xf7, 0x36, 0x47, 0xf9, 0x84, 0x67, 0x80, 0x83, 0xe8, 0xbd, 0x2b, 0xcd, 0x8d,
+ 0x5f, 0x0b, 0x29, 0xb2, 0x60, 0xba, 0x88, 0x84, 0x54, 0x9a, 0x67, 0xcb, 0x74,
+ 0x02, 0x75, 0xe8, 0xb2, 0xd7, 0xd7, 0x27, 0xa3, 0x72,
+ ],
+ [
+ 0x7f, 0xbc, 0x99, 0xa2, 0xce, 0x12, 0x99, 0x22, 0xf1, 0x8a, 0x46, 0x0f, 0xd8,
+ 0xf4, 0x08, 0x3a, 0xd2, 0xd8, 0x0f, 0x59, 0x99, 0x3f, 0x5a, 0x21, 0xa7, 0xdf,
+ 0xa4, 0x49, 0x94, 0xcf, 0x75, 0x25, 0x4f, 0xc4, 0x6f, 0x57, 0x6a, 0x60, 0xf8,
+ 0x34, 0x2b, 0xdc, 0x17, 0x2b, 0xed, 0xe7, 0x84, 0x5e, 0xa1, 0xb8, 0x5b, 0x49,
+ 0x84, 0xa7, 0x58, 0x03, 0x6e, 0x8e, 0x6b, 0x3b, 0x6d, 0x2f, 0x9d, 0x83,
+ ]
+ ),
+ test_case!(
+ [0x81, 0x30, 0x79, 0xfd, 0xb7,],
+ [
+ 0x56, 0x13, 0xb1, 0x9d, 0x6e, 0x17, 0x88, 0xb7, 0x88, 0xe8, 0xd2, 0x96, 0x3c,
+ 0x94, 0x2e, 0xc8, 0xbe, 0xd5, 0xec, 0x23,
+ ],
+ [
+ 0xb1, 0xd3, 0x71, 0xc8, 0x54, 0x7d, 0x15, 0x4c, 0x0a, 0x73, 0x4f, 0x62, 0x85,
+ 0xa7, 0x2d, 0x20, 0x98, 0xcd, 0xbc, 0x83, 0x0d, 0x54, 0x90, 0xef, 0x72, 0xd2,
+ 0x9f, 0xa2, 0x7f, 0x98, 0x85, 0x93,
+ ],
+ [
+ 0xba, 0xcc, 0x19, 0x8d, 0x5d, 0x03, 0xcb, 0x8e, 0xcb, 0x0b, 0xfb, 0x48, 0x2e,
+ 0x4b, 0xa0, 0x40, 0xef, 0xd5, 0x4a, 0xfc, 0x90, 0xdb, 0x9d, 0xae, 0x88, 0x08,
+ 0x7e, 0x94, 0x04, 0x58, 0x15, 0x74, 0x82, 0x49, 0xbf, 0xee, 0x1f, 0x9a, 0x96,
+ 0xa9, 0x73, 0xb5, 0x21, 0x18, 0xaf, 0x51, 0x8e, 0x5d,
+ ],
+ [
+ 0xba, 0x90, 0x06, 0xe0, 0xc3, 0xc6, 0xd3, 0x94, 0xc5, 0x3d, 0x20, 0x14, 0x91,
+ 0xb3, 0x06, 0x97, 0xfa, 0xe9, 0x5f, 0x99, 0x11, 0x72, 0x79, 0xf1, 0x74, 0x0e,
+ 0xe1, 0x06, 0x6b, 0x60, 0xaa, 0x3f, 0x9c, 0xc7, 0x10, 0xae, 0xf0, 0x05, 0x28,
+ 0xdb, 0x26, 0x60, 0xa9, 0x00, 0xfb, 0xcb, 0x5f, 0x34, 0xbf, 0xd6, 0x4b, 0x15,
+ 0x5f, 0x6a, 0xad, 0xa3, 0xbc, 0x9a, 0x76, 0x8e, 0xef, 0x46, 0x36, 0xd8,
+ ]
+ ),
+ test_case!(
+ [0x70, 0xe4, 0x89, 0xe4, 0x36, 0xf9,],
+ [
+ 0xaf, 0x8f, 0x2c, 0x4e, 0xc2, 0xab, 0x44, 0x5c, 0xfd, 0xd2, 0x00, 0xa4, 0x65,
+ 0x84, 0x53, 0xc3, 0xd8, 0x66, 0x63, 0x1f,
+ ],
+ [
+ 0x7a, 0xb9, 0xd9, 0x45, 0x32, 0xdf, 0xde, 0x31, 0x8b, 0xc2, 0x85, 0xcc, 0xac,
+ 0xcf, 0x84, 0x1e, 0x0a, 0x1c, 0xcb, 0x7b, 0x5b, 0x62, 0x69, 0x40, 0x05, 0xea,
+ 0xfd, 0x44, 0x4e, 0x21, 0x82, 0xf2,
+ ],
+ [
+ 0xcc, 0x71, 0xc7, 0xff, 0x3c, 0xd6, 0xbd, 0x00, 0x31, 0x00, 0xea, 0xeb, 0xbc,
+ 0x05, 0x93, 0x17, 0x43, 0x56, 0xae, 0xe7, 0x54, 0xfc, 0xe6, 0x74, 0x4c, 0x05,
+ 0xba, 0x9e, 0xd2, 0x9c, 0x93, 0xf0, 0x6d, 0x27, 0xbc, 0x2c, 0x5e, 0x7c, 0x60,
+ 0xfb, 0x23, 0xbf, 0x60, 0x72, 0xff, 0xe6, 0xde, 0x64,
+ ],
+ [
+ 0x19, 0x13, 0x01, 0x29, 0xdb, 0x6b, 0xb0, 0xc5, 0x1a, 0x39, 0xb9, 0xa7, 0xfb,
+ 0xf3, 0xa7, 0x3e, 0x74, 0xae, 0x5f, 0x46, 0xfd, 0x0d, 0xda, 0x9e, 0x17, 0xc8,
+ 0xb8, 0xee, 0x36, 0x2b, 0x53, 0x6c, 0x46, 0xcb, 0xc2, 0x72, 0xb4, 0x6c, 0xc7,
+ 0x55, 0xa3, 0x7e, 0x5e, 0x39, 0x37, 0x03, 0x31, 0xf8, 0x31, 0x0f, 0xef, 0xc1,
+ 0x9c, 0x82, 0x91, 0x57, 0x85, 0x3c, 0x8c, 0x8e, 0x0c, 0x83, 0xc3, 0x23,
+ ]
+ ),
+ test_case!(
+ [0x51, 0x0f, 0x6a, 0x5e, 0x95, 0x09, 0x95,],
+ [
+ 0x35, 0x9e, 0x21, 0xea, 0xa5, 0x98, 0x2a, 0x53, 0xcf, 0xcc, 0x3a, 0xbf, 0x65,
+ 0xfb, 0xa5, 0x8a, 0x0f, 0x72, 0x29, 0xa0,
+ ],
+ [
+ 0x2c, 0x7b, 0xd8, 0x76, 0x53, 0xb2, 0x67, 0xfa, 0x35, 0x50, 0xf1, 0x94, 0xf3,
+ 0x65, 0xf8, 0x0f, 0x76, 0x51, 0xfb, 0x41, 0x25, 0xc3, 0xc0, 0x7a, 0xfe, 0x85,
+ 0x58, 0xb9, 0x30, 0xe2, 0x53, 0xc2,
+ ],
+ [
+ 0xd0, 0x70, 0x84, 0x34, 0xe6, 0x5a, 0xf4, 0xb5, 0x66, 0xc8, 0x68, 0x68, 0xac,
+ 0xfd, 0x58, 0x1a, 0xae, 0xe0, 0x68, 0x80, 0xec, 0x2d, 0x5f, 0x22, 0x05, 0x1e,
+ 0xe3, 0x3e, 0x93, 0xb4, 0x72, 0x70, 0x1c, 0xae, 0x21, 0x8b, 0x03, 0xb7, 0x62,
+ 0x1a, 0xf5, 0x0b, 0xe4, 0x02, 0xbf, 0x5b, 0x5c, 0x2b,
+ ],
+ [
+ 0x27, 0x6a, 0x6f, 0xf5, 0xed, 0xdf, 0xd4, 0x79, 0xa3, 0xd7, 0x7e, 0x0f, 0xe0,
+ 0xfe, 0x1a, 0xae, 0xd6, 0x28, 0xf1, 0xb3, 0xe5, 0x0c, 0x7b, 0x82, 0xcb, 0x69,
+ 0x06, 0xb5, 0xed, 0xd0, 0x66, 0x4f, 0xba, 0x38, 0x95, 0x67, 0x20, 0xe0, 0x18,
+ 0xe7, 0xa2, 0x14, 0x14, 0xbf, 0x8d, 0x03, 0xa9, 0x48, 0xf4, 0x44, 0x5f, 0x7d,
+ 0x19, 0xd7, 0x0e, 0xab, 0x01, 0xe2, 0x70, 0xfe, 0x56, 0xea, 0xc0, 0x1d,
+ ]
+ ),
+ test_case!(
+ [0x65, 0x2f, 0xd2, 0x1c, 0x7e, 0x7a, 0xcc, 0x2b,],
+ [
+ 0x28, 0xfe, 0x15, 0xde, 0x85, 0x56, 0xb3, 0xd2, 0xc7, 0x20, 0x45, 0x0a, 0xed,
+ 0x3a, 0x9e, 0x7b, 0x2e, 0x27, 0xe4, 0xab,
+ ],
+ [
+ 0x9c, 0xe7, 0x53, 0x27, 0x12, 0x0b, 0x72, 0x1f, 0xe3, 0x10, 0x60, 0x97, 0x3f,
+ 0x4b, 0xf8, 0x71, 0x77, 0x14, 0x57, 0xa3, 0x40, 0xfd, 0x00, 0xaa, 0x9c, 0x74,
+ 0xc5, 0xfd, 0x17, 0xc5, 0x09, 0xb6,
+ ],
+ [
+ 0xcf, 0xc5, 0x9a, 0x8b, 0xd1, 0xa6, 0x73, 0x5e, 0x40, 0xee, 0xb6, 0x61, 0x1b,
+ 0x0a, 0xb3, 0x16, 0x7e, 0x95, 0xf7, 0x1a, 0xeb, 0x0e, 0x63, 0x2f, 0x56, 0x25,
+ 0x38, 0x89, 0xf4, 0xda, 0x40, 0x9e, 0xda, 0x9b, 0x80, 0x11, 0x4e, 0xb2, 0xf9,
+ 0x76, 0x30, 0x52, 0x50, 0x5e, 0x2a, 0xd0, 0x9d, 0x5f,
+ ],
+ [
+ 0x82, 0xd4, 0x37, 0xbe, 0x30, 0xd7, 0x9e, 0x76, 0xec, 0x99, 0x47, 0x64, 0x06,
+ 0xc0, 0x32, 0x76, 0xdf, 0xeb, 0x5c, 0x72, 0x7e, 0xcd, 0x7d, 0x51, 0x86, 0x87,
+ 0x20, 0xb8, 0xd7, 0x1a, 0x93, 0x0c, 0x25, 0xb2, 0xa5, 0xd2, 0xa1, 0xbe, 0x1f,
+ 0xdc, 0x6b, 0x49, 0x1a, 0x62, 0x37, 0xfe, 0xe6, 0x34, 0x7c, 0x25, 0x3c, 0x2d,
+ 0xc8, 0x22, 0x51, 0x2b, 0x3b, 0x85, 0x6a, 0x77, 0x82, 0xd8, 0xf0, 0xf7,
+ ]
+ ),
+ test_case!(
+ [0x33, 0xde, 0x9a, 0x6f, 0x4b, 0x6e, 0x51, 0x44, 0x3b,],
+ [
+ 0x35, 0x8c, 0x77, 0x96, 0xc5, 0xd5, 0xeb, 0xd6, 0xed, 0x5e, 0x8e, 0x38, 0xa0,
+ 0x3d, 0x73, 0x82, 0xf3, 0x82, 0xc9, 0x62,
+ ],
+ [
+ 0x24, 0x96, 0xf0, 0xeb, 0xe4, 0xc3, 0x93, 0x00, 0xb7, 0xdf, 0xdc, 0xf3, 0xe2,
+ 0xcd, 0x37, 0xd8, 0x5b, 0x2b, 0xf1, 0x93, 0xdb, 0x83, 0xd7, 0x21, 0x98, 0x78,
+ 0xda, 0xb9, 0x7b, 0xb5, 0x82, 0xbb,
+ ],
+ [
+ 0x3c, 0x5d, 0xff, 0x66, 0xfd, 0x9c, 0x53, 0xaa, 0x17, 0x98, 0x7d, 0x72, 0x94,
+ 0xff, 0x93, 0x44, 0xaf, 0x69, 0xd1, 0x56, 0x46, 0x0e, 0x49, 0x2d, 0xe7, 0xe5,
+ 0xa5, 0x99, 0x1f, 0x74, 0xc3, 0xdb, 0xe7, 0x13, 0x5c, 0x10, 0xf1, 0x25, 0xe4,
+ 0xbf, 0xda, 0x72, 0x96, 0xb6, 0x06, 0xb4, 0x48, 0x6b,
+ ],
+ [
+ 0xde, 0xa9, 0x04, 0x76, 0x63, 0x59, 0xaa, 0x33, 0xc0, 0x9c, 0xb8, 0xb2, 0x76,
+ 0x37, 0x47, 0x52, 0x58, 0x71, 0x92, 0xf9, 0xb1, 0x90, 0xed, 0xc1, 0x8d, 0x42,
+ 0x97, 0x98, 0xe1, 0xe0, 0x1b, 0xdb, 0x87, 0x68, 0x6d, 0xd5, 0xea, 0x34, 0x0f,
+ 0xf6, 0x20, 0x8d, 0xa3, 0xbf, 0x6b, 0x27, 0x35, 0xf7, 0x0d, 0x72, 0x93, 0x74,
+ 0xab, 0xcf, 0xe9, 0xfc, 0xec, 0xb8, 0x36, 0x0c, 0x36, 0x75, 0xc0, 0x40,
+ ]
+ ),
+ test_case!(
+ [0x55, 0xc3, 0xd5, 0x66, 0x3c, 0x18, 0x19, 0x5e, 0x95, 0x6b,],
+ [
+ 0x35, 0x63, 0xcf, 0x0a, 0xae, 0xc6, 0x33, 0x1e, 0x46, 0xc4, 0xb3, 0x3c, 0x1c,
+ 0xf3, 0x93, 0x3e, 0xe5, 0x90, 0xa3, 0xc3,
+ ],
+ [
+ 0x05, 0x59, 0xaa, 0x90, 0xe0, 0x7d, 0x27, 0x46, 0x2c, 0x25, 0xc8, 0x82, 0xe4,
+ 0xc9, 0x65, 0xf3, 0x65, 0x9d, 0xdb, 0x25, 0x3e, 0x19, 0x8f, 0x39, 0x54, 0x47,
+ 0x99, 0x40, 0x3b, 0xd6, 0x8b, 0x2d,
+ ],
+ [
+ 0xfe, 0xaf, 0x33, 0xaa, 0x94, 0x65, 0x45, 0xba, 0xf1, 0xb8, 0xee, 0xd2, 0xea,
+ 0xc2, 0x26, 0x1b, 0x87, 0x96, 0x6a, 0xd6, 0x5a, 0x13, 0xa4, 0x82, 0x7a, 0x92,
+ 0xed, 0xd9, 0xa8, 0xe3, 0xbe, 0x12, 0x6e, 0xc5, 0x99, 0xe9, 0xc5, 0x50, 0xea,
+ 0x01, 0xe2, 0x8e, 0xc4, 0xb9, 0x9b, 0x79, 0x9a, 0x10,
+ ],
+ [
+ 0xdf, 0x32, 0xa2, 0x82, 0x4a, 0x6a, 0xfb, 0x64, 0x6e, 0xbb, 0xef, 0xc2, 0xab,
+ 0xeb, 0x7a, 0xac, 0xd1, 0x09, 0x97, 0xe4, 0xcc, 0x3b, 0x22, 0x66, 0x1f, 0x47,
+ 0x9e, 0x9d, 0x87, 0x42, 0xa3, 0x5e, 0x37, 0xd8, 0x6d, 0x83, 0x31, 0x79, 0x96,
+ 0x93, 0x4c, 0x04, 0x5f, 0x3d, 0x75, 0x99, 0x78, 0x71, 0xc3, 0x77, 0x1b, 0x67,
+ 0x2d, 0x15, 0x9a, 0x83, 0x6c, 0xc7, 0x13, 0x83, 0xb1, 0x76, 0xb1, 0x64,
+ ]
+ ),
+ test_case!(
+ [0x2c, 0xb1, 0xc2, 0xeb, 0xac, 0xe0, 0x7a, 0x32, 0x7d, 0xf0, 0x1a,],
+ [
+ 0x9b, 0x8c, 0x27, 0xdc, 0x0d, 0x65, 0xc6, 0x9d, 0xce, 0x21, 0x2c, 0x99, 0x43,
+ 0xb5, 0x75, 0x11, 0x9a, 0x4d, 0x55, 0x5f,
+ ],
+ [
+ 0x5a, 0xbe, 0x3b, 0x6d, 0x5b, 0x4d, 0x9f, 0x70, 0xca, 0x73, 0x66, 0x76, 0x63,
+ 0x86, 0xd0, 0x34, 0x1e, 0xe4, 0xb2, 0xff, 0x4d, 0x57, 0x40, 0xcf, 0xd5, 0x9a,
+ 0x84, 0x22, 0xf2, 0x53, 0x8c, 0x70,
+ ],
+ [
+ 0x80, 0xd2, 0x9c, 0x92, 0x06, 0xfa, 0xc9, 0x06, 0xa0, 0xf1, 0x78, 0x7b, 0xe8,
+ 0x34, 0x65, 0xdf, 0x22, 0xec, 0xaf, 0x11, 0x3b, 0x88, 0x17, 0xba, 0x89, 0x83,
+ 0xe5, 0x71, 0x49, 0xd8, 0xa1, 0xdd, 0x3e, 0xb4, 0xa6, 0xcc, 0x90, 0xa7, 0xbe,
+ 0xad, 0xd0, 0xcb, 0x65, 0x53, 0xd5, 0x56, 0x39, 0x6f,
+ ],
+ [
+ 0x21, 0x7f, 0x8e, 0xe2, 0x16, 0x05, 0x96, 0xd0, 0xd7, 0x12, 0x5d, 0xd2, 0x91,
+ 0x5d, 0xb9, 0xfd, 0x54, 0xac, 0x3d, 0xb3, 0x1e, 0x40, 0x0c, 0x29, 0xc5, 0x43,
+ 0x0b, 0xbd, 0x6b, 0x25, 0x82, 0x40, 0x0b, 0x05, 0xff, 0x73, 0xf3, 0xa3, 0x6d,
+ 0x75, 0xdd, 0xc2, 0xdf, 0x17, 0xb9, 0x45, 0xd4, 0x82, 0x26, 0x7a, 0x56, 0xe3,
+ 0xf0, 0x60, 0xe1, 0xe0, 0x54, 0x64, 0x34, 0x71, 0x32, 0x6d, 0x04, 0xcd,
+ ]
+ ),
+ test_case!(
+ [0x34, 0x3f, 0x7c, 0x83, 0x97, 0x7a, 0xd7, 0x5e, 0x19, 0x84, 0x99, 0xe2,],
+ [
+ 0xd7, 0xdb, 0xef, 0x4a, 0xb6, 0x0e, 0x3a, 0x0a, 0xda, 0x14, 0x07, 0x50, 0xde,
+ 0xde, 0x23, 0xa6, 0xe1, 0x23, 0x96, 0x6d,
+ ],
+ [
+ 0x2b, 0x7a, 0x77, 0x7b, 0x16, 0x52, 0x05, 0x7e, 0x9d, 0x0e, 0x31, 0x84, 0xf3,
+ 0x61, 0x43, 0x12, 0xd8, 0x6f, 0x65, 0xaa, 0xcc, 0x49, 0x53, 0xab, 0xa4, 0x26,
+ 0xd7, 0xf8, 0x4c, 0xfd, 0x90, 0x15,
+ ],
+ [
+ 0x09, 0x7f, 0x80, 0x2a, 0xa2, 0xef, 0x2e, 0x1d, 0xce, 0xa0, 0x0e, 0x20, 0xde,
+ 0xe4, 0xe7, 0xd0, 0xa1, 0x85, 0x07, 0x7b, 0xec, 0x60, 0xeb, 0xe8, 0x23, 0x9a,
+ 0x15, 0x0d, 0x7c, 0x37, 0x19, 0x66, 0x73, 0x75, 0x2a, 0x42, 0x31, 0x8e, 0x13,
+ 0xe5, 0x13, 0x6c, 0xdf, 0x17, 0xde, 0x71, 0x2d, 0x29,
+ ],
+ [
+ 0xb6, 0x64, 0xf9, 0x86, 0xbd, 0xd6, 0xa4, 0xda, 0x34, 0xcc, 0xcb, 0xbf, 0xc9,
+ 0xa8, 0x50, 0x1b, 0xa6, 0xee, 0x3a, 0xd4, 0xa8, 0x6a, 0x29, 0x4d, 0xe7, 0xd4,
+ 0xcb, 0x01, 0x31, 0x9e, 0xa9, 0x05, 0x36, 0x78, 0x6d, 0x79, 0xa0, 0xb3, 0xb1,
+ 0x02, 0x12, 0x78, 0x2e, 0x4a, 0x98, 0x02, 0x50, 0x62, 0xe1, 0xac, 0x0a, 0x28,
+ 0x90, 0x2e, 0xb4, 0x1b, 0xb2, 0xad, 0x0c, 0x38, 0x82, 0x5e, 0xde, 0x51,
+ ]
+ ),
+ test_case!(
+ [0xf6, 0x15, 0xa0, 0x82, 0x3c, 0x18, 0x48, 0x01, 0xd6, 0xd1, 0xa9, 0x67, 0xa4,],
+ [
+ 0x46, 0x63, 0xa6, 0xcb, 0xab, 0xca, 0xd9, 0x28, 0x72, 0xee, 0x87, 0xa2, 0x39,
+ 0xab, 0x8d, 0x47, 0x49, 0x7f, 0x06, 0x38,
+ ],
+ [
+ 0xf5, 0x57, 0xec, 0x18, 0xa9, 0xbe, 0x7d, 0x44, 0xef, 0xff, 0xf6, 0xcd, 0xab,
+ 0x40, 0x30, 0x5c, 0x98, 0x5c, 0x0e, 0x38, 0xe6, 0x1b, 0xac, 0x9d, 0xee, 0x51,
+ 0x24, 0x4e, 0xc1, 0xa6, 0x23, 0x0d,
+ ],
+ [
+ 0xb7, 0x50, 0x8e, 0x49, 0x45, 0x53, 0x76, 0x6a, 0x46, 0xbd, 0x0f, 0x08, 0xea,
+ 0xa2, 0x15, 0x68, 0x59, 0xa3, 0x34, 0x25, 0x7a, 0x59, 0xbe, 0xa9, 0x0a, 0xf0,
+ 0xe7, 0x8c, 0xe8, 0xd2, 0x95, 0xd5, 0xfc, 0x96, 0xdd, 0x07, 0x1b, 0xde, 0x38,
+ 0x2c, 0xae, 0xbc, 0xae, 0x84, 0xe3, 0xa1, 0x69, 0xdf,
+ ],
+ [
+ 0x68, 0xe9, 0xfd, 0xec, 0x46, 0x65, 0xc0, 0xdd, 0x3b, 0x88, 0x62, 0xc7, 0x3e,
+ 0x77, 0xee, 0xb3, 0xd4, 0x57, 0x7f, 0xb7, 0x65, 0x01, 0xe0, 0xeb, 0xa7, 0x55,
+ 0xbb, 0x98, 0xca, 0x4d, 0x1f, 0xe8, 0x22, 0xaf, 0x04, 0x8e, 0xdb, 0x8f, 0xd3,
+ 0x7c, 0x06, 0x3a, 0xcb, 0x49, 0x2f, 0xbf, 0xd5, 0x3d, 0x51, 0x3d, 0xb5, 0x50,
+ 0xbb, 0x26, 0xc8, 0x14, 0xd2, 0x62, 0x58, 0xb6, 0xe4, 0x1f, 0x39, 0x5f,
+ ]
+ ),
+ test_case!(
+ [
+ 0xa7, 0xb5, 0x09, 0x64, 0x25, 0xf8, 0x20, 0xd0, 0x8a, 0xb9, 0x3c, 0xf8, 0x7c,
+ 0x8d,
+ ],
+ [
+ 0x6c, 0xe1, 0x00, 0x85, 0x8d, 0x28, 0x61, 0x8f, 0x62, 0x7b, 0xfb, 0x3e, 0xe6,
+ 0x4f, 0x0c, 0xdb, 0x50, 0xcb, 0xef, 0xc1,
+ ],
+ [
+ 0x49, 0x2a, 0x83, 0xb0, 0xaf, 0xf8, 0x83, 0x08, 0x43, 0xdc, 0x6f, 0xbe, 0x8b,
+ 0x14, 0xf7, 0x69, 0xad, 0x6b, 0x72, 0x97, 0x8f, 0xb9, 0xf8, 0xf5, 0x0a, 0x0e,
+ 0xb0, 0x1b, 0x99, 0x80, 0x3b, 0xb2,
+ ],
+ [
+ 0xb3, 0x17, 0x37, 0x7d, 0x75, 0xde, 0xc7, 0x19, 0x6a, 0x56, 0xca, 0xe0, 0x37,
+ 0xa8, 0xd3, 0x08, 0xca, 0x04, 0x0e, 0x85, 0x14, 0x62, 0x1d, 0x6a, 0xe9, 0xfb,
+ 0x80, 0xf0, 0x8d, 0x0d, 0xc0, 0x89, 0x11, 0xef, 0xf0, 0x7a, 0xb8, 0x0f, 0x50,
+ 0x02, 0x5c, 0xf5, 0xc9, 0x62, 0x4a, 0x94, 0x9b, 0x0f,
+ ],
+ [
+ 0x6d, 0xfc, 0x8f, 0x27, 0x92, 0x80, 0x09, 0x39, 0x32, 0xf1, 0x8d, 0x2f, 0xd9,
+ 0x8b, 0x8b, 0xa2, 0x53, 0x1c, 0x3e, 0x8b, 0x72, 0xb3, 0x55, 0xaa, 0x3b, 0x68,
+ 0xe7, 0x63, 0x6e, 0xbc, 0x03, 0xa7, 0x3f, 0x2e, 0xc2, 0x6c, 0x60, 0xae, 0xab,
+ 0x9d, 0xab, 0xfd, 0x3e, 0x05, 0x43, 0x9f, 0xaf, 0xd5, 0xf6, 0x3b, 0x75, 0xc6,
+ 0x72, 0xf5, 0x5e, 0x23, 0x55, 0x2d, 0x97, 0x26, 0xb6, 0xf3, 0x85, 0xe7,
+ ]
+ ),
+ test_case!(
+ [
+ 0xd5, 0x74, 0x8a, 0xd1, 0xa3, 0x93, 0xd0, 0x09, 0xfb, 0xed, 0xee, 0x43, 0x7a,
+ 0x50, 0x49,
+ ],
+ [
+ 0x13, 0x97, 0x62, 0x02, 0xbc, 0xc5, 0x6b, 0xd4, 0x33, 0xba, 0xca, 0x0e, 0xd6,
+ 0xa5, 0x47, 0x45, 0x4c, 0x9b, 0x06, 0xda,
+ ],
+ [
+ 0xed, 0xdf, 0x3b, 0x8b, 0x62, 0x2f, 0xda, 0x42, 0x14, 0x86, 0x71, 0xe6, 0x86,
+ 0xac, 0x56, 0xd6, 0x91, 0x99, 0x4d, 0x88, 0x1c, 0x09, 0xf1, 0x2b, 0x73, 0x79,
+ 0x5f, 0x1b, 0x63, 0xf6, 0x86, 0xfe,
+ ],
+ [
+ 0xa6, 0xeb, 0x40, 0xdc, 0x71, 0x9c, 0x20, 0xfb, 0xaa, 0x61, 0x16, 0xcd, 0x94,
+ 0xff, 0x9f, 0x60, 0x69, 0xfa, 0xee, 0x03, 0xb2, 0x1c, 0x1e, 0x59, 0xb0, 0xdd,
+ 0xff, 0xd7, 0x15, 0x45, 0xf2, 0x29, 0x24, 0x9d, 0x3e, 0x76, 0xc7, 0xf7, 0xd5,
+ 0x1d, 0xef, 0x9f, 0xc1, 0x78, 0x4e, 0x0a, 0xe7, 0xae,
+ ],
+ [
+ 0x00, 0x0d, 0xfa, 0x4c, 0xb8, 0x07, 0x25, 0x75, 0x2f, 0x58, 0x50, 0xcc, 0x72,
+ 0xef, 0x10, 0x87, 0x28, 0xee, 0x6b, 0xb1, 0xe7, 0xe4, 0xe4, 0xfd, 0xeb, 0xd8,
+ 0xe8, 0xb9, 0x6b, 0xab, 0x92, 0xa8, 0x32, 0x1b, 0xb7, 0x55, 0x3b, 0x30, 0xc5,
+ 0x98, 0x97, 0x32, 0xea, 0xf2, 0x76, 0x84, 0x0b, 0x68, 0x32, 0xf8, 0x99, 0xcb,
+ 0x47, 0x63, 0x4b, 0x13, 0x16, 0x2c, 0x30, 0x13, 0xd3, 0x59, 0x93, 0xb0,
+ ]
+ ),
+ test_case!(
+ [
+ 0x65, 0x2e, 0x60, 0xa1, 0x3d, 0xbf, 0x8e, 0xdb, 0x65, 0xc5, 0xd3, 0xce, 0x24,
+ 0xa8, 0x28, 0xbd,
+ ],
+ [
+ 0xbe, 0x60, 0xc7, 0x04, 0xdd, 0x57, 0xf6, 0x42, 0xff, 0x59, 0x95, 0xba, 0xc6,
+ 0xdf, 0x42, 0x29, 0x86, 0xcb, 0x4d, 0x21,
+ ],
+ [
+ 0x10, 0xa8, 0x99, 0xd3, 0x86, 0xea, 0xcb, 0xed, 0x95, 0x9f, 0x72, 0xac, 0x68,
+ 0xfb, 0x0c, 0x5b, 0x9f, 0x09, 0xf5, 0x3c, 0x57, 0xac, 0xe1, 0x2c, 0xe3, 0x1c,
+ 0xc0, 0x2e, 0x48, 0x39, 0x8f, 0x6a,
+ ],
+ [
+ 0x2b, 0x80, 0xe6, 0xe2, 0xf7, 0x09, 0x59, 0xd1, 0xb6, 0x48, 0x07, 0x5b, 0x5b,
+ 0x30, 0x10, 0xb3, 0x49, 0xe2, 0xce, 0xf1, 0x13, 0x4d, 0x98, 0x4c, 0x3b, 0x83,
+ 0x93, 0xee, 0xb8, 0x4e, 0x10, 0x8a, 0xdd, 0x03, 0x2b, 0xaf, 0x5a, 0x2f, 0xe3,
+ 0x15, 0x35, 0xda, 0x7e, 0x9d, 0x14, 0xba, 0xbb, 0x77,
+ ],
+ [
+ 0xc7, 0x3b, 0x61, 0xca, 0x99, 0xde, 0x4f, 0x17, 0x62, 0x51, 0xde, 0x80, 0x50,
+ 0xf9, 0x14, 0x11, 0x4d, 0xff, 0xa1, 0x84, 0x54, 0x2d, 0x89, 0xb4, 0x63, 0xda,
+ 0xfe, 0x25, 0x54, 0x91, 0x2d, 0xa9, 0xd9, 0xed, 0xd1, 0x33, 0xab, 0xea, 0xc9,
+ 0x06, 0xa7, 0x72, 0xb2, 0x80, 0x8b, 0xb2, 0x7a, 0x36, 0x60, 0x7d, 0xa9, 0x20,
+ 0x0b, 0x41, 0xfa, 0x68, 0xca, 0x2c, 0x80, 0x3a, 0x77, 0x5b, 0x22, 0x14,
+ ]
+ ),
+ test_case!(
+ [
+ 0x9a, 0x7e, 0x4b, 0x4e, 0xe6, 0x80, 0xf6, 0x36, 0xa8, 0xf8, 0x71, 0xcd, 0xae,
+ 0xb8, 0xf9, 0xae, 0x23,
+ ],
+ [
+ 0x7b, 0x32, 0xd0, 0x64, 0x68, 0x02, 0xc8, 0x4f, 0x41, 0xaa, 0xfc, 0xb2, 0xfc,
+ 0xbe, 0xed, 0x2a, 0xee, 0x93, 0x3f, 0x4f,
+ ],
+ [
+ 0xea, 0x34, 0xbc, 0xd7, 0x7d, 0x84, 0xf3, 0x7f, 0x2f, 0x84, 0xeb, 0x04, 0xc9,
+ 0x00, 0xde, 0xd8, 0x5f, 0xd6, 0x4d, 0xbb, 0xc5, 0xed, 0x3c, 0x1f, 0x4d, 0x8e,
+ 0x77, 0x1e, 0xbb, 0xb5, 0x5c, 0xde,
+ ],
+ [
+ 0xbe, 0x9a, 0x02, 0x3d, 0xa1, 0x3f, 0x26, 0xbb, 0x6d, 0xab, 0x4f, 0x57, 0xaa,
+ 0x90, 0x12, 0x2b, 0x10, 0x6f, 0xbc, 0x8c, 0xf8, 0xfb, 0x7b, 0x6a, 0x74, 0x1a,
+ 0xd7, 0xb4, 0xeb, 0x43, 0x12, 0x72, 0xb1, 0xec, 0x59, 0xdd, 0xe1, 0xda, 0x15,
+ 0x6f, 0xc3, 0x93, 0x04, 0xfb, 0xd0, 0x78, 0x61, 0x94,
+ ],
+ [
+ 0xff, 0xda, 0x37, 0x32, 0x14, 0x3f, 0x97, 0x6f, 0xac, 0x64, 0x75, 0xb4, 0x8c,
+ 0x9c, 0xd9, 0x16, 0x87, 0x70, 0xd4, 0x27, 0xe9, 0x8e, 0x27, 0x2e, 0x7c, 0x08,
+ 0xc2, 0x21, 0x8c, 0xfe, 0x22, 0x5c, 0x39, 0xf0, 0x6c, 0x2a, 0x1d, 0x7e, 0x3e,
+ 0xa8, 0xeb, 0x39, 0xd2, 0xcd, 0x78, 0x8d, 0x2f, 0x6d, 0x13, 0xee, 0x16, 0x31,
+ 0x46, 0x06, 0xf0, 0xf2, 0x5b, 0x03, 0xc7, 0x11, 0xec, 0x33, 0x59, 0xd8,
+ ]
+ ),
+ test_case!(
+ [
+ 0xe4, 0x20, 0x5c, 0x7c, 0x8e, 0x25, 0x00, 0xc4, 0x3e, 0x8b, 0xfb, 0x19, 0x68,
+ 0x63, 0xa6, 0x2e, 0xc7, 0x23,
+ ],
+ [
+ 0xaa, 0x6c, 0xb1, 0x6b, 0xf8, 0x21, 0x74, 0x19, 0x9e, 0x96, 0xf6, 0xbd, 0xc5,
+ 0xad, 0x67, 0x5d, 0x06, 0x09, 0x3b, 0x28,
+ ],
+ [
+ 0x88, 0x49, 0x1d, 0xec, 0x62, 0x4e, 0x51, 0xad, 0xd9, 0xc0, 0xce, 0xf3, 0x7c,
+ 0x99, 0x98, 0x43, 0x5d, 0x04, 0x7c, 0xdf, 0xa2, 0x3e, 0x22, 0xbf, 0x34, 0x2a,
+ 0x66, 0x77, 0xe0, 0x19, 0x2f, 0xe5,
+ ],
+ [
+ 0x10, 0x59, 0xba, 0x48, 0x0e, 0xfd, 0xc0, 0x69, 0x20, 0x52, 0xe1, 0xa5, 0xe8,
+ 0xf3, 0xa6, 0x69, 0x88, 0xb6, 0x35, 0xd7, 0x2d, 0x14, 0x42, 0x87, 0x25, 0x1e,
+ 0x02, 0xfe, 0xbe, 0x58, 0x43, 0x36, 0xdc, 0xe7, 0xfd, 0xfd, 0x0f, 0x2a, 0x39,
+ 0x13, 0x60, 0x39, 0xad, 0xd8, 0x38, 0x13, 0x5d, 0x6c,
+ ],
+ [
+ 0xa9, 0x01, 0xf4, 0xc6, 0xe9, 0x6c, 0x8e, 0x76, 0xd1, 0xcb, 0xfa, 0x50, 0xa6,
+ 0x24, 0x8a, 0x0f, 0xdf, 0x64, 0x0e, 0xda, 0xc4, 0xf0, 0x79, 0xf0, 0x46, 0xaa,
+ 0x63, 0xc7, 0x8c, 0xf3, 0xce, 0xe1, 0x28, 0x7b, 0x03, 0x63, 0x47, 0xd4, 0x40,
+ 0xf8, 0x1f, 0x38, 0x09, 0x06, 0xd5, 0x86, 0x80, 0x21, 0x2a, 0x4d, 0x9d, 0x27,
+ 0xbf, 0xbf, 0xbe, 0x4e, 0x6c, 0x37, 0x5e, 0x89, 0xfa, 0x41, 0xe4, 0xe7,
+ ]
+ ),
+ test_case!(
+ [
+ 0x57, 0xc3, 0x48, 0x43, 0x9a, 0x40, 0xb4, 0x4a, 0x06, 0xff, 0x22, 0x1d, 0x90,
+ 0xed, 0x22, 0xa4, 0x8a, 0x03, 0x21,
+ ],
+ [
+ 0xd2, 0x4b, 0x43, 0xd6, 0x06, 0x63, 0x34, 0xf6, 0xf8, 0x2c, 0x5f, 0xca, 0xd2,
+ 0x85, 0x53, 0xa5, 0xed, 0x8a, 0x51, 0xec,
+ ],
+ [
+ 0xcd, 0x99, 0x4a, 0x59, 0x55, 0xff, 0x36, 0x74, 0xe5, 0xbe, 0x99, 0xd2, 0x32,
+ 0x63, 0x6e, 0x93, 0x57, 0xf1, 0xad, 0x7c, 0x68, 0x5a, 0x54, 0xdb, 0xce, 0x62,
+ 0xe7, 0xd8, 0xa0, 0x64, 0xbb, 0xed,
+ ],
+ [
+ 0xf2, 0x0d, 0x8e, 0x2a, 0x00, 0x38, 0xfc, 0x4e, 0xaa, 0xcb, 0x70, 0xe0, 0xcd,
+ 0xc8, 0x37, 0x5b, 0x35, 0x62, 0x4b, 0x65, 0xa5, 0xfc, 0x57, 0x52, 0xa1, 0x48,
+ 0x54, 0xd2, 0x56, 0x73, 0x43, 0xad, 0xac, 0xfd, 0xda, 0x3f, 0xa6, 0x00, 0x1c,
+ 0x46, 0x4a, 0xad, 0xea, 0x1e, 0x79, 0x73, 0x03, 0x05,
+ ],
+ [
+ 0x1e, 0x60, 0x4f, 0x67, 0xd6, 0xb4, 0xf5, 0x79, 0x4a, 0x5d, 0x8f, 0x81, 0x82,
+ 0xe1, 0x2a, 0x98, 0x00, 0x31, 0x3a, 0x2a, 0x5c, 0x1f, 0xc0, 0x21, 0xc8, 0xc2,
+ 0x6d, 0x89, 0x94, 0x2e, 0x91, 0x59, 0x8d, 0x58, 0x71, 0x82, 0x11, 0xc8, 0xc2,
+ 0x32, 0x42, 0x75, 0xcb, 0x18, 0x57, 0x1c, 0x1a, 0x77, 0x87, 0x0a, 0x60, 0xe6,
+ 0xbc, 0x89, 0xc6, 0x8e, 0x2f, 0x5d, 0x81, 0x51, 0xeb, 0xbb, 0x1f, 0x2d,
+ ]
+ ),
+ test_case!(
+ [
+ 0x07, 0x88, 0x5e, 0xe1, 0x7d, 0x31, 0x35, 0x5a, 0x13, 0xa8, 0x36, 0xac, 0xd1,
+ 0x95, 0xff, 0x0b, 0x99, 0x22, 0x5c, 0x2a,
+ ],
+ [
+ 0x05, 0xf0, 0x1f, 0xea, 0x63, 0xd9, 0x27, 0x6d, 0xa4, 0x19, 0xce, 0xaa, 0xad,
+ 0x29, 0xbd, 0x95, 0xd7, 0x51, 0x1e, 0xde,
+ ],
+ [
+ 0xb5, 0x3d, 0x9d, 0x4d, 0x15, 0x6b, 0xa6, 0xf6, 0x30, 0x69, 0x3b, 0xfd, 0xe1,
+ 0x6f, 0x4d, 0x8b, 0xe7, 0xa6, 0xc8, 0x35, 0x6f, 0xbc, 0x38, 0xb4, 0x43, 0x99,
+ 0x55, 0xef, 0x56, 0x9e, 0xce, 0x5a,
+ ],
+ [
+ 0xc7, 0x14, 0xd0, 0x55, 0xbc, 0x24, 0xee, 0xca, 0x91, 0x3f, 0xf8, 0x5e, 0x78,
+ 0x29, 0xca, 0xcc, 0x3d, 0xe9, 0x4e, 0xdb, 0x56, 0x69, 0x74, 0x14, 0x83, 0xf8,
+ 0xec, 0x27, 0xc2, 0xdb, 0x09, 0xab, 0x69, 0x5f, 0x09, 0x71, 0x2a, 0xcf, 0x4a,
+ 0xc9, 0x90, 0xa8, 0x00, 0x18, 0x96, 0x82, 0x97, 0x9b,
+ ],
+ [
+ 0x12, 0x9a, 0xfb, 0x1a, 0x2d, 0x1d, 0xee, 0x3a, 0x68, 0x6c, 0x7f, 0xea, 0x9e,
+ 0x1d, 0xb0, 0x97, 0x39, 0x5f, 0x94, 0x96, 0x24, 0xea, 0xb1, 0x73, 0x5f, 0x2a,
+ 0xa8, 0x10, 0xaa, 0x95, 0xae, 0xc4, 0x5e, 0x22, 0x5c, 0x17, 0xf8, 0x12, 0x51,
+ 0x7d, 0x75, 0xaa, 0x3d, 0x6c, 0x85, 0xdf, 0x81, 0x2f, 0xc1, 0xdd, 0x00, 0x50,
+ 0xb8, 0xd1, 0x47, 0xf5, 0x7e, 0xf9, 0xa1, 0xd0, 0xd6, 0x9f, 0xa6, 0xd9,
+ ]
+ ),
+ test_case!(
+ [
+ 0xf0, 0x00, 0x1a, 0xf6, 0x9a, 0xf1, 0x96, 0x07, 0x58, 0x0b, 0x2f, 0xad, 0x1d,
+ 0xfe, 0x5e, 0x0b, 0x92, 0xe9, 0x97, 0xcb, 0x64,
+ ],
+ [
+ 0x77, 0x7c, 0xcf, 0xaa, 0x8d, 0xd8, 0xfc, 0x1f, 0xed, 0x83, 0x5c, 0xfe, 0xd5,
+ 0xbd, 0x5d, 0x18, 0x6d, 0xd8, 0xfd, 0x1a,
+ ],
+ [
+ 0x1c, 0x92, 0x99, 0xee, 0x27, 0xf2, 0xaa, 0x93, 0xd4, 0x9f, 0x79, 0x43, 0xb0,
+ 0xaf, 0x91, 0xf6, 0x16, 0xbb, 0xeb, 0x3d, 0x2d, 0xe6, 0x9e, 0xfa, 0xe9, 0x2f,
+ 0x13, 0xec, 0xdf, 0xd9, 0x41, 0x7b,
+ ],
+ [
+ 0x4a, 0x54, 0x8b, 0x22, 0xb6, 0x6e, 0x73, 0x22, 0xd0, 0xd6, 0x1b, 0x5b, 0xf2,
+ 0x3f, 0xd2, 0x80, 0xf6, 0x72, 0xec, 0x37, 0x68, 0x71, 0xef, 0x88, 0x66, 0xad,
+ 0xa5, 0xb4, 0x5a, 0xf2, 0x01, 0x15, 0x3b, 0x59, 0xd4, 0xdd, 0x6d, 0x24, 0x67,
+ 0x95, 0x2b, 0xd2, 0xb1, 0x75, 0xf1, 0x1b, 0xb9, 0x4e,
+ ],
+ [
+ 0x29, 0x79, 0xe6, 0x0d, 0x8c, 0x0f, 0x5b, 0x4b, 0xad, 0xba, 0x4b, 0xac, 0xea,
+ 0x92, 0x4b, 0x4f, 0x74, 0x74, 0xb9, 0x85, 0xca, 0x84, 0xfa, 0x9e, 0xdd, 0xe0,
+ 0x02, 0x0a, 0x94, 0x22, 0x76, 0xb5, 0x48, 0x3d, 0xd2, 0x97, 0xe2, 0xa4, 0x0c,
+ 0xcd, 0x99, 0x50, 0x3b, 0xe4, 0x51, 0xb8, 0x45, 0x40, 0xc9, 0x88, 0xc7, 0x73,
+ 0xda, 0x78, 0x33, 0x24, 0xf2, 0xf4, 0x4f, 0x87, 0x0c, 0xa2, 0xd0, 0xdf,
+ ]
+ ),
+ test_case!(
+ [
+ 0xc1, 0xe2, 0x99, 0xa7, 0xa2, 0x5b, 0xb9, 0x05, 0x74, 0x3f, 0x50, 0x09, 0xfd,
+ 0x56, 0x25, 0x41, 0x93, 0xdd, 0xa7, 0xe1, 0x67, 0xa5,
+ ],
+ [
+ 0xbd, 0xfb, 0xae, 0x49, 0x43, 0x93, 0xa2, 0xfa, 0xeb, 0xbc, 0x30, 0x10, 0x06,
+ 0x5a, 0x7e, 0x3c, 0x31, 0x0d, 0x8a, 0xf5,
+ ],
+ [
+ 0x25, 0x21, 0x22, 0xe2, 0x0e, 0xfc, 0x1d, 0xbe, 0x89, 0xcd, 0x03, 0xfe, 0x97,
+ 0x2f, 0x19, 0xd6, 0x65, 0x95, 0x65, 0xe6, 0x39, 0x7d, 0x2e, 0x06, 0xea, 0x95,
+ 0xc3, 0xc6, 0x92, 0xe0, 0x66, 0xbe,
+ ],
+ [
+ 0x38, 0x8a, 0x92, 0x99, 0x7c, 0xa3, 0x4e, 0x55, 0xf3, 0xf5, 0x3f, 0x70, 0xff,
+ 0xa6, 0x5d, 0x66, 0xda, 0xeb, 0x1e, 0x27, 0x34, 0xce, 0xd7, 0x21, 0xdc, 0xbc,
+ 0xcd, 0x23, 0x1a, 0x6e, 0xfe, 0x67, 0x1f, 0x36, 0x2f, 0x9f, 0x25, 0xc1, 0xb8,
+ 0x76, 0x7c, 0x05, 0xac, 0x3c, 0xd1, 0xb7, 0x96, 0xd1,
+ ],
+ [
+ 0x9a, 0x28, 0x69, 0x0f, 0x6b, 0xfe, 0x1f, 0x09, 0xc3, 0x09, 0x9e, 0x58, 0x9f,
+ 0x63, 0x83, 0xc7, 0x01, 0xa4, 0xab, 0x7f, 0xbd, 0xcc, 0x64, 0x5e, 0xda, 0xd1,
+ 0x38, 0xdd, 0x3e, 0x72, 0xa6, 0x39, 0xff, 0x8e, 0xcc, 0xa4, 0xa8, 0xe4, 0xd6,
+ 0x98, 0x03, 0x83, 0xb6, 0xec, 0x22, 0x07, 0x7e, 0x54, 0x23, 0x1b, 0x5b, 0x47,
+ 0x0b, 0x2a, 0x17, 0x88, 0x51, 0x04, 0x5d, 0x33, 0xe4, 0xa4, 0xda, 0x36,
+ ]
+ ),
+ test_case!(
+ [
+ 0xf3, 0xcb, 0xac, 0x95, 0xfd, 0x74, 0x21, 0xa8, 0x25, 0x21, 0xe4, 0x4e, 0x2f,
+ 0x4f, 0x11, 0xe2, 0xc1, 0xf6, 0xe2, 0x87, 0xcb, 0x1c, 0xa8,
+ ],
+ [
+ 0xb1, 0x8a, 0x12, 0x63, 0x33, 0x5e, 0xa3, 0xdf, 0x65, 0x6a, 0x38, 0x13, 0xe3,
+ 0xd9, 0x1b, 0x32, 0xc9, 0xe2, 0x59, 0xfe,
+ ],
+ [
+ 0x33, 0x12, 0x28, 0x64, 0x7c, 0xf0, 0x63, 0xf7, 0xc9, 0x45, 0x39, 0x17, 0x18,
+ 0x14, 0xa0, 0x6c, 0xb3, 0xab, 0x85, 0x4f, 0x8c, 0xbd, 0x56, 0xc6, 0x76, 0x31,
+ 0x67, 0x66, 0x39, 0xdc, 0xd5, 0xc4,
+ ],
+ [
+ 0x62, 0xf9, 0xdd, 0x10, 0xfa, 0xf2, 0xbf, 0xa4, 0x13, 0xf2, 0x46, 0xb6, 0x11,
+ 0x88, 0x97, 0x9e, 0x21, 0xef, 0x94, 0x7b, 0x34, 0x73, 0xa3, 0x43, 0x94, 0x3c,
+ 0xc3, 0xcc, 0x3a, 0xe8, 0x93, 0x26, 0xb1, 0xee, 0x51, 0x43, 0xa6, 0x82, 0x77,
+ 0x35, 0x7c, 0x43, 0xff, 0xa5, 0xac, 0x27, 0x97, 0x3e,
+ ],
+ [
+ 0x3d, 0xdf, 0x7a, 0x6b, 0xa5, 0x15, 0xaa, 0x68, 0xc4, 0x2f, 0x3b, 0xce, 0x60,
+ 0x65, 0xde, 0x58, 0x42, 0x03, 0xe0, 0x80, 0x61, 0xc7, 0x87, 0xb1, 0x2c, 0xbd,
+ 0xd2, 0x61, 0x06, 0x6a, 0x04, 0xd4, 0x2c, 0xa9, 0x4a, 0xc0, 0x84, 0x3b, 0xfa,
+ 0xe5, 0x83, 0x19, 0x8f, 0x4c, 0x1f, 0x69, 0x6b, 0xf1, 0xbc, 0x2e, 0x9f, 0x4c,
+ 0xdf, 0xc9, 0xf6, 0x9c, 0x2a, 0xd2, 0x80, 0x5b, 0xd2, 0x4f, 0xf9, 0x14,
+ ]
+ ),
+ test_case!(
+ [
+ 0x1a, 0x5e, 0x44, 0xf6, 0x69, 0x86, 0xbf, 0x9d, 0x21, 0x08, 0xd8, 0x6e, 0xd2,
+ 0x7c, 0xc4, 0x1c, 0xa7, 0x9e, 0xc9, 0x7e, 0x06, 0x61, 0x7f, 0x79,
+ ],
+ [
+ 0xa7, 0x21, 0x10, 0x5f, 0xe3, 0x34, 0xe3, 0xe7, 0x21, 0x65, 0x66, 0xd7, 0xe0,
+ 0x8b, 0x32, 0xd5, 0x86, 0x80, 0x90, 0x85,
+ ],
+ [
+ 0xa5, 0xe2, 0x8a, 0xc0, 0x37, 0xb9, 0x04, 0x8b, 0xd5, 0x75, 0x29, 0x95, 0xfb,
+ 0x18, 0x8d, 0x64, 0xa2, 0xc5, 0x39, 0x80, 0x57, 0x57, 0x10, 0x90, 0x1e, 0x5e,
+ 0x90, 0xaa, 0x95, 0x8c, 0xa4, 0x9a,
+ ],
+ [
+ 0xd4, 0x5f, 0x14, 0xef, 0xec, 0x90, 0x63, 0x39, 0x71, 0xa1, 0x7e, 0xc0, 0xfe,
+ 0x00, 0x7a, 0xde, 0xb6, 0x52, 0x27, 0x3d, 0xea, 0x63, 0x82, 0xdb, 0x27, 0x78,
+ 0xce, 0x1a, 0x1e, 0xdb, 0x29, 0x1d, 0xaf, 0xa2, 0x64, 0xee, 0x2d, 0x42, 0x8d,
+ 0x80, 0xb4, 0x6a, 0x3b, 0x8a, 0x96, 0x93, 0x24, 0xfa,
+ ],
+ [
+ 0x11, 0xac, 0xa6, 0x8c, 0x19, 0xa3, 0xa9, 0xbe, 0xea, 0xb6, 0xc0, 0x8e, 0x7c,
+ 0x5f, 0x33, 0xf5, 0xe8, 0x0d, 0xc0, 0x3c, 0x16, 0x27, 0xad, 0x23, 0xdf, 0x24,
+ 0x0b, 0xeb, 0xb6, 0x1e, 0x41, 0xae, 0x07, 0xdc, 0xa9, 0xeb, 0x10, 0xff, 0x3c,
+ 0xfd, 0xab, 0xcf, 0xac, 0x1c, 0xbe, 0x29, 0xbc, 0xf3, 0x4f, 0x53, 0x9c, 0x20,
+ 0x9a, 0xb6, 0x58, 0x98, 0x3a, 0xa5, 0x44, 0xec, 0x2f, 0xc9, 0xd0, 0x0a,
+ ]
+ ),
+ test_case!(
+ [
+ 0x4f, 0xe1, 0xfa, 0x85, 0x10, 0xf8, 0x1e, 0x6a, 0xea, 0xc0, 0xb1, 0xd7, 0xc8,
+ 0x83, 0x51, 0x99, 0x6e, 0x62, 0xb7, 0x39, 0x2a, 0x20, 0x10, 0xac, 0xb9,
+ ],
+ [
+ 0xff, 0x2e, 0x33, 0x8f, 0x1e, 0x06, 0x4e, 0x90, 0xd6, 0x30, 0x38, 0x81, 0x55,
+ 0x35, 0x48, 0x71, 0x9f, 0xd5, 0x72, 0x9a,
+ ],
+ [
+ 0x71, 0x38, 0x91, 0x14, 0x63, 0x80, 0xaf, 0x21, 0x0a, 0x44, 0x9f, 0xf4, 0x8e,
+ 0x6f, 0x28, 0xbf, 0x72, 0xec, 0x85, 0x17, 0x4d, 0x63, 0xc7, 0x99, 0xd3, 0xb5,
+ 0x35, 0xc0, 0x84, 0xb2, 0x39, 0xd1,
+ ],
+ [
+ 0x7e, 0x7b, 0x46, 0xa4, 0xd4, 0x08, 0x18, 0xb9, 0x2e, 0xbd, 0x41, 0x4d, 0x19,
+ 0xb6, 0xe1, 0x57, 0x95, 0xd5, 0x4f, 0x28, 0x92, 0x40, 0xcc, 0x8c, 0x32, 0x78,
+ 0xbe, 0x59, 0xc3, 0x72, 0x9b, 0x75, 0xcf, 0xbe, 0xfa, 0x37, 0x61, 0xa0, 0x3e,
+ 0xd6, 0x24, 0x30, 0xeb, 0xa1, 0x32, 0x30, 0xd4, 0x90,
+ ],
+ [
+ 0x51, 0x6a, 0xd6, 0x0e, 0xea, 0xbb, 0x6d, 0x9e, 0xf3, 0x64, 0x9a, 0x2c, 0xe9,
+ 0xdc, 0x29, 0x5e, 0x7a, 0x5d, 0x21, 0xa2, 0x5c, 0x11, 0x56, 0xc1, 0x74, 0xae,
+ 0x9c, 0xb7, 0x8c, 0x28, 0x11, 0xa4, 0x5d, 0x8b, 0x55, 0xd8, 0xd3, 0x61, 0xb7,
+ 0x9f, 0x18, 0xc5, 0x55, 0xe1, 0x5b, 0x80, 0x15, 0x4b, 0x51, 0x15, 0x93, 0x38,
+ 0x02, 0xd8, 0x45, 0x2f, 0x86, 0x3a, 0x4d, 0xb8, 0xa3, 0x71, 0xa9, 0x49,
+ ]
+ ),
+ test_case!(
+ [
+ 0xa8, 0x08, 0x67, 0x1e, 0x27, 0x35, 0x1e, 0x56, 0x2d, 0x57, 0xa5, 0xce, 0xa8,
+ 0x5b, 0x7e, 0x7b, 0xb2, 0x2c, 0x85, 0x1b, 0x2e, 0xc5, 0x44, 0x65, 0x1e, 0x87,
+ ],
+ [
+ 0xe0, 0x44, 0xb2, 0x0a, 0x1f, 0x0b, 0x28, 0xe4, 0x30, 0xc9, 0x79, 0xec, 0x3e,
+ 0xf9, 0x5f, 0x27, 0xb5, 0x7d, 0xc6, 0x22,
+ ],
+ [
+ 0xf8, 0x07, 0x78, 0xc1, 0x7f, 0x0b, 0x44, 0x7b, 0xe7, 0xba, 0x56, 0x29, 0x78,
+ 0xdb, 0xb6, 0xde, 0x07, 0x09, 0x4a, 0x9a, 0x3c, 0x84, 0x71, 0x8e, 0xde, 0x0e,
+ 0x67, 0x85, 0xbb, 0xf0, 0x87, 0xfb,
+ ],
+ [
+ 0x6b, 0xd2, 0x50, 0xa8, 0x80, 0xc1, 0x74, 0xa0, 0x2c, 0xd8, 0x11, 0x29, 0x33,
+ 0x11, 0x7a, 0x37, 0x19, 0x39, 0x7a, 0x30, 0x01, 0xe8, 0xbc, 0x85, 0x0f, 0x07,
+ 0xb5, 0xcd, 0xb4, 0x08, 0x81, 0xc4, 0x84, 0x2b, 0x83, 0x36, 0xaa, 0x48, 0xf0,
+ 0x1c, 0x38, 0x1f, 0x2a, 0x35, 0x45, 0x28, 0x77, 0x10,
+ ],
+ [
+ 0xf7, 0x98, 0xa7, 0x6b, 0xb6, 0x16, 0xf2, 0xec, 0xa0, 0x9a, 0xe2, 0x2b, 0xf4,
+ 0x79, 0x45, 0xfe, 0x46, 0x3b, 0x91, 0x12, 0x48, 0xc5, 0xa3, 0xcb, 0xe6, 0x14,
+ 0xfe, 0x6b, 0x5b, 0x30, 0xd1, 0x5a, 0x3a, 0x85, 0x58, 0xa2, 0x95, 0x4c, 0x04,
+ 0x09, 0x69, 0x51, 0xe1, 0x11, 0x09, 0xcc, 0x79, 0xea, 0x4d, 0x4f, 0x07, 0x38,
+ 0x9c, 0x58, 0x4e, 0x00, 0x54, 0xfd, 0x2f, 0xb2, 0xa4, 0x5b, 0x98, 0xc2,
+ ]
+ ),
+ test_case!(
+ [
+ 0x33, 0xb8, 0xf5, 0xfd, 0xb6, 0x39, 0x2c, 0xea, 0x31, 0xd8, 0x33, 0x36, 0xf8,
+ 0x84, 0xfc, 0x23, 0x16, 0xa3, 0x4e, 0xe4, 0xf8, 0x21, 0xb5, 0x55, 0xa8, 0x83,
+ 0x8d,
+ ],
+ [
+ 0xb7, 0x2c, 0x8f, 0x31, 0xd5, 0xed, 0x7b, 0x75, 0x37, 0x72, 0x47, 0xc2, 0x6d,
+ 0x66, 0x96, 0xb6, 0x4c, 0xc4, 0x0a, 0xfa,
+ ],
+ [
+ 0xca, 0x6e, 0xaa, 0xc3, 0x73, 0x5b, 0x62, 0x4d, 0xa5, 0x12, 0x80, 0x92, 0x92,
+ 0x74, 0xcf, 0x53, 0x44, 0x8b, 0x05, 0xeb, 0x27, 0x40, 0xda, 0xe7, 0xf6, 0x9b,
+ 0x59, 0xa3, 0xca, 0x2e, 0xe4, 0x8a,
+ ],
+ [
+ 0xad, 0x90, 0xe4, 0x59, 0x3f, 0x71, 0x8a, 0xc3, 0x77, 0xd0, 0x55, 0xc2, 0xe5,
+ 0x4e, 0x3d, 0x96, 0x6f, 0xe3, 0xcf, 0x0f, 0xae, 0x79, 0xbc, 0xaa, 0x11, 0x74,
+ 0x46, 0xcd, 0x2c, 0x1b, 0xdf, 0xbf, 0xd6, 0x5f, 0x05, 0xea, 0x64, 0xae, 0xc7,
+ 0xd3, 0xbe, 0x55, 0xb9, 0xad, 0xc3, 0x22, 0x4a, 0xa3,
+ ],
+ [
+ 0x4d, 0x60, 0x6c, 0x85, 0xbc, 0x45, 0xdf, 0xf1, 0xc1, 0xb6, 0xd2, 0x97, 0x09,
+ 0x7e, 0xb9, 0x13, 0x16, 0xeb, 0x27, 0x20, 0xeb, 0xd1, 0x9a, 0xf4, 0xad, 0x52,
+ 0x80, 0xde, 0xdd, 0x2b, 0xce, 0x6f, 0x29, 0xbc, 0x9b, 0x65, 0xd1, 0x64, 0xf1,
+ 0x71, 0x77, 0x6e, 0x36, 0x76, 0xbb, 0x51, 0xc0, 0xcc, 0x79, 0x2e, 0xee, 0xe0,
+ 0x7b, 0x47, 0x11, 0x75, 0xa0, 0x44, 0x36, 0x75, 0x4a, 0xd5, 0x2a, 0xc5,
+ ]
+ ),
+ test_case!(
+ [
+ 0xfb, 0x75, 0xd7, 0x72, 0x25, 0xfa, 0xd8, 0x4b, 0x98, 0x3d, 0x0f, 0xcc, 0xf9,
+ 0x8d, 0xfd, 0xbf, 0x35, 0x97, 0x3e, 0xb5, 0xbb, 0xf0, 0xf6, 0x1a, 0xa3, 0x2b,
+ 0x22, 0x67,
+ ],
+ [
+ 0xa9, 0xb6, 0x45, 0xdf, 0x54, 0x3b, 0x53, 0xd6, 0x92, 0x3f, 0x32, 0x80, 0xae,
+ 0x7c, 0x5f, 0x8b, 0xa5, 0x8a, 0x62, 0x1d,
+ ],
+ [
+ 0x1d, 0x78, 0xba, 0x8f, 0x84, 0xa6, 0x36, 0xf0, 0x1e, 0xf4, 0x2a, 0x6a, 0x67,
+ 0xec, 0x22, 0x4a, 0x59, 0xf2, 0x04, 0x5d, 0x65, 0xda, 0x35, 0x74, 0x91, 0x3f,
+ 0x04, 0xbc, 0x9c, 0x25, 0x55, 0xf4,
+ ],
+ [
+ 0xfa, 0xd9, 0x9f, 0x14, 0x94, 0xf5, 0xa9, 0x8e, 0x0d, 0x21, 0xb4, 0xd1, 0x6c,
+ 0x28, 0x82, 0x2c, 0x71, 0x67, 0xc7, 0x31, 0xe1, 0xb3, 0x48, 0xec, 0xa5, 0xe1,
+ 0x36, 0xdb, 0x15, 0x06, 0x83, 0x30, 0x67, 0xd3, 0x3e, 0x29, 0x57, 0xe9, 0xe3,
+ 0x8f, 0xae, 0x75, 0xbc, 0x91, 0x8e, 0x08, 0xc9, 0xe2,
+ ],
+ [
+ 0x37, 0x50, 0x62, 0x23, 0x99, 0x49, 0x37, 0x64, 0xbe, 0xc3, 0xe6, 0x23, 0xaf,
+ 0x9d, 0x9a, 0xc2, 0x48, 0x0d, 0x6d, 0x35, 0x3a, 0x0e, 0x2d, 0x29, 0xae, 0x06,
+ 0x2f, 0x2e, 0x51, 0xeb, 0xaf, 0xea, 0x08, 0x8e, 0x6c, 0xde, 0x9b, 0x10, 0x8d,
+ 0xee, 0xf3, 0xfa, 0xbc, 0xc3, 0x22, 0xb7, 0xec, 0x93, 0x18, 0x0a, 0xaa, 0x63,
+ 0xd8, 0xe1, 0x18, 0x03, 0xe5, 0x67, 0xab, 0x24, 0xd3, 0x42, 0x5f, 0x64,
+ ]
+ ),
+ test_case!(
+ [
+ 0xca, 0xf3, 0x50, 0x61, 0x4a, 0x0e, 0xf6, 0xcb, 0x1e, 0x8c, 0x8c, 0x31, 0xa9,
+ 0x4d, 0x85, 0x6a, 0xef, 0x80, 0x94, 0x1f, 0x56, 0x24, 0xde, 0x64, 0x44, 0x14,
+ 0x8a, 0x51, 0x65,
+ ],
+ [
+ 0x53, 0xc9, 0x5a, 0x79, 0xf8, 0x1c, 0x7f, 0xb3, 0x3b, 0xf6, 0x6a, 0x62, 0xee,
+ 0x03, 0xd5, 0xc3, 0x69, 0x2b, 0x87, 0x00,
+ ],
+ [
+ 0xbd, 0xe7, 0xf3, 0xc4, 0xe9, 0xff, 0xc1, 0x80, 0xb8, 0xa1, 0x9f, 0x5e, 0xb5,
+ 0x23, 0xdd, 0x31, 0xaa, 0x50, 0x27, 0xaf, 0x27, 0x02, 0x5d, 0xc1, 0xb1, 0x56,
+ 0x11, 0x02, 0xce, 0x85, 0xdb, 0x00,
+ ],
+ [
+ 0x1e, 0x38, 0x5d, 0x8b, 0x67, 0x0a, 0x21, 0xf5, 0x7d, 0xb7, 0x75, 0x4a, 0xa1,
+ 0x94, 0x3c, 0xd8, 0xfb, 0x51, 0xf1, 0x5f, 0x01, 0xd6, 0x88, 0x45, 0x4a, 0x26,
+ 0x43, 0xb7, 0xe7, 0x40, 0xb1, 0xf9, 0xa7, 0xb6, 0x41, 0x1c, 0x45, 0xed, 0x68,
+ 0x07, 0xf6, 0xc2, 0x9f, 0xb3, 0x5a, 0x2e, 0x23, 0x1d,
+ ],
+ [
+ 0x43, 0xb3, 0xde, 0xb1, 0x2d, 0x5c, 0x96, 0x29, 0x5a, 0x80, 0x57, 0xb6, 0x0d,
+ 0x8c, 0x7b, 0x03, 0x86, 0xd3, 0x4b, 0x87, 0x9d, 0xe5, 0xd0, 0xa5, 0xa9, 0x78,
+ 0xa8, 0x2a, 0x6a, 0x7c, 0x4f, 0xd7, 0x69, 0x18, 0x32, 0x72, 0x72, 0x8a, 0xa5,
+ 0xc5, 0x90, 0x1f, 0xf9, 0x1e, 0x72, 0xbb, 0x38, 0x81, 0x66, 0x6e, 0xd3, 0x8d,
+ 0x22, 0x44, 0x35, 0x00, 0x27, 0xe7, 0xb1, 0x0d, 0x44, 0x00, 0x02, 0x18,
+ ]
+ ),
+ test_case!(
+ [
+ 0x45, 0xc2, 0x69, 0x41, 0xac, 0x58, 0xb9, 0xa2, 0x6f, 0xc3, 0xe1, 0x2b, 0x47,
+ 0x1e, 0x03, 0x3c, 0x93, 0x43, 0x12, 0xd6, 0xa5, 0xf9, 0x22, 0x37, 0xfc, 0xfa,
+ 0xaf, 0xf2, 0xfc, 0x81,
+ ],
+ [
+ 0xee, 0x02, 0xd8, 0x1e, 0xb0, 0x28, 0x38, 0x9f, 0x68, 0x26, 0x61, 0xa9, 0x5b,
+ 0x7d, 0xc4, 0x47, 0x24, 0x24, 0xd7, 0x9b,
+ ],
+ [
+ 0xcd, 0x4e, 0xdd, 0x84, 0x5f, 0x65, 0xb5, 0xd5, 0x34, 0xff, 0xaf, 0x55, 0x30,
+ 0x51, 0xdb, 0x44, 0xfd, 0xf4, 0x07, 0x8d, 0x3a, 0xce, 0xa3, 0xc3, 0xa1, 0x6c,
+ 0x65, 0x06, 0xd7, 0x79, 0x88, 0xed,
+ ],
+ [
+ 0xe2, 0xcb, 0xf7, 0xe0, 0xab, 0x29, 0xe8, 0xac, 0x70, 0x73, 0x4a, 0xfb, 0xfb,
+ 0x87, 0xc7, 0x6b, 0xfa, 0x06, 0x87, 0xba, 0x28, 0x04, 0xd6, 0x77, 0x6f, 0x39,
+ 0xe4, 0x21, 0x90, 0x7c, 0xf1, 0x28, 0x9b, 0x76, 0x68, 0x5b, 0xdb, 0x66, 0x64,
+ 0x06, 0x4f, 0x6c, 0x81, 0x45, 0xbc, 0x63, 0xa7, 0x53,
+ ],
+ [
+ 0x73, 0xed, 0x28, 0x11, 0xa9, 0xb5, 0xd8, 0xc3, 0x9c, 0x9f, 0xe0, 0x1b, 0x32,
+ 0xb1, 0x43, 0xe6, 0x99, 0x0e, 0x79, 0x56, 0xe8, 0x83, 0x57, 0xd3, 0xcd, 0xad,
+ 0x14, 0x4f, 0xcd, 0x1b, 0x01, 0x82, 0x47, 0x27, 0x01, 0xee, 0x3d, 0x50, 0x90,
+ 0x17, 0x93, 0xf3, 0x5e, 0x02, 0x8e, 0x1c, 0xa6, 0xf7, 0xf1, 0xfe, 0x0e, 0x19,
+ 0x9c, 0x19, 0x45, 0xc1, 0x51, 0xe7, 0x18, 0xaf, 0x6a, 0x80, 0x2b, 0x84,
+ ]
+ ),
+ test_case!(
+ [
+ 0x32, 0xac, 0x3d, 0xbc, 0x99, 0x0d, 0x3d, 0xc2, 0xba, 0xf6, 0xee, 0xcc, 0x78,
+ 0x0f, 0x64, 0xa2, 0x03, 0x08, 0x08, 0xcd, 0x57, 0x00, 0x19, 0x9f, 0xa1, 0xa9,
+ 0xf9, 0x0d, 0x67, 0xd0, 0x00,
+ ],
+ [
+ 0xba, 0x29, 0x75, 0x9d, 0xb2, 0x89, 0xe4, 0x65, 0x20, 0x18, 0xe0, 0x77, 0xf8,
+ 0x59, 0x94, 0x11, 0xa8, 0x47, 0xbb, 0x2f,
+ ],
+ [
+ 0xf0, 0x88, 0x03, 0xc7, 0xa1, 0xf5, 0x13, 0x04, 0x3f, 0x01, 0xd1, 0xca, 0x65,
+ 0x86, 0x98, 0x09, 0xa8, 0xd4, 0xa2, 0x80, 0x12, 0x7a, 0x0c, 0xb6, 0x02, 0xe8,
+ 0xc9, 0x56, 0x1f, 0xc6, 0xec, 0x7a,
+ ],
+ [
+ 0xb3, 0x27, 0xc8, 0x0b, 0x23, 0xb0, 0xad, 0xae, 0xea, 0x14, 0xa2, 0xf2, 0x0e,
+ 0x1b, 0xab, 0xc3, 0xd2, 0xac, 0x56, 0xfe, 0x14, 0xf8, 0xce, 0x73, 0xac, 0x12,
+ 0xe6, 0x7b, 0xc3, 0x1a, 0x58, 0x19, 0xd0, 0x87, 0x15, 0xa2, 0xc9, 0x9e, 0x3c,
+ 0x84, 0x7d, 0x50, 0xe9, 0x41, 0x3d, 0x74, 0x1c, 0x13,
+ ],
+ [
+ 0x2e, 0x36, 0xac, 0xe8, 0x14, 0xd6, 0x9e, 0xf8, 0x04, 0xe0, 0xfb, 0x36, 0x23,
+ 0xb8, 0xb5, 0x36, 0x29, 0xc3, 0x16, 0x33, 0x8a, 0x3d, 0xa7, 0x33, 0xeb, 0x60,
+ 0x09, 0xa2, 0x83, 0xf9, 0x69, 0x42, 0xef, 0xd6, 0x77, 0x82, 0x7d, 0xef, 0x45,
+ 0x87, 0xdd, 0x55, 0x37, 0x21, 0xa2, 0x9f, 0x71, 0xa8, 0xde, 0xcd, 0x07, 0x07,
+ 0xf3, 0xf0, 0x16, 0xf6, 0x95, 0x25, 0x30, 0x26, 0xa4, 0x73, 0xe3, 0x04,
+ ]
+ ),
+ test_case!(
+ [
+ 0xec, 0x06, 0x20, 0xc1, 0xb7, 0xb7, 0xbb, 0xc8, 0x00, 0x0e, 0x54, 0xb5, 0xbb,
+ 0x7e, 0x0b, 0xdf, 0xb5, 0x97, 0xf3, 0xa7, 0x43, 0x8e, 0xd0, 0xf0, 0x9a, 0xba,
+ 0x48, 0x35, 0xa4, 0xa0, 0xf5, 0xee,
+ ],
+ [
+ 0xf6, 0xd8, 0xcb, 0x20, 0xa3, 0x08, 0x65, 0xdb, 0x4d, 0x27, 0xe7, 0x24, 0xa5,
+ 0x9c, 0x8d, 0x29, 0xbf, 0xc7, 0x49, 0x4c,
+ ],
+ [
+ 0x78, 0xf9, 0x5b, 0xec, 0x7a, 0x79, 0x03, 0x12, 0xdd, 0x0d, 0xb8, 0x98, 0xca,
+ 0xb7, 0x8d, 0xbf, 0x1c, 0x65, 0x69, 0x41, 0xeb, 0x3c, 0xc2, 0x33, 0x84, 0x43,
+ 0xb0, 0xc0, 0xed, 0x39, 0x50, 0x57,
+ ],
+ [
+ 0xf7, 0xc9, 0x4b, 0xd8, 0x2d, 0xe8, 0xcf, 0x76, 0x30, 0xd0, 0x87, 0x33, 0xfe,
+ 0x60, 0x7d, 0x54, 0xee, 0x26, 0xb0, 0xd9, 0x87, 0xbf, 0x5b, 0x73, 0xc6, 0x43,
+ 0x51, 0xa4, 0x15, 0x02, 0x35, 0x13, 0x6e, 0x4e, 0x8a, 0xa0, 0x48, 0x0c, 0x7f,
+ 0x17, 0xc3, 0x58, 0xa0, 0xdc, 0xf7, 0x13, 0x59, 0x38,
+ ],
+ [
+ 0xee, 0xb7, 0xc5, 0x97, 0x81, 0x73, 0x94, 0xfe, 0x5a, 0xdd, 0x0c, 0xde, 0x51,
+ 0x16, 0xf8, 0x5d, 0x4a, 0x16, 0x46, 0x73, 0x78, 0xbb, 0x1a, 0x8e, 0x42, 0xe7,
+ 0x1a, 0x74, 0xbf, 0x26, 0xc3, 0x00, 0xc3, 0x62, 0xbd, 0x37, 0xca, 0x16, 0x74,
+ 0x5f, 0xea, 0x97, 0x55, 0x2c, 0x2f, 0xf5, 0xd2, 0xbe, 0x7c, 0x32, 0x15, 0xdf,
+ 0xa5, 0x6f, 0xed, 0x38, 0x91, 0x47, 0xf7, 0xaf, 0x17, 0xee, 0x78, 0x44,
+ ]
+ ),
+ test_case!(
+ [
+ 0xd8, 0x3f, 0x48, 0x02, 0x79, 0x3e, 0x53, 0x79, 0xe1, 0x0c, 0x90, 0x2a, 0x86,
+ 0x76, 0xe3, 0xb8, 0x82, 0xdf, 0x20, 0xd4, 0xd8, 0xf1, 0x21, 0x3f, 0x87, 0xbd,
+ 0x03, 0xf7, 0x6d, 0xf2, 0x4b, 0x32, 0xee,
+ ],
+ [
+ 0x0c, 0xb3, 0x00, 0xca, 0x40, 0x5e, 0x61, 0x50, 0xba, 0x43, 0xf9, 0x12, 0x45,
+ 0xfd, 0x0c, 0x83, 0xe7, 0x74, 0x09, 0x10,
+ ],
+ [
+ 0x1f, 0x35, 0x61, 0x55, 0xad, 0x41, 0x86, 0x93, 0x39, 0xb9, 0x49, 0x94, 0xcd,
+ 0xac, 0x3f, 0x16, 0x82, 0xad, 0x00, 0xf5, 0x38, 0x39, 0x29, 0x26, 0x13, 0x2d,
+ 0x57, 0xa4, 0x90, 0x83, 0x0a, 0x44,
+ ],
+ [
+ 0x01, 0x70, 0x2c, 0x07, 0x01, 0xfa, 0xa2, 0x73, 0x3f, 0xb2, 0xbf, 0xfa, 0x14,
+ 0xaf, 0x95, 0x1c, 0xbc, 0x5c, 0x2d, 0xa0, 0x03, 0xc3, 0xd5, 0x6e, 0x42, 0x5e,
+ 0x41, 0xf2, 0xa2, 0x12, 0x74, 0xc7, 0xa0, 0xa6, 0x60, 0x68, 0x13, 0x42, 0xec,
+ 0xfc, 0x4f, 0x95, 0x78, 0xca, 0x73, 0x34, 0x88, 0x72,
+ ],
+ [
+ 0x83, 0x5e, 0xd9, 0x1f, 0xcc, 0x9a, 0x86, 0xa1, 0x4c, 0x44, 0x84, 0xa3, 0x56,
+ 0x54, 0x52, 0x9e, 0xde, 0x82, 0xf7, 0xc3, 0x9f, 0xd6, 0x78, 0xd3, 0x58, 0xa4,
+ 0x2a, 0x23, 0x0a, 0xce, 0x36, 0x22, 0xdd, 0x86, 0x46, 0x4c, 0x72, 0x62, 0x2f,
+ 0x29, 0xe6, 0x2b, 0x2a, 0xbc, 0xa1, 0x61, 0x21, 0x44, 0x95, 0x7e, 0x7a, 0x38,
+ 0x29, 0x57, 0x93, 0xe4, 0x1f, 0xe1, 0x77, 0x8d, 0x06, 0x65, 0xe5, 0x1f,
+ ]
+ ),
+ test_case!(
+ [
+ 0xf4, 0xeb, 0xb5, 0x70, 0xdc, 0x36, 0xf6, 0x25, 0xa8, 0xe8, 0xae, 0x40, 0x7a,
+ 0x39, 0xdf, 0x0d, 0xc0, 0xd7, 0xf9, 0x6e, 0x9e, 0x24, 0x97, 0x5f, 0x84, 0x78,
+ 0xd7, 0x31, 0x18, 0xfa, 0x13, 0xd5, 0x1b, 0x93,
+ ],
+ [
+ 0x3f, 0xd8, 0xc3, 0x1d, 0x6b, 0x20, 0x2a, 0xdb, 0x3b, 0xac, 0x6b, 0x3a, 0x50,
+ 0x05, 0x54, 0x7f, 0x1c, 0x8e, 0x3c, 0x2e,
+ ],
+ [
+ 0x94, 0x20, 0x5d, 0xbf, 0xd0, 0x85, 0x38, 0x75, 0x18, 0x08, 0xb2, 0x2f, 0x33,
+ 0x3a, 0xbc, 0xca, 0xf1, 0xa9, 0xde, 0x86, 0x9d, 0x4f, 0xa9, 0x8d, 0x2c, 0x60,
+ 0x0c, 0x8c, 0xa2, 0xa9, 0xce, 0x8b,
+ ],
+ [
+ 0xcf, 0x28, 0xe1, 0x59, 0xb2, 0xd5, 0xea, 0x81, 0xd6, 0x9f, 0xb1, 0x4a, 0xba,
+ 0xe3, 0xd4, 0x48, 0x5a, 0x4f, 0x49, 0xdd, 0xdc, 0x14, 0x38, 0x45, 0xab, 0xb2,
+ 0x9e, 0x2b, 0x41, 0x86, 0x24, 0x77, 0x87, 0xee, 0xa3, 0xfc, 0xab, 0xdb, 0xf3,
+ 0xea, 0xee, 0x09, 0x53, 0xb6, 0xc3, 0x64, 0x46, 0xba,
+ ],
+ [
+ 0x02, 0xce, 0xe5, 0x88, 0xb2, 0x09, 0x6d, 0xd5, 0xf5, 0xf4, 0xa4, 0xe4, 0x7a,
+ 0x48, 0x20, 0xa3, 0xde, 0x81, 0x6e, 0x8d, 0xa5, 0x1e, 0xf0, 0x6d, 0x0d, 0x1c,
+ 0x0b, 0x0d, 0x74, 0xca, 0x44, 0x29, 0xc7, 0xf2, 0x39, 0x8c, 0x83, 0xad, 0xb3,
+ 0x15, 0x6a, 0xdf, 0x49, 0xc2, 0xfa, 0x08, 0x10, 0x8e, 0x38, 0xd2, 0xce, 0x32,
+ 0xae, 0x67, 0xc0, 0xa2, 0xfa, 0x08, 0xd4, 0xd1, 0xb7, 0x36, 0xbd, 0x96,
+ ]
+ ),
+ test_case!(
+ [
+ 0x90, 0x10, 0x96, 0xca, 0x77, 0x56, 0x7d, 0x1e, 0xa2, 0x93, 0xe5, 0x15, 0x7d,
+ 0xcd, 0x10, 0x0b, 0x03, 0x9c, 0x8c, 0x01, 0xbc, 0xde, 0xbf, 0x80, 0xc5, 0xe7,
+ 0xf3, 0xb2, 0x04, 0x2d, 0x6d, 0x26, 0x70, 0x28, 0xdf,
+ ],
+ [
+ 0xec, 0x2b, 0x0c, 0x5c, 0xfc, 0xe2, 0xb1, 0xc3, 0xf8, 0x03, 0x3f, 0x37, 0x4d,
+ 0x88, 0x48, 0xa9, 0xe0, 0xa8, 0x22, 0x7c,
+ ],
+ [
+ 0x28, 0x82, 0x80, 0x32, 0x60, 0xc9, 0x39, 0xf8, 0x28, 0x43, 0x41, 0xa1, 0xd8,
+ 0x3a, 0x5e, 0x2a, 0x60, 0x4d, 0x8a, 0xd1, 0x7a, 0x26, 0x5c, 0x60, 0x24, 0xd9,
+ 0x84, 0x14, 0xf5, 0x00, 0x55, 0xe3,
+ ],
+ [
+ 0x5e, 0x3a, 0xab, 0x06, 0x1f, 0x57, 0x34, 0x75, 0xa9, 0x0d, 0x07, 0x26, 0x5c,
+ 0xdc, 0x55, 0xdb, 0x75, 0x1f, 0x5e, 0x20, 0x00, 0x2b, 0x9e, 0x13, 0x35, 0x91,
+ 0x58, 0x12, 0xbf, 0x9b, 0xea, 0x77, 0x41, 0x82, 0xd2, 0x1b, 0x69, 0xec, 0xce,
+ 0xb0, 0xdc, 0x83, 0x5b, 0x66, 0x0a, 0x32, 0xbd, 0xda,
+ ],
+ [
+ 0x20, 0xac, 0x92, 0x38, 0xb4, 0x52, 0xe2, 0x62, 0xf9, 0x2f, 0xd3, 0x65, 0x6e,
+ 0xe2, 0x33, 0x12, 0xf2, 0x2e, 0x09, 0xc7, 0x66, 0x3a, 0xa2, 0xbf, 0x89, 0x21,
+ 0x88, 0x50, 0x8a, 0xf1, 0xaf, 0xd8, 0x91, 0x00, 0x95, 0x07, 0x0e, 0x8a, 0x5e,
+ 0xd7, 0xaa, 0x7c, 0x04, 0x2f, 0x69, 0x51, 0x83, 0x97, 0xa6, 0xb3, 0x56, 0xcf,
+ 0x1e, 0x5c, 0xe3, 0xc6, 0x0e, 0x06, 0xab, 0x8e, 0x0b, 0xcb, 0xb0, 0x0e,
+ ]
+ ),
+ test_case!(
+ [
+ 0xda, 0x0b, 0xa3, 0x35, 0x62, 0x5e, 0x26, 0x80, 0x1a, 0x5f, 0xb9, 0xa8, 0x5e,
+ 0xb9, 0xcd, 0x61, 0x3e, 0x67, 0xbc, 0x21, 0xb9, 0xf0, 0x51, 0x5a, 0x03, 0x22,
+ 0x56, 0xd5, 0x6c, 0x04, 0xd0, 0x1b, 0xfb, 0xf0, 0x34, 0x95,
+ ],
+ [
+ 0xa2, 0xaf, 0x27, 0x7c, 0x93, 0x4c, 0x57, 0xaa, 0x09, 0xff, 0xb4, 0xdb, 0x21,
+ 0x22, 0x7a, 0xe8, 0x03, 0x41, 0x6e, 0x30,
+ ],
+ [
+ 0x72, 0xd7, 0xa9, 0xaf, 0xde, 0xab, 0x9a, 0x4d, 0xd3, 0xc4, 0x1e, 0x6c, 0xbd,
+ 0xd3, 0x9a, 0xa4, 0x85, 0x47, 0xc6, 0xfa, 0xac, 0x7b, 0x70, 0x21, 0x53, 0xa4,
+ 0xa1, 0x89, 0xe6, 0x11, 0x8a, 0x04,
+ ],
+ [
+ 0x6c, 0x19, 0xd6, 0x8c, 0x72, 0xb4, 0x6d, 0x1b, 0x2d, 0x13, 0x16, 0x7a, 0x84,
+ 0x5b, 0x2f, 0x41, 0x24, 0xcd, 0x87, 0x0e, 0xab, 0x61, 0xfb, 0x0c, 0x37, 0xa2,
+ 0x5b, 0x9b, 0x6c, 0x75, 0x92, 0xfb, 0xcf, 0x51, 0xbf, 0xda, 0x9d, 0x3d, 0xce,
+ 0x06, 0xd9, 0xaf, 0x33, 0xba, 0x87, 0x93, 0x5b, 0x9b,
+ ],
+ [
+ 0x49, 0xbd, 0x64, 0x1d, 0x17, 0xc2, 0xa5, 0x03, 0xfe, 0xf7, 0xda, 0xf0, 0x47,
+ 0x99, 0xcc, 0x35, 0x67, 0xe3, 0x36, 0x26, 0x8f, 0xde, 0x21, 0x45, 0xf4, 0x4d,
+ 0xa0, 0xd1, 0x44, 0xae, 0x49, 0xd6, 0x41, 0x28, 0xb4, 0xef, 0x8c, 0x2a, 0xd1,
+ 0xfe, 0x1d, 0x02, 0x63, 0x8c, 0x82, 0x3c, 0xda, 0x89, 0x38, 0x4a, 0xbc, 0xdc,
+ 0x1b, 0xe2, 0x97, 0xed, 0x36, 0x2c, 0x0c, 0x31, 0x6a, 0xaa, 0x6e, 0x4e,
+ ]
+ ),
+ test_case!(
+ [
+ 0x67, 0x67, 0xf6, 0xd1, 0xc8, 0xec, 0xe7, 0x31, 0xdb, 0x00, 0xff, 0x8a, 0xdf,
+ 0x34, 0x8e, 0xc4, 0xa5, 0x79, 0x86, 0x1d, 0xa8, 0x88, 0x7e, 0xcb, 0xb0, 0xca,
+ 0x6b, 0x04, 0x72, 0xfe, 0xe6, 0xb2, 0x5a, 0x66, 0x29, 0xcc, 0x38,
+ ],
+ [
+ 0x37, 0x65, 0xe4, 0xf5, 0xe2, 0x05, 0x97, 0x40, 0x04, 0xa9, 0x52, 0x50, 0x2e,
+ 0x74, 0xf6, 0xec, 0xd5, 0x65, 0x45, 0x2d,
+ ],
+ [
+ 0x65, 0x62, 0x8e, 0x28, 0x24, 0x40, 0xbe, 0x6c, 0xa7, 0x24, 0x6c, 0xf2, 0x87,
+ 0x2b, 0xeb, 0x35, 0x60, 0xc3, 0x7b, 0x68, 0x43, 0x19, 0x47, 0xdf, 0xe5, 0xb4,
+ 0x15, 0xa6, 0x07, 0xd0, 0xd6, 0x65,
+ ],
+ [
+ 0x73, 0x19, 0xc6, 0x1a, 0x87, 0xf9, 0x65, 0xb6, 0x43, 0xcc, 0x42, 0x61, 0xf8,
+ 0x8c, 0x65, 0x40, 0x9f, 0xb5, 0xa7, 0x09, 0xd6, 0x74, 0xaa, 0x74, 0x91, 0x28,
+ 0x6b, 0xbf, 0xbb, 0x3a, 0x7e, 0x8e, 0xef, 0x84, 0x45, 0xb7, 0x36, 0x59, 0xd8,
+ 0x45, 0xc5, 0x60, 0x3e, 0x11, 0x30, 0xbb, 0x29, 0x74,
+ ],
+ [
+ 0x21, 0xfa, 0x4c, 0xfb, 0xf9, 0xc9, 0xf5, 0x63, 0xbe, 0x66, 0x2b, 0xf9, 0x70,
+ 0x13, 0x2e, 0x31, 0x2f, 0x9c, 0x20, 0x38, 0xd7, 0x82, 0xb7, 0xc0, 0xb0, 0x98,
+ 0xd3, 0xf2, 0x45, 0x7f, 0x35, 0x7e, 0xaf, 0x40, 0x7b, 0x40, 0x38, 0xb3, 0xda,
+ 0x8e, 0x94, 0x70, 0xa0, 0xf0, 0x4e, 0x69, 0x15, 0x04, 0x9a, 0x15, 0x31, 0x00,
+ 0x09, 0x83, 0x35, 0x48, 0x68, 0x58, 0xdd, 0xb8, 0x49, 0x90, 0x60, 0xa9,
+ ]
+ ),
+ test_case!(
+ [
+ 0x9e, 0xec, 0x21, 0x11, 0x1f, 0x1c, 0xff, 0xee, 0xfd, 0x85, 0xcb, 0x87, 0x20,
+ 0x33, 0x54, 0xdb, 0x64, 0xa7, 0x50, 0xbe, 0xb4, 0xad, 0x25, 0x46, 0x5f, 0x75,
+ 0x2e, 0x3e, 0x52, 0xac, 0xc4, 0x48, 0xaa, 0x71, 0x99, 0x75, 0x6c, 0xa1,
+ ],
+ [
+ 0x9c, 0x45, 0x5c, 0x9f, 0x54, 0xd2, 0xad, 0x2e, 0x79, 0x8a, 0x5a, 0x6c, 0x89,
+ 0xe9, 0x24, 0x34, 0x20, 0x35, 0xb3, 0x18,
+ ],
+ [
+ 0x95, 0x3a, 0x67, 0x6a, 0x83, 0xf6, 0x02, 0x98, 0xea, 0x33, 0xae, 0x32, 0xd1,
+ 0xdb, 0x5d, 0x28, 0x83, 0xb1, 0x68, 0x7e, 0xbe, 0xd2, 0xc0, 0xe3, 0x0e, 0xd1,
+ 0xe0, 0x6e, 0x2e, 0xb3, 0xfa, 0xe3,
+ ],
+ [
+ 0x65, 0x12, 0x95, 0x58, 0xfa, 0xd4, 0x43, 0x56, 0x05, 0xd6, 0x92, 0xe2, 0xdc,
+ 0xe3, 0x40, 0x05, 0x85, 0xdc, 0x46, 0xd4, 0xef, 0xca, 0x46, 0x8e, 0x24, 0x7e,
+ 0x7b, 0xd8, 0xb2, 0x11, 0xe5, 0xef, 0x68, 0xf9, 0xd1, 0xec, 0x10, 0xb7, 0x06,
+ 0x04, 0x9c, 0xeb, 0x04, 0x5b, 0xf1, 0x26, 0x1a, 0x3d,
+ ],
+ [
+ 0x98, 0xb8, 0x27, 0x6c, 0xd0, 0x18, 0x6b, 0xa2, 0x4c, 0xa1, 0x86, 0x68, 0x76,
+ 0x8e, 0x12, 0xdc, 0xa8, 0xc0, 0xbe, 0x7f, 0xd1, 0xcf, 0xb1, 0x73, 0xb3, 0x55,
+ 0xa9, 0x4b, 0xff, 0x16, 0x32, 0x83, 0x7e, 0x29, 0xc7, 0x01, 0xe2, 0x6f, 0x64,
+ 0x1b, 0x53, 0x85, 0x8d, 0x45, 0x95, 0x1b, 0x05, 0xb9, 0xed, 0xf7, 0xc3, 0x65,
+ 0xa5, 0xb2, 0xbb, 0x39, 0xcc, 0xdc, 0x45, 0xed, 0x62, 0x83, 0x45, 0xbf,
+ ]
+ ),
+ test_case!(
+ [
+ 0xe4, 0xa1, 0xf7, 0xe6, 0xe1, 0xcf, 0xda, 0xdb, 0x42, 0xad, 0xfc, 0x75, 0x8f,
+ 0x4b, 0x6e, 0x37, 0x56, 0xa6, 0x13, 0xba, 0xc1, 0xcd, 0x0a, 0xd4, 0x67, 0xa3,
+ 0xde, 0xdd, 0xab, 0x94, 0x73, 0x08, 0xb0, 0xcb, 0xf4, 0xc7, 0x3d, 0x4c, 0x71,
+ ],
+ [
+ 0x86, 0x00, 0x23, 0xf1, 0x78, 0x8c, 0x19, 0x44, 0xe3, 0x72, 0x8a, 0x25, 0xb8,
+ 0x74, 0x09, 0x2b, 0x5f, 0x83, 0x31, 0x69,
+ ],
+ [
+ 0xd8, 0x29, 0x11, 0xa6, 0x09, 0x06, 0xf5, 0x86, 0xa9, 0xed, 0x82, 0x18, 0xbe,
+ 0xe2, 0xdb, 0x59, 0x3b, 0x77, 0x33, 0xcf, 0x47, 0x77, 0x3b, 0x96, 0x83, 0xdb,
+ 0xb2, 0x74, 0x68, 0xed, 0x1e, 0x4f,
+ ],
+ [
+ 0xa4, 0x7e, 0x3b, 0xb5, 0x55, 0xff, 0xb7, 0x1a, 0xaa, 0xf1, 0xa7, 0x7b, 0x82,
+ 0xa8, 0x09, 0x19, 0xd7, 0xb8, 0xa6, 0x7e, 0x64, 0x37, 0x72, 0x87, 0x52, 0x61,
+ 0x0c, 0x5c, 0xd2, 0x35, 0x05, 0x69, 0x04, 0xd8, 0x7f, 0x92, 0x4a, 0x59, 0x1d,
+ 0x92, 0x15, 0x39, 0xee, 0x4a, 0x82, 0x25, 0x4f, 0x97,
+ ],
+ [
+ 0x67, 0x44, 0x63, 0xe9, 0x9d, 0xd6, 0x79, 0x3d, 0xa5, 0x4a, 0xf4, 0xfb, 0xd8,
+ 0x53, 0x80, 0xec, 0x16, 0x0e, 0x6a, 0x9c, 0x6b, 0x20, 0x96, 0x6e, 0x15, 0xca,
+ 0x21, 0xd3, 0x0b, 0x60, 0x37, 0x7b, 0x7e, 0xc5, 0xf3, 0x8a, 0xba, 0xfa, 0x4e,
+ 0x7f, 0x89, 0x69, 0xcc, 0x37, 0x03, 0xf3, 0xe9, 0x78, 0x76, 0x78, 0xb1, 0xd7,
+ 0xe5, 0x2c, 0xd6, 0x60, 0x33, 0xf2, 0x99, 0xa8, 0x3a, 0xf4, 0xc7, 0x65,
+ ]
+ ),
+ test_case!(
+ [
+ 0x7e, 0xf0, 0xfb, 0x04, 0x57, 0x1d, 0x94, 0x0e, 0x5f, 0xea, 0x9b, 0x25, 0x0c,
+ 0x27, 0x5d, 0xcd, 0x9f, 0x7a, 0x27, 0x89, 0x6d, 0x9b, 0xb9, 0x7e, 0xb4, 0x88,
+ 0x04, 0x85, 0x73, 0xbb, 0x94, 0xea, 0x5f, 0x3a, 0xeb, 0x3b, 0x52, 0xa4, 0x6f,
+ 0x91,
+ ],
+ [
+ 0x3a, 0x86, 0xca, 0x97, 0x7e, 0x3e, 0x9f, 0x67, 0x31, 0xa1, 0x1b, 0x74, 0x39,
+ 0x2c, 0x4e, 0x25, 0xce, 0x74, 0x1a, 0xd5,
+ ],
+ [
+ 0x89, 0x19, 0xc3, 0x23, 0xa5, 0x16, 0xa0, 0x6d, 0xf3, 0xc7, 0x7d, 0x5f, 0xdc,
+ 0x13, 0xfc, 0x9c, 0xdc, 0xc8, 0x69, 0x47, 0x34, 0xf7, 0x9f, 0x5e, 0x4b, 0x19,
+ 0xcb, 0xd7, 0xa5, 0x2f, 0x71, 0xc4,
+ ],
+ [
+ 0x40, 0x2f, 0xb5, 0x28, 0x03, 0xd5, 0x57, 0xba, 0xa3, 0x4b, 0x13, 0x5f, 0x1e,
+ 0x9e, 0xa7, 0x06, 0x2d, 0x42, 0x6f, 0x54, 0x2b, 0x84, 0x4d, 0xfd, 0x6e, 0xdd,
+ 0x4b, 0xc5, 0x8d, 0xde, 0x8a, 0x47, 0x82, 0x73, 0x01, 0x74, 0x9c, 0x2d, 0xf1,
+ 0x4f, 0x20, 0xc7, 0xe7, 0x23, 0xd1, 0xc7, 0x86, 0x37,
+ ],
+ [
+ 0x76, 0xe2, 0x3a, 0x8c, 0x23, 0x57, 0x6a, 0x6d, 0x77, 0xc1, 0xef, 0x5c, 0x29,
+ 0xa5, 0xe3, 0xeb, 0x55, 0x60, 0xf8, 0x19, 0x60, 0x86, 0x9d, 0xa0, 0xdb, 0x03,
+ 0x55, 0xf8, 0x78, 0x9f, 0x93, 0x9a, 0x1a, 0x1f, 0xcb, 0xde, 0x8a, 0xee, 0x3d,
+ 0x79, 0x60, 0x0f, 0x16, 0xba, 0xdb, 0xd0, 0x5e, 0x01, 0xcd, 0x49, 0xe0, 0x46,
+ 0x7c, 0x72, 0x75, 0xb2, 0x11, 0x1c, 0x73, 0x24, 0xe3, 0x72, 0x89, 0x64,
+ ]
+ ),
+ test_case!(
+ [
+ 0xda, 0x47, 0x7c, 0x20, 0x0c, 0x53, 0x39, 0x7a, 0x41, 0xe9, 0x04, 0xd6, 0xe2,
+ 0x37, 0x49, 0x47, 0xec, 0x22, 0x1a, 0x11, 0x4c, 0x5b, 0x42, 0x6f, 0xa4, 0x05,
+ 0x65, 0xfe, 0xb6, 0x91, 0x57, 0xc2, 0x9b, 0x74, 0x32, 0xb3, 0x8e, 0x97, 0x27,
+ 0xb5, 0x24,
+ ],
+ [
+ 0x0a, 0x5c, 0x93, 0xef, 0x9c, 0x3e, 0xe6, 0xf3, 0xa2, 0xbf, 0xf9, 0x2c, 0x20,
+ 0x86, 0x79, 0xbe, 0x72, 0xe3, 0x09, 0x55,
+ ],
+ [
+ 0xd6, 0xf2, 0x02, 0x92, 0xf9, 0x7c, 0x69, 0x4b, 0xd3, 0x40, 0xc5, 0xba, 0x7a,
+ 0xe5, 0x14, 0x07, 0xae, 0xcc, 0xc6, 0x4f, 0xbe, 0x46, 0x0a, 0x40, 0x54, 0x2b,
+ 0x8d, 0x35, 0x8e, 0xf9, 0x29, 0x32,
+ ],
+ [
+ 0x49, 0x2e, 0x95, 0x4a, 0xa9, 0x0c, 0x08, 0x94, 0x0e, 0x1e, 0xeb, 0xa4, 0x66,
+ 0xc2, 0xed, 0xa5, 0x97, 0xc3, 0x51, 0xdb, 0xe6, 0xe4, 0xa5, 0xad, 0x7a, 0xfd,
+ 0x7d, 0x6f, 0x42, 0xc3, 0xb4, 0x88, 0x5b, 0xef, 0xdc, 0xf0, 0x33, 0x0b, 0x33,
+ 0x45, 0xe8, 0xfc, 0x40, 0x41, 0x9f, 0x74, 0x45, 0x42,
+ ],
+ [
+ 0x31, 0x0f, 0x89, 0xbf, 0xf5, 0x8a, 0x25, 0xfb, 0x64, 0xd2, 0x79, 0xba, 0x07,
+ 0xab, 0xd2, 0x58, 0x61, 0x8c, 0x02, 0x10, 0x74, 0xed, 0xdb, 0x6e, 0x7f, 0xbe,
+ 0x64, 0x95, 0xcd, 0x67, 0xdd, 0x10, 0x32, 0x9a, 0x97, 0x19, 0xa6, 0xb5, 0x53,
+ 0x6c, 0x07, 0xe5, 0xcd, 0x67, 0xfe, 0xbe, 0x68, 0x7c, 0xe8, 0xe3, 0x9d, 0x78,
+ 0x3e, 0x1b, 0x26, 0x5e, 0x64, 0xb2, 0x2c, 0x60, 0x5a, 0xe6, 0x13, 0xc6,
+ ]
+ ),
+ test_case!(
+ [
+ 0xc9, 0x10, 0x25, 0x7f, 0xd5, 0x52, 0x42, 0x78, 0x75, 0xae, 0x3a, 0xcb, 0xc4,
+ 0x51, 0xd1, 0x67, 0x8a, 0xba, 0x32, 0xc5, 0xab, 0x0c, 0xce, 0x7a, 0xef, 0x0b,
+ 0xfa, 0xb9, 0x39, 0xbe, 0x72, 0xb5, 0x5c, 0x05, 0x1a, 0xdd, 0xf1, 0x91, 0x96,
+ 0x7e, 0x40, 0xe8,
+ ],
+ [
+ 0x07, 0x78, 0x50, 0x5c, 0x66, 0xe0, 0x14, 0x8c, 0x43, 0xc0, 0x89, 0x30, 0xaf,
+ 0xff, 0x85, 0x63, 0x7c, 0x68, 0xcf, 0x4c,
+ ],
+ [
+ 0x5a, 0x68, 0xee, 0xb1, 0xd5, 0x4a, 0x7f, 0xca, 0x24, 0x0a, 0x0b, 0xc6, 0x98,
+ 0xe0, 0xce, 0x6b, 0xd9, 0x3d, 0xfc, 0x81, 0xe4, 0x41, 0xf8, 0xef, 0x31, 0x57,
+ 0x15, 0x06, 0x15, 0xb6, 0x05, 0x7f,
+ ],
+ [
+ 0x4a, 0xe7, 0x77, 0xbc, 0x8f, 0x64, 0xe7, 0x31, 0x86, 0xe2, 0x38, 0x39, 0xb8,
+ 0x97, 0x01, 0x9e, 0x2a, 0x4f, 0x2a, 0x05, 0x56, 0x97, 0x68, 0x14, 0x5c, 0x3b,
+ 0x91, 0xf5, 0x1d, 0xf3, 0x20, 0x3a, 0xb4, 0x83, 0x10, 0xf6, 0x0b, 0xc9, 0x7b,
+ 0xe8, 0x36, 0x36, 0x64, 0x3a, 0xc7, 0xa2, 0xe8, 0x37,
+ ],
+ [
+ 0x11, 0x77, 0xf8, 0xd5, 0x62, 0x70, 0x46, 0xee, 0xa6, 0x6a, 0xd8, 0xfe, 0xe1,
+ 0x4b, 0xf6, 0xac, 0xca, 0xf4, 0x9e, 0xfb, 0x70, 0xbd, 0x78, 0x33, 0x99, 0x56,
+ 0x6e, 0xcd, 0x7a, 0x23, 0x0f, 0x44, 0xea, 0x47, 0x8d, 0xbc, 0xcb, 0x53, 0x91,
+ 0xdf, 0x06, 0x18, 0x64, 0x3c, 0x1b, 0xf5, 0x94, 0xd3, 0xeb, 0xa8, 0xdf, 0xf7,
+ 0x4e, 0x70, 0x98, 0x52, 0x2b, 0xa0, 0xa7, 0x9f, 0x53, 0x1e, 0x3c, 0xd5,
+ ]
+ ),
+ test_case!(
+ [
+ 0x89, 0x6b, 0xb1, 0xe2, 0x58, 0x28, 0x8e, 0xa0, 0x54, 0x40, 0x7f, 0x11, 0x56,
+ 0x59, 0xce, 0x03, 0x0f, 0x62, 0xf5, 0x17, 0xe9, 0xce, 0x2b, 0xe1, 0x2f, 0xaa,
+ 0x89, 0x1f, 0xaf, 0x34, 0xda, 0x8a, 0xed, 0x73, 0x28, 0xf1, 0x25, 0x48, 0x34,
+ 0xac, 0xd0, 0xb3, 0x2a,
+ ],
+ [
+ 0x1a, 0x93, 0x96, 0xdf, 0xb9, 0x5d, 0x50, 0x20, 0x1a, 0x02, 0xfc, 0x45, 0xaf,
+ 0x2d, 0x23, 0xe4, 0xf3, 0x4b, 0xdc, 0xb3,
+ ],
+ [
+ 0x9d, 0x36, 0x9c, 0x71, 0xca, 0x90, 0xb5, 0x34, 0xbe, 0x9c, 0x93, 0x6b, 0x51,
+ 0xeb, 0x30, 0x80, 0xf4, 0xfd, 0x95, 0x8f, 0x8b, 0xdf, 0x8e, 0x46, 0x6a, 0xa4,
+ 0xec, 0xbe, 0x6b, 0x1d, 0x2c, 0xe2,
+ ],
+ [
+ 0x97, 0x04, 0x07, 0xec, 0x33, 0xbb, 0x69, 0x40, 0xd7, 0x55, 0xca, 0x73, 0x94,
+ 0x7e, 0x0a, 0x0f, 0x84, 0x17, 0x84, 0x22, 0x9b, 0x6a, 0xab, 0xa0, 0x8b, 0x81,
+ 0xb4, 0x08, 0x86, 0x5e, 0xb1, 0xc7, 0xea, 0x87, 0x87, 0x27, 0xd0, 0x90, 0x05,
+ 0xf1, 0xf4, 0x07, 0x06, 0xae, 0x32, 0xeb, 0x36, 0x9e,
+ ],
+ [
+ 0x41, 0x07, 0xf1, 0x39, 0x65, 0x07, 0xa1, 0x7b, 0x45, 0xe6, 0x41, 0x4f, 0x21,
+ 0xe1, 0x0f, 0x6f, 0xc3, 0x40, 0x6d, 0xc5, 0xaa, 0xca, 0xe6, 0xeb, 0x45, 0x15,
+ 0xf2, 0x91, 0xc6, 0x68, 0x76, 0x57, 0x73, 0x16, 0x8b, 0x1a, 0x9c, 0x4f, 0x7d,
+ 0xf5, 0x64, 0xab, 0x7a, 0x09, 0x46, 0x96, 0x75, 0x8c, 0xf7, 0x8a, 0x14, 0x35,
+ 0x42, 0x80, 0xc0, 0xf6, 0x78, 0xe0, 0xc3, 0xcc, 0xfa, 0xd9, 0x28, 0x8b,
+ ]
+ ),
+ test_case!(
+ [
+ 0x6c, 0x8d, 0xe8, 0x8f, 0x42, 0x6b, 0x1a, 0xf8, 0xde, 0x5f, 0xf2, 0x40, 0xdd,
+ 0x3b, 0x39, 0x85, 0x41, 0x9c, 0xf5, 0xa8, 0x91, 0x94, 0xde, 0x20, 0x62, 0x80,
+ 0xb9, 0x82, 0xbe, 0x02, 0x4f, 0xdf, 0x2a, 0x32, 0xca, 0x59, 0xbb, 0xf7, 0xbf,
+ 0x2f, 0xa1, 0x37, 0x2e, 0x18,
+ ],
+ [
+ 0x89, 0x59, 0x0b, 0x53, 0x02, 0x3e, 0x70, 0xe1, 0xff, 0x64, 0x57, 0x97, 0x2b,
+ 0x1e, 0xf4, 0xfb, 0x54, 0xac, 0x01, 0x66,
+ ],
+ [
+ 0xb7, 0x66, 0x23, 0xb4, 0xe4, 0x86, 0xf5, 0x19, 0x62, 0xae, 0xb2, 0x19, 0x9c,
+ 0xe3, 0x79, 0x79, 0x83, 0x86, 0x4e, 0xff, 0xd7, 0x0e, 0x6e, 0x2b, 0x5f, 0x6d,
+ 0xc6, 0x3c, 0xb5, 0xa8, 0x12, 0x95,
+ ],
+ [
+ 0x26, 0x96, 0xde, 0x5e, 0xc8, 0x77, 0x52, 0xb7, 0xb4, 0x9a, 0x6a, 0x16, 0x67,
+ 0xfe, 0x91, 0xd6, 0x4b, 0x55, 0xbf, 0xc4, 0x5c, 0x5f, 0xc2, 0x47, 0xac, 0xb1,
+ 0x4d, 0x17, 0xee, 0x32, 0xc1, 0x75, 0xa8, 0x9c, 0x79, 0x6e, 0x58, 0x66, 0xcb,
+ 0xe7, 0x6c, 0xdc, 0x1c, 0xc9, 0xc7, 0xd7, 0x42, 0xdd,
+ ],
+ [
+ 0x0b, 0x0f, 0x2d, 0x9d, 0x8c, 0x7f, 0x42, 0x2e, 0x24, 0x3b, 0xc6, 0x3a, 0x9a,
+ 0xf1, 0x56, 0x93, 0x62, 0x03, 0xe1, 0xe2, 0xf4, 0xc4, 0xed, 0xa9, 0x48, 0x79,
+ 0x5d, 0xd2, 0xa2, 0xe5, 0x6f, 0xe1, 0xa2, 0x68, 0xa3, 0xfa, 0x95, 0x52, 0x5b,
+ 0x0a, 0xbd, 0x6d, 0x30, 0xf9, 0x61, 0x72, 0x50, 0xf6, 0x73, 0xa8, 0xd1, 0x0a,
+ 0xd4, 0x41, 0xc9, 0x0d, 0x7e, 0xc1, 0x45, 0x9e, 0x50, 0x97, 0x20, 0x3d,
+ ]
+ ),
+ test_case!(
+ [
+ 0x11, 0x94, 0xd3, 0x97, 0x1c, 0x7d, 0x20, 0xe2, 0xcc, 0x2f, 0x29, 0xa7, 0x96,
+ 0x14, 0x0f, 0xd9, 0xd3, 0x3f, 0x1b, 0xf2, 0x43, 0x46, 0x51, 0xec, 0x65, 0x53,
+ 0xf5, 0xc7, 0xa3, 0xc9, 0x65, 0x2e, 0x44, 0x46, 0x2a, 0x54, 0xa2, 0xaa, 0x22,
+ 0x5d, 0xc4, 0xe2, 0x15, 0x03, 0xc9,
+ ],
+ [
+ 0xbf, 0x36, 0xd5, 0xd7, 0xbb, 0xfa, 0x57, 0x5e, 0x59, 0x92, 0x4a, 0x9e, 0xc3,
+ 0x66, 0xc2, 0xa1, 0xea, 0xb5, 0xdb, 0x9a,
+ ],
+ [
+ 0x3f, 0x54, 0x1f, 0xba, 0x9b, 0xbd, 0x60, 0xae, 0x9c, 0xe4, 0x60, 0x93, 0x4d,
+ 0xc6, 0x32, 0x71, 0x90, 0x9c, 0x03, 0x4e, 0x89, 0x29, 0x17, 0x5b, 0x07, 0xae,
+ 0x21, 0xda, 0xda, 0x59, 0x9f, 0x63,
+ ],
+ [
+ 0x73, 0x16, 0xda, 0xea, 0x04, 0x65, 0xdc, 0xc8, 0xc5, 0x19, 0x96, 0xa7, 0xb4,
+ 0xad, 0xb5, 0x31, 0x4f, 0xd3, 0x37, 0x23, 0xe8, 0x33, 0x19, 0x1e, 0x33, 0x3c,
+ 0xaf, 0xe7, 0x39, 0x4c, 0x7b, 0x4a, 0x0c, 0x4c, 0xc6, 0x91, 0x10, 0xc3, 0x2c,
+ 0xba, 0xbd, 0x1d, 0x83, 0x7f, 0x0b, 0xc8, 0x20, 0xd4,
+ ],
+ [
+ 0x9a, 0xd8, 0x8d, 0xfa, 0x8a, 0x56, 0x0e, 0x06, 0xa6, 0x8d, 0xa2, 0xb5, 0xb4,
+ 0x6a, 0xdd, 0x9b, 0xe8, 0x48, 0x61, 0x33, 0xfe, 0x99, 0x56, 0x8a, 0xd4, 0x5f,
+ 0x9c, 0xc1, 0xda, 0xd6, 0xdb, 0xab, 0xbb, 0x5b, 0x64, 0xba, 0x09, 0xdf, 0x9c,
+ 0x1e, 0xb6, 0x8c, 0xfd, 0x75, 0x6e, 0xc8, 0x5d, 0x44, 0xcd, 0xc7, 0x9d, 0x3f,
+ 0x28, 0xfe, 0x8b, 0x64, 0x6c, 0x32, 0xcd, 0x89, 0x0e, 0x2a, 0x4e, 0xd1,
+ ]
+ ),
+ test_case!(
+ [
+ 0x2c, 0xca, 0xd2, 0x8f, 0xf9, 0xc3, 0x0f, 0xbf, 0x06, 0x1b, 0xb0, 0x7a, 0x15,
+ 0x6e, 0x2b, 0x8e, 0x36, 0x86, 0xf5, 0x00, 0xc4, 0x5e, 0x49, 0x7f, 0x8b, 0xbb,
+ 0x92, 0xad, 0x0d, 0xce, 0x7f, 0x71, 0x0c, 0x4c, 0xdf, 0x4d, 0x72, 0x32, 0x57,
+ 0x22, 0xe2, 0x02, 0x05, 0x25, 0x01, 0x26,
+ ],
+ [
+ 0x2a, 0xf3, 0x37, 0xb6, 0xaf, 0x81, 0x5a, 0xd6, 0x4e, 0x95, 0xcb, 0x6f, 0xd7,
+ 0x57, 0x8a, 0x54, 0xdb, 0x2d, 0x84, 0xb5,
+ ],
+ [
+ 0xbf, 0x7e, 0x37, 0x30, 0x80, 0xf1, 0xe3, 0x57, 0x33, 0xa7, 0x1b, 0x55, 0x17,
+ 0x2b, 0xa4, 0x66, 0x4c, 0xa8, 0x14, 0x88, 0xc4, 0xdf, 0x10, 0x01, 0x32, 0x3b,
+ 0x65, 0xb6, 0xbc, 0x14, 0x94, 0x9d,
+ ],
+ [
+ 0x4b, 0xe9, 0x0b, 0x3e, 0xd8, 0x8f, 0x84, 0xb7, 0xeb, 0x31, 0x8e, 0x2c, 0x85,
+ 0x83, 0xab, 0x2a, 0x61, 0x0b, 0x00, 0x32, 0x53, 0x69, 0xf5, 0x0a, 0xad, 0x11,
+ 0x9f, 0x24, 0x14, 0x2f, 0x56, 0x45, 0x5d, 0x76, 0x95, 0xf5, 0x03, 0x49, 0xa6,
+ 0x42, 0x25, 0xae, 0x08, 0xa7, 0xf4, 0x7c, 0x0d, 0xc9,
+ ],
+ [
+ 0xbe, 0xbc, 0x4b, 0xb0, 0x44, 0x1a, 0x50, 0x64, 0xce, 0x36, 0x78, 0x25, 0xe1,
+ 0x90, 0x6f, 0xc1, 0xc8, 0xbf, 0xd9, 0xe2, 0x66, 0x69, 0x90, 0xd5, 0xd7, 0x0b,
+ 0x87, 0x10, 0xe5, 0xa7, 0x90, 0x93, 0xde, 0x67, 0xc5, 0x94, 0x80, 0x19, 0xd8,
+ 0xb7, 0xf9, 0x48, 0x9a, 0xeb, 0x58, 0xe5, 0x2e, 0xca, 0xe1, 0xe8, 0x1f, 0x11,
+ 0x1c, 0x14, 0xf5, 0xda, 0x3c, 0xc2, 0x32, 0x28, 0x7e, 0x87, 0x69, 0xca,
+ ]
+ ),
+ test_case!(
+ [
+ 0xfb, 0x71, 0x78, 0x65, 0x7e, 0x2a, 0x03, 0x55, 0x0d, 0x2d, 0x22, 0x18, 0x65,
+ 0xd2, 0x8e, 0xae, 0xa0, 0xb9, 0x05, 0x44, 0xc8, 0x68, 0x10, 0x6b, 0xaa, 0xa6,
+ 0x7e, 0x20, 0xb8, 0x3e, 0xff, 0x2d, 0x99, 0xf8, 0x4e, 0x9b, 0x8f, 0xdc, 0x75,
+ 0x27, 0xde, 0x44, 0xae, 0x36, 0x33, 0x3c, 0x13,
+ ],
+ [
+ 0x47, 0x2a, 0x47, 0xdc, 0xda, 0xa3, 0xda, 0xb9, 0x64, 0x88, 0xad, 0x1d, 0xca,
+ 0x6e, 0x3b, 0x52, 0x63, 0x32, 0x0d, 0x86,
+ ],
+ [
+ 0x0c, 0xcb, 0x96, 0x36, 0x0a, 0xbe, 0xcc, 0x07, 0xf4, 0x1c, 0xf9, 0x30, 0x05,
+ 0x07, 0x00, 0x0f, 0x6a, 0xb8, 0x94, 0xbd, 0xa9, 0x20, 0x85, 0x97, 0x55, 0x6b,
+ 0x26, 0x35, 0x19, 0x40, 0xe6, 0xdb,
+ ],
+ [
+ 0x5e, 0x0f, 0xcc, 0x43, 0x58, 0x47, 0x50, 0x4a, 0x2d, 0xc0, 0x68, 0x7b, 0x8b,
+ 0xf6, 0xd5, 0x0a, 0x87, 0x17, 0x19, 0x6b, 0x45, 0xa6, 0xe1, 0xb6, 0xe9, 0x6c,
+ 0x92, 0x91, 0xc3, 0x8e, 0xa6, 0xdd, 0x55, 0xd3, 0x77, 0x1b, 0x21, 0x1d, 0x93,
+ 0xb8, 0xe8, 0x5b, 0x94, 0x7c, 0x49, 0x81, 0x66, 0x9d,
+ ],
+ [
+ 0xea, 0x93, 0xf2, 0x02, 0xbc, 0xf3, 0x54, 0x76, 0xc1, 0xd9, 0xdb, 0x4d, 0x10,
+ 0x05, 0x72, 0x5f, 0xbf, 0x54, 0xe3, 0xce, 0x29, 0x10, 0x36, 0xa3, 0xd6, 0xfc,
+ 0x69, 0x56, 0xbe, 0xaa, 0x6e, 0x35, 0x85, 0x43, 0xc6, 0x30, 0x65, 0x2d, 0x59,
+ 0x63, 0x1f, 0x2a, 0xde, 0x0b, 0x5a, 0x56, 0x72, 0x1e, 0x8a, 0xe8, 0x3f, 0x1c,
+ 0xe9, 0xc3, 0x69, 0x14, 0x06, 0xed, 0xd8, 0x37, 0x7c, 0x8b, 0x38, 0x6c,
+ ]
+ ),
+ test_case!(
+ [
+ 0xc9, 0x83, 0xe9, 0xe5, 0x7b, 0x98, 0xd8, 0xe3, 0x1a, 0xc4, 0x54, 0x0b, 0x9c,
+ 0x7e, 0x1b, 0xd4, 0x0e, 0x30, 0x47, 0x68, 0x78, 0xd4, 0x11, 0x04, 0xca, 0x7a,
+ 0xa2, 0xf6, 0x02, 0x0c, 0x81, 0xa3, 0xdd, 0x66, 0x87, 0x59, 0x76, 0x3e, 0x7e,
+ 0x30, 0x9e, 0x25, 0xed, 0xe6, 0x73, 0xbc, 0x35, 0x3d,
+ ],
+ [
+ 0xdb, 0xa0, 0x1a, 0x5a, 0x66, 0x3c, 0xc0, 0x9d, 0xe1, 0xde, 0x7c, 0xb9, 0xea,
+ 0x61, 0x3f, 0x03, 0x34, 0x88, 0x0d, 0xeb,
+ ],
+ [
+ 0x33, 0xb7, 0xcb, 0x12, 0xcc, 0x63, 0x2d, 0x58, 0x46, 0xe1, 0xf0, 0xc2, 0x35,
+ 0xb1, 0x5b, 0x2e, 0x78, 0xba, 0xd3, 0xd4, 0xe2, 0x39, 0xc5, 0x6f, 0xb4, 0x22,
+ 0x29, 0x95, 0x9a, 0xc1, 0x9e, 0x61,
+ ],
+ [
+ 0x46, 0x90, 0x27, 0x01, 0x7c, 0x8d, 0xe0, 0xa9, 0x4d, 0x7a, 0xa3, 0x66, 0x7b,
+ 0xc3, 0xe3, 0x63, 0xb6, 0x45, 0x5d, 0xec, 0xc7, 0x2c, 0xf4, 0x5e, 0x9c, 0xeb,
+ 0x1b, 0x66, 0x96, 0xa1, 0xa0, 0x65, 0x0c, 0x08, 0xfc, 0x0a, 0xfb, 0x10, 0x54,
+ 0x05, 0xb6, 0x12, 0xf0, 0x82, 0x31, 0xeb, 0x5b, 0x6d,
+ ],
+ [
+ 0x1d, 0x20, 0xf0, 0x5a, 0x6e, 0x15, 0x80, 0xdc, 0xfc, 0x8c, 0xa8, 0x19, 0xac,
+ 0x6f, 0x24, 0xdc, 0xef, 0x4b, 0x7d, 0x63, 0xee, 0xb8, 0x2a, 0xa5, 0xde, 0xfe,
+ 0xd7, 0x71, 0x9a, 0xb5, 0xa1, 0x3c, 0x48, 0x0a, 0x0b, 0x52, 0xa8, 0x4b, 0x2d,
+ 0x58, 0x08, 0xd5, 0x8c, 0x40, 0x61, 0x52, 0xaa, 0x11, 0xa5, 0xed, 0x4b, 0xff,
+ 0xf0, 0x2d, 0x95, 0x5e, 0xb4, 0x7e, 0x01, 0xcf, 0xc3, 0xcb, 0x44, 0xf8,
+ ]
+ ),
+ test_case!(
+ [
+ 0x5e, 0xfd, 0x66, 0x15, 0xf2, 0x09, 0x8e, 0x56, 0xab, 0x7f, 0xeb, 0x2b, 0x59,
+ 0x9d, 0xf0, 0x51, 0x8b, 0xef, 0xc3, 0xc4, 0xa2, 0xe6, 0xbc, 0x20, 0x0f, 0x7c,
+ 0x04, 0x72, 0x17, 0x77, 0x01, 0x66, 0x2e, 0x6b, 0x8d, 0x1d, 0xb6, 0x5b, 0x71,
+ 0xbc, 0x1a, 0x54, 0xa2, 0xca, 0x54, 0x17, 0xd6, 0xb9, 0xec,
+ ],
+ [
+ 0xbb, 0xdd, 0x49, 0x95, 0xe9, 0x00, 0xa6, 0x4e, 0xd0, 0x3b, 0x8e, 0x73, 0x89,
+ 0xd4, 0x0d, 0x18, 0x71, 0xd4, 0x2c, 0x86,
+ ],
+ [
+ 0xee, 0x54, 0x73, 0xe6, 0x6e, 0x57, 0xce, 0x46, 0x19, 0x9e, 0x97, 0x21, 0xce,
+ 0x82, 0xe2, 0x81, 0x40, 0x41, 0x9f, 0x73, 0x33, 0xe0, 0xb8, 0x02, 0xa0, 0x51,
+ 0xee, 0xeb, 0x29, 0x9d, 0x3b, 0x4b,
+ ],
+ [
+ 0x39, 0x03, 0xbd, 0x3c, 0x08, 0x73, 0xb5, 0x5b, 0xa8, 0xb1, 0x54, 0x70, 0xac,
+ 0x95, 0xaa, 0x8c, 0xfe, 0x95, 0x67, 0xbe, 0xce, 0x7b, 0x6b, 0x70, 0x52, 0xd5,
+ 0xb0, 0xb6, 0xd0, 0xc2, 0x40, 0x3c, 0x68, 0x18, 0xd4, 0x03, 0x1d, 0xe7, 0x59,
+ 0x1c, 0x43, 0x3f, 0xe0, 0x7c, 0x0a, 0x4f, 0x21, 0x8f,
+ ],
+ [
+ 0x29, 0x55, 0x1c, 0x3f, 0x00, 0xc2, 0x02, 0x60, 0x56, 0xac, 0xfd, 0x08, 0x02,
+ 0x3e, 0xc2, 0x59, 0x86, 0xe6, 0x7b, 0x45, 0xa9, 0xea, 0xff, 0x73, 0x56, 0xe6,
+ 0x27, 0xc6, 0x46, 0xb9, 0x38, 0x6d, 0xb4, 0x18, 0x58, 0x99, 0x14, 0x54, 0xcc,
+ 0x1d, 0x69, 0x08, 0xff, 0xa7, 0x1a, 0x0e, 0xe8, 0x2c, 0x9e, 0x8d, 0xec, 0xd8,
+ 0xee, 0x77, 0x78, 0x2e, 0xb2, 0x8c, 0xf1, 0x24, 0x1b, 0x39, 0x30, 0x23,
+ ]
+ ),
+ test_case!(
+ [
+ 0xf7, 0x40, 0x5a, 0xa3, 0x7f, 0xd3, 0xd2, 0x01, 0xbe, 0xd3, 0x10, 0xdc, 0xe2,
+ 0x3d, 0x9c, 0xa7, 0x8c, 0x2b, 0x84, 0x67, 0xdc, 0x81, 0x08, 0x95, 0x82, 0x3b,
+ 0xdf, 0xe7, 0xbc, 0x22, 0x46, 0x83, 0x55, 0x77, 0xe4, 0xd9, 0xad, 0xed, 0x7c,
+ 0x79, 0x10, 0x44, 0x0a, 0x70, 0x06, 0xcc, 0x49, 0x82, 0xf6, 0x05,
+ ],
+ [
+ 0x53, 0x7b, 0x67, 0xf4, 0x7f, 0x1b, 0x6b, 0x01, 0x17, 0xfc, 0x38, 0x6a, 0x5b,
+ 0xcd, 0xd9, 0xe6, 0xac, 0xd1, 0xe5, 0x87,
+ ],
+ [
+ 0x5e, 0xe3, 0xd0, 0xaa, 0x3d, 0xec, 0xe1, 0xad, 0x94, 0xe9, 0xd1, 0xe7, 0xbd,
+ 0x5d, 0xb0, 0x1d, 0xd7, 0x17, 0xdd, 0x41, 0xa9, 0xf3, 0x89, 0x83, 0xf7, 0xf9,
+ 0x19, 0x9f, 0x46, 0xd6, 0xe3, 0xb6,
+ ],
+ [
+ 0x6c, 0x69, 0x96, 0x9d, 0x44, 0xb2, 0x1f, 0xbc, 0xc0, 0x75, 0x01, 0x65, 0xbe,
+ 0xbe, 0x31, 0xc8, 0xe3, 0x9d, 0x55, 0x2f, 0xaf, 0x9b, 0x13, 0xda, 0x8d, 0xa9,
+ 0xec, 0x7e, 0x3d, 0xa0, 0xc7, 0xcf, 0x0d, 0x76, 0x6b, 0x12, 0xed, 0x34, 0x2e,
+ 0x83, 0x99, 0x46, 0x69, 0xd8, 0x2b, 0x3c, 0x66, 0x11,
+ ],
+ [
+ 0x99, 0x03, 0xdf, 0x7e, 0x06, 0x6c, 0x07, 0x1e, 0x4d, 0xd6, 0x92, 0xeb, 0xf2,
+ 0x48, 0x72, 0xe9, 0xd3, 0x23, 0x58, 0x63, 0x77, 0x19, 0x85, 0x83, 0xe3, 0x7f,
+ 0xc8, 0x07, 0xc4, 0xb1, 0xa1, 0xf7, 0x65, 0x5f, 0xdc, 0x6e, 0x8a, 0xc7, 0x98,
+ 0xb7, 0x09, 0xac, 0x04, 0xa0, 0xc5, 0x24, 0x03, 0xd3, 0x45, 0x22, 0x69, 0x0f,
+ 0xf4, 0xba, 0x63, 0x67, 0x3f, 0x20, 0x18, 0x23, 0xa5, 0x9e, 0x35, 0x68,
+ ]
+ ),
+ test_case!(
+ [
+ 0x2a, 0xdc, 0x00, 0x96, 0x8f, 0x27, 0x34, 0xb8, 0xd7, 0xe8, 0x6e, 0x42, 0xc1,
+ 0x25, 0xe7, 0xcf, 0xe1, 0x00, 0x13, 0x9c, 0x4b, 0xe3, 0x75, 0x83, 0x1a, 0x09,
+ 0x09, 0xe5, 0xa0, 0x93, 0x91, 0x7a, 0x8c, 0xe2, 0x13, 0xa9, 0x71, 0x48, 0x34,
+ 0x46, 0x67, 0x8b, 0xd9, 0x7f, 0xeb, 0xaf, 0x62, 0xc9, 0x92, 0x7d, 0x8e,
+ ],
+ [
+ 0xbc, 0xad, 0x81, 0xcc, 0x0c, 0x29, 0x8f, 0xe1, 0x5d, 0x0e, 0xc1, 0xe6, 0x65,
+ 0x08, 0x72, 0xfc, 0x78, 0x27, 0xc5, 0x3a,
+ ],
+ [
+ 0x2f, 0x2a, 0xc5, 0x04, 0x29, 0x6c, 0x27, 0xaa, 0xc7, 0x5f, 0x69, 0x79, 0xc4,
+ 0xe1, 0xae, 0x38, 0x61, 0xed, 0x25, 0xc6, 0xed, 0x41, 0x2f, 0x3b, 0xb8, 0xb9,
+ 0x41, 0x9b, 0xef, 0x4d, 0x15, 0x61,
+ ],
+ [
+ 0xea, 0xc1, 0x74, 0x8c, 0x9f, 0xf7, 0x13, 0x09, 0x18, 0x72, 0x41, 0xc9, 0x98,
+ 0x53, 0x02, 0x22, 0xb0, 0x93, 0x79, 0xa0, 0x8e, 0xea, 0x51, 0x22, 0xa3, 0x16,
+ 0x0b, 0xc8, 0xa6, 0xe9, 0xc3, 0x24, 0x9d, 0xbd, 0x5e, 0x68, 0x62, 0x0e, 0xb3,
+ 0x41, 0xea, 0x68, 0x5e, 0xc9, 0x0f, 0xd0, 0x5b, 0xe8,
+ ],
+ [
+ 0xf0, 0x50, 0x76, 0xed, 0x62, 0x4c, 0xf8, 0x35, 0xd8, 0xf3, 0x57, 0xc8, 0x98,
+ 0xbc, 0x5e, 0x07, 0x24, 0x3a, 0x01, 0x50, 0x9b, 0xe9, 0xef, 0x00, 0x0b, 0x97,
+ 0xec, 0x27, 0x96, 0x59, 0x36, 0xab, 0xd9, 0xc0, 0x1c, 0xd8, 0xc5, 0xf3, 0x7e,
+ 0xa9, 0xb6, 0x55, 0x05, 0x82, 0xc0, 0xe6, 0x27, 0xbb, 0xa4, 0x0f, 0xd5, 0x9f,
+ 0x06, 0xf0, 0x6a, 0x19, 0x94, 0x0e, 0x5a, 0xef, 0x6b, 0x1a, 0x0a, 0x3a,
+ ]
+ ),
+ test_case!(
+ [
+ 0x4e, 0x8c, 0xd7, 0x32, 0x43, 0x7e, 0xdd, 0x54, 0x1b, 0x03, 0x30, 0xac, 0xac,
+ 0xb7, 0x0a, 0xe0, 0x18, 0xa2, 0x32, 0x9f, 0x35, 0x8e, 0xb7, 0x34, 0x2c, 0xf3,
+ 0xf6, 0x35, 0x8f, 0x62, 0x26, 0x42, 0x2f, 0xd4, 0x59, 0x3c, 0xc8, 0xf8, 0x58,
+ 0xf3, 0x0f, 0x65, 0xd8, 0xe4, 0x8c, 0x88, 0x6a, 0x4c, 0xfb, 0x14, 0x56, 0xea,
+ ],
+ [
+ 0x3f, 0xb1, 0x23, 0x41, 0x2a, 0xd3, 0xdb, 0xcb, 0x43, 0x5c, 0x03, 0x1c, 0x62,
+ 0xd3, 0x7b, 0xf6, 0x19, 0x92, 0x9e, 0x72,
+ ],
+ [
+ 0xea, 0x7c, 0x5d, 0x3f, 0x37, 0x10, 0x32, 0x2e, 0x22, 0x00, 0x71, 0x4e, 0x5c,
+ 0xd7, 0xe3, 0x90, 0x73, 0x51, 0x0c, 0x11, 0xf0, 0xba, 0x0c, 0x70, 0xcf, 0x23,
+ 0x56, 0x6f, 0x1a, 0xfa, 0xe4, 0x86,
+ ],
+ [
+ 0x78, 0x33, 0xa4, 0xba, 0x03, 0xb1, 0x09, 0x54, 0xfe, 0x76, 0x12, 0xe5, 0xb0,
+ 0xbd, 0xf8, 0x1d, 0xe6, 0x6f, 0xfd, 0x63, 0xe8, 0x5c, 0x63, 0x40, 0x25, 0xde,
+ 0xb6, 0x3f, 0x02, 0xca, 0x55, 0xd5, 0x03, 0xcd, 0x9d, 0xd8, 0x8a, 0xf3, 0x34,
+ 0x28, 0xe7, 0x82, 0xdd, 0x46, 0xdc, 0x14, 0xb6, 0x17,
+ ],
+ [
+ 0x2d, 0xb5, 0xba, 0xf4, 0xd1, 0x1b, 0xc5, 0x70, 0x04, 0xc0, 0xf8, 0x99, 0x39,
+ 0xbd, 0x3f, 0x65, 0x16, 0xba, 0x26, 0xab, 0x5a, 0xcb, 0x5e, 0x13, 0x45, 0xde,
+ 0xa8, 0x4c, 0x13, 0x8f, 0x05, 0x98, 0x74, 0x47, 0x04, 0x11, 0x72, 0xa7, 0xe8,
+ 0x81, 0x45, 0x83, 0x32, 0x1e, 0x9e, 0xb5, 0x1b, 0x08, 0xa6, 0x7e, 0xe0, 0x75,
+ 0x05, 0x89, 0x5a, 0x69, 0x18, 0xa7, 0x0a, 0x00, 0x9e, 0x00, 0xa0, 0x07,
+ ]
+ ),
+ test_case!(
+ [
+ 0x7e, 0x5a, 0xc5, 0x2c, 0xec, 0x3a, 0xcc, 0xfd, 0x72, 0x35, 0x5f, 0x45, 0xf1,
+ 0xbb, 0x36, 0x53, 0xb7, 0x3c, 0xd8, 0x9d, 0xed, 0x39, 0x51, 0x9f, 0xb7, 0x98,
+ 0xcd, 0x88, 0x0f, 0x95, 0x63, 0xa8, 0x1f, 0x45, 0x9e, 0xbc, 0x9b, 0xfc, 0x2b,
+ 0x5a, 0x7d, 0x56, 0xd8, 0xfc, 0x8c, 0x09, 0xaa, 0x72, 0xdb, 0x2c, 0x7d, 0x9a,
+ 0x58,
+ ],
+ [
+ 0x2c, 0xb8, 0xb5, 0x49, 0xd8, 0x10, 0x80, 0x9d, 0xed, 0xb9, 0x3d, 0xcb, 0xfe,
+ 0xb9, 0x00, 0xd6, 0xae, 0x04, 0x77, 0xff,
+ ],
+ [
+ 0x22, 0x1f, 0x10, 0x7a, 0xdc, 0xc1, 0x84, 0xfa, 0x55, 0x89, 0xa2, 0x02, 0xad,
+ 0x1d, 0x5e, 0xe8, 0xce, 0xaf, 0x35, 0x0a, 0x1b, 0xc9, 0x23, 0x0a, 0x9a, 0x44,
+ 0x90, 0x72, 0xc6, 0x41, 0x4e, 0xb4,
+ ],
+ [
+ 0xa5, 0x9b, 0xf6, 0x79, 0xc0, 0x07, 0xb6, 0xcc, 0xbf, 0xcd, 0xfa, 0x56, 0x07,
+ 0x3a, 0xb8, 0x95, 0x59, 0x49, 0x27, 0x4e, 0x1e, 0xe8, 0x75, 0x9b, 0x04, 0x9d,
+ 0xa5, 0xc8, 0x0e, 0xcd, 0x8b, 0xa7, 0xc0, 0xc5, 0x8e, 0xb1, 0x4d, 0xa0, 0x25,
+ 0x08, 0xbe, 0x37, 0xc1, 0x6f, 0xd6, 0x59, 0x09, 0x61,
+ ],
+ [
+ 0xc0, 0xa3, 0x5e, 0x5b, 0x31, 0xd0, 0xc0, 0x3c, 0xd1, 0x37, 0xd3, 0x25, 0x22,
+ 0x50, 0xca, 0xbd, 0xa4, 0x85, 0x30, 0x64, 0xaf, 0x6f, 0xa1, 0xec, 0x0c, 0xc3,
+ 0x79, 0x08, 0xd2, 0x06, 0xaf, 0xd1, 0xd4, 0x43, 0xb9, 0xe0, 0xf6, 0x14, 0x3b,
+ 0x7c, 0xf2, 0xf8, 0x00, 0x47, 0x15, 0x85, 0xfd, 0xca, 0x5a, 0x65, 0xc7, 0x80,
+ 0xe1, 0xd0, 0x57, 0x79, 0x84, 0x0f, 0xd0, 0xe3, 0x12, 0x86, 0x99, 0x7e,
+ ]
+ ),
+ test_case!(
+ [
+ 0x4b, 0x3c, 0x61, 0xeb, 0x1a, 0x4f, 0x06, 0x8a, 0x24, 0xbc, 0xed, 0x90, 0xfd,
+ 0xd3, 0x00, 0xc8, 0xf2, 0xf7, 0xb4, 0x01, 0x57, 0x1c, 0x33, 0x94, 0x48, 0x7f,
+ 0x34, 0x5e, 0x89, 0xe4, 0x1c, 0xe4, 0xe0, 0x09, 0xe6, 0x12, 0xdf, 0x1b, 0x8e,
+ 0x14, 0x13, 0x62, 0x32, 0xc3, 0x30, 0x06, 0x87, 0xb2, 0x22, 0xaf, 0x5e, 0xb8,
+ 0x0b, 0xae,
+ ],
+ [
+ 0x3d, 0x11, 0x99, 0xb2, 0xd4, 0x58, 0x02, 0x6e, 0x1e, 0x24, 0xe6, 0x7d, 0x91,
+ 0x10, 0x7b, 0x3f, 0xd9, 0x58, 0xc2, 0xb7,
+ ],
+ [
+ 0x21, 0x4c, 0x6e, 0x88, 0x42, 0xb9, 0xc2, 0xe0, 0x33, 0x6d, 0xb4, 0x5f, 0x42,
+ 0x90, 0x16, 0xf1, 0x1d, 0x02, 0xf2, 0x1c, 0xba, 0xbc, 0xb9, 0xb5, 0x2d, 0x7a,
+ 0x16, 0xd0, 0x99, 0xc2, 0x93, 0x52,
+ ],
+ [
+ 0x33, 0x30, 0x2c, 0x21, 0xca, 0x13, 0x47, 0x9b, 0xd7, 0xb6, 0x2d, 0x43, 0x65,
+ 0x5f, 0xe2, 0xca, 0xbc, 0x5a, 0xdd, 0x3c, 0xd7, 0x68, 0xd9, 0xbe, 0x24, 0xae,
+ 0x77, 0xe1, 0x6a, 0xf7, 0x01, 0x9f, 0xcd, 0xf8, 0x2d, 0xc0, 0xeb, 0xa0, 0xc6,
+ 0x47, 0x73, 0xe3, 0x7c, 0x01, 0xf9, 0xf4, 0xbe, 0xd2,
+ ],
+ [
+ 0x99, 0x89, 0xea, 0x7f, 0xdb, 0x37, 0x99, 0xb2, 0xc7, 0x4e, 0xc5, 0x7e, 0x67,
+ 0x08, 0x6b, 0xc7, 0x74, 0x79, 0xde, 0xaa, 0x73, 0x6b, 0x48, 0x0e, 0x82, 0x56,
+ 0x7f, 0x82, 0x50, 0xf0, 0xda, 0x9b, 0x70, 0xf4, 0x76, 0x35, 0x58, 0x06, 0x3f,
+ 0x15, 0x78, 0xef, 0x3e, 0x0d, 0x28, 0x3d, 0x41, 0x34, 0x85, 0xe9, 0x43, 0xde,
+ 0xec, 0xd8, 0x38, 0x90, 0xb3, 0xf1, 0x58, 0x7d, 0x38, 0x24, 0xbc, 0x73,
+ ]
+ ),
+ test_case!(
+ [
+ 0x20, 0x12, 0xcd, 0x3f, 0x56, 0x5d, 0x24, 0x82, 0x80, 0x42, 0xfe, 0xa7, 0xba,
+ 0xca, 0xbd, 0x3a, 0x7b, 0x78, 0xda, 0x45, 0x39, 0x56, 0x34, 0x5d, 0x9b, 0x64,
+ 0x26, 0x58, 0x83, 0xb8, 0x00, 0x09, 0x17, 0x4c, 0xe4, 0x94, 0x5d, 0xff, 0x8e,
+ 0xb7, 0xf4, 0x8b, 0x58, 0xe9, 0x93, 0xd6, 0x60, 0x3c, 0xec, 0xc3, 0x26, 0xfa,
+ 0x7a, 0xf5, 0x9c,
+ ],
+ [
+ 0x02, 0x7e, 0x9c, 0x5b, 0x82, 0x8d, 0xf6, 0x5b, 0x8f, 0xad, 0xc2, 0x72, 0x92,
+ 0xdf, 0xb6, 0x7e, 0x3b, 0x83, 0xfc, 0x78,
+ ],
+ [
+ 0x69, 0x30, 0x2a, 0x89, 0xc1, 0x9e, 0x2b, 0xaf, 0x91, 0x15, 0x25, 0x51, 0x56,
+ 0xbf, 0xca, 0xe2, 0xc3, 0x09, 0x12, 0xe6, 0x68, 0xfe, 0x6b, 0x95, 0x33, 0x10,
+ 0xdf, 0xcc, 0x0e, 0x98, 0x77, 0x88,
+ ],
+ [
+ 0x16, 0x45, 0xa0, 0x94, 0xb3, 0x6f, 0x5f, 0xff, 0xb4, 0x1c, 0x38, 0xdb, 0x38,
+ 0xc5, 0xe1, 0xe0, 0xa5, 0x3f, 0xfd, 0x92, 0x68, 0x70, 0xf3, 0x17, 0xc8, 0x7f,
+ 0xbd, 0xb0, 0xc0, 0x18, 0xc3, 0x03, 0x7b, 0xc8, 0xe4, 0xc6, 0xd1, 0xf6, 0x4c,
+ 0x0d, 0x16, 0x9a, 0x68, 0xaf, 0x2d, 0xb3, 0x74, 0x86,
+ ],
+ [
+ 0x08, 0xba, 0x37, 0x6b, 0xc4, 0x2d, 0x03, 0xb0, 0x3a, 0x90, 0xad, 0x14, 0xc3,
+ 0xda, 0x8c, 0xff, 0x21, 0x8e, 0xf9, 0xf6, 0xae, 0x69, 0x0b, 0xd1, 0xe2, 0xb7,
+ 0x46, 0x0a, 0x8b, 0x46, 0xbb, 0xdf, 0x0b, 0x9a, 0xaf, 0x63, 0xc0, 0x73, 0xcc,
+ 0xe2, 0xf6, 0x3a, 0xe6, 0x7f, 0x68, 0xbc, 0x39, 0x38, 0x29, 0x79, 0x03, 0xb7,
+ 0x99, 0xf1, 0x62, 0x29, 0x7c, 0xb9, 0x3c, 0x8b, 0xbb, 0x48, 0x82, 0x21,
+ ]
+ ),
+ test_case!(
+ [
+ 0x83, 0x6a, 0xb3, 0xfd, 0x64, 0x00, 0x02, 0x41, 0x8e, 0x5b, 0xec, 0xc1, 0x21,
+ 0x2f, 0x1e, 0xaa, 0xe3, 0xf9, 0xd4, 0xe4, 0x21, 0xa6, 0x68, 0x15, 0xd6, 0x58,
+ 0x18, 0x72, 0x2f, 0x3b, 0x17, 0x9c, 0xfc, 0x71, 0x7d, 0x49, 0xa4, 0x92, 0x7b,
+ 0x93, 0x87, 0x52, 0xce, 0x71, 0x7f, 0xc6, 0x83, 0x83, 0xc5, 0x37, 0x53, 0xa0,
+ 0x3c, 0x8e, 0x21, 0x91,
+ ],
+ [
+ 0x1d, 0xd6, 0xc0, 0xad, 0x6c, 0x6e, 0xa5, 0x76, 0xbc, 0x67, 0x37, 0x05, 0x87,
+ 0x8b, 0x17, 0xc4, 0x80, 0x9f, 0xaf, 0x30,
+ ],
+ [
+ 0xfb, 0xbf, 0x79, 0x20, 0xaf, 0xcd, 0xb5, 0xaa, 0xf3, 0x4f, 0xca, 0xc9, 0x45,
+ 0xa7, 0x49, 0x1a, 0x85, 0x99, 0x37, 0xaf, 0xbd, 0x9c, 0x2c, 0x1c, 0xfe, 0xe8,
+ 0xe3, 0x20, 0x4d, 0x18, 0x66, 0x1e,
+ ],
+ [
+ 0xdf, 0x45, 0x40, 0xe9, 0x93, 0xb7, 0xee, 0x62, 0x41, 0xa1, 0x21, 0x0f, 0xd8,
+ 0x23, 0x9e, 0x6b, 0xa2, 0xc0, 0x9c, 0x4a, 0x0b, 0xff, 0xa9, 0x08, 0x7e, 0x35,
+ 0xda, 0x5b, 0x4b, 0x76, 0x7e, 0x37, 0x24, 0x14, 0x4f, 0x1c, 0xfa, 0xa6, 0x20,
+ 0xe7, 0xa2, 0xa7, 0x90, 0x98, 0x69, 0x15, 0x4b, 0x28,
+ ],
+ [
+ 0x03, 0xa4, 0x15, 0x16, 0x50, 0x00, 0x20, 0xb8, 0xf7, 0x6b, 0x94, 0xce, 0xa9,
+ 0x06, 0xf7, 0x1e, 0x88, 0x54, 0xe9, 0x15, 0xad, 0xe5, 0x0b, 0x4a, 0xa6, 0x5e,
+ 0x8b, 0x43, 0xf8, 0x9b, 0x5b, 0x0a, 0x49, 0x52, 0x49, 0x6c, 0x16, 0xec, 0x51,
+ 0xac, 0x2a, 0x0d, 0xb1, 0x89, 0x4b, 0x75, 0x97, 0x5c, 0xea, 0x4e, 0x52, 0xd2,
+ 0x06, 0x68, 0x8b, 0x13, 0xd8, 0x9b, 0x49, 0x82, 0xb9, 0x9b, 0x03, 0xc7,
+ ]
+ ),
+ test_case!(
+ [
+ 0x74, 0xda, 0xd3, 0x9e, 0xb7, 0x28, 0x06, 0x8e, 0x54, 0x04, 0x23, 0x02, 0x1a,
+ 0xf0, 0x40, 0xc8, 0xdf, 0xa1, 0xc9, 0x44, 0xca, 0x27, 0x2f, 0x5a, 0xe6, 0x10,
+ 0x6d, 0x57, 0x42, 0x39, 0x4f, 0x8a, 0x11, 0x49, 0x23, 0x6d, 0xf2, 0x2a, 0x01,
+ 0x61, 0xb8, 0xd0, 0xfe, 0x7d, 0xb0, 0xd4, 0x6e, 0x2e, 0xf2, 0xfd, 0x4f, 0x5d,
+ 0x15, 0x71, 0x76, 0x4d, 0xbb,
+ ],
+ [
+ 0x9e, 0x91, 0x66, 0xa2, 0x2d, 0xfc, 0x7f, 0xf2, 0x55, 0xee, 0x53, 0x06, 0x81,
+ 0xf1, 0x08, 0x8e, 0xf8, 0xfe, 0x86, 0x35,
+ ],
+ [
+ 0xeb, 0xc3, 0xeb, 0x13, 0x8e, 0xa3, 0x15, 0x39, 0xd3, 0xcb, 0x64, 0xc4, 0xa8,
+ 0xf8, 0x39, 0xe3, 0x0c, 0x00, 0x9b, 0x57, 0x93, 0x8f, 0x71, 0x43, 0xed, 0xa2,
+ 0xe8, 0x9c, 0x22, 0x7b, 0xbd, 0xc1,
+ ],
+ [
+ 0xd8, 0x62, 0x44, 0xfd, 0xed, 0x54, 0xbd, 0xe2, 0xae, 0xa0, 0x11, 0xe9, 0x56,
+ 0x2d, 0x7f, 0x0c, 0x43, 0x54, 0xc5, 0x40, 0xe6, 0x01, 0x99, 0x34, 0xd1, 0xe2,
+ 0x4d, 0xa9, 0x5d, 0x7b, 0x08, 0xaf, 0x02, 0x7f, 0x7d, 0x14, 0x1f, 0x31, 0x14,
+ 0xa5, 0xdd, 0x7a, 0x80, 0x2c, 0x53, 0x78, 0x18, 0x5c,
+ ],
+ [
+ 0xe4, 0x0d, 0x4b, 0xae, 0x97, 0x00, 0x68, 0x9d, 0xd6, 0x03, 0x7c, 0x5a, 0xae,
+ 0x27, 0x28, 0x3b, 0x55, 0x81, 0x9c, 0xe7, 0xbe, 0x55, 0x80, 0xc5, 0x7c, 0xcd,
+ 0x3d, 0xae, 0x22, 0x6d, 0x5f, 0x38, 0xb2, 0x1a, 0xc0, 0x7f, 0xee, 0x43, 0x7d,
+ 0xa1, 0x28, 0x2f, 0x02, 0xb0, 0xa6, 0x46, 0xf2, 0x52, 0x62, 0x27, 0x35, 0xc4,
+ 0x1d, 0x1a, 0xad, 0xb7, 0x8d, 0x4e, 0x53, 0x91, 0x47, 0x6c, 0x87, 0xd7,
+ ]
+ ),
+ test_case!(
+ [
+ 0x3e, 0xc0, 0x06, 0xb3, 0x2f, 0x90, 0xfc, 0x0b, 0x3f, 0x56, 0x5b, 0x7c, 0x81,
+ 0x1b, 0xe2, 0xc8, 0x67, 0x07, 0xc1, 0x34, 0x16, 0x93, 0x23, 0x0d, 0xdc, 0x9b,
+ 0xc4, 0x3f, 0xf7, 0x7b, 0x44, 0x4b, 0x49, 0x8f, 0x21, 0x23, 0xd2, 0xa2, 0x7e,
+ 0x88, 0xa9, 0x51, 0xbc, 0x7e, 0x33, 0x7c, 0x10, 0xf1, 0x10, 0x38, 0x3b, 0x7d,
+ 0xed, 0x92, 0xb0, 0x8b, 0x56, 0x01,
+ ],
+ [
+ 0xa0, 0x7f, 0x80, 0xd6, 0xa8, 0x22, 0xd8, 0x66, 0xc7, 0xba, 0xed, 0x7d, 0x6f,
+ 0x10, 0xeb, 0x33, 0x9e, 0xd5, 0xcf, 0x79,
+ ],
+ [
+ 0xb0, 0xd1, 0xa5, 0xa7, 0xac, 0x4e, 0x49, 0xcc, 0xad, 0xe9, 0xca, 0x1e, 0x25,
+ 0x9f, 0x8f, 0x41, 0x95, 0x8e, 0x6b, 0x6a, 0x9d, 0x71, 0x0b, 0xb5, 0x18, 0x3d,
+ 0xf4, 0x3e, 0xd5, 0xf8, 0x46, 0xc0,
+ ],
+ [
+ 0x4c, 0x1b, 0x33, 0xe1, 0x5c, 0xfa, 0x2a, 0xd8, 0xc5, 0x93, 0x01, 0x25, 0x42,
+ 0x97, 0x94, 0x61, 0xb4, 0x42, 0x0a, 0x9d, 0xa8, 0x35, 0x6a, 0x37, 0xe2, 0xc3,
+ 0x3d, 0xd4, 0x02, 0x21, 0x62, 0x4c, 0xc5, 0x6a, 0x14, 0x25, 0x39, 0xc6, 0x4b,
+ 0x57, 0x8e, 0x43, 0xa0, 0x37, 0xaa, 0xf8, 0xf7, 0x34,
+ ],
+ [
+ 0xe3, 0x8f, 0xc5, 0x73, 0xbc, 0x6d, 0x2c, 0xcf, 0x71, 0x4e, 0x09, 0x0c, 0xfd,
+ 0x59, 0xae, 0xbb, 0xc6, 0xf6, 0xac, 0x1d, 0x10, 0xd4, 0x21, 0xf9, 0xeb, 0xc5,
+ 0x26, 0xba, 0xaa, 0x15, 0x62, 0x7d, 0x8f, 0x3b, 0xb1, 0x59, 0x42, 0x3b, 0x65,
+ 0x1b, 0x2f, 0x46, 0x88, 0xbb, 0x44, 0x5d, 0x9a, 0x0a, 0x34, 0xde, 0x6e, 0x8c,
+ 0x76, 0xfb, 0x97, 0xd7, 0x74, 0xc2, 0x80, 0x39, 0x52, 0xce, 0xdf, 0xe5,
+ ]
+ ),
+ test_case!(
+ [
+ 0xea, 0x08, 0xf5, 0xaf, 0xfc, 0x45, 0x8a, 0xec, 0xba, 0x30, 0x0e, 0x12, 0xc4,
+ 0x61, 0xa5, 0x07, 0x83, 0xe6, 0x7e, 0xc4, 0xfa, 0x97, 0x60, 0x9b, 0xa0, 0xa4,
+ 0x05, 0x43, 0xe8, 0x0a, 0x1a, 0xe4, 0x6a, 0x80, 0xf4, 0x90, 0x0a, 0xbd, 0xe7,
+ 0xa3, 0x49, 0x72, 0x2c, 0x25, 0x9b, 0x8d, 0x1a, 0x05, 0xd5, 0xa5, 0x97, 0xe9,
+ 0x50, 0x88, 0xea, 0xcb, 0x2a, 0x1b, 0xdb,
+ ],
+ [
+ 0x5b, 0x4d, 0xb6, 0x1a, 0xb2, 0xc8, 0x2a, 0xd6, 0xb3, 0xe6, 0xe1, 0x11, 0x21,
+ 0x96, 0x15, 0x92, 0x8b, 0xfe, 0x61, 0x67,
+ ],
+ [
+ 0x25, 0x7f, 0x71, 0xb1, 0xa7, 0xa3, 0xd2, 0x3d, 0xdd, 0x75, 0x3a, 0x18, 0x0d,
+ 0xa6, 0xd2, 0x4c, 0xc7, 0x90, 0x5d, 0x58, 0xeb, 0x98, 0x38, 0x6a, 0xca, 0x68,
+ 0x2d, 0x22, 0x35, 0x6d, 0xe7, 0xe9,
+ ],
+ [
+ 0xdd, 0x9d, 0x0c, 0x30, 0x11, 0x1b, 0xf7, 0x6a, 0x30, 0x65, 0xb4, 0xa3, 0x0b,
+ 0x4a, 0x32, 0xa5, 0xcb, 0x48, 0x8e, 0x5e, 0x97, 0x80, 0x42, 0x57, 0x55, 0x92,
+ 0xb9, 0x7f, 0x62, 0xb6, 0xeb, 0xfe, 0x35, 0x08, 0x45, 0x71, 0x55, 0x75, 0xc7,
+ 0x71, 0x07, 0x3d, 0x4f, 0xb5, 0x90, 0xd6, 0xec, 0xcb,
+ ],
+ [
+ 0xd4, 0xc8, 0x0b, 0x56, 0x4b, 0x9d, 0x1a, 0x66, 0x1a, 0x77, 0xb0, 0x3c, 0xb8,
+ 0x2e, 0xd6, 0xcf, 0xe0, 0x4b, 0xe7, 0xd0, 0x1a, 0xde, 0x00, 0xc3, 0xf3, 0xbc,
+ 0x73, 0x1d, 0xd2, 0x87, 0x19, 0xb9, 0xdd, 0x23, 0x05, 0x92, 0x62, 0x85, 0x0d,
+ 0x80, 0x53, 0xb4, 0x66, 0x51, 0x0e, 0x80, 0x41, 0x42, 0xaa, 0xcd, 0x38, 0xec,
+ 0x7b, 0x64, 0xe7, 0x78, 0xf9, 0x42, 0xe4, 0xd3, 0x85, 0x4b, 0x03, 0xf7,
+ ]
+ ),
+ test_case!(
+ [
+ 0x49, 0x3d, 0x3b, 0x5f, 0x12, 0x45, 0xeb, 0x38, 0x55, 0xc2, 0x4c, 0x4f, 0x48,
+ 0x3e, 0x58, 0xb1, 0x04, 0x70, 0xe1, 0xb7, 0x7f, 0xcc, 0x8b, 0x68, 0x27, 0xb0,
+ 0x1e, 0xab, 0xd8, 0x17, 0xa5, 0xbe, 0xd4, 0xbf, 0xf4, 0x43, 0x4a, 0x49, 0xd8,
+ 0xb7, 0x13, 0xe8, 0xa7, 0x4a, 0xae, 0x93, 0x3e, 0x97, 0xa0, 0xbf, 0x41, 0xa1,
+ 0x7e, 0x91, 0x0e, 0x75, 0x41, 0x5f, 0x66, 0x7d,
+ ],
+ [
+ 0x75, 0xe7, 0xa8, 0x12, 0x52, 0xda, 0xf3, 0xfe, 0x57, 0x92, 0xe3, 0x40, 0x3e,
+ 0x5e, 0x61, 0x11, 0xb0, 0x3a, 0x72, 0x09,
+ ],
+ [
+ 0x9e, 0x29, 0xa7, 0xfc, 0xef, 0x76, 0x4b, 0x1f, 0x69, 0x2a, 0x81, 0xda, 0xa2,
+ 0xd3, 0xa2, 0x11, 0x61, 0x15, 0xdf, 0xc4, 0x99, 0xde, 0xd3, 0x4c, 0xd9, 0x1e,
+ 0x6a, 0x73, 0xc8, 0xe9, 0xd2, 0x7e,
+ ],
+ [
+ 0x0c, 0xbb, 0x52, 0xe0, 0x3f, 0x97, 0x41, 0x60, 0xd5, 0x59, 0xbe, 0x36, 0xac,
+ 0xd9, 0xc6, 0x2e, 0xb6, 0x04, 0x0c, 0x0a, 0x37, 0x44, 0x3b, 0x60, 0x22, 0x96,
+ 0x23, 0xd8, 0x31, 0x56, 0x74, 0x6b, 0x99, 0xdb, 0xd5, 0xc6, 0x3d, 0x2b, 0x47,
+ 0xae, 0xa7, 0x2a, 0x7a, 0xc0, 0xee, 0xa5, 0x98, 0x62,
+ ],
+ [
+ 0x3c, 0xa7, 0xeb, 0xe2, 0x13, 0x88, 0x3d, 0x2a, 0xc9, 0x4f, 0x67, 0xf9, 0x43,
+ 0xea, 0x07, 0x75, 0xd9, 0x40, 0x28, 0x5a, 0x48, 0xdd, 0x0e, 0xc4, 0x63, 0xa9,
+ 0x9c, 0x77, 0x3d, 0xed, 0x07, 0x3b, 0x5c, 0xdf, 0x62, 0x04, 0xf4, 0x64, 0x85,
+ 0x35, 0x8e, 0x88, 0xe9, 0x4b, 0x86, 0x78, 0x5d, 0x71, 0x3d, 0x97, 0x27, 0x27,
+ 0x72, 0x56, 0xc7, 0xd3, 0x5d, 0xd5, 0x2e, 0x7c, 0xee, 0xdd, 0x74, 0x11,
+ ]
+ ),
+ test_case!(
+ [
+ 0xd7, 0x63, 0x65, 0xc1, 0x3f, 0x6d, 0x92, 0xfe, 0x90, 0xf0, 0x8f, 0x2c, 0xba,
+ 0x73, 0x2a, 0x2b, 0x88, 0x9e, 0x5d, 0xe0, 0x0c, 0x65, 0xea, 0xed, 0xf5, 0xaa,
+ 0x5c, 0x6c, 0x06, 0x94, 0x65, 0xde, 0x75, 0x9e, 0x14, 0x1e, 0x2b, 0x7f, 0x73,
+ 0xdb, 0xb7, 0x3b, 0xb7, 0x8e, 0x69, 0xc5, 0x0e, 0xf7, 0xaa, 0x77, 0x6c, 0x8b,
+ 0xbc, 0x1a, 0x30, 0x00, 0xd3, 0xa2, 0x77, 0x42, 0x7f,
+ ],
+ [
+ 0x0b, 0xa6, 0xb9, 0x91, 0x4b, 0x19, 0xe3, 0xea, 0x54, 0x9b, 0x82, 0x41, 0x09,
+ 0xd8, 0x1d, 0x99, 0x74, 0xa0, 0x95, 0x16,
+ ],
+ [
+ 0xd0, 0xf1, 0x55, 0x65, 0x17, 0xc2, 0x1e, 0x4f, 0x61, 0xc9, 0xcb, 0xcc, 0x83,
+ 0x27, 0x0d, 0x29, 0x04, 0x6f, 0x86, 0x91, 0x07, 0xd8, 0x0a, 0x76, 0x37, 0x0d,
+ 0x0c, 0x43, 0x75, 0xd8, 0xca, 0xce,
+ ],
+ [
+ 0x4f, 0x42, 0x31, 0xc0, 0xce, 0x03, 0xf7, 0x8c, 0x63, 0x29, 0xb1, 0x36, 0xde,
+ 0x8d, 0x82, 0xcb, 0x06, 0xbf, 0x55, 0x2d, 0x1f, 0x9a, 0xa3, 0x20, 0x63, 0x67,
+ 0xcb, 0xdc, 0x54, 0x9b, 0x92, 0xdd, 0xac, 0x30, 0x3b, 0x79, 0xcf, 0x7c, 0xe3,
+ 0x46, 0xac, 0x4a, 0xfe, 0xd7, 0x37, 0xbd, 0x79, 0x5e,
+ ],
+ [
+ 0x40, 0x36, 0xe6, 0xf5, 0xfa, 0xf5, 0x70, 0x3e, 0x41, 0xd2, 0x58, 0x81, 0x59,
+ 0x16, 0x23, 0xce, 0x22, 0x4a, 0x9b, 0xb0, 0x0c, 0xd0, 0xf9, 0x72, 0x78, 0x6a,
+ 0xa4, 0x43, 0x5b, 0x69, 0x96, 0xfc, 0xab, 0x45, 0x87, 0x81, 0xe9, 0xa4, 0x6c,
+ 0x3c, 0x2f, 0xc9, 0x57, 0x81, 0xec, 0xc7, 0x16, 0x53, 0x18, 0xf3, 0xfa, 0xd5,
+ 0xdf, 0x09, 0xe0, 0x08, 0xf2, 0xe7, 0x93, 0xc7, 0xcc, 0x7b, 0x43, 0xac,
+ ]
+ ),
+ test_case!(
+ [
+ 0x51, 0xda, 0x57, 0x9f, 0x2f, 0x75, 0x31, 0x51, 0x49, 0xd2, 0x83, 0xa4, 0x78,
+ 0xb2, 0xa8, 0x20, 0x43, 0x04, 0x09, 0xad, 0xfd, 0x17, 0x31, 0xbd, 0xea, 0xd2,
+ 0x84, 0x67, 0x53, 0x6f, 0x0b, 0x2f, 0xaa, 0x40, 0x23, 0xdc, 0x90, 0x34, 0x1a,
+ 0x27, 0x0e, 0x90, 0x34, 0x6f, 0x9c, 0xd1, 0x03, 0xa1, 0x16, 0x64, 0x1e, 0x6c,
+ 0x59, 0xa4, 0xc9, 0x4e, 0xb6, 0xc8, 0x28, 0xfb, 0x3d, 0x49,
+ ],
+ [
+ 0xfa, 0x72, 0xd9, 0x0c, 0x96, 0x70, 0xd0, 0xf5, 0xec, 0x5d, 0xda, 0x8d, 0xde,
+ 0x87, 0x2d, 0x90, 0xba, 0x08, 0x82, 0xd9,
+ ],
+ [
+ 0x98, 0xe0, 0xd1, 0x68, 0xf6, 0xd1, 0xd4, 0xa5, 0xf1, 0xad, 0x1c, 0x86, 0x22,
+ 0x63, 0x1b, 0x40, 0x88, 0x6f, 0xde, 0x1c, 0x17, 0xb2, 0x7a, 0xa5, 0x10, 0x01,
+ 0x59, 0xc6, 0x1f, 0xf8, 0xe2, 0xac,
+ ],
+ [
+ 0x8f, 0xab, 0xf0, 0x54, 0x18, 0xfe, 0xdc, 0x5e, 0xd2, 0x21, 0x94, 0x7d, 0x1e,
+ 0x0f, 0xc6, 0x8d, 0xaa, 0xc7, 0xf7, 0xcb, 0x9b, 0xf6, 0x74, 0x22, 0xb2, 0xdd,
+ 0xd2, 0x5c, 0x69, 0x32, 0xc8, 0x25, 0x93, 0x3f, 0x88, 0xf3, 0x53, 0xfb, 0x8d,
+ 0x6e, 0x79, 0xeb, 0x3a, 0x9f, 0x92, 0xd5, 0x6d, 0x01,
+ ],
+ [
+ 0xdd, 0x7d, 0x95, 0xa2, 0xc0, 0x34, 0xa0, 0xf0, 0xd6, 0xb7, 0x06, 0xd6, 0x03,
+ 0x98, 0xc2, 0x12, 0x76, 0x24, 0x5e, 0xe6, 0x55, 0x95, 0xdb, 0x51, 0xb3, 0x7b,
+ 0x16, 0x40, 0x3a, 0xf5, 0xd7, 0x2b, 0x88, 0x72, 0xfc, 0x1b, 0x29, 0x37, 0xe7,
+ 0x2c, 0x55, 0xd0, 0xbd, 0x50, 0xc6, 0xa7, 0x86, 0xb9, 0xf7, 0xba, 0xcb, 0xad,
+ 0x06, 0x38, 0x86, 0x38, 0x75, 0x3f, 0xd0, 0xb0, 0x3f, 0x19, 0xc0, 0x7c,
+ ]
+ ),
+ test_case!(
+ [
+ 0x9f, 0x4f, 0x0c, 0x66, 0x5b, 0xe4, 0x16, 0x82, 0x77, 0xb5, 0x9b, 0xea, 0x83,
+ 0xe2, 0x74, 0x44, 0x9f, 0x90, 0x8d, 0x82, 0x34, 0xae, 0xf4, 0xdb, 0x10, 0x04,
+ 0x26, 0x57, 0x36, 0x4e, 0x97, 0x85, 0xa3, 0x01, 0xa0, 0x04, 0xe6, 0x32, 0x1b,
+ 0xfb, 0x5a, 0x41, 0x10, 0xcf, 0x56, 0xa4, 0x74, 0xb2, 0xfe, 0x5c, 0xbb, 0xc7,
+ 0x59, 0x15, 0xca, 0xd8, 0x73, 0x3e, 0x9f, 0x03, 0xb3, 0x04, 0xa1,
+ ],
+ [
+ 0x31, 0x63, 0xe9, 0x1a, 0x83, 0x3d, 0xf0, 0x94, 0xbd, 0x55, 0xcc, 0x8e, 0x3b,
+ 0x84, 0xa3, 0x2f, 0xb7, 0x1e, 0xca, 0x98,
+ ],
+ [
+ 0xe6, 0xbb, 0xa4, 0x1e, 0xd4, 0x12, 0x08, 0xe6, 0xbc, 0xb5, 0xd6, 0x08, 0x95,
+ 0x8a, 0x21, 0x72, 0x14, 0xd3, 0x96, 0xd2, 0x96, 0x27, 0xf7, 0xf2, 0x7d, 0x91,
+ 0x4a, 0x6c, 0xb0, 0xeb, 0x90, 0xef,
+ ],
+ [
+ 0xe7, 0x9c, 0x3e, 0x7e, 0x14, 0xa9, 0xef, 0x71, 0x82, 0xb0, 0x13, 0xea, 0xdc,
+ 0xb4, 0x9f, 0x12, 0x32, 0x2c, 0xd8, 0xc3, 0x23, 0xfd, 0x22, 0x34, 0xf2, 0xec,
+ 0xd8, 0x0b, 0x8a, 0xa2, 0x87, 0x49, 0x56, 0x0d, 0xb8, 0x88, 0x03, 0xd5, 0xd1,
+ 0x3c, 0x6d, 0x0d, 0xf2, 0x01, 0x46, 0x05, 0x3e, 0x0c,
+ ],
+ [
+ 0x50, 0xf7, 0x59, 0x2c, 0x43, 0x52, 0x95, 0xd8, 0xac, 0xff, 0xc8, 0xf9, 0xad,
+ 0x7d, 0x53, 0x94, 0x8b, 0x26, 0xb5, 0xfa, 0xd6, 0xdd, 0x96, 0xfa, 0x2c, 0x56,
+ 0x9c, 0x19, 0xcb, 0xa0, 0x4c, 0xf4, 0xad, 0xea, 0xf3, 0xbd, 0xb2, 0x13, 0x01,
+ 0xf5, 0x54, 0x29, 0x00, 0xc8, 0xc4, 0x9f, 0xed, 0xf5, 0x71, 0x10, 0x82, 0xa1,
+ 0x41, 0x47, 0x51, 0x86, 0x90, 0xe4, 0xf3, 0xcf, 0xc4, 0xa0, 0x9b, 0xd8,
+ ]
+ ),
+ test_case!(
+ [
+ 0xb8, 0xe3, 0x7b, 0x37, 0xed, 0x17, 0xcd, 0x85, 0xfe, 0x05, 0x07, 0x74, 0x51,
+ 0xff, 0xcd, 0x0b, 0x0a, 0xc4, 0xfc, 0xf0, 0xa5, 0xe0, 0x81, 0xd9, 0xdd, 0xc5,
+ 0xa6, 0x42, 0x76, 0x92, 0x6d, 0xaf, 0x89, 0x36, 0xed, 0x13, 0x51, 0xe0, 0x1e,
+ 0xe6, 0x73, 0x7a, 0xbc, 0x17, 0xb8, 0x3d, 0x34, 0x11, 0x32, 0x1a, 0xab, 0xaa,
+ 0x2c, 0xce, 0x4b, 0x70, 0x58, 0xe4, 0xfc, 0x80, 0x94, 0x17, 0xc9, 0x43,
+ ],
+ [
+ 0x26, 0xc1, 0xd3, 0x8f, 0x3e, 0x50, 0xe3, 0x8e, 0x1e, 0xea, 0x6f, 0x03, 0xbf,
+ 0xb5, 0x39, 0x30, 0x0f, 0xa8, 0xc5, 0x8a,
+ ],
+ [
+ 0xc1, 0xc3, 0x88, 0xbc, 0xfb, 0x88, 0x27, 0xac, 0xa2, 0x88, 0xa5, 0xeb, 0xc1,
+ 0xa9, 0xa8, 0xdb, 0xab, 0x3b, 0xf9, 0xa0, 0xa4, 0xc8, 0xee, 0x4a, 0x95, 0x00,
+ 0x26, 0x9e, 0xe0, 0x12, 0x04, 0x52,
+ ],
+ [
+ 0x9c, 0x18, 0x4d, 0x78, 0x78, 0x7d, 0x59, 0x46, 0x5e, 0xff, 0x7e, 0xaf, 0xeb,
+ 0x36, 0x66, 0xaa, 0x43, 0xf7, 0xe4, 0x74, 0x70, 0x45, 0x7e, 0x0a, 0x36, 0x45,
+ 0x2c, 0x91, 0xa2, 0xdd, 0x2a, 0xb0, 0xce, 0xb7, 0xe9, 0xb0, 0x90, 0x8d, 0xe2,
+ 0xa9, 0xf6, 0x3e, 0x2a, 0xce, 0x5f, 0xea, 0x9e, 0xc8,
+ ],
+ [
+ 0x9b, 0xd3, 0x64, 0x59, 0xcb, 0x9f, 0xc4, 0xa6, 0x84, 0x76, 0x24, 0xf4, 0x44,
+ 0x05, 0xcf, 0x87, 0x7c, 0x5d, 0x74, 0x56, 0x27, 0xa1, 0xae, 0x64, 0x3d, 0x46,
+ 0xbc, 0xff, 0x0c, 0x23, 0x4f, 0xea, 0x46, 0xf6, 0xd4, 0x5f, 0xae, 0xbe, 0x6d,
+ 0x93, 0x3a, 0xa8, 0xd2, 0x2e, 0x73, 0x89, 0xa1, 0x82, 0x24, 0x7f, 0x60, 0x0f,
+ 0x7d, 0x34, 0x3e, 0xa5, 0xdc, 0x73, 0xb7, 0xa9, 0x7b, 0xd6, 0xca, 0xeb,
+ ]
+ ),
+ test_case!(
+ [
+ 0xb8, 0x72, 0x0a, 0x4c, 0x3b, 0xaa, 0x7f, 0xc7, 0x5d, 0xc3, 0x2e, 0x7d, 0x11,
+ 0x76, 0x11, 0x92, 0x49, 0x08, 0xf1, 0x06, 0xeb, 0x9e, 0xf3, 0x0a, 0x0d, 0x5e,
+ 0x76, 0xbe, 0x97, 0x52, 0xf4, 0x8b, 0x95, 0x6a, 0x5c, 0xa1, 0x5b, 0x81, 0xe1,
+ 0x2b, 0xc7, 0x46, 0xa3, 0x17, 0x83, 0x0e, 0xa9, 0x67, 0x07, 0x56, 0xcc, 0x4f,
+ 0x35, 0xed, 0x8d, 0xcb, 0x0c, 0xb3, 0x07, 0xd1, 0x2f, 0x9e, 0x2c, 0x7f, 0x28,
+ ],
+ [
+ 0x66, 0x61, 0xa3, 0xb9, 0xbd, 0x4c, 0xf1, 0xec, 0xb9, 0x74, 0x6d, 0x55, 0x7e,
+ 0x22, 0xdf, 0x8a, 0x86, 0x17, 0x0d, 0x19,
+ ],
+ [
+ 0xec, 0x45, 0x1c, 0xdd, 0xbd, 0xc2, 0xe1, 0x27, 0x77, 0x7a, 0x42, 0x34, 0x72,
+ 0x2d, 0xed, 0xc4, 0xde, 0x93, 0x1d, 0x38, 0x45, 0x56, 0xf2, 0xc5, 0xc6, 0x07,
+ 0xb4, 0x01, 0xc7, 0x34, 0x73, 0xd3,
+ ],
+ [
+ 0x85, 0xd5, 0xbc, 0x24, 0xff, 0x30, 0x5d, 0xa0, 0x2f, 0x7b, 0x52, 0x8a, 0x51,
+ 0xf5, 0x00, 0xe1, 0x92, 0xb7, 0xb7, 0xd3, 0x23, 0x2f, 0xb9, 0x8c, 0x16, 0x75,
+ 0xad, 0x1f, 0x90, 0xf9, 0x85, 0xbe, 0x3a, 0xad, 0x43, 0x28, 0xe9, 0x03, 0x7c,
+ 0x39, 0xed, 0x57, 0x6c, 0xb0, 0x1b, 0x97, 0xf5, 0x09,
+ ],
+ [
+ 0x53, 0x6d, 0x5c, 0xd4, 0x19, 0x49, 0xa7, 0x26, 0x54, 0x05, 0xdd, 0x6d, 0x7e,
+ 0x7c, 0x35, 0xeb, 0x0c, 0xdd, 0xfd, 0xdc, 0x8c, 0xc1, 0x90, 0xdf, 0xf0, 0xb1,
+ 0xe5, 0x57, 0x59, 0xfb, 0x8f, 0x88, 0x4f, 0xb8, 0xe2, 0x4b, 0xf8, 0xe2, 0xc9,
+ 0xad, 0x2b, 0x4e, 0x24, 0x57, 0x13, 0xd9, 0xd5, 0x9b, 0x97, 0x82, 0xe2, 0x8e,
+ 0x0f, 0x35, 0x93, 0x61, 0xff, 0x2a, 0x0d, 0x10, 0xb9, 0x66, 0x56, 0x73,
+ ]
+ ),
+ test_case!(
+ [
+ 0x0f, 0x15, 0x7f, 0x02, 0x2d, 0x99, 0xc3, 0x22, 0x4c, 0xac, 0xa9, 0xf5, 0xa5,
+ 0x21, 0x80, 0x50, 0x54, 0xc1, 0x37, 0x96, 0x46, 0xde, 0xda, 0x2e, 0x5d, 0xcf,
+ 0xcb, 0x29, 0x2f, 0xc3, 0x01, 0x2d, 0x88, 0x4a, 0xbf, 0xc1, 0xf0, 0xd7, 0x71,
+ 0x41, 0x18, 0x1d, 0xe5, 0x28, 0xba, 0x3c, 0x45, 0x8b, 0xd5, 0x83, 0x92, 0x1a,
+ 0xab, 0xd3, 0x62, 0x45, 0xd1, 0xb2, 0xd8, 0x57, 0x93, 0xac, 0x8d, 0x61, 0x7a,
+ 0xa0,
+ ],
+ [
+ 0xe0, 0x88, 0xda, 0x90, 0x19, 0x76, 0x9d, 0xab, 0x80, 0xaa, 0x7e, 0x76, 0x10,
+ 0x37, 0x1a, 0x60, 0x23, 0x15, 0xa5, 0x7d,
+ ],
+ [
+ 0xbf, 0x6e, 0x16, 0x4b, 0x81, 0x52, 0x5b, 0x39, 0xac, 0xeb, 0xda, 0x54, 0xdd,
+ 0x6a, 0xd6, 0xee, 0xb4, 0x52, 0x3e, 0xfd, 0x65, 0x3f, 0xfd, 0x2f, 0x8f, 0xcd,
+ 0x18, 0x2f, 0x61, 0xa9, 0xfe, 0x7a,
+ ],
+ [
+ 0x8b, 0x0f, 0x73, 0x49, 0xa5, 0x7a, 0x8b, 0x6a, 0xae, 0x7e, 0xa1, 0xda, 0x63,
+ 0x10, 0x9c, 0xb5, 0x29, 0x5a, 0xd7, 0x34, 0xbf, 0x5e, 0x29, 0x46, 0x4d, 0x9c,
+ 0xd3, 0x5c, 0x62, 0x43, 0x7a, 0xa9, 0xd6, 0x85, 0xe7, 0x36, 0xc5, 0x51, 0x98,
+ 0xb1, 0x1f, 0xb4, 0xff, 0x28, 0xc3, 0x6a, 0xd6, 0x03,
+ ],
+ [
+ 0x4f, 0xc9, 0x98, 0x80, 0x67, 0xc4, 0x33, 0x99, 0x5f, 0x59, 0xfe, 0xe7, 0xe3,
+ 0xf6, 0x6f, 0xbf, 0xb1, 0x5d, 0x38, 0x58, 0x16, 0xff, 0xa6, 0xd8, 0x98, 0x75,
+ 0xa0, 0xd0, 0x0c, 0x99, 0xdb, 0x4b, 0x40, 0x23, 0x13, 0x65, 0x33, 0x31, 0x9e,
+ 0x58, 0x95, 0xa5, 0x8d, 0x9e, 0x3d, 0x9a, 0x57, 0x82, 0x73, 0x96, 0x9f, 0x2c,
+ 0xf4, 0x29, 0x04, 0x5e, 0x44, 0xbf, 0xcf, 0x64, 0x5d, 0x8d, 0xf9, 0x99,
+ ]
+ ),
+ test_case!(
+ [
+ 0x79, 0x51, 0xb5, 0x57, 0x9f, 0x24, 0x79, 0xaa, 0xeb, 0x62, 0xeb, 0xbb, 0x66,
+ 0xe9, 0x03, 0x96, 0x4c, 0x71, 0x32, 0xa4, 0x1b, 0x0b, 0x93, 0xca, 0x82, 0x12,
+ 0x75, 0x80, 0x62, 0x04, 0x64, 0x85, 0x35, 0x80, 0xe2, 0x0a, 0xb2, 0x6d, 0xbd,
+ 0xc0, 0x6c, 0xd3, 0x54, 0xc8, 0xc9, 0xc6, 0x66, 0x31, 0xa1, 0xc8, 0xb1, 0x0e,
+ 0x5f, 0xf9, 0x16, 0xe9, 0x0a, 0xec, 0xf9, 0x10, 0x94, 0xd7, 0x0e, 0xc5, 0x8e,
+ 0x9a, 0x02,
+ ],
+ [
+ 0x74, 0x81, 0x61, 0x52, 0xc0, 0xeb, 0x65, 0x14, 0xbe, 0xba, 0x4f, 0x43, 0x3f,
+ 0x1f, 0x02, 0x36, 0x9b, 0xb5, 0x00, 0x4a,
+ ],
+ [
+ 0xb4, 0xfd, 0xd8, 0xb5, 0x2f, 0x20, 0x82, 0x00, 0x20, 0xaf, 0x65, 0x20, 0xf0,
+ 0x6e, 0x17, 0x7c, 0x10, 0x3d, 0xe5, 0x2b, 0x68, 0x11, 0x87, 0x50, 0xb5, 0x26,
+ 0xbd, 0x60, 0x36, 0x85, 0xc8, 0xfb,
+ ],
+ [
+ 0xfb, 0xb9, 0x59, 0x12, 0xb3, 0x72, 0x55, 0x4a, 0x95, 0xcf, 0x6a, 0x87, 0xdc,
+ 0x45, 0xa9, 0xa4, 0x03, 0x9b, 0x89, 0x6f, 0xf1, 0xe8, 0x62, 0x55, 0x39, 0x21,
+ 0x73, 0x6a, 0xfe, 0xd8, 0x1f, 0xf1, 0xd4, 0x6c, 0x90, 0x40, 0xaf, 0x1f, 0xca,
+ 0x75, 0xe7, 0xb3, 0x94, 0xe2, 0xe9, 0x1e, 0x0b, 0x47,
+ ],
+ [
+ 0x0e, 0x4a, 0x98, 0x6e, 0x36, 0x17, 0x2a, 0x2a, 0x46, 0xdb, 0x50, 0x17, 0xef,
+ 0x56, 0xe2, 0x18, 0xdc, 0x4b, 0x98, 0x44, 0x7a, 0xae, 0x7f, 0x73, 0xf6, 0x4c,
+ 0x79, 0xa1, 0x21, 0x10, 0x97, 0x32, 0x16, 0xea, 0x9b, 0x1d, 0xd6, 0x15, 0x64,
+ 0xd3, 0x9c, 0xc9, 0xf7, 0xc9, 0x47, 0xfe, 0x61, 0xe7, 0x8b, 0xdf, 0x31, 0xb1,
+ 0x0c, 0x52, 0xb3, 0xc2, 0x93, 0x77, 0x51, 0x8e, 0x10, 0xe5, 0x2b, 0x9b,
+ ]
+ ),
+ test_case!(
+ [
+ 0x59, 0x79, 0xfc, 0xb2, 0x37, 0x18, 0xfc, 0x85, 0xe5, 0x0f, 0x54, 0x46, 0xbc,
+ 0x64, 0x27, 0xed, 0xcb, 0xe2, 0x1b, 0x49, 0x58, 0x41, 0xee, 0x23, 0x63, 0x3f,
+ 0xc2, 0xe9, 0x19, 0xc8, 0x25, 0x8d, 0x23, 0x3b, 0x02, 0xb3, 0x34, 0xb8, 0x49,
+ 0xb8, 0xbb, 0xd1, 0xa2, 0x59, 0x77, 0x6c, 0x22, 0xc5, 0x2a, 0x64, 0xca, 0x2e,
+ 0xad, 0x48, 0x53, 0x03, 0x03, 0x1e, 0xe5, 0x29, 0x9d, 0x0e, 0xec, 0x36, 0x34,
+ 0x30, 0xf2, 0x95,
+ ],
+ [
+ 0x21, 0x23, 0xbf, 0x94, 0x51, 0x7c, 0xdf, 0xa5, 0x97, 0x8c, 0x89, 0x7f, 0xbe,
+ 0xc7, 0xab, 0x99, 0x06, 0x08, 0xbf, 0xfa,
+ ],
+ [
+ 0xb7, 0x92, 0xa5, 0xea, 0xda, 0xfb, 0x4e, 0x0c, 0x9b, 0x15, 0x6c, 0x7e, 0x75,
+ 0x72, 0x52, 0xca, 0xa7, 0xdf, 0xe1, 0x1b, 0x0d, 0xd7, 0x43, 0xe9, 0xd0, 0x75,
+ 0x19, 0xea, 0xac, 0x8f, 0x7d, 0x56,
+ ],
+ [
+ 0x2c, 0xa2, 0x85, 0x3e, 0x3a, 0x52, 0xab, 0xe3, 0xdf, 0x87, 0x93, 0x85, 0xe8,
+ 0xbf, 0xad, 0x07, 0x48, 0x40, 0xfc, 0x1a, 0x11, 0x27, 0x1e, 0xed, 0xed, 0xad,
+ 0xd1, 0x6e, 0xa1, 0xd9, 0x5c, 0xb4, 0xa5, 0x85, 0x5f, 0xf7, 0x98, 0xf9, 0xc9,
+ 0xd8, 0x35, 0xbc, 0xd0, 0x91, 0x82, 0xa2, 0x3b, 0x10,
+ ],
+ [
+ 0x94, 0xde, 0x58, 0x98, 0x46, 0x5a, 0xd7, 0x41, 0x2b, 0x37, 0x1b, 0x71, 0xa4,
+ 0x43, 0x97, 0x86, 0x4b, 0x1f, 0xa7, 0x65, 0x3c, 0x64, 0x2e, 0x2a, 0x44, 0xc7,
+ 0x77, 0x31, 0xdc, 0x6a, 0x72, 0xc2, 0xb1, 0x8b, 0x8f, 0xff, 0x29, 0xb6, 0x3e,
+ 0xb9, 0x11, 0x43, 0x3f, 0x56, 0x57, 0xa4, 0x0c, 0xc4, 0xd3, 0x24, 0x20, 0xd3,
+ 0x9c, 0xf1, 0x62, 0xf2, 0x19, 0x27, 0x93, 0x7a, 0xdb, 0x64, 0x30, 0x81,
+ ]
+ ),
+ test_case!(
+ [
+ 0x79, 0xe5, 0x5f, 0x2e, 0x88, 0x2a, 0x37, 0xe6, 0xdf, 0xc8, 0x02, 0x07, 0x94,
+ 0x27, 0xd8, 0x7e, 0x46, 0xfc, 0xa4, 0x3e, 0x5d, 0x4d, 0x9a, 0xfc, 0x2f, 0xc5,
+ 0x8c, 0x80, 0xcc, 0xc9, 0x0b, 0x6e, 0xb2, 0x97, 0xbb, 0xbc, 0x55, 0xe7, 0x62,
+ 0x13, 0x23, 0x28, 0x4a, 0x88, 0xbe, 0x59, 0x7b, 0x31, 0x43, 0x90, 0xc6, 0xbb,
+ 0xc7, 0x20, 0x6c, 0x2b, 0x88, 0xb1, 0x4d, 0x1b, 0xd2, 0x22, 0x3d, 0x3e, 0xa9,
+ 0x23, 0xbf, 0xff, 0x19,
+ ],
+ [
+ 0x59, 0x6d, 0xfd, 0x02, 0xf7, 0x77, 0x3f, 0x2c, 0x51, 0x95, 0xb2, 0xe9, 0x82,
+ 0xfc, 0x1e, 0x77, 0x56, 0x0b, 0x84, 0x35,
+ ],
+ [
+ 0xd5, 0x83, 0xa5, 0x88, 0x90, 0x17, 0x48, 0x53, 0x42, 0x43, 0xd4, 0xfa, 0x7f,
+ 0xfe, 0x0e, 0x61, 0xac, 0xe5, 0x90, 0x84, 0xef, 0x97, 0x11, 0x16, 0x3d, 0x83,
+ 0xfd, 0x95, 0xa7, 0x4d, 0xf5, 0x1c,
+ ],
+ [
+ 0x59, 0x48, 0x81, 0xcd, 0x61, 0x10, 0xae, 0x7b, 0x67, 0x60, 0x03, 0x3d, 0xd1,
+ 0x3e, 0x11, 0x56, 0xf6, 0x89, 0x19, 0x68, 0x7d, 0xc0, 0x99, 0xdf, 0x24, 0x17,
+ 0xe8, 0x25, 0x68, 0x44, 0x3d, 0x36, 0xca, 0x6e, 0x6d, 0x83, 0xb2, 0x2b, 0x33,
+ 0x54, 0x9a, 0x46, 0x31, 0x7c, 0x3a, 0xea, 0x7a, 0x0a,
+ ],
+ [
+ 0x24, 0x2a, 0x04, 0x80, 0xbc, 0x00, 0xc8, 0x92, 0xf6, 0x73, 0x10, 0x28, 0x18,
+ 0xbf, 0xca, 0xe1, 0x54, 0xab, 0x5e, 0x4b, 0xff, 0x9a, 0x84, 0xdc, 0x56, 0x0d,
+ 0xb3, 0x69, 0xef, 0x3b, 0x5d, 0x9d, 0xf2, 0xba, 0x1e, 0x92, 0x2e, 0x29, 0xfe,
+ 0x9d, 0x65, 0xfb, 0xd8, 0xa0, 0x7b, 0x8e, 0xaa, 0x3d, 0x5b, 0x95, 0x82, 0xdb,
+ 0xa5, 0x1e, 0x99, 0x50, 0x24, 0x68, 0x4b, 0xed, 0xdc, 0xf6, 0x31, 0x35,
+ ]
+ ),
+ test_case!(
+ [
+ 0xea, 0x15, 0xf8, 0xc4, 0x41, 0xd0, 0xba, 0xf1, 0x7c, 0x80, 0x0e, 0x0d, 0x5a,
+ 0x9d, 0xb4, 0x1b, 0x98, 0x24, 0x16, 0x45, 0x24, 0x5d, 0x7e, 0x5a, 0xc9, 0xd2,
+ 0xd8, 0xb7, 0x30, 0x8f, 0xc4, 0xdd, 0x89, 0xf8, 0xa8, 0x75, 0x4b, 0xfd, 0xc5,
+ 0x7b, 0x41, 0xb5, 0x50, 0xff, 0x08, 0xf2, 0x2a, 0x47, 0xef, 0x17, 0xa9, 0x9c,
+ 0xf7, 0x13, 0x0c, 0x73, 0xe5, 0xa8, 0x4d, 0xa0, 0xb1, 0x2d, 0x90, 0x4c, 0x44,
+ 0x09, 0xf9, 0x1c, 0xa5, 0x92,
+ ],
+ [
+ 0xea, 0x4b, 0xf7, 0x90, 0x5c, 0xe9, 0xed, 0x8c, 0xcd, 0xae, 0x14, 0x26, 0x2d,
+ 0xc1, 0xa8, 0x99, 0xb3, 0x82, 0x02, 0x8f,
+ ],
+ [
+ 0x57, 0x79, 0x6d, 0x31, 0x43, 0x87, 0xa9, 0xd7, 0x6b, 0xbe, 0x62, 0xf9, 0xa4,
+ 0xb2, 0x1f, 0x60, 0xd7, 0x20, 0xdc, 0x17, 0x72, 0x75, 0x66, 0x4f, 0xbb, 0x9f,
+ 0x30, 0xb5, 0x38, 0x3c, 0x7f, 0x8c,
+ ],
+ [
+ 0x2a, 0x2f, 0x1e, 0x3e, 0x00, 0xe1, 0x61, 0xd9, 0xbd, 0xf0, 0x02, 0x50, 0xa1,
+ 0xe9, 0x42, 0x97, 0x4e, 0xfd, 0x32, 0x99, 0xc2, 0xf3, 0x28, 0x39, 0x4c, 0x0a,
+ 0xe5, 0x8d, 0x30, 0xdd, 0x39, 0x9b, 0xd6, 0x97, 0x2e, 0x9e, 0xdb, 0x88, 0x85,
+ 0x1b, 0xff, 0xb1, 0x80, 0x80, 0x2e, 0xda, 0x34, 0x10,
+ ],
+ [
+ 0xd3, 0x68, 0x52, 0xa7, 0xfc, 0x77, 0x64, 0x93, 0xa4, 0x8f, 0x48, 0x18, 0xc9,
+ 0x76, 0x01, 0x4a, 0xaa, 0x6f, 0x99, 0x8a, 0xad, 0x02, 0xf0, 0x62, 0x9a, 0xfc,
+ 0xa2, 0x31, 0xdf, 0x7d, 0x2d, 0x27, 0x10, 0x42, 0xc4, 0x97, 0x6e, 0x96, 0x0b,
+ 0x01, 0x67, 0xaf, 0x41, 0x44, 0x3d, 0x4d, 0xd6, 0xb4, 0xdd, 0x43, 0xcc, 0xa1,
+ 0xc5, 0x15, 0x83, 0x95, 0x41, 0x24, 0x27, 0x13, 0xb3, 0xf1, 0x76, 0x7b,
+ ]
+ ),
+ test_case!(
+ [
+ 0x27, 0xf0, 0x30, 0x3a, 0x41, 0x0f, 0xaa, 0xf8, 0x1c, 0x0f, 0xb9, 0x2d, 0x1d,
+ 0x76, 0x02, 0x23, 0x2c, 0x1c, 0x98, 0x97, 0xb2, 0x44, 0xef, 0xb7, 0xd6, 0x24,
+ 0xd2, 0xfb, 0x39, 0x7e, 0xfd, 0x12, 0x4f, 0x63, 0x3a, 0x40, 0xd9, 0x24, 0x35,
+ 0x7e, 0x52, 0x33, 0x93, 0x82, 0xa0, 0x3d, 0x79, 0xc9, 0xea, 0x06, 0x8c, 0x05,
+ 0xab, 0x0d, 0xc7, 0x16, 0xc2, 0x81, 0x4f, 0x54, 0xe5, 0x6b, 0xda, 0x81, 0x2e,
+ 0xc5, 0xfd, 0xe9, 0x1a, 0x4c, 0x06,
+ ],
+ [
+ 0x50, 0xad, 0x70, 0xee, 0x51, 0xde, 0xcd, 0x6c, 0xdf, 0xa5, 0x8c, 0xcf, 0x28,
+ 0xb6, 0x49, 0xfc, 0xf5, 0x0c, 0xca, 0xa5,
+ ],
+ [
+ 0x9e, 0x9e, 0xb0, 0xe5, 0xa2, 0x66, 0x86, 0x99, 0x8e, 0x09, 0x88, 0xb3, 0xf0,
+ 0x83, 0x36, 0x81, 0xf8, 0xd3, 0x42, 0xe8, 0xbc, 0xc0, 0x26, 0x4b, 0x7b, 0xd5,
+ 0xe0, 0x54, 0x9f, 0x6f, 0x8b, 0xe2,
+ ],
+ [
+ 0x59, 0x45, 0xc0, 0xa3, 0x45, 0x64, 0x92, 0xc6, 0x7d, 0x3e, 0x21, 0xce, 0x7c,
+ 0x05, 0x80, 0xc9, 0xa2, 0x55, 0x2e, 0x80, 0x82, 0x35, 0x2f, 0x6f, 0xc1, 0x9c,
+ 0xb0, 0xba, 0x78, 0xd6, 0xd9, 0xe9, 0x84, 0x1a, 0x52, 0xc1, 0xa3, 0xe8, 0xf9,
+ 0x2d, 0xcc, 0x20, 0x9f, 0x5e, 0xe1, 0x23, 0xb5, 0xc0,
+ ],
+ [
+ 0x29, 0x5f, 0xa2, 0xa1, 0x6d, 0x08, 0xdd, 0xac, 0xe1, 0x64, 0x8b, 0x75, 0x79,
+ 0x6d, 0x3a, 0x33, 0x8f, 0xff, 0xd3, 0x22, 0x98, 0xd1, 0xf2, 0xcb, 0xc6, 0x35,
+ 0x30, 0xe1, 0x22, 0xd2, 0xb9, 0x77, 0x0c, 0x01, 0x50, 0x4c, 0x86, 0x0a, 0x36,
+ 0x85, 0x94, 0xb1, 0x60, 0x38, 0xf6, 0x74, 0x4b, 0x98, 0xff, 0xc8, 0x89, 0x31,
+ 0xb2, 0x50, 0x3d, 0x26, 0xed, 0x47, 0x05, 0xa5, 0xf1, 0xb8, 0xdf, 0x7f,
+ ]
+ ),
+ test_case!(
+ [
+ 0xd1, 0x00, 0x9f, 0x11, 0x7e, 0xaf, 0x68, 0x58, 0x33, 0xdd, 0x3b, 0x32, 0x0a,
+ 0xfb, 0x79, 0xed, 0x14, 0x78, 0xa9, 0x79, 0xe0, 0xfd, 0x49, 0x41, 0x67, 0xe1,
+ 0x8d, 0x7a, 0x0e, 0xcb, 0x8b, 0xc2, 0xd6, 0xa9, 0xfc, 0xd6, 0x7d, 0xbf, 0x62,
+ 0x34, 0xe6, 0x30, 0x55, 0xb7, 0xda, 0xf1, 0x06, 0x9c, 0x5a, 0x78, 0xa5, 0x2e,
+ 0xdb, 0xf0, 0x9d, 0x92, 0xd3, 0xa1, 0x85, 0x1d, 0x35, 0xf0, 0x38, 0xd9, 0x65,
+ 0x1e, 0x87, 0x78, 0xd9, 0x07, 0x14, 0x70,
+ ],
+ [
+ 0xfd, 0x57, 0xd5, 0xd3, 0x5d, 0x77, 0xcd, 0x32, 0x1b, 0x04, 0xab, 0xd3, 0x1a,
+ 0xb0, 0x9a, 0xed, 0x52, 0xe3, 0x88, 0x56,
+ ],
+ [
+ 0x24, 0x26, 0x23, 0xa6, 0x2e, 0xb2, 0x68, 0x6f, 0x7d, 0x5f, 0xc0, 0x46, 0x65,
+ 0x73, 0xe7, 0x59, 0x1c, 0xfc, 0xec, 0x41, 0xc8, 0x79, 0x05, 0x92, 0xf9, 0x17,
+ 0xb2, 0xc1, 0xd2, 0xee, 0xd6, 0xa2,
+ ],
+ [
+ 0xd1, 0xdc, 0x32, 0x55, 0x1a, 0xe0, 0xf3, 0x74, 0x74, 0x0f, 0x4f, 0x16, 0xdc,
+ 0x3d, 0xf1, 0xeb, 0x85, 0x58, 0x8c, 0xa6, 0x18, 0x82, 0x00, 0xb3, 0xa6, 0x6b,
+ 0x20, 0xd8, 0x01, 0x65, 0x81, 0xa2, 0xb7, 0x81, 0x13, 0x34, 0x0d, 0x54, 0xb1,
+ 0x91, 0xf9, 0x29, 0x17, 0xe7, 0x99, 0x46, 0xab, 0xd0,
+ ],
+ [
+ 0x04, 0x9f, 0x32, 0x34, 0x1a, 0xff, 0x82, 0x14, 0x63, 0xf7, 0x4f, 0x86, 0x63,
+ 0xd7, 0xca, 0xad, 0xe7, 0x77, 0x60, 0x4f, 0xb4, 0x22, 0xe4, 0x9a, 0xba, 0x07,
+ 0xa7, 0x03, 0x3d, 0x30, 0xd1, 0x9e, 0xcc, 0x05, 0x3e, 0x0d, 0x32, 0xd6, 0xb6,
+ 0xdc, 0x35, 0xc7, 0x6d, 0xd3, 0x9e, 0x8d, 0xb2, 0x90, 0x3a, 0xe1, 0xf3, 0x9a,
+ 0x57, 0xd2, 0x85, 0x1f, 0xd4, 0xab, 0x01, 0x03, 0xe3, 0xa0, 0x81, 0x39,
+ ]
+ ),
+ test_case!(
+ [
+ 0x19, 0x5a, 0xf7, 0xd9, 0xa3, 0x3b, 0x42, 0x6d, 0x16, 0xaa, 0x36, 0x33, 0x18,
+ 0x91, 0x5c, 0xe3, 0x13, 0x7b, 0x12, 0xa9, 0x46, 0x12, 0x2e, 0x85, 0x5c, 0x89,
+ 0xdf, 0xde, 0x67, 0xde, 0xe8, 0x16, 0xa2, 0x8d, 0x05, 0x5f, 0xcb, 0x56, 0x69,
+ 0x68, 0xb3, 0xd7, 0x54, 0xc4, 0x22, 0xf9, 0x8e, 0x3b, 0x5b, 0xea, 0x8f, 0xfe,
+ 0x73, 0x1d, 0x83, 0x77, 0xc8, 0xc0, 0x27, 0x7d, 0x04, 0xfd, 0x4d, 0x0a, 0x4a,
+ 0xb7, 0xfe, 0xa6, 0x00, 0x66, 0xf4, 0x9a, 0xd3,
+ ],
+ [
+ 0xce, 0xf5, 0xb7, 0xa3, 0xa5, 0xc1, 0xfe, 0xa4, 0x79, 0xbb, 0xf9, 0x56, 0x39,
+ 0xed, 0x02, 0x93, 0xe0, 0x15, 0x64, 0x64,
+ ],
+ [
+ 0xe0, 0x14, 0xd9, 0xd7, 0xa1, 0xc2, 0x23, 0x96, 0xa5, 0xf9, 0xb0, 0x28, 0xb5,
+ 0x67, 0xc1, 0x5d, 0xe0, 0x89, 0x76, 0x36, 0x0b, 0x6c, 0x63, 0x8a, 0xc4, 0xca,
+ 0x76, 0xb3, 0x16, 0xb5, 0xa7, 0x25,
+ ],
+ [
+ 0x4c, 0x58, 0xfd, 0x63, 0x23, 0x52, 0x75, 0xcb, 0x66, 0x2f, 0xdb, 0xff, 0x73,
+ 0x0e, 0x54, 0x8c, 0xaf, 0x2e, 0x35, 0x6a, 0xd9, 0xf6, 0x16, 0x39, 0xfe, 0x81,
+ 0x09, 0x08, 0x3c, 0x68, 0x96, 0x1b, 0x84, 0x0b, 0xb7, 0x9f, 0x06, 0x61, 0xa9,
+ 0x87, 0x80, 0xec, 0x14, 0xd4, 0xee, 0x78, 0x05, 0x55,
+ ],
+ [
+ 0xc7, 0x17, 0x5c, 0x64, 0x8e, 0x4b, 0x28, 0xe1, 0xb3, 0x9a, 0xab, 0xe0, 0xd0,
+ 0x5d, 0xed, 0x99, 0x3f, 0xa3, 0xe5, 0x6b, 0x93, 0x25, 0x37, 0x81, 0xac, 0x7d,
+ 0x33, 0x0b, 0x33, 0xe2, 0xe3, 0x62, 0xc5, 0x14, 0x11, 0xee, 0x02, 0x71, 0x11,
+ 0xe4, 0x3c, 0x52, 0x42, 0xa0, 0xb6, 0xa9, 0x63, 0x58, 0xfc, 0xef, 0x37, 0x94,
+ 0x9b, 0x4c, 0xf8, 0xe1, 0x40, 0x28, 0x2f, 0x9e, 0xa7, 0x1e, 0x84, 0x3f,
+ ]
+ ),
+ test_case!(
+ [
+ 0x81, 0x5e, 0xe5, 0x67, 0x65, 0x1b, 0x25, 0x7b, 0x71, 0x3b, 0xc7, 0xb7, 0xe1,
+ 0xec, 0x8a, 0x69, 0x08, 0x79, 0x11, 0x59, 0x9d, 0xdf, 0x12, 0xf4, 0x0e, 0x27,
+ 0x7e, 0x73, 0x25, 0x8c, 0x61, 0xde, 0x3a, 0xfe, 0xaf, 0xa7, 0x62, 0xc9, 0x02,
+ 0x18, 0x3b, 0x85, 0x2f, 0x9f, 0xf0, 0xe6, 0x0a, 0x81, 0xd2, 0x59, 0x07, 0x78,
+ 0xfe, 0x7a, 0x8b, 0x4e, 0x4a, 0x7a, 0xec, 0xb9, 0x05, 0x84, 0xbb, 0x14, 0xfb,
+ 0x13, 0x5b, 0xfc, 0xf7, 0xb0, 0x6d, 0xb7, 0x68, 0x5d,
+ ],
+ [
+ 0xf1, 0xa1, 0x0a, 0x51, 0x2b, 0xa7, 0xdf, 0x1a, 0x35, 0x77, 0x31, 0x28, 0x10,
+ 0x07, 0xa5, 0x7d, 0x64, 0x82, 0x91, 0x45,
+ ],
+ [
+ 0x8d, 0x66, 0x60, 0x7e, 0xfe, 0x75, 0x63, 0x3e, 0x3b, 0xdb, 0xec, 0x42, 0x08,
+ 0xec, 0xdc, 0x93, 0x88, 0xb4, 0x64, 0xb4, 0xf1, 0x60, 0x14, 0x41, 0x01, 0x17,
+ 0x4b, 0x9b, 0x5e, 0x70, 0xc0, 0xae,
+ ],
+ [
+ 0x2e, 0xab, 0xbb, 0x49, 0x93, 0x2c, 0xee, 0x76, 0xbf, 0x1c, 0x71, 0x63, 0x48,
+ 0x89, 0xa8, 0xd2, 0xc9, 0xdc, 0xd6, 0x13, 0xe8, 0xde, 0x28, 0xfc, 0xce, 0x2e,
+ 0x01, 0xf2, 0x1f, 0x08, 0xdf, 0x17, 0x97, 0x94, 0xfd, 0x38, 0x92, 0xc5, 0x19,
+ 0x48, 0x77, 0xb7, 0xec, 0xf2, 0x9d, 0x1c, 0x27, 0xf5,
+ ],
+ [
+ 0x5f, 0x96, 0xcc, 0x97, 0x45, 0x83, 0xe1, 0xa2, 0xcc, 0xcf, 0x63, 0xa4, 0x2f,
+ 0x9a, 0x0d, 0x75, 0x04, 0xb2, 0xa6, 0xd8, 0x27, 0x36, 0xd8, 0x7e, 0x65, 0x2e,
+ 0x22, 0x76, 0x69, 0x20, 0x78, 0x9e, 0x7f, 0x4b, 0xeb, 0xae, 0x7f, 0x8f, 0xb3,
+ 0x13, 0xe0, 0x67, 0xd4, 0xc5, 0xef, 0xd2, 0x8d, 0x6c, 0x7a, 0xbe, 0xb7, 0xb4,
+ 0xf3, 0x66, 0xd6, 0xbd, 0xcb, 0xd1, 0x6d, 0x6b, 0x0e, 0x4b, 0x75, 0xaa,
+ ]
+ ),
+ test_case!(
+ [
+ 0x8e, 0x8a, 0x55, 0x1f, 0xb8, 0x66, 0xe1, 0x18, 0xc4, 0x92, 0x47, 0x5c, 0x41,
+ 0x80, 0x21, 0xa4, 0xc9, 0xf7, 0x13, 0x14, 0x61, 0x26, 0xf2, 0x8d, 0x7f, 0xf6,
+ 0x08, 0x49, 0x4c, 0x8e, 0xb2, 0x2c, 0x60, 0x99, 0x0c, 0xaf, 0x08, 0xf6, 0xbc,
+ 0xdf, 0xf0, 0x64, 0x99, 0x17, 0xda, 0x50, 0x0b, 0x00, 0xca, 0x15, 0x57, 0xe6,
+ 0x78, 0x1b, 0x6a, 0x40, 0x0d, 0x84, 0x88, 0xc5, 0x5c, 0x91, 0xa5, 0x86, 0x71,
+ 0x9c, 0x3d, 0x96, 0x67, 0xf4, 0x00, 0x41, 0x50, 0xea, 0x62,
+ ],
+ [
+ 0x06, 0x2a, 0x05, 0x5b, 0x5f, 0x3f, 0x45, 0xd5, 0x80, 0x1b, 0xfa, 0xcc, 0xd1,
+ 0x0c, 0x3d, 0x24, 0xf0, 0x6c, 0x33, 0xb2,
+ ],
+ [
+ 0xce, 0xf0, 0x26, 0xf3, 0xe2, 0x46, 0x6e, 0x18, 0xe2, 0xab, 0x50, 0x2f, 0x08,
+ 0x61, 0x7c, 0xb4, 0x9e, 0x10, 0x0a, 0xb4, 0x93, 0xe0, 0x60, 0xa2, 0x01, 0xe7,
+ 0xf1, 0xc8, 0x68, 0xf2, 0xde, 0xf4,
+ ],
+ [
+ 0x16, 0x3c, 0xaa, 0xe5, 0x7d, 0x1a, 0xdb, 0xdf, 0xc8, 0xad, 0xd9, 0x83, 0x2a,
+ 0x1f, 0x00, 0x8a, 0x28, 0x17, 0xf0, 0x2d, 0x49, 0x73, 0x21, 0xf3, 0x5b, 0x90,
+ 0x8b, 0xee, 0x0b, 0xcc, 0x97, 0x5e, 0x73, 0xc5, 0x50, 0x07, 0x6e, 0x79, 0x3b,
+ 0x0b, 0xad, 0xd3, 0x8c, 0x84, 0xa9, 0x24, 0xea, 0xe2,
+ ],
+ [
+ 0x4b, 0x4c, 0xd1, 0x1a, 0x19, 0x49, 0x9d, 0xb0, 0x2a, 0x81, 0x6c, 0x5c, 0xcf,
+ 0xa8, 0x20, 0xd4, 0x39, 0x75, 0x8b, 0xe4, 0xe8, 0xfd, 0x49, 0x43, 0x8a, 0x65,
+ 0x50, 0xb9, 0xa8, 0x0f, 0xd1, 0xb9, 0xde, 0x2c, 0x6a, 0x83, 0x2d, 0x29, 0x8b,
+ 0x54, 0xea, 0xc0, 0xb2, 0x83, 0x85, 0x84, 0x67, 0x7f, 0xe7, 0x93, 0x9f, 0xc2,
+ 0x43, 0x23, 0x63, 0x78, 0xf3, 0xc9, 0x3c, 0x40, 0x90, 0xad, 0xff, 0xa2,
+ ]
+ ),
+ test_case!(
+ [
+ 0x34, 0x4b, 0xff, 0x4b, 0x2c, 0x8d, 0x1d, 0x4e, 0xff, 0x62, 0xbd, 0xa1, 0x3d,
+ 0xac, 0x35, 0x6f, 0xb8, 0xd9, 0x77, 0x0e, 0x19, 0x00, 0x31, 0x66, 0x24, 0xaf,
+ 0x19, 0x51, 0xa8, 0x63, 0xaf, 0xff, 0x4b, 0x34, 0x55, 0x6b, 0x2f, 0x8d, 0x60,
+ 0x72, 0xcc, 0xc9, 0x56, 0x24, 0x82, 0x86, 0xe3, 0xac, 0xe5, 0x78, 0x46, 0xdd,
+ 0x80, 0x07, 0x74, 0xe1, 0x76, 0x26, 0xb5, 0x37, 0x9b, 0xe8, 0x8c, 0x78, 0xe2,
+ 0x34, 0x90, 0x6f, 0x47, 0x98, 0x16, 0x6f, 0xee, 0x9d, 0x67, 0x28,
+ ],
+ [
+ 0x67, 0x40, 0x33, 0x76, 0xfd, 0x7c, 0xee, 0xb6, 0xdf, 0x90, 0x4e, 0xe0, 0xcd,
+ 0xca, 0x0c, 0xb7, 0xf9, 0x8b, 0x98, 0xd1,
+ ],
+ [
+ 0xab, 0xdc, 0x9c, 0xfd, 0xb0, 0x9a, 0xb0, 0xf8, 0x3c, 0xae, 0x37, 0x52, 0xae,
+ 0x67, 0x11, 0xfc, 0x3c, 0xcc, 0x45, 0x25, 0x5b, 0x92, 0x05, 0x7e, 0xc7, 0x4a,
+ 0x8f, 0x11, 0xd9, 0x48, 0xa1, 0x4f,
+ ],
+ [
+ 0xed, 0x7b, 0x7b, 0x62, 0xe6, 0x5e, 0x02, 0x22, 0xbc, 0xb8, 0x1f, 0xe9, 0x71,
+ 0x15, 0x9d, 0x7b, 0x29, 0xc7, 0x24, 0xf8, 0xfd, 0xc0, 0x8c, 0xb2, 0xdd, 0x67,
+ 0x56, 0x02, 0x01, 0xfe, 0xba, 0xc2, 0xc9, 0xdb, 0x2e, 0xf5, 0xf2, 0xcb, 0x0b,
+ 0x8d, 0xe8, 0x4b, 0x31, 0x82, 0x2e, 0x00, 0x12, 0x14,
+ ],
+ [
+ 0xfa, 0xca, 0xb8, 0x26, 0x2c, 0x41, 0x60, 0x1f, 0xf5, 0xa6, 0xef, 0x53, 0x53,
+ 0xdf, 0xb2, 0xa5, 0x19, 0xcb, 0xa3, 0x13, 0xfa, 0x65, 0x53, 0x26, 0x43, 0x73,
+ 0xdc, 0x7d, 0xbc, 0x2f, 0xd7, 0x3b, 0xb1, 0xac, 0xb5, 0x85, 0x0d, 0x5c, 0x1a,
+ 0x6f, 0x53, 0xe5, 0x44, 0xbb, 0xc5, 0x68, 0xa5, 0xd5, 0xdc, 0xb8, 0xa8, 0xff,
+ 0xff, 0x5e, 0x2f, 0x75, 0xa6, 0xdf, 0x4b, 0xcc, 0xbb, 0xfa, 0xa4, 0x9d,
+ ]
+ ),
+ test_case!(
+ [
+ 0xf5, 0xc5, 0x46, 0xed, 0x3e, 0x48, 0x33, 0xac, 0x25, 0x5b, 0x22, 0x6f, 0xfb,
+ 0x06, 0x0d, 0xc6, 0xa5, 0x92, 0xbc, 0x36, 0x0d, 0xb5, 0x74, 0x5a, 0x76, 0xe9,
+ 0x07, 0x17, 0xd9, 0x4d, 0xbd, 0xe3, 0x96, 0x95, 0xb0, 0x82, 0x6c, 0x20, 0x1a,
+ 0x14, 0x69, 0x6c, 0x6a, 0x63, 0x4b, 0x1b, 0x01, 0x11, 0xf1, 0x16, 0x80, 0xe5,
+ 0x61, 0xc5, 0x6a, 0x61, 0x2a, 0x66, 0x37, 0x78, 0x81, 0x10, 0x90, 0x07, 0x92,
+ 0x20, 0x4e, 0xe0, 0xc7, 0x82, 0x90, 0x19, 0x43, 0x4b, 0xa8, 0x47, 0x59,
+ ],
+ [
+ 0x58, 0x95, 0xf1, 0x4c, 0x60, 0xed, 0x9f, 0xa5, 0xdf, 0xd7, 0xe6, 0x70, 0x96,
+ 0xa1, 0x8f, 0xce, 0xac, 0x01, 0xba, 0x84,
+ ],
+ [
+ 0x20, 0xf6, 0xec, 0x97, 0x7f, 0xeb, 0xa3, 0xf6, 0x8a, 0x0e, 0x55, 0x7d, 0x62,
+ 0x25, 0xa2, 0x4a, 0x46, 0x0b, 0xb3, 0x1a, 0x70, 0xb0, 0x3e, 0x37, 0xab, 0x72,
+ 0x89, 0xd7, 0xfb, 0x92, 0xc4, 0x21,
+ ],
+ [
+ 0x3f, 0x96, 0x8a, 0x68, 0x04, 0x88, 0xc7, 0xcb, 0x61, 0xb6, 0xa1, 0x95, 0x88,
+ 0x42, 0xe4, 0xcf, 0x63, 0x81, 0xc2, 0xba, 0xcc, 0xb5, 0x4d, 0x75, 0xd0, 0x98,
+ 0x9d, 0x14, 0x00, 0x91, 0x1d, 0xd5, 0xbb, 0x92, 0x5d, 0x07, 0x26, 0x86, 0x46,
+ 0x92, 0x07, 0x2b, 0x60, 0xdf, 0x32, 0x74, 0xd3, 0x4d,
+ ],
+ [
+ 0x0a, 0x40, 0x1a, 0xcc, 0x66, 0xfa, 0x0e, 0x2c, 0xde, 0xc5, 0xf4, 0xbc, 0xc3,
+ 0x29, 0x3a, 0x7a, 0xbb, 0x66, 0xb2, 0x02, 0x6c, 0xfd, 0x8e, 0xa2, 0xd6, 0x05,
+ 0x05, 0x38, 0x6e, 0x01, 0xc1, 0x40, 0x91, 0x04, 0x5d, 0x72, 0xe0, 0x10, 0x0b,
+ 0xaf, 0xc1, 0x2b, 0x19, 0xf1, 0xd9, 0xf8, 0x2c, 0x5b, 0x5a, 0x82, 0x07, 0xb4,
+ 0xa6, 0xa8, 0x1f, 0xf2, 0x4e, 0xf0, 0xe2, 0xfd, 0xeb, 0x63, 0xd7, 0x4d,
+ ]
+ ),
+ test_case!(
+ [
+ 0xd1, 0x1a, 0x65, 0xad, 0xe6, 0x8d, 0x31, 0x48, 0x3e, 0x7f, 0x6d, 0x8d, 0x87,
+ 0x35, 0x49, 0x0b, 0xb1, 0x0a, 0x4e, 0x39, 0x76, 0xdd, 0x7b, 0xe6, 0xf5, 0xb2,
+ 0xe7, 0x9a, 0x0e, 0x51, 0x77, 0xcc, 0xd5, 0x5c, 0x14, 0x83, 0x43, 0x49, 0x8a,
+ 0x06, 0xe4, 0x0d, 0xb1, 0xd0, 0x7e, 0x7b, 0x2e, 0x3b, 0x88, 0x90, 0x82, 0x4a,
+ 0x75, 0xad, 0xf3, 0x3d, 0x66, 0xb2, 0x11, 0xaa, 0x65, 0x24, 0xa0, 0x6e, 0x5c,
+ 0x84, 0x86, 0xd3, 0xd6, 0x46, 0xa1, 0x25, 0x56, 0xbf, 0x3e, 0x56, 0x7e, 0x09,
+ ],
+ [
+ 0xab, 0x59, 0xc9, 0x55, 0xe8, 0x24, 0x7c, 0x14, 0x73, 0xc3, 0xdb, 0x41, 0x5f,
+ 0x3f, 0x39, 0x08, 0x9f, 0x3f, 0x41, 0x1f,
+ ],
+ [
+ 0x3e, 0x72, 0xb2, 0x1b, 0x4e, 0x57, 0x95, 0x32, 0x91, 0x84, 0x0d, 0x67, 0xca,
+ 0xec, 0x66, 0xa2, 0x8b, 0x2a, 0x10, 0x88, 0x1b, 0xf0, 0x7d, 0x8d, 0xb0, 0xbd,
+ 0x80, 0xfc, 0x87, 0x55, 0xde, 0x94,
+ ],
+ [
+ 0x64, 0x6d, 0xc1, 0x8a, 0xf3, 0x64, 0x3a, 0x6a, 0x72, 0xd4, 0xfc, 0x2f, 0x09,
+ 0x56, 0x46, 0xdd, 0x01, 0xf4, 0xff, 0xd5, 0xda, 0xcc, 0x4b, 0x61, 0xbc, 0xd7,
+ 0xd1, 0x99, 0x18, 0x18, 0x4b, 0xde, 0x4a, 0xba, 0x46, 0x57, 0x6c, 0xae, 0x47,
+ 0xf8, 0x37, 0xe4, 0x0b, 0x91, 0x84, 0x06, 0x63, 0xba,
+ ],
+ [
+ 0x5f, 0x1f, 0x57, 0x75, 0xd4, 0x90, 0x73, 0x4b, 0x3b, 0xe3, 0x10, 0x17, 0x11,
+ 0x5f, 0x19, 0xab, 0xb7, 0xbb, 0xe7, 0x31, 0x1b, 0x87, 0x68, 0x57, 0xa2, 0x35,
+ 0x22, 0x30, 0x4b, 0xb4, 0x1e, 0x1d, 0x5b, 0x0d, 0x7e, 0x3c, 0xe2, 0x07, 0xb3,
+ 0x34, 0xfb, 0x10, 0x1c, 0x35, 0x41, 0xd9, 0xb6, 0xb9, 0x09, 0x44, 0x8c, 0xc5,
+ 0xb6, 0xc6, 0x1b, 0xbc, 0xc6, 0x5b, 0xba, 0x0d, 0xcb, 0x2a, 0x93, 0x20,
+ ]
+ ),
+ test_case!(
+ [
+ 0x9a, 0xe8, 0xad, 0x90, 0x0f, 0x8b, 0x6d, 0x6b, 0x02, 0x6e, 0xba, 0xbb, 0x8e,
+ 0x70, 0xb0, 0xf9, 0x02, 0xc6, 0x2c, 0xbb, 0x5d, 0x64, 0x5f, 0xf5, 0x80, 0x3e,
+ 0x47, 0x03, 0x86, 0x56, 0xf1, 0xb7, 0x6d, 0x19, 0x63, 0x61, 0xa8, 0x6d, 0x1b,
+ 0x92, 0x6a, 0x37, 0x23, 0x37, 0x46, 0x95, 0x5a, 0x07, 0xd3, 0x9a, 0xea, 0xb6,
+ 0xf2, 0x7e, 0xfa, 0x83, 0x85, 0xce, 0x02, 0xc5, 0x68, 0xa6, 0x7a, 0x8d, 0x8f,
+ 0x6e, 0xad, 0x65, 0xfb, 0x4a, 0x8d, 0xb0, 0xfa, 0x2f, 0xa6, 0x2b, 0x11, 0x0a,
+ 0xc2,
+ ],
+ [
+ 0xea, 0x99, 0x45, 0x31, 0x10, 0x5b, 0x52, 0x8f, 0x96, 0x0d, 0x57, 0x60, 0xe8,
+ 0x91, 0xb8, 0x4a, 0xcd, 0x4b, 0x0c, 0xbb,
+ ],
+ [
+ 0x62, 0x8f, 0x92, 0x62, 0x6d, 0x33, 0x04, 0x5d, 0xcc, 0x57, 0x4b, 0x45, 0xe9,
+ 0x6b, 0xc1, 0x5f, 0x06, 0x02, 0x63, 0x1f, 0x82, 0x8d, 0x05, 0xe5, 0xb1, 0x5d,
+ 0x80, 0xca, 0x01, 0xcf, 0xb1, 0x6e,
+ ],
+ [
+ 0x2f, 0x59, 0x79, 0xb7, 0x5d, 0x33, 0xdb, 0xbe, 0x68, 0xa3, 0x21, 0x1a, 0xc3,
+ 0xc2, 0x59, 0xfa, 0x2d, 0xef, 0x5e, 0xb7, 0xd8, 0x79, 0x10, 0x65, 0x75, 0x2e,
+ 0xa0, 0x4e, 0x07, 0x72, 0x18, 0xd1, 0xcf, 0x5c, 0x8f, 0x05, 0x46, 0x88, 0xd5,
+ 0x01, 0x1d, 0xc2, 0xcc, 0x20, 0x8f, 0xae, 0xbc, 0x7b,
+ ],
+ [
+ 0xec, 0xd5, 0x82, 0x7b, 0x54, 0xe1, 0x7e, 0x1e, 0x57, 0xb4, 0x8f, 0xda, 0x3d,
+ 0xf5, 0x93, 0x19, 0x26, 0x90, 0x46, 0x0d, 0x0a, 0x1f, 0x88, 0xb6, 0x1c, 0x10,
+ 0x00, 0xda, 0x92, 0xb7, 0x25, 0x9f, 0xb2, 0x0c, 0x24, 0x1d, 0x20, 0x40, 0xa4,
+ 0xd2, 0x2c, 0x2f, 0xde, 0xcc, 0xf7, 0x96, 0xeb, 0x4c, 0xa9, 0xb4, 0x0f, 0x0d,
+ 0x85, 0x4c, 0x0e, 0x85, 0x40, 0xa8, 0xe7, 0x97, 0x4e, 0x25, 0x1b, 0x51,
+ ]
+ ),
+ test_case!(
+ [
+ 0x62, 0xb9, 0x4b, 0xb4, 0xad, 0x2a, 0x5e, 0xfd, 0x4c, 0x26, 0x67, 0x36, 0x65,
+ 0xaf, 0xb6, 0xe6, 0x6d, 0x57, 0x83, 0x97, 0xcd, 0x18, 0x72, 0x63, 0x69, 0x8c,
+ 0x54, 0x1c, 0x35, 0xca, 0x7c, 0x61, 0xcf, 0x02, 0x8b, 0x45, 0x60, 0x18, 0xa1,
+ 0x22, 0xf9, 0xda, 0xb6, 0xde, 0xe2, 0x76, 0x98, 0x2a, 0x32, 0x78, 0x12, 0x3d,
+ 0xc1, 0xc0, 0x17, 0x84, 0xc1, 0x38, 0x88, 0x62, 0xdb, 0x91, 0x87, 0x9a, 0x38,
+ 0xbb, 0x64, 0x1c, 0xa2, 0x71, 0x46, 0x88, 0x58, 0xab, 0x88, 0x1d, 0x2d, 0xb6,
+ 0x2b, 0x17,
+ ],
+ [
+ 0xdc, 0x05, 0x68, 0x3e, 0x45, 0x94, 0x7c, 0x42, 0xac, 0x44, 0x29, 0xdf, 0x8d,
+ 0xfa, 0xf3, 0xfc, 0xb7, 0x77, 0xcd, 0x7d,
+ ],
+ [
+ 0x39, 0x14, 0xbf, 0xb1, 0x38, 0x82, 0xcd, 0x16, 0x8a, 0x27, 0x9c, 0x83, 0x7f,
+ 0x5f, 0x97, 0x1a, 0xcb, 0x79, 0x20, 0x9e, 0xb4, 0x63, 0xd0, 0x66, 0x39, 0x13,
+ 0x60, 0x2f, 0x38, 0xe4, 0x69, 0x5e,
+ ],
+ [
+ 0xa6, 0x52, 0xa9, 0x0f, 0xf4, 0x02, 0x27, 0x62, 0x44, 0xde, 0x4e, 0x3d, 0x87,
+ 0xb8, 0x36, 0x19, 0x23, 0xde, 0xa0, 0xd6, 0x92, 0xaf, 0x8d, 0x90, 0x92, 0x92,
+ 0x5a, 0xbb, 0x4b, 0x5f, 0x87, 0xad, 0xe7, 0xe2, 0xc0, 0x8f, 0xe8, 0x2c, 0x64,
+ 0xf9, 0xc2, 0xa9, 0x7f, 0x1b, 0xe8, 0x54, 0x4e, 0x5d,
+ ],
+ [
+ 0xa8, 0x5a, 0xbb, 0xb4, 0xdb, 0x9a, 0x79, 0xb7, 0xb0, 0x7a, 0x78, 0x01, 0x00,
+ 0x31, 0x4b, 0x25, 0xb0, 0x5b, 0xe5, 0x3f, 0x48, 0xee, 0x4f, 0xf6, 0x82, 0x00,
+ 0x82, 0x9e, 0xe5, 0x48, 0x95, 0x40, 0x91, 0x70, 0x62, 0xf6, 0x73, 0x1b, 0xe4,
+ 0x26, 0xdb, 0x94, 0x36, 0x90, 0xa9, 0x17, 0xa9, 0x6d, 0x7b, 0x87, 0x8c, 0xc9,
+ 0x94, 0xf7, 0xbb, 0x00, 0xa8, 0x93, 0x8b, 0x0e, 0x2f, 0x56, 0x93, 0x71,
+ ]
+ ),
+ test_case!(
+ [
+ 0xba, 0x3a, 0x98, 0xa7, 0x04, 0xf5, 0xa6, 0x96, 0xc0, 0x97, 0x86, 0xa6, 0x5f,
+ 0xfe, 0xdb, 0x2b, 0x80, 0x3f, 0xad, 0x60, 0x99, 0x0e, 0x39, 0x21, 0x4f, 0xfd,
+ 0x04, 0x72, 0x40, 0x4d, 0xca, 0x57, 0xd0, 0x89, 0x9e, 0x12, 0x74, 0xae, 0x67,
+ 0xb5, 0x98, 0x0e, 0xe0, 0xcf, 0x37, 0x88, 0xb7, 0x59, 0x42, 0xe0, 0xe7, 0x12,
+ 0x4b, 0x91, 0xb4, 0x52, 0x08, 0x98, 0x90, 0xc8, 0x44, 0x4b, 0x48, 0x5d, 0x84,
+ 0x2e, 0x40, 0x07, 0xf3, 0xfc, 0xc4, 0x29, 0x57, 0x86, 0x57, 0x84, 0x35, 0x7f,
+ 0xda, 0x7d, 0xaf,
+ ],
+ [
+ 0xc0, 0x28, 0x81, 0x01, 0xb4, 0x74, 0x33, 0x1c, 0x6f, 0xbf, 0xcf, 0xa9, 0x75,
+ 0xe3, 0x3b, 0x7a, 0x2e, 0x75, 0x98, 0x8b,
+ ],
+ [
+ 0x4f, 0x37, 0x3a, 0x1a, 0x7c, 0xaa, 0x1a, 0x06, 0xf4, 0xed, 0x46, 0x45, 0x82,
+ 0x05, 0x09, 0x9b, 0xf1, 0x6b, 0xb2, 0xb2, 0x7f, 0x86, 0xe2, 0x43, 0xab, 0xc3,
+ 0x33, 0x10, 0x33, 0x34, 0x16, 0x1d,
+ ],
+ [
+ 0x60, 0xa7, 0x1d, 0x42, 0x8c, 0x1a, 0xd4, 0x0b, 0x3f, 0xec, 0x68, 0xb7, 0x0f,
+ 0xf9, 0x06, 0xf7, 0x82, 0x02, 0xa1, 0xcc, 0x5d, 0xda, 0x0d, 0x9f, 0x46, 0xa9,
+ 0x43, 0x74, 0xd2, 0x4e, 0xe0, 0x38, 0xb4, 0xb0, 0x0a, 0x87, 0xd0, 0x6b, 0x28,
+ 0x53, 0x4f, 0x21, 0xce, 0x3f, 0xcb, 0x26, 0x7b, 0xbf,
+ ],
+ [
+ 0x22, 0x9d, 0x9b, 0xa0, 0x91, 0xda, 0x8e, 0x02, 0xcc, 0xf6, 0xc0, 0x69, 0xd2,
+ 0x49, 0xba, 0x40, 0xf7, 0xd8, 0x1e, 0xe7, 0xee, 0xed, 0xdc, 0x35, 0x84, 0x5c,
+ 0x1e, 0xec, 0x00, 0x22, 0x78, 0x64, 0xbc, 0xc3, 0xfd, 0x52, 0x7a, 0xf8, 0x81,
+ 0x63, 0x30, 0x1f, 0xa9, 0x45, 0xbe, 0x29, 0x06, 0xee, 0xce, 0xab, 0x8b, 0x43,
+ 0x68, 0x51, 0x6a, 0xa3, 0x94, 0xa6, 0x8d, 0x82, 0xb2, 0x27, 0x7d, 0xc1,
+ ]
+ ),
+ test_case!(
+ [
+ 0xb2, 0xd5, 0x27, 0x3a, 0x74, 0xb8, 0xf7, 0xf6, 0x53, 0xc8, 0x27, 0xa2, 0x3e,
+ 0x1e, 0xd1, 0x29, 0xdd, 0x0a, 0x13, 0x41, 0xb4, 0xba, 0x1f, 0x7a, 0xbc, 0x74,
+ 0x1f, 0x07, 0x23, 0x79, 0xc3, 0x68, 0x75, 0x6c, 0x17, 0xb7, 0x20, 0x58, 0x07,
+ 0x86, 0x7e, 0x17, 0x79, 0xc3, 0x0c, 0xe0, 0xaf, 0xa1, 0x7b, 0xe6, 0x20, 0xa9,
+ 0xa8, 0x15, 0x10, 0xc9, 0x9a, 0xad, 0x61, 0x09, 0xf0, 0xeb, 0xe8, 0x38, 0x33,
+ 0x0e, 0x62, 0x53, 0x46, 0xbb, 0x30, 0xbb, 0x9e, 0x63, 0x8e, 0x0a, 0x4c, 0x1d,
+ 0xb1, 0x4f, 0xf8, 0xf1,
+ ],
+ [
+ 0x9e, 0x3f, 0xe2, 0x4b, 0x16, 0x89, 0x11, 0x74, 0x8b, 0x0e, 0x10, 0x28, 0x02,
+ 0xb2, 0x09, 0xb9, 0x7f, 0xc2, 0x1e, 0x40,
+ ],
+ [
+ 0xcc, 0xaa, 0x31, 0xd9, 0x53, 0x54, 0xd4, 0x94, 0x68, 0x36, 0x23, 0xa1, 0x78,
+ 0x27, 0x27, 0x3e, 0x61, 0xf0, 0x02, 0xd0, 0xb8, 0xa1, 0x24, 0x78, 0x3f, 0xcd,
+ 0xbc, 0x0e, 0x6e, 0x84, 0xbf, 0x01,
+ ],
+ [
+ 0xd6, 0x79, 0x53, 0x4b, 0xbf, 0x5e, 0x72, 0x81, 0x1c, 0xd9, 0xb9, 0x84, 0xb4,
+ 0x00, 0xa2, 0x50, 0xf7, 0x23, 0x8c, 0x88, 0x09, 0x61, 0x55, 0x44, 0xfb, 0xbf,
+ 0x93, 0x1b, 0x8a, 0xb7, 0x2f, 0x10, 0x70, 0x9d, 0x98, 0xf8, 0x59, 0x39, 0xd0,
+ 0xfc, 0x95, 0x88, 0x3d, 0x23, 0x5a, 0x93, 0xbd, 0x84,
+ ],
+ [
+ 0x45, 0x21, 0x35, 0x2f, 0x3b, 0x27, 0xe2, 0x95, 0x45, 0x77, 0x1c, 0x08, 0x8c,
+ 0x77, 0xf6, 0x6d, 0xe7, 0xbc, 0x2d, 0x2b, 0xd7, 0x71, 0xe0, 0x11, 0x60, 0x29,
+ 0x9b, 0x1d, 0x18, 0x34, 0xaa, 0xf8, 0xb3, 0xf2, 0xe5, 0xb5, 0xfd, 0x80, 0xb8,
+ 0x7f, 0x7c, 0x3d, 0xc5, 0xb5, 0xb0, 0x2a, 0x18, 0xdf, 0x63, 0xec, 0x94, 0x81,
+ 0x91, 0x5f, 0x68, 0x64, 0xe2, 0x47, 0x55, 0x80, 0x73, 0xbd, 0xbc, 0x7c,
+ ]
+ ),
+ test_case!(
+ [
+ 0x3a, 0x1a, 0xa4, 0xd3, 0xb2, 0x5b, 0x57, 0x88, 0xc6, 0x86, 0xdf, 0x7f, 0x60,
+ 0x4b, 0x0f, 0xa5, 0x46, 0x1e, 0x61, 0x28, 0xa8, 0x7a, 0x09, 0xc7, 0x47, 0x6d,
+ 0xa4, 0xb7, 0x30, 0xa9, 0xf7, 0x0e, 0xbf, 0x58, 0xc7, 0x8c, 0xfa, 0x62, 0x69,
+ 0xac, 0x9d, 0x2c, 0xfe, 0xd4, 0x45, 0x70, 0x55, 0x25, 0xee, 0x1e, 0x12, 0x28,
+ 0x72, 0x96, 0x65, 0xc7, 0x7c, 0xbb, 0xc7, 0x49, 0x00, 0x79, 0x53, 0xba, 0x2f,
+ 0x6e, 0xbe, 0xec, 0x8a, 0xf0, 0xe8, 0xff, 0xc1, 0x0d, 0x31, 0xfc, 0xf2, 0x04,
+ 0xe2, 0x54, 0x8b, 0x44, 0x8f,
+ ],
+ [
+ 0xa6, 0x28, 0x1c, 0xd5, 0x57, 0x89, 0x30, 0x48, 0x01, 0xff, 0x6e, 0x84, 0x45,
+ 0x80, 0x19, 0x28, 0x4b, 0xec, 0xc9, 0xda,
+ ],
+ [
+ 0x36, 0x27, 0xa9, 0x7f, 0x26, 0x85, 0xcf, 0x03, 0x0f, 0xd9, 0x75, 0xa7, 0x71,
+ 0xd7, 0xd6, 0xcb, 0xf9, 0x7d, 0x86, 0xf9, 0x6f, 0xcc, 0x97, 0xa8, 0xed, 0x43,
+ 0x22, 0xe7, 0x2f, 0xaf, 0x39, 0x84,
+ ],
+ [
+ 0x61, 0xec, 0x2a, 0x18, 0x52, 0xbe, 0xc4, 0x7d, 0x84, 0xd7, 0xd9, 0xdc, 0xb3,
+ 0xe2, 0x5e, 0x94, 0xf2, 0x62, 0xe0, 0x42, 0xf2, 0xea, 0x65, 0x97, 0x85, 0x82,
+ 0x77, 0xbe, 0xea, 0x13, 0x52, 0x8d, 0x30, 0xa3, 0xda, 0x80, 0x8d, 0x62, 0x2c,
+ 0x56, 0xf7, 0x57, 0x8c, 0xf2, 0x93, 0xc3, 0x2b, 0xf2,
+ ],
+ [
+ 0x63, 0xde, 0xd0, 0x79, 0x47, 0x76, 0xb7, 0x63, 0xb9, 0x48, 0xfd, 0x29, 0x5c,
+ 0xc0, 0x70, 0xf3, 0xb0, 0x89, 0x13, 0x45, 0xea, 0xb9, 0xec, 0x80, 0xd3, 0xdd,
+ 0x79, 0xad, 0x22, 0x22, 0xa4, 0x56, 0xb0, 0xf2, 0xaa, 0x80, 0x22, 0xe2, 0x23,
+ 0xc3, 0xcb, 0x25, 0x84, 0x8d, 0xbe, 0x92, 0xd9, 0x8d, 0x45, 0xb4, 0xa2, 0xc1,
+ 0xa0, 0x7e, 0x98, 0xfa, 0x81, 0x94, 0x46, 0x97, 0xf9, 0x4a, 0xd7, 0xf6,
+ ]
+ ),
+ test_case!(
+ [
+ 0x5e, 0x80, 0xab, 0x35, 0x62, 0x28, 0xe1, 0x81, 0x50, 0xe8, 0xd2, 0x3f, 0x1e,
+ 0x58, 0x74, 0xb8, 0x41, 0x55, 0x17, 0x4d, 0x13, 0xba, 0xff, 0x53, 0x07, 0xf3,
+ 0x52, 0x42, 0x19, 0x8d, 0x34, 0x56, 0x08, 0x5a, 0x34, 0xc6, 0x7f, 0x5c, 0x60,
+ 0xd3, 0xed, 0x95, 0x68, 0xcc, 0x69, 0xa4, 0xca, 0x4b, 0x7a, 0xe6, 0x28, 0x9b,
+ 0x87, 0xb1, 0xa5, 0x39, 0x49, 0x3f, 0x50, 0xb6, 0x26, 0x31, 0x5e, 0xa7, 0xf3,
+ 0x43, 0x6f, 0xa0, 0xee, 0xc7, 0xdf, 0x0a, 0xcc, 0xae, 0xd6, 0xa2, 0x59, 0x01,
+ 0x5f, 0xcf, 0x71, 0x49, 0x97, 0xc5,
+ ],
+ [
+ 0x3d, 0x37, 0x10, 0x21, 0xe7, 0x3f, 0x1f, 0xd5, 0xca, 0xa0, 0x41, 0xa3, 0xb4,
+ 0xd4, 0xa5, 0x64, 0xc6, 0x4c, 0x04, 0x92,
+ ],
+ [
+ 0x7e, 0xca, 0x32, 0x96, 0x12, 0x8b, 0x47, 0xb5, 0xf3, 0xe4, 0xc2, 0xee, 0x68,
+ 0xf3, 0x97, 0x4b, 0x5c, 0xbb, 0xf6, 0xd3, 0x10, 0x45, 0x6e, 0xce, 0x50, 0xf6,
+ 0xb9, 0x85, 0x17, 0xdd, 0x6b, 0x17,
+ ],
+ [
+ 0xd0, 0x3f, 0x40, 0x7e, 0xa2, 0x69, 0x09, 0xc8, 0x33, 0x11, 0xb7, 0x07, 0x95,
+ 0x0d, 0xa9, 0xad, 0xf7, 0x1f, 0xdc, 0xdb, 0x07, 0x56, 0x96, 0x33, 0xb8, 0xfd,
+ 0x74, 0xa6, 0x5c, 0x39, 0x71, 0x46, 0xe9, 0xd8, 0xd9, 0x10, 0x68, 0x0d, 0x33,
+ 0x35, 0x38, 0xac, 0xca, 0x4b, 0x68, 0x00, 0xc7, 0xf5,
+ ],
+ [
+ 0x89, 0x4f, 0xfa, 0xd9, 0xb5, 0x47, 0xd7, 0xae, 0x7a, 0x97, 0xfb, 0x82, 0xf6,
+ 0xad, 0xde, 0xbc, 0xf9, 0xf9, 0xd9, 0x24, 0x61, 0x04, 0x55, 0xf6, 0x8d, 0xf1,
+ 0x79, 0x31, 0xf7, 0xb8, 0x9c, 0x2e, 0xcd, 0x88, 0x98, 0x6c, 0xfa, 0xdc, 0x37,
+ 0xfe, 0xc8, 0xc6, 0xec, 0x4e, 0x16, 0xda, 0x5f, 0x8b, 0x7f, 0xda, 0x0a, 0x11,
+ 0xe9, 0x92, 0xde, 0x63, 0x51, 0xc0, 0x6e, 0xea, 0xb8, 0xcc, 0x6b, 0x34,
+ ]
+ ),
+ test_case!(
+ [
+ 0xfa, 0xf5, 0x61, 0x5e, 0x3d, 0x18, 0x78, 0x43, 0xdf, 0xed, 0x6b, 0xf1, 0x08,
+ 0xd8, 0x69, 0xe8, 0x22, 0x1f, 0x48, 0xce, 0x8f, 0x76, 0x54, 0xff, 0xc3, 0xbf,
+ 0x42, 0x31, 0xeb, 0x65, 0x8b, 0x4d, 0x15, 0x4a, 0x6e, 0x38, 0xf6, 0xaa, 0xac,
+ 0xbb, 0xe2, 0xbd, 0x06, 0xf6, 0xb3, 0x22, 0x2c, 0xca, 0x58, 0x01, 0x34, 0xd3,
+ 0x0c, 0xa6, 0xd0, 0xed, 0x2b, 0x28, 0x57, 0xf8, 0xb5, 0xeb, 0x9d, 0xf1, 0xa8,
+ 0xf4, 0x3e, 0x0d, 0x67, 0x05, 0xbb, 0xe2, 0x4a, 0x69, 0x7b, 0xa7, 0x9f, 0x0f,
+ 0x31, 0xa8, 0x49, 0x4b, 0x9d, 0x54, 0xd6,
+ ],
+ [
+ 0xfe, 0xa8, 0xd3, 0x53, 0x2f, 0x48, 0x06, 0xaa, 0xd4, 0x94, 0xce, 0xa0, 0xcc,
+ 0xc9, 0x5b, 0x5e, 0x99, 0xa5, 0x1f, 0xd9,
+ ],
+ [
+ 0x57, 0x26, 0x38, 0x9b, 0x03, 0x68, 0xa9, 0x28, 0xcc, 0x16, 0x65, 0xd7, 0x56,
+ 0x18, 0xb9, 0x33, 0x74, 0x86, 0x97, 0xfc, 0x7a, 0x0a, 0x36, 0x4b, 0xda, 0xd0,
+ 0x24, 0x66, 0xe9, 0x5c, 0x0a, 0x3d,
+ ],
+ [
+ 0x25, 0x31, 0x26, 0x5d, 0xbb, 0x78, 0x2a, 0xa7, 0x1a, 0x1e, 0x8b, 0x24, 0xdd,
+ 0xbd, 0xf0, 0xe8, 0xcb, 0x0c, 0x84, 0x35, 0x66, 0x03, 0x10, 0x42, 0x94, 0x49,
+ 0xf7, 0x16, 0x37, 0x66, 0x9e, 0xdc, 0x35, 0xb9, 0x69, 0xec, 0x0b, 0x42, 0x66,
+ 0x79, 0x6e, 0xd7, 0xfa, 0x4f, 0x37, 0xc3, 0x33, 0x25,
+ ],
+ [
+ 0xd5, 0x6b, 0xe6, 0x65, 0x61, 0xc2, 0x08, 0xe0, 0x85, 0xdc, 0x81, 0xe1, 0x41,
+ 0x54, 0xbb, 0x0a, 0xcc, 0xfb, 0xf8, 0x3e, 0x2e, 0xdf, 0x31, 0xc4, 0x68, 0x3d,
+ 0x03, 0x87, 0x04, 0x03, 0x5e, 0xc8, 0x3a, 0xc2, 0x5a, 0xe0, 0x2c, 0x62, 0x90,
+ 0x33, 0xc7, 0xd1, 0x64, 0xe1, 0xe9, 0xff, 0x20, 0x43, 0x46, 0x60, 0x1a, 0x8d,
+ 0x70, 0x00, 0x60, 0xdd, 0x1e, 0x84, 0x16, 0x5b, 0x53, 0x93, 0x03, 0xc7,
+ ]
+ ),
+ test_case!(
+ [
+ 0x1b, 0x27, 0xa7, 0x1d, 0x7f, 0x5a, 0x9e, 0xb7, 0x49, 0xe9, 0x37, 0x2d, 0x6c,
+ 0xc7, 0x21, 0xb9, 0xd7, 0x26, 0x9a, 0xa2, 0x3a, 0x23, 0x6c, 0x70, 0xc6, 0x09,
+ 0xd0, 0x93, 0xfd, 0xbd, 0x30, 0x74, 0x41, 0xcb, 0x6f, 0x56, 0x70, 0xc7, 0x43,
+ 0xcb, 0x2d, 0x6b, 0xd5, 0xfe, 0x6e, 0xd5, 0xa2, 0x0c, 0x65, 0xaf, 0xab, 0x3d,
+ 0x81, 0x57, 0x94, 0xc2, 0x21, 0xf2, 0x59, 0x12, 0xac, 0x1d, 0xc2, 0x8f, 0x1f,
+ 0xf7, 0xb4, 0x6a, 0x98, 0xb0, 0x15, 0x76, 0x07, 0xc7, 0x3e, 0xd3, 0x61, 0x74,
+ 0x20, 0x21, 0x07, 0xc3, 0x65, 0x66, 0x2c, 0x69,
+ ],
+ [
+ 0xfe, 0x5d, 0x0a, 0x51, 0xb5, 0x15, 0x97, 0x07, 0x30, 0xe7, 0x9b, 0x0c, 0xff,
+ 0xb7, 0x5c, 0x4b, 0xee, 0x10, 0x0a, 0x0d,
+ ],
+ [
+ 0x71, 0x86, 0xe6, 0xcb, 0xaa, 0xe2, 0x86, 0x47, 0x84, 0x50, 0x44, 0x39, 0xd1,
+ 0x37, 0xf5, 0xf8, 0xbf, 0x29, 0x9a, 0xd6, 0x02, 0x80, 0x7c, 0xa6, 0xdc, 0x98,
+ 0xc6, 0x91, 0x19, 0xaf, 0x88, 0x9d,
+ ],
+ [
+ 0x45, 0xb1, 0x82, 0x34, 0x71, 0xae, 0xa0, 0x29, 0xaa, 0x27, 0xf1, 0xc0, 0x4d,
+ 0x63, 0xab, 0xde, 0xda, 0x26, 0x97, 0x9e, 0x16, 0xa9, 0x22, 0xad, 0x23, 0x74,
+ 0x5b, 0xfc, 0xc4, 0xa8, 0xab, 0x47, 0xa5, 0x38, 0x43, 0x46, 0x57, 0x88, 0x11,
+ 0x1e, 0x3c, 0xd5, 0x96, 0xe5, 0x7e, 0x03, 0x4a, 0x34,
+ ],
+ [
+ 0x0c, 0x30, 0xb8, 0xa9, 0x6a, 0xec, 0x86, 0x0b, 0xaa, 0x72, 0x0e, 0xc0, 0xd0,
+ 0xcb, 0x96, 0xdc, 0xbb, 0xab, 0x0e, 0x0d, 0xb4, 0xb1, 0x5b, 0x60, 0xc8, 0x06,
+ 0xd7, 0x62, 0x2d, 0xa7, 0x30, 0x3a, 0x82, 0x84, 0x1f, 0x4f, 0x5b, 0x9a, 0xcd,
+ 0x12, 0x26, 0x29, 0x8a, 0x13, 0x96, 0x9e, 0xad, 0x77, 0x48, 0xe5, 0x59, 0x37,
+ 0x7d, 0x90, 0x17, 0x10, 0xc1, 0x40, 0x48, 0xab, 0x92, 0x2c, 0x30, 0x53,
+ ]
+ ),
+ test_case!(
+ [
+ 0xa8, 0x72, 0x57, 0xc0, 0xff, 0x86, 0xb7, 0x84, 0x6a, 0xc3, 0xff, 0x7f, 0x90,
+ 0x02, 0xba, 0x53, 0xc0, 0xb7, 0x50, 0x48, 0x4d, 0x20, 0xa6, 0xab, 0x6d, 0x6c,
+ 0x1a, 0xbf, 0xac, 0x5f, 0x20, 0x16, 0x90, 0x61, 0x7b, 0xfb, 0x2e, 0x44, 0xbb,
+ 0x60, 0xe9, 0x00, 0x5f, 0xd1, 0xb5, 0xfc, 0xe0, 0x75, 0x69, 0x61, 0x9b, 0xca,
+ 0x7e, 0xfc, 0x54, 0x43, 0x81, 0x66, 0xfa, 0xbf, 0xeb, 0xbd, 0xac, 0x04, 0x16,
+ 0xe1, 0x2e, 0x89, 0x7b, 0x4f, 0x3f, 0xef, 0x36, 0xac, 0x30, 0x0c, 0x50, 0xff,
+ 0x2a, 0x99, 0xfc, 0x5c, 0xa7, 0x39, 0x16, 0x16, 0xc7,
+ ],
+ [
+ 0x52, 0xe3, 0x90, 0x87, 0x5c, 0xc0, 0x19, 0xd0, 0xaa, 0x47, 0x3e, 0x86, 0x63,
+ 0xf8, 0xfe, 0xfb, 0xbb, 0x31, 0x90, 0xd2,
+ ],
+ [
+ 0x7f, 0xec, 0x36, 0xac, 0xc9, 0x0c, 0xfa, 0x26, 0xd3, 0x4c, 0x3d, 0x3d, 0x55,
+ 0x67, 0xd2, 0x88, 0x54, 0x81, 0x07, 0xb8, 0x36, 0xd7, 0x35, 0x87, 0xe2, 0xca,
+ 0x7c, 0x0d, 0xaa, 0xe4, 0x5a, 0x5a,
+ ],
+ [
+ 0x37, 0x0c, 0x87, 0xe5, 0x59, 0x7c, 0x71, 0x5d, 0x47, 0x22, 0x03, 0x76, 0xd2,
+ 0x86, 0xca, 0xf6, 0x8f, 0xd8, 0x19, 0x5a, 0xd9, 0x0e, 0x9a, 0xbb, 0x5b, 0xac,
+ 0x9a, 0xc3, 0xa4, 0xf6, 0xea, 0xe2, 0xe2, 0x91, 0x23, 0x40, 0x6f, 0xbf, 0xcd,
+ 0x5d, 0x2d, 0x02, 0x32, 0xfa, 0x85, 0xd8, 0x83, 0x89,
+ ],
+ [
+ 0x80, 0xeb, 0x72, 0xd7, 0x19, 0xda, 0xd7, 0x9b, 0x94, 0xeb, 0x27, 0x1d, 0x27,
+ 0xea, 0x34, 0x3d, 0xd4, 0x06, 0x44, 0x2e, 0x1c, 0x79, 0x2b, 0x4b, 0x99, 0x40,
+ 0x73, 0x5c, 0xbe, 0x95, 0x92, 0x35, 0xb4, 0xa4, 0xea, 0xbf, 0xf4, 0xc6, 0x91,
+ 0x2e, 0xf1, 0xc0, 0x90, 0x7a, 0xb4, 0x5a, 0x35, 0xaf, 0x59, 0xeb, 0xf0, 0x6b,
+ 0x09, 0xff, 0xb8, 0x81, 0xa6, 0x7f, 0x83, 0xd1, 0x93, 0xfa, 0x16, 0x31,
+ ]
+ ),
+ test_case!(
+ [
+ 0xde, 0xfe, 0xed, 0x0b, 0xf4, 0xcc, 0x79, 0x9e, 0xc4, 0x06, 0xdb, 0x1e, 0xcc,
+ 0x19, 0xde, 0xaa, 0x6f, 0xa0, 0x51, 0x2b, 0x04, 0xd9, 0x69, 0x71, 0x79, 0xa1,
+ 0x3e, 0xc7, 0x0e, 0x9b, 0xe6, 0xbb, 0xa1, 0x40, 0x39, 0x52, 0x88, 0x73, 0x55,
+ 0x99, 0xce, 0x29, 0xc2, 0xb9, 0x19, 0xb9, 0xf3, 0x0f, 0x9a, 0x4f, 0x84, 0xcd,
+ 0xd6, 0x3b, 0x77, 0x07, 0xaf, 0xaa, 0x7e, 0xa3, 0xf3, 0x73, 0x9c, 0xd3, 0x57,
+ 0x8b, 0x00, 0xbb, 0x9e, 0x56, 0x8c, 0x43, 0x7d, 0x3f, 0xee, 0x5d, 0x44, 0x5d,
+ 0x46, 0x90, 0x2c, 0x59, 0xff, 0x00, 0xe0, 0x8f, 0x05, 0x64,
+ ],
+ [
+ 0xe5, 0xeb, 0xe8, 0x67, 0xef, 0x21, 0xc3, 0xfd, 0x82, 0x15, 0xa7, 0x66, 0x08,
+ 0x89, 0xce, 0x04, 0x17, 0xad, 0xdf, 0x01,
+ ],
+ [
+ 0x7b, 0x2c, 0xf0, 0x87, 0xc6, 0x68, 0x65, 0x8f, 0x4b, 0x94, 0x64, 0xb5, 0x56,
+ 0x92, 0xbc, 0xe1, 0x8a, 0x63, 0x3b, 0x5b, 0xf5, 0x30, 0xd0, 0xb4, 0xb6, 0x14,
+ 0xef, 0x40, 0xbf, 0x3c, 0xdf, 0x1c,
+ ],
+ [
+ 0x5c, 0x43, 0xcd, 0x0e, 0x87, 0x2c, 0x9b, 0x51, 0x5f, 0x4b, 0x4a, 0x66, 0x39,
+ 0x32, 0x46, 0x71, 0xc3, 0xa3, 0x2a, 0xe0, 0xbb, 0x20, 0x4e, 0x4f, 0xe1, 0xbc,
+ 0x74, 0x08, 0xed, 0x64, 0xb4, 0xc4, 0xb3, 0x34, 0x40, 0x4e, 0x84, 0x6c, 0x3a,
+ 0x81, 0x36, 0xea, 0xcf, 0x0e, 0x7a, 0xbf, 0x90, 0x43,
+ ],
+ [
+ 0x61, 0x0d, 0x53, 0xba, 0x5a, 0x43, 0xe0, 0x47, 0xf8, 0x60, 0xed, 0x99, 0x61,
+ 0x74, 0x1d, 0x18, 0x6e, 0x06, 0x83, 0xfa, 0x2a, 0x7a, 0xc3, 0x12, 0x45, 0x28,
+ 0x38, 0x46, 0x9f, 0x2c, 0xd6, 0x9e, 0xbf, 0xc7, 0xe2, 0x77, 0xe0, 0x4a, 0x7f,
+ 0x4e, 0x59, 0x08, 0x94, 0xf3, 0x32, 0x3a, 0xaf, 0xe5, 0x41, 0x49, 0x23, 0x2b,
+ 0xc4, 0x8f, 0x0d, 0x8c, 0xd3, 0x74, 0xcc, 0x79, 0x2f, 0xd1, 0x68, 0xb7,
+ ]
+ ),
+ test_case!(
+ [
+ 0x93, 0x6a, 0xfa, 0xf9, 0x63, 0xb3, 0x57, 0x0d, 0x66, 0x5e, 0xb3, 0xe2, 0xf4,
+ 0x43, 0xbd, 0x8f, 0xbe, 0x7e, 0xa7, 0x65, 0x20, 0x03, 0xbe, 0x67, 0x0d, 0x10,
+ 0xdc, 0x48, 0x1c, 0xf6, 0x31, 0x56, 0x8a, 0x4b, 0x96, 0x92, 0xc6, 0x15, 0xea,
+ 0xdc, 0xe8, 0xd6, 0x3f, 0x6c, 0xad, 0x05, 0x0a, 0xca, 0xd2, 0xc7, 0x34, 0xb9,
+ 0x06, 0xf4, 0x24, 0xcf, 0x2f, 0x8d, 0xbd, 0x6e, 0xe7, 0x6f, 0x40, 0xf8, 0x35,
+ 0xab, 0x75, 0x6e, 0x41, 0xe2, 0x9e, 0x33, 0x77, 0x27, 0x07, 0xf4, 0xbc, 0x75,
+ 0x9f, 0x23, 0xfc, 0xee, 0x4a, 0x40, 0x5a, 0x93, 0xbf, 0x6f, 0xb9,
+ ],
+ [
+ 0x81, 0x0f, 0x96, 0xcb, 0x7f, 0x0f, 0x0c, 0xd1, 0xb1, 0x81, 0xf6, 0x1f, 0x03,
+ 0x82, 0x62, 0x46, 0x47, 0x78, 0xad, 0x6e,
+ ],
+ [
+ 0x44, 0x84, 0x77, 0xea, 0xa7, 0x51, 0xf3, 0x6e, 0x74, 0x96, 0x2b, 0xa3, 0xca,
+ 0x11, 0xb7, 0xa6, 0xf7, 0x4d, 0xd8, 0xd4, 0x54, 0x4c, 0xfa, 0x71, 0x5f, 0x68,
+ 0x00, 0xda, 0x46, 0xa7, 0xa9, 0xf0,
+ ],
+ [
+ 0xa7, 0xe1, 0x29, 0x03, 0x28, 0x29, 0x22, 0x00, 0x21, 0x98, 0x60, 0x1b, 0xe0,
+ 0x26, 0xda, 0xbc, 0x19, 0x58, 0x5c, 0x0b, 0x1d, 0x6a, 0x82, 0xd7, 0x18, 0x44,
+ 0xa2, 0x91, 0xe4, 0x7c, 0xce, 0x6e, 0xae, 0x4c, 0x54, 0x1c, 0xdf, 0xa5, 0x0a,
+ 0x0c, 0x5f, 0xb2, 0x76, 0x02, 0x32, 0x5f, 0x8e, 0x05,
+ ],
+ [
+ 0xbf, 0x4a, 0x53, 0xea, 0x81, 0xb4, 0x3b, 0x94, 0x0b, 0xde, 0xab, 0x7c, 0x34,
+ 0x84, 0x1b, 0x8c, 0x6f, 0x7d, 0xf8, 0x34, 0x13, 0x57, 0x77, 0x51, 0x12, 0x48,
+ 0xc9, 0xc2, 0xc1, 0xb8, 0xa3, 0x8c, 0xf6, 0x2b, 0x14, 0xcc, 0x47, 0xe5, 0xa1,
+ 0xd2, 0xf9, 0xf7, 0xd9, 0x78, 0xc9, 0x38, 0x9a, 0xcc, 0xdb, 0x67, 0x25, 0xe2,
+ 0x39, 0xab, 0x8f, 0x15, 0xc4, 0xdc, 0x51, 0xbe, 0x1f, 0xa2, 0x4c, 0x9d,
+ ]
+ ),
+ test_case!(
+ [
+ 0xa5, 0x28, 0x18, 0xd8, 0x0b, 0xab, 0x0f, 0x50, 0x1e, 0x64, 0x5b, 0x32, 0x27,
+ 0x2c, 0x86, 0xc3, 0xdd, 0x73, 0x9a, 0x50, 0x9b, 0x88, 0x90, 0x37, 0xff, 0x70,
+ 0xa0, 0x8a, 0x8e, 0x96, 0x9e, 0xd6, 0x02, 0xf4, 0xfd, 0x37, 0xf9, 0x76, 0x92,
+ 0x88, 0x71, 0x30, 0x64, 0x41, 0x73, 0xe7, 0x53, 0x3e, 0x15, 0x84, 0xa9, 0xc5,
+ 0x23, 0xdb, 0x68, 0xf8, 0x14, 0xa4, 0xae, 0x02, 0xff, 0x98, 0xd3, 0x9e, 0xde,
+ 0xdc, 0x8c, 0xa3, 0x95, 0x62, 0xa8, 0xed, 0x1e, 0xad, 0x0f, 0x96, 0xcf, 0x7c,
+ 0x73, 0x29, 0x50, 0x02, 0x53, 0xb4, 0x8d, 0x06, 0xbc, 0x38, 0x20, 0x05,
+ ],
+ [
+ 0x3e, 0xec, 0x10, 0x1f, 0x47, 0x63, 0xc4, 0x3f, 0xbd, 0xaf, 0x3d, 0x41, 0xea,
+ 0x97, 0x57, 0x81, 0x6a, 0x7b, 0x20, 0xb5,
+ ],
+ [
+ 0x89, 0x6d, 0x0e, 0x73, 0x64, 0xd3, 0xeb, 0xbc, 0xa0, 0x0d, 0x11, 0x57, 0xd3,
+ 0x3f, 0x5e, 0x3e, 0x83, 0xa1, 0xd7, 0x87, 0x63, 0x39, 0x3e, 0x08, 0x37, 0x8a,
+ 0xb6, 0x8a, 0x6e, 0x6a, 0x77, 0xce,
+ ],
+ [
+ 0x0b, 0x84, 0x2b, 0xca, 0xa0, 0x9f, 0xff, 0xef, 0x99, 0x96, 0x68, 0x40, 0x78,
+ 0x1e, 0xcd, 0xc1, 0xf3, 0x27, 0x11, 0xfa, 0x66, 0x81, 0x46, 0x43, 0x42, 0x3f,
+ 0x06, 0x11, 0xa7, 0xf6, 0xf4, 0x5c, 0x9d, 0xbf, 0xc6, 0x5e, 0x0e, 0x3e, 0x1b,
+ 0x36, 0x4b, 0x03, 0xb4, 0x70, 0x7d, 0x2d, 0x0f, 0xf6,
+ ],
+ [
+ 0x95, 0x9b, 0x3d, 0x64, 0xc5, 0x32, 0x58, 0xb3, 0xda, 0x57, 0xa4, 0x8f, 0x5c,
+ 0xda, 0xae, 0x64, 0x6e, 0x98, 0xb0, 0x0b, 0x69, 0x14, 0x34, 0xed, 0xab, 0x4e,
+ 0xd6, 0x15, 0x4e, 0x99, 0x94, 0x0e, 0xcc, 0x75, 0x1c, 0xaf, 0xb0, 0x92, 0x36,
+ 0x82, 0x3b, 0x7c, 0xd2, 0xee, 0xca, 0xe3, 0x8a, 0x7d, 0xc9, 0x31, 0x67, 0x5b,
+ 0xd2, 0x92, 0xbc, 0xdd, 0xf3, 0x1b, 0x57, 0xef, 0xcd, 0xf4, 0xc7, 0xf7,
+ ]
+ ),
+ test_case!(
+ [
+ 0xbe, 0xc0, 0xc0, 0xce, 0x37, 0xb7, 0xe0, 0x04, 0x1e, 0x2e, 0xca, 0x66, 0x45,
+ 0xc6, 0x77, 0x04, 0x73, 0x4a, 0xf8, 0x58, 0x73, 0xa5, 0x56, 0x2b, 0x9a, 0x3a,
+ 0xcb, 0x39, 0xed, 0x1c, 0x66, 0xbf, 0x33, 0x5d, 0x72, 0x12, 0xb5, 0x93, 0x40,
+ 0xb9, 0xca, 0x1c, 0x08, 0x4f, 0x6e, 0x92, 0xbd, 0xdd, 0xc8, 0xcd, 0xaf, 0x50,
+ 0xe9, 0x9f, 0x73, 0x09, 0x36, 0x38, 0x71, 0xb7, 0x77, 0xa4, 0x92, 0x66, 0x86,
+ 0x08, 0x1a, 0xcc, 0xf5, 0x8d, 0xf1, 0x8c, 0xbe, 0x6b, 0x01, 0x12, 0xd8, 0x2b,
+ 0xf0, 0x1e, 0x75, 0xe2, 0xe3, 0x15, 0xb3, 0x1a, 0xfb, 0xd2, 0xe4, 0x5f, 0x2c,
+ ],
+ [
+ 0x9f, 0x36, 0xfa, 0x6a, 0x1e, 0x0e, 0xfa, 0x50, 0x64, 0xff, 0x56, 0x66, 0xe8,
+ 0xce, 0xd5, 0x59, 0x2d, 0x9d, 0xc3, 0x90,
+ ],
+ [
+ 0xf1, 0xd7, 0x2b, 0x13, 0x99, 0xe1, 0x05, 0xdc, 0x4f, 0xc3, 0xab, 0xf6, 0xa7,
+ 0x1f, 0x62, 0x38, 0x0e, 0xac, 0x31, 0xe3, 0x3b, 0x10, 0x65, 0x14, 0xbc, 0x28,
+ 0xdb, 0x03, 0x2c, 0xc6, 0x9e, 0xd5,
+ ],
+ [
+ 0xb1, 0x03, 0xf9, 0x6a, 0x68, 0x5b, 0xdb, 0x31, 0xbd, 0xf8, 0x75, 0xc5, 0x60,
+ 0x98, 0x05, 0x0a, 0xd3, 0x67, 0xc2, 0xc1, 0xd2, 0xcf, 0x89, 0x94, 0x6e, 0x27,
+ 0x78, 0xc1, 0x86, 0xf7, 0xfe, 0xb1, 0xd5, 0x5b, 0xb2, 0x19, 0x85, 0x91, 0x98,
+ 0x32, 0x05, 0xf1, 0x1a, 0x3b, 0x73, 0xef, 0x41, 0x07,
+ ],
+ [
+ 0x5d, 0x83, 0xc3, 0xc9, 0xa2, 0x00, 0xa5, 0xc9, 0x1d, 0x50, 0x4d, 0x18, 0x61,
+ 0xcd, 0x7e, 0xe5, 0xff, 0x18, 0x23, 0x30, 0xf1, 0x21, 0x07, 0xe9, 0x1b, 0x39,
+ 0x92, 0xe2, 0x89, 0x09, 0x82, 0x58, 0x94, 0x77, 0x42, 0xc7, 0xcb, 0x0d, 0xbd,
+ 0xa9, 0x74, 0xc6, 0xda, 0x37, 0xc3, 0x1f, 0x94, 0x55, 0x6e, 0xb4, 0x55, 0xe9,
+ 0x08, 0x75, 0x72, 0xe9, 0x23, 0x93, 0x17, 0xcd, 0x0b, 0x0e, 0xdd, 0x31,
+ ]
+ ),
+ test_case!(
+ [
+ 0x43, 0xe9, 0x04, 0x00, 0x8a, 0x82, 0x9b, 0x5d, 0x3b, 0xe6, 0x0d, 0x86, 0x6e,
+ 0x0a, 0x66, 0x28, 0xee, 0xed, 0xc2, 0xf3, 0x1c, 0x7b, 0xc2, 0x52, 0x6f, 0x63,
+ 0xb8, 0x0c, 0xa4, 0xed, 0xbb, 0xa2, 0x6b, 0x54, 0xf1, 0xdb, 0xb9, 0x1f, 0x8e,
+ 0x69, 0x8f, 0xb0, 0x35, 0x68, 0xed, 0xdd, 0x71, 0x6f, 0x90, 0x1a, 0x47, 0x9f,
+ 0x59, 0xb2, 0xda, 0xf2, 0x68, 0x3d, 0xa2, 0xa6, 0xe3, 0x34, 0x2b, 0x10, 0x0c,
+ 0x76, 0xe0, 0x86, 0x4f, 0x14, 0xa1, 0xcd, 0xc5, 0xa5, 0x7e, 0x36, 0xb4, 0xa5,
+ 0x12, 0x01, 0xb1, 0x9e, 0xbb, 0x78, 0x0c, 0x9a, 0x4e, 0x02, 0xc4, 0x54, 0x22,
+ 0x99,
+ ],
+ [
+ 0x21, 0xd0, 0xf2, 0xcd, 0x12, 0xcc, 0x7d, 0x73, 0xd4, 0x29, 0x7a, 0x29, 0xbc,
+ 0xdf, 0xfd, 0x39, 0xc6, 0x39, 0x4b, 0x36,
+ ],
+ [
+ 0x1d, 0x28, 0xb5, 0x20, 0xfa, 0xb1, 0xc0, 0xae, 0x6f, 0xcf, 0x8f, 0xd0, 0xe1,
+ 0xa9, 0xdc, 0x5b, 0x59, 0xae, 0x47, 0xf3, 0xff, 0xa2, 0x2b, 0xdf, 0xb0, 0x68,
+ 0x91, 0xde, 0xf3, 0x05, 0x1b, 0xf4,
+ ],
+ [
+ 0x43, 0x11, 0xfb, 0xf9, 0xf2, 0x79, 0x96, 0x74, 0xc5, 0x5c, 0xd9, 0xc1, 0xa1,
+ 0xbb, 0x51, 0x21, 0x5f, 0x89, 0xac, 0xc8, 0xaf, 0x83, 0x85, 0x53, 0x13, 0xa7,
+ 0x67, 0x3f, 0x09, 0x67, 0x33, 0x15, 0xab, 0xf1, 0xfd, 0x67, 0x5d, 0x0b, 0x6b,
+ 0x20, 0x8d, 0x59, 0x2c, 0x61, 0xa4, 0x29, 0x8a, 0x33,
+ ],
+ [
+ 0x62, 0xc7, 0x01, 0xa7, 0xdb, 0x46, 0xdf, 0x1c, 0x04, 0xd0, 0x11, 0x71, 0xab,
+ 0x08, 0x13, 0x01, 0x61, 0x24, 0x44, 0x8b, 0xda, 0xc2, 0xc1, 0x90, 0x9f, 0x1c,
+ 0xdf, 0x76, 0xa3, 0x4f, 0x27, 0x83, 0x26, 0x3b, 0x9d, 0xda, 0x20, 0x56, 0x83,
+ 0x31, 0x47, 0x6d, 0x33, 0xf2, 0x44, 0xe0, 0x1c, 0x5c, 0xce, 0x55, 0x99, 0xd3,
+ 0x6b, 0xd0, 0x1b, 0x31, 0xb0, 0x14, 0x1d, 0xf2, 0xfa, 0xa8, 0x01, 0xfa,
+ ]
+ ),
+ test_case!(
+ [
+ 0x73, 0x32, 0xc6, 0x58, 0x9e, 0xa1, 0x1f, 0x59, 0xe4, 0x61, 0xd1, 0x7a, 0xa7,
+ 0xbd, 0xf4, 0x15, 0xd1, 0x1c, 0xae, 0x71, 0xd2, 0x0c, 0x14, 0x15, 0xb3, 0x7d,
+ 0xe6, 0x03, 0x12, 0xb4, 0x2f, 0xec, 0x6a, 0xcf, 0x9c, 0x79, 0x18, 0xe8, 0xf3,
+ 0x85, 0x4c, 0x47, 0xfd, 0x02, 0xba, 0x77, 0x86, 0x81, 0x55, 0x03, 0x40, 0x6d,
+ 0x8e, 0x2c, 0x3c, 0x1c, 0x7f, 0x96, 0x9e, 0x5b, 0x6b, 0x39, 0x53, 0xcc, 0x5b,
+ 0xd9, 0x38, 0x47, 0xc8, 0xf3, 0xae, 0xef, 0x21, 0x22, 0x82, 0x1c, 0x12, 0x3d,
+ 0x49, 0xd1, 0x80, 0x1c, 0x8a, 0x26, 0x65, 0x8b, 0xd0, 0x1a, 0xcf, 0x0d, 0xf2,
+ 0x78, 0x55,
+ ],
+ [
+ 0x10, 0x17, 0x15, 0x4a, 0xf9, 0xee, 0xae, 0xc1, 0xc6, 0x0d, 0x3b, 0x10, 0xd1,
+ 0x47, 0xf7, 0xf1, 0x4b, 0xf4, 0x25, 0x3f,
+ ],
+ [
+ 0x4b, 0x59, 0x21, 0x3d, 0x09, 0xe8, 0x45, 0x2c, 0x9d, 0x66, 0xaf, 0x56, 0xc2,
+ 0x4a, 0x38, 0x02, 0xf1, 0xf9, 0x37, 0xc7, 0x45, 0xe9, 0x60, 0xe0, 0x1e, 0x2e,
+ 0xfc, 0x50, 0x0f, 0x83, 0x8b, 0x22,
+ ],
+ [
+ 0x0a, 0xc3, 0xe0, 0xb3, 0xb2, 0x3a, 0xf8, 0x05, 0xa3, 0xdf, 0x8c, 0x1d, 0x9c,
+ 0xa3, 0xd8, 0xd2, 0xe5, 0xb2, 0x18, 0x52, 0xe0, 0xd8, 0x77, 0x36, 0xa6, 0x0e,
+ 0x90, 0x38, 0x08, 0x27, 0xcf, 0xb9, 0xf3, 0x15, 0xd6, 0xf9, 0x73, 0x5a, 0xa8,
+ 0x52, 0xd8, 0x4a, 0xf5, 0xd6, 0x1c, 0x36, 0x56, 0x3f,
+ ],
+ [
+ 0xc1, 0x38, 0x0f, 0x19, 0xdc, 0xae, 0x59, 0x02, 0x85, 0xca, 0xe2, 0x3d, 0xf3,
+ 0xf1, 0x52, 0xa3, 0x7d, 0xfd, 0xe1, 0x19, 0x19, 0x01, 0x8f, 0x93, 0x30, 0x49,
+ 0xf3, 0x20, 0x27, 0xb3, 0x34, 0x27, 0x66, 0x8e, 0xfa, 0x19, 0xd9, 0xa1, 0xf4,
+ 0x8e, 0x83, 0x1d, 0x81, 0x93, 0x57, 0x32, 0x82, 0x2d, 0x4d, 0xfb, 0xf4, 0xbe,
+ 0x64, 0x2e, 0x70, 0x0f, 0xfd, 0x49, 0x5b, 0xce, 0xa9, 0xc2, 0x87, 0xbb,
+ ]
+ ),
+ test_case!(
+ [
+ 0x8d, 0x29, 0x27, 0x28, 0x29, 0x61, 0xb0, 0xc9, 0xab, 0x3e, 0x06, 0x13, 0x1b,
+ 0x26, 0xac, 0x3e, 0xde, 0x6f, 0x45, 0x55, 0xf2, 0x22, 0x9d, 0xf8, 0x65, 0x1c,
+ 0x2e, 0xfc, 0x7e, 0x68, 0x46, 0xf4, 0x7b, 0x07, 0xb1, 0xc6, 0xc2, 0x29, 0xdc,
+ 0x04, 0xdd, 0x5d, 0xff, 0x47, 0x95, 0x10, 0x59, 0xab, 0x16, 0x86, 0x3b, 0x45,
+ 0x5b, 0x7b, 0x54, 0x7f, 0xc0, 0x0d, 0x8a, 0xe9, 0x0a, 0xb8, 0xc9, 0x93, 0xda,
+ 0xb8, 0x51, 0xb8, 0xbe, 0xb9, 0xf4, 0x8b, 0xee, 0x74, 0x26, 0xac, 0x4c, 0xbb,
+ 0xb3, 0xfd, 0x71, 0xf6, 0x9f, 0xff, 0xac, 0x13, 0x7e, 0x4d, 0xa1, 0xa7, 0x64,
+ 0x66, 0xd9, 0x2c,
+ ],
+ [
+ 0xf6, 0x43, 0x95, 0xf1, 0x92, 0xc2, 0xd5, 0xae, 0xe3, 0x2c, 0x54, 0xb3, 0x12,
+ 0xe9, 0x54, 0x28, 0xf6, 0x81, 0x5a, 0xc4,
+ ],
+ [
+ 0x47, 0xf6, 0x91, 0xf4, 0xd2, 0x11, 0x2f, 0xb6, 0xc4, 0xba, 0xf8, 0xce, 0xf2,
+ 0xff, 0x98, 0x67, 0xfa, 0xb7, 0x41, 0xbe, 0xe5, 0x55, 0xec, 0xae, 0x34, 0x70,
+ 0xd6, 0x11, 0xba, 0x21, 0xe7, 0x24,
+ ],
+ [
+ 0xa6, 0xaa, 0xd9, 0x37, 0x0a, 0x08, 0xe4, 0xde, 0x3b, 0x00, 0x8f, 0xeb, 0x98,
+ 0x51, 0x95, 0x99, 0xe0, 0x35, 0x5d, 0x0f, 0x2d, 0xee, 0x49, 0x4a, 0x59, 0x9d,
+ 0xe9, 0xef, 0xeb, 0xfd, 0x76, 0xcb, 0x7a, 0xec, 0x77, 0xa6, 0x70, 0x87, 0xc5,
+ 0xec, 0x44, 0x57, 0x79, 0xc3, 0xa2, 0xce, 0xc1, 0x18,
+ ],
+ [
+ 0xa4, 0xd0, 0x67, 0x30, 0x6c, 0x32, 0xde, 0xbe, 0x21, 0x8c, 0xb6, 0x01, 0x3b,
+ 0xe8, 0xa0, 0xc5, 0xa7, 0xff, 0xf6, 0xcd, 0x35, 0x79, 0x95, 0x2e, 0xc6, 0xda,
+ 0x9b, 0x70, 0x80, 0x1e, 0x07, 0xdb, 0x13, 0x28, 0x93, 0x0e, 0xa0, 0x26, 0x3c,
+ 0x7e, 0x86, 0x6b, 0x45, 0xb9, 0x38, 0x99, 0xd8, 0x38, 0x54, 0xc9, 0x5e, 0x35,
+ 0x47, 0xc0, 0xc0, 0x44, 0x46, 0x94, 0xf9, 0x3b, 0xf4, 0xbe, 0xe1, 0x89,
+ ]
+ ),
+ test_case!(
+ [
+ 0x4f, 0xd4, 0x06, 0x82, 0x8c, 0xe3, 0x8c, 0x86, 0x93, 0x63, 0x24, 0x0e, 0xac,
+ 0xa1, 0xe0, 0xb3, 0xf1, 0x5f, 0x10, 0xa5, 0x30, 0x51, 0xed, 0xfe, 0xed, 0x66,
+ 0x07, 0x71, 0x8f, 0x18, 0x0c, 0x8b, 0x53, 0xc1, 0x5e, 0xec, 0xd2, 0xa0, 0x32,
+ 0x1b, 0x5e, 0xb6, 0x9b, 0x06, 0xd3, 0xf4, 0x7f, 0xf3, 0xcd, 0xc4, 0x1f, 0x39,
+ 0x4c, 0x2b, 0xf1, 0xfc, 0x00, 0x0b, 0xf1, 0x65, 0x0e, 0x81, 0x41, 0x08, 0x9a,
+ 0x57, 0xa4, 0x93, 0x33, 0x1e, 0xac, 0x42, 0x14, 0xe3, 0xc9, 0x2e, 0x84, 0x7a,
+ 0xaa, 0x2e, 0x5d, 0x24, 0x62, 0xd6, 0x42, 0xd5, 0x72, 0xb7, 0x75, 0xe5, 0x90,
+ 0xc5, 0x3a, 0x43, 0xb7,
+ ],
+ [
+ 0x02, 0x23, 0xd7, 0x82, 0xd3, 0xbc, 0x1a, 0x71, 0x64, 0x73, 0xb6, 0x0c, 0xba,
+ 0x06, 0x42, 0x38, 0x41, 0x89, 0xb4, 0x87,
+ ],
+ [
+ 0xd5, 0x62, 0xb6, 0x1c, 0xc5, 0xaa, 0x4d, 0xd6, 0x82, 0xb8, 0x9f, 0xd4, 0xa4,
+ 0x21, 0xdd, 0x98, 0xdc, 0x04, 0x2e, 0x64, 0xb1, 0x05, 0xe3, 0xfd, 0x4f, 0xa0,
+ 0x8e, 0x0c, 0x30, 0x2e, 0x45, 0xe2,
+ ],
+ [
+ 0x46, 0xb2, 0x59, 0x57, 0x65, 0xff, 0x15, 0xaf, 0xf3, 0x6f, 0xc6, 0xc5, 0x5f,
+ 0x6c, 0x8a, 0xbc, 0xc8, 0xbe, 0x73, 0x4b, 0xab, 0x22, 0xff, 0x07, 0xb4, 0x84,
+ 0x0e, 0x94, 0x5c, 0x99, 0x37, 0xa0, 0xa6, 0xdc, 0x6e, 0xef, 0xb6, 0x11, 0xf4,
+ 0x57, 0x38, 0x0e, 0xeb, 0x6a, 0x75, 0x62, 0xdd, 0x36,
+ ],
+ [
+ 0x35, 0x70, 0x74, 0xd9, 0x81, 0xb9, 0xaa, 0x7d, 0x1d, 0xb3, 0x59, 0x5f, 0x24,
+ 0x2c, 0xe5, 0xb8, 0xe3, 0xf1, 0x3c, 0x28, 0x2f, 0x00, 0x3c, 0xcc, 0x31, 0x8e,
+ 0x0f, 0x7e, 0xc9, 0xf0, 0xf4, 0x33, 0x74, 0xc4, 0x9d, 0x8f, 0xa5, 0x9a, 0x57,
+ 0xae, 0x9b, 0xb5, 0xc9, 0x60, 0x87, 0xdd, 0xb8, 0x4b, 0x75, 0xb9, 0x43, 0xd0,
+ 0x72, 0x68, 0xd3, 0xf9, 0x82, 0x23, 0xba, 0x8d, 0xf6, 0xc3, 0x05, 0x3a,
+ ]
+ ),
+ test_case!(
+ [
+ 0x32, 0xac, 0x0f, 0x42, 0x50, 0x87, 0xb6, 0x4d, 0x46, 0x68, 0xfc, 0xe9, 0x04,
+ 0x51, 0xe7, 0x72, 0x6b, 0x63, 0x33, 0x37, 0x7c, 0x0c, 0xd1, 0xd2, 0x93, 0x8a,
+ 0x11, 0xab, 0x96, 0x98, 0xbe, 0x7d, 0xd4, 0x22, 0xb1, 0x69, 0xd3, 0x1b, 0x3f,
+ 0x17, 0x3a, 0x7f, 0x96, 0x71, 0x82, 0xe4, 0x71, 0xd2, 0x36, 0x04, 0x8d, 0xc1,
+ 0x27, 0xb2, 0xbb, 0x80, 0xb7, 0xf2, 0x82, 0xfe, 0x9e, 0xa3, 0x9b, 0xc9, 0xda,
+ 0xa5, 0x61, 0x40, 0x1e, 0xdc, 0xd2, 0x3f, 0x17, 0xb2, 0x4a, 0xa2, 0x86, 0x5b,
+ 0x1e, 0x6f, 0xfa, 0x2f, 0x80, 0x9c, 0xe0, 0xc1, 0x3f, 0x00, 0x36, 0xbd, 0x3b,
+ 0x01, 0xf4, 0xe6, 0x7e, 0x74,
+ ],
+ [
+ 0x84, 0x27, 0xdf, 0xa6, 0x8c, 0x10, 0xdd, 0x14, 0x8b, 0x90, 0xb2, 0x74, 0xbc,
+ 0x54, 0xee, 0x7b, 0x93, 0x06, 0xda, 0x0b,
+ ],
+ [
+ 0xeb, 0x4f, 0x8d, 0x22, 0xdb, 0x7d, 0x47, 0xd7, 0x8c, 0x8d, 0xfc, 0x4a, 0x74,
+ 0x62, 0xcc, 0x95, 0xb3, 0x04, 0xfa, 0x51, 0x08, 0xfa, 0x54, 0x34, 0xcb, 0x6c,
+ 0x87, 0xe5, 0x58, 0x8b, 0xcc, 0x7f,
+ ],
+ [
+ 0x70, 0x1d, 0x91, 0x59, 0xbc, 0xd6, 0xdd, 0xa7, 0xc5, 0xd6, 0xc4, 0x1d, 0xeb,
+ 0x4b, 0xd9, 0x5d, 0xc9, 0x62, 0xb2, 0x7b, 0x2b, 0xce, 0xd2, 0x7f, 0x3a, 0x4c,
+ 0x0a, 0xd9, 0x7a, 0x90, 0xef, 0x9b, 0x80, 0x89, 0xd2, 0xed, 0x0d, 0x37, 0xbd,
+ 0x3e, 0x26, 0x1d, 0x10, 0x87, 0xac, 0x72, 0xaa, 0x2b,
+ ],
+ [
+ 0x3d, 0x7e, 0xc4, 0x53, 0xd4, 0x22, 0xcd, 0xcb, 0x43, 0xd6, 0x1f, 0xce, 0xab,
+ 0xbd, 0x40, 0xbf, 0x90, 0x69, 0xa3, 0x26, 0x72, 0x3f, 0xdb, 0xb3, 0x94, 0x4d,
+ 0x0f, 0x21, 0x20, 0xd2, 0x28, 0x35, 0x94, 0x69, 0xf0, 0xac, 0xba, 0xd2, 0xb6,
+ 0xb0, 0xeb, 0x34, 0x8f, 0x5e, 0x80, 0x0d, 0xf8, 0x71, 0x03, 0x0d, 0x3b, 0x42,
+ 0xac, 0x66, 0x2e, 0xc6, 0xac, 0x5a, 0x6c, 0xc1, 0x0c, 0x3f, 0x07, 0xb7,
+ ]
+ ),
+ test_case!(
+ [
+ 0xdf, 0xcd, 0x4f, 0x4c, 0x0b, 0x6a, 0x78, 0x2b, 0xe5, 0xda, 0x7d, 0x9e, 0x79,
+ 0xeb, 0x73, 0x7c, 0x4c, 0x84, 0xae, 0xf1, 0x5e, 0x90, 0xd1, 0xd1, 0xa6, 0x6a,
+ 0x3b, 0xc0, 0x43, 0x77, 0x64, 0x6c, 0x25, 0xd7, 0x04, 0x71, 0xc6, 0xf0, 0x89,
+ 0xbf, 0x22, 0x7b, 0xa6, 0x3e, 0x37, 0xad, 0xd5, 0xc6, 0xd1, 0xb4, 0xf3, 0x75,
+ 0x44, 0xda, 0xa7, 0xf4, 0x90, 0xea, 0xc2, 0xf6, 0x5c, 0x24, 0xab, 0xa0, 0xed,
+ 0x08, 0xe4, 0xf7, 0x9b, 0xb1, 0xc8, 0x8d, 0x9d, 0x81, 0x2d, 0x90, 0x57, 0x89,
+ 0x74, 0x4c, 0x66, 0xbd, 0x8e, 0xd2, 0x99, 0x2a, 0x11, 0x2a, 0x6e, 0xf6, 0x12,
+ 0x2f, 0xf3, 0x75, 0xee, 0x48, 0xd3,
+ ],
+ [
+ 0xf9, 0x60, 0xa4, 0x5e, 0xc2, 0x4a, 0xfc, 0xee, 0xd5, 0x91, 0xf8, 0x83, 0x0c,
+ 0x99, 0xa8, 0x5d, 0xd6, 0x08, 0x10, 0xd3,
+ ],
+ [
+ 0xe7, 0xbf, 0xf6, 0xb7, 0xd9, 0x6d, 0x92, 0x7d, 0x20, 0xa7, 0x15, 0x4e, 0x60,
+ 0x68, 0x22, 0x4f, 0x9f, 0x9a, 0x87, 0x0e, 0x72, 0x0c, 0x9a, 0x7e, 0x19, 0xda,
+ 0x6f, 0x80, 0x86, 0x09, 0x14, 0x19,
+ ],
+ [
+ 0x5c, 0x9c, 0xed, 0xdd, 0x66, 0xa7, 0x10, 0x8a, 0x9d, 0x5c, 0x7d, 0x84, 0xbb,
+ 0x69, 0x12, 0x23, 0xb1, 0xbf, 0xd0, 0x13, 0xa8, 0xc8, 0x97, 0x12, 0x3b, 0x73,
+ 0xeb, 0x82, 0xea, 0xd1, 0x06, 0xb3, 0xb7, 0x62, 0xc4, 0xc4, 0x5e, 0xd4, 0xcb,
+ 0xd2, 0x07, 0x61, 0x8f, 0xbf, 0x8d, 0x69, 0x35, 0xf8,
+ ],
+ [
+ 0x52, 0x40, 0xa2, 0xf5, 0xa2, 0x90, 0x47, 0xc7, 0xaa, 0x86, 0x80, 0x2b, 0x84,
+ 0x29, 0x99, 0x33, 0x96, 0x7c, 0xf8, 0xc7, 0xef, 0xe3, 0x4d, 0x89, 0x57, 0xd7,
+ 0xe7, 0xc9, 0xd7, 0xe1, 0x7d, 0xbc, 0x71, 0xb6, 0x13, 0x1b, 0x50, 0x3a, 0x2a,
+ 0x0a, 0xcf, 0x60, 0x02, 0x34, 0x62, 0xdf, 0x22, 0xe1, 0x1a, 0xd9, 0xa5, 0x8d,
+ 0x7d, 0xa6, 0xea, 0xb9, 0x0e, 0x38, 0xa6, 0xdc, 0xe0, 0x9e, 0x82, 0xb4,
+ ]
+ ),
+ test_case!(
+ [
+ 0xcb, 0x50, 0x7c, 0x8b, 0x3c, 0x2d, 0x89, 0xbb, 0x93, 0xf3, 0xe6, 0xee, 0xd4,
+ 0x53, 0x13, 0xa1, 0xeb, 0xb6, 0x3f, 0x76, 0x01, 0x90, 0xda, 0x57, 0x32, 0x73,
+ 0xa3, 0x12, 0x0a, 0xd4, 0x09, 0x6e, 0x14, 0xd7, 0x7d, 0xb4, 0xfe, 0xc4, 0x09,
+ 0x9d, 0x06, 0x9d, 0xe9, 0xb8, 0xf8, 0xce, 0x12, 0xe6, 0xf2, 0x5d, 0x36, 0x1d,
+ 0x3d, 0xf3, 0x4b, 0x74, 0x7e, 0xfa, 0xbf, 0x41, 0x41, 0xa6, 0x82, 0xf2, 0x21,
+ 0x25, 0x99, 0xf8, 0x03, 0xaa, 0x4d, 0x3d, 0x08, 0x61, 0x5c, 0xb8, 0x40, 0x6c,
+ 0xc8, 0xda, 0x53, 0x69, 0xe4, 0xb3, 0xbb, 0x7c, 0x30, 0x41, 0x16, 0x87, 0xee,
+ 0x55, 0x7d, 0xe3, 0xfc, 0x4e, 0x8e, 0x7f,
+ ],
+ [
+ 0xdf, 0xfe, 0x3c, 0x28, 0x51, 0xd1, 0x81, 0x34, 0x7d, 0x83, 0x22, 0x65, 0xfb,
+ 0xbb, 0x75, 0x70, 0x36, 0x63, 0x2e, 0xb4,
+ ],
+ [
+ 0x2c, 0x68, 0x29, 0x0f, 0x2e, 0xe7, 0xe0, 0x95, 0x4e, 0x0a, 0xbf, 0x48, 0x05,
+ 0x9c, 0xd4, 0x99, 0x68, 0xdf, 0x1f, 0x5f, 0x08, 0xb4, 0xa8, 0x3b, 0x44, 0xf3,
+ 0x24, 0xfd, 0x86, 0x08, 0xa9, 0x1b,
+ ],
+ [
+ 0xe2, 0x21, 0xb1, 0x6d, 0xfc, 0x5a, 0x4d, 0xd2, 0xac, 0xa0, 0xcf, 0xae, 0xc6,
+ 0x6a, 0x88, 0xcd, 0xe5, 0x27, 0x14, 0xa7, 0xed, 0x3b, 0x8a, 0x12, 0x2a, 0xa9,
+ 0x21, 0xec, 0x71, 0x28, 0xc9, 0xf0, 0x24, 0xe8, 0xc2, 0x43, 0x90, 0xb1, 0xbc,
+ 0xd8, 0xd4, 0x0c, 0xdd, 0x15, 0x6f, 0xab, 0x1c, 0x99,
+ ],
+ [
+ 0x6f, 0xac, 0x6c, 0xc0, 0x70, 0xe7, 0x48, 0x9a, 0xd9, 0x37, 0xec, 0x29, 0xb9,
+ 0xe0, 0x56, 0x45, 0x5f, 0xe0, 0xf9, 0xfc, 0x1d, 0x13, 0x24, 0xd2, 0xca, 0x85,
+ 0x4f, 0x3e, 0x47, 0x4c, 0xd8, 0x0d, 0x22, 0x56, 0x5d, 0xea, 0x9e, 0xf2, 0x6c,
+ 0xc3, 0x9a, 0x41, 0x9e, 0xf7, 0xbe, 0x7a, 0x20, 0x45, 0x51, 0x00, 0x6d, 0x76,
+ 0x2a, 0x80, 0x96, 0x00, 0xb6, 0xe8, 0x41, 0xfa, 0xcc, 0xe1, 0x72, 0xb5,
+ ]
+ ),
+ test_case!(
+ [
+ 0x17, 0x3e, 0x54, 0xa8, 0x59, 0x6f, 0xad, 0x91, 0xd0, 0x43, 0x82, 0x36, 0xd4,
+ 0x21, 0xd1, 0x6c, 0x90, 0x12, 0x57, 0x86, 0xf2, 0x5d, 0x6c, 0x56, 0x05, 0xf6,
+ 0x88, 0xf6, 0x8a, 0xe1, 0x59, 0x4f, 0x16, 0x6d, 0xb0, 0xdb, 0x01, 0xbd, 0x61,
+ 0x75, 0x86, 0x49, 0xc1, 0x85, 0xa1, 0xcb, 0xb0, 0x3a, 0x55, 0xa3, 0x6f, 0xb9,
+ 0x86, 0xf4, 0xd8, 0xaf, 0xc9, 0x98, 0xf0, 0x25, 0x5b, 0xc1, 0x78, 0x58, 0x18,
+ 0x42, 0xae, 0x1d, 0xd2, 0x75, 0xac, 0xe9, 0x15, 0x5f, 0x4e, 0x68, 0xe4, 0x58,
+ 0x22, 0x66, 0x42, 0x68, 0x98, 0xaa, 0x04, 0xa3, 0x89, 0x24, 0xbd, 0xdd, 0x06,
+ 0xa9, 0x8c, 0x06, 0x74, 0xe4, 0x32, 0x74, 0xf1,
+ ],
+ [
+ 0x9e, 0x1f, 0x91, 0xda, 0x68, 0x85, 0xf7, 0xa1, 0x18, 0x88, 0x66, 0x71, 0x0d,
+ 0xfd, 0x87, 0xd7, 0x22, 0xc2, 0xf0, 0x58,
+ ],
+ [
+ 0x6f, 0x06, 0x6d, 0xd5, 0xe8, 0x07, 0xbd, 0x8e, 0xfa, 0xb0, 0x1a, 0x2e, 0xce,
+ 0x00, 0x30, 0x52, 0x62, 0xf6, 0xc8, 0xab, 0xfc, 0xdb, 0xd8, 0xae, 0xb4, 0x95,
+ 0x15, 0x9f, 0x87, 0xf8, 0x5b, 0x92,
+ ],
+ [
+ 0x79, 0x99, 0x0a, 0x40, 0x88, 0xe5, 0x88, 0xe6, 0x94, 0x58, 0x76, 0xe4, 0x08,
+ 0x6e, 0x12, 0x20, 0xe5, 0x23, 0xf3, 0x43, 0xa8, 0x12, 0xee, 0xf0, 0xa1, 0x2e,
+ 0xc4, 0xc7, 0x0e, 0xf3, 0x05, 0xbf, 0x16, 0xac, 0xf7, 0x41, 0x52, 0xa9, 0x94,
+ 0x4c, 0xac, 0x68, 0xcb, 0x42, 0x6d, 0x81, 0x3a, 0xdf,
+ ],
+ [
+ 0xe5, 0xf4, 0x45, 0xba, 0xaa, 0x0e, 0x51, 0x2f, 0x3d, 0x1f, 0x9b, 0x23, 0x5b,
+ 0x7c, 0xb3, 0xf2, 0x20, 0x1e, 0x70, 0x2a, 0x30, 0x7c, 0x14, 0x1a, 0x26, 0x07,
+ 0x7f, 0x8d, 0xed, 0x4c, 0x9a, 0x7b, 0xbd, 0x3d, 0x96, 0x8e, 0x86, 0x99, 0xec,
+ 0xac, 0x70, 0xf1, 0x38, 0xef, 0xb3, 0x37, 0x8f, 0x20, 0xf9, 0x78, 0x4b, 0xcf,
+ 0xef, 0x4e, 0x67, 0x03, 0x96, 0x3d, 0x50, 0x39, 0x15, 0xa5, 0xc5, 0x43,
+ ]
+ ),
+ test_case!(
+ [
+ 0x95, 0x16, 0x49, 0xb0, 0x8b, 0x66, 0xb9, 0xdf, 0x54, 0x27, 0xec, 0x3f, 0xa1,
+ 0xcb, 0xf5, 0x74, 0x13, 0x7d, 0x85, 0xcc, 0xc4, 0xab, 0xea, 0x3c, 0xad, 0x93,
+ 0x66, 0xe6, 0xe3, 0xf4, 0x6b, 0x70, 0x13, 0xa6, 0xed, 0xdb, 0xd3, 0xdb, 0x6d,
+ 0x1a, 0x7b, 0xbc, 0x3f, 0x93, 0xe7, 0xd3, 0xbc, 0xb3, 0x2e, 0xa8, 0xb5, 0x26,
+ 0xdd, 0xd4, 0x8a, 0x01, 0x11, 0x02, 0xfe, 0x39, 0xf3, 0x44, 0xc6, 0xe9, 0x01,
+ 0xf2, 0x19, 0x73, 0x57, 0x29, 0x84, 0x50, 0x4b, 0x63, 0x18, 0xcd, 0xf8, 0xfe,
+ 0x24, 0xbd, 0x40, 0x9f, 0x9f, 0xad, 0x29, 0x23, 0xd9, 0x9d, 0xb1, 0x38, 0x19,
+ 0x68, 0x1b, 0x56, 0x5f, 0xb0, 0xe7, 0x00, 0x9d, 0x28,
+ ],
+ [
+ 0x6c, 0x92, 0x43, 0xc3, 0xc9, 0xb4, 0x0f, 0xbb, 0x7e, 0x2b, 0xd9, 0x46, 0x52,
+ 0x87, 0x9a, 0x8b, 0xfe, 0x19, 0x20, 0x01,
+ ],
+ [
+ 0x26, 0x2b, 0x4e, 0x0a, 0xc3, 0xbe, 0x32, 0xe6, 0xf3, 0x3f, 0xf4, 0x77, 0x38,
+ 0x5d, 0xa8, 0x59, 0xf6, 0xff, 0xcb, 0x4a, 0x44, 0x0b, 0x02, 0x25, 0x58, 0x76,
+ 0xce, 0x94, 0xfc, 0xad, 0xe1, 0xa4,
+ ],
+ [
+ 0x35, 0xba, 0x1b, 0x0a, 0x8a, 0x1d, 0x2a, 0x23, 0x97, 0x3a, 0x77, 0x79, 0x63,
+ 0xa9, 0x28, 0xd7, 0xbd, 0xdc, 0x14, 0xd5, 0x33, 0x40, 0xd0, 0xd1, 0x42, 0x6e,
+ 0x85, 0x6a, 0xc4, 0x25, 0x75, 0xe3, 0xf9, 0x9b, 0x14, 0xba, 0xbb, 0x8b, 0x02,
+ 0x1d, 0x84, 0x95, 0x2a, 0x73, 0xec, 0x32, 0xc5, 0xfa,
+ ],
+ [
+ 0xa6, 0xb8, 0x42, 0xde, 0xae, 0xb0, 0xc1, 0x83, 0x02, 0x30, 0x93, 0xbd, 0x33,
+ 0xf0, 0x0e, 0x4a, 0x77, 0x2e, 0x1d, 0xd8, 0x0a, 0x8d, 0x06, 0xeb, 0x51, 0x58,
+ 0xc7, 0x4c, 0x62, 0x7f, 0x64, 0x53, 0xf2, 0x4b, 0xa3, 0x05, 0xfe, 0xd8, 0xf5,
+ 0x07, 0xd7, 0x37, 0xbb, 0x79, 0x9b, 0xce, 0xc5, 0xde, 0xff, 0x53, 0x45, 0x71,
+ 0x42, 0xd6, 0x5d, 0x74, 0x7a, 0x34, 0x06, 0x65, 0x20, 0x48, 0xe4, 0xd8,
+ ]
+ ),
+ test_case!(
+ [
+ 0xf2, 0x6c, 0x71, 0xc0, 0xb3, 0x38, 0x23, 0x77, 0x86, 0xb9, 0xb1, 0x73, 0x37,
+ 0x85, 0x2d, 0x57, 0x21, 0xb1, 0xfd, 0x8b, 0x3d, 0x39, 0xb0, 0xbd, 0x63, 0x5b,
+ 0xe2, 0x70, 0x6d, 0x44, 0x8b, 0x5a, 0xc9, 0x41, 0xc3, 0xc5, 0x31, 0x2c, 0xbe,
+ 0x88, 0x00, 0x96, 0x1c, 0x9a, 0x17, 0x8a, 0x39, 0x1b, 0x79, 0xf2, 0x0b, 0x39,
+ 0x1b, 0xa0, 0x90, 0xd8, 0x3f, 0xeb, 0xa8, 0x4a, 0xe1, 0x2f, 0x9e, 0x6a, 0x46,
+ 0x3b, 0xde, 0xe6, 0xdc, 0x3e, 0xd9, 0xd7, 0x92, 0x04, 0xe0, 0xe7, 0x0e, 0xea,
+ 0xea, 0x1e, 0x93, 0x0f, 0x32, 0x42, 0x4e, 0x4d, 0x69, 0x29, 0x78, 0x73, 0xf9,
+ 0xf1, 0x6c, 0x97, 0x09, 0x93, 0x23, 0xf2, 0x30, 0xab, 0x97,
+ ],
+ [
+ 0xae, 0xc0, 0x80, 0x77, 0x14, 0x2e, 0x6f, 0xcb, 0x6a, 0x79, 0xda, 0x28, 0x6c,
+ 0xd6, 0x0b, 0xd6, 0xb0, 0xc2, 0x3b, 0xc7,
+ ],
+ [
+ 0x23, 0x4d, 0x9d, 0x0c, 0xd3, 0x62, 0xc3, 0x7f, 0xf0, 0x81, 0x22, 0xee, 0x16,
+ 0xc9, 0x64, 0xf1, 0x06, 0xd8, 0x7b, 0x89, 0xf1, 0xb3, 0x8f, 0xa4, 0xde, 0x2d,
+ 0x1f, 0x83, 0xbd, 0x62, 0xff, 0x79,
+ ],
+ [
+ 0x1b, 0x2b, 0xcf, 0x3c, 0xe1, 0x1a, 0xc3, 0x3f, 0x46, 0x54, 0x81, 0xda, 0xea,
+ 0xc3, 0x13, 0x3b, 0x0d, 0x9d, 0x43, 0x77, 0x97, 0x3e, 0xe4, 0x61, 0x84, 0xad,
+ 0x55, 0x82, 0xe3, 0xa5, 0xea, 0xb6, 0x44, 0xf8, 0x52, 0x8d, 0xec, 0x64, 0x06,
+ 0x21, 0x47, 0x79, 0x6c, 0x65, 0x51, 0xeb, 0xa5, 0xaa,
+ ],
+ [
+ 0x07, 0xdb, 0x67, 0x19, 0xaa, 0x67, 0x3b, 0xe8, 0x22, 0xb6, 0x94, 0x66, 0x91,
+ 0x13, 0x58, 0x68, 0x0a, 0x90, 0x02, 0x4b, 0x86, 0x8b, 0x67, 0x81, 0x9d, 0xef,
+ 0xd6, 0x58, 0xc1, 0xb4, 0x43, 0x21, 0xfd, 0x01, 0x7b, 0x32, 0x60, 0x4d, 0x51,
+ 0x88, 0x0f, 0xf3, 0x52, 0x12, 0xca, 0x16, 0xd9, 0xfd, 0xb7, 0x32, 0x34, 0x5d,
+ 0x60, 0x23, 0x10, 0xbc, 0x11, 0xa3, 0x14, 0x4c, 0x96, 0x02, 0x22, 0xc8,
+ ]
+ ),
+ test_case!(
+ [
+ 0xb8, 0x4e, 0x8a, 0x14, 0x6c, 0x66, 0x13, 0x9d, 0x94, 0x1f, 0xe7, 0x0e, 0xc9,
+ 0xf4, 0xbe, 0x6e, 0x74, 0x3c, 0xaa, 0x1b, 0x02, 0x28, 0x15, 0xd9, 0xfb, 0x7e,
+ 0xee, 0xd9, 0x35, 0xc9, 0xd7, 0x2d, 0x0c, 0xa0, 0xb5, 0x7d, 0xf4, 0x9d, 0x39,
+ 0x3f, 0x51, 0xf0, 0x0b, 0x49, 0x65, 0xc5, 0x24, 0x21, 0xd4, 0x18, 0xa3, 0x80,
+ 0xcb, 0x1f, 0x86, 0x2a, 0x7f, 0x30, 0x9c, 0x86, 0x4e, 0x3e, 0x0f, 0xee, 0x8a,
+ 0x2e, 0x86, 0x22, 0x3c, 0xa2, 0x4a, 0xb0, 0x3f, 0xa0, 0x38, 0x91, 0x0f, 0x30,
+ 0x02, 0xed, 0x82, 0xb8, 0x24, 0xfc, 0x43, 0xf3, 0x3b, 0x5f, 0x1f, 0x43, 0xf0,
+ 0x44, 0x07, 0xd3, 0x9e, 0xd3, 0x27, 0x65, 0xa8, 0x76, 0x9e, 0x9c,
+ ],
+ [
+ 0x81, 0xc3, 0x45, 0xbf, 0xd7, 0xf9, 0xbb, 0x4b, 0x1f, 0x7a, 0xff, 0x58, 0x33,
+ 0x0a, 0x7c, 0x98, 0x25, 0x67, 0x40, 0xa4,
+ ],
+ [
+ 0xc8, 0xfd, 0x96, 0x57, 0xab, 0x18, 0x60, 0xf1, 0xca, 0xfe, 0x10, 0x54, 0x05,
+ 0x54, 0x07, 0xa9, 0x52, 0x03, 0x59, 0x94, 0x13, 0x26, 0x94, 0x8e, 0x79, 0x82,
+ 0xf4, 0xe6, 0xb8, 0x1f, 0x0c, 0xc5,
+ ],
+ [
+ 0x69, 0x6b, 0xf9, 0x28, 0x4a, 0x94, 0x27, 0x46, 0xf2, 0xc0, 0x98, 0xdb, 0x8d,
+ 0x7b, 0x9e, 0xe1, 0x90, 0x5f, 0xfc, 0x0f, 0xef, 0xe4, 0xa7, 0x5e, 0x99, 0xb8,
+ 0x92, 0xd8, 0x99, 0xcc, 0xdd, 0x38, 0xc1, 0xcf, 0x06, 0x00, 0x8e, 0x53, 0xb6,
+ 0xf6, 0x2d, 0xcf, 0xfb, 0xdc, 0x5b, 0xf5, 0x0e, 0xe3,
+ ],
+ [
+ 0x27, 0x8d, 0x60, 0x38, 0xee, 0xa1, 0x65, 0x8d, 0x45, 0x38, 0xd8, 0xf6, 0x9a,
+ 0x0d, 0x75, 0x07, 0xae, 0x39, 0x18, 0x29, 0xff, 0x87, 0x81, 0xb0, 0x57, 0x6f,
+ 0x11, 0x16, 0x17, 0xe1, 0xd0, 0xce, 0xcf, 0x09, 0xdb, 0xa4, 0xc8, 0x1d, 0xb8,
+ 0xba, 0xfa, 0x9d, 0xd0, 0xae, 0x1e, 0x19, 0xd6, 0x7a, 0x5a, 0x94, 0x58, 0x0c,
+ 0x89, 0xd8, 0xbb, 0xf3, 0xdc, 0x0d, 0x81, 0x38, 0x84, 0x08, 0xbc, 0x10,
+ ]
+ ),
+ test_case!(
+ [
+ 0x34, 0xfe, 0xcd, 0xb5, 0xe3, 0xb9, 0x02, 0x69, 0x78, 0x73, 0x4c, 0x24, 0xdb,
+ 0x6a, 0x47, 0xb9, 0xca, 0x9a, 0x2e, 0x37, 0xc6, 0xa5, 0x6b, 0xbe, 0x70, 0x01,
+ 0xf3, 0x24, 0x0a, 0xb2, 0xf2, 0x12, 0x1a, 0x7c, 0x51, 0xe7, 0x2b, 0x93, 0x5d,
+ 0xb5, 0xaf, 0xca, 0x12, 0x21, 0x6b, 0x4a, 0x29, 0x92, 0x2a, 0xe9, 0x84, 0x22,
+ 0x51, 0x5c, 0x4b, 0xf9, 0x93, 0x8c, 0xa4, 0xf9, 0x38, 0x27, 0x1d, 0x5a, 0xa5,
+ 0x6a, 0x8e, 0x9e, 0xb2, 0x18, 0xd0, 0xb6, 0x65, 0x2c, 0xea, 0x64, 0xbb, 0x5f,
+ 0x98, 0x6f, 0x5d, 0x17, 0xd5, 0x4b, 0x7b, 0xc7, 0x15, 0xb8, 0xfd, 0x99, 0x9e,
+ 0x31, 0x18, 0x4f, 0x1f, 0xb0, 0x54, 0x0b, 0xb6, 0x23, 0x4c, 0xad, 0x4d,
+ ],
+ [
+ 0x4d, 0xcb, 0x60, 0x4e, 0x5d, 0xf3, 0x75, 0x0d, 0x4a, 0x82, 0x2f, 0x0c, 0xc3,
+ 0x9f, 0x21, 0xea, 0xd8, 0xc3, 0x7d, 0xc3,
+ ],
+ [
+ 0xba, 0x2a, 0xd0, 0x06, 0xa5, 0xcb, 0x40, 0xab, 0xbc, 0xda, 0x10, 0xa8, 0x7c,
+ 0xf1, 0xca, 0xf8, 0xaa, 0x45, 0x11, 0x57, 0x3f, 0xab, 0x13, 0xdf, 0xe8, 0xa2,
+ 0x62, 0x38, 0xcd, 0x66, 0x80, 0x2f,
+ ],
+ [
+ 0x1d, 0x34, 0xbb, 0x19, 0x32, 0xe8, 0x77, 0xbf, 0x4c, 0x5b, 0x98, 0xab, 0x2d,
+ 0x54, 0x51, 0x0d, 0xde, 0x8c, 0x3f, 0x29, 0x03, 0x73, 0x10, 0x29, 0x65, 0xbc,
+ 0xe9, 0xd9, 0x67, 0x05, 0xb0, 0x8c, 0x2f, 0xf3, 0xe6, 0x34, 0x93, 0x9b, 0x43,
+ 0x50, 0x72, 0x74, 0x78, 0x30, 0x5a, 0x40, 0xd3, 0xb5,
+ ],
+ [
+ 0xac, 0xe5, 0xbe, 0xfd, 0x98, 0xa7, 0x7b, 0x12, 0xcf, 0x16, 0xa2, 0xec, 0x8e,
+ 0x6a, 0x75, 0x9a, 0x35, 0x8b, 0x1b, 0xab, 0x34, 0xc1, 0xb1, 0xd0, 0x02, 0x6b,
+ 0x6d, 0x8d, 0xff, 0x12, 0x92, 0xf0, 0x31, 0x7b, 0xdf, 0x2d, 0x2d, 0x1d, 0xb6,
+ 0x68, 0x56, 0x06, 0x5a, 0xcb, 0xf4, 0x54, 0x9d, 0x58, 0x61, 0xd6, 0x01, 0x05,
+ 0x32, 0x51, 0x1d, 0x4c, 0x7d, 0xb5, 0xbf, 0xbb, 0x7a, 0xf0, 0x95, 0x27,
+ ]
+ ),
+ test_case!(
+ [
+ 0xaf, 0x1f, 0x29, 0x3d, 0xb6, 0xdf, 0x72, 0x86, 0x8c, 0xcc, 0x90, 0x69, 0x0a,
+ 0x9b, 0x89, 0x80, 0xe7, 0xfa, 0xdc, 0xf1, 0x59, 0x19, 0xe2, 0xf5, 0xc6, 0x59,
+ 0xf6, 0xca, 0xc8, 0xa3, 0x75, 0x82, 0x11, 0x04, 0x45, 0x90, 0xae, 0xfc, 0xbb,
+ 0x23, 0x5e, 0xc4, 0x0f, 0x90, 0x7c, 0x9e, 0x19, 0xcf, 0x0a, 0x38, 0x55, 0x54,
+ 0x7e, 0xa2, 0xf4, 0x02, 0x8a, 0x6f, 0xb7, 0xda, 0xd8, 0x5a, 0x4a, 0x5d, 0x39,
+ 0xf0, 0xd2, 0x7d, 0xc0, 0x7d, 0xd9, 0xc0, 0x6a, 0x92, 0x15, 0x74, 0xbb, 0xa5,
+ 0x45, 0x2e, 0x91, 0x73, 0x7f, 0xef, 0x4a, 0xe7, 0x9a, 0x70, 0xa8, 0xb0, 0x6f,
+ 0x3c, 0x0e, 0x49, 0xbc, 0xd7, 0x72, 0xf9, 0xbe, 0x3a, 0xc3, 0xf1, 0x67, 0x1a,
+ ],
+ [
+ 0xf8, 0x13, 0xff, 0x91, 0x6c, 0x8a, 0xd3, 0xc0, 0x87, 0x4f, 0x54, 0x9d, 0xae,
+ 0x1f, 0x87, 0xf1, 0x51, 0x00, 0xc8, 0x89,
+ ],
+ [
+ 0x5f, 0x22, 0x70, 0x31, 0x1f, 0xf1, 0x75, 0x94, 0xd3, 0xaa, 0xe0, 0x90, 0xf6,
+ 0x73, 0x75, 0x01, 0xcf, 0x9b, 0xcc, 0xb4, 0x17, 0x39, 0x61, 0x4f, 0x4f, 0x0f,
+ 0x79, 0x42, 0xe9, 0x34, 0x8e, 0x30,
+ ],
+ [
+ 0x8a, 0x13, 0xf4, 0xd5, 0xf5, 0x49, 0x28, 0xe0, 0x7c, 0x8b, 0xa5, 0xf0, 0x76,
+ 0x05, 0x6d, 0x4e, 0x71, 0x80, 0x04, 0x88, 0x4f, 0x08, 0x35, 0x24, 0xce, 0xcd,
+ 0x50, 0x4e, 0xad, 0x92, 0x79, 0xe9, 0xbc, 0xad, 0xc4, 0x19, 0x9a, 0xf1, 0x03,
+ 0x78, 0x4f, 0xac, 0xfb, 0x95, 0x30, 0x18, 0x5e, 0x1b,
+ ],
+ [
+ 0x76, 0x4b, 0x82, 0xe8, 0xaa, 0x93, 0x07, 0x60, 0xfc, 0x1f, 0xd4, 0x56, 0x0b,
+ 0xd3, 0x1b, 0x0c, 0xe9, 0x77, 0x71, 0x13, 0xa4, 0x08, 0xb2, 0x6b, 0xb8, 0x0c,
+ 0xc2, 0xaf, 0x04, 0xaf, 0xbf, 0xfc, 0xdd, 0xf8, 0x44, 0x71, 0xc7, 0x54, 0x64,
+ 0x23, 0xa0, 0xaa, 0xc3, 0x65, 0x9f, 0x80, 0x1c, 0x7a, 0x99, 0x8d, 0x10, 0x4a,
+ 0xe2, 0xaf, 0x08, 0xb5, 0x51, 0x03, 0x18, 0xd9, 0x38, 0x54, 0x16, 0x0f,
+ ]
+ ),
+ test_case!(
+ [
+ 0x24, 0xbe, 0x49, 0x7a, 0x0f, 0x94, 0xef, 0x6e, 0x5a, 0x59, 0xf4, 0x22, 0xd2,
+ 0x27, 0x53, 0x71, 0xc8, 0x8b, 0x9b, 0x38, 0xb9, 0x97, 0x00, 0x6c, 0x42, 0x69,
+ 0x99, 0xb7, 0xf6, 0x35, 0x72, 0xcb, 0x1b, 0xce, 0xbb, 0x87, 0x7a, 0xde, 0xb0,
+ 0x13, 0xa3, 0xf5, 0x6b, 0x8d, 0x80, 0xc6, 0x96, 0x6e, 0x9f, 0xcf, 0xb9, 0x2a,
+ 0xda, 0xcf, 0xfd, 0xd7, 0x42, 0x0e, 0x74, 0xaf, 0xd2, 0x03, 0x34, 0x11, 0xe8,
+ 0x50, 0x23, 0xc8, 0xca, 0xf2, 0xaf, 0xf6, 0x9f, 0xe8, 0x38, 0x51, 0xa2, 0x7b,
+ 0xe1, 0xec, 0x90, 0x5b, 0x9e, 0xe4, 0xd9, 0x09, 0x53, 0xe3, 0xf3, 0xee, 0x70,
+ 0xa7, 0x0d, 0xb7, 0x6d, 0x1d, 0xc7, 0x2f, 0xdb, 0x79, 0xd3, 0x8b, 0x47, 0x09,
+ 0x11,
+ ],
+ [
+ 0x12, 0x9b, 0xea, 0x42, 0x3d, 0xaf, 0xbb, 0x70, 0x7a, 0x9f, 0xee, 0xfb, 0xb2,
+ 0xb6, 0xeb, 0xab, 0xc7, 0xc0, 0xeb, 0xbf,
+ ],
+ [
+ 0x5a, 0x2e, 0xaa, 0x59, 0x90, 0x6f, 0xa2, 0xb2, 0xa8, 0xff, 0x5d, 0xef, 0x8f,
+ 0x6f, 0xcd, 0x0e, 0xec, 0x9a, 0xd8, 0x2c, 0xf4, 0xb9, 0x1d, 0x1a, 0xea, 0xb7,
+ 0x31, 0x70, 0xf3, 0x12, 0xb7, 0x98,
+ ],
+ [
+ 0xc3, 0x5c, 0xbb, 0xe6, 0x8c, 0x6d, 0x60, 0x9d, 0x1c, 0x21, 0x59, 0x84, 0x48,
+ 0x2f, 0x27, 0x07, 0x59, 0x4e, 0xeb, 0x25, 0x95, 0x66, 0xfe, 0xa8, 0x9c, 0x22,
+ 0x6e, 0xb7, 0x32, 0x60, 0xb8, 0xdc, 0xc5, 0x9e, 0xd9, 0x90, 0x7a, 0xb1, 0xb8,
+ 0xcf, 0xf6, 0xf8, 0xca, 0x53, 0x2d, 0xce, 0xf2, 0x65,
+ ],
+ [
+ 0x46, 0xd2, 0xac, 0x35, 0xb6, 0x69, 0x81, 0x32, 0x9c, 0x95, 0x20, 0xc0, 0x3f,
+ 0x35, 0x2d, 0x5b, 0x89, 0x38, 0x5e, 0x13, 0xec, 0xb5, 0x4b, 0xd6, 0xea, 0xca,
+ 0x7b, 0xf8, 0xfe, 0x16, 0x27, 0x25, 0xda, 0xc6, 0xc4, 0x39, 0xa7, 0x68, 0x9c,
+ 0x56, 0xef, 0xaa, 0x23, 0xbe, 0xbd, 0x7f, 0xf9, 0x0b, 0x25, 0xbc, 0x47, 0xaa,
+ 0x4d, 0x23, 0x7c, 0x8b, 0x59, 0xbb, 0x9f, 0xfe, 0xfa, 0xc6, 0x90, 0x51,
+ ]
+ ),
+ test_case!(
+ [
+ 0xa6, 0xb8, 0xb6, 0x36, 0xb6, 0xc7, 0xf1, 0x2c, 0xcb, 0xc2, 0xba, 0x8c, 0x8c,
+ 0x43, 0xa3, 0x25, 0x18, 0xfa, 0xe1, 0xe7, 0x3e, 0x35, 0x30, 0x62, 0x5c, 0x01,
+ 0x96, 0x32, 0x8c, 0x6c, 0x54, 0xa7, 0xa5, 0xea, 0x61, 0x26, 0x68, 0x8b, 0xbf,
+ 0x4e, 0x62, 0xfc, 0x5c, 0xdd, 0x10, 0x36, 0x09, 0x8c, 0xde, 0x34, 0xf7, 0x55,
+ 0x84, 0x05, 0xc0, 0x7a, 0x54, 0x95, 0x31, 0x00, 0x71, 0x8b, 0x14, 0xa6, 0x1f,
+ 0x03, 0x97, 0xd0, 0x4b, 0xed, 0x4e, 0x12, 0x98, 0x01, 0x74, 0xe2, 0x85, 0x11,
+ 0x5a, 0x5f, 0xc6, 0xaf, 0xc2, 0xe0, 0x30, 0xdc, 0x6e, 0xb4, 0xf5, 0xc7, 0xc5,
+ 0x7c, 0x07, 0x29, 0x74, 0x11, 0xe9, 0xe8, 0x28, 0xb3, 0xde, 0x70, 0xe1, 0xba,
+ 0xaa, 0xad,
+ ],
+ [
+ 0xd9, 0x29, 0xd9, 0x92, 0xb9, 0xcd, 0x4b, 0x25, 0x89, 0xc2, 0x47, 0x58, 0xa2,
+ 0xfc, 0xa7, 0x77, 0xf7, 0x80, 0xa0, 0x48,
+ ],
+ [
+ 0x27, 0xff, 0x4a, 0xd2, 0xb4, 0x35, 0xcc, 0x2f, 0xe1, 0xf6, 0xcb, 0x1d, 0x6c,
+ 0xcc, 0xf6, 0xd2, 0xa3, 0xda, 0x77, 0x15, 0x23, 0x41, 0x0d, 0x1d, 0xf2, 0xe3,
+ 0xc5, 0x19, 0x46, 0xbd, 0xac, 0xa7,
+ ],
+ [
+ 0x25, 0x95, 0x1c, 0x36, 0x45, 0xc2, 0x45, 0xae, 0x0a, 0xec, 0xe0, 0xc3, 0xd1,
+ 0x39, 0xfd, 0xc9, 0xdd, 0x47, 0x49, 0x94, 0xbd, 0x26, 0x47, 0x2c, 0xf4, 0xcc,
+ 0x37, 0x6c, 0x60, 0xfe, 0x3f, 0xa2, 0x27, 0x1f, 0xfa, 0x18, 0xd2, 0xe5, 0x4b,
+ 0xfb, 0x97, 0xb6, 0x6f, 0xb1, 0x63, 0x4b, 0x99, 0x4a,
+ ],
+ [
+ 0x19, 0xb5, 0x16, 0x3d, 0x81, 0x16, 0x0c, 0x67, 0xe6, 0xdc, 0xc4, 0x38, 0x7a,
+ 0xa7, 0xe4, 0x85, 0xfc, 0xab, 0xc3, 0x70, 0x3d, 0x52, 0x4d, 0xf5, 0x74, 0x96,
+ 0xd5, 0x61, 0x17, 0xff, 0xeb, 0x73, 0x4c, 0xdc, 0x62, 0xd5, 0xf8, 0x55, 0x32,
+ 0x2f, 0x84, 0x10, 0x46, 0xe9, 0x4b, 0x3f, 0xce, 0x10, 0x3d, 0xe8, 0x35, 0x2c,
+ 0xf8, 0x6f, 0x6f, 0x6e, 0x5b, 0x3f, 0x00, 0xd3, 0x82, 0x9c, 0x21, 0x13,
+ ]
+ ),
+ test_case!(
+ [
+ 0x0a, 0x63, 0xf9, 0x5b, 0x0a, 0xe5, 0xc1, 0x2c, 0x5e, 0xe8, 0x7f, 0x5d, 0xfd,
+ 0x89, 0xe0, 0x9f, 0x75, 0x39, 0xe7, 0x0f, 0x1a, 0x40, 0x79, 0x66, 0x74, 0xf6,
+ 0x13, 0x8c, 0xf8, 0x6b, 0xd3, 0x9f, 0x57, 0xf4, 0x34, 0x77, 0xf1, 0x41, 0xac,
+ 0x5a, 0x1b, 0xeb, 0xf8, 0x35, 0x6f, 0x68, 0xf4, 0x3b, 0x9a, 0x0a, 0x53, 0xc3,
+ 0x2e, 0x2c, 0xba, 0x87, 0x4b, 0xc4, 0x6c, 0xba, 0xe1, 0xef, 0x84, 0x0a, 0x76,
+ 0x94, 0x81, 0x86, 0xd8, 0x78, 0x47, 0x5b, 0x7f, 0x35, 0xf9, 0x9e, 0xda, 0x02,
+ 0x10, 0xee, 0xc5, 0x4a, 0x96, 0x64, 0x7d, 0x70, 0x0e, 0x50, 0x2b, 0x21, 0xac,
+ 0x98, 0x20, 0x7f, 0xe2, 0xfc, 0x16, 0x4d, 0x89, 0xdb, 0x48, 0xb8, 0xd0, 0x78,
+ 0x63, 0x2d, 0xfd,
+ ],
+ [
+ 0xb7, 0xb1, 0xa8, 0x42, 0xf0, 0xea, 0x83, 0x15, 0xd3, 0x02, 0x88, 0x31, 0x57,
+ 0x87, 0x8c, 0x74, 0x00, 0xd0, 0x24, 0x2c,
+ ],
+ [
+ 0x53, 0x44, 0x81, 0x42, 0xcf, 0xe1, 0x18, 0x53, 0xa6, 0x73, 0xef, 0x5e, 0x4d,
+ 0xa1, 0x5c, 0xd3, 0x2d, 0x77, 0xdd, 0xea, 0x58, 0x80, 0xc4, 0xeb, 0x39, 0xff,
+ 0x7c, 0xc1, 0xc7, 0x53, 0x74, 0x78,
+ ],
+ [
+ 0xe6, 0x8b, 0xef, 0x2c, 0xef, 0xcd, 0xf6, 0x99, 0xcb, 0xdd, 0xac, 0xf4, 0xa5,
+ 0x94, 0xa0, 0xe6, 0xdb, 0xe8, 0x60, 0x7c, 0xc1, 0x7b, 0xfb, 0xa1, 0xd8, 0x0b,
+ 0x07, 0x63, 0x6c, 0xbb, 0x99, 0xae, 0x01, 0xc0, 0xbf, 0x51, 0xe4, 0x7c, 0x18,
+ 0x5a, 0xd6, 0xc0, 0xd4, 0xa7, 0xa4, 0x11, 0x15, 0xe8,
+ ],
+ [
+ 0xcb, 0x2e, 0xd1, 0x2d, 0xe8, 0x43, 0x9d, 0xf7, 0x0f, 0xfa, 0x12, 0x76, 0x54,
+ 0xb9, 0xd4, 0xd6, 0x20, 0xa0, 0xc8, 0xdd, 0xd7, 0xcc, 0xbe, 0xae, 0x39, 0xa8,
+ 0xdb, 0xe2, 0x55, 0xc9, 0xe4, 0x83, 0xf7, 0x90, 0xdb, 0x04, 0x38, 0x15, 0x40,
+ 0x76, 0x24, 0x2b, 0xea, 0xa7, 0x7c, 0xb4, 0xb6, 0x6c, 0x34, 0xde, 0xef, 0xcc,
+ 0x22, 0x73, 0xec, 0x0f, 0xf8, 0x8a, 0x92, 0xa9, 0x1a, 0x3a, 0xa9, 0x0e,
+ ]
+ ),
+ test_case!(
+ [
+ 0x04, 0x0e, 0x7b, 0x1d, 0x79, 0xca, 0x81, 0x53, 0x70, 0xe0, 0x94, 0xbd, 0x16,
+ 0x75, 0xc1, 0xa2, 0x44, 0x14, 0x2a, 0xb8, 0x6b, 0x50, 0x46, 0x66, 0x5e, 0xc1,
+ 0x92, 0x27, 0xd1, 0x6d, 0xc3, 0x8a, 0x70, 0x25, 0x60, 0x42, 0xd2, 0xd9, 0x5c,
+ 0xc1, 0x8a, 0x3d, 0x22, 0xad, 0x55, 0xfe, 0xe6, 0xa8, 0xe6, 0x31, 0x66, 0x9c,
+ 0x68, 0x9f, 0x0b, 0x53, 0xf0, 0x7e, 0x46, 0xe6, 0x20, 0x5b, 0x0f, 0x1e, 0xe4,
+ 0x26, 0xd8, 0x23, 0x33, 0x65, 0x42, 0x3d, 0xd3, 0x5a, 0x6e, 0x66, 0x51, 0x72,
+ 0x9b, 0x4f, 0xa8, 0xd8, 0x26, 0xd6, 0xf6, 0x72, 0xfa, 0x88, 0x3e, 0x11, 0xff,
+ 0xe8, 0x16, 0x20, 0xc1, 0xc0, 0xeb, 0x3e, 0x2c, 0xec, 0x9c, 0xfd, 0x93, 0xc4,
+ 0x5a, 0xde, 0xbb, 0x44,
+ ],
+ [
+ 0x51, 0x2f, 0x56, 0x57, 0x2c, 0xb8, 0xbf, 0x49, 0xc5, 0xb3, 0xc5, 0x52, 0xee,
+ 0x44, 0xed, 0xa9, 0x1d, 0x3f, 0x83, 0x38,
+ ],
+ [
+ 0x2f, 0xf8, 0xbc, 0x67, 0x76, 0x95, 0x0a, 0x39, 0x31, 0x56, 0xf6, 0xa9, 0x82,
+ 0x40, 0x7f, 0xe4, 0xed, 0xad, 0x50, 0x22, 0x60, 0x5c, 0xf8, 0xf1, 0x84, 0x0f,
+ 0xe6, 0x36, 0x7b, 0xa3, 0x06, 0xf6,
+ ],
+ [
+ 0x55, 0x4c, 0xa6, 0x3f, 0xea, 0x2b, 0xea, 0xb8, 0x4c, 0x66, 0x77, 0xce, 0x14,
+ 0x50, 0x63, 0x26, 0x9b, 0xa6, 0xee, 0x54, 0xad, 0x0f, 0x40, 0xd2, 0xd3, 0x56,
+ 0xe3, 0x66, 0x76, 0x85, 0x09, 0xce, 0xb6, 0xdd, 0xe8, 0x21, 0xfa, 0x09, 0xf9,
+ 0x83, 0xfb, 0x30, 0x75, 0x2e, 0x6c, 0x0f, 0x8b, 0xfa,
+ ],
+ [
+ 0x1b, 0xa1, 0xf7, 0x8b, 0x03, 0x01, 0x5c, 0xa7, 0x5c, 0x51, 0x96, 0x38, 0x04,
+ 0x05, 0x72, 0xa2, 0x29, 0xe8, 0x03, 0x1f, 0x1e, 0x92, 0x0a, 0x96, 0x86, 0xd1,
+ 0xa5, 0xe5, 0xbd, 0xaf, 0xb1, 0x61, 0xa0, 0xe0, 0x8d, 0x3a, 0x6e, 0xeb, 0x05,
+ 0x03, 0xba, 0x63, 0xee, 0xce, 0x29, 0xaa, 0x99, 0x43, 0x9f, 0xab, 0xc7, 0xb9,
+ 0x40, 0xde, 0xe5, 0xf9, 0xc0, 0xe6, 0xaa, 0xbd, 0xac, 0x80, 0x8e, 0x87,
+ ]
+ ),
+ test_case!(
+ [
+ 0x08, 0x91, 0x09, 0xbb, 0x22, 0xab, 0x09, 0xc5, 0x09, 0x09, 0xef, 0xe9, 0xcd,
+ 0xf5, 0xa2, 0x61, 0x7d, 0x86, 0x6a, 0x8c, 0x4e, 0xb3, 0x18, 0x40, 0x2a, 0xc8,
+ 0xbf, 0xe2, 0x1a, 0xfa, 0x89, 0x41, 0x5b, 0x2d, 0xe4, 0x59, 0xf0, 0xa3, 0x91,
+ 0xb3, 0x14, 0x6d, 0x2d, 0x0c, 0xc4, 0x96, 0x52, 0xad, 0x14, 0x16, 0x8e, 0x9f,
+ 0xce, 0x20, 0xb4, 0xfa, 0xf5, 0x51, 0xf3, 0x44, 0xbd, 0xaf, 0xf7, 0xbf, 0x28,
+ 0xfa, 0x4a, 0xb8, 0x2c, 0xf3, 0x20, 0x56, 0x02, 0x4a, 0xd1, 0x2a, 0x10, 0xcf,
+ 0x9a, 0x2a, 0x70, 0xcf, 0xeb, 0x29, 0xdf, 0x47, 0x8e, 0x39, 0xaf, 0xe7, 0xb2,
+ 0x93, 0xc3, 0x16, 0x26, 0x4a, 0x26, 0xc2, 0xbc, 0xa7, 0x52, 0x4f, 0xc8, 0x53,
+ 0x76, 0x57, 0x3c, 0x07, 0x05,
+ ],
+ [
+ 0x71, 0x01, 0x3a, 0x3b, 0xe6, 0xfa, 0x3d, 0xcb, 0x65, 0x69, 0xd3, 0x65, 0x77,
+ 0x58, 0xfe, 0x8a, 0xdb, 0x71, 0x63, 0x12,
+ ],
+ [
+ 0x4e, 0x4d, 0x99, 0x18, 0xd4, 0x2a, 0x42, 0x60, 0x0b, 0xa6, 0xfe, 0x3b, 0xd6,
+ 0x9c, 0xaf, 0x5b, 0x34, 0xd6, 0xad, 0xd0, 0xc9, 0x98, 0x92, 0xa1, 0x0e, 0x34,
+ 0x76, 0xc4, 0x04, 0xd1, 0x9d, 0x1d,
+ ],
+ [
+ 0x36, 0xdf, 0x59, 0xb9, 0x54, 0x5e, 0xa2, 0x38, 0x34, 0x0f, 0x51, 0xf6, 0x9b,
+ 0x55, 0x39, 0xf1, 0x22, 0xa9, 0x69, 0x6c, 0x0d, 0x6e, 0xec, 0x18, 0xd3, 0x18,
+ 0x45, 0xe5, 0xd8, 0xcd, 0xeb, 0x50, 0xc9, 0x5d, 0xb7, 0xad, 0x75, 0xcf, 0xc5,
+ 0x5e, 0x48, 0x16, 0x7f, 0xbb, 0x11, 0xda, 0x78, 0x28,
+ ],
+ [
+ 0x8d, 0x05, 0x41, 0xe9, 0x7d, 0xac, 0x4f, 0x6c, 0x4c, 0x5e, 0xe3, 0x0f, 0xe5,
+ 0x63, 0xd4, 0x74, 0x4b, 0x44, 0xc7, 0x83, 0xb4, 0xb1, 0xea, 0xa2, 0xf8, 0x03,
+ 0xe3, 0x1d, 0x13, 0xca, 0x3d, 0xeb, 0xb1, 0x5a, 0x15, 0x4c, 0x41, 0x95, 0xdc,
+ 0xb1, 0xc7, 0x48, 0x46, 0xa5, 0x45, 0x65, 0x83, 0x56, 0x8c, 0x79, 0x31, 0x53,
+ 0x07, 0x36, 0xc5, 0xfc, 0xcc, 0x74, 0xb5, 0x57, 0xbb, 0xbe, 0x8d, 0x01,
+ ]
+ ),
+ test_case!(
+ [
+ 0x16, 0xed, 0xc2, 0xbb, 0xa9, 0xbd, 0x5c, 0x29, 0x77, 0xa5, 0x66, 0x2c, 0x85,
+ 0xb5, 0xa3, 0x36, 0x5b, 0x4a, 0x3a, 0xfd, 0x23, 0xbb, 0x79, 0x1c, 0x59, 0x21,
+ 0x8e, 0x00, 0xba, 0x04, 0xee, 0x43, 0x43, 0x85, 0x0a, 0x22, 0x9f, 0xc5, 0x40,
+ 0xd9, 0xc3, 0x9c, 0x91, 0x4d, 0xc1, 0xdd, 0x1a, 0x92, 0x2f, 0x30, 0xc3, 0x37,
+ 0x64, 0xfe, 0xe7, 0xa4, 0x42, 0x26, 0x7b, 0xa6, 0x2c, 0x80, 0x6b, 0x4d, 0x6a,
+ 0xa0, 0x90, 0xa1, 0xb2, 0x59, 0xac, 0x59, 0x1e, 0xea, 0x83, 0x22, 0x99, 0x4d,
+ 0x07, 0x70, 0x08, 0x0e, 0xc4, 0x3d, 0x95, 0x26, 0x27, 0x43, 0xca, 0x6b, 0x39,
+ 0x5e, 0x94, 0xf7, 0xdc, 0x43, 0x03, 0x9b, 0x90, 0xee, 0xe5, 0xbd, 0xcb, 0x7c,
+ 0x26, 0x81, 0xb9, 0x5b, 0xd6, 0xcc,
+ ],
+ [
+ 0xd8, 0x06, 0xa6, 0xc6, 0x79, 0xf6, 0x6a, 0x53, 0x03, 0xe6, 0xf3, 0x70, 0x07,
+ 0xa7, 0x6a, 0x0a, 0x8f, 0x0c, 0x99, 0x5a,
+ ],
+ [
+ 0xea, 0xc2, 0xf6, 0xd0, 0x0d, 0xdd, 0xac, 0x2c, 0x99, 0x60, 0x4b, 0x7d, 0x54,
+ 0x57, 0xff, 0x9f, 0x71, 0x2b, 0xd3, 0x3b, 0x15, 0x8e, 0x93, 0x67, 0x1b, 0x18,
+ 0xc9, 0x9c, 0xac, 0x01, 0x8b, 0x4d,
+ ],
+ [
+ 0xe0, 0x9d, 0xe5, 0x6d, 0xe3, 0xf5, 0xc5, 0x84, 0x05, 0x51, 0x72, 0x44, 0xe5,
+ 0xdc, 0x2d, 0xb7, 0xe8, 0x66, 0x75, 0x72, 0x49, 0x5d, 0xff, 0xa9, 0x66, 0x7b,
+ 0x61, 0x8b, 0x0d, 0xeb, 0x00, 0x5a, 0x4d, 0x0c, 0xb0, 0xef, 0x8f, 0x8b, 0x78,
+ 0x9e, 0x80, 0xe6, 0x07, 0xd3, 0x65, 0xfc, 0x90, 0x94,
+ ],
+ [
+ 0xd8, 0xa4, 0x2b, 0x57, 0x4f, 0x63, 0xe0, 0xf8, 0x5e, 0xd8, 0x54, 0xca, 0x7d,
+ 0x46, 0x4b, 0x3e, 0xbe, 0xbb, 0x22, 0x63, 0x8d, 0xe8, 0xfb, 0x17, 0xea, 0xbd,
+ 0xfa, 0x3f, 0x9f, 0x15, 0x84, 0x3d, 0x0b, 0xc3, 0x19, 0xc8, 0xbb, 0xbc, 0x7d,
+ 0xb4, 0x9e, 0xe1, 0xa0, 0x7a, 0x62, 0x97, 0xa2, 0xb7, 0x8a, 0x5f, 0x07, 0x6a,
+ 0x59, 0x28, 0xd3, 0xea, 0x23, 0xe7, 0xe9, 0x28, 0xcf, 0xbb, 0x4b, 0x70,
+ ]
+ ),
+ test_case!(
+ [
+ 0xfc, 0xb6, 0x69, 0x62, 0xf1, 0x2c, 0xf4, 0x1e, 0x13, 0x73, 0x36, 0x76, 0x2a,
+ 0xed, 0xab, 0xd3, 0x1c, 0xaa, 0xed, 0x66, 0xa2, 0x04, 0x38, 0x24, 0x44, 0xab,
+ 0xc5, 0x3e, 0x34, 0xbe, 0x9f, 0x52, 0x7b, 0x7a, 0x41, 0x4d, 0xf0, 0x8f, 0xfc,
+ 0x8b, 0x39, 0xb9, 0x5e, 0x2a, 0x2c, 0xb7, 0x10, 0x68, 0xb9, 0xdb, 0x51, 0x72,
+ 0x77, 0x75, 0x40, 0x19, 0xcd, 0x01, 0x4b, 0xc1, 0x2d, 0x3b, 0xff, 0x84, 0x29,
+ 0x39, 0x72, 0x0a, 0x95, 0x33, 0xc5, 0xd9, 0xef, 0xa1, 0xd0, 0x00, 0xb4, 0x97,
+ 0xb9, 0xf2, 0x02, 0xeb, 0xa9, 0xdd, 0x1c, 0xb5, 0x1e, 0xef, 0xdd, 0x9d, 0x4e,
+ 0xed, 0x4d, 0x50, 0xb9, 0x34, 0xb5, 0x5f, 0xdf, 0x92, 0x27, 0x62, 0xc1, 0xb7,
+ 0xeb, 0x1a, 0xa6, 0xa2, 0x7e, 0x0b, 0x35,
+ ],
+ [
+ 0x31, 0x43, 0x5c, 0xca, 0x06, 0xb6, 0xc9, 0xef, 0x74, 0x42, 0x62, 0xf6, 0x0a,
+ 0x20, 0x1b, 0x0e, 0x10, 0xf4, 0xdb, 0x53,
+ ],
+ [
+ 0x56, 0x74, 0xf5, 0x95, 0x39, 0x41, 0x97, 0x58, 0x7a, 0x8f, 0x0f, 0x1e, 0x62,
+ 0x6c, 0xff, 0x2e, 0x96, 0xac, 0xfa, 0x0f, 0x3a, 0x82, 0x31, 0xfc, 0x24, 0x91,
+ 0xde, 0x47, 0x2e, 0x1d, 0x40, 0xeb,
+ ],
+ [
+ 0x31, 0x1b, 0x64, 0x77, 0x0c, 0x4a, 0xff, 0xeb, 0x21, 0x4d, 0x86, 0xbe, 0xbb,
+ 0x87, 0x70, 0x16, 0xd8, 0x6d, 0x41, 0x34, 0xff, 0x45, 0xd5, 0x96, 0xfe, 0x7f,
+ 0xba, 0x49, 0x51, 0x14, 0x16, 0x17, 0x9a, 0x19, 0x7e, 0x25, 0xb6, 0xb9, 0x30,
+ 0x61, 0xa9, 0x5f, 0xa3, 0xe5, 0x48, 0x7a, 0x0f, 0x0e,
+ ],
+ [
+ 0x53, 0xb3, 0x47, 0x7b, 0x80, 0x9a, 0x05, 0x9f, 0xa1, 0x19, 0xe8, 0x32, 0x07,
+ 0x7e, 0xbf, 0x78, 0x6c, 0xbd, 0x04, 0xc2, 0x96, 0x61, 0x66, 0x7a, 0x18, 0xc9,
+ 0x04, 0xd6, 0x77, 0x16, 0x22, 0xf6, 0xb3, 0xd9, 0x0e, 0x3e, 0x15, 0x41, 0x7d,
+ 0x57, 0x1a, 0xa3, 0x7b, 0x85, 0x05, 0xd0, 0x61, 0x99, 0xf9, 0x61, 0xc0, 0xa2,
+ 0x6f, 0xbc, 0x57, 0x67, 0xaf, 0xe5, 0x43, 0xed, 0xe8, 0x9e, 0xaa, 0xb6,
+ ]
+ ),
+ test_case!(
+ [
+ 0xfa, 0x0f, 0xcc, 0xc3, 0xd7, 0x72, 0xd4, 0xba, 0xa5, 0x5c, 0x5b, 0xad, 0x4e,
+ 0xbc, 0x11, 0x04, 0xc6, 0x4c, 0x07, 0x52, 0x0f, 0x59, 0x9f, 0x76, 0x4a, 0xcb,
+ 0xa9, 0x69, 0x8a, 0xb6, 0x5e, 0x8e, 0x47, 0x40, 0x15, 0x99, 0xbe, 0xd2, 0x94,
+ 0x3b, 0xc4, 0x5f, 0x1b, 0xae, 0x38, 0x7b, 0x4e, 0x23, 0x0a, 0xcf, 0x6b, 0x7a,
+ 0xf3, 0xf9, 0x70, 0x2b, 0x73, 0xf6, 0xa1, 0xd3, 0xf8, 0x75, 0xba, 0xf0, 0x6e,
+ 0x08, 0xbc, 0x82, 0xf4, 0x4a, 0xb6, 0x83, 0xcb, 0x2f, 0x2f, 0xb9, 0x43, 0x2a,
+ 0x79, 0x3f, 0x54, 0x60, 0xd5, 0xd2, 0x1a, 0x8a, 0x31, 0x26, 0x4e, 0x90, 0x63,
+ 0x43, 0xd5, 0x9a, 0xdb, 0x0c, 0x10, 0x47, 0x08, 0x4f, 0x43, 0xff, 0x9c, 0x69,
+ 0x27, 0xd7, 0xf0, 0x0f, 0xea, 0x9d, 0xb1, 0x0d,
+ ],
+ [
+ 0xbf, 0x92, 0x70, 0x6a, 0x3e, 0x60, 0x3c, 0x03, 0x43, 0xca, 0xff, 0x84, 0x90,
+ 0xc5, 0x30, 0xe8, 0xe3, 0x69, 0x18, 0x4a,
+ ],
+ [
+ 0xfd, 0x1b, 0x42, 0x3b, 0xc8, 0x52, 0xe8, 0xe1, 0xc1, 0x0e, 0x8b, 0xff, 0xf5,
+ 0x1b, 0x41, 0xd1, 0x63, 0xcf, 0x87, 0x75, 0x0b, 0xd3, 0xa3, 0xba, 0xd1, 0x1b,
+ 0xd9, 0x82, 0xa3, 0xeb, 0x94, 0xab,
+ ],
+ [
+ 0xbb, 0x0d, 0x99, 0x79, 0xe1, 0x4a, 0x94, 0x6d, 0x43, 0x0b, 0x9b, 0xe9, 0x86,
+ 0x0f, 0xc7, 0xbf, 0xc5, 0x55, 0x0c, 0xb0, 0x7f, 0x53, 0x44, 0xed, 0x73, 0x43,
+ 0x14, 0xc1, 0xf1, 0x27, 0xe5, 0xee, 0x7d, 0x47, 0xec, 0xd3, 0x17, 0xe7, 0x59,
+ 0xc5, 0xc2, 0xb4, 0x24, 0x89, 0x42, 0x44, 0x1a, 0x70,
+ ],
+ [
+ 0x92, 0x6d, 0xe1, 0xfb, 0x19, 0xbd, 0x1f, 0x06, 0xda, 0xfd, 0x0e, 0x36, 0xc0,
+ 0x92, 0xa1, 0x9c, 0xb9, 0xf2, 0xa3, 0x24, 0x0a, 0xcc, 0xc4, 0x17, 0x50, 0x87,
+ 0xba, 0xa8, 0xcc, 0xaa, 0xef, 0x87, 0x7b, 0x32, 0xa6, 0x95, 0x36, 0x7d, 0x37,
+ 0xa8, 0xef, 0x66, 0xc4, 0x58, 0xb9, 0xd0, 0xaf, 0x4c, 0xa3, 0xf4, 0x9a, 0x1e,
+ 0xe0, 0x4f, 0xd5, 0x78, 0x90, 0xe1, 0xce, 0xe0, 0x45, 0x39, 0xb7, 0x57,
+ ]
+ ),
+ test_case!(
+ [
+ 0xda, 0x26, 0x0b, 0x04, 0x34, 0x5e, 0x9a, 0xb4, 0xd3, 0x08, 0x01, 0xea, 0xd6,
+ 0x5f, 0xd2, 0x57, 0x49, 0xfc, 0x5b, 0x8e, 0xbc, 0x41, 0xab, 0x5c, 0x19, 0xc4,
+ 0x9f, 0xc5, 0x6c, 0x3d, 0xd1, 0xec, 0x97, 0xaf, 0xc6, 0x89, 0x88, 0xc4, 0xc4,
+ 0x5e, 0x5c, 0x6e, 0xb3, 0xa3, 0xed, 0x1f, 0xe1, 0x4b, 0x19, 0x76, 0xc3, 0x92,
+ 0xbc, 0x25, 0x15, 0x91, 0x8c, 0xb9, 0x59, 0x9a, 0x3b, 0xb3, 0x1b, 0xee, 0x22,
+ 0x8a, 0x0f, 0xe3, 0x55, 0x9a, 0xe7, 0xac, 0xbb, 0x00, 0x69, 0xb0, 0x04, 0xba,
+ 0xa0, 0xc8, 0xea, 0x64, 0x4f, 0x87, 0x9f, 0x74, 0x07, 0x89, 0xa0, 0x5f, 0x34,
+ 0xda, 0xec, 0x74, 0x59, 0x2a, 0x8f, 0xde, 0xcc, 0x91, 0x14, 0x77, 0x86, 0x6f,
+ 0x10, 0x77, 0xb6, 0x98, 0xc6, 0xaa, 0xcc, 0xd1, 0x73,
+ ],
+ [
+ 0x02, 0x4a, 0xcc, 0x12, 0x4d, 0x8d, 0x62, 0x46, 0xa5, 0x3f, 0xae, 0x33, 0xb1,
+ 0x0c, 0x2f, 0x2c, 0x71, 0xa1, 0xc1, 0x56,
+ ],
+ [
+ 0xe3, 0x87, 0xc8, 0xb5, 0x95, 0xa2, 0x53, 0x83, 0xf8, 0x24, 0xd7, 0xe2, 0x66,
+ 0x44, 0xee, 0x0e, 0x2a, 0x2f, 0x08, 0xd5, 0xfd, 0x0d, 0x98, 0x37, 0x49, 0x01,
+ 0x48, 0xb2, 0xd7, 0xcd, 0xed, 0xb7,
+ ],
+ [
+ 0xd3, 0x75, 0x50, 0x6d, 0x13, 0x3a, 0x0b, 0xe2, 0x56, 0xc5, 0xea, 0xdd, 0xff,
+ 0x3f, 0x01, 0x94, 0xbf, 0x3f, 0x35, 0xd1, 0x10, 0x23, 0x7f, 0xce, 0x7b, 0x92,
+ 0xc8, 0x65, 0xd6, 0x17, 0x05, 0x20, 0x09, 0x75, 0x38, 0x6d, 0x3c, 0xbe, 0xf7,
+ 0x63, 0x46, 0xf5, 0x9d, 0xe0, 0x75, 0x0b, 0x74, 0x66,
+ ],
+ [
+ 0x29, 0xf1, 0xff, 0x45, 0x06, 0x5d, 0x39, 0x05, 0x13, 0x49, 0x0e, 0xd9, 0xaf,
+ 0x45, 0x75, 0x94, 0xc0, 0x97, 0xb2, 0xd2, 0x26, 0x7c, 0xd1, 0x99, 0xdc, 0x72,
+ 0xfc, 0x85, 0xd5, 0x81, 0x13, 0x8e, 0x2b, 0xd2, 0xff, 0x61, 0xae, 0x6c, 0x31,
+ 0x73, 0xe2, 0x88, 0xe2, 0xea, 0xa3, 0xb8, 0x74, 0xfe, 0x24, 0x0f, 0x88, 0x07,
+ 0x63, 0x2c, 0x8c, 0xb3, 0x87, 0xc9, 0xda, 0x24, 0x95, 0x9a, 0x1b, 0xf0,
+ ]
+ ),
+ test_case!(
+ [
+ 0xfa, 0x16, 0x60, 0x22, 0x9c, 0x82, 0x54, 0xa5, 0x3d, 0x55, 0x53, 0x30, 0xbf,
+ 0xfa, 0x34, 0x6a, 0xd0, 0xc8, 0xf3, 0xa7, 0xb6, 0xeb, 0x91, 0x28, 0x31, 0xbe,
+ 0x80, 0x35, 0x7c, 0x14, 0xa2, 0x1d, 0x49, 0x7c, 0xe2, 0x19, 0xbd, 0xd4, 0xef,
+ 0x10, 0xdc, 0xf1, 0xff, 0x73, 0x2f, 0xe8, 0x92, 0x55, 0xbf, 0xca, 0x74, 0x65,
+ 0xc4, 0xb5, 0xa1, 0x6b, 0x0e, 0xe1, 0xc9, 0x84, 0x02, 0xad, 0x7c, 0x5f, 0xd9,
+ 0xa7, 0x80, 0x2b, 0x86, 0x25, 0x15, 0xb1, 0xd9, 0xc2, 0xed, 0x2b, 0x03, 0xae,
+ 0x05, 0x36, 0x87, 0x1b, 0x2a, 0x5f, 0x89, 0x0c, 0x01, 0x1b, 0xc4, 0x69, 0x1a,
+ 0xb5, 0xd0, 0x46, 0x39, 0xed, 0x1c, 0xfd, 0x80, 0x3d, 0xbe, 0x66, 0xcc, 0x2b,
+ 0x40, 0xc5, 0x5e, 0x28, 0x1d, 0xc0, 0xc3, 0xec, 0x5d, 0x26,
+ ],
+ [
+ 0x71, 0x22, 0x5e, 0x1d, 0x93, 0x49, 0x48, 0xd6, 0x81, 0xba, 0x85, 0xae, 0x53,
+ 0xf3, 0x02, 0xa5, 0xf7, 0x53, 0xf8, 0xe8,
+ ],
+ [
+ 0xdc, 0xe2, 0x87, 0x83, 0x6f, 0x56, 0x6a, 0x4b, 0xc1, 0xd5, 0xdc, 0x28, 0xd8,
+ 0x5d, 0xdb, 0x51, 0xd3, 0x18, 0x5f, 0xb4, 0x6b, 0x79, 0x54, 0xe6, 0xad, 0xa4,
+ 0xcc, 0xae, 0xd7, 0x10, 0xf7, 0xfc,
+ ],
+ [
+ 0x25, 0xb8, 0xf6, 0xec, 0xba, 0x39, 0x8c, 0xd2, 0xe6, 0x24, 0xb6, 0xc9, 0x1c,
+ 0x68, 0x4b, 0x17, 0xfe, 0xd3, 0x8e, 0x9e, 0x88, 0xc0, 0xbf, 0x03, 0x5b, 0xec,
+ 0x3d, 0x63, 0x80, 0xf5, 0xee, 0x9b, 0x40, 0x92, 0x14, 0x62, 0xd6, 0x28, 0x45,
+ 0x49, 0x70, 0x07, 0xff, 0x8b, 0x66, 0x99, 0x2d, 0xb8,
+ ],
+ [
+ 0xf2, 0xf3, 0x77, 0xc3, 0x88, 0x05, 0xd3, 0x8d, 0x0f, 0x45, 0x10, 0x2c, 0xd8,
+ 0x3f, 0x53, 0xea, 0x4a, 0x2a, 0x3e, 0x2b, 0xf6, 0x33, 0xd9, 0x6e, 0x14, 0xe6,
+ 0xd3, 0x7d, 0x86, 0x8b, 0x88, 0xb4, 0x1a, 0x3e, 0xec, 0xa7, 0x91, 0x17, 0x78,
+ 0x0e, 0x70, 0xe8, 0x65, 0x5f, 0x66, 0x82, 0xee, 0x20, 0xdd, 0x0e, 0xb0, 0x17,
+ 0x43, 0x0c, 0x74, 0x9b, 0x72, 0x39, 0x9f, 0xca, 0x51, 0x23, 0xa0, 0x44,
+ ]
+ ),
+ test_case!(
+ [
+ 0xe9, 0x14, 0xcd, 0x1d, 0xaa, 0xa3, 0xaa, 0xee, 0x42, 0x9e, 0xc3, 0x99, 0xf6,
+ 0x7f, 0x46, 0xa0, 0x69, 0x3c, 0x36, 0x3f, 0x86, 0xe4, 0xaa, 0xbb, 0xd1, 0x46,
+ 0x33, 0xf9, 0x8a, 0x6a, 0xb3, 0x63, 0xd1, 0x2b, 0xc6, 0xdd, 0x18, 0x46, 0x64,
+ 0xa9, 0x53, 0x53, 0xf7, 0x3c, 0xf7, 0x71, 0x79, 0x1d, 0x53, 0x58, 0x69, 0x5d,
+ 0x01, 0x49, 0xfc, 0x5f, 0x04, 0x84, 0xd4, 0xb5, 0xea, 0xcb, 0x84, 0xd2, 0x1f,
+ 0x55, 0x32, 0xf8, 0xfe, 0xed, 0xc9, 0xac, 0x0d, 0x78, 0x35, 0x5e, 0xca, 0x03,
+ 0x57, 0x25, 0x26, 0x5d, 0x7d, 0xfa, 0x39, 0x48, 0xed, 0xde, 0xc4, 0x97, 0x2b,
+ 0x78, 0xb4, 0x1e, 0x50, 0xee, 0x57, 0xc7, 0x4e, 0xc2, 0xcc, 0x9a, 0xe7, 0x8e,
+ 0x1b, 0x3d, 0x00, 0x46, 0x38, 0x27, 0xfb, 0x06, 0x27, 0x2f, 0xae,
+ ],
+ [
+ 0xee, 0x1a, 0x6d, 0xe5, 0x66, 0xa8, 0x5a, 0xc6, 0x94, 0x6c, 0x87, 0xa7, 0x0d,
+ 0xab, 0x7d, 0x4a, 0xab, 0xfd, 0xde, 0xf9,
+ ],
+ [
+ 0x41, 0xa3, 0x87, 0xff, 0x2e, 0x53, 0xd4, 0x03, 0xaf, 0x0b, 0x00, 0xe5, 0x6d,
+ 0x09, 0x5b, 0x84, 0xa4, 0x99, 0x05, 0x6a, 0xc3, 0x60, 0x2b, 0xea, 0x0d, 0x33,
+ 0x39, 0x2c, 0x15, 0x78, 0xd6, 0x15,
+ ],
+ [
+ 0xe3, 0x86, 0x61, 0xaa, 0xf6, 0x1d, 0x8e, 0xd7, 0x95, 0x53, 0x30, 0x04, 0xcb,
+ 0xe0, 0x5e, 0x27, 0xb0, 0x26, 0x14, 0xeb, 0xa4, 0xfb, 0x25, 0xda, 0x1f, 0x25,
+ 0xb7, 0xab, 0x6e, 0x00, 0xcc, 0x8b, 0xb3, 0x7d, 0x31, 0xd8, 0xb8, 0x20, 0x7a,
+ 0x66, 0x7e, 0xb1, 0x0d, 0x49, 0x9c, 0x42, 0xfe, 0x6c,
+ ],
+ [
+ 0x8a, 0xb0, 0x44, 0xe2, 0x02, 0xdb, 0x19, 0x9e, 0x3b, 0xe9, 0x54, 0xa1, 0x75,
+ 0x8d, 0xdc, 0xda, 0x9c, 0xa3, 0x79, 0x58, 0x1b, 0xfb, 0xa8, 0xbc, 0x8b, 0x71,
+ 0xad, 0x54, 0x7c, 0x48, 0xc6, 0x82, 0xfb, 0xf1, 0x7e, 0xb9, 0x10, 0xe7, 0x33,
+ 0x01, 0x2c, 0xa6, 0xf6, 0x59, 0x93, 0xe4, 0x20, 0x18, 0x27, 0xc3, 0xfb, 0x7e,
+ 0x10, 0xd8, 0x26, 0xab, 0x64, 0xe2, 0xa3, 0xc6, 0x83, 0x81, 0xb1, 0xe3,
+ ]
+ ),
+ test_case!(
+ [
+ 0xcd, 0x38, 0x14, 0x08, 0xbb, 0x30, 0x55, 0xb1, 0x96, 0xb6, 0xe1, 0xd3, 0x3a,
+ 0xd6, 0x6c, 0xb0, 0x9f, 0x59, 0xe2, 0xef, 0xd8, 0x37, 0x65, 0x29, 0x57, 0x59,
+ 0xb3, 0xae, 0xbe, 0x51, 0x1c, 0xc9, 0xe2, 0x6e, 0x1f, 0x7d, 0x91, 0x88, 0xdf,
+ 0x71, 0xff, 0x1e, 0xd2, 0x0a, 0x83, 0xfe, 0xa4, 0xcd, 0xf6, 0xbb, 0x78, 0x62,
+ 0xaf, 0xd5, 0x4c, 0x4e, 0xa4, 0x7b, 0x9d, 0xaa, 0x71, 0x53, 0xba, 0xbe, 0x9f,
+ 0xb9, 0x3b, 0xe3, 0x7d, 0x0b, 0xe9, 0xa9, 0x6e, 0xbe, 0x3b, 0x75, 0xbf, 0x30,
+ 0x0f, 0x4c, 0x38, 0x59, 0xc2, 0x50, 0xcb, 0x0d, 0xc8, 0xb8, 0xf7, 0x68, 0xcb,
+ 0xe1, 0x7f, 0x72, 0x36, 0xa7, 0xa6, 0x8f, 0x99, 0x41, 0x7f, 0x09, 0x69, 0xc5,
+ 0x53, 0xf7, 0x97, 0x46, 0xf4, 0x28, 0x65, 0x82, 0x51, 0x1d, 0x77, 0x45,
+ ],
+ [
+ 0xce, 0x77, 0xa7, 0x1c, 0xce, 0xbf, 0x34, 0x15, 0xeb, 0xfc, 0x13, 0x66, 0xad,
+ 0x27, 0xad, 0x6b, 0x25, 0x43, 0xc9, 0xfc,
+ ],
+ [
+ 0x8d, 0xdc, 0x55, 0xbd, 0x0a, 0xc3, 0xf3, 0xe8, 0xf6, 0x45, 0x9a, 0x18, 0x16,
+ 0xf7, 0xcb, 0x5c, 0x92, 0x3b, 0x8d, 0xfa, 0x63, 0x12, 0xb0, 0xf3, 0x0f, 0x33,
+ 0x72, 0xe1, 0x0f, 0x20, 0x17, 0x2a,
+ ],
+ [
+ 0x7d, 0x9a, 0x51, 0xf1, 0xac, 0xdb, 0x98, 0xc9, 0x7c, 0xe1, 0x2f, 0xa7, 0x62,
+ 0x9b, 0x11, 0x17, 0x4a, 0x8d, 0xdb, 0xd3, 0x25, 0xd1, 0x3c, 0x65, 0x59, 0x12,
+ 0x0e, 0x60, 0x7d, 0xe6, 0xed, 0x40, 0xeb, 0x19, 0x99, 0x1f, 0xfc, 0xac, 0x43,
+ 0xc5, 0x18, 0x1a, 0x23, 0x9d, 0x9d, 0x05, 0x77, 0xee,
+ ],
+ [
+ 0x7b, 0xc8, 0xe7, 0x3f, 0xe4, 0xca, 0x5f, 0x74, 0x3a, 0x78, 0xed, 0xde, 0xc5,
+ 0xa7, 0x76, 0xdd, 0x48, 0x1b, 0x06, 0x3e, 0x1c, 0x95, 0x98, 0x6c, 0x7f, 0xb9,
+ 0x79, 0xba, 0x74, 0x43, 0xa2, 0xa3, 0x73, 0x22, 0x42, 0x94, 0xb4, 0xf3, 0xef,
+ 0xb5, 0xb9, 0x93, 0x81, 0x5b, 0xa3, 0x44, 0xa7, 0xf6, 0x3e, 0x73, 0xa5, 0x67,
+ 0x8e, 0xa8, 0xa0, 0x40, 0xe2, 0xef, 0xbf, 0x4a, 0x0d, 0x5e, 0x29, 0xdc,
+ ]
+ ),
+ test_case!(
+ [
+ 0xb1, 0x65, 0x9d, 0xe2, 0xe3, 0x67, 0x82, 0xf3, 0x8a, 0x22, 0xc5, 0x80, 0x54,
+ 0x2c, 0xc9, 0xc9, 0xc9, 0xaf, 0x93, 0x18, 0xcd, 0xe8, 0x21, 0x1a, 0x49, 0xa7,
+ 0xbc, 0x07, 0x7c, 0xba, 0xa3, 0x5b, 0x44, 0x69, 0x93, 0xe7, 0x17, 0x41, 0xad,
+ 0xd6, 0x56, 0xc5, 0x96, 0xf9, 0x51, 0xc3, 0x7e, 0x3c, 0x52, 0xdc, 0xe2, 0x86,
+ 0x46, 0xa6, 0x8e, 0x14, 0x33, 0xf1, 0x46, 0xc1, 0x4f, 0xda, 0x7e, 0x32, 0x75,
+ 0xca, 0xb3, 0x54, 0x81, 0x74, 0x39, 0x42, 0x23, 0xef, 0x84, 0x0b, 0x27, 0x3f,
+ 0xf7, 0xf4, 0x34, 0x06, 0x91, 0x88, 0xcd, 0x00, 0x55, 0xdb, 0x22, 0xbe, 0xdb,
+ 0x97, 0xa5, 0x71, 0x99, 0x21, 0xaa, 0x14, 0x47, 0x99, 0xe4, 0x7c, 0xbc, 0x3a,
+ 0xb3, 0x70, 0xc0, 0x1d, 0x70, 0xbf, 0xfc, 0xc5, 0x37, 0xc4, 0xdd, 0x04, 0xcc,
+ ],
+ [
+ 0x74, 0x61, 0x00, 0x22, 0x50, 0x99, 0x43, 0x5c, 0x77, 0xc2, 0x05, 0x19, 0xd1,
+ 0x8c, 0x87, 0x5e, 0x7d, 0x8d, 0x3d, 0xb5,
+ ],
+ [
+ 0x1c, 0xd5, 0xa3, 0x90, 0x43, 0x39, 0x4f, 0x0a, 0x1d, 0xa4, 0x01, 0x79, 0xde,
+ 0x1b, 0x82, 0xfa, 0xbf, 0x2a, 0xcc, 0xa3, 0x47, 0x8e, 0xb3, 0x76, 0xfc, 0x5f,
+ 0x68, 0xdf, 0x07, 0x37, 0x32, 0xcd,
+ ],
+ [
+ 0x5e, 0x73, 0x8c, 0x16, 0xf6, 0x0b, 0x6c, 0xa3, 0xc4, 0x50, 0xc3, 0x56, 0xba,
+ 0x1e, 0xc0, 0x38, 0xe0, 0xb6, 0x7d, 0x80, 0x10, 0x48, 0xca, 0xbe, 0x0e, 0x04,
+ 0x1c, 0xc0, 0x45, 0x3d, 0xfd, 0xc1, 0xaf, 0xda, 0x12, 0xc8, 0x92, 0x41, 0x69,
+ 0x20, 0x0d, 0xfb, 0x92, 0x86, 0x52, 0xca, 0x42, 0xb9,
+ ],
+ [
+ 0xd1, 0x67, 0x13, 0x0d, 0x9c, 0x66, 0x7e, 0xda, 0xbd, 0xed, 0x15, 0xd2, 0x51,
+ 0x30, 0xc4, 0x1b, 0xea, 0xaf, 0x45, 0x99, 0x60, 0x6a, 0x5d, 0xbb, 0x3b, 0x1d,
+ 0xc2, 0x96, 0xbe, 0xaf, 0x03, 0x77, 0xc1, 0x4e, 0xb2, 0xb0, 0x6e, 0x76, 0xd6,
+ 0x38, 0xf2, 0x61, 0xa4, 0x53, 0x72, 0x3b, 0xe2, 0x94, 0x54, 0x11, 0x96, 0xe2,
+ 0x04, 0x7d, 0x82, 0x33, 0x2a, 0x83, 0xeb, 0xaf, 0x7a, 0x31, 0x93, 0xc6,
+ ]
+ ),
+ test_case!(
+ [
+ 0x28, 0xf9, 0x3c, 0x84, 0x76, 0x04, 0x5a, 0x55, 0x3b, 0x78, 0x4d, 0x86, 0x34,
+ 0xc4, 0x8a, 0x11, 0xc9, 0x7b, 0xcf, 0x1a, 0x01, 0x02, 0xb5, 0x4b, 0x27, 0x92,
+ 0x5d, 0xa7, 0x72, 0xcc, 0xdc, 0x61, 0xd3, 0x09, 0xc8, 0x48, 0x80, 0x09, 0xd3,
+ 0x8b, 0x3f, 0xf5, 0x25, 0x86, 0x5e, 0x53, 0x88, 0xce, 0x8c, 0x1d, 0x4b, 0x89,
+ 0x92, 0x23, 0xed, 0x7d, 0x6c, 0x84, 0x68, 0xb0, 0x71, 0x59, 0x8e, 0xd8, 0x4d,
+ 0x11, 0xad, 0x2a, 0xe4, 0x5b, 0x96, 0x26, 0xf5, 0xbc, 0x07, 0x3c, 0xde, 0x43,
+ 0x56, 0x5a, 0x70, 0x54, 0x27, 0x66, 0x32, 0xf7, 0x3a, 0x92, 0x71, 0x57, 0xc0,
+ 0xfe, 0xf1, 0x8b, 0x2b, 0x83, 0x13, 0x5e, 0xf6, 0xcc, 0x8d, 0x5d, 0xb4, 0xbf,
+ 0xfc, 0x9a, 0xf3, 0xa2, 0x7d, 0xb1, 0xe6, 0x29, 0x93, 0x96, 0xde, 0xf5, 0x2f,
+ 0xb6,
+ ],
+ [
+ 0xc6, 0xf4, 0x05, 0xed, 0x7e, 0x74, 0xc4, 0x64, 0xbb, 0x94, 0x69, 0x3f, 0x76,
+ 0xb5, 0x5e, 0x06, 0x9b, 0x8a, 0x29, 0xb8,
+ ],
+ [
+ 0x3d, 0x06, 0x17, 0x59, 0x7b, 0xc0, 0x6f, 0x36, 0x1e, 0x4a, 0xad, 0x93, 0x45,
+ 0xcb, 0x2c, 0x42, 0xd8, 0xfb, 0x68, 0x5e, 0x50, 0xb3, 0x1f, 0x7d, 0xd3, 0x4f,
+ 0xf8, 0x10, 0x6b, 0x64, 0xf7, 0x08,
+ ],
+ [
+ 0xa2, 0x23, 0x4f, 0x6c, 0xee, 0xd3, 0xbe, 0x45, 0x56, 0x5c, 0x8c, 0x9e, 0x8e,
+ 0x66, 0x23, 0xca, 0x60, 0x7b, 0xa4, 0xc9, 0xb1, 0x96, 0x82, 0x45, 0x68, 0x87,
+ 0x9c, 0x8e, 0x44, 0x65, 0xa0, 0x35, 0x8e, 0xcf, 0x98, 0x3a, 0x21, 0xdd, 0xb4,
+ 0x20, 0x93, 0xc5, 0x80, 0xc3, 0x7c, 0xaa, 0x56, 0x26,
+ ],
+ [
+ 0xc1, 0x68, 0xe6, 0x44, 0x84, 0xcf, 0x77, 0xee, 0xea, 0xa2, 0xbb, 0xdb, 0xcb,
+ 0xa7, 0xed, 0xdf, 0xfe, 0x57, 0x3f, 0x23, 0x40, 0x4c, 0x0c, 0x2a, 0x27, 0x7e,
+ 0x64, 0x5e, 0x06, 0xe0, 0xb7, 0xd2, 0xba, 0x1a, 0xbd, 0xa3, 0x82, 0xb9, 0xc5,
+ 0xc7, 0x36, 0x43, 0xbc, 0x67, 0xa5, 0xfc, 0x33, 0x80, 0xba, 0x7b, 0x06, 0x7e,
+ 0x8c, 0xa5, 0xa6, 0x5c, 0xe3, 0x72, 0x0b, 0x41, 0xe5, 0x9d, 0xc8, 0xef,
+ ]
+ ),
+ test_case!(
+ [
+ 0x3b, 0xd5, 0x8d, 0x03, 0x6b, 0x3f, 0x48, 0x08, 0x9c, 0x94, 0xa3, 0x41, 0xbb,
+ 0x74, 0x0e, 0xc5, 0x9b, 0xc1, 0x02, 0x53, 0xb2, 0xcd, 0xbe, 0xee, 0x77, 0x7d,
+ 0x76, 0x59, 0xd7, 0x2f, 0x94, 0xb0, 0x91, 0x4f, 0x69, 0xeb, 0x68, 0xb4, 0xd4,
+ 0x34, 0x31, 0x70, 0xc9, 0x85, 0xf2, 0x7e, 0x7e, 0x82, 0x0d, 0x1b, 0x0f, 0xcf,
+ 0xaa, 0xf5, 0xce, 0xf8, 0x67, 0xae, 0x19, 0x5a, 0xc1, 0xcc, 0x8a, 0xbf, 0x93,
+ 0xa8, 0xf0, 0x58, 0x4a, 0x33, 0xe8, 0x91, 0x39, 0xe2, 0xf3, 0x1a, 0x78, 0xae,
+ 0xb8, 0x0a, 0xb1, 0x14, 0x90, 0xe8, 0xe7, 0xf4, 0x97, 0x15, 0x50, 0x84, 0x73,
+ 0x08, 0xd9, 0x79, 0x76, 0x69, 0x90, 0x9c, 0xe2, 0x62, 0xa6, 0x3b, 0x12, 0x8b,
+ 0x78, 0xb3, 0x1c, 0xa4, 0x5b, 0x3c, 0xe9, 0x29, 0xda, 0xaf, 0xcd, 0x85, 0x0d,
+ 0xd6, 0x20,
+ ],
+ [
+ 0x21, 0xc1, 0xe1, 0x5d, 0x4b, 0x96, 0x24, 0xd7, 0xa8, 0xb4, 0x90, 0x78, 0x97,
+ 0xe2, 0xcf, 0xd1, 0xc8, 0xba, 0x2a, 0x84,
+ ],
+ [
+ 0x5d, 0xa5, 0xd6, 0x23, 0x84, 0x42, 0x07, 0x6b, 0x9f, 0xd7, 0x8f, 0x5b, 0xd3,
+ 0xd2, 0xf3, 0xc4, 0x7f, 0xee, 0x87, 0x14, 0xa4, 0xcb, 0x1c, 0x4d, 0xbe, 0xfd,
+ 0xfb, 0x8f, 0xfd, 0x51, 0x89, 0x73,
+ ],
+ [
+ 0x85, 0x31, 0xc9, 0x87, 0x03, 0x7d, 0x56, 0xc7, 0x2d, 0x64, 0x2c, 0xb9, 0xb9,
+ 0xa2, 0x1a, 0x20, 0xa8, 0x52, 0xf8, 0x67, 0x0b, 0xad, 0x5f, 0x62, 0xa2, 0xec,
+ 0x6c, 0xa7, 0xc3, 0xdb, 0x01, 0xd1, 0xdd, 0xdb, 0x8f, 0xb2, 0x1b, 0x41, 0xf3,
+ 0xf8, 0xad, 0x19, 0xba, 0x0f, 0x09, 0xc6, 0x58, 0x2f,
+ ],
+ [
+ 0x04, 0x43, 0x26, 0x1b, 0x38, 0x7e, 0x1f, 0x9c, 0x07, 0x4a, 0xf0, 0x98, 0xd2,
+ 0xcf, 0x2a, 0x60, 0x53, 0x5c, 0x62, 0x14, 0x7b, 0xb7, 0x3d, 0x35, 0x05, 0xbf,
+ 0x7d, 0xc0, 0xfc, 0x3f, 0xb0, 0xac, 0xb9, 0x6b, 0xe3, 0xa5, 0x6e, 0x8b, 0xff,
+ 0xa2, 0x6a, 0xa2, 0xcf, 0x80, 0x14, 0x09, 0x92, 0x31, 0x23, 0x3c, 0x5c, 0x9d,
+ 0xb5, 0x05, 0xfe, 0x52, 0xa8, 0x6b, 0x8d, 0x29, 0x4d, 0x7e, 0xcd, 0x55,
+ ]
+ ),
+ test_case!(
+ [
+ 0xaf, 0x98, 0x3e, 0x36, 0x71, 0x5f, 0xe4, 0x10, 0xc6, 0x89, 0x6b, 0xdf, 0xb6,
+ 0xff, 0xe2, 0xc2, 0x64, 0xaf, 0xd7, 0xa3, 0x4a, 0x4e, 0x0d, 0x4e, 0x31, 0xf5,
+ 0xb5, 0xc2, 0x7d, 0x8b, 0x6c, 0xc8, 0xfb, 0xf7, 0x2f, 0xbb, 0xaa, 0x4d, 0x95,
+ 0x0f, 0x78, 0x8e, 0x92, 0x84, 0x0f, 0x30, 0x28, 0x7b, 0xdc, 0x77, 0x66, 0x93,
+ 0xbc, 0x9c, 0x66, 0x7b, 0x1e, 0x49, 0x42, 0xd8, 0x64, 0x8f, 0x2d, 0x14, 0x43,
+ 0xec, 0x37, 0x2a, 0x65, 0x80, 0x93, 0xbe, 0x70, 0xf4, 0x36, 0x2d, 0x8d, 0xbc,
+ 0x6a, 0x4b, 0xe0, 0x5a, 0x5b, 0x66, 0xe2, 0x93, 0xfe, 0xf8, 0xeb, 0x07, 0xfd,
+ 0x0d, 0x5f, 0x15, 0x03, 0xe1, 0x5d, 0x9e, 0xa8, 0x23, 0x60, 0xf5, 0x8b, 0xfc,
+ 0xbf, 0x7c, 0xef, 0xbc, 0xbb, 0x30, 0x63, 0x83, 0xdf, 0xec, 0x7f, 0x51, 0x0f,
+ 0xd4, 0xf8, 0x0a,
+ ],
+ [
+ 0xdc, 0x75, 0xbf, 0xa6, 0xc2, 0x0c, 0xfe, 0x23, 0x29, 0xd5, 0x20, 0x80, 0x60,
+ 0x93, 0x62, 0x31, 0xbe, 0x8b, 0x61, 0x90,
+ ],
+ [
+ 0x37, 0xc6, 0xb5, 0x09, 0x61, 0x29, 0xbb, 0xa4, 0x38, 0xba, 0xff, 0x13, 0xdb,
+ 0xe5, 0xdd, 0x5c, 0x08, 0x64, 0xcc, 0x73, 0x5d, 0xee, 0xdc, 0x2d, 0x72, 0xa4,
+ 0x49, 0x63, 0x77, 0x74, 0xbd, 0x05,
+ ],
+ [
+ 0x76, 0xfe, 0x98, 0xcd, 0xec, 0x95, 0xb3, 0x2f, 0x11, 0x1c, 0x73, 0xa1, 0x9a,
+ 0x99, 0x62, 0xf3, 0x76, 0x4d, 0x56, 0xc1, 0xc1, 0xee, 0x9e, 0xc0, 0x23, 0xf1,
+ 0xbb, 0xac, 0x1b, 0xbb, 0x9c, 0x84, 0xc9, 0x6a, 0x81, 0xb7, 0xfc, 0xd4, 0x99,
+ 0xe4, 0xa2, 0xb8, 0xa8, 0x4f, 0x88, 0xc9, 0x9b, 0x90,
+ ],
+ [
+ 0x79, 0x9b, 0x61, 0x00, 0x7f, 0x80, 0x9a, 0xa5, 0x75, 0x9f, 0x24, 0x8d, 0x65,
+ 0x72, 0x47, 0xa2, 0xb5, 0x8d, 0xb2, 0x4c, 0x65, 0x78, 0x12, 0xb6, 0x75, 0x94,
+ 0x29, 0xd1, 0x1f, 0x35, 0xfb, 0x01, 0x33, 0x0f, 0xca, 0x51, 0xb8, 0xc1, 0x86,
+ 0x83, 0xfe, 0xb9, 0xf7, 0x58, 0x41, 0x75, 0x54, 0x9e, 0x48, 0x2d, 0xe9, 0xbd,
+ 0xac, 0x2e, 0xce, 0xc7, 0x11, 0x2c, 0xbc, 0x06, 0xe8, 0xa9, 0x0e, 0xe9,
+ ]
+ ),
+ test_case!(
+ [
+ 0x9c, 0x3f, 0x25, 0x14, 0x00, 0x78, 0xfa, 0x99, 0x6b, 0x73, 0xe3, 0x19, 0x49,
+ 0xb9, 0x17, 0x98, 0x75, 0xae, 0xb0, 0x06, 0xba, 0x1e, 0xdc, 0xdb, 0x44, 0x25,
+ 0x7d, 0xe9, 0x54, 0xdb, 0x19, 0x5a, 0xad, 0x39, 0xbd, 0x9e, 0x55, 0xc0, 0x64,
+ 0xe0, 0x9f, 0x1e, 0xf0, 0x68, 0xeb, 0x85, 0xf4, 0xdc, 0x45, 0x35, 0x62, 0x1e,
+ 0xb7, 0x46, 0x20, 0xa4, 0xdb, 0x0e, 0x80, 0xb8, 0x9a, 0xec, 0xa9, 0xa7, 0x10,
+ 0xa1, 0x1f, 0x3f, 0x6b, 0x94, 0xd4, 0x13, 0x63, 0x63, 0xd6, 0x9f, 0xdf, 0x51,
+ 0x7d, 0x69, 0x7a, 0xfa, 0x8a, 0x39, 0x16, 0xbc, 0xad, 0x3a, 0x60, 0x5f, 0xad,
+ 0x59, 0xa4, 0xb5, 0x98, 0x77, 0x71, 0xbc, 0xff, 0x89, 0xc6, 0x31, 0xf5, 0xd3,
+ 0x00, 0x56, 0x70, 0x3a, 0x4b, 0x3e, 0x66, 0xdf, 0x2c, 0xc5, 0x9b, 0xe5, 0xe3,
+ 0xa9, 0xe6, 0x44, 0x55,
+ ],
+ [
+ 0xcb, 0x59, 0x0c, 0x31, 0x22, 0x0d, 0xd3, 0x0c, 0x6c, 0x4a, 0x82, 0x9d, 0xcd,
+ 0xec, 0xb0, 0xa8, 0xe4, 0xa2, 0xa1, 0xf6,
+ ],
+ [
+ 0x8e, 0xfa, 0x25, 0xbd, 0x3d, 0x3a, 0xc8, 0x61, 0xb7, 0x3f, 0x6b, 0x64, 0xbc,
+ 0xea, 0x00, 0xe0, 0xda, 0xb8, 0xd0, 0xe7, 0x62, 0x89, 0xac, 0x1f, 0x0c, 0x35,
+ 0xac, 0xad, 0x5a, 0x46, 0x6e, 0x51,
+ ],
+ [
+ 0x95, 0x87, 0x5b, 0xad, 0x5b, 0x7c, 0x01, 0x8e, 0x0e, 0x45, 0x40, 0xae, 0x08,
+ 0x93, 0xcd, 0xa4, 0xcb, 0xa9, 0x50, 0x92, 0xc6, 0xe7, 0x9d, 0xf2, 0xe4, 0x74,
+ 0xa0, 0xd4, 0x95, 0x11, 0x02, 0x81, 0x1a, 0xc2, 0x33, 0x95, 0xf4, 0x95, 0xac,
+ 0x35, 0xea, 0xd4, 0x7c, 0x37, 0x4f, 0xc9, 0x42, 0x5f,
+ ],
+ [
+ 0x1e, 0xfe, 0x41, 0xfd, 0x93, 0xbf, 0x30, 0x32, 0xd3, 0x59, 0x4d, 0xad, 0xab,
+ 0xc6, 0xcd, 0x4a, 0x97, 0xf2, 0x8e, 0x21, 0x02, 0x83, 0x6a, 0x65, 0xc7, 0x34,
+ 0xf5, 0xcf, 0x38, 0xd2, 0xee, 0x16, 0x3c, 0x5f, 0xbc, 0x5a, 0xde, 0x09, 0x72,
+ 0x17, 0x02, 0x11, 0xa9, 0x63, 0x47, 0x09, 0xe0, 0xac, 0xcf, 0x35, 0x43, 0x14,
+ 0xae, 0x95, 0x4b, 0x0c, 0xb6, 0x06, 0x13, 0xb5, 0xf2, 0x5b, 0x5d, 0xfa,
+ ]
+ ),
+ test_case!(
+ [
+ 0xb9, 0xb9, 0x77, 0x32, 0xba, 0x57, 0xa9, 0x2f, 0x6a, 0x3e, 0x17, 0xac, 0xa0,
+ 0xc6, 0xbd, 0x1a, 0x1d, 0x3f, 0x13, 0x29, 0xf7, 0x90, 0xce, 0x20, 0x2b, 0x27,
+ 0xca, 0x26, 0x96, 0x47, 0x1c, 0xbb, 0x72, 0x0b, 0x61, 0x04, 0xec, 0x61, 0xdb,
+ 0xe3, 0xde, 0xac, 0x52, 0xf7, 0x22, 0xde, 0xde, 0x6c, 0x6c, 0x44, 0x5f, 0x7d,
+ 0xf4, 0xcd, 0xf9, 0xff, 0xe0, 0x4f, 0x20, 0xd0, 0x86, 0x61, 0x0f, 0x12, 0x27,
+ 0x94, 0xbd, 0xad, 0xd3, 0xa0, 0xa0, 0xca, 0xdc, 0x96, 0x51, 0x8c, 0x05, 0xb6,
+ 0x6f, 0xbd, 0x58, 0xc3, 0x57, 0x12, 0x72, 0x59, 0x02, 0xda, 0x42, 0xf8, 0x72,
+ 0xa4, 0xbd, 0x17, 0x20, 0xd2, 0x0d, 0x2e, 0x7f, 0x94, 0xb5, 0x87, 0x3a, 0x49,
+ 0x3a, 0x7b, 0x8d, 0xd9, 0xee, 0x8d, 0x37, 0xb8, 0x52, 0x8a, 0xfe, 0x52, 0x9d,
+ 0xe8, 0xe4, 0xae, 0xce, 0x5d,
+ ],
+ [
+ 0x0b, 0xb8, 0x37, 0xfc, 0xec, 0x5d, 0x07, 0x8f, 0x58, 0x45, 0xb4, 0x01, 0x12,
+ 0x74, 0x84, 0xf1, 0xe6, 0x95, 0x24, 0x1f,
+ ],
+ [
+ 0x85, 0x02, 0x8b, 0x5a, 0x6a, 0x92, 0xe3, 0x88, 0x57, 0x20, 0x36, 0x78, 0x23,
+ 0x4b, 0x11, 0x21, 0x4d, 0x67, 0x9d, 0x9f, 0x8a, 0x34, 0xab, 0xad, 0x97, 0x45,
+ 0x6f, 0x14, 0x8f, 0x60, 0x67, 0x1a,
+ ],
+ [
+ 0x47, 0x95, 0x35, 0x81, 0x04, 0xef, 0xdc, 0xb5, 0xc3, 0x0c, 0xe4, 0x35, 0x5d,
+ 0x36, 0xd5, 0xe7, 0x03, 0x78, 0x06, 0x06, 0x48, 0x8f, 0x7b, 0xd6, 0x87, 0xa7,
+ 0xcb, 0x8c, 0x4b, 0x34, 0x58, 0xcd, 0xcc, 0x69, 0xb5, 0x6b, 0x9b, 0xf9, 0xff,
+ 0xa9, 0x1a, 0x71, 0x84, 0x46, 0x67, 0x4e, 0xaf, 0xae,
+ ],
+ [
+ 0x30, 0x83, 0x6e, 0x51, 0x41, 0x81, 0x6a, 0xc4, 0x82, 0x79, 0xcd, 0x74, 0x18,
+ 0x06, 0xc2, 0x8f, 0x8a, 0xc7, 0x9b, 0x4e, 0xdf, 0x0c, 0xda, 0x0b, 0xad, 0x4f,
+ 0xee, 0xe2, 0x56, 0x97, 0x03, 0x29, 0xde, 0x6d, 0xe7, 0x6b, 0xc6, 0x6c, 0x58,
+ 0x9e, 0xc8, 0x93, 0xb8, 0x47, 0x6e, 0x7d, 0x02, 0xd5, 0x54, 0x28, 0x6d, 0xe0,
+ 0x46, 0x78, 0xa7, 0x92, 0x54, 0x52, 0x7d, 0x56, 0xf7, 0xec, 0x21, 0x2a,
+ ]
+ ),
+ test_case!(
+ [
+ 0x63, 0x78, 0x65, 0x8e, 0xb3, 0xac, 0xd1, 0xcc, 0x65, 0x2c, 0x9c, 0xdf, 0x37,
+ 0x94, 0xe2, 0x87, 0x22, 0x7e, 0x19, 0x12, 0x75, 0x92, 0xa6, 0x2f, 0xf1, 0x9c,
+ 0x64, 0x0d, 0x1f, 0xff, 0x53, 0x52, 0x52, 0xd2, 0x7c, 0x32, 0xff, 0x19, 0x5d,
+ 0xe6, 0x9a, 0x4f, 0x75, 0x2c, 0x67, 0x6d, 0x45, 0xb7, 0x4d, 0x19, 0x5a, 0xa1,
+ 0x31, 0x90, 0x99, 0xad, 0xd9, 0xac, 0x07, 0xe4, 0xe5, 0xec, 0xa5, 0x17, 0xcb,
+ 0xb6, 0x77, 0xac, 0x76, 0x9d, 0xf9, 0xb4, 0xae, 0xca, 0xd1, 0xf5, 0xb6, 0x87,
+ 0x86, 0x1a, 0x8b, 0xb3, 0x43, 0x78, 0x4d, 0x58, 0x43, 0x8a, 0xe4, 0xa0, 0xc0,
+ 0xb3, 0x18, 0xcb, 0x6d, 0x18, 0x9a, 0xbd, 0x52, 0xae, 0x55, 0x83, 0xf7, 0x3f,
+ 0x23, 0x79, 0xd5, 0xd9, 0x75, 0x71, 0x1d, 0x44, 0x0b, 0xf7, 0x3b, 0xd8, 0x48,
+ 0xb7, 0x14, 0xd8, 0xc8, 0x38, 0xf9,
+ ],
+ [
+ 0x98, 0x10, 0x57, 0x64, 0xe2, 0x3e, 0x6b, 0xfa, 0x2a, 0x17, 0xa7, 0x62, 0x3f,
+ 0x87, 0xa6, 0x4c, 0xd1, 0x5e, 0x60, 0xa9,
+ ],
+ [
+ 0xdb, 0xb5, 0xd7, 0x61, 0x38, 0xd5, 0x72, 0x48, 0xb2, 0xc7, 0x8d, 0x6a, 0xaf,
+ 0xff, 0xfd, 0x28, 0x52, 0x6c, 0x12, 0x84, 0x9a, 0xd4, 0xb6, 0x4c, 0x9b, 0xdb,
+ 0x2a, 0xf7, 0x8c, 0x7d, 0x93, 0xb9,
+ ],
+ [
+ 0x1f, 0x47, 0x25, 0xfd, 0x3a, 0x34, 0x91, 0xf6, 0x46, 0x8e, 0x05, 0xad, 0xeb,
+ 0x19, 0x34, 0x0b, 0x77, 0x16, 0xec, 0xf1, 0x8d, 0xfd, 0xf8, 0x3d, 0x64, 0xcb,
+ 0x43, 0xf4, 0xe9, 0xfb, 0xde, 0x78, 0xfd, 0x5b, 0x0b, 0xcf, 0xcb, 0x1b, 0x55,
+ 0x52, 0x67, 0xe0, 0x39, 0x08, 0x07, 0x00, 0x7a, 0x6a,
+ ],
+ [
+ 0xff, 0xac, 0xcc, 0xc4, 0x5d, 0x2e, 0xac, 0x44, 0xb2, 0x00, 0xe8, 0x5d, 0xe9,
+ 0xcc, 0xab, 0x34, 0x25, 0x33, 0x35, 0x02, 0x2c, 0x6d, 0x4f, 0x9f, 0x8f, 0x44,
+ 0x80, 0xb5, 0x1d, 0x96, 0x0d, 0xb9, 0xdc, 0xc9, 0x87, 0x87, 0x90, 0x5c, 0xb4,
+ 0x99, 0x2d, 0xd9, 0x27, 0xe6, 0x2b, 0x44, 0x4d, 0xf7, 0x4a, 0x09, 0xd3, 0x96,
+ 0x2c, 0x56, 0xd5, 0xbe, 0x61, 0xd9, 0x66, 0x25, 0xcd, 0x5a, 0x15, 0xb4,
+ ]
+ ),
+ test_case!(
+ [
+ 0x02, 0xd3, 0xa6, 0xc6, 0x81, 0xfb, 0x18, 0x43, 0xf4, 0xf4, 0x43, 0xf8, 0x0b,
+ 0xd6, 0x9f, 0xda, 0x40, 0x8a, 0x16, 0xf8, 0x9e, 0x8c, 0x7f, 0xcd, 0x09, 0x05,
+ 0x49, 0x34, 0xe3, 0x4e, 0x88, 0xc7, 0x4d, 0xb3, 0x75, 0x14, 0x01, 0xa7, 0x24,
+ 0x53, 0xfd, 0x74, 0x8b, 0xc5, 0x29, 0x32, 0x1b, 0xd7, 0x7a, 0xe8, 0xcd, 0xb3,
+ 0x93, 0xfe, 0x08, 0xd2, 0x23, 0xd0, 0x7e, 0xfa, 0x42, 0xe0, 0x22, 0xd9, 0x07,
+ 0x13, 0x45, 0x44, 0xa7, 0xec, 0x16, 0x9a, 0x5e, 0x40, 0x23, 0xc9, 0xc6, 0x34,
+ 0x71, 0x85, 0x28, 0x19, 0x2c, 0xf2, 0xd5, 0xdf, 0xb9, 0xb4, 0x7a, 0x89, 0x80,
+ 0x84, 0x35, 0xb5, 0x45, 0x47, 0xff, 0x0d, 0xc1, 0x0d, 0xf7, 0x90, 0xb0, 0x74,
+ 0x34, 0x90, 0xf2, 0x60, 0x76, 0xdc, 0xd9, 0xc2, 0xfd, 0x9e, 0x3c, 0xbf, 0x6c,
+ 0xd1, 0xa0, 0x14, 0x7a, 0x51, 0xdb, 0x8a,
+ ],
+ [
+ 0x09, 0x96, 0x75, 0xe1, 0x79, 0xa2, 0xb8, 0x75, 0x8c, 0x75, 0x3c, 0x68, 0x22,
+ 0xdd, 0x3a, 0xaa, 0x65, 0x80, 0x02, 0xc6,
+ ],
+ [
+ 0x36, 0x64, 0xd4, 0xe4, 0xb5, 0x7d, 0x8a, 0xdc, 0x8d, 0x9c, 0x63, 0xc1, 0xd1,
+ 0xf4, 0xc4, 0x01, 0x2f, 0xaa, 0xcf, 0xc2, 0x1d, 0xc3, 0xc5, 0xed, 0x83, 0xd2,
+ 0x5f, 0xe3, 0xff, 0x18, 0x29, 0x03,
+ ],
+ [
+ 0x94, 0xfc, 0xb9, 0xb8, 0x0f, 0x81, 0xf4, 0x42, 0xf9, 0x34, 0xf7, 0xed, 0x5a,
+ 0xc0, 0x67, 0xa6, 0x77, 0x21, 0xbd, 0x72, 0x26, 0x2c, 0x98, 0xfd, 0x99, 0x48,
+ 0xe5, 0x19, 0xa2, 0xd2, 0xda, 0xc3, 0xf7, 0xe0, 0x13, 0xa5, 0x84, 0xeb, 0xa9,
+ 0x28, 0x38, 0x76, 0x8a, 0xa5, 0x7d, 0xdf, 0xd1, 0x23,
+ ],
+ [
+ 0x52, 0x1c, 0x97, 0xac, 0xc3, 0x0d, 0x13, 0x19, 0xcd, 0x3c, 0x10, 0x4c, 0x89,
+ 0x67, 0x49, 0x59, 0xad, 0x14, 0xbe, 0xc9, 0xf6, 0x46, 0xb8, 0xb6, 0x3b, 0x3d,
+ 0x29, 0xc8, 0x03, 0x00, 0x00, 0x6e, 0x5e, 0x41, 0x5d, 0xf8, 0xae, 0x2e, 0x4f,
+ 0x80, 0x6c, 0x0d, 0x8d, 0xe9, 0x65, 0x5a, 0xba, 0x13, 0x89, 0xc1, 0xc5, 0x28,
+ 0x2b, 0x0b, 0x42, 0x34, 0xab, 0x3f, 0x6c, 0xba, 0x3e, 0x71, 0x30, 0x5e,
+ ]
+ ),
+ test_case!(
+ [
+ 0x52, 0x71, 0x17, 0x1e, 0xa3, 0x8b, 0xe0, 0x4c, 0x92, 0xe6, 0xf5, 0x6e, 0xe4,
+ 0xf5, 0xab, 0xc4, 0x94, 0x29, 0x9b, 0xa6, 0x09, 0x44, 0x5e, 0xe0, 0x54, 0x3f,
+ 0x1d, 0xa8, 0x67, 0xe6, 0xb7, 0x94, 0x9d, 0x32, 0x5f, 0x40, 0x56, 0x0e, 0x6a,
+ 0xfd, 0xab, 0x54, 0xb2, 0x26, 0xae, 0xa0, 0xe7, 0x02, 0x78, 0x7b, 0x4c, 0xf4,
+ 0x88, 0xe6, 0x96, 0xe0, 0x91, 0xa9, 0x1f, 0xb8, 0x8f, 0x2e, 0x63, 0xd3, 0xe4,
+ 0x9f, 0xdf, 0xdb, 0x69, 0x60, 0xd0, 0xb2, 0x32, 0x57, 0xa9, 0x13, 0xc0, 0x1c,
+ 0x7a, 0x89, 0x2f, 0x6d, 0x3c, 0x27, 0x95, 0xae, 0x4b, 0x75, 0xb8, 0xdb, 0x97,
+ 0x6b, 0xf2, 0xea, 0x92, 0xfc, 0xb3, 0xf0, 0x57, 0xf8, 0x29, 0xcf, 0x49, 0x86,
+ 0x3a, 0xa3, 0x80, 0x9b, 0x60, 0x2f, 0xc3, 0xce, 0xe6, 0x3f, 0x18, 0x00, 0x20,
+ 0xf4, 0x48, 0x8e, 0x4a, 0xf2, 0xf3, 0x07, 0x2f,
+ ],
+ [
+ 0x37, 0x28, 0xa7, 0x30, 0x08, 0xfd, 0x65, 0xf8, 0xc9, 0xb3, 0x6c, 0x77, 0x7a,
+ 0xe3, 0x57, 0x5b, 0xd3, 0x96, 0x90, 0x0f,
+ ],
+ [
+ 0xfe, 0x48, 0xad, 0xe6, 0xea, 0xfe, 0x62, 0x31, 0xb6, 0x47, 0x90, 0x3e, 0x16,
+ 0xc5, 0xec, 0x5b, 0x1b, 0x97, 0x36, 0xd1, 0x8f, 0xc6, 0x5d, 0xb0, 0x08, 0xa5,
+ 0x7d, 0xe4, 0xbd, 0x8c, 0x69, 0x83,
+ ],
+ [
+ 0x7d, 0xea, 0x9e, 0xa0, 0x7a, 0x8c, 0xc7, 0x0f, 0x7f, 0x29, 0xfb, 0xfa, 0x76,
+ 0xf2, 0x3e, 0x59, 0xc0, 0xd0, 0x51, 0xa6, 0x5b, 0x6f, 0x54, 0x4e, 0x6b, 0x2e,
+ 0xc8, 0x4c, 0x12, 0x69, 0x1e, 0x3e, 0x10, 0x48, 0x88, 0xbb, 0x23, 0x13, 0xae,
+ 0xd4, 0xfd, 0x7b, 0x0c, 0x4a, 0x97, 0xbd, 0xd7, 0x0d,
+ ],
+ [
+ 0x26, 0xd5, 0xab, 0x59, 0x27, 0x26, 0xa4, 0x6a, 0x3f, 0x68, 0xb3, 0xeb, 0xb6,
+ 0x56, 0xf5, 0x86, 0xb7, 0xa1, 0x83, 0x45, 0xc0, 0xd6, 0x70, 0xc0, 0x53, 0x93,
+ 0x97, 0x3b, 0xbe, 0x31, 0x68, 0x12, 0x5e, 0xcf, 0x81, 0xeb, 0x9f, 0xad, 0x05,
+ 0xba, 0x6a, 0x71, 0xb4, 0x3f, 0xc6, 0x37, 0x37, 0xda, 0x8a, 0xfd, 0x72, 0xc7,
+ 0x64, 0xdd, 0xc8, 0x03, 0x6c, 0x2c, 0xe5, 0x6c, 0x31, 0x96, 0x43, 0x4c,
+ ]
+ ),
+ test_case!(
+ [
+ 0xa2, 0x1f, 0x1d, 0xbf, 0xa8, 0x19, 0xdc, 0x26, 0x18, 0x5c, 0x30, 0x7c, 0x04,
+ 0xb0, 0x24, 0x95, 0xc3, 0x2c, 0x0b, 0x28, 0xc5, 0xe4, 0xad, 0x7e, 0x0c, 0xf5,
+ 0x17, 0x8c, 0xd8, 0x3c, 0xe7, 0xf7, 0xa2, 0x4a, 0x11, 0x50, 0xac, 0x0b, 0x76,
+ 0x37, 0xfb, 0x14, 0x59, 0x50, 0x66, 0x76, 0x8d, 0x32, 0x68, 0xff, 0x06, 0x82,
+ 0xa4, 0xed, 0x19, 0x74, 0x2a, 0x49, 0x1e, 0xa4, 0xe1, 0x04, 0x85, 0xad, 0x9c,
+ 0xcf, 0x4b, 0x7c, 0x18, 0x76, 0x0d, 0xda, 0xbb, 0x27, 0x4f, 0xdd, 0x29, 0x5d,
+ 0xc7, 0xe8, 0x45, 0x47, 0x7c, 0xe4, 0x6f, 0xb8, 0x1f, 0xc1, 0xb1, 0x9b, 0x5d,
+ 0x83, 0x40, 0x75, 0xf6, 0x97, 0x11, 0x06, 0xd4, 0x03, 0x9f, 0x8b, 0x46, 0x0a,
+ 0xe9, 0xdd, 0xcc, 0x73, 0xa9, 0x26, 0xec, 0x06, 0x82, 0xa1, 0x2f, 0xc1, 0x9e,
+ 0xbe, 0x81, 0x92, 0x75, 0x6e, 0x00, 0x10, 0x3d, 0x0c,
+ ],
+ [
+ 0x2e, 0x19, 0xba, 0x7d, 0x5f, 0x43, 0x6f, 0x2c, 0x78, 0x46, 0x0d, 0x60, 0xa3,
+ 0x4b, 0x44, 0xb5, 0x82, 0x94, 0x98, 0xfc,
+ ],
+ [
+ 0xa1, 0x7b, 0xe9, 0xb2, 0x58, 0xb1, 0xe0, 0xa0, 0xb4, 0xa0, 0x53, 0x84, 0x8e,
+ 0x25, 0xb0, 0xf1, 0xbd, 0x30, 0x7f, 0x66, 0x4c, 0x99, 0xbf, 0xaf, 0x5b, 0x2d,
+ 0x82, 0x8b, 0xef, 0x08, 0x4e, 0x2d,
+ ],
+ [
+ 0x01, 0xd0, 0x3c, 0xf8, 0xe7, 0x90, 0x54, 0x62, 0x95, 0xef, 0xc3, 0x35, 0x6a,
+ 0x9f, 0x6b, 0x49, 0x9c, 0x3a, 0x44, 0x5e, 0xa6, 0x62, 0x21, 0x81, 0xd7, 0xae,
+ 0xad, 0xba, 0xd3, 0x20, 0x97, 0xa3, 0xc2, 0xbb, 0x26, 0xa7, 0x80, 0x73, 0xc6,
+ 0xb0, 0x78, 0xf1, 0x4b, 0x9f, 0xbc, 0xe8, 0x69, 0x77,
+ ],
+ [
+ 0x91, 0x5f, 0x90, 0xe3, 0x8d, 0x1f, 0xa0, 0xf6, 0x53, 0x71, 0x7c, 0x05, 0x9d,
+ 0x85, 0x50, 0xf3, 0x59, 0xe4, 0xaa, 0x98, 0x59, 0x33, 0x59, 0x30, 0x7e, 0x56,
+ 0x00, 0x93, 0xa4, 0xf1, 0xb5, 0x05, 0x0d, 0xad, 0xb6, 0xdf, 0x7e, 0xea, 0x32,
+ 0xb9, 0xfb, 0xd2, 0x48, 0x2f, 0x1d, 0xc8, 0x98, 0x3b, 0x51, 0xe2, 0xdb, 0x88,
+ 0xf5, 0x61, 0xcf, 0x3d, 0x85, 0x6f, 0x6f, 0xfc, 0x50, 0x35, 0x4c, 0xc4,
+ ]
+ ),
+ test_case!(
+ [
+ 0x11, 0xf6, 0x3f, 0x5c, 0x17, 0x7b, 0x67, 0x52, 0x23, 0x61, 0x77, 0x79, 0xef,
+ 0x95, 0xf6, 0xe1, 0xca, 0x73, 0xbf, 0x4f, 0xe9, 0xd1, 0x00, 0x37, 0xc0, 0x23,
+ 0x2f, 0x85, 0xb8, 0xb6, 0xa0, 0x54, 0x83, 0x36, 0x02, 0xe3, 0xb5, 0x7b, 0xc3,
+ 0x9c, 0x72, 0xc4, 0x4b, 0x90, 0x64, 0x46, 0x63, 0xa5, 0x6a, 0x76, 0x5e, 0x9a,
+ 0x78, 0xeb, 0xa1, 0x1b, 0x94, 0xde, 0x9a, 0x35, 0x29, 0x61, 0x3f, 0x76, 0xb9,
+ 0xdf, 0x8e, 0x49, 0x47, 0xe4, 0x0c, 0xd4, 0xcc, 0x5e, 0xda, 0x97, 0xda, 0x89,
+ 0xcd, 0xe6, 0x9e, 0x43, 0x58, 0x1b, 0x15, 0x0d, 0x5a, 0x3a, 0xe8, 0xdd, 0x71,
+ 0xa9, 0xbe, 0x0c, 0x10, 0xea, 0x95, 0xc2, 0x45, 0x72, 0xdf, 0xf0, 0xb6, 0xf2,
+ 0xb1, 0x2d, 0x80, 0xe0, 0x08, 0x54, 0xc9, 0x54, 0xdf, 0xb7, 0x40, 0xb2, 0x3b,
+ 0x67, 0xa2, 0x61, 0x08, 0x78, 0x1e, 0x46, 0xfe, 0x1a, 0x5a,
+ ],
+ [
+ 0xd7, 0x7a, 0xd5, 0xf6, 0xf9, 0xb6, 0xff, 0xd6, 0x41, 0x81, 0x23, 0xa3, 0xa3,
+ 0xcd, 0x4c, 0x43, 0x3b, 0x65, 0x62, 0xe7,
+ ],
+ [
+ 0xbc, 0xaf, 0xe5, 0x98, 0x2f, 0x9d, 0x5b, 0xf6, 0x33, 0x40, 0x37, 0xbc, 0x64,
+ 0x7e, 0x34, 0x59, 0xf9, 0xcf, 0x91, 0xb3, 0x87, 0xd8, 0x8c, 0x20, 0x69, 0x93,
+ 0x5b, 0xb5, 0x86, 0x55, 0x4c, 0x39,
+ ],
+ [
+ 0xa7, 0x8f, 0xd1, 0xbd, 0xf8, 0x42, 0x56, 0x3d, 0x3d, 0xcc, 0xe2, 0x17, 0x29,
+ 0x80, 0xf6, 0x3d, 0xa7, 0x13, 0x28, 0x2e, 0x26, 0xe1, 0x06, 0x92, 0x1f, 0x24,
+ 0x45, 0xfb, 0x11, 0x84, 0xb0, 0xe8, 0x2c, 0xc0, 0xb5, 0xec, 0xd9, 0xdb, 0x56,
+ 0xa8, 0x7d, 0x34, 0x0d, 0x31, 0xf3, 0x63, 0xa0, 0x31,
+ ],
+ [
+ 0xd5, 0x7c, 0xc3, 0xf0, 0x6b, 0x67, 0xc9, 0x0b, 0x56, 0x50, 0x3d, 0x47, 0xfa,
+ 0x14, 0xf3, 0xac, 0xca, 0xb1, 0xb6, 0xa0, 0x15, 0xc6, 0x1f, 0x38, 0x53, 0x5f,
+ 0xec, 0xd7, 0x2b, 0x3c, 0x0a, 0x45, 0xa7, 0x6d, 0x17, 0xe1, 0x66, 0x76, 0xcd,
+ 0xd1, 0x68, 0x9c, 0x5a, 0xed, 0xe3, 0x85, 0x57, 0xc9, 0xb7, 0xd4, 0x84, 0x7a,
+ 0x70, 0x0d, 0x4c, 0xaa, 0x58, 0xdc, 0xea, 0xf1, 0x6c, 0xd9, 0xfe, 0x81,
+ ]
+ ),
+ test_case!(
+ [
+ 0x5e, 0x94, 0x43, 0x8d, 0xa3, 0x9d, 0x5b, 0xfc, 0xcc, 0x3c, 0x68, 0xfb, 0xe7,
+ 0x50, 0xba, 0x4e, 0x15, 0x6f, 0x7a, 0xd6, 0xf0, 0x16, 0xaa, 0xda, 0xd2, 0x95,
+ 0xc7, 0x2f, 0x17, 0x7f, 0x3f, 0xae, 0xa5, 0x09, 0x19, 0x50, 0x97, 0x33, 0x1e,
+ 0x75, 0x3d, 0xa2, 0x37, 0x3b, 0x05, 0x46, 0xc1, 0xa8, 0x38, 0xa1, 0x44, 0xcd,
+ 0xf8, 0x4b, 0x8c, 0x55, 0xda, 0x6a, 0x24, 0xf0, 0xba, 0x57, 0xc8, 0xfb, 0x4c,
+ 0x9a, 0xe3, 0x90, 0xf7, 0x72, 0xe7, 0x52, 0x0f, 0x30, 0x7b, 0xc1, 0x21, 0x7d,
+ 0xce, 0xa9, 0x03, 0x72, 0x58, 0x3a, 0x69, 0x16, 0xa8, 0x06, 0xc7, 0x54, 0x0a,
+ 0xd9, 0xe8, 0x24, 0x62, 0xca, 0x70, 0x6c, 0x83, 0xa0, 0x38, 0x4a, 0xbb, 0x64,
+ 0x93, 0x7a, 0x4a, 0xad, 0xf3, 0x4f, 0x69, 0xc6, 0xa0, 0x79, 0x46, 0x36, 0x89,
+ 0xbc, 0x20, 0x97, 0xd8, 0x39, 0x72, 0x80, 0x48, 0x3a, 0xb2, 0x02,
+ ],
+ [
+ 0x9a, 0xe9, 0x8b, 0xe9, 0xf1, 0x3a, 0x2e, 0xe0, 0x83, 0x5d, 0x8c, 0x53, 0xd2,
+ 0xcf, 0xe3, 0x27, 0xb9, 0x08, 0x1d, 0xc7,
+ ],
+ [
+ 0x1c, 0xf3, 0x32, 0x90, 0x6d, 0x9e, 0x0f, 0x30, 0x81, 0x75, 0xf5, 0xbc, 0x7d,
+ 0xcc, 0xd4, 0x79, 0xa1, 0xf2, 0xfc, 0xfb, 0xc6, 0xf2, 0x40, 0xb0, 0x41, 0xb9,
+ 0xa0, 0x60, 0x98, 0x24, 0x7d, 0x96,
+ ],
+ [
+ 0x5c, 0xb0, 0x2f, 0xff, 0x06, 0x0b, 0xbc, 0x64, 0x8b, 0x8b, 0x8f, 0x47, 0x26,
+ 0x8c, 0x82, 0xfd, 0x70, 0x0d, 0x9e, 0x53, 0xf2, 0x08, 0x3b, 0x56, 0xb1, 0x26,
+ 0xa2, 0x98, 0x68, 0x80, 0xd7, 0x4f, 0x53, 0xf5, 0x57, 0x87, 0x12, 0x3d, 0xcc,
+ 0xfd, 0xe0, 0x69, 0x27, 0x08, 0x84, 0xb3, 0x3c, 0x41,
+ ],
+ [
+ 0x6b, 0xb5, 0xb1, 0xcc, 0xa3, 0x0e, 0xa2, 0xdf, 0x18, 0x4f, 0x25, 0x61, 0xae,
+ 0xfa, 0x1c, 0x1d, 0x19, 0xb6, 0x9b, 0x33, 0xf9, 0xa6, 0xfd, 0x96, 0xc3, 0xd7,
+ 0x06, 0xb0, 0x82, 0x32, 0xa1, 0xba, 0x49, 0xbc, 0xda, 0xdb, 0x02, 0x2d, 0xbf,
+ 0x4c, 0xf6, 0x20, 0xab, 0x41, 0xd1, 0xbe, 0x75, 0xbf, 0xab, 0xbb, 0xd9, 0x54,
+ 0x11, 0x24, 0x87, 0xb5, 0xbe, 0x57, 0xbd, 0xca, 0xd8, 0xa9, 0x22, 0x6c,
+ ]
+ ),
+ ];
+ }
+}
diff --git a/src/hmac.rs b/src/hmac.rs
new file mode 100644
index 0000000..2a32cf5
--- /dev/null
+++ b/src/hmac.rs
@@ -0,0 +1,4220 @@
+// Copyright 2018 Google LLC
+//
+// Use of this source code is governed by an MIT-style
+// license that can be found in the LICENSE file or at
+// https://opensource.org/licenses/MIT.
+
+//! Hash-based Message Authentication Codes (HMACs).
+
+use std::fmt::{self, Debug, Formatter};
+use std::marker::PhantomData;
+
+use boringssl::{self, CStackWrapper};
+use hash::{inner::Digest, Hasher, Sha256, Sha384, Sha512};
+
+/// A Hash-based Message Authentication Code (HMAC).
+///
+/// `Hmac` is an HMAC over the hash function `H`.
+#[must_use]
+pub struct Hmac<H: Hasher> {
+ ctx: CStackWrapper<boringssl::HMAC_CTX>,
+ _marker: PhantomData<H>,
+}
+
+impl<H: Hasher> Hmac<H> {
+ /// Constructs a new HMAC.
+ #[must_use]
+ pub fn new(key: &[u8]) -> Hmac<H> {
+ // TODO(joshlf): Do we want to put any constraints on what constitutes a
+ // valid key?
+ Hmac {
+ // hmac_ctx_new can only fail due to OOM
+ ctx: CStackWrapper::hmac_ctx_new(key, &H::evp_md()).unwrap(),
+ _marker: PhantomData,
+ }
+ }
+
+ /// Adds bytes to the HMAC.
+ pub fn update(&mut self, bytes: &[u8]) {
+ self.ctx.hmac_update(bytes);
+ }
+
+ /// Returns the HMAC of the bytes added so far.
+ #[must_use]
+ pub fn finish(mut self) -> H::Digest {
+ let mut out = H::Digest::zero();
+ self.ctx.hmac_final(out.as_mut());
+ out
+ }
+}
+
+impl<H: Hasher> Debug for Hmac<H> {
+ fn fmt(&self, f: &mut Formatter) -> Result<(), fmt::Error> {
+ write!(f, "Hmac")
+ }
+}
+
+/// HMAC-SHA256.
+pub type HmacSha256 = Hmac<Sha256>;
+/// HMAC-SHA384.
+pub type HmacSha384 = Hmac<Sha384>;
+/// HMAC-SHA512.
+pub type HmacSha512 = Hmac<Sha512>;
+
+/// Computes the HMAC of a sequence of bytes under a key.
+///
+/// `hmac` creates a new instance of `Hmac<H>` using the key `key`, adds `bytes`
+/// to it, and then computes the HMAC.
+#[must_use]
+pub fn hmac<H: Hasher>(key: &[u8], bytes: &[u8]) -> H::Digest {
+ let mut hmac = Hmac::<H>::new(key);
+ hmac.update(bytes);
+ hmac.finish()
+}
+
+#[cfg(feature = "insecure")]
+pub(crate) mod insecure_hmac_sha1 {
+ #[allow(deprecated)]
+ use hash::{insecure_sha1_digest::InsecureSha1Digest, InsecureSha1};
+ use hmac::Hmac;
+
+ // NOTE(joshlf): It's important that InsecureHmacSha1 is a new type rather
+ // than a type alias for Hmac<Sha1>. If it were the latter, then client code
+ // could use this to coax a type parameter into taking on the type Sha1, and
+ // could thus construct SHA-1 hashes directly, which we explicitly wish to
+ // avoid.
+
+ /// INSECURE: The Hash-based Message Authentication Code (HMAC) over SHA-1.
+ ///
+ /// # Security
+ ///
+ /// HMAC-SHA1 is considered insecure, and should only be used for compatibility
+ /// with legacy applications.
+ #[deprecated(note = "HMAC-SHA1 is considered insecure")]
+ pub struct InsecureHmacSha1 {
+ #[allow(deprecated)]
+ hmac: Hmac<InsecureSha1>,
+ }
+
+ #[allow(deprecated)]
+ impl InsecureHmacSha1 {
+ /// INSECURE: Constructs a new HMAC-SHA1.
+ ///
+ /// # Security
+ ///
+ /// HMAC-SHA1 is considered insecure, and should only be used for
+ /// compatibility with legacy applications.
+ #[must_use]
+ #[deprecated(note = "HMAC-SHA1 is considered insecure")]
+ pub fn insecure_new(key: &[u8]) -> InsecureHmacSha1 {
+ InsecureHmacSha1 {
+ hmac: Hmac::new(key),
+ }
+ }
+
+ /// INSECURE: Adds bytes to the HMAC-SHA1.
+ ///
+ /// # Security
+ ///
+ /// HMAC-SHA1 is considered insecure, and should only be used for
+ /// compatibility with legacy applications.
+ #[must_use]
+ #[deprecated(note = "HMAC-SHA1 is considered insecure")]
+ pub fn insecure_update(&mut self, bytes: &[u8]) {
+ self.hmac.update(bytes);
+ }
+
+ /// INSECURE: Returns the HMAC-SHA1 of the bytes added so far.
+ ///
+ /// # Security
+ ///
+ /// HMAC-SHA1 is considered insecure, and should only be used for
+ /// compatibility with legacy applications.
+ #[must_use]
+ #[deprecated(note = "HMAC-SHA1 is considered insecure")]
+ pub fn insecure_finish(self) -> InsecureSha1Digest {
+ self.hmac.finish()
+ }
+ }
+}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+ #[cfg(feature = "insecure")]
+ #[allow(deprecated)]
+ use hash::insecure_sha1_digest::InsecureSha1Digest;
+ use hash::*;
+
+ #[test]
+ fn test_hmac() {
+ struct TestCase {
+ input: &'static [u8],
+ #[cfg(feature = "insecure")]
+ #[allow(deprecated)]
+ sha1: <InsecureSha1 as Hasher>::Digest,
+ sha256: <Sha256 as Hasher>::Digest,
+ sha384: <Sha384 as Hasher>::Digest,
+ sha512: <Sha512 as Hasher>::Digest,
+ }
+
+ for case in TEST_CASES.iter() {
+ fn test<H: Hasher>(input: &'static [u8], digest: &H::Digest) {
+ assert_eq!(&hmac::<H>(TEST_KEY, input), digest, "input: {:?}", input);
+ // Test that adding bytes incrementally works too.
+ let mut hmac = Hmac::<H>::new(TEST_KEY);
+ for b in input {
+ hmac.update(&[*b]);
+ }
+ assert_eq!(&hmac.finish(), digest, "input: {:?}", input);
+ }
+ #[cfg(feature = "insecure")]
+ #[allow(deprecated)]
+ test::<InsecureSha1>(case.input, &case.sha1);
+ test::<Sha256>(case.input, &case.sha256);
+ test::<Sha384>(case.input, &case.sha384);
+ test::<Sha512>(case.input, &case.sha512);
+ }
+
+ macro_rules! test_case {
+ ($input:expr, $sha1:expr, $sha256:expr, $sha384:expr, $sha512:expr) => {
+ #[allow(deprecated)]
+ TestCase {
+ input: &$input,
+ #[cfg(feature = "insecure")]
+ sha1: InsecureSha1Digest($sha1),
+ sha256: Sha256Digest($sha256),
+ sha384: Sha384Digest($sha384),
+ sha512: Sha512Digest($sha512),
+ }
+ };
+ }
+
+ // These test cases were generated using the following script. Each is a
+ // randomly-generated input, with each length between 1 and 128 bytes
+ // represented. The constant key "1482318330" is used.
+ //
+ // # Generate 10000 bytes/20000 hex characters of random data
+ // function rand { dd if=/dev/urandom bs=1 count=10000 | hexdump -ve '1/1 "%.2x"'; }
+ //
+ // # Convert hex to raw bytes
+ // function hex_to_bytes { perl -pe 's/([0-9a-f]{2})/chr hex $1/gie'; }
+ //
+ // # Convert hex to a Rust array
+ // function hex_to_array { echo -n "["; while read -n 2 c; do echo -n "0x${c},";
+ // done; echo "]"; }
+ //
+ // # Usage: hmac <input-hex> <hash>
+ // function hmac { echo -n $(echo -n "$1" | hex_to_bytes | openssl dgst "-${2}" \
+ // -hmac 1482318330 | cut -d ' ' -f 1) | hex_to_array; }
+ //
+ // # Only even numbers of hex characters
+ // for i in `seq 2 2 256`; do
+ // INPUT=$(rand 2>/dev/null | head -c $i);
+ // echo 'test_case!'"($(echo -n ${INPUT} | hex_to_array), $(hash ${INPUT} 1), \
+ // $(hash ${INPUT} 256), $(hash ${INPUT} 384), $(hash ${INPUT} 512)),";
+ // done
+
+ const TEST_KEY: &[u8] = b"1482318330";
+
+ const TEST_CASES: &[TestCase] = &[
+ test_case!(
+ [0x23,],
+ [
+ 0x30, 0xac, 0xcf, 0x23, 0x2c, 0x40, 0x44, 0x84, 0xaf, 0x03, 0xc7, 0x62, 0xb9,
+ 0x28, 0x90, 0x50, 0x39, 0x23, 0x80, 0x30,
+ ],
+ [
+ 0x4a, 0xb9, 0xf8, 0x04, 0xa0, 0x53, 0x6f, 0x10, 0x36, 0xe6, 0x76, 0x93, 0x6c,
+ 0xea, 0x6f, 0x4d, 0x0c, 0xe4, 0x27, 0x88, 0x45, 0x06, 0x3a, 0x88, 0x92, 0x95,
+ 0x5f, 0x15, 0x9d, 0x89, 0x37, 0x88,
+ ],
+ [
+ 0xea, 0xc0, 0xf9, 0x95, 0xca, 0x06, 0x14, 0xd2, 0xc5, 0x0b, 0x7c, 0x82, 0xd0,
+ 0xfd, 0x81, 0x16, 0x8e, 0x05, 0xdd, 0x2b, 0xe4, 0xf8, 0x16, 0xd7, 0xa7, 0x77,
+ 0xaa, 0xf1, 0x5f, 0x40, 0xb3, 0xf0, 0xa3, 0x51, 0x48, 0x38, 0x2d, 0x24, 0x1f,
+ 0x65, 0x8f, 0x11, 0x43, 0x06, 0xf0, 0x8c, 0x67, 0x5d,
+ ],
+ [
+ 0x8d, 0x58, 0x3f, 0xeb, 0x28, 0x38, 0x9c, 0xb2, 0xf6, 0x03, 0xbe, 0x8c, 0x26,
+ 0xa8, 0x7d, 0x44, 0x69, 0x8b, 0xe0, 0x81, 0x74, 0x53, 0x7f, 0xbf, 0x73, 0xa3,
+ 0x0f, 0xfd, 0x5a, 0x50, 0x4d, 0x3b, 0x45, 0xf8, 0x65, 0x5d, 0xdc, 0x40, 0x4d,
+ 0xa4, 0xf3, 0xb5, 0x06, 0x52, 0x36, 0x48, 0x36, 0xa6, 0x61, 0x77, 0x45, 0x31,
+ 0x11, 0x14, 0xb1, 0x05, 0xe3, 0xca, 0x4a, 0x4c, 0x10, 0x7e, 0xf7, 0xdc,
+ ]
+ ),
+ test_case!(
+ [0xbd, 0xcb,],
+ [
+ 0x89, 0x5d, 0xc2, 0xaf, 0x01, 0xbf, 0x7b, 0xa4, 0x35, 0x8c, 0x64, 0xaf, 0x66,
+ 0xc1, 0x74, 0x34, 0x98, 0x57, 0x41, 0xb6,
+ ],
+ [
+ 0xdd, 0x4b, 0x13, 0x72, 0x7d, 0x33, 0x53, 0x5f, 0xe7, 0x1c, 0x42, 0x1c, 0x3d,
+ 0xae, 0xf9, 0x86, 0x98, 0x01, 0x06, 0xfe, 0xf8, 0x71, 0x71, 0xd5, 0xfb, 0x2c,
+ 0xe7, 0x43, 0x88, 0x0a, 0x90, 0x32,
+ ],
+ [
+ 0x0f, 0xdc, 0x20, 0x3d, 0x8c, 0xca, 0xea, 0xb1, 0x94, 0x7e, 0x86, 0x0c, 0x49,
+ 0xfe, 0x83, 0xe2, 0x71, 0x20, 0xf3, 0x5a, 0x29, 0x3c, 0xbb, 0xa5, 0x94, 0x83,
+ 0x76, 0x3d, 0x76, 0x28, 0x23, 0x48, 0xcd, 0x41, 0xb2, 0x19, 0x79, 0x38, 0x66,
+ 0x1c, 0xe4, 0x49, 0xe0, 0x2f, 0x31, 0x1c, 0x06, 0x1d,
+ ],
+ [
+ 0xa2, 0x02, 0x5d, 0x9f, 0xaa, 0x17, 0x2d, 0xdc, 0xe0, 0xd6, 0xd7, 0xf8, 0x38,
+ 0x27, 0x79, 0x02, 0x1c, 0x96, 0xe7, 0xdb, 0xf7, 0x34, 0x61, 0x9f, 0x59, 0xdb,
+ 0xca, 0x05, 0x1d, 0x2c, 0xe9, 0x61, 0x5b, 0xe0, 0xc8, 0x3d, 0x21, 0x2e, 0x07,
+ 0xc6, 0x64, 0x1a, 0xb4, 0xff, 0xd8, 0x85, 0xb4, 0xaf, 0x00, 0x36, 0x4d, 0x8a,
+ 0x50, 0x29, 0x7d, 0xc8, 0x57, 0x08, 0x99, 0xb8, 0x39, 0x3d, 0xc0, 0x3d,
+ ]
+ ),
+ test_case!(
+ [0x2d, 0xfb, 0xa3,],
+ [
+ 0x95, 0x0d, 0xeb, 0xd1, 0x73, 0x6d, 0x4e, 0x81, 0xd3, 0x55, 0x48, 0x4d, 0xba,
+ 0x76, 0xad, 0x38, 0x21, 0xa1, 0x1b, 0x39,
+ ],
+ [
+ 0x11, 0xba, 0x3b, 0x67, 0x72, 0x41, 0x3b, 0x86, 0x01, 0x34, 0x82, 0x3a, 0xb7,
+ 0xdd, 0xa7, 0xc2, 0xd7, 0xa1, 0x95, 0xd5, 0x7a, 0xba, 0xc8, 0xe0, 0xeb, 0xbe,
+ 0xac, 0x81, 0x9d, 0x2d, 0x96, 0xd5,
+ ],
+ [
+ 0x31, 0x4f, 0xff, 0x7e, 0x9f, 0xb8, 0xcc, 0x0e, 0x0f, 0xeb, 0xb6, 0xbe, 0xb5,
+ 0xd4, 0x9c, 0xf7, 0x59, 0x95, 0x61, 0xc7, 0xa9, 0xcd, 0x69, 0x0e, 0xa2, 0xbd,
+ 0x63, 0xad, 0x22, 0x54, 0x86, 0x7c, 0xd8, 0x32, 0xfc, 0x76, 0x12, 0xd4, 0xa3,
+ 0x11, 0x97, 0x24, 0xe9, 0xa9, 0xb0, 0x21, 0xc4, 0x16,
+ ],
+ [
+ 0xd5, 0x6d, 0x41, 0xc0, 0x89, 0xaa, 0x77, 0x64, 0x32, 0xe5, 0x9d, 0xec, 0x92,
+ 0xf2, 0xf6, 0x9e, 0x8c, 0x1f, 0xe4, 0xea, 0xd1, 0x36, 0xa7, 0x3f, 0x89, 0x5f,
+ 0xee, 0xde, 0x5c, 0xdf, 0x3a, 0xb8, 0xe8, 0xe3, 0xfe, 0xd5, 0x4e, 0x37, 0xe0,
+ 0x01, 0xb7, 0xba, 0x17, 0x27, 0xb2, 0x51, 0x73, 0x40, 0x9e, 0x94, 0xd2, 0x0e,
+ 0x38, 0x99, 0x8c, 0x67, 0x8a, 0xaf, 0x9d, 0xb3, 0x79, 0xd9, 0xb1, 0xa9,
+ ]
+ ),
+ test_case!(
+ [0x37, 0x6e, 0xf5, 0x7a,],
+ [
+ 0x14, 0xb0, 0x4a, 0x22, 0x21, 0xbf, 0x4f, 0xb1, 0x87, 0x25, 0x2f, 0xa4, 0xee,
+ 0x52, 0xd7, 0x11, 0x70, 0x64, 0x74, 0xc1,
+ ],
+ [
+ 0xa0, 0xbf, 0x6e, 0x1d, 0x18, 0x05, 0xfa, 0x54, 0x61, 0xed, 0xd6, 0x13, 0xc6,
+ 0xa9, 0x15, 0x92, 0xf0, 0xca, 0x57, 0x61, 0xa9, 0x06, 0x8e, 0x92, 0x0f, 0x01,
+ 0x0a, 0xd6, 0x0b, 0x86, 0x19, 0x17,
+ ],
+ [
+ 0x14, 0x06, 0x7b, 0x95, 0xe3, 0xc6, 0x9f, 0x9d, 0x37, 0xe8, 0x16, 0x83, 0xcd,
+ 0x27, 0x66, 0x21, 0x0e, 0x18, 0x88, 0x76, 0x82, 0x13, 0xdb, 0x94, 0xd5, 0x97,
+ 0x88, 0x02, 0x98, 0x4f, 0x05, 0x4f, 0xa2, 0x1b, 0x11, 0x11, 0xd0, 0x54, 0x3a,
+ 0x52, 0x4c, 0x3e, 0xaa, 0x03, 0x83, 0xea, 0xee, 0xd7,
+ ],
+ [
+ 0xf1, 0xbb, 0x54, 0x7f, 0xde, 0x14, 0x79, 0x3e, 0x99, 0x3b, 0x06, 0x02, 0xa3,
+ 0x32, 0x8c, 0x8e, 0x6c, 0xd5, 0xdd, 0x2e, 0xe3, 0xcb, 0xd8, 0x14, 0x0c, 0x43,
+ 0x37, 0x95, 0xa0, 0x4c, 0xa8, 0x27, 0x58, 0x7a, 0x48, 0x3f, 0xd7, 0xb9, 0x0b,
+ 0x8e, 0x28, 0x9b, 0x1c, 0x8d, 0xa6, 0xf4, 0x73, 0x75, 0x35, 0x9a, 0x2d, 0x8d,
+ 0x01, 0x83, 0xb1, 0x4a, 0x47, 0x90, 0x6a, 0xb6, 0xb3, 0x02, 0xc0, 0x29,
+ ]
+ ),
+ test_case!(
+ [0x09, 0x62, 0xe5, 0x5e, 0xd1,],
+ [
+ 0xe5, 0x12, 0x05, 0x77, 0xe0, 0x43, 0x43, 0x41, 0x29, 0xea, 0x5a, 0x04, 0x45,
+ 0xd1, 0xd2, 0xcc, 0x78, 0xd8, 0x25, 0xa9,
+ ],
+ [
+ 0x89, 0xa5, 0x0c, 0xd3, 0xda, 0xb7, 0x67, 0xbe, 0x05, 0xb7, 0xcb, 0xc7, 0xf6,
+ 0x07, 0xf0, 0x12, 0x86, 0x3d, 0x36, 0x4b, 0x04, 0x78, 0xda, 0x8e, 0x0f, 0x1d,
+ 0x61, 0x62, 0xab, 0x66, 0x72, 0x7f,
+ ],
+ [
+ 0xd1, 0x70, 0xe8, 0x76, 0xe9, 0x9b, 0x2b, 0x9d, 0x53, 0x24, 0x9d, 0x24, 0x65,
+ 0xab, 0x2e, 0x77, 0xe4, 0xbd, 0x8e, 0xcb, 0xa0, 0x0b, 0x03, 0xe8, 0xf0, 0x65,
+ 0x77, 0xff, 0xf9, 0x20, 0x14, 0xaa, 0xc5, 0x98, 0x7e, 0xd0, 0x3a, 0x93, 0x93,
+ 0x79, 0x13, 0x39, 0x6d, 0x78, 0xe8, 0x62, 0xf3, 0x47,
+ ],
+ [
+ 0xdf, 0x20, 0x2a, 0x4f, 0x13, 0xec, 0xa8, 0x01, 0x1d, 0xa3, 0xe6, 0x8a, 0x1e,
+ 0x1d, 0xf4, 0xf6, 0x6b, 0x70, 0x63, 0x1f, 0xbb, 0x2e, 0x1b, 0x1f, 0x46, 0x01,
+ 0xb6, 0xa2, 0x22, 0x90, 0x6a, 0x80, 0xe7, 0x10, 0xb7, 0xe0, 0xf6, 0xa2, 0xd6,
+ 0x76, 0x0b, 0xc3, 0xae, 0x0a, 0x90, 0xe3, 0xee, 0x39, 0xbb, 0x77, 0xad, 0x9d,
+ 0x81, 0x0a, 0xde, 0x8d, 0xbf, 0xea, 0x98, 0x88, 0xb9, 0xa2, 0xf4, 0x61,
+ ]
+ ),
+ test_case!(
+ [0xd9, 0xd4, 0xc3, 0x4b, 0x3a, 0xcb,],
+ [
+ 0x91, 0x62, 0xc5, 0xba, 0x27, 0xfa, 0x63, 0xe4, 0xec, 0x34, 0x37, 0xea, 0xd3,
+ 0x08, 0x06, 0xad, 0x0a, 0x19, 0x72, 0x7f,
+ ],
+ [
+ 0x5f, 0xd4, 0xc5, 0x4f, 0x7e, 0x6d, 0xca, 0x1e, 0x8f, 0x0c, 0x62, 0x08, 0x16,
+ 0xbf, 0x14, 0xd9, 0x7c, 0x1f, 0x16, 0x29, 0x5e, 0xaa, 0x08, 0x52, 0x59, 0xe9,
+ 0x6b, 0x1d, 0xe6, 0xe8, 0xea, 0x03,
+ ],
+ [
+ 0xb5, 0x6c, 0x7a, 0x32, 0xf2, 0xf8, 0x94, 0x8b, 0x7f, 0x35, 0xb8, 0x09, 0xec,
+ 0x99, 0x72, 0xd1, 0x58, 0x29, 0x69, 0xc9, 0x3c, 0xd8, 0x88, 0x8c, 0x06, 0xd5,
+ 0x7c, 0xf0, 0xee, 0x60, 0x7f, 0x91, 0x45, 0x99, 0x86, 0x31, 0x0a, 0xfa, 0x1c,
+ 0x1a, 0x3a, 0x09, 0x27, 0x0d, 0xbd, 0x90, 0xed, 0x28,
+ ],
+ [
+ 0x62, 0xa4, 0x1e, 0x8a, 0x8d, 0xe6, 0xb9, 0x9d, 0xce, 0xc6, 0x24, 0x7c, 0x3f,
+ 0xfc, 0x45, 0x94, 0x72, 0xdd, 0xdc, 0xdd, 0x94, 0xb8, 0x01, 0xa1, 0x02, 0x12,
+ 0xa9, 0x60, 0x6a, 0x10, 0x9b, 0xa6, 0xff, 0xaa, 0x83, 0x8f, 0x61, 0x1c, 0xc3,
+ 0x2d, 0xc9, 0xe2, 0xbc, 0xc2, 0x94, 0x80, 0x3f, 0x15, 0x23, 0xab, 0xa0, 0x59,
+ 0x59, 0x05, 0xf9, 0xc4, 0x50, 0xe6, 0xd3, 0x01, 0xb0, 0xee, 0x1c, 0x89,
+ ]
+ ),
+ test_case!(
+ [0x36, 0x72, 0xd4, 0x9a, 0x29, 0xbf, 0x1d,],
+ [
+ 0xc3, 0xb2, 0x4c, 0xfa, 0xeb, 0x2c, 0x76, 0x15, 0x94, 0xda, 0xb0, 0x10, 0x2f,
+ 0xa9, 0xbd, 0xad, 0x4b, 0x77, 0x04, 0xe1,
+ ],
+ [
+ 0x75, 0x6d, 0x7b, 0x06, 0x50, 0xdb, 0x5c, 0xc8, 0xa5, 0xdd, 0xd8, 0xf8, 0x77,
+ 0x35, 0x40, 0x9e, 0x7f, 0xd2, 0x39, 0x2b, 0x67, 0xcb, 0x38, 0x45, 0xb6, 0xc7,
+ 0xf3, 0x5b, 0xc1, 0x95, 0xc4, 0x53,
+ ],
+ [
+ 0x48, 0x86, 0x0a, 0xff, 0x63, 0x0b, 0x1c, 0x56, 0x50, 0x9f, 0x98, 0x03, 0xf0,
+ 0xb1, 0x5f, 0xca, 0x11, 0x05, 0xab, 0x38, 0x17, 0xd7, 0x27, 0x81, 0x01, 0x54,
+ 0x16, 0x95, 0x72, 0x3d, 0xba, 0x5f, 0x25, 0x42, 0xb6, 0x92, 0xf7, 0x8b, 0xf8,
+ 0xb8, 0xb2, 0x26, 0xe7, 0x4c, 0xf5, 0x4c, 0x6e, 0x74,
+ ],
+ [
+ 0xcc, 0xc4, 0x8c, 0x19, 0x96, 0xc1, 0xc4, 0x93, 0x99, 0x81, 0x3b, 0x0b, 0x2f,
+ 0x05, 0xd5, 0x5f, 0x8c, 0xa4, 0xf2, 0x27, 0x06, 0xd2, 0xa7, 0xdc, 0xb7, 0x7e,
+ 0xab, 0x14, 0xf7, 0x9c, 0x7e, 0x6e, 0xfc, 0x87, 0x9f, 0xd1, 0x17, 0x13, 0xa6,
+ 0xf6, 0xd8, 0x05, 0x22, 0x66, 0x7a, 0x35, 0xe7, 0x1f, 0x7a, 0xfc, 0x52, 0xf1,
+ 0x45, 0xb1, 0xab, 0x7f, 0x2b, 0x25, 0x64, 0xca, 0x8e, 0x19, 0x8b, 0x82,
+ ]
+ ),
+ test_case!(
+ [0x42, 0x2e, 0xa1, 0xe3, 0xf4, 0x36, 0x10, 0x7f,],
+ [
+ 0x30, 0xa1, 0x6c, 0x9c, 0xdd, 0xa3, 0xe5, 0xfc, 0x8f, 0x98, 0x50, 0xbc, 0xc4,
+ 0xe1, 0x74, 0x7d, 0x6e, 0x24, 0xd2, 0x8f,
+ ],
+ [
+ 0x19, 0xf4, 0xfb, 0xed, 0x7f, 0x6d, 0xb4, 0xb4, 0x89, 0x3c, 0xe3, 0x39, 0xa3,
+ 0x66, 0x8c, 0x5b, 0xf5, 0x3b, 0x12, 0xbd, 0xc6, 0x10, 0xd7, 0x24, 0x70, 0x75,
+ 0x43, 0xe2, 0xab, 0x1f, 0xf3, 0x90,
+ ],
+ [
+ 0x0c, 0x3a, 0xaa, 0x4f, 0x20, 0x7a, 0x15, 0x5f, 0x94, 0x54, 0x44, 0x77, 0x3c,
+ 0x2c, 0x65, 0x5a, 0xab, 0x09, 0x4b, 0xe8, 0xe5, 0xc9, 0x90, 0x3e, 0x9c, 0xe4,
+ 0x58, 0x7f, 0xc5, 0xfc, 0x17, 0x00, 0xad, 0xa8, 0x10, 0x68, 0xe5, 0x45, 0x4f,
+ 0xbd, 0x72, 0x86, 0x96, 0xd6, 0x24, 0x01, 0x80, 0x42,
+ ],
+ [
+ 0x49, 0x11, 0x12, 0xa6, 0x41, 0xa5, 0x21, 0x01, 0x17, 0x99, 0x9f, 0x47, 0xd9,
+ 0xc8, 0x7c, 0xce, 0x7d, 0xbc, 0x51, 0x1c, 0x0b, 0xf1, 0x1b, 0xdb, 0xc2, 0xce,
+ 0x3f, 0x11, 0x21, 0x58, 0x9b, 0xd9, 0xab, 0x02, 0x22, 0x23, 0x8c, 0x17, 0xb9,
+ 0x00, 0x98, 0x75, 0xa3, 0xba, 0x2a, 0xa7, 0x05, 0x34, 0xe0, 0x62, 0x63, 0x16,
+ 0x77, 0x8c, 0xb9, 0x4e, 0x9c, 0x31, 0x01, 0x1f, 0xa2, 0x9c, 0xd5, 0x75,
+ ]
+ ),
+ test_case!(
+ [0x0e, 0x12, 0x78, 0xd0, 0x02, 0x30, 0x0d, 0x41, 0x07,],
+ [
+ 0xd0, 0x60, 0x8e, 0x46, 0xde, 0xab, 0x56, 0x02, 0xf7, 0xaf, 0x62, 0x6d, 0xf7,
+ 0x37, 0x63, 0x87, 0xb1, 0x8c, 0x3c, 0xee,
+ ],
+ [
+ 0xb6, 0xf5, 0x6f, 0x8f, 0x3e, 0xef, 0x67, 0x41, 0x19, 0x93, 0x2f, 0x94, 0xe4,
+ 0xc1, 0x34, 0x9d, 0xa3, 0x2e, 0x22, 0x43, 0x7c, 0x5d, 0x8d, 0x36, 0xe1, 0x30,
+ 0xba, 0x23, 0x56, 0xe4, 0x17, 0xf8,
+ ],
+ [
+ 0x88, 0x1f, 0x55, 0x6b, 0xa1, 0xb7, 0x78, 0x57, 0x9c, 0x70, 0x20, 0x2a, 0x1c,
+ 0xb0, 0x7d, 0xfe, 0x50, 0x77, 0x5f, 0x1a, 0xef, 0x22, 0xa7, 0x19, 0xc7, 0xa4,
+ 0x20, 0xdb, 0x2a, 0x08, 0x5a, 0x19, 0x5d, 0x49, 0xd1, 0x7e, 0x62, 0x90, 0x3e,
+ 0x01, 0xd7, 0x8a, 0xb9, 0xc7, 0x78, 0x78, 0xac, 0xd3,
+ ],
+ [
+ 0x67, 0x50, 0xb1, 0x79, 0xc9, 0x99, 0x8e, 0x3e, 0xad, 0x7c, 0xdd, 0x1e, 0xaa,
+ 0xcc, 0x2c, 0xa6, 0xc7, 0x6d, 0x1d, 0x6c, 0x46, 0xeb, 0x42, 0x33, 0xda, 0x2e,
+ 0x41, 0xde, 0xf9, 0xcd, 0xb2, 0x20, 0xce, 0x0a, 0x6d, 0x4a, 0x9e, 0x0d, 0x77,
+ 0x1f, 0xab, 0xd2, 0x9d, 0xbc, 0x26, 0xc9, 0xbe, 0x9a, 0xe6, 0x61, 0x0a, 0xcf,
+ 0xac, 0x1d, 0x66, 0x02, 0x0a, 0x23, 0x29, 0xcc, 0x98, 0xff, 0x4c, 0x8e,
+ ]
+ ),
+ test_case!(
+ [0x05, 0x59, 0x9d, 0x46, 0x81, 0xbe, 0xd2, 0xec, 0x44, 0xd7,],
+ [
+ 0xfd, 0xe3, 0x78, 0xb4, 0x43, 0x36, 0xfa, 0xe4, 0xe2, 0x5e, 0x8f, 0x94, 0x72,
+ 0x6a, 0x6c, 0xe4, 0x01, 0x4f, 0x6e, 0x8a,
+ ],
+ [
+ 0x02, 0xfc, 0x28, 0x37, 0x4f, 0xc9, 0x8a, 0xa2, 0xa4, 0x71, 0x8f, 0x6f, 0x8e,
+ 0x0b, 0xa2, 0xa6, 0x95, 0x2d, 0x5f, 0x13, 0x33, 0x95, 0x24, 0x87, 0xcb, 0xc7,
+ 0x7b, 0xbe, 0xde, 0xa9, 0xc0, 0xf2,
+ ],
+ [
+ 0xeb, 0x42, 0x84, 0xeb, 0xc8, 0x15, 0x22, 0x7a, 0xaa, 0x0a, 0x4c, 0x0a, 0x12,
+ 0x54, 0x33, 0xea, 0xac, 0xfe, 0x53, 0x22, 0x1c, 0x5a, 0xdf, 0x60, 0x0e, 0x92,
+ 0x52, 0x25, 0xa7, 0x29, 0x0a, 0xcd, 0x0a, 0x88, 0x5e, 0xaa, 0xe0, 0x57, 0x94,
+ 0x2d, 0x66, 0xab, 0x27, 0x1f, 0x3e, 0xe1, 0xf2, 0xb2,
+ ],
+ [
+ 0x84, 0xa8, 0x86, 0x2e, 0xf9, 0x2f, 0x67, 0xe9, 0x43, 0xad, 0xdb, 0xce, 0x99,
+ 0x79, 0x2a, 0xf8, 0xe1, 0xd7, 0x13, 0x3a, 0x34, 0x57, 0xd1, 0x14, 0x90, 0xab,
+ 0x0f, 0x8a, 0x5f, 0x1d, 0x42, 0x6e, 0x8e, 0x63, 0xa1, 0x6d, 0x06, 0x5c, 0x7e,
+ 0xec, 0x93, 0x3b, 0x09, 0x6b, 0x71, 0x7d, 0x83, 0x23, 0xfe, 0x31, 0x2f, 0x03,
+ 0xda, 0x38, 0xdb, 0xf1, 0xb8, 0x20, 0x5a, 0x28, 0xef, 0x10, 0x52, 0x25,
+ ]
+ ),
+ test_case!(
+ [0xe1, 0x93, 0x50, 0x85, 0xba, 0x11, 0x74, 0xcc, 0x82, 0x4c, 0x82,],
+ [
+ 0x2b, 0xff, 0x1b, 0x64, 0x12, 0xb7, 0xdf, 0x5b, 0x9a, 0x95, 0x76, 0x53, 0xce,
+ 0x3f, 0x76, 0x41, 0xaa, 0x70, 0xaf, 0x2e,
+ ],
+ [
+ 0xce, 0xce, 0x12, 0xbf, 0x23, 0xc7, 0x0c, 0xc1, 0xd1, 0xb6, 0xed, 0x13, 0x0d,
+ 0x29, 0x0e, 0x6f, 0x8e, 0x86, 0x25, 0xfe, 0x78, 0x50, 0x70, 0xbf, 0x21, 0x6a,
+ 0xf2, 0xfc, 0xf2, 0x4c, 0x1e, 0x66,
+ ],
+ [
+ 0xc2, 0x88, 0x9a, 0x1e, 0x32, 0x4d, 0x0d, 0x1e, 0x29, 0xd9, 0x02, 0x58, 0x66,
+ 0x5c, 0x6e, 0xdf, 0x15, 0xb7, 0xcb, 0x6b, 0xda, 0x5a, 0x80, 0x34, 0xb2, 0xc2,
+ 0xa5, 0x17, 0x4a, 0xc6, 0x3b, 0x8a, 0x14, 0x48, 0x81, 0xa7, 0xc4, 0x80, 0x96,
+ 0xf7, 0xd4, 0x39, 0x81, 0x8f, 0x5e, 0xf2, 0x6f, 0x09,
+ ],
+ [
+ 0xec, 0x33, 0xa6, 0x67, 0xed, 0x23, 0xd9, 0x62, 0x87, 0xda, 0x83, 0xce, 0x02,
+ 0x56, 0x39, 0xfb, 0x0d, 0x7e, 0x79, 0x4a, 0x73, 0x51, 0x4c, 0x18, 0x15, 0xe8,
+ 0x14, 0x44, 0xa0, 0x54, 0x3b, 0x41, 0x5f, 0xf2, 0x32, 0x4b, 0x18, 0x0d, 0x64,
+ 0x6f, 0xe1, 0xe9, 0x0b, 0x4c, 0x47, 0xf0, 0xfb, 0xbc, 0xa4, 0x93, 0x69, 0x9d,
+ 0xa9, 0x4f, 0x97, 0x7e, 0x9a, 0x7a, 0x33, 0xe1, 0xce, 0x31, 0x85, 0x22,
+ ]
+ ),
+ test_case!(
+ [0x0b, 0xeb, 0xfe, 0xb8, 0x0b, 0xc3, 0x81, 0x3c, 0xa0, 0xd1, 0xe5, 0x18,],
+ [
+ 0x07, 0x10, 0xc0, 0x4f, 0x16, 0xe0, 0x09, 0x59, 0x8d, 0xe0, 0xd6, 0xf8, 0x11,
+ 0x84, 0x9a, 0x1b, 0xad, 0x4f, 0xc9, 0x7b,
+ ],
+ [
+ 0xaa, 0x79, 0x98, 0x67, 0xe9, 0xcf, 0xaf, 0x0e, 0x16, 0xb1, 0x4d, 0xe5, 0x9e,
+ 0x28, 0x93, 0x50, 0x3a, 0x15, 0x50, 0x64, 0x73, 0x40, 0x1a, 0x19, 0xfd, 0x2b,
+ 0xfb, 0x12, 0x07, 0x52, 0xa5, 0x7f,
+ ],
+ [
+ 0xa1, 0xe4, 0x82, 0x89, 0x8d, 0xa1, 0x8b, 0x44, 0x98, 0xa3, 0xf8, 0xab, 0x02,
+ 0x60, 0x28, 0x16, 0xd3, 0x32, 0x1b, 0xbd, 0xc4, 0xae, 0xc0, 0xd2, 0x90, 0xc6,
+ 0xa1, 0x12, 0xa1, 0xd2, 0x00, 0xac, 0x46, 0x42, 0xa2, 0x53, 0x5a, 0xb9, 0xf1,
+ 0x50, 0x80, 0x4c, 0xfa, 0xd7, 0xee, 0x36, 0xf9, 0x35,
+ ],
+ [
+ 0x3f, 0x4c, 0x3e, 0x2b, 0x3c, 0x99, 0xc8, 0x23, 0x38, 0x7d, 0xbf, 0xb6, 0xaf,
+ 0xe3, 0x23, 0xf1, 0x95, 0x1b, 0xa4, 0x04, 0x9e, 0x44, 0xe1, 0x74, 0x0a, 0x38,
+ 0x71, 0x58, 0xfd, 0xe1, 0xb7, 0x59, 0x1f, 0x64, 0x5d, 0x77, 0xe2, 0x51, 0x11,
+ 0x3e, 0xcc, 0x80, 0x11, 0x60, 0xa8, 0x2f, 0xe9, 0x98, 0x24, 0x45, 0x90, 0x55,
+ 0x55, 0x24, 0xb9, 0x4f, 0x24, 0x23, 0xc8, 0xbc, 0xf2, 0x3b, 0x28, 0x8b,
+ ]
+ ),
+ test_case!(
+ [0x7c, 0x10, 0xa4, 0x4b, 0xde, 0x62, 0x86, 0xe0, 0x97, 0x96, 0x88, 0x5e, 0x8c,],
+ [
+ 0xfa, 0xba, 0xd7, 0x84, 0xbf, 0x1b, 0x4c, 0xec, 0xaa, 0x27, 0x20, 0xa6, 0xda,
+ 0x43, 0xcb, 0x0b, 0x6d, 0xd1, 0xf6, 0xa9,
+ ],
+ [
+ 0x34, 0xbe, 0x8f, 0xde, 0x2a, 0x43, 0x29, 0x0f, 0x67, 0x85, 0xce, 0xb6, 0x91,
+ 0x8a, 0xcf, 0x86, 0xe5, 0x77, 0x6d, 0x33, 0x6e, 0xc1, 0xfd, 0x04, 0x6a, 0x5b,
+ 0x3f, 0x6b, 0x17, 0x50, 0x6d, 0x4a,
+ ],
+ [
+ 0xf4, 0x91, 0x8f, 0x35, 0x5d, 0xe9, 0x5a, 0xbc, 0xbc, 0xe8, 0x70, 0x00, 0xa1,
+ 0xbe, 0x36, 0x25, 0x13, 0x65, 0x31, 0xaa, 0xce, 0xe6, 0x73, 0xdf, 0x0f, 0xcc,
+ 0x29, 0x26, 0x6b, 0x92, 0x54, 0xa8, 0x20, 0x3c, 0xfa, 0x16, 0xfb, 0x3f, 0xda,
+ 0xde, 0x76, 0x1d, 0xcf, 0x44, 0x1d, 0xf2, 0xea, 0x61,
+ ],
+ [
+ 0x19, 0x19, 0xb9, 0xd2, 0xf6, 0x26, 0xb7, 0x48, 0x7a, 0x06, 0x29, 0xfa, 0x70,
+ 0xef, 0xa6, 0x45, 0x5e, 0x75, 0x33, 0xa2, 0x5d, 0xda, 0x56, 0x7b, 0x76, 0xde,
+ 0x29, 0x2f, 0x78, 0x61, 0x8f, 0xcf, 0x21, 0x1e, 0x90, 0x83, 0x59, 0x93, 0x1d,
+ 0xe2, 0x1d, 0xe3, 0x11, 0x00, 0x01, 0x7f, 0x9e, 0x13, 0xa1, 0x82, 0xc5, 0xa6,
+ 0x03, 0xbf, 0xc1, 0x82, 0x33, 0x3a, 0x60, 0x47, 0xe0, 0xca, 0xea, 0x41,
+ ]
+ ),
+ test_case!(
+ [
+ 0x08, 0x2f, 0x10, 0x32, 0x44, 0x7a, 0x54, 0x50, 0x09, 0x69, 0x4a, 0x29, 0x59,
+ 0x35,
+ ],
+ [
+ 0x8f, 0x57, 0x27, 0xba, 0x85, 0xbf, 0x1c, 0xab, 0x25, 0x10, 0x54, 0x57, 0x6e,
+ 0x57, 0xbe, 0x9d, 0x36, 0x00, 0x1b, 0xd5,
+ ],
+ [
+ 0x01, 0x8e, 0x47, 0xe3, 0xec, 0x99, 0x9b, 0xe9, 0xcc, 0xfa, 0xb5, 0xe2, 0x37,
+ 0x71, 0xeb, 0x01, 0xc8, 0x69, 0xc7, 0x70, 0xcd, 0x08, 0x39, 0x9e, 0x95, 0x65,
+ 0x61, 0x57, 0x20, 0x7c, 0x40, 0x5f,
+ ],
+ [
+ 0x95, 0xbe, 0xc6, 0x2a, 0xd0, 0x90, 0x88, 0xfe, 0x7c, 0x12, 0x75, 0x17, 0x65,
+ 0x04, 0xd4, 0x70, 0x50, 0x69, 0xda, 0x81, 0x0d, 0x00, 0x26, 0x80, 0x6d, 0x12,
+ 0x7b, 0xb7, 0x5b, 0x44, 0x00, 0x0b, 0x17, 0xc3, 0xcc, 0x7d, 0x42, 0x01, 0xae,
+ 0xd3, 0xa1, 0xa7, 0x52, 0xae, 0xf6, 0x35, 0xf8, 0x4c,
+ ],
+ [
+ 0x70, 0x28, 0x02, 0xf3, 0x9c, 0x2c, 0x0d, 0xb8, 0x04, 0x17, 0x6f, 0x20, 0x8c,
+ 0xb6, 0xa4, 0x69, 0xcf, 0x05, 0x80, 0x2d, 0x2e, 0xc7, 0x69, 0x94, 0xa7, 0x00,
+ 0xcf, 0xab, 0x42, 0x6f, 0x58, 0x2a, 0xec, 0x0c, 0x5e, 0x34, 0x50, 0x12, 0x68,
+ 0xdc, 0xbb, 0x30, 0x6b, 0x8a, 0xd8, 0x80, 0xfa, 0x15, 0x4e, 0x4b, 0x50, 0x5d,
+ 0xd2, 0x9c, 0x9b, 0x0e, 0xa7, 0xc8, 0x18, 0xe3, 0x1b, 0xf1, 0x2a, 0xfb,
+ ]
+ ),
+ test_case!(
+ [
+ 0x47, 0x0b, 0xfa, 0x80, 0xbd, 0x30, 0x29, 0xa8, 0x70, 0x39, 0x8d, 0xe8, 0x99,
+ 0xd7, 0x63,
+ ],
+ [
+ 0x35, 0x2c, 0x7f, 0xbf, 0xd0, 0x7a, 0xfa, 0xa7, 0xcb, 0x3a, 0xd2, 0x1d, 0xd7,
+ 0x34, 0x91, 0x5a, 0xb3, 0x7b, 0xbb, 0xb7,
+ ],
+ [
+ 0x9d, 0x9c, 0xb4, 0x3b, 0x4d, 0xc9, 0x96, 0xa1, 0x54, 0x06, 0xbd, 0x3d, 0x36,
+ 0xde, 0x3b, 0x84, 0x12, 0x19, 0x8b, 0x91, 0xe7, 0xf0, 0xf4, 0x71, 0x28, 0xb3,
+ 0x88, 0x9f, 0x84, 0x1b, 0x0d, 0x11,
+ ],
+ [
+ 0x06, 0x60, 0x85, 0x04, 0x64, 0x47, 0x81, 0x27, 0x39, 0x07, 0xbb, 0x46, 0xf0,
+ 0xb4, 0xab, 0x53, 0x36, 0x39, 0x4a, 0xc8, 0x9e, 0xe0, 0x47, 0x1c, 0xde, 0xb1,
+ 0x38, 0xb4, 0x00, 0xdc, 0x22, 0x17, 0xf1, 0x1c, 0x39, 0xab, 0x34, 0x5f, 0xf7,
+ 0xb5, 0xe6, 0x41, 0x3b, 0xcc, 0xcf, 0x5b, 0x3e, 0x2c,
+ ],
+ [
+ 0xea, 0x58, 0x8e, 0x22, 0x55, 0xc4, 0x2b, 0xe7, 0x56, 0x4d, 0x84, 0x00, 0x41,
+ 0xe1, 0x8b, 0xe2, 0xf0, 0xce, 0x32, 0xdd, 0x8a, 0x31, 0x4a, 0x68, 0x5e, 0x2d,
+ 0xeb, 0xfb, 0x99, 0x58, 0x8a, 0xa0, 0x29, 0xde, 0xe8, 0x0f, 0x16, 0xe6, 0x85,
+ 0x44, 0xbc, 0xc4, 0x0a, 0x8b, 0x06, 0xb3, 0x5b, 0x6d, 0xa3, 0xff, 0xa5, 0x61,
+ 0x0e, 0x26, 0x63, 0x43, 0xb1, 0xfd, 0x59, 0xd1, 0x3b, 0x44, 0xce, 0xbc,
+ ]
+ ),
+ test_case!(
+ [
+ 0x6b, 0xb7, 0xed, 0x62, 0x99, 0xab, 0x6b, 0xb3, 0x8c, 0xf4, 0xe1, 0x75, 0xc5,
+ 0x85, 0x46, 0xd3,
+ ],
+ [
+ 0xdc, 0x20, 0xf5, 0x00, 0x86, 0x0d, 0x4e, 0x0e, 0x1f, 0xf5, 0x9e, 0x8a, 0xed,
+ 0x93, 0x6b, 0xbd, 0x17, 0x43, 0xe7, 0x90,
+ ],
+ [
+ 0xea, 0xde, 0x1b, 0x2b, 0x62, 0xdf, 0x6d, 0xb4, 0x97, 0xbd, 0x1f, 0x08, 0xe6,
+ 0xbf, 0x0d, 0x76, 0x8c, 0xf1, 0x82, 0xff, 0x06, 0x0a, 0xb0, 0x03, 0xde, 0x73,
+ 0x4b, 0xac, 0xdf, 0x51, 0xa9, 0x19,
+ ],
+ [
+ 0xfb, 0x9e, 0x54, 0x2f, 0xca, 0x0d, 0x0e, 0x8a, 0x8b, 0x1a, 0x8d, 0x49, 0x38,
+ 0xe0, 0xf3, 0x3a, 0xcd, 0xe3, 0x45, 0x69, 0x54, 0xf3, 0x53, 0x81, 0x0d, 0x30,
+ 0xed, 0xbd, 0x87, 0x72, 0x76, 0xba, 0xd2, 0x8e, 0x6d, 0x40, 0x08, 0x16, 0x55,
+ 0xca, 0x7e, 0xa8, 0x82, 0x52, 0x6f, 0x43, 0xa2, 0x7f,
+ ],
+ [
+ 0x4a, 0xfc, 0xda, 0x87, 0x0d, 0x5c, 0x7b, 0xc8, 0x12, 0x07, 0x37, 0x46, 0x6f,
+ 0x41, 0x7f, 0xc0, 0xfb, 0xc3, 0xf9, 0x80, 0xe1, 0x0b, 0x08, 0x3b, 0x22, 0x02,
+ 0x10, 0x77, 0xe1, 0xb0, 0x4f, 0x93, 0xd5, 0x74, 0xd8, 0x87, 0x09, 0xf9, 0xa8,
+ 0xc6, 0xc3, 0x9b, 0x58, 0xd0, 0x3f, 0x86, 0x31, 0x39, 0x0e, 0xd4, 0x93, 0x9c,
+ 0xd8, 0xd0, 0x52, 0x7d, 0x9b, 0x8b, 0x1a, 0x03, 0x5e, 0x0e, 0x7f, 0xbe,
+ ]
+ ),
+ test_case!(
+ [
+ 0x94, 0x34, 0xb7, 0x7f, 0x7c, 0x62, 0xed, 0x3a, 0x7a, 0x25, 0xe9, 0x6c, 0x3f,
+ 0x14, 0xd3, 0x54, 0x38,
+ ],
+ [
+ 0x4d, 0x00, 0xf2, 0xad, 0x01, 0x19, 0x6b, 0xe3, 0xb1, 0x78, 0x7f, 0xf4, 0x3a,
+ 0x75, 0xf8, 0x81, 0xb5, 0x8e, 0x08, 0x64,
+ ],
+ [
+ 0x12, 0x35, 0x6c, 0xe3, 0xea, 0xe2, 0xa1, 0xdd, 0x08, 0x57, 0xa8, 0x44, 0x16,
+ 0xcd, 0xf5, 0x92, 0xe8, 0xfa, 0xee, 0xbb, 0x8c, 0xa3, 0x7c, 0x44, 0x84, 0x01,
+ 0x02, 0x10, 0x49, 0x01, 0xd2, 0x7e,
+ ],
+ [
+ 0x4d, 0xf6, 0xde, 0xc7, 0x48, 0x62, 0x4a, 0x16, 0x30, 0x37, 0x66, 0xc4, 0xd2,
+ 0x78, 0xf8, 0x00, 0x50, 0x3e, 0xf9, 0xed, 0x72, 0xdb, 0x54, 0x1b, 0x44, 0x92,
+ 0x75, 0xba, 0xa5, 0xfc, 0x6e, 0x7f, 0x5b, 0x58, 0x20, 0x46, 0x24, 0x26, 0x9a,
+ 0x70, 0xc2, 0x02, 0x6f, 0xb8, 0x0c, 0xb2, 0x60, 0xbc,
+ ],
+ [
+ 0xd1, 0xd9, 0x7b, 0xe8, 0x57, 0xbf, 0xe5, 0x0b, 0x49, 0xa9, 0xad, 0x70, 0xf2,
+ 0x64, 0xf1, 0x30, 0x70, 0x1e, 0x90, 0x52, 0x29, 0xc7, 0x0f, 0x4c, 0x1c, 0x33,
+ 0xb8, 0x53, 0x2d, 0x87, 0x46, 0xe9, 0x75, 0x35, 0x92, 0x3d, 0xf3, 0x5c, 0xa4,
+ 0x57, 0x3f, 0x64, 0xed, 0xf6, 0x2a, 0x1e, 0x1d, 0x6f, 0x64, 0xd0, 0x8a, 0x70,
+ 0xf2, 0xce, 0x59, 0xd6, 0x15, 0x32, 0x02, 0x74, 0x2c, 0x21, 0x56, 0xba,
+ ]
+ ),
+ test_case!(
+ [
+ 0xbb, 0x8d, 0x9c, 0x24, 0xa9, 0x07, 0x69, 0xbe, 0xc7, 0x08, 0x55, 0x22, 0x7e,
+ 0x3c, 0x09, 0xdd, 0x80, 0xce,
+ ],
+ [
+ 0x11, 0x17, 0x92, 0xb5, 0x66, 0x86, 0xa4, 0x2a, 0xb8, 0x90, 0x20, 0x09, 0x3d,
+ 0x08, 0x5d, 0xbb, 0x3d, 0x46, 0xa5, 0x84,
+ ],
+ [
+ 0x1f, 0xe8, 0x59, 0x35, 0x94, 0xc9, 0xf7, 0x24, 0xf8, 0xa4, 0xf1, 0xb0, 0xe1,
+ 0xd8, 0x38, 0x18, 0xa3, 0xfd, 0x3a, 0xc2, 0xfa, 0xa9, 0xc7, 0xa2, 0x8b, 0x8f,
+ 0x6d, 0x79, 0x26, 0xd0, 0x8a, 0x28,
+ ],
+ [
+ 0x9d, 0xf7, 0x08, 0x13, 0x48, 0xe3, 0x82, 0xc7, 0xd3, 0x52, 0xf7, 0x07, 0xa9,
+ 0x83, 0xe9, 0xf7, 0xa2, 0xdd, 0x23, 0xbe, 0x38, 0x6f, 0x99, 0x4b, 0x50, 0x20,
+ 0x73, 0x65, 0x45, 0x10, 0x6e, 0xa6, 0x64, 0xbd, 0x48, 0x3d, 0x10, 0x59, 0x62,
+ 0x68, 0xcf, 0x0c, 0xee, 0x49, 0x2b, 0x1a, 0x62, 0x87,
+ ],
+ [
+ 0x26, 0xca, 0x1b, 0x5b, 0xdc, 0x1a, 0xc3, 0xfc, 0xb5, 0x1c, 0x83, 0xbc, 0xfe,
+ 0xc4, 0x2e, 0xd2, 0xbb, 0x32, 0xc8, 0xc7, 0x09, 0x42, 0xf2, 0xf0, 0xe8, 0xd3,
+ 0x5c, 0xb5, 0xe5, 0x6d, 0xe3, 0x56, 0x1c, 0xf3, 0x8f, 0x94, 0x03, 0xaf, 0x20,
+ 0x60, 0xb6, 0xe1, 0xed, 0x49, 0xb8, 0x07, 0x16, 0x73, 0x2d, 0xd9, 0x19, 0x16,
+ 0x53, 0x4d, 0x4e, 0xc1, 0xb1, 0x91, 0xe4, 0xec, 0x60, 0x09, 0xfc, 0x80,
+ ]
+ ),
+ test_case!(
+ [
+ 0xfa, 0x82, 0x9f, 0x49, 0x26, 0xce, 0x44, 0x75, 0x8f, 0x81, 0xb3, 0x37, 0x88,
+ 0xbd, 0x0b, 0x1b, 0xed, 0xe3, 0xcc,
+ ],
+ [
+ 0x51, 0xfd, 0xe2, 0x78, 0x46, 0x97, 0xf3, 0xe1, 0x23, 0x2b, 0x6f, 0x83, 0x79,
+ 0x32, 0x7c, 0x09, 0x03, 0x8c, 0x32, 0x00,
+ ],
+ [
+ 0x73, 0xd6, 0x8e, 0xa8, 0x5d, 0x14, 0xf7, 0x06, 0x2d, 0x80, 0xb9, 0xa5, 0x16,
+ 0x68, 0x26, 0x31, 0x45, 0x10, 0xa1, 0xfe, 0xc4, 0x98, 0xda, 0x05, 0x15, 0xae,
+ 0xd7, 0xcd, 0x9d, 0x4c, 0xe7, 0x2b,
+ ],
+ [
+ 0xf4, 0x16, 0x61, 0x0c, 0xce, 0xfd, 0x2f, 0x7c, 0x5c, 0xd9, 0x00, 0x21, 0xe3,
+ 0x8e, 0x50, 0x81, 0x16, 0x62, 0x34, 0x5b, 0x6e, 0x84, 0x87, 0x29, 0x0b, 0x5f,
+ 0xf1, 0x6a, 0x08, 0x4f, 0x6e, 0xff, 0x45, 0xd5, 0x73, 0xdc, 0x38, 0xf3, 0x47,
+ 0x52, 0x44, 0x47, 0x0b, 0x49, 0x46, 0xb1, 0x5c, 0x5d,
+ ],
+ [
+ 0x71, 0xb3, 0x7e, 0xd8, 0x8a, 0x54, 0xba, 0xd0, 0xda, 0xff, 0xb1, 0x5e, 0xb5,
+ 0xef, 0x6b, 0x5f, 0xd0, 0x23, 0xf0, 0xb9, 0xab, 0xb8, 0xeb, 0x2a, 0xd2, 0xea,
+ 0xd0, 0xed, 0x3f, 0xde, 0x2c, 0x2c, 0x7a, 0x32, 0x32, 0xe3, 0x5c, 0x30, 0x7c,
+ 0xd7, 0xaa, 0x1f, 0x45, 0xb9, 0xaf, 0xbe, 0x42, 0x53, 0x79, 0xac, 0xb6, 0xda,
+ 0x10, 0x06, 0x62, 0x3b, 0x69, 0xc1, 0xb2, 0x98, 0x96, 0x24, 0xc3, 0xda,
+ ]
+ ),
+ test_case!(
+ [
+ 0x04, 0x9a, 0x7c, 0x85, 0x56, 0xb5, 0x4d, 0x57, 0xf2, 0x72, 0x30, 0xa8, 0x88,
+ 0x1f, 0xa7, 0x71, 0x66, 0xe8, 0x36, 0xd0,
+ ],
+ [
+ 0xb7, 0x7b, 0xbe, 0x98, 0xe8, 0x29, 0x8b, 0xda, 0xb3, 0x89, 0x78, 0x6f, 0xdf,
+ 0xf0, 0x5a, 0xf4, 0x45, 0x8f, 0x33, 0x9a,
+ ],
+ [
+ 0xf6, 0xfd, 0x72, 0xb8, 0x43, 0x14, 0xe0, 0xf6, 0xb2, 0x41, 0x5b, 0x3b, 0x26,
+ 0x69, 0xa6, 0x97, 0x06, 0xd7, 0x81, 0x79, 0x9b, 0xe0, 0x94, 0xb5, 0x39, 0xde,
+ 0x6b, 0x41, 0xbc, 0xc6, 0xe2, 0x18,
+ ],
+ [
+ 0xb9, 0x6e, 0xfd, 0x82, 0xec, 0x46, 0x8b, 0xb4, 0xa0, 0x6f, 0xc3, 0x41, 0x29,
+ 0x84, 0x19, 0x79, 0xd5, 0x64, 0xcc, 0x76, 0x51, 0x0f, 0xbf, 0x9a, 0x65, 0x1d,
+ 0x4c, 0x8f, 0x81, 0xd8, 0xf2, 0x2d, 0x24, 0x57, 0x22, 0x94, 0xef, 0x5f, 0x71,
+ 0x99, 0x46, 0xf2, 0x57, 0x83, 0x5b, 0xf4, 0x72, 0x0e,
+ ],
+ [
+ 0x01, 0x3a, 0x64, 0x78, 0xbb, 0x6f, 0x05, 0xbc, 0x0e, 0x70, 0x70, 0x10, 0x13,
+ 0xc8, 0xa2, 0x7d, 0xcf, 0xd4, 0xa7, 0x3f, 0xaf, 0x14, 0xab, 0x61, 0x63, 0x03,
+ 0x4b, 0xd0, 0xed, 0xbb, 0x73, 0x59, 0x43, 0xaf, 0x2f, 0xa7, 0x45, 0x10, 0xfe,
+ 0x62, 0x10, 0xa4, 0x02, 0xd5, 0x0e, 0x1a, 0x85, 0x61, 0xca, 0xaa, 0xd4, 0xd4,
+ 0xa9, 0x93, 0x91, 0xe2, 0x54, 0x6d, 0x3c, 0x1b, 0x8b, 0xa0, 0x4d, 0x88,
+ ]
+ ),
+ test_case!(
+ [
+ 0x2b, 0x7f, 0x18, 0x78, 0xc0, 0x08, 0x39, 0x2c, 0x83, 0x9e, 0x57, 0xb6, 0x5a,
+ 0xd4, 0x69, 0x13, 0xfa, 0xfe, 0x51, 0xfd, 0xa8,
+ ],
+ [
+ 0xc5, 0xa1, 0xb1, 0x21, 0x81, 0xac, 0xa2, 0x29, 0x85, 0x8a, 0x00, 0x8f, 0xf0,
+ 0x35, 0x1d, 0xca, 0x9e, 0x27, 0x62, 0x04,
+ ],
+ [
+ 0xe0, 0xfe, 0x5e, 0x18, 0xc5, 0x21, 0x79, 0x4b, 0xae, 0x79, 0x7d, 0x29, 0x71,
+ 0xe6, 0xfb, 0x14, 0xb5, 0xe1, 0x6f, 0xa2, 0xc3, 0xa3, 0x07, 0x66, 0x32, 0xad,
+ 0x76, 0x23, 0x24, 0xbe, 0x1b, 0xb6,
+ ],
+ [
+ 0xc1, 0x4b, 0x60, 0x9c, 0x52, 0x4e, 0x4d, 0xa3, 0xe4, 0x4d, 0x74, 0x1f, 0xee,
+ 0xc7, 0xa0, 0x5b, 0xa7, 0xdc, 0x79, 0x90, 0x41, 0x48, 0x4e, 0xe8, 0x7f, 0xeb,
+ 0x53, 0x28, 0x27, 0xd0, 0x59, 0x96, 0xc1, 0x3f, 0xd6, 0xac, 0x1e, 0x23, 0x51,
+ 0xc0, 0x8b, 0x6e, 0xdb, 0x76, 0xea, 0xdd, 0x9f, 0xfa,
+ ],
+ [
+ 0xf0, 0x42, 0x10, 0x13, 0x4d, 0x66, 0xbc, 0x3f, 0x1c, 0x0b, 0xfc, 0x57, 0x8f,
+ 0x75, 0x7c, 0x6b, 0xad, 0xd4, 0xae, 0x65, 0xf7, 0x17, 0x31, 0xf9, 0xdc, 0x62,
+ 0xe3, 0x26, 0xef, 0x60, 0x1a, 0x06, 0x6f, 0xe2, 0xa1, 0x9f, 0x61, 0xd8, 0x70,
+ 0xfe, 0x50, 0x4d, 0x02, 0x32, 0xea, 0xfc, 0x9c, 0x0c, 0x7f, 0x87, 0x4a, 0x77,
+ 0xcd, 0x70, 0xa4, 0x28, 0x67, 0x2e, 0x3e, 0xaf, 0x30, 0x3d, 0x58, 0x11,
+ ]
+ ),
+ test_case!(
+ [
+ 0x1a, 0xc9, 0x93, 0x29, 0xa1, 0x42, 0xb5, 0x17, 0xd2, 0xa3, 0xa2, 0x06, 0xf6,
+ 0x19, 0xdb, 0xea, 0x52, 0x05, 0xd8, 0x3c, 0x60, 0xdb,
+ ],
+ [
+ 0xce, 0xca, 0xaa, 0xff, 0xe6, 0x55, 0xa2, 0xfb, 0xb3, 0x4f, 0xf4, 0x2a, 0xef,
+ 0x27, 0xf3, 0x63, 0x57, 0x46, 0x4e, 0xac,
+ ],
+ [
+ 0x12, 0x1f, 0x90, 0x95, 0xe8, 0xdb, 0x52, 0x4a, 0x66, 0xe2, 0x9d, 0xe9, 0x03,
+ 0xc3, 0x33, 0x15, 0x7a, 0x63, 0x54, 0x70, 0x9e, 0x0a, 0x18, 0x1c, 0x61, 0x00,
+ 0x36, 0xd5, 0xb0, 0x9a, 0xbe, 0xef,
+ ],
+ [
+ 0x44, 0x82, 0xd1, 0xd3, 0x7a, 0xd7, 0xf0, 0xff, 0x34, 0xcb, 0x20, 0xb7, 0x51,
+ 0x5f, 0x52, 0xf5, 0xd8, 0xb1, 0x2b, 0xae, 0xc4, 0x28, 0x3d, 0x2d, 0xa3, 0x7b,
+ 0x0c, 0x91, 0x14, 0x41, 0x62, 0x16, 0x02, 0x02, 0x58, 0x4e, 0x64, 0xea, 0xce,
+ 0x99, 0x14, 0xe8, 0x6a, 0x66, 0x24, 0x68, 0x78, 0xf5,
+ ],
+ [
+ 0x3a, 0x39, 0x8a, 0x5e, 0xdd, 0x27, 0xca, 0xda, 0x88, 0x19, 0x6e, 0xae, 0xb3,
+ 0x7d, 0x11, 0x27, 0x3e, 0xa2, 0x1b, 0x13, 0x56, 0x69, 0x09, 0x7a, 0x77, 0x01,
+ 0xf5, 0xb7, 0x4d, 0xfa, 0x79, 0xb6, 0xfa, 0x77, 0x00, 0x15, 0x8f, 0x2c, 0xaf,
+ 0xd8, 0xee, 0x91, 0xed, 0xd5, 0x54, 0x7d, 0x71, 0x22, 0xe9, 0x23, 0x84, 0x22,
+ 0x0c, 0xc0, 0xca, 0xcd, 0xf7, 0x9e, 0xc1, 0xeb, 0xdd, 0xf9, 0xfe, 0xcf,
+ ]
+ ),
+ test_case!(
+ [
+ 0xde, 0x2b, 0x68, 0x04, 0xee, 0xb5, 0x4e, 0xd0, 0xca, 0x2f, 0x2c, 0x6a, 0x88,
+ 0x75, 0x67, 0xb4, 0x7a, 0x17, 0x72, 0xf3, 0xcf, 0x0d, 0x51,
+ ],
+ [
+ 0x3e, 0x2f, 0x15, 0x9d, 0x6a, 0x62, 0x11, 0x5f, 0x09, 0x38, 0x1a, 0x0c, 0x5e,
+ 0x61, 0xac, 0xac, 0x48, 0xeb, 0x65, 0x0c,
+ ],
+ [
+ 0xde, 0x73, 0x4e, 0xd5, 0x73, 0xe0, 0x9a, 0x51, 0x52, 0x68, 0x9b, 0x25, 0x20,
+ 0x05, 0x48, 0x68, 0xb6, 0xb1, 0x38, 0x7f, 0x51, 0x0b, 0x01, 0x2b, 0x1e, 0x69,
+ 0x42, 0x3e, 0x95, 0x4c, 0x69, 0x20,
+ ],
+ [
+ 0xd2, 0x28, 0x8b, 0x91, 0x5c, 0x87, 0xe5, 0xb3, 0xc2, 0x4b, 0x4b, 0x87, 0x0f,
+ 0x5a, 0x97, 0xbf, 0xbb, 0xee, 0xd0, 0x23, 0x2c, 0x19, 0x79, 0x88, 0x96, 0x18,
+ 0x02, 0x55, 0x21, 0x45, 0x73, 0x5f, 0x07, 0xe6, 0x21, 0xcb, 0xb3, 0x1e, 0xd2,
+ 0x88, 0x5d, 0xc2, 0x3c, 0x5a, 0x0d, 0xe7, 0x43, 0x4a,
+ ],
+ [
+ 0x04, 0x86, 0x15, 0x1d, 0x60, 0x85, 0xab, 0x87, 0x43, 0x83, 0x14, 0xcb, 0xde,
+ 0xe7, 0x69, 0xe5, 0x3a, 0x26, 0xeb, 0xd6, 0x9e, 0x29, 0x97, 0x79, 0xda, 0x38,
+ 0xa5, 0x02, 0xd3, 0xa2, 0x99, 0x66, 0xc0, 0x35, 0x62, 0xd7, 0xbd, 0x17, 0xf5,
+ 0xf0, 0x65, 0xeb, 0x7b, 0x3a, 0x74, 0x8d, 0x4e, 0xf7, 0xf1, 0xe1, 0x38, 0x4b,
+ 0xe5, 0x1f, 0x56, 0x20, 0x12, 0x89, 0xca, 0xb7, 0xc6, 0x6a, 0x4b, 0xdd,
+ ]
+ ),
+ test_case!(
+ [
+ 0xc3, 0xe8, 0x8b, 0x6d, 0x2e, 0x27, 0x45, 0x26, 0x68, 0xa8, 0xe5, 0x0f, 0x22,
+ 0xcd, 0xbd, 0xef, 0xc8, 0x00, 0x0e, 0x5d, 0x76, 0xdc, 0x1d, 0x2e,
+ ],
+ [
+ 0xd2, 0xd9, 0x86, 0x45, 0xf8, 0x63, 0xe8, 0x78, 0xaa, 0x4f, 0xf2, 0x62, 0x30,
+ 0x4f, 0xe3, 0xb5, 0xb8, 0xc4, 0xb4, 0xd6,
+ ],
+ [
+ 0x74, 0x86, 0x51, 0x31, 0xfd, 0x56, 0xff, 0x91, 0x3e, 0x71, 0xaa, 0x75, 0x2d,
+ 0xe4, 0x68, 0xed, 0x7b, 0x62, 0xbf, 0xc2, 0x02, 0x97, 0x17, 0xc5, 0xdc, 0x21,
+ 0xe6, 0x91, 0x4e, 0x71, 0xd5, 0xd9,
+ ],
+ [
+ 0x23, 0x2f, 0x22, 0x48, 0x72, 0xf2, 0xe3, 0x2f, 0xfd, 0x48, 0x9b, 0x06, 0xc7,
+ 0x14, 0xcd, 0xc6, 0x78, 0x7e, 0x3a, 0x6e, 0x85, 0xb5, 0xa3, 0xc6, 0x0e, 0x45,
+ 0x56, 0x42, 0xe4, 0xea, 0x1c, 0x0d, 0xa9, 0x62, 0xca, 0xe8, 0xb8, 0xe9, 0x01,
+ 0x33, 0x70, 0xd5, 0xfe, 0x90, 0x38, 0x6f, 0x9b, 0x7b,
+ ],
+ [
+ 0x07, 0x26, 0x97, 0x53, 0xaf, 0x2e, 0xa9, 0x16, 0xa0, 0xbf, 0xcd, 0x43, 0xe4,
+ 0x21, 0xe0, 0x7d, 0x10, 0xde, 0x71, 0xb2, 0x74, 0xf0, 0x91, 0x57, 0x3a, 0xe9,
+ 0x1a, 0x1f, 0xdf, 0x8c, 0x83, 0xb2, 0xed, 0xa0, 0x79, 0xcc, 0xcc, 0x31, 0x5b,
+ 0x78, 0xfa, 0x69, 0xc2, 0x5d, 0xd0, 0x0c, 0x9f, 0x1e, 0x75, 0x6f, 0x08, 0x86,
+ 0x06, 0x1e, 0xee, 0x95, 0x0c, 0xe5, 0x56, 0x2e, 0xe6, 0xad, 0x70, 0xe9,
+ ]
+ ),
+ test_case!(
+ [
+ 0x23, 0xbb, 0x9b, 0x96, 0x20, 0xd0, 0x03, 0xdd, 0xba, 0x97, 0x99, 0x75, 0xcd,
+ 0x8a, 0x71, 0x53, 0x03, 0x03, 0xd7, 0x55, 0xec, 0x93, 0xd1, 0xed, 0xf5,
+ ],
+ [
+ 0xbd, 0xc8, 0x6d, 0x60, 0xb5, 0xfb, 0x1c, 0xc4, 0x07, 0xbe, 0x68, 0x97, 0x51,
+ 0x1a, 0x2f, 0xe1, 0xd9, 0x57, 0x0c, 0xf2,
+ ],
+ [
+ 0xc8, 0xcd, 0xf7, 0xfa, 0xdd, 0x6e, 0x85, 0x9d, 0xd0, 0x39, 0x74, 0x3e, 0x4c,
+ 0xba, 0x12, 0xe7, 0x7b, 0x90, 0x81, 0xf3, 0xf3, 0x03, 0xb7, 0x37, 0x90, 0x28,
+ 0xa3, 0x6d, 0x8f, 0x57, 0xe1, 0x4b,
+ ],
+ [
+ 0x15, 0x25, 0x48, 0x5e, 0x54, 0xe3, 0x35, 0xbc, 0x5f, 0x44, 0xf5, 0xa9, 0x09,
+ 0x75, 0xc1, 0xca, 0xfb, 0x30, 0x64, 0x19, 0x53, 0xfa, 0x90, 0x95, 0xad, 0xd3,
+ 0xf4, 0xe0, 0x5e, 0x36, 0x12, 0x38, 0xd2, 0x26, 0x30, 0x90, 0xd7, 0xe3, 0x62,
+ 0x21, 0xc9, 0xd2, 0x3b, 0xa1, 0x9c, 0xaa, 0x84, 0x4e,
+ ],
+ [
+ 0x7a, 0xde, 0x43, 0xe8, 0x4c, 0x39, 0x7c, 0xa9, 0x22, 0x0f, 0x61, 0x2b, 0x93,
+ 0xa8, 0x81, 0x9f, 0x01, 0x24, 0x7d, 0x16, 0x6f, 0xf1, 0x24, 0x7d, 0x07, 0x85,
+ 0x99, 0x79, 0x66, 0x44, 0x6b, 0x94, 0xfe, 0x02, 0x14, 0x3c, 0x1f, 0xa3, 0xe2,
+ 0xf4, 0x05, 0x06, 0x24, 0x91, 0x1f, 0xf0, 0x8e, 0x88, 0xbb, 0xd9, 0x2a, 0x5c,
+ 0x69, 0x77, 0x1b, 0x66, 0xc5, 0x81, 0x4e, 0xb9, 0x1d, 0xe0, 0x92, 0xba,
+ ]
+ ),
+ test_case!(
+ [
+ 0xa6, 0x81, 0x05, 0xec, 0x7a, 0x50, 0xe6, 0xa5, 0x20, 0x76, 0xb1, 0x03, 0x13,
+ 0x33, 0x5a, 0xe1, 0x63, 0xf3, 0xc9, 0x65, 0x45, 0x2b, 0x5f, 0x69, 0xa3, 0xf3,
+ ],
+ [
+ 0x4c, 0xe4, 0xd1, 0x65, 0xb1, 0xfc, 0x1f, 0x52, 0x62, 0xe6, 0xad, 0xf6, 0x2b,
+ 0xdf, 0x99, 0xa6, 0xdc, 0x2d, 0x21, 0xa0,
+ ],
+ [
+ 0xcd, 0x86, 0x39, 0x09, 0x7a, 0xeb, 0x72, 0x76, 0x3a, 0x65, 0xdf, 0xd6, 0xa6,
+ 0x52, 0x84, 0x1a, 0xdc, 0xae, 0x19, 0x0c, 0x3f, 0xfd, 0xfe, 0x6c, 0xd0, 0x06,
+ 0x0e, 0x59, 0xb5, 0x74, 0x5b, 0x48,
+ ],
+ [
+ 0x01, 0xd2, 0xf0, 0x74, 0xf1, 0x5c, 0xf4, 0xa9, 0xda, 0x4a, 0xb2, 0xa2, 0xd3,
+ 0x3f, 0xdc, 0xb0, 0xe2, 0xc9, 0x79, 0xfc, 0xb0, 0x4d, 0x9d, 0x3d, 0xa2, 0x26,
+ 0xe7, 0xec, 0x32, 0x5b, 0x6a, 0x30, 0xf7, 0xd7, 0xda, 0xc4, 0xe4, 0x19, 0x3a,
+ 0x88, 0x18, 0x7a, 0x13, 0x4a, 0x15, 0x74, 0x90, 0xd4,
+ ],
+ [
+ 0x5d, 0x66, 0xfe, 0x48, 0x23, 0x96, 0x2d, 0x0e, 0x37, 0x43, 0xe3, 0x35, 0x35,
+ 0x33, 0x7a, 0x48, 0xbb, 0x12, 0x5c, 0x2f, 0x95, 0x9b, 0xf5, 0xa9, 0xf1, 0x64,
+ 0x84, 0x20, 0x86, 0xa3, 0x5b, 0x32, 0x18, 0x01, 0x0c, 0x8d, 0xfa, 0xbc, 0xd2,
+ 0x85, 0x67, 0x8a, 0xd7, 0xaf, 0x79, 0xab, 0xb0, 0x21, 0x10, 0x1b, 0x64, 0xb8,
+ 0xf4, 0xb2, 0x84, 0xf2, 0x11, 0xc3, 0xc0, 0x03, 0x75, 0x72, 0x4a, 0xf2,
+ ]
+ ),
+ test_case!(
+ [
+ 0x90, 0xd3, 0x1b, 0xfa, 0x1f, 0x19, 0xb6, 0x8b, 0x66, 0xc3, 0x3e, 0x86, 0x34,
+ 0x27, 0x02, 0x8b, 0x2e, 0x39, 0xb0, 0x3c, 0xab, 0xdd, 0x27, 0xc5, 0x89, 0x84,
+ 0xc5,
+ ],
+ [
+ 0x93, 0x6d, 0x2e, 0x14, 0xee, 0x14, 0x4f, 0x5e, 0xdb, 0xbc, 0xc8, 0x65, 0x33,
+ 0xa9, 0x24, 0x6a, 0x73, 0xa7, 0x52, 0x31,
+ ],
+ [
+ 0xcc, 0x4f, 0xd9, 0xb6, 0x04, 0xcc, 0xd7, 0x1b, 0xc9, 0xba, 0x5a, 0xf9, 0x97,
+ 0x0f, 0x87, 0x20, 0x64, 0xe3, 0xed, 0x02, 0xa6, 0x65, 0xb2, 0x90, 0x43, 0x62,
+ 0xd1, 0x56, 0xa4, 0xe3, 0x25, 0x62,
+ ],
+ [
+ 0x13, 0xe3, 0xee, 0x68, 0x88, 0xa7, 0x91, 0xa7, 0xfd, 0x37, 0x6f, 0xdb, 0xac,
+ 0x6c, 0x65, 0xaf, 0x29, 0x77, 0xc8, 0x29, 0x6b, 0xf4, 0x20, 0xee, 0x0c, 0x51,
+ 0x2b, 0x6f, 0x10, 0xfc, 0x18, 0x5a, 0x77, 0x8b, 0xcc, 0x22, 0xbc, 0x40, 0x89,
+ 0x89, 0x05, 0x22, 0x4e, 0xfd, 0x3b, 0x03, 0x0b, 0x0d,
+ ],
+ [
+ 0x99, 0xac, 0x48, 0x23, 0xa4, 0xeb, 0x91, 0xf0, 0x5a, 0x55, 0x59, 0x91, 0x99,
+ 0xfc, 0x12, 0xcd, 0xe0, 0xb0, 0x98, 0x36, 0xad, 0x20, 0x28, 0x91, 0x0b, 0x13,
+ 0x18, 0x34, 0xa0, 0xe9, 0x28, 0xf8, 0x8a, 0xea, 0x7e, 0xbf, 0xe6, 0xea, 0x0a,
+ 0x16, 0xc6, 0xe1, 0x4a, 0xfa, 0x31, 0x00, 0x8f, 0xb8, 0x50, 0x81, 0x1b, 0xfa,
+ 0x7a, 0x9a, 0xaf, 0x10, 0x82, 0xfe, 0x2d, 0x84, 0xb4, 0x43, 0xac, 0x6c,
+ ]
+ ),
+ test_case!(
+ [
+ 0x20, 0x2f, 0xaf, 0x9a, 0x58, 0x7b, 0x45, 0xf0, 0x8b, 0xab, 0xe6, 0x9a, 0x9a,
+ 0xe8, 0xfe, 0xcc, 0x8d, 0xe7, 0xf6, 0xe5, 0x43, 0xc7, 0xef, 0xe2, 0x86, 0x0d,
+ 0x45, 0x0a,
+ ],
+ [
+ 0x85, 0xd9, 0xed, 0x98, 0x63, 0x2c, 0xcd, 0x79, 0x16, 0xc5, 0xa4, 0x7e, 0xb7,
+ 0x86, 0x37, 0x44, 0xc2, 0x41, 0xfc, 0xba,
+ ],
+ [
+ 0x18, 0x9e, 0x9a, 0x1a, 0xa8, 0x85, 0xfa, 0x04, 0xae, 0x0a, 0x92, 0x4f, 0xf9,
+ 0xfa, 0x56, 0xda, 0x74, 0x86, 0xa0, 0x61, 0x6a, 0x5f, 0x64, 0x73, 0x97, 0x27,
+ 0x1a, 0x24, 0xbb, 0xd9, 0x53, 0x29,
+ ],
+ [
+ 0x20, 0x6d, 0xaa, 0x85, 0xcb, 0xd3, 0x98, 0x25, 0xdb, 0xd2, 0x3b, 0xff, 0xbf,
+ 0xce, 0x2e, 0xce, 0x74, 0xf7, 0x4d, 0xdb, 0xfc, 0x4a, 0x7d, 0x1a, 0xd8, 0x56,
+ 0xc0, 0xe0, 0x58, 0x90, 0x61, 0x9d, 0x62, 0x72, 0x08, 0xab, 0x57, 0x3d, 0xef,
+ 0xab, 0xf6, 0x86, 0x59, 0xf0, 0xe7, 0xec, 0xe4, 0x0a,
+ ],
+ [
+ 0x23, 0x50, 0x5d, 0xd0, 0x52, 0xd7, 0xd8, 0xea, 0x72, 0xec, 0xe0, 0x81, 0xc0,
+ 0xba, 0x48, 0xdf, 0xe6, 0xdc, 0x3c, 0xf6, 0xb5, 0x46, 0x95, 0x8f, 0x06, 0xa4,
+ 0x2e, 0x17, 0x67, 0x1a, 0x12, 0x2a, 0xdd, 0xbc, 0xf2, 0x81, 0xf4, 0x72, 0xa5,
+ 0x24, 0x0e, 0xb6, 0x2d, 0x57, 0x9f, 0xdc, 0xcc, 0xd6, 0xa0, 0xd6, 0xe4, 0x94,
+ 0xbe, 0x4e, 0x85, 0xf3, 0xac, 0x7f, 0xfd, 0xfe, 0x3e, 0xf7, 0x83, 0x9d,
+ ]
+ ),
+ test_case!(
+ [
+ 0xe2, 0xaf, 0x9b, 0x6b, 0x3c, 0x12, 0x91, 0x6c, 0xd5, 0x1a, 0xd1, 0xa7, 0x0b,
+ 0x36, 0x4a, 0x56, 0x70, 0x90, 0xee, 0xa9, 0xaa, 0x5a, 0xf2, 0x45, 0x62, 0x03,
+ 0x1c, 0x46, 0x10,
+ ],
+ [
+ 0xa2, 0xce, 0xfe, 0x9b, 0xe9, 0x4e, 0x41, 0xaa, 0x20, 0xe9, 0xd7, 0x70, 0x0f,
+ 0x9d, 0xe8, 0x7e, 0x35, 0xff, 0x30, 0x44,
+ ],
+ [
+ 0xb6, 0xc1, 0xea, 0x92, 0x66, 0x58, 0x97, 0xe0, 0x05, 0x08, 0x46, 0x3d, 0xcc,
+ 0xf6, 0xd8, 0x63, 0x69, 0x63, 0x09, 0xf1, 0x0a, 0x13, 0xdc, 0x53, 0x79, 0xdf,
+ 0xa4, 0x72, 0x3e, 0xc3, 0x69, 0xb0,
+ ],
+ [
+ 0x6e, 0x93, 0xe2, 0xd7, 0x75, 0x83, 0xdc, 0x1d, 0xe9, 0x77, 0x44, 0xd4, 0xa1,
+ 0x89, 0x83, 0x00, 0xe8, 0xee, 0xca, 0x9f, 0x96, 0x97, 0x9f, 0x2f, 0x9e, 0x9c,
+ 0xc3, 0x4f, 0x42, 0x6f, 0x3e, 0x24, 0xc4, 0x13, 0x91, 0x6a, 0x47, 0xb2, 0x76,
+ 0x09, 0x57, 0xf3, 0x49, 0x5a, 0xdc, 0xd0, 0x4d, 0x32,
+ ],
+ [
+ 0xb8, 0xa8, 0x36, 0xac, 0xa9, 0xda, 0xd7, 0x9c, 0x51, 0x73, 0x5d, 0x68, 0xf0,
+ 0x35, 0xb1, 0x56, 0xe2, 0x39, 0xab, 0xa5, 0x34, 0x25, 0x58, 0xff, 0x6b, 0x15,
+ 0x54, 0x19, 0x9d, 0xf8, 0x2d, 0xbe, 0x19, 0x0a, 0x20, 0x65, 0xc0, 0x8c, 0x88,
+ 0xa2, 0x0a, 0xd6, 0xa0, 0xe4, 0x68, 0x63, 0x0b, 0xd4, 0x97, 0x52, 0x1a, 0xab,
+ 0x37, 0x53, 0x12, 0xa5, 0xc3, 0xb6, 0x5c, 0xf2, 0x4d, 0x8b, 0x28, 0x81,
+ ]
+ ),
+ test_case!(
+ [
+ 0x6e, 0xfa, 0x7b, 0x4a, 0x1c, 0x28, 0x36, 0x70, 0x73, 0x82, 0x19, 0xb7, 0xca,
+ 0xd0, 0xaf, 0x7a, 0x2b, 0xc1, 0x65, 0x56, 0x07, 0x84, 0xd2, 0x78, 0xa7, 0xc7,
+ 0x19, 0x9d, 0x5d, 0xc2,
+ ],
+ [
+ 0xf7, 0x6d, 0xc0, 0xd0, 0x81, 0xf3, 0xe2, 0x66, 0xda, 0xff, 0xa8, 0x5d, 0xd6,
+ 0x11, 0x50, 0xf1, 0x9e, 0xc4, 0x6f, 0x73,
+ ],
+ [
+ 0xbd, 0x13, 0x3f, 0x21, 0xdc, 0x8f, 0x72, 0x5f, 0xc1, 0x9a, 0x6d, 0x49, 0x68,
+ 0xd5, 0x86, 0x63, 0xce, 0xf6, 0xad, 0x1d, 0xca, 0x92, 0x67, 0xf2, 0xb2, 0xad,
+ 0x48, 0x85, 0x92, 0x71, 0x0e, 0xa9,
+ ],
+ [
+ 0xdd, 0x77, 0xdf, 0xdc, 0x09, 0xca, 0x11, 0x9a, 0x71, 0x9b, 0x1a, 0xf0, 0xa6,
+ 0x0d, 0x12, 0xd5, 0x0d, 0x30, 0xd5, 0x97, 0x4e, 0xe4, 0xf2, 0x47, 0xad, 0xe1,
+ 0xa2, 0x3e, 0x3b, 0x87, 0x0a, 0xb5, 0xcb, 0x77, 0x5d, 0xea, 0xc4, 0x24, 0xbe,
+ 0xdb, 0xe5, 0x61, 0x5d, 0xad, 0x5d, 0xe7, 0x2a, 0x7e,
+ ],
+ [
+ 0x33, 0x40, 0xab, 0xc2, 0x47, 0xe2, 0xf1, 0xb1, 0x72, 0xfc, 0x8f, 0x21, 0xe7,
+ 0x9c, 0x38, 0x47, 0xa6, 0xd8, 0xc9, 0x63, 0x68, 0xe7, 0x82, 0x42, 0xeb, 0xfa,
+ 0xdb, 0x11, 0x40, 0x30, 0x94, 0xd9, 0x80, 0xe0, 0x8a, 0x6f, 0x2a, 0xe2, 0xdb,
+ 0x9c, 0x6f, 0xc2, 0xe5, 0x5f, 0x9f, 0x65, 0x39, 0x84, 0xe5, 0xd2, 0x9b, 0x9b,
+ 0x55, 0xa7, 0x1f, 0xca, 0xb4, 0x07, 0xc3, 0xe3, 0x6c, 0x33, 0xfb, 0xe7,
+ ]
+ ),
+ test_case!(
+ [
+ 0xb1, 0x17, 0x7b, 0x96, 0x47, 0x7a, 0xf0, 0x55, 0x34, 0x29, 0x6c, 0x56, 0x85,
+ 0xea, 0xf6, 0x6a, 0x88, 0x25, 0x3a, 0xdb, 0x89, 0x15, 0x5b, 0x52, 0x4a, 0x82,
+ 0x2c, 0x0a, 0xc6, 0x7b, 0xb6,
+ ],
+ [
+ 0x92, 0x25, 0xcb, 0x49, 0x05, 0xef, 0x9d, 0x4e, 0x69, 0xa5, 0xd0, 0x10, 0x4e,
+ 0x14, 0x2a, 0x2d, 0x94, 0x8e, 0x45, 0xb9,
+ ],
+ [
+ 0xe4, 0xf1, 0x9f, 0xc0, 0x5e, 0x0d, 0xb2, 0x3e, 0x43, 0xc5, 0xbb, 0xfb, 0x83,
+ 0xf5, 0xa0, 0x92, 0xdc, 0xee, 0x23, 0xde, 0x5e, 0xe5, 0xd0, 0x42, 0x21, 0xc4,
+ 0x76, 0x59, 0x97, 0x4d, 0x9d, 0xcd,
+ ],
+ [
+ 0xb3, 0x8f, 0xc1, 0x95, 0xed, 0x3a, 0x19, 0xf1, 0x77, 0xbe, 0x5c, 0x97, 0xc4,
+ 0x23, 0x88, 0xef, 0x6c, 0x66, 0xdb, 0xa0, 0xb2, 0x46, 0x72, 0x48, 0x33, 0x01,
+ 0x15, 0x44, 0x4c, 0x74, 0x7c, 0x39, 0x37, 0x73, 0xdc, 0x27, 0xf2, 0x2d, 0xda,
+ 0x32, 0x8d, 0x81, 0x86, 0x22, 0xa5, 0xda, 0xab, 0x75,
+ ],
+ [
+ 0xe5, 0x89, 0x07, 0x2a, 0x25, 0xcb, 0xab, 0x14, 0xfe, 0xba, 0xed, 0x44, 0x28,
+ 0xd9, 0x59, 0x3a, 0xac, 0x07, 0xf9, 0x7d, 0x51, 0x34, 0xdf, 0xe5, 0x30, 0x1e,
+ 0xeb, 0x77, 0xee, 0xb0, 0xe4, 0xca, 0x72, 0xb6, 0xd9, 0x1e, 0x43, 0x6f, 0x27,
+ 0x5b, 0xb8, 0x39, 0x18, 0x17, 0xa1, 0x1e, 0x56, 0x65, 0x59, 0xa7, 0x5e, 0xbc,
+ 0x19, 0xe0, 0x90, 0x51, 0xe5, 0x6f, 0x05, 0xd2, 0xdf, 0x07, 0x4f, 0xf0,
+ ]
+ ),
+ test_case!(
+ [
+ 0x41, 0x9a, 0x9f, 0x71, 0x32, 0x26, 0x56, 0x43, 0x50, 0x5b, 0x95, 0xed, 0xdc,
+ 0x61, 0x3f, 0xfa, 0xd2, 0x63, 0x32, 0x29, 0xf8, 0xad, 0x49, 0xc7, 0x8a, 0x45,
+ 0x3c, 0x35, 0x06, 0xd2, 0x28, 0x7b,
+ ],
+ [
+ 0x33, 0xe5, 0xfe, 0x15, 0x13, 0x0c, 0xa8, 0x67, 0xd6, 0x67, 0x84, 0xa0, 0x43,
+ 0x26, 0x26, 0xae, 0x9d, 0x1e, 0x62, 0xfb,
+ ],
+ [
+ 0xf0, 0xbf, 0xf8, 0xdc, 0x02, 0x0a, 0x3d, 0xa2, 0x2d, 0x67, 0xc6, 0x6a, 0x7c,
+ 0x9c, 0x09, 0x10, 0x47, 0xc7, 0x40, 0x3c, 0xcc, 0x92, 0x23, 0x83, 0xea, 0xaf,
+ 0xf2, 0x19, 0xed, 0x5e, 0x02, 0x00,
+ ],
+ [
+ 0x6a, 0xd7, 0x1a, 0x9f, 0xb6, 0x59, 0xfb, 0x71, 0xc1, 0x4c, 0x56, 0x50, 0x35,
+ 0x3d, 0xe5, 0xbc, 0xdb, 0x64, 0x1b, 0xe9, 0x76, 0x9a, 0xbd, 0x75, 0x5f, 0xdb,
+ 0xcd, 0xa7, 0x45, 0x57, 0x48, 0x02, 0x68, 0x6f, 0x39, 0x82, 0xa4, 0xa5, 0x6d,
+ 0xbf, 0x94, 0x4b, 0x31, 0x5f, 0xa6, 0xf5, 0x2b, 0xe4,
+ ],
+ [
+ 0xdd, 0x67, 0x25, 0xd6, 0x97, 0xa6, 0xf0, 0xfa, 0xb1, 0x0b, 0x61, 0x14, 0x07,
+ 0x73, 0x12, 0x37, 0x74, 0x91, 0x7c, 0x72, 0xe1, 0xdf, 0x4c, 0x05, 0x9a, 0xc1,
+ 0x84, 0x66, 0x0c, 0xb6, 0x94, 0x21, 0x2b, 0x22, 0x1c, 0x2b, 0x0e, 0xd4, 0x1b,
+ 0xcf, 0xfb, 0xbc, 0xbb, 0x46, 0x03, 0x0b, 0xde, 0x77, 0x67, 0xf8, 0xa6, 0x06,
+ 0xa2, 0x6c, 0x7a, 0x92, 0x6e, 0x9f, 0xa9, 0x83, 0x14, 0xd3, 0x4b, 0x9b,
+ ]
+ ),
+ test_case!(
+ [
+ 0xdc, 0x62, 0x11, 0x60, 0x97, 0xf2, 0x10, 0x7d, 0xe9, 0xa2, 0xd5, 0xc7, 0xd4,
+ 0x21, 0x0f, 0x82, 0x31, 0x0f, 0xbd, 0x2f, 0x3d, 0x0c, 0xaf, 0x16, 0x70, 0x5f,
+ 0xe3, 0x93, 0xac, 0x48, 0x08, 0x4c, 0x6c,
+ ],
+ [
+ 0x27, 0x34, 0x2f, 0x59, 0x11, 0x5f, 0x41, 0xc1, 0x4d, 0xa1, 0x12, 0x59, 0x8e,
+ 0x0f, 0x85, 0x74, 0x85, 0x73, 0xe1, 0x1b,
+ ],
+ [
+ 0x12, 0xe1, 0x41, 0xca, 0x13, 0x3b, 0xee, 0xdb, 0x18, 0xbe, 0xf2, 0xfd, 0x8e,
+ 0x2a, 0xff, 0xb2, 0x9f, 0x40, 0xd3, 0x16, 0x01, 0xfc, 0x2d, 0x76, 0x9f, 0x7a,
+ 0xf0, 0x39, 0xb3, 0x97, 0x4a, 0x7d,
+ ],
+ [
+ 0x3b, 0x6e, 0x51, 0x91, 0x8b, 0x7d, 0x02, 0x3d, 0x1c, 0x4b, 0xba, 0xe3, 0xba,
+ 0x39, 0x70, 0x10, 0x0e, 0xd3, 0x05, 0x83, 0xd8, 0x42, 0x49, 0x27, 0xde, 0x61,
+ 0x81, 0x29, 0xfe, 0xc4, 0x42, 0x3d, 0x18, 0xc3, 0x9c, 0x9a, 0x26, 0x71, 0x11,
+ 0x7e, 0xb1, 0xd6, 0x74, 0x4f, 0xd2, 0xaa, 0x60, 0x9f,
+ ],
+ [
+ 0xc2, 0x72, 0xff, 0xe7, 0x5f, 0x13, 0xcf, 0xb3, 0xf7, 0x3d, 0x76, 0x5c, 0x45,
+ 0xe8, 0x95, 0x43, 0x22, 0x0f, 0x42, 0xd2, 0xfe, 0x6b, 0x9c, 0x88, 0xf9, 0x43,
+ 0x8f, 0x3e, 0x8d, 0x54, 0x0d, 0xe9, 0xde, 0xe0, 0xcd, 0x84, 0x8b, 0xca, 0xbd,
+ 0x67, 0x07, 0x11, 0x0d, 0x1d, 0x99, 0xe8, 0xb2, 0x7f, 0xff, 0x97, 0x1f, 0x16,
+ 0xd7, 0xf4, 0x5f, 0x04, 0x8e, 0x89, 0x97, 0xcd, 0xff, 0x56, 0x58, 0xcc,
+ ]
+ ),
+ test_case!(
+ [
+ 0x6f, 0x56, 0xad, 0xd8, 0x88, 0xaa, 0xe5, 0x66, 0xc6, 0xee, 0x07, 0xf5, 0x26,
+ 0x3e, 0xc7, 0xd7, 0x29, 0xf3, 0xc3, 0x0c, 0xe6, 0x0f, 0x7e, 0x12, 0x8a, 0x9a,
+ 0xa1, 0x61, 0x90, 0xe1, 0x65, 0x53, 0x51, 0x79,
+ ],
+ [
+ 0x30, 0xac, 0x24, 0xff, 0x40, 0x9b, 0x5b, 0x10, 0x49, 0x9c, 0x18, 0xfb, 0xf8,
+ 0xba, 0x32, 0xf0, 0x45, 0x28, 0x1a, 0xc2,
+ ],
+ [
+ 0x5c, 0x18, 0x9a, 0x98, 0x5a, 0xcc, 0x69, 0xe2, 0x9d, 0xe6, 0xd7, 0xd2, 0xb2,
+ 0x53, 0x07, 0x4a, 0xcd, 0x39, 0xc5, 0x92, 0x14, 0x1f, 0xbf, 0x67, 0x1b, 0x5a,
+ 0x29, 0x47, 0xcd, 0xc2, 0x38, 0x6f,
+ ],
+ [
+ 0x00, 0x20, 0x20, 0x82, 0x9f, 0x45, 0xd8, 0x34, 0xae, 0x4a, 0xd6, 0xcd, 0x37,
+ 0xe4, 0x9c, 0x91, 0x39, 0xad, 0xf9, 0xaf, 0xae, 0x1c, 0x09, 0x6f, 0x32, 0x95,
+ 0xc9, 0xe2, 0xcf, 0x59, 0x04, 0xec, 0x27, 0xd8, 0x94, 0x2a, 0xce, 0xd8, 0xd1,
+ 0xff, 0xd9, 0x9f, 0x2d, 0x0e, 0x32, 0x45, 0x2c, 0xce,
+ ],
+ [
+ 0x7a, 0x4d, 0x9a, 0x8e, 0x1a, 0x7a, 0x7a, 0x18, 0x44, 0xfb, 0x50, 0xce, 0xbc,
+ 0x71, 0x8b, 0xe6, 0x06, 0x8e, 0x2b, 0xd1, 0x3e, 0x82, 0xee, 0xdb, 0xd0, 0x55,
+ 0xa9, 0xb8, 0xb6, 0x79, 0xc9, 0x61, 0xcb, 0x06, 0xbe, 0xaf, 0x89, 0x2d, 0xde,
+ 0x7b, 0x06, 0x44, 0xba, 0xdb, 0xe3, 0xf5, 0xda, 0x6b, 0x61, 0x63, 0x19, 0x2e,
+ 0xf0, 0xd9, 0xe1, 0xb3, 0xce, 0x5e, 0xf5, 0x3b, 0x6a, 0x82, 0x2e, 0x62,
+ ]
+ ),
+ test_case!(
+ [
+ 0x51, 0xf3, 0x34, 0xe7, 0x7e, 0xcc, 0x29, 0x8c, 0x68, 0x57, 0xec, 0xe7, 0x86,
+ 0x8b, 0xde, 0xd4, 0x64, 0xa3, 0x30, 0xe3, 0x2d, 0xd1, 0x39, 0xb1, 0x06, 0xe0,
+ 0x66, 0xb7, 0x99, 0x34, 0xa9, 0x70, 0x1b, 0x18, 0xa6,
+ ],
+ [
+ 0xd0, 0x87, 0xbc, 0xb9, 0xac, 0x61, 0xd6, 0xd9, 0x5e, 0xc1, 0x44, 0x6e, 0x97,
+ 0x01, 0xe9, 0xc3, 0x2c, 0x34, 0x7e, 0x94,
+ ],
+ [
+ 0xdf, 0x9b, 0x7b, 0x38, 0x62, 0x03, 0x07, 0x80, 0x9e, 0x4f, 0x99, 0xa3, 0x34,
+ 0x37, 0x2d, 0xb1, 0xbb, 0x6b, 0x81, 0x89, 0xa1, 0x25, 0x79, 0x8e, 0x90, 0xb9,
+ 0xa5, 0x2b, 0x67, 0x43, 0x61, 0xeb,
+ ],
+ [
+ 0x1f, 0x29, 0x36, 0xe6, 0x63, 0x36, 0x87, 0xb2, 0x35, 0xe0, 0xba, 0x66, 0x3a,
+ 0x91, 0xdc, 0x97, 0x71, 0xd3, 0x39, 0x60, 0x7c, 0x85, 0x2f, 0x6a, 0x4a, 0x60,
+ 0xf8, 0x43, 0x4a, 0x94, 0x85, 0xe3, 0x4d, 0xee, 0xfb, 0x18, 0x5c, 0x77, 0xad,
+ 0xdb, 0xd7, 0xb1, 0x70, 0xd9, 0x95, 0x17, 0xa8, 0x1c,
+ ],
+ [
+ 0x84, 0xc2, 0x32, 0xd8, 0x6d, 0xb9, 0x62, 0x96, 0x94, 0x7c, 0xbf, 0x6b, 0xd1,
+ 0x05, 0xf5, 0xe4, 0xfe, 0x6b, 0x66, 0x69, 0x3b, 0x6c, 0x35, 0xb3, 0x11, 0x28,
+ 0xd9, 0x67, 0x7a, 0xb7, 0xa6, 0x37, 0x1f, 0x75, 0x2a, 0xf9, 0x31, 0x3c, 0xcb,
+ 0xf7, 0xb4, 0xd6, 0xfb, 0x39, 0xbb, 0x98, 0xe4, 0x32, 0x90, 0xf6, 0x01, 0x8d,
+ 0x20, 0x27, 0x7e, 0xad, 0x9e, 0x04, 0x30, 0x32, 0x12, 0x83, 0x5e, 0x09,
+ ]
+ ),
+ test_case!(
+ [
+ 0x74, 0x3a, 0x02, 0xd0, 0x15, 0xee, 0xdd, 0x7a, 0x0b, 0xbd, 0x52, 0x00, 0x99,
+ 0xce, 0x2c, 0xc5, 0xbd, 0x5e, 0x56, 0xba, 0x28, 0x48, 0xf3, 0xa7, 0x3c, 0xaf,
+ 0x62, 0x6e, 0xf1, 0x9d, 0x78, 0x01, 0xfb, 0xf1, 0x56, 0xf6,
+ ],
+ [
+ 0xeb, 0x3c, 0x1d, 0xaf, 0x0d, 0x1c, 0x66, 0x57, 0x99, 0xf1, 0xaf, 0xbe, 0xb1,
+ 0xff, 0xbf, 0xf4, 0x8c, 0x11, 0x16, 0x8f,
+ ],
+ [
+ 0x5b, 0x67, 0x80, 0xf1, 0x41, 0x6b, 0x0b, 0xf5, 0x0d, 0xc7, 0x92, 0xf7, 0x96,
+ 0x1e, 0xca, 0xaf, 0x91, 0x8d, 0xba, 0xfb, 0x8f, 0xea, 0x75, 0xcf, 0xf9, 0xd8,
+ 0xc5, 0x88, 0xa2, 0x96, 0x72, 0x15,
+ ],
+ [
+ 0xa3, 0xa6, 0xfc, 0xfa, 0x55, 0x1c, 0xbc, 0xf3, 0x25, 0x1b, 0x80, 0xb8, 0xd4,
+ 0xe1, 0x95, 0x3a, 0xaf, 0xb7, 0x13, 0x7e, 0xa0, 0x88, 0x9e, 0xc8, 0xa9, 0x33,
+ 0xca, 0xda, 0x93, 0x4b, 0x12, 0x4f, 0xd2, 0x85, 0xbb, 0x49, 0x01, 0xc8, 0x26,
+ 0x01, 0x3f, 0x0e, 0xfa, 0x12, 0x5e, 0x44, 0x14, 0xb4,
+ ],
+ [
+ 0x19, 0xa5, 0x0c, 0xae, 0x5f, 0x4d, 0x6a, 0xdb, 0x19, 0x03, 0x58, 0x88, 0xf3,
+ 0x44, 0xed, 0x4e, 0xdf, 0xc2, 0x2d, 0xe3, 0xd7, 0x2d, 0xba, 0x63, 0xa6, 0x2a,
+ 0x0b, 0x12, 0x40, 0x78, 0x5a, 0x06, 0xd7, 0xe8, 0x16, 0x38, 0x87, 0x75, 0x15,
+ 0x24, 0xe1, 0xa0, 0xde, 0x44, 0x5c, 0x47, 0x84, 0x38, 0x3d, 0xc6, 0x06, 0xff,
+ 0xad, 0x6e, 0x2d, 0xbe, 0x3c, 0xb1, 0x4a, 0x67, 0xc7, 0x82, 0x91, 0x8e,
+ ]
+ ),
+ test_case!(
+ [
+ 0xee, 0x55, 0x5c, 0x2e, 0x82, 0x69, 0x79, 0x10, 0xa0, 0x46, 0x7b, 0x3a, 0x9a,
+ 0xd4, 0xbe, 0x62, 0xc3, 0x57, 0xc9, 0x57, 0x6b, 0xfe, 0x0f, 0x75, 0x2e, 0xb9,
+ 0x3a, 0x21, 0x5e, 0xb4, 0x65, 0x56, 0x20, 0xf2, 0xa3, 0x33, 0x7c,
+ ],
+ [
+ 0x5c, 0xc1, 0x0f, 0x43, 0x53, 0x49, 0xd7, 0x56, 0x56, 0x05, 0x4d, 0x16, 0xaf,
+ 0xbc, 0x1b, 0xc5, 0xd7, 0x67, 0xbf, 0xf6,
+ ],
+ [
+ 0x92, 0xd9, 0x3f, 0xf3, 0x71, 0x99, 0x45, 0x7f, 0x40, 0x38, 0x0f, 0x1a, 0x1c,
+ 0x34, 0xf8, 0x09, 0xa1, 0x20, 0x41, 0xb0, 0xa1, 0x19, 0x2f, 0xcc, 0x5a, 0xab,
+ 0xe3, 0xcc, 0xcf, 0x50, 0xb0, 0xb2,
+ ],
+ [
+ 0x0e, 0xc7, 0x58, 0x8b, 0x1f, 0x59, 0x71, 0x4b, 0x06, 0x5e, 0x75, 0x67, 0x52,
+ 0xbe, 0x56, 0xec, 0xdd, 0x83, 0x49, 0x0c, 0x7f, 0x1b, 0xa1, 0x05, 0x68, 0xaf,
+ 0xf9, 0x1e, 0x48, 0x7b, 0x9c, 0xcf, 0x03, 0xea, 0xbf, 0xff, 0x0a, 0x88, 0x61,
+ 0xfd, 0xf0, 0x02, 0xb8, 0x6a, 0x2e, 0xc5, 0xb3, 0x3a,
+ ],
+ [
+ 0x13, 0x16, 0x50, 0xf5, 0x2a, 0x49, 0x75, 0x05, 0xb8, 0x03, 0x78, 0x00, 0xed,
+ 0x7e, 0x5e, 0x3a, 0x69, 0xf7, 0x3b, 0x9a, 0x46, 0xef, 0xf0, 0xc9, 0x96, 0xa1,
+ 0xdb, 0x08, 0x0f, 0x13, 0x58, 0xa3, 0x18, 0xca, 0x09, 0x1e, 0xe6, 0xfc, 0x18,
+ 0x0c, 0xd0, 0xad, 0x90, 0x56, 0xef, 0xc3, 0x19, 0xeb, 0x46, 0x37, 0x45, 0x64,
+ 0x1c, 0x81, 0x42, 0x39, 0x4d, 0x46, 0x10, 0x04, 0xe9, 0x4d, 0x8a, 0xa6,
+ ]
+ ),
+ test_case!(
+ [
+ 0xd7, 0x88, 0x2d, 0x5a, 0xee, 0x5a, 0xbb, 0x51, 0xe0, 0x48, 0xfd, 0xed, 0xfa,
+ 0x23, 0xa6, 0xde, 0x55, 0x68, 0x3e, 0x58, 0x56, 0x45, 0x0f, 0x12, 0x73, 0x7b,
+ 0xd7, 0xc7, 0xeb, 0x88, 0xf6, 0x57, 0xad, 0x64, 0x77, 0x09, 0x46, 0x55,
+ ],
+ [
+ 0x16, 0x09, 0x24, 0xdb, 0x8f, 0x81, 0xc5, 0x6d, 0x84, 0xc8, 0x52, 0x2e, 0x1b,
+ 0x20, 0xb4, 0x09, 0x29, 0x0a, 0x48, 0xed,
+ ],
+ [
+ 0x37, 0xe0, 0xf2, 0xa5, 0x5f, 0xf6, 0xcb, 0x9c, 0x1c, 0xbd, 0x96, 0x6f, 0xf1,
+ 0x0f, 0x80, 0xd5, 0xcb, 0xe9, 0xf4, 0xfa, 0x40, 0x4f, 0x0d, 0x36, 0xa4, 0xb7,
+ 0x5b, 0x4a, 0x3a, 0xe3, 0xb1, 0xb8,
+ ],
+ [
+ 0x9f, 0xce, 0x73, 0xb7, 0x50, 0xa7, 0x7d, 0x5f, 0xd9, 0x76, 0x49, 0xf9, 0x9e,
+ 0xc5, 0xb9, 0x4a, 0x9b, 0x25, 0xcf, 0x0b, 0x14, 0x49, 0xfc, 0xd6, 0x9f, 0x3d,
+ 0xcf, 0x1d, 0xb8, 0xbc, 0x45, 0xda, 0x11, 0x02, 0xb3, 0x0a, 0x43, 0x65, 0x33,
+ 0xb6, 0xf5, 0xe8, 0x9c, 0x60, 0x8b, 0x7b, 0x38, 0x79,
+ ],
+ [
+ 0x34, 0xff, 0x6e, 0x2b, 0xa9, 0x2a, 0x37, 0x3a, 0x21, 0x4f, 0xbd, 0x6c, 0x4c,
+ 0x81, 0xea, 0xfc, 0xa6, 0xc4, 0xc6, 0xb1, 0x73, 0x51, 0x32, 0x10, 0x7a, 0x02,
+ 0x87, 0x80, 0x81, 0x7e, 0xfd, 0x20, 0x97, 0x63, 0xa7, 0x96, 0xba, 0xa4, 0x29,
+ 0x49, 0xad, 0x78, 0x24, 0xe7, 0x72, 0xac, 0x37, 0x86, 0x86, 0xd5, 0x42, 0x25,
+ 0x94, 0x59, 0xec, 0x97, 0x74, 0x70, 0x7f, 0x2c, 0x2c, 0x95, 0x9b, 0x18,
+ ]
+ ),
+ test_case!(
+ [
+ 0xfd, 0xec, 0xa1, 0xea, 0xd1, 0x0f, 0x2d, 0xb9, 0x2e, 0xce, 0x0f, 0x10, 0x28,
+ 0xb5, 0x8a, 0x23, 0xfd, 0xed, 0xc1, 0x64, 0xab, 0xfc, 0x52, 0x9d, 0x17, 0xe5,
+ 0x44, 0x29, 0xd3, 0x76, 0x1b, 0xe7, 0x99, 0xf5, 0x47, 0xa9, 0xc4, 0xb6, 0x55,
+ ],
+ [
+ 0x70, 0x84, 0x56, 0xb0, 0xb7, 0xa0, 0x97, 0x3d, 0x11, 0x27, 0x60, 0xd2, 0x88,
+ 0x67, 0x5c, 0xca, 0x8e, 0x44, 0xfc, 0x93,
+ ],
+ [
+ 0x9f, 0xb9, 0x5b, 0x27, 0x10, 0xe7, 0x13, 0xb0, 0x9d, 0x35, 0xe2, 0x68, 0x4c,
+ 0x8c, 0x01, 0x63, 0xcd, 0xc1, 0xf2, 0x01, 0x30, 0x10, 0x42, 0x87, 0xe4, 0xa3,
+ 0x22, 0x35, 0x55, 0xbc, 0xfb, 0x96,
+ ],
+ [
+ 0x5e, 0x04, 0xa0, 0x59, 0x2e, 0xf1, 0xe6, 0xf2, 0x18, 0xd8, 0xdc, 0xa6, 0xf8,
+ 0xf7, 0x88, 0x32, 0xa1, 0xec, 0x48, 0x04, 0xfc, 0xa7, 0xf6, 0xa2, 0x8b, 0x3e,
+ 0x8f, 0x7e, 0xa8, 0x64, 0x87, 0x25, 0x4b, 0xba, 0xc7, 0x27, 0x4c, 0xee, 0xe4,
+ 0x93, 0xbb, 0x1d, 0x62, 0x71, 0xfc, 0xe1, 0x22, 0x54,
+ ],
+ [
+ 0x03, 0x7c, 0x2c, 0x76, 0x85, 0xd0, 0xca, 0x2d, 0x9c, 0xbd, 0xe6, 0xe8, 0x42,
+ 0xd6, 0xcd, 0x65, 0x74, 0xaf, 0xd2, 0x95, 0xfb, 0x8c, 0xc6, 0x25, 0x14, 0x13,
+ 0x8d, 0x9f, 0x50, 0x59, 0x63, 0x03, 0xc2, 0x29, 0x92, 0x06, 0x22, 0xc8, 0x85,
+ 0x03, 0x6a, 0x29, 0x84, 0x71, 0xc3, 0xd1, 0x47, 0x49, 0x66, 0x8f, 0xa1, 0xa5,
+ 0xb3, 0xa6, 0x78, 0x95, 0x98, 0x7e, 0x23, 0x81, 0xc9, 0xd5, 0x4f, 0xd1,
+ ]
+ ),
+ test_case!(
+ [
+ 0x26, 0x66, 0x74, 0xa4, 0x1d, 0x40, 0x05, 0x26, 0x6d, 0xa3, 0x5b, 0xd1, 0xb9,
+ 0x71, 0xd0, 0xb2, 0xa2, 0xad, 0xd6, 0xa8, 0x77, 0x9d, 0x32, 0xd7, 0x5b, 0x48,
+ 0xa9, 0x45, 0x52, 0x63, 0x65, 0xe1, 0x49, 0xce, 0x04, 0x25, 0xcf, 0x93, 0x28,
+ 0x08,
+ ],
+ [
+ 0x43, 0xe8, 0x6b, 0x9c, 0x6b, 0xcb, 0x9f, 0x02, 0x8a, 0xa3, 0x6a, 0xc8, 0x65,
+ 0xaa, 0x5d, 0xea, 0xcc, 0x0b, 0xda, 0xc1,
+ ],
+ [
+ 0xa3, 0x7f, 0xd5, 0x05, 0xc4, 0x36, 0xba, 0xa1, 0xe5, 0x41, 0x73, 0xf2, 0x34,
+ 0xb3, 0x50, 0xd3, 0x09, 0xd6, 0xbf, 0xeb, 0x5c, 0x43, 0x42, 0xbe, 0x1e, 0xfd,
+ 0x80, 0x46, 0xc0, 0x26, 0x2a, 0x02,
+ ],
+ [
+ 0xee, 0x78, 0x5e, 0x97, 0x0d, 0x5e, 0x91, 0x76, 0x2a, 0x52, 0x5f, 0x2e, 0x99,
+ 0xb6, 0xd0, 0x53, 0x70, 0x8a, 0x34, 0x92, 0x31, 0xa1, 0xaf, 0x1c, 0x7f, 0x5d,
+ 0xbf, 0x36, 0x6f, 0x32, 0x3c, 0xe7, 0x80, 0xb3, 0x7c, 0x97, 0x7c, 0x09, 0x86,
+ 0xba, 0x25, 0xea, 0x94, 0x2d, 0xd8, 0x5d, 0xe4, 0x72,
+ ],
+ [
+ 0xde, 0xd0, 0x30, 0x07, 0xb0, 0x8c, 0x5b, 0x6a, 0xcf, 0xe7, 0xd6, 0x44, 0xdb,
+ 0x13, 0x7c, 0xcd, 0x46, 0x7b, 0xd3, 0xd7, 0x32, 0x92, 0xb4, 0xde, 0xc0, 0x59,
+ 0x66, 0x43, 0x03, 0x25, 0x87, 0xb9, 0x60, 0xa8, 0x07, 0xec, 0x3e, 0x5a, 0xe8,
+ 0x82, 0x99, 0x00, 0x9f, 0x8c, 0xba, 0x60, 0xca, 0x27, 0x08, 0xf1, 0x32, 0xe4,
+ 0x40, 0xd5, 0x65, 0x62, 0xd1, 0x40, 0x89, 0xc6, 0x01, 0xfb, 0xc6, 0xc6,
+ ]
+ ),
+ test_case!(
+ [
+ 0x20, 0x12, 0x93, 0xbe, 0xea, 0xc8, 0xde, 0x2d, 0xc6, 0x86, 0xe6, 0x33, 0xa5,
+ 0x00, 0xb6, 0xfb, 0x66, 0x05, 0xd6, 0xbf, 0x03, 0xc5, 0xea, 0x44, 0x15, 0x62,
+ 0x25, 0x34, 0x58, 0x5d, 0x3b, 0x13, 0x59, 0x20, 0x21, 0x42, 0xfa, 0xb4, 0xbe,
+ 0x2a, 0xb1,
+ ],
+ [
+ 0x8c, 0x93, 0xf9, 0x39, 0xd5, 0xe8, 0xe1, 0x89, 0xd1, 0x51, 0x09, 0xe1, 0xe8,
+ 0x85, 0x36, 0xdf, 0xf0, 0x03, 0xc3, 0x21,
+ ],
+ [
+ 0x33, 0x5e, 0xfd, 0x1e, 0xf1, 0x3f, 0x9a, 0x36, 0x70, 0xa3, 0x42, 0x75, 0x37,
+ 0x34, 0x20, 0xbe, 0xb6, 0x09, 0x50, 0x48, 0xd0, 0x6c, 0x63, 0xac, 0xb6, 0x2e,
+ 0x12, 0xaa, 0xe0, 0xd9, 0xbd, 0xf6,
+ ],
+ [
+ 0xe9, 0x9d, 0xf0, 0x00, 0xe8, 0x03, 0x98, 0x7a, 0x47, 0x6b, 0x48, 0xd4, 0xc8,
+ 0xdd, 0x6c, 0xf3, 0xdf, 0x20, 0x69, 0xa0, 0x82, 0xca, 0xe4, 0x32, 0xcc, 0x90,
+ 0x81, 0x3a, 0x19, 0xea, 0xf6, 0xe7, 0x22, 0x7d, 0x55, 0xd1, 0xee, 0x6e, 0x7d,
+ 0xe3, 0xa8, 0xdb, 0x9c, 0x73, 0x29, 0xd4, 0xdd, 0xd8,
+ ],
+ [
+ 0x7a, 0xb9, 0x04, 0x46, 0x5f, 0xc0, 0xdf, 0x7f, 0x3b, 0xb3, 0x92, 0xdc, 0xe8,
+ 0x58, 0x12, 0xd2, 0xf0, 0x61, 0x82, 0x6e, 0xeb, 0x64, 0x57, 0x14, 0x46, 0xb1,
+ 0xa6, 0x6a, 0x41, 0x45, 0x2c, 0x44, 0xa8, 0xf9, 0x2c, 0xe5, 0x91, 0xa0, 0x06,
+ 0x8c, 0xbe, 0xe9, 0xc2, 0x0e, 0x0b, 0x54, 0xad, 0x60, 0x94, 0x24, 0x71, 0x67,
+ 0xa5, 0xfd, 0x0c, 0x47, 0x0d, 0xb7, 0xe7, 0x0a, 0x52, 0x28, 0x76, 0xfa,
+ ]
+ ),
+ test_case!(
+ [
+ 0x25, 0x24, 0x4e, 0x7d, 0xd3, 0x5c, 0x19, 0x6c, 0x65, 0x4f, 0x27, 0x11, 0xd5,
+ 0xa9, 0xc6, 0xbe, 0x54, 0xb6, 0xa5, 0xb5, 0x58, 0x52, 0xcc, 0x84, 0x66, 0x23,
+ 0x15, 0x07, 0x50, 0xc2, 0x3e, 0xf8, 0xe2, 0x8d, 0x36, 0x94, 0x41, 0x65, 0x1a,
+ 0x65, 0xe3, 0x34,
+ ],
+ [
+ 0x27, 0x1b, 0x02, 0xa7, 0xaa, 0x9d, 0x9e, 0x4b, 0xbc, 0x8d, 0x61, 0x86, 0x60,
+ 0x13, 0x02, 0xfa, 0x67, 0x39, 0x55, 0xdf,
+ ],
+ [
+ 0x6e, 0x61, 0x59, 0xc6, 0x7c, 0x2f, 0x05, 0x87, 0xcf, 0xeb, 0x71, 0x36, 0x85,
+ 0xf0, 0x89, 0xc1, 0xf7, 0xf4, 0xf9, 0xfb, 0xf8, 0xc2, 0xf9, 0xfd, 0x92, 0xbe,
+ 0xaa, 0x1d, 0x92, 0xc5, 0x2b, 0x9f,
+ ],
+ [
+ 0xbc, 0x62, 0x9f, 0x44, 0x9f, 0x8c, 0x83, 0x39, 0x93, 0xda, 0xbe, 0xa0, 0xf8,
+ 0x91, 0xa9, 0xf9, 0xb5, 0x7c, 0x03, 0x8d, 0x35, 0x56, 0x02, 0xf2, 0xee, 0xff,
+ 0x4c, 0x32, 0xb3, 0x83, 0xd3, 0x22, 0x46, 0x87, 0x17, 0xf9, 0x77, 0x3e, 0x19,
+ 0xc6, 0x91, 0x6f, 0xb4, 0x68, 0x7c, 0xd3, 0x0a, 0x6e,
+ ],
+ [
+ 0x97, 0xa2, 0xce, 0x76, 0xb8, 0x38, 0x72, 0xbe, 0x8b, 0x06, 0x13, 0xf1, 0x94,
+ 0xfc, 0xd5, 0x15, 0x8d, 0xb8, 0x56, 0xf9, 0x4f, 0x39, 0x65, 0x92, 0x34, 0x2d,
+ 0x68, 0xcf, 0x26, 0x20, 0x0d, 0x8e, 0x15, 0x97, 0x04, 0x71, 0x12, 0x97, 0x12,
+ 0x45, 0xad, 0xe2, 0x67, 0x8d, 0xbe, 0x92, 0x97, 0x7a, 0x52, 0x01, 0x0c, 0x84,
+ 0x40, 0xf2, 0x3d, 0x4b, 0x41, 0x04, 0x34, 0xef, 0x88, 0x59, 0xe1, 0xb7,
+ ]
+ ),
+ test_case!(
+ [
+ 0x35, 0xe2, 0xf7, 0x9c, 0x2a, 0x74, 0x75, 0xfa, 0x8d, 0x56, 0x0f, 0x66, 0xc7,
+ 0xae, 0xe7, 0x96, 0x64, 0x0d, 0xf8, 0x8b, 0x66, 0x8a, 0xf4, 0x5d, 0x76, 0xd2,
+ 0x08, 0xc2, 0xf4, 0x46, 0x0e, 0x9d, 0x55, 0x27, 0x1f, 0x12, 0x95, 0x0b, 0xbf,
+ 0x5f, 0xfc, 0xa8, 0xd2,
+ ],
+ [
+ 0xda, 0x0a, 0x69, 0x3e, 0x9d, 0xca, 0x7f, 0x85, 0x5c, 0xd5, 0x28, 0x07, 0xeb,
+ 0x1f, 0xde, 0xc6, 0x17, 0xa8, 0xab, 0xd3,
+ ],
+ [
+ 0x71, 0x36, 0xfe, 0x0b, 0xf1, 0x1a, 0xf8, 0x79, 0x52, 0x97, 0xb1, 0x33, 0x4d,
+ 0x2d, 0x29, 0x4b, 0xe4, 0x8d, 0x47, 0x02, 0x36, 0xe6, 0x66, 0x45, 0xb9, 0x67,
+ 0xb8, 0xe9, 0xe6, 0xbe, 0xd7, 0xc0,
+ ],
+ [
+ 0x59, 0x74, 0x0e, 0x65, 0xca, 0x44, 0xa5, 0x2e, 0x39, 0x55, 0x85, 0x56, 0x17,
+ 0xc0, 0x50, 0x8e, 0x60, 0x90, 0xc8, 0x0d, 0xbe, 0x1b, 0x8d, 0x0e, 0x7c, 0xba,
+ 0xa6, 0xa2, 0xe6, 0x24, 0xf6, 0x7e, 0xc8, 0x9e, 0x6b, 0x66, 0xce, 0x35, 0x50,
+ 0x44, 0x37, 0x62, 0xb7, 0x90, 0x2f, 0xec, 0x27, 0x6a,
+ ],
+ [
+ 0x00, 0x13, 0x62, 0xed, 0x76, 0x71, 0xaf, 0x24, 0xf5, 0x64, 0x20, 0xd6, 0x23,
+ 0xf2, 0x26, 0xf7, 0xd3, 0x2e, 0xfa, 0xe4, 0xcb, 0x66, 0xd4, 0x5c, 0x2a, 0x9f,
+ 0x84, 0xc3, 0x5c, 0xd8, 0x5f, 0x98, 0x8a, 0x53, 0x1f, 0x29, 0x45, 0xb4, 0x82,
+ 0xf8, 0xea, 0x1a, 0x5d, 0xaa, 0xe0, 0x34, 0xdb, 0xc6, 0x0f, 0xd8, 0x7c, 0x47,
+ 0x9d, 0x50, 0x28, 0x3a, 0xec, 0x7c, 0x25, 0x15, 0xbe, 0xa4, 0xf8, 0x3b,
+ ]
+ ),
+ test_case!(
+ [
+ 0x1a, 0xc5, 0x22, 0x68, 0xc0, 0x9f, 0x87, 0xfc, 0x6a, 0x92, 0x3b, 0xc9, 0x69,
+ 0xfb, 0x43, 0x54, 0xa5, 0x10, 0x9c, 0x46, 0xf6, 0xb4, 0xa2, 0xd3, 0xe4, 0xd9,
+ 0xa6, 0x10, 0x0f, 0x4e, 0x1f, 0x73, 0x82, 0xe6, 0x2e, 0x8b, 0x91, 0xfe, 0x5c,
+ 0x58, 0x32, 0x05, 0x7f, 0x68,
+ ],
+ [
+ 0xbf, 0x02, 0xa6, 0x5f, 0xec, 0x11, 0x24, 0xb7, 0xcd, 0x7c, 0x9d, 0xba, 0x2f,
+ 0xa0, 0xb0, 0x46, 0xff, 0x30, 0xd2, 0x86,
+ ],
+ [
+ 0x67, 0x96, 0xa7, 0xc3, 0x09, 0x09, 0xf3, 0xa3, 0x94, 0x7d, 0x36, 0x9c, 0xb7,
+ 0x4b, 0x9f, 0x72, 0xf2, 0x59, 0x19, 0x5f, 0xb9, 0x08, 0x63, 0xf2, 0x2c, 0xfb,
+ 0x91, 0x2e, 0x2a, 0x77, 0xc9, 0x63,
+ ],
+ [
+ 0x38, 0xef, 0xde, 0xc2, 0xf7, 0xb4, 0xc5, 0x89, 0xe9, 0x06, 0x8a, 0x57, 0xcd,
+ 0x0b, 0x9e, 0x5a, 0x66, 0xe7, 0xe5, 0xd9, 0xef, 0xfa, 0xc6, 0xa8, 0xa6, 0x43,
+ 0xc6, 0xcd, 0x57, 0x93, 0x87, 0x8d, 0x92, 0x7a, 0xdc, 0x50, 0xff, 0x45, 0xad,
+ 0xdc, 0x7c, 0xe3, 0x46, 0xb8, 0x1a, 0x86, 0x3e, 0xd8,
+ ],
+ [
+ 0xd9, 0x2e, 0x8a, 0x61, 0x20, 0x24, 0x4e, 0x1a, 0x56, 0x2b, 0x76, 0xd5, 0xc7,
+ 0xcf, 0x69, 0xc7, 0x3a, 0xbd, 0xbb, 0x88, 0x3d, 0xe9, 0x16, 0x88, 0x7b, 0x32,
+ 0x8c, 0xde, 0x79, 0xa6, 0x03, 0x68, 0x7d, 0xef, 0x83, 0x71, 0xe9, 0xef, 0xdd,
+ 0x13, 0x36, 0x9b, 0xe5, 0x36, 0xa5, 0x60, 0x21, 0x9d, 0xc2, 0x9c, 0xa3, 0xff,
+ 0x3a, 0x54, 0xfa, 0xd7, 0x77, 0xa9, 0x50, 0x12, 0xfc, 0x14, 0xbc, 0x3f,
+ ]
+ ),
+ test_case!(
+ [
+ 0xfb, 0x6b, 0xac, 0xbe, 0x3a, 0x17, 0x39, 0x5a, 0x3c, 0x2b, 0x5c, 0x37, 0x9f,
+ 0xea, 0xf0, 0xf0, 0x64, 0x51, 0x36, 0xce, 0x1a, 0xe5, 0x95, 0x7b, 0x9f, 0x95,
+ 0x0b, 0x56, 0x9b, 0x09, 0x2d, 0xc8, 0x11, 0x36, 0xea, 0x1b, 0x99, 0x93, 0xe0,
+ 0x9a, 0x66, 0xb0, 0xa1, 0x4a, 0x66,
+ ],
+ [
+ 0xab, 0x81, 0x02, 0x81, 0x1a, 0x8c, 0x3b, 0xb3, 0x1d, 0x11, 0x1a, 0xe9, 0x51,
+ 0xa0, 0x0e, 0xd5, 0xa3, 0x9c, 0x5b, 0x96,
+ ],
+ [
+ 0xda, 0xb8, 0x83, 0x7a, 0x4f, 0xb7, 0x69, 0x05, 0x3a, 0xa4, 0x75, 0x01, 0xed,
+ 0xe9, 0x0f, 0xf7, 0xbd, 0x9b, 0xe6, 0x93, 0x9e, 0x44, 0x0f, 0x42, 0x6a, 0x2c,
+ 0x66, 0xa0, 0x23, 0x9d, 0xed, 0xea,
+ ],
+ [
+ 0x12, 0x1f, 0xa1, 0x78, 0x49, 0xd4, 0x36, 0x1c, 0xf4, 0xbc, 0x13, 0x85, 0x13,
+ 0xdf, 0x89, 0x5a, 0x95, 0xc3, 0xa1, 0xd6, 0xf3, 0xd0, 0x2f, 0xad, 0xb1, 0x9d,
+ 0x00, 0x84, 0xe8, 0x13, 0xb1, 0x66, 0xfd, 0x94, 0xd0, 0x02, 0xdc, 0x43, 0x9c,
+ 0xaf, 0x59, 0x11, 0x2b, 0x82, 0x24, 0x08, 0xe5, 0xb4,
+ ],
+ [
+ 0x33, 0x34, 0xcd, 0xbc, 0x7e, 0xcb, 0xea, 0xa8, 0xe4, 0x4a, 0xc5, 0xf9, 0x28,
+ 0xf9, 0x6b, 0x56, 0xc7, 0xb8, 0xb9, 0x90, 0xb2, 0xbd, 0x8a, 0xef, 0x99, 0x89,
+ 0x52, 0x62, 0x02, 0x9e, 0xf5, 0x26, 0x77, 0x5a, 0x4a, 0xa3, 0xc6, 0xa5, 0xf2,
+ 0x58, 0xcb, 0xa8, 0x99, 0xa6, 0x52, 0x85, 0xfe, 0xd7, 0x75, 0xae, 0x13, 0x70,
+ 0x10, 0x85, 0xf9, 0x0a, 0xa0, 0xc6, 0x7d, 0xd3, 0x59, 0xbb, 0x55, 0x01,
+ ]
+ ),
+ test_case!(
+ [
+ 0xaa, 0xdf, 0xb1, 0x66, 0x9c, 0x82, 0x45, 0x46, 0x36, 0x07, 0x8b, 0x78, 0x8b,
+ 0x67, 0xe3, 0x6d, 0xfa, 0x2a, 0xa2, 0xa2, 0x1d, 0xb6, 0x35, 0x19, 0x9b, 0xd9,
+ 0x5a, 0xa2, 0x5b, 0x96, 0xd1, 0xb4, 0x68, 0x00, 0xc0, 0x8c, 0x17, 0x50, 0x83,
+ 0x66, 0xbf, 0x83, 0x94, 0xd8, 0x46, 0x68,
+ ],
+ [
+ 0x9b, 0xd0, 0xb5, 0x2d, 0x27, 0x7f, 0x23, 0xa6, 0x32, 0xc2, 0xa8, 0x4a, 0x2d,
+ 0x61, 0x06, 0xae, 0x77, 0x63, 0x22, 0x14,
+ ],
+ [
+ 0xc2, 0x27, 0xd1, 0x71, 0x74, 0xf2, 0x4e, 0x1a, 0x98, 0x09, 0x1b, 0xb0, 0x2f,
+ 0xc0, 0x9f, 0xdf, 0x39, 0x0b, 0x60, 0x68, 0x37, 0x58, 0x21, 0x88, 0x0e, 0x58,
+ 0x46, 0x2b, 0x08, 0x99, 0xb8, 0x03,
+ ],
+ [
+ 0x31, 0xf2, 0xfd, 0xcd, 0x14, 0x19, 0x81, 0xe7, 0x29, 0x43, 0xbb, 0x27, 0xad,
+ 0x19, 0x17, 0x5a, 0xd4, 0xc4, 0x9d, 0x34, 0x0e, 0x6e, 0x74, 0xe4, 0x0f, 0xf4,
+ 0x0e, 0xb7, 0x19, 0xd7, 0xdc, 0x19, 0x89, 0xba, 0x2c, 0xe7, 0x8b, 0xed, 0xe8,
+ 0x10, 0x21, 0x15, 0x1d, 0x8b, 0x66, 0xdf, 0x37, 0x48,
+ ],
+ [
+ 0x1e, 0xd3, 0x26, 0xc3, 0xf3, 0x01, 0x12, 0x37, 0xdb, 0x2f, 0xd9, 0x33, 0x8d,
+ 0xb1, 0x3e, 0x7d, 0x50, 0xe4, 0xe8, 0xda, 0x8a, 0x5d, 0x4a, 0x02, 0xa3, 0x24,
+ 0xfc, 0x9d, 0x0e, 0x5e, 0x1b, 0x73, 0x97, 0x2a, 0xbd, 0xe3, 0x04, 0x6d, 0x54,
+ 0xcc, 0xd9, 0x67, 0xa5, 0xdf, 0x37, 0xc6, 0x6c, 0x9a, 0x2c, 0xb7, 0x12, 0x80,
+ 0x18, 0xd6, 0x94, 0x4a, 0xc1, 0x19, 0x7b, 0x4c, 0x26, 0x58, 0x12, 0x31,
+ ]
+ ),
+ test_case!(
+ [
+ 0xd7, 0x65, 0xb5, 0x5a, 0x5b, 0x5e, 0xe0, 0xd6, 0xda, 0x29, 0xcb, 0x42, 0xe1,
+ 0x2a, 0x89, 0x9f, 0x7f, 0x23, 0xaa, 0x27, 0xca, 0x30, 0xbf, 0x33, 0x48, 0x16,
+ 0x5c, 0x7c, 0x74, 0xe8, 0x92, 0x06, 0x75, 0x73, 0xd1, 0x55, 0xee, 0x73, 0x40,
+ 0xd2, 0xe9, 0xd0, 0x58, 0xc6, 0x1a, 0x2b, 0x00,
+ ],
+ [
+ 0xec, 0x56, 0xeb, 0x62, 0xb8, 0xa0, 0xe0, 0x57, 0xcc, 0x82, 0x3d, 0x82, 0xe9,
+ 0xc7, 0xa2, 0x2b, 0x1b, 0x61, 0xab, 0x16,
+ ],
+ [
+ 0xe1, 0x8d, 0x9d, 0xb0, 0x00, 0x61, 0x5c, 0x28, 0x09, 0x7a, 0xbe, 0xb6, 0x77,
+ 0xd8, 0xb4, 0xa7, 0x0b, 0x2f, 0xd1, 0xaf, 0x58, 0x69, 0xb3, 0xa1, 0x81, 0x03,
+ 0x87, 0xed, 0x69, 0x58, 0x89, 0xb0,
+ ],
+ [
+ 0x22, 0x06, 0xed, 0xa0, 0x52, 0xd5, 0x70, 0xef, 0xed, 0xe8, 0x56, 0xd0, 0x0d,
+ 0x53, 0x42, 0xdf, 0xd3, 0xfd, 0x0f, 0x0a, 0x17, 0x6b, 0x7b, 0x46, 0xef, 0xeb,
+ 0xda, 0x8a, 0x3c, 0xb4, 0x0b, 0xcf, 0x23, 0xb4, 0xde, 0xb9, 0x1d, 0x1a, 0x47,
+ 0x26, 0xa3, 0x3e, 0x3c, 0xb4, 0xbb, 0x23, 0xa1, 0xe7,
+ ],
+ [
+ 0x40, 0x6a, 0x54, 0x7c, 0x7d, 0x7a, 0x7d, 0x3f, 0xae, 0xaf, 0xba, 0x91, 0x3b,
+ 0xc0, 0x48, 0x58, 0x24, 0x29, 0x49, 0x57, 0x53, 0x32, 0xfe, 0xb9, 0x45, 0xfb,
+ 0xd6, 0x91, 0xef, 0xb5, 0x16, 0x94, 0x58, 0x14, 0x2a, 0xa2, 0x41, 0x61, 0x19,
+ 0x8a, 0x36, 0x04, 0x94, 0xd8, 0xdc, 0xdd, 0x8d, 0x0c, 0xc2, 0xef, 0x50, 0x11,
+ 0x17, 0x49, 0x6d, 0x58, 0x74, 0xb1, 0x9d, 0xfb, 0x43, 0x62, 0xde, 0x1f,
+ ]
+ ),
+ test_case!(
+ [
+ 0xe4, 0x88, 0xe3, 0x3d, 0xfc, 0x4a, 0x48, 0xd2, 0xf3, 0x7f, 0x1f, 0xa8, 0x47,
+ 0x20, 0x6e, 0x6e, 0x87, 0x20, 0x47, 0x78, 0x1d, 0xfb, 0x3c, 0x5c, 0xbb, 0xfb,
+ 0x5d, 0xb3, 0x5a, 0x92, 0x37, 0x57, 0x84, 0xef, 0x51, 0xc0, 0x29, 0x29, 0xd3,
+ 0x13, 0x6e, 0x42, 0x86, 0xef, 0x4e, 0x53, 0xd5, 0x54,
+ ],
+ [
+ 0xc5, 0x38, 0xe5, 0x28, 0x99, 0x0d, 0xbc, 0x8f, 0xec, 0x2c, 0x2d, 0x74, 0x9d,
+ 0x6c, 0x09, 0xce, 0xda, 0xda, 0x01, 0xe4,
+ ],
+ [
+ 0x7d, 0x1a, 0x96, 0x9b, 0xa1, 0x53, 0xdf, 0x51, 0x75, 0xad, 0xba, 0x2d, 0x85,
+ 0xe1, 0x80, 0xce, 0x61, 0xf4, 0x4d, 0x62, 0xf8, 0xe6, 0x7e, 0x1f, 0x57, 0x9f,
+ 0xa2, 0x27, 0x76, 0xbb, 0xd8, 0x27,
+ ],
+ [
+ 0x38, 0xf4, 0x61, 0xc0, 0x24, 0x5d, 0xd0, 0x99, 0x64, 0xc1, 0x93, 0xb5, 0x92,
+ 0x3c, 0x45, 0x15, 0x84, 0x91, 0x6c, 0x04, 0xaf, 0xae, 0x31, 0x10, 0x7f, 0x80,
+ 0x85, 0x3a, 0xd8, 0x32, 0x10, 0xb2, 0xef, 0x07, 0x16, 0x89, 0x6c, 0x35, 0x97,
+ 0x47, 0x3c, 0x81, 0xc3, 0x18, 0xfe, 0x47, 0xde, 0xd7,
+ ],
+ [
+ 0x5a, 0xe4, 0x2b, 0xca, 0x16, 0xb9, 0xe8, 0xc8, 0xe5, 0x89, 0x18, 0x15, 0x27,
+ 0x2f, 0x7c, 0x92, 0x21, 0x19, 0xb1, 0x28, 0x4b, 0x81, 0x09, 0xf4, 0x0d, 0x78,
+ 0x4f, 0xea, 0xe3, 0x30, 0x0a, 0x51, 0xc2, 0x0f, 0x8e, 0x42, 0xe5, 0x35, 0xde,
+ 0xb5, 0xd2, 0x94, 0x3f, 0x60, 0x02, 0x12, 0xec, 0x1f, 0x84, 0x6d, 0x82, 0xf4,
+ 0xf1, 0x06, 0xe9, 0xf0, 0x7b, 0xf7, 0x7a, 0x99, 0x68, 0x93, 0x19, 0x35,
+ ]
+ ),
+ test_case!(
+ [
+ 0xc2, 0x92, 0xa0, 0x25, 0xab, 0xe8, 0x7d, 0x53, 0x61, 0x66, 0x19, 0xf1, 0x5d,
+ 0xf5, 0x1b, 0xa6, 0x9c, 0x8d, 0x41, 0x3c, 0x05, 0x75, 0xdb, 0x45, 0x7e, 0x08,
+ 0x9e, 0x99, 0x31, 0x26, 0xf3, 0x5c, 0x84, 0x96, 0xa5, 0x20, 0x27, 0xac, 0xb0,
+ 0x89, 0xb4, 0x0d, 0x85, 0x00, 0xff, 0xc6, 0xe2, 0x00, 0x58,
+ ],
+ [
+ 0x7e, 0x9f, 0xa5, 0xf4, 0xf2, 0x9c, 0x6b, 0x2c, 0x87, 0x2f, 0xe1, 0x45, 0x51,
+ 0x82, 0xa1, 0x80, 0xec, 0xdb, 0x0e, 0x86,
+ ],
+ [
+ 0x58, 0x04, 0x1b, 0x6a, 0x8d, 0x73, 0xa3, 0x45, 0xb6, 0xed, 0x8f, 0x1b, 0x6a,
+ 0xef, 0x0b, 0x30, 0x5f, 0xec, 0x4b, 0xa3, 0x83, 0x17, 0x21, 0xb6, 0xb0, 0x79,
+ 0xac, 0x59, 0x2e, 0x8a, 0x67, 0x2d,
+ ],
+ [
+ 0x01, 0x5d, 0x3a, 0xf2, 0x62, 0xf0, 0x45, 0x3a, 0xf3, 0x93, 0x6e, 0x65, 0xb5,
+ 0x39, 0xa1, 0x2f, 0x76, 0x08, 0x9d, 0x1e, 0x8b, 0x51, 0xb0, 0xb7, 0x53, 0x5c,
+ 0xc8, 0x0e, 0xbe, 0x86, 0x61, 0x74, 0xc4, 0x55, 0x8b, 0xfd, 0xf1, 0xd5, 0x37,
+ 0x0d, 0xe6, 0xd9, 0x12, 0x31, 0xa3, 0xd8, 0x78, 0x06,
+ ],
+ [
+ 0x50, 0x6d, 0x1b, 0xb5, 0x95, 0xc2, 0x78, 0xe7, 0x9e, 0x94, 0x3e, 0x4e, 0xb0,
+ 0x63, 0x28, 0x46, 0x9c, 0x9b, 0x1f, 0xed, 0x99, 0x88, 0x34, 0x4f, 0xde, 0x11,
+ 0x98, 0xd8, 0xce, 0x72, 0xf7, 0xb4, 0x50, 0x26, 0x33, 0xe0, 0x1f, 0x1a, 0x37,
+ 0xeb, 0x56, 0x62, 0xaf, 0xbc, 0xa2, 0x0e, 0xf0, 0x02, 0x9a, 0xa1, 0xe9, 0x7b,
+ 0xbf, 0x34, 0xc1, 0x96, 0x52, 0xb1, 0x1d, 0x59, 0x65, 0x61, 0x66, 0xc0,
+ ]
+ ),
+ test_case!(
+ [
+ 0x97, 0xa9, 0xb4, 0x7b, 0x8b, 0xc3, 0x11, 0x0a, 0x34, 0x30, 0x56, 0x4a, 0xd2,
+ 0x6e, 0xe8, 0x4e, 0x06, 0xc9, 0x05, 0xbc, 0x8f, 0x52, 0x4a, 0x07, 0x4f, 0x2b,
+ 0x7a, 0x96, 0x0a, 0x51, 0x9e, 0xdb, 0x28, 0x7b, 0x40, 0xd7, 0x12, 0x08, 0x64,
+ 0xce, 0xf3, 0xf4, 0x1a, 0x9e, 0xb3, 0x03, 0x8d, 0xf7, 0xe9, 0x57,
+ ],
+ [
+ 0x65, 0x3d, 0x0d, 0xa5, 0x30, 0x2e, 0xd8, 0x1c, 0xe3, 0xf2, 0x96, 0x37, 0x06,
+ 0x74, 0x99, 0xae, 0x0f, 0x13, 0xbf, 0x6a,
+ ],
+ [
+ 0x18, 0x20, 0xd4, 0x9d, 0x02, 0x72, 0xeb, 0xa7, 0x9c, 0x36, 0x5c, 0x2c, 0x37,
+ 0xc9, 0x03, 0xeb, 0xcd, 0xed, 0x1e, 0xae, 0x46, 0x1d, 0xdf, 0x74, 0x21, 0x43,
+ 0x76, 0xfd, 0xaf, 0x16, 0xbf, 0x62,
+ ],
+ [
+ 0xef, 0x67, 0x3b, 0x92, 0x76, 0x44, 0xba, 0xaa, 0x47, 0x22, 0xe3, 0x4d, 0xe3,
+ 0xb9, 0xbd, 0xb8, 0x4a, 0x90, 0x7b, 0x62, 0xae, 0xec, 0x1c, 0x3a, 0x07, 0xd3,
+ 0x88, 0x69, 0xb4, 0x16, 0x46, 0x67, 0x94, 0xf3, 0x84, 0xe8, 0xd6, 0xef, 0xfb,
+ 0xf5, 0x2f, 0x74, 0xd2, 0xd9, 0x4e, 0x23, 0xeb, 0x56,
+ ],
+ [
+ 0x64, 0x54, 0x09, 0x73, 0x59, 0x36, 0x87, 0x48, 0x06, 0x48, 0xa3, 0xd8, 0x63,
+ 0x24, 0x7c, 0xbc, 0x38, 0x3a, 0x91, 0x2c, 0x88, 0xf3, 0x6b, 0x12, 0xea, 0x5f,
+ 0x6c, 0x03, 0x9f, 0x9c, 0xf3, 0x3e, 0xf0, 0x8c, 0x4b, 0x94, 0xc0, 0x50, 0xc9,
+ 0x33, 0x37, 0x61, 0x7e, 0xb6, 0x32, 0xbc, 0x26, 0xf7, 0xcc, 0x9c, 0x6e, 0x0e,
+ 0x49, 0xa8, 0x8d, 0x94, 0x88, 0x48, 0x75, 0xda, 0x1e, 0x34, 0x58, 0xe1,
+ ]
+ ),
+ test_case!(
+ [
+ 0xff, 0x53, 0xbe, 0x51, 0x7b, 0x99, 0xa3, 0xe8, 0xae, 0xcb, 0xc5, 0xc3, 0x61,
+ 0x8a, 0x86, 0x40, 0x2c, 0x11, 0xce, 0x0b, 0x28, 0x0a, 0x46, 0x2e, 0x2f, 0x60,
+ 0x46, 0xfe, 0x87, 0x58, 0xb6, 0x02, 0x07, 0xd9, 0x93, 0xb6, 0x9a, 0xa9, 0x8c,
+ 0xa1, 0x51, 0x8e, 0xe6, 0xf7, 0xa5, 0xe9, 0x23, 0xa5, 0x1e, 0x53, 0xbe,
+ ],
+ [
+ 0xd2, 0xf3, 0x99, 0x3d, 0xe2, 0x0e, 0x79, 0xf7, 0x9c, 0xf3, 0x0e, 0x46, 0x09,
+ 0x14, 0xbc, 0xe9, 0x9f, 0x6f, 0x78, 0xab,
+ ],
+ [
+ 0x0a, 0xce, 0xda, 0xbb, 0xdd, 0x56, 0x73, 0x22, 0x71, 0x11, 0xc2, 0xed, 0xf4,
+ 0x14, 0xb5, 0x47, 0xef, 0x17, 0x9d, 0x2b, 0x42, 0x83, 0x9c, 0xc1, 0x4d, 0x3a,
+ 0x12, 0x88, 0x83, 0x00, 0x0a, 0x6d,
+ ],
+ [
+ 0x78, 0x56, 0xc6, 0xa6, 0xc8, 0xec, 0x80, 0x97, 0x13, 0xc4, 0xdd, 0x12, 0x13,
+ 0x5c, 0xbe, 0xf8, 0x61, 0x83, 0xfe, 0xd6, 0xc7, 0x7d, 0x92, 0x1e, 0xb5, 0x88,
+ 0x10, 0x1b, 0x6e, 0x4c, 0x15, 0x65, 0x86, 0xf5, 0x30, 0x50, 0x99, 0x52, 0xec,
+ 0x3b, 0x06, 0x3e, 0x0c, 0xf7, 0x98, 0x96, 0x98, 0xe5,
+ ],
+ [
+ 0xd9, 0x03, 0x61, 0xeb, 0xb1, 0x1f, 0x9a, 0x6f, 0xac, 0x9b, 0x06, 0x83, 0xb2,
+ 0xe0, 0x0a, 0xc7, 0xe0, 0x4e, 0x35, 0x24, 0xa9, 0xfa, 0xcf, 0x91, 0xaa, 0x67,
+ 0x0b, 0xf4, 0x39, 0x72, 0x06, 0x6f, 0x31, 0xfb, 0x3a, 0x8e, 0xb6, 0xc0, 0xc1,
+ 0x32, 0x45, 0x0e, 0x95, 0xe6, 0x76, 0xff, 0x6f, 0x2d, 0x14, 0xa8, 0x41, 0xb1,
+ 0x6c, 0x62, 0xa0, 0x1d, 0x08, 0x21, 0x55, 0xfa, 0x70, 0xc2, 0xad, 0xa3,
+ ]
+ ),
+ test_case!(
+ [
+ 0x61, 0x0c, 0x7d, 0x86, 0x5d, 0x4d, 0x99, 0x39, 0x8d, 0x5f, 0x8b, 0x22, 0x3b,
+ 0xac, 0x73, 0xd0, 0xb3, 0x22, 0x8e, 0x46, 0x05, 0xf9, 0xa2, 0xd9, 0x97, 0xfd,
+ 0x62, 0xff, 0x9f, 0x5b, 0x87, 0x80, 0x4d, 0x5c, 0x1e, 0x52, 0xdd, 0xbe, 0xa4,
+ 0x31, 0x7b, 0x65, 0x87, 0xa5, 0xde, 0x19, 0x35, 0x72, 0x82, 0x48, 0x1c, 0x3d,
+ ],
+ [
+ 0x51, 0x15, 0xc7, 0xbe, 0x1c, 0x2d, 0x88, 0x8a, 0xe2, 0xf5, 0xd5, 0xf3, 0x1e,
+ 0x46, 0x3d, 0x21, 0x67, 0x43, 0xe3, 0xf2,
+ ],
+ [
+ 0x5e, 0xdf, 0x62, 0x80, 0x40, 0xfe, 0xd0, 0xf3, 0x3a, 0xe0, 0x47, 0x0d, 0xac,
+ 0xd4, 0xba, 0x7a, 0x03, 0xa3, 0xbb, 0x7b, 0x62, 0xd8, 0xe5, 0x85, 0xdc, 0x33,
+ 0x7d, 0x52, 0xdd, 0x47, 0x79, 0x31,
+ ],
+ [
+ 0x88, 0xb8, 0x6c, 0x4f, 0x55, 0xc9, 0x92, 0x2c, 0x9e, 0x49, 0x81, 0xfa, 0x0a,
+ 0x9f, 0x86, 0x45, 0xde, 0x17, 0x13, 0x48, 0x25, 0x3b, 0x23, 0x63, 0x19, 0xfe,
+ 0x1f, 0x0c, 0xd9, 0x22, 0x07, 0x0a, 0xa9, 0x65, 0x08, 0x8e, 0xd7, 0x38, 0x1a,
+ 0x07, 0xe4, 0xa8, 0x84, 0x28, 0x53, 0x8c, 0xae, 0x4d,
+ ],
+ [
+ 0xa4, 0x3d, 0xa7, 0xcf, 0x66, 0xd6, 0xf8, 0xfc, 0xba, 0x52, 0xc9, 0xf8, 0x77,
+ 0xfc, 0xe8, 0x3b, 0xf2, 0xab, 0x3d, 0xc2, 0x05, 0x20, 0xdd, 0x88, 0xd9, 0x45,
+ 0x7d, 0xa1, 0x5f, 0x02, 0x45, 0x59, 0xcf, 0x1b, 0x97, 0xd4, 0x99, 0xcb, 0x93,
+ 0xe6, 0xbc, 0xa1, 0x34, 0xe6, 0x38, 0x04, 0x7b, 0x20, 0x0d, 0x52, 0x3d, 0xbc,
+ 0x8a, 0xa4, 0xd5, 0x36, 0x05, 0x70, 0xc2, 0x5a, 0xea, 0x09, 0x29, 0x54,
+ ]
+ ),
+ test_case!(
+ [
+ 0xec, 0x74, 0x36, 0x9a, 0x3c, 0x0e, 0xd7, 0xd2, 0xff, 0x1e, 0x05, 0x1d, 0x15,
+ 0xa8, 0x9e, 0x29, 0x2b, 0x19, 0x03, 0x41, 0xe8, 0x22, 0x5a, 0xdf, 0x8a, 0xe5,
+ 0xdb, 0x1f, 0xe3, 0x85, 0xcf, 0x0e, 0x48, 0x6c, 0xbd, 0x37, 0x69, 0x8e, 0x20,
+ 0x46, 0xa2, 0x5b, 0xc9, 0xac, 0x2a, 0x0a, 0xed, 0xf8, 0x78, 0x88, 0xc5, 0x4f,
+ 0xf8,
+ ],
+ [
+ 0x87, 0x01, 0x7f, 0x76, 0x59, 0xd1, 0xf4, 0xff, 0x53, 0x2f, 0x96, 0xae, 0x63,
+ 0x92, 0xfa, 0x8e, 0x2d, 0x88, 0xd1, 0x41,
+ ],
+ [
+ 0xd4, 0xc7, 0x60, 0x1b, 0x89, 0x30, 0x31, 0x58, 0xa9, 0x14, 0x89, 0x42, 0x24,
+ 0x1f, 0xbd, 0x68, 0x32, 0xbb, 0x0b, 0x27, 0xd1, 0x4c, 0x6c, 0x53, 0xec, 0xd7,
+ 0xf5, 0x30, 0x51, 0xec, 0xa8, 0xa6,
+ ],
+ [
+ 0x3c, 0x7f, 0x55, 0x0a, 0x9c, 0x30, 0xbc, 0x67, 0x33, 0x30, 0x86, 0xca, 0x67,
+ 0x79, 0xe4, 0xac, 0xd8, 0xe2, 0x79, 0xb8, 0xcb, 0x7c, 0x12, 0x99, 0x93, 0xb3,
+ 0x75, 0x4d, 0x8c, 0xca, 0xa5, 0x24, 0x13, 0x6f, 0x87, 0xe7, 0xe1, 0xcf, 0x3f,
+ 0xeb, 0x5f, 0x5f, 0x03, 0xee, 0xbe, 0xee, 0x80, 0xce,
+ ],
+ [
+ 0x68, 0x1b, 0x4e, 0xb4, 0x22, 0x92, 0x2c, 0x01, 0xf1, 0x05, 0xf4, 0xc7, 0xcb,
+ 0x05, 0xef, 0x6c, 0x68, 0x89, 0x7e, 0x09, 0xc2, 0x14, 0xf2, 0x59, 0x12, 0x67,
+ 0x6e, 0x29, 0x13, 0xad, 0xeb, 0x10, 0x35, 0x16, 0x10, 0x8d, 0xaf, 0x9a, 0x3d,
+ 0xa6, 0x60, 0xed, 0x21, 0xa3, 0x19, 0xf4, 0xa8, 0x66, 0xfe, 0xdf, 0x5d, 0x30,
+ 0xbe, 0xa9, 0x6f, 0xc0, 0x8c, 0x0c, 0x87, 0xed, 0x90, 0x20, 0x3c, 0x47,
+ ]
+ ),
+ test_case!(
+ [
+ 0x29, 0xca, 0x22, 0xbe, 0xf4, 0xe4, 0x52, 0x62, 0x90, 0xe1, 0xac, 0xcd, 0x4b,
+ 0x7c, 0x14, 0x75, 0xa6, 0x6a, 0x30, 0x13, 0xe6, 0x71, 0xf0, 0x32, 0xd9, 0x85,
+ 0xbd, 0x6a, 0x9a, 0xcf, 0x65, 0x16, 0xff, 0x42, 0x7c, 0x35, 0xca, 0x0d, 0x19,
+ 0xa9, 0x5b, 0x88, 0x3f, 0x99, 0xc4, 0x76, 0xbd, 0x97, 0x06, 0x6f, 0x50, 0x92,
+ 0x27, 0xc7,
+ ],
+ [
+ 0x86, 0x5a, 0x7d, 0xb7, 0x49, 0x66, 0x63, 0x4a, 0x1c, 0xd3, 0xa2, 0xce, 0x90,
+ 0x3d, 0x26, 0x93, 0x25, 0x70, 0x67, 0x6a,
+ ],
+ [
+ 0x7b, 0x72, 0xae, 0x69, 0xf5, 0x2f, 0xd0, 0xd1, 0x40, 0xdf, 0x57, 0x3b, 0xe0,
+ 0x47, 0xfd, 0xf9, 0xfd, 0x0d, 0xd0, 0xf1, 0x6d, 0x32, 0xcb, 0x3b, 0xd8, 0x38,
+ 0x90, 0xfe, 0x17, 0xcf, 0xa0, 0x70,
+ ],
+ [
+ 0x35, 0x9f, 0x16, 0xcc, 0x64, 0x78, 0x4e, 0xb9, 0x2a, 0xe5, 0x9d, 0x6e, 0xb6,
+ 0x8f, 0xe3, 0x74, 0xb8, 0x8b, 0xc3, 0x0e, 0x42, 0xfd, 0x5f, 0x57, 0x57, 0x6d,
+ 0xf1, 0x9c, 0xb3, 0xe5, 0xfa, 0x0f, 0x53, 0x2d, 0x03, 0x2a, 0xea, 0x59, 0x21,
+ 0xe4, 0x3d, 0x76, 0x06, 0xb9, 0xa5, 0x9e, 0xe4, 0xee,
+ ],
+ [
+ 0x7c, 0x95, 0x28, 0x3a, 0xf4, 0xe2, 0x34, 0xaf, 0x61, 0xa7, 0xf2, 0x12, 0xad,
+ 0xe6, 0x28, 0x8f, 0xb2, 0x76, 0x2b, 0x1c, 0xdb, 0xea, 0x90, 0x3c, 0x5a, 0x56,
+ 0x46, 0x93, 0x0d, 0xe8, 0x5d, 0x9f, 0x9a, 0x90, 0xd8, 0x8f, 0xd9, 0x10, 0xdf,
+ 0x02, 0x81, 0xfc, 0x8f, 0x8f, 0xb5, 0x8b, 0xd4, 0x61, 0xa0, 0x97, 0x69, 0x0e,
+ 0x4e, 0xef, 0x77, 0x47, 0xd3, 0x12, 0x6c, 0xa8, 0x45, 0x95, 0xd2, 0x51,
+ ]
+ ),
+ test_case!(
+ [
+ 0x50, 0xca, 0xc8, 0x7a, 0x60, 0x00, 0x81, 0x01, 0x45, 0xef, 0x41, 0x14, 0x80,
+ 0x0c, 0x30, 0xcc, 0x2a, 0xf8, 0x98, 0xa3, 0x8e, 0x21, 0x46, 0x04, 0x99, 0xad,
+ 0xe2, 0x6a, 0x8e, 0xb3, 0x4b, 0xfa, 0x14, 0x55, 0x07, 0xba, 0x3b, 0x82, 0x6b,
+ 0x10, 0x88, 0x83, 0xd9, 0xe6, 0x59, 0x00, 0x19, 0xc3, 0xb6, 0x03, 0xaf, 0x36,
+ 0x0c, 0x7c, 0xf1,
+ ],
+ [
+ 0x86, 0xbd, 0xc1, 0xb1, 0x4f, 0xa2, 0x22, 0x77, 0x67, 0x99, 0x10, 0x4c, 0x11,
+ 0x34, 0xf0, 0xbf, 0x9e, 0x24, 0x8b, 0x07,
+ ],
+ [
+ 0xf5, 0xf3, 0x26, 0xf2, 0xb4, 0x56, 0x9c, 0xbe, 0x79, 0xce, 0xb3, 0x2a, 0x8f,
+ 0xa7, 0x4a, 0x94, 0x2b, 0xb6, 0x3d, 0x03, 0x97, 0xf4, 0xd9, 0xa7, 0x84, 0x7d,
+ 0x6a, 0xd2, 0x77, 0x58, 0xc1, 0x61,
+ ],
+ [
+ 0x74, 0xc1, 0x48, 0x8f, 0x66, 0xa0, 0x31, 0x81, 0x6f, 0x9c, 0xf5, 0x2e, 0xf5,
+ 0xe2, 0x15, 0x88, 0x74, 0x9a, 0xec, 0xb0, 0x83, 0xa7, 0xaf, 0x2c, 0x2c, 0xc3,
+ 0xe0, 0x5a, 0x0f, 0xd3, 0xde, 0x5d, 0x52, 0xfc, 0x0c, 0x79, 0x51, 0x68, 0xe4,
+ 0xab, 0xea, 0x3a, 0x37, 0x98, 0x3e, 0xa7, 0x20, 0x4c,
+ ],
+ [
+ 0x97, 0x94, 0x7d, 0xdc, 0x72, 0xd7, 0x3e, 0x46, 0x33, 0xaf, 0x91, 0xf2, 0x77,
+ 0xc3, 0xc4, 0xb4, 0x90, 0xfe, 0xd7, 0x51, 0xf0, 0xd0, 0x3b, 0x9b, 0x3f, 0x33,
+ 0xf4, 0x71, 0xe5, 0xb1, 0x7a, 0x2e, 0x9c, 0x12, 0x40, 0x8f, 0x2b, 0x3e, 0x04,
+ 0xac, 0x51, 0x38, 0xaa, 0x36, 0xcd, 0x34, 0x97, 0x49, 0x9f, 0xc3, 0x1f, 0x22,
+ 0xdb, 0x86, 0x3e, 0x43, 0x84, 0xa3, 0x90, 0x19, 0x37, 0x04, 0x53, 0x30,
+ ]
+ ),
+ test_case!(
+ [
+ 0x20, 0xbc, 0x2a, 0xaf, 0xb9, 0x23, 0x16, 0x8f, 0x54, 0x8f, 0xd3, 0xc5, 0xd5,
+ 0xe2, 0xc2, 0xb0, 0xde, 0x68, 0x0e, 0xf0, 0xe5, 0xd9, 0x7d, 0xb7, 0x6b, 0xc5,
+ 0xc2, 0x0d, 0x65, 0xe6, 0x87, 0x96, 0x8d, 0xbc, 0xd0, 0x2f, 0x88, 0x6f, 0x21,
+ 0xaa, 0xcc, 0x20, 0xa0, 0x4a, 0x10, 0xc7, 0x80, 0x85, 0xb2, 0x1e, 0xe3, 0x24,
+ 0x58, 0x0c, 0xc0, 0x0b,
+ ],
+ [
+ 0x64, 0xe5, 0x27, 0x82, 0xf5, 0xf1, 0x58, 0x51, 0xee, 0xe6, 0x1a, 0xa7, 0x73,
+ 0x3c, 0x84, 0x38, 0xdf, 0xaf, 0xf8, 0xd0,
+ ],
+ [
+ 0x6e, 0x96, 0x3f, 0x78, 0x6d, 0x06, 0x98, 0xfb, 0x25, 0x9e, 0xcc, 0xdd, 0x59,
+ 0xd5, 0x9e, 0xe5, 0xbf, 0x47, 0x77, 0xbb, 0xbd, 0x9f, 0xe0, 0x5f, 0xe9, 0x48,
+ 0x4c, 0x90, 0xcc, 0x13, 0x06, 0x9c,
+ ],
+ [
+ 0x2c, 0x59, 0xb4, 0x84, 0x6f, 0x41, 0xa3, 0x3c, 0xcd, 0xf5, 0x97, 0x79, 0xaa,
+ 0x5d, 0xfb, 0x5e, 0xaf, 0x97, 0x2f, 0xa1, 0xdb, 0xc6, 0x69, 0x7d, 0xf4, 0x6c,
+ 0xb7, 0xee, 0x5a, 0xd3, 0xff, 0x52, 0xbe, 0x01, 0xbc, 0x3e, 0xe7, 0x69, 0xc0,
+ 0xd4, 0xfe, 0xd2, 0xf2, 0x22, 0x53, 0xa1, 0xc1, 0x31,
+ ],
+ [
+ 0x97, 0x02, 0x97, 0xd2, 0xd6, 0x68, 0x25, 0x7a, 0x06, 0x4f, 0x0e, 0xb5, 0xb2,
+ 0x70, 0xcf, 0x4d, 0x62, 0xc2, 0x87, 0xa1, 0x0d, 0xea, 0x8a, 0x28, 0x48, 0x7c,
+ 0x56, 0x9c, 0x10, 0xb1, 0x70, 0x33, 0xeb, 0x13, 0xda, 0xf7, 0x6c, 0xfc, 0x30,
+ 0xfa, 0x58, 0xfc, 0x7c, 0x2c, 0x8d, 0x5d, 0x3c, 0x5d, 0x9a, 0x0e, 0x5f, 0xa6,
+ 0x0c, 0x75, 0xf2, 0xad, 0x5a, 0x0b, 0xc8, 0xe3, 0x14, 0x4c, 0xbb, 0xed,
+ ]
+ ),
+ test_case!(
+ [
+ 0x5f, 0xb2, 0x24, 0x70, 0xc4, 0xb6, 0x8b, 0x3e, 0xad, 0x17, 0x09, 0x72, 0x43,
+ 0x76, 0x26, 0x64, 0x03, 0xbd, 0xba, 0xd7, 0x2a, 0x1a, 0x36, 0x72, 0x70, 0xf3,
+ 0xff, 0xb7, 0xf5, 0x4e, 0x1a, 0x2d, 0x86, 0xdf, 0xac, 0x6e, 0x14, 0xe1, 0xbe,
+ 0xa4, 0x9c, 0x91, 0x21, 0x3d, 0x14, 0x69, 0x8b, 0xf4, 0x93, 0x2f, 0x13, 0x8c,
+ 0x7a, 0x7d, 0xf5, 0xf8, 0x0f,
+ ],
+ [
+ 0x62, 0xe5, 0xa2, 0xbc, 0xb9, 0x1e, 0x86, 0xb4, 0x4e, 0x25, 0xb2, 0x49, 0x67,
+ 0x4f, 0xcd, 0x36, 0x24, 0x40, 0x76, 0xa2,
+ ],
+ [
+ 0x64, 0x74, 0xbb, 0xb7, 0x8b, 0x45, 0x29, 0x20, 0xe4, 0x21, 0x31, 0xa3, 0x47,
+ 0x82, 0x5c, 0x94, 0xd4, 0x44, 0x7b, 0x6e, 0x8b, 0xb1, 0x84, 0x30, 0x5d, 0x96,
+ 0xc4, 0xb7, 0xa8, 0x3a, 0xa7, 0x91,
+ ],
+ [
+ 0x27, 0x25, 0xb7, 0xff, 0x9d, 0x09, 0x11, 0x22, 0xdf, 0xf3, 0xf4, 0x57, 0x67,
+ 0xa3, 0x93, 0x86, 0xba, 0x15, 0x76, 0x89, 0x5f, 0xb0, 0x03, 0x42, 0xa6, 0x11,
+ 0x51, 0xa8, 0x4a, 0x9e, 0x86, 0xa0, 0x73, 0xe8, 0x3a, 0xd5, 0xed, 0xa0, 0x95,
+ 0x99, 0x43, 0xd9, 0x85, 0x72, 0xaf, 0xcb, 0x88, 0xaa,
+ ],
+ [
+ 0xfb, 0x13, 0xfc, 0xf5, 0x7e, 0x63, 0xe4, 0xb7, 0x6a, 0x2f, 0xce, 0xcc, 0x0d,
+ 0xbf, 0x57, 0xc9, 0xf8, 0xc6, 0xab, 0x94, 0x8d, 0x66, 0xff, 0x40, 0x8b, 0x45,
+ 0x8e, 0x05, 0xdf, 0x6b, 0x3f, 0x60, 0x29, 0x83, 0x2b, 0xf4, 0x7a, 0x68, 0xcd,
+ 0x0f, 0x41, 0x59, 0x0a, 0x25, 0x84, 0x58, 0xe5, 0xec, 0xf1, 0xe9, 0x81, 0xbf,
+ 0x26, 0xa6, 0xd7, 0x91, 0x01, 0xe7, 0xa5, 0x9d, 0xdc, 0xc5, 0x21, 0x4f,
+ ]
+ ),
+ test_case!(
+ [
+ 0xf6, 0x33, 0x42, 0x41, 0xf8, 0xc6, 0xb4, 0x60, 0x03, 0xab, 0xf8, 0xbc, 0x91,
+ 0x81, 0xd4, 0x3d, 0xee, 0x63, 0x6e, 0xc2, 0x22, 0xe2, 0x33, 0xd4, 0x65, 0xe5,
+ 0xde, 0x61, 0x2c, 0x70, 0xf7, 0x6e, 0x1d, 0x32, 0x12, 0xa1, 0x82, 0xd9, 0x2b,
+ 0x84, 0x48, 0x1b, 0xc5, 0x7a, 0x2b, 0xb4, 0x56, 0xd7, 0x4e, 0x56, 0x81, 0xc0,
+ 0x25, 0x64, 0xd1, 0xad, 0x25, 0x48,
+ ],
+ [
+ 0xb7, 0x57, 0x56, 0x3a, 0x41, 0x55, 0x28, 0x19, 0xfb, 0x80, 0x3f, 0x52, 0x7b,
+ 0xa2, 0x05, 0x74, 0x3a, 0xaa, 0x0a, 0x21,
+ ],
+ [
+ 0x34, 0x54, 0x22, 0xa3, 0xdf, 0xe0, 0xc1, 0x3d, 0x33, 0x48, 0xa9, 0x1e, 0x73,
+ 0xa8, 0xa4, 0xb0, 0x8c, 0x67, 0x59, 0xf7, 0x71, 0x64, 0xd7, 0xa2, 0x5b, 0xee,
+ 0x62, 0xbf, 0x09, 0x87, 0x42, 0xe5,
+ ],
+ [
+ 0x57, 0xf2, 0x6e, 0x96, 0xc5, 0xac, 0x42, 0xed, 0x26, 0x54, 0xca, 0x94, 0xf6,
+ 0x26, 0x18, 0x1f, 0x5a, 0xa8, 0xe6, 0x24, 0x3a, 0xce, 0xf0, 0x46, 0x26, 0x20,
+ 0x2c, 0x81, 0x80, 0x1a, 0xdd, 0xaf, 0x62, 0x38, 0xda, 0xc3, 0x88, 0xab, 0xdb,
+ 0xbf, 0x55, 0xf2, 0x98, 0x31, 0xfa, 0x0a, 0x2a, 0xaf,
+ ],
+ [
+ 0x53, 0x78, 0xd7, 0x87, 0xb3, 0xce, 0xd4, 0x05, 0xf3, 0x8a, 0x5c, 0xe2, 0x27,
+ 0x44, 0xd7, 0x99, 0xb1, 0x1d, 0x53, 0x6f, 0xde, 0x76, 0xe0, 0x24, 0xce, 0xd0,
+ 0x0a, 0xd4, 0x3f, 0x04, 0xe7, 0x79, 0xa0, 0xae, 0x8a, 0xd5, 0xdf, 0x21, 0xd5,
+ 0x8b, 0x9a, 0xaf, 0x31, 0xbc, 0x9c, 0xe6, 0x25, 0x44, 0xab, 0x89, 0xae, 0x50,
+ 0xd0, 0xab, 0x23, 0x4b, 0xbf, 0x0f, 0x81, 0x72, 0x06, 0x95, 0x38, 0xad,
+ ]
+ ),
+ test_case!(
+ [
+ 0xa2, 0x36, 0x7a, 0x6e, 0xd0, 0x14, 0x71, 0xad, 0xb3, 0x36, 0x4b, 0xdb, 0x25,
+ 0xb2, 0xfe, 0x88, 0x53, 0x21, 0x43, 0xec, 0x0c, 0xc3, 0x69, 0x0b, 0xb7, 0xd8,
+ 0x41, 0x78, 0xd9, 0x97, 0x7c, 0x21, 0x44, 0x21, 0x40, 0xfe, 0x51, 0xba, 0x98,
+ 0x5a, 0x92, 0x7a, 0x54, 0x63, 0xca, 0x1a, 0x2b, 0x69, 0xbe, 0x16, 0x99, 0x8b,
+ 0x71, 0x2b, 0x4f, 0x18, 0xb4, 0xf2, 0x10,
+ ],
+ [
+ 0xdc, 0x41, 0xf9, 0x2c, 0xf3, 0xee, 0xf1, 0xa1, 0x81, 0x14, 0x0c, 0xeb, 0x48,
+ 0xa5, 0x27, 0x32, 0xb7, 0x58, 0xef, 0xdb,
+ ],
+ [
+ 0x6f, 0xa6, 0x84, 0x6f, 0x36, 0x78, 0x18, 0x77, 0xb0, 0x60, 0x31, 0x19, 0x61,
+ 0x6e, 0xd6, 0x2d, 0x46, 0x59, 0xbc, 0x50, 0xf7, 0x1d, 0x7a, 0x12, 0x5b, 0xb6,
+ 0xbc, 0x8b, 0xe8, 0x70, 0xba, 0x93,
+ ],
+ [
+ 0x70, 0x0c, 0x87, 0xa8, 0xc2, 0xdf, 0xdf, 0x43, 0x55, 0x25, 0xd3, 0x95, 0x01,
+ 0x45, 0x20, 0x6a, 0x4c, 0xf2, 0x95, 0x69, 0x93, 0x59, 0x9c, 0x35, 0x7b, 0xea,
+ 0x22, 0x81, 0x85, 0x41, 0xff, 0xa9, 0xcd, 0x2d, 0xbe, 0xd2, 0x82, 0x41, 0x0b,
+ 0x08, 0x3c, 0xca, 0x8e, 0x18, 0xcd, 0x48, 0x27, 0x3f,
+ ],
+ [
+ 0x44, 0xd2, 0xc1, 0x58, 0xd8, 0x7e, 0xbb, 0x23, 0x44, 0xe7, 0x0e, 0x4f, 0xe2,
+ 0x7c, 0xa8, 0x55, 0xca, 0xc6, 0x94, 0x61, 0xbb, 0x4f, 0x38, 0x29, 0x54, 0x1c,
+ 0x01, 0x0f, 0xe3, 0xa9, 0x4a, 0xa7, 0x11, 0xb2, 0xe9, 0x59, 0xae, 0x1b, 0x83,
+ 0x13, 0xf3, 0x47, 0xce, 0xe8, 0xc4, 0x24, 0xc1, 0x3e, 0x12, 0x79, 0x4a, 0x6c,
+ 0x27, 0x9e, 0xb7, 0xe1, 0xc7, 0x13, 0x4d, 0xf5, 0x70, 0x0e, 0x32, 0x1e,
+ ]
+ ),
+ test_case!(
+ [
+ 0xa8, 0x58, 0x76, 0x2a, 0x62, 0xa3, 0x3a, 0xf3, 0x49, 0x3f, 0x6a, 0x55, 0x81,
+ 0xfa, 0x2c, 0x81, 0xb3, 0xac, 0x1c, 0xa0, 0x19, 0x1b, 0x2f, 0x8d, 0x54, 0xa4,
+ 0x7a, 0x7a, 0xa0, 0xea, 0x3b, 0x27, 0xde, 0x8b, 0xf4, 0xef, 0x1f, 0xee, 0xb2,
+ 0x12, 0xa0, 0x31, 0x8f, 0xba, 0x26, 0xdf, 0xbf, 0xa4, 0x08, 0x44, 0x65, 0x52,
+ 0x56, 0x1d, 0xcf, 0xf2, 0x4e, 0x32, 0x1a, 0x2a,
+ ],
+ [
+ 0xb6, 0xfb, 0x3e, 0xf4, 0x66, 0x67, 0x09, 0xcb, 0x77, 0x77, 0x01, 0xb8, 0x7b,
+ 0x82, 0x45, 0x67, 0x13, 0x31, 0x48, 0xe2,
+ ],
+ [
+ 0x71, 0x90, 0x7c, 0x71, 0x9c, 0x32, 0x30, 0x9d, 0x31, 0x08, 0x1c, 0x6f, 0x9a,
+ 0x9a, 0x2d, 0xe5, 0x6e, 0xca, 0x4d, 0xca, 0x8c, 0xdf, 0x44, 0xc3, 0x2f, 0x4a,
+ 0x51, 0xc6, 0xb8, 0xff, 0x7e, 0xc5,
+ ],
+ [
+ 0xdf, 0x3e, 0x25, 0x42, 0x7a, 0xdf, 0x93, 0xfc, 0xca, 0x5a, 0x5c, 0x1e, 0x13,
+ 0x67, 0x82, 0xa2, 0x1b, 0xe4, 0x7c, 0x65, 0xd4, 0xbd, 0xa8, 0x69, 0x5d, 0xbe,
+ 0xd1, 0x2a, 0x2a, 0x1f, 0x14, 0xf8, 0xb1, 0x48, 0x63, 0xd3, 0x7d, 0x4f, 0x7c,
+ 0x75, 0x32, 0x57, 0x30, 0x03, 0x9e, 0x4b, 0x1a, 0x82,
+ ],
+ [
+ 0x67, 0x91, 0x7f, 0xa9, 0x0f, 0x7f, 0x97, 0xfd, 0xb1, 0x4e, 0x1b, 0x9e, 0xb0,
+ 0x8a, 0xe1, 0x99, 0xa5, 0x63, 0x3d, 0xbf, 0xf6, 0xa5, 0x1e, 0xa7, 0xfc, 0x78,
+ 0x68, 0x7a, 0x61, 0x76, 0xe1, 0xe5, 0x70, 0xc0, 0x3f, 0xf6, 0x20, 0x7e, 0xa4,
+ 0xfb, 0x66, 0x20, 0xb0, 0xe1, 0x96, 0xe2, 0xc2, 0x86, 0xf5, 0xf6, 0x8a, 0x8b,
+ 0xe2, 0xdf, 0x80, 0xc8, 0x2d, 0x61, 0x31, 0x11, 0xdc, 0x76, 0xb8, 0x8a,
+ ]
+ ),
+ test_case!(
+ [
+ 0x90, 0xc0, 0xec, 0x8d, 0x9d, 0x67, 0x58, 0x2a, 0xcd, 0x3d, 0x35, 0xd6, 0xc8,
+ 0x14, 0xc4, 0x51, 0x97, 0xe2, 0x04, 0x6d, 0xb3, 0xa1, 0xa9, 0xc1, 0x11, 0xac,
+ 0x28, 0xf3, 0xd3, 0xa7, 0x0e, 0xac, 0xc7, 0xb6, 0x2a, 0xa1, 0x82, 0x12, 0x68,
+ 0xf5, 0x55, 0x1a, 0x16, 0xbb, 0xa3, 0xfe, 0x9a, 0x59, 0x5c, 0x15, 0x01, 0xca,
+ 0x59, 0xb1, 0x23, 0x89, 0xce, 0x20, 0x17, 0x91, 0xd1,
+ ],
+ [
+ 0x2d, 0xa7, 0x9e, 0x20, 0x76, 0x0c, 0x76, 0x51, 0x16, 0x6c, 0x12, 0x99, 0xd0,
+ 0xcc, 0x49, 0x35, 0x32, 0xb2, 0x64, 0xde,
+ ],
+ [
+ 0x31, 0x39, 0xa5, 0x31, 0xa9, 0xa4, 0xc0, 0xce, 0x67, 0x57, 0x6f, 0x64, 0x6e,
+ 0x49, 0x07, 0xf6, 0x4a, 0x73, 0x9e, 0xfb, 0x98, 0xba, 0x73, 0x4f, 0x2c, 0x48,
+ 0x98, 0x88, 0xb8, 0x1a, 0xb0, 0x75,
+ ],
+ [
+ 0xe1, 0xe1, 0x4c, 0xaa, 0x5a, 0x1a, 0xdd, 0xc4, 0x7f, 0x42, 0xa9, 0x4c, 0xf0,
+ 0xef, 0xe4, 0x08, 0x8b, 0xdd, 0x4d, 0xce, 0x3a, 0xac, 0x38, 0x7d, 0x6d, 0xdd,
+ 0x52, 0x1c, 0x8b, 0x69, 0x30, 0x92, 0x78, 0xd7, 0x64, 0x15, 0x3a, 0x5f, 0x35,
+ 0xc7, 0x3e, 0x85, 0x45, 0x65, 0x25, 0x49, 0xf3, 0x67,
+ ],
+ [
+ 0x02, 0x87, 0x8d, 0xb1, 0x16, 0xc5, 0x03, 0xcf, 0xb4, 0xfe, 0x0d, 0xb8, 0x96,
+ 0xfd, 0xbb, 0xa7, 0x29, 0x7f, 0x82, 0x95, 0xf7, 0xa0, 0x31, 0xf5, 0xb8, 0x7b,
+ 0x2f, 0x4d, 0x99, 0x2f, 0x65, 0x33, 0x0a, 0x33, 0x79, 0x52, 0xc6, 0x1a, 0xdb,
+ 0x3c, 0x3b, 0xa9, 0x50, 0x09, 0x38, 0x59, 0xc5, 0x98, 0xb4, 0xa4, 0x3a, 0x79,
+ 0x01, 0x41, 0xb5, 0xf5, 0x08, 0x91, 0xf2, 0x66, 0xdf, 0x40, 0x34, 0x60,
+ ]
+ ),
+ test_case!(
+ [
+ 0xdd, 0x85, 0xa8, 0x2e, 0x98, 0x6d, 0x1d, 0x87, 0x67, 0x99, 0xef, 0x88, 0x22,
+ 0xc6, 0xc9, 0xc4, 0x49, 0x8e, 0x62, 0x44, 0x25, 0xa9, 0x1a, 0x86, 0x8a, 0xaa,
+ 0x98, 0x38, 0x87, 0xab, 0x1d, 0xa1, 0xed, 0x14, 0x24, 0x41, 0x42, 0xc6, 0xf3,
+ 0xbc, 0x76, 0xe2, 0xf4, 0xe5, 0x60, 0x10, 0x48, 0xf6, 0x60, 0x42, 0x10, 0x05,
+ 0x05, 0xc5, 0x46, 0x35, 0x5d, 0xdf, 0x9f, 0x34, 0xaa, 0xc2,
+ ],
+ [
+ 0xdc, 0xb2, 0xb7, 0xcd, 0x3b, 0xde, 0x26, 0x77, 0x87, 0x0c, 0x35, 0x1f, 0xb7,
+ 0x46, 0xe9, 0x19, 0x75, 0x04, 0x5a, 0x6e,
+ ],
+ [
+ 0x2b, 0x46, 0xed, 0xca, 0x75, 0x25, 0xc0, 0x8c, 0xce, 0xaa, 0x09, 0x4c, 0xf6,
+ 0xe1, 0x21, 0x7a, 0x5e, 0xca, 0x96, 0x57, 0xf8, 0xf0, 0x7f, 0x2f, 0x36, 0xde,
+ 0xeb, 0xc6, 0x96, 0x83, 0x07, 0x33,
+ ],
+ [
+ 0x26, 0xe0, 0x7b, 0x3e, 0xc4, 0xb7, 0xe9, 0x69, 0xb9, 0x38, 0x53, 0x54, 0x67,
+ 0x78, 0xe5, 0x85, 0x54, 0xaa, 0x15, 0x96, 0xc4, 0xe1, 0xbc, 0xb6, 0x89, 0x27,
+ 0xb6, 0x12, 0xf8, 0x61, 0xe0, 0x25, 0xa0, 0xf0, 0x03, 0x4e, 0xaa, 0xa3, 0xc0,
+ 0xf4, 0xa0, 0x7a, 0x6e, 0x89, 0xb0, 0xff, 0x83, 0xa3,
+ ],
+ [
+ 0x30, 0xe8, 0xf4, 0xc5, 0x66, 0xd5, 0xb8, 0x51, 0x92, 0x2e, 0xb4, 0x88, 0x04,
+ 0xff, 0xb4, 0xf2, 0x2f, 0xf6, 0xc6, 0x67, 0xe0, 0x01, 0x0e, 0xa9, 0x44, 0x6e,
+ 0x7e, 0xe7, 0x75, 0x8d, 0x46, 0xb8, 0x59, 0x50, 0xec, 0x74, 0x3e, 0x70, 0x43,
+ 0x41, 0xb1, 0xa5, 0x2e, 0xfa, 0x66, 0xe9, 0xba, 0x4e, 0xda, 0x01, 0x6d, 0x77,
+ 0x88, 0x53, 0xb8, 0xc5, 0xaa, 0xd1, 0xe0, 0x50, 0xa3, 0xb9, 0x16, 0x87,
+ ]
+ ),
+ test_case!(
+ [
+ 0x3c, 0x02, 0xd2, 0xb6, 0x75, 0x66, 0x8a, 0xb4, 0x94, 0x3a, 0x75, 0xb0, 0x80,
+ 0xda, 0x20, 0x47, 0x47, 0x02, 0xdb, 0xf5, 0xf0, 0xbd, 0x54, 0xc8, 0x54, 0x93,
+ 0xcf, 0x91, 0x29, 0xba, 0x63, 0xde, 0xd2, 0xc9, 0xb3, 0x78, 0x13, 0xae, 0x92,
+ 0xc2, 0xe7, 0xb0, 0xca, 0xac, 0x6a, 0x07, 0xb9, 0xf2, 0x92, 0x2d, 0x4c, 0xef,
+ 0xc7, 0xd3, 0x4b, 0x1a, 0x63, 0x44, 0xe8, 0x35, 0x19, 0xb7, 0x13,
+ ],
+ [
+ 0x83, 0xd4, 0xd8, 0x4b, 0x9c, 0x88, 0xdd, 0xf5, 0xed, 0x07, 0x04, 0x23, 0xc0,
+ 0x4b, 0x44, 0x0d, 0x12, 0x1d, 0x89, 0xd9,
+ ],
+ [
+ 0x0a, 0x45, 0xb7, 0xe1, 0xcb, 0xfd, 0x9f, 0xb7, 0xbb, 0x82, 0xa4, 0x57, 0xf4,
+ 0x44, 0x83, 0x2b, 0x2a, 0x74, 0x81, 0x5e, 0x31, 0x36, 0xe4, 0x2c, 0x53, 0xae,
+ 0xdc, 0x52, 0x65, 0x29, 0x7c, 0x7e,
+ ],
+ [
+ 0x4f, 0xe1, 0x70, 0x48, 0x52, 0xc0, 0x54, 0xda, 0xac, 0x7f, 0xaf, 0x90, 0x9a,
+ 0x1b, 0xb7, 0x33, 0x93, 0xbb, 0xa5, 0x5d, 0xb2, 0x4f, 0xd0, 0x04, 0x13, 0x8d,
+ 0x9f, 0x77, 0xc9, 0xaa, 0xb3, 0x2f, 0xb7, 0xcb, 0x8e, 0x1d, 0xa1, 0xd4, 0xaf,
+ 0x44, 0x70, 0xb3, 0xa2, 0xd9, 0xfd, 0xf6, 0xcd, 0x4a,
+ ],
+ [
+ 0x95, 0x75, 0x49, 0x7a, 0xfc, 0x34, 0x68, 0xde, 0x7f, 0x35, 0x8f, 0x49, 0x30,
+ 0x3a, 0x1b, 0x8e, 0xb4, 0x2e, 0xaa, 0x04, 0xe7, 0x2b, 0xf7, 0x81, 0x56, 0x5a,
+ 0xbf, 0xd9, 0xa8, 0xe0, 0xf7, 0xd1, 0x66, 0x50, 0x9b, 0x05, 0xdb, 0x6c, 0x64,
+ 0xb3, 0xc6, 0xb7, 0x7d, 0x63, 0xfb, 0x4c, 0xb0, 0xeb, 0x44, 0xb3, 0x20, 0x5a,
+ 0x63, 0xf0, 0x52, 0xa1, 0x76, 0x29, 0xa8, 0x69, 0xbd, 0xf3, 0x66, 0xed,
+ ]
+ ),
+ test_case!(
+ [
+ 0x12, 0x1e, 0x67, 0xda, 0x20, 0x99, 0xdb, 0x3d, 0xeb, 0xd0, 0xee, 0xab, 0x37,
+ 0x41, 0x25, 0xbe, 0x63, 0x69, 0x87, 0xe1, 0x19, 0x3a, 0x90, 0xd4, 0xb7, 0x59,
+ 0xe4, 0x6b, 0xc0, 0xc9, 0xe2, 0xa9, 0x54, 0x18, 0xd1, 0x9c, 0xae, 0x4b, 0x56,
+ 0xa0, 0x24, 0xb4, 0x05, 0x20, 0x74, 0xcb, 0x5d, 0x4a, 0x4e, 0x2a, 0x53, 0xf1,
+ 0x8a, 0x33, 0x19, 0xa0, 0x82, 0x6e, 0xfb, 0xaf, 0xda, 0x9a, 0xa2, 0x4f,
+ ],
+ [
+ 0xd5, 0x3d, 0xcb, 0xb6, 0xd2, 0x42, 0x50, 0xd0, 0x23, 0xf1, 0x98, 0xac, 0x78,
+ 0x3f, 0x5e, 0x9b, 0x7f, 0x87, 0x9c, 0x6b,
+ ],
+ [
+ 0xdc, 0xa2, 0x04, 0x22, 0xd0, 0x32, 0x08, 0x2b, 0xc5, 0x22, 0x78, 0xba, 0xfd,
+ 0x6e, 0x81, 0xb8, 0x74, 0x68, 0xe3, 0xa1, 0x12, 0x9e, 0xd4, 0x50, 0x6b, 0xc3,
+ 0x1e, 0xf6, 0x8f, 0xcb, 0x7c, 0xa0,
+ ],
+ [
+ 0xa4, 0xfb, 0x1f, 0xb7, 0xa0, 0xfa, 0xcf, 0xa5, 0x2c, 0x9b, 0x49, 0xc8, 0xd8,
+ 0x0b, 0x3c, 0xa9, 0xca, 0xbc, 0x34, 0x83, 0xae, 0x1f, 0x3c, 0xc7, 0x00, 0x89,
+ 0x67, 0x35, 0x18, 0x9f, 0x06, 0xf8, 0x94, 0xf9, 0x7a, 0x85, 0x28, 0xa6, 0x4e,
+ 0xca, 0xc5, 0x2d, 0xbd, 0xd9, 0x7d, 0x95, 0xa3, 0x8b,
+ ],
+ [
+ 0x0d, 0x3a, 0x84, 0x73, 0xfb, 0xe7, 0x94, 0x0f, 0x91, 0x69, 0xd1, 0x37, 0x4c,
+ 0x43, 0x95, 0xa6, 0x8f, 0xbf, 0xf0, 0xfb, 0x40, 0x75, 0x52, 0x15, 0x7f, 0xef,
+ 0xe8, 0xa6, 0x26, 0x0c, 0x57, 0xe7, 0x3b, 0x37, 0x93, 0xe1, 0x11, 0x07, 0x96,
+ 0xc5, 0x8f, 0x9d, 0x3b, 0x81, 0x99, 0x70, 0xa4, 0x3a, 0x0c, 0x04, 0x94, 0x2b,
+ 0xca, 0xa8, 0xf8, 0x6a, 0x04, 0x6b, 0x52, 0x1c, 0xa6, 0x08, 0xca, 0x2e,
+ ]
+ ),
+ test_case!(
+ [
+ 0x92, 0x83, 0x41, 0xf1, 0x03, 0x26, 0x34, 0xb6, 0xf2, 0x68, 0xb3, 0x55, 0x51,
+ 0x06, 0xb1, 0x62, 0x42, 0xae, 0x66, 0x9c, 0xae, 0xf4, 0x62, 0xcb, 0x97, 0xe5,
+ 0xd8, 0xdc, 0x40, 0x29, 0x00, 0x3d, 0x1c, 0x43, 0xf9, 0xa7, 0x51, 0xd0, 0x75,
+ 0x95, 0x53, 0xb9, 0xc8, 0xe6, 0x87, 0xa8, 0x2f, 0x52, 0xf9, 0xf0, 0x1d, 0xa8,
+ 0x14, 0xbc, 0x99, 0xe1, 0x59, 0x44, 0x7b, 0x85, 0x38, 0x0c, 0xa0, 0x64, 0x20,
+ ],
+ [
+ 0x36, 0x36, 0xbf, 0xeb, 0x6a, 0x32, 0xbc, 0x28, 0xc9, 0xa6, 0x60, 0x0c, 0x9d,
+ 0x7b, 0xab, 0x5e, 0x9b, 0xb3, 0x7b, 0xd5,
+ ],
+ [
+ 0x05, 0x4f, 0xab, 0xe6, 0xec, 0x76, 0xc2, 0xff, 0x2e, 0x8a, 0xdc, 0xd7, 0xc8,
+ 0x49, 0x01, 0x19, 0xef, 0x04, 0xe7, 0x2f, 0x1e, 0xea, 0x55, 0x74, 0x54, 0x27,
+ 0x79, 0xf8, 0xd5, 0x34, 0xba, 0xb8,
+ ],
+ [
+ 0xef, 0x4e, 0x7b, 0xa7, 0x5f, 0xe2, 0x64, 0x04, 0xaa, 0x3e, 0xce, 0x0a, 0xe7,
+ 0xb2, 0x09, 0x84, 0xba, 0x9a, 0x85, 0xb1, 0x9e, 0x3d, 0x05, 0x4a, 0x4a, 0x6d,
+ 0xdc, 0xb8, 0x73, 0xad, 0x31, 0x19, 0x73, 0xa1, 0x36, 0x29, 0x9a, 0x2c, 0x62,
+ 0xb5, 0xef, 0x31, 0xe5, 0x39, 0xd4, 0x27, 0x55, 0x98,
+ ],
+ [
+ 0x6a, 0x7c, 0xcf, 0x12, 0x78, 0x7a, 0xcc, 0xfd, 0xb6, 0xc2, 0x47, 0xe7, 0x68,
+ 0x61, 0x53, 0xf8, 0xb3, 0xe6, 0x3d, 0x97, 0x13, 0x27, 0x49, 0x83, 0x15, 0x18,
+ 0xb8, 0x0d, 0x2b, 0x45, 0xd0, 0xe1, 0xfe, 0xb5, 0xfd, 0xad, 0x6a, 0x5d, 0x4b,
+ 0x4b, 0xc8, 0x49, 0x86, 0x8a, 0xbb, 0x80, 0x20, 0x68, 0xd9, 0x3d, 0xcd, 0xa0,
+ 0x8a, 0x59, 0x97, 0x43, 0x03, 0x1b, 0xbc, 0x04, 0xf2, 0xfb, 0x80, 0x6f,
+ ]
+ ),
+ test_case!(
+ [
+ 0x0b, 0xe1, 0x8e, 0xc9, 0xc7, 0x69, 0x83, 0x97, 0x95, 0x8f, 0x9e, 0x93, 0x90,
+ 0xd8, 0xbe, 0xd1, 0x79, 0xdc, 0x12, 0x9c, 0x8d, 0xd5, 0xf7, 0x6f, 0xf1, 0x96,
+ 0x18, 0xbd, 0x4e, 0x92, 0xe5, 0xfe, 0x15, 0x85, 0xfc, 0xa8, 0x5d, 0x16, 0x3b,
+ 0x48, 0x1f, 0x80, 0x1e, 0x38, 0x7e, 0x3c, 0x00, 0x0a, 0xc2, 0x09, 0xc0, 0xf0,
+ 0x95, 0x51, 0xe0, 0x39, 0x8b, 0x49, 0x9f, 0x8e, 0x0a, 0x3a, 0xf4, 0xc4, 0xda,
+ 0xa5,
+ ],
+ [
+ 0xc6, 0xb0, 0x83, 0x31, 0x92, 0xa7, 0xc3, 0xff, 0x9b, 0xdb, 0xfa, 0xa9, 0x83,
+ 0x2a, 0x0d, 0xd4, 0x9c, 0x70, 0xbe, 0x73,
+ ],
+ [
+ 0xa1, 0xfd, 0x84, 0xbf, 0xb5, 0x9f, 0x2f, 0x2c, 0x20, 0x9b, 0x2d, 0x95, 0x71,
+ 0x10, 0x9c, 0x9f, 0xe9, 0x0a, 0xe3, 0xa6, 0x81, 0x08, 0xf6, 0x74, 0xdb, 0x7f,
+ 0x23, 0x78, 0x5b, 0x2a, 0x46, 0xab,
+ ],
+ [
+ 0xfe, 0x11, 0xa9, 0x95, 0xe0, 0x54, 0x34, 0x6f, 0xc8, 0x13, 0xe3, 0x29, 0xcf,
+ 0x68, 0x56, 0x34, 0x19, 0x1d, 0xe1, 0xa4, 0xda, 0x58, 0x0f, 0xc2, 0x67, 0xf2,
+ 0x89, 0x5f, 0x93, 0x3f, 0x74, 0x1c, 0x4d, 0xe9, 0x03, 0xd8, 0xee, 0xf6, 0x13,
+ 0x0a, 0x8e, 0x93, 0x20, 0x11, 0x53, 0x9f, 0x8e, 0xdb,
+ ],
+ [
+ 0xc4, 0xf6, 0xc2, 0xd4, 0x41, 0x4b, 0xd9, 0xee, 0x97, 0xa3, 0x98, 0x49, 0xd0,
+ 0x1d, 0xbd, 0x8c, 0x0d, 0x39, 0x1b, 0xc9, 0x67, 0x35, 0x4b, 0xae, 0xb4, 0xd6,
+ 0x5e, 0x1c, 0x0b, 0xbc, 0x5a, 0x81, 0x4a, 0x61, 0x3d, 0x4d, 0xcd, 0xe5, 0xf1,
+ 0x7b, 0x87, 0x7a, 0x49, 0xa3, 0x2d, 0x02, 0x5f, 0xfe, 0xf6, 0x8d, 0x51, 0x99,
+ 0x9b, 0x66, 0x13, 0xdb, 0x9a, 0x3f, 0xf9, 0xc8, 0xb7, 0x45, 0x03, 0x0e,
+ ]
+ ),
+ test_case!(
+ [
+ 0xc3, 0x78, 0xc0, 0x93, 0x25, 0x94, 0x37, 0xfa, 0x21, 0x99, 0xb0, 0xbb, 0xa1,
+ 0xe9, 0x8d, 0xcb, 0x76, 0x4a, 0x71, 0x3c, 0xa9, 0x07, 0x6c, 0xe7, 0x20, 0x6c,
+ 0xeb, 0xe7, 0xb9, 0x27, 0x4a, 0x48, 0x55, 0x98, 0x2e, 0xba, 0x27, 0x88, 0x65,
+ 0x30, 0xbf, 0x08, 0xc6, 0x17, 0x26, 0x00, 0x9b, 0x22, 0xa2, 0xf8, 0xfb, 0x2f,
+ 0xdc, 0x1a, 0xf1, 0x05, 0x1e, 0x45, 0x4e, 0x2c, 0xf5, 0xaa, 0x52, 0xb0, 0xda,
+ 0xa4, 0x15,
+ ],
+ [
+ 0x56, 0xc5, 0x36, 0xa2, 0x8f, 0xa3, 0x20, 0x78, 0x4f, 0x3e, 0x4b, 0x14, 0x59,
+ 0x0c, 0x5e, 0x63, 0x52, 0xb9, 0xe6, 0xed,
+ ],
+ [
+ 0x24, 0x2b, 0xb2, 0xb4, 0xa1, 0xd7, 0xd9, 0x83, 0x26, 0xfe, 0x43, 0x50, 0x3d,
+ 0xbe, 0x1d, 0x35, 0x0d, 0x7b, 0xae, 0x34, 0xb8, 0xc9, 0xd9, 0x62, 0x4f, 0x2b,
+ 0xf3, 0x2c, 0x5e, 0x28, 0xa4, 0xc3,
+ ],
+ [
+ 0x83, 0x74, 0xd4, 0x7b, 0x2a, 0x99, 0xde, 0x70, 0xa5, 0x7f, 0x86, 0x11, 0xb5,
+ 0x09, 0x65, 0x54, 0x9e, 0x2b, 0x48, 0x73, 0x9e, 0xa6, 0xe1, 0xb9, 0x2e, 0x67,
+ 0x9d, 0xb9, 0x9f, 0x64, 0x14, 0x0b, 0x72, 0x6d, 0xf7, 0x32, 0x66, 0x7d, 0xac,
+ 0xb1, 0xba, 0x10, 0xd9, 0xf3, 0xd5, 0xfa, 0x9e, 0xb8,
+ ],
+ [
+ 0xab, 0xdd, 0xbd, 0x1b, 0xa7, 0x21, 0x15, 0x3a, 0xe8, 0xc7, 0x76, 0x96, 0x01,
+ 0xf2, 0x0b, 0x4b, 0x4d, 0xef, 0xf3, 0x38, 0x7a, 0x7b, 0xd0, 0x9f, 0xeb, 0x3a,
+ 0x84, 0x59, 0xd8, 0xf2, 0xda, 0xf2, 0xbe, 0xb7, 0x9e, 0x37, 0x34, 0x1d, 0xa9,
+ 0x4d, 0xab, 0x49, 0xda, 0xbb, 0xe4, 0x84, 0x29, 0x71, 0xda, 0x1b, 0x38, 0x54,
+ 0x76, 0x3f, 0x34, 0xd5, 0xf3, 0xe9, 0xcc, 0xb3, 0xd2, 0x93, 0x2c, 0x59,
+ ]
+ ),
+ test_case!(
+ [
+ 0x9b, 0xc2, 0x33, 0xd0, 0x2e, 0x1f, 0xd0, 0xe4, 0x9d, 0x54, 0x97, 0x15, 0x1a,
+ 0x7e, 0xd7, 0xb3, 0x90, 0x8a, 0x99, 0x4e, 0x81, 0x66, 0xe4, 0xcd, 0x42, 0x63,
+ 0x6b, 0x52, 0x27, 0xb5, 0x6c, 0x9b, 0x2a, 0x75, 0xd8, 0x2d, 0x23, 0xbd, 0x00,
+ 0xff, 0x1e, 0x89, 0x9e, 0xc9, 0x56, 0xc4, 0xa4, 0x16, 0xa4, 0x60, 0xd9, 0x84,
+ 0xc9, 0xae, 0xb3, 0x2c, 0xb4, 0xd8, 0x00, 0x53, 0x5f, 0x25, 0x45, 0x74, 0x0b,
+ 0x2c, 0x7f, 0x94,
+ ],
+ [
+ 0x42, 0xd5, 0xe6, 0x08, 0xe5, 0xa1, 0x03, 0x8c, 0x89, 0x3b, 0x4f, 0x03, 0x14,
+ 0x7f, 0x2a, 0x03, 0xa0, 0xf2, 0x9b, 0x4f,
+ ],
+ [
+ 0xb9, 0x74, 0x1b, 0x8f, 0x66, 0xee, 0xe2, 0x74, 0xc5, 0x71, 0xe1, 0xfe, 0xac,
+ 0x2f, 0x8c, 0xb7, 0xb2, 0x52, 0xde, 0xf2, 0x08, 0x96, 0x00, 0xcd, 0x59, 0xec,
+ 0x67, 0x29, 0x1f, 0xd1, 0x99, 0xef,
+ ],
+ [
+ 0xf3, 0x02, 0x5e, 0x4c, 0x64, 0x23, 0xab, 0xaa, 0x0e, 0xa8, 0xbc, 0xa4, 0x3f,
+ 0x48, 0x05, 0x5c, 0xca, 0x5e, 0xe2, 0xb5, 0x82, 0x68, 0x2c, 0xf4, 0xae, 0xd2,
+ 0xaf, 0xe3, 0x73, 0xbc, 0xe7, 0xb7, 0x7a, 0x07, 0x60, 0xc0, 0x12, 0x39, 0x49,
+ 0x61, 0x63, 0x4f, 0x6d, 0xc0, 0x4a, 0x3e, 0xf2, 0xf8,
+ ],
+ [
+ 0xc5, 0x74, 0xc4, 0x4f, 0x2e, 0xf8, 0xd8, 0x37, 0x70, 0x9a, 0x10, 0x31, 0x8e,
+ 0xc6, 0x0e, 0xb0, 0xa5, 0x97, 0xbf, 0xd6, 0xa1, 0xe8, 0xb1, 0x57, 0xbb, 0x81,
+ 0x98, 0x0d, 0x56, 0x00, 0x29, 0xd8, 0xc1, 0x3a, 0x21, 0xa4, 0xbd, 0x15, 0x12,
+ 0xf8, 0x4a, 0x94, 0x8c, 0x38, 0x17, 0x15, 0x54, 0xbe, 0x4b, 0x98, 0x3a, 0x5b,
+ 0x1d, 0xc0, 0x52, 0x76, 0xae, 0x68, 0x14, 0xd5, 0xfc, 0x2d, 0xd0, 0x10,
+ ]
+ ),
+ test_case!(
+ [
+ 0x47, 0xd5, 0x60, 0x14, 0x8b, 0xe6, 0x2e, 0x40, 0x14, 0xf8, 0xa1, 0x37, 0x46,
+ 0xa6, 0x79, 0xde, 0x4c, 0x60, 0xdd, 0xdd, 0x17, 0xc5, 0x6d, 0x29, 0x8c, 0xf6,
+ 0x9b, 0x63, 0xf3, 0xee, 0x02, 0xce, 0xe0, 0x5a, 0x5d, 0xb5, 0x94, 0x42, 0xa2,
+ 0x3c, 0x12, 0x19, 0xa4, 0xfa, 0x4d, 0xe3, 0x2d, 0x75, 0xd8, 0x2b, 0x9e, 0x2e,
+ 0x8e, 0x91, 0xca, 0xbb, 0x42, 0x14, 0xd7, 0x84, 0x9e, 0x4a, 0xfe, 0x67, 0xa2,
+ 0xf1, 0x98, 0xd0, 0x2c,
+ ],
+ [
+ 0x52, 0xe0, 0x5e, 0x83, 0x26, 0xb5, 0x87, 0x8f, 0xb0, 0x86, 0x1e, 0x7f, 0x34,
+ 0x42, 0x11, 0x39, 0x72, 0x4a, 0x7f, 0x03,
+ ],
+ [
+ 0x09, 0x0d, 0x0d, 0x4d, 0x3c, 0x58, 0xe4, 0x97, 0x11, 0x22, 0x17, 0x4a, 0xf8,
+ 0x57, 0xaf, 0x6c, 0xb0, 0x5f, 0xff, 0x63, 0x9c, 0xf3, 0xf1, 0xd1, 0x8b, 0x83,
+ 0xb1, 0x77, 0x84, 0xe9, 0x68, 0x86,
+ ],
+ [
+ 0x94, 0x59, 0xe5, 0x9d, 0x7a, 0xb8, 0x45, 0x18, 0xe1, 0x76, 0x72, 0x71, 0x06,
+ 0xf9, 0x82, 0x1b, 0xd5, 0xcf, 0x27, 0x0a, 0x8b, 0x39, 0x3e, 0xac, 0x70, 0xd7,
+ 0xb3, 0xcf, 0x2a, 0xc9, 0x63, 0x0a, 0x67, 0x8f, 0xc1, 0x10, 0x80, 0x7f, 0x98,
+ 0x01, 0x4d, 0xfe, 0xe9, 0x16, 0x24, 0xbb, 0x7a, 0xb8,
+ ],
+ [
+ 0xab, 0xfd, 0xc8, 0xf4, 0x57, 0xfb, 0xd2, 0x87, 0xe8, 0x59, 0xec, 0x9a, 0x30,
+ 0x46, 0x87, 0x17, 0x86, 0x19, 0xd7, 0x3b, 0xf8, 0x34, 0x15, 0x9a, 0x92, 0x92,
+ 0x66, 0x5f, 0x2e, 0x56, 0x4c, 0xbd, 0xf0, 0x9e, 0x14, 0x78, 0x55, 0x93, 0x0c,
+ 0x5a, 0x56, 0x81, 0xc7, 0x27, 0x60, 0x05, 0x60, 0x59, 0x76, 0x9f, 0x50, 0x54,
+ 0xfb, 0x3a, 0x38, 0xaf, 0xf6, 0x0b, 0x55, 0xc5, 0xa9, 0x19, 0x5d, 0x13,
+ ]
+ ),
+ test_case!(
+ [
+ 0xf4, 0xc9, 0x85, 0x8d, 0x46, 0x0f, 0x3d, 0x63, 0x9a, 0x9c, 0x31, 0x86, 0x64,
+ 0x05, 0x2c, 0xce, 0xb4, 0xb3, 0xb2, 0x5c, 0x95, 0xa3, 0xcf, 0xaf, 0x88, 0xa6,
+ 0xb0, 0x4c, 0x2e, 0xed, 0xca, 0xb1, 0xa2, 0xb6, 0x03, 0x85, 0xc2, 0x68, 0xa8,
+ 0xc8, 0xb2, 0x02, 0x92, 0x07, 0xf4, 0xa1, 0x6b, 0x77, 0x92, 0xdd, 0x54, 0x30,
+ 0x9f, 0x53, 0xcb, 0x55, 0x15, 0xb5, 0x1f, 0x7f, 0x45, 0xe1, 0x6c, 0xb5, 0xf9,
+ 0xed, 0xc1, 0x64, 0x52, 0xe4,
+ ],
+ [
+ 0xb4, 0x3a, 0xe2, 0xe2, 0x1f, 0x71, 0x99, 0x96, 0xe1, 0x04, 0xaf, 0x74, 0x59,
+ 0x36, 0xdb, 0xe7, 0x65, 0x02, 0x5a, 0xc7,
+ ],
+ [
+ 0x4a, 0x8f, 0xfb, 0x41, 0x16, 0xc9, 0x2c, 0x87, 0x5c, 0x95, 0x5e, 0x03, 0x25,
+ 0x67, 0x94, 0xe3, 0x78, 0x8f, 0x57, 0x8e, 0x48, 0x0b, 0xfc, 0xe7, 0x4f, 0x07,
+ 0x57, 0x9b, 0xcc, 0x6d, 0x08, 0x45,
+ ],
+ [
+ 0x08, 0xbb, 0x72, 0xd5, 0xa6, 0xdb, 0xe6, 0x6a, 0x1b, 0x20, 0x12, 0x43, 0x2c,
+ 0x5f, 0xee, 0xa3, 0xcc, 0xff, 0xbb, 0xe2, 0xa9, 0x90, 0x52, 0x5a, 0x16, 0x82,
+ 0x68, 0x29, 0xab, 0x64, 0xfb, 0x3c, 0x85, 0x08, 0x91, 0x9e, 0x15, 0x52, 0xf4,
+ 0xd5, 0xe8, 0x09, 0x77, 0x30, 0x1d, 0xc9, 0x6a, 0xd7,
+ ],
+ [
+ 0x94, 0x27, 0x6e, 0x87, 0x16, 0x21, 0x09, 0xf2, 0x31, 0xc9, 0xc9, 0x5f, 0xff,
+ 0x2d, 0x34, 0x9c, 0xce, 0x7f, 0x62, 0x98, 0xff, 0xe0, 0x00, 0x61, 0x9f, 0x09,
+ 0x21, 0x4c, 0xe5, 0xd9, 0xad, 0xb5, 0x61, 0x8a, 0xf1, 0x9f, 0xd2, 0x70, 0x0f,
+ 0x51, 0xa4, 0x1c, 0x72, 0x94, 0x03, 0x6b, 0x39, 0x58, 0xb1, 0x50, 0x0c, 0x29,
+ 0x37, 0x06, 0x1c, 0x2c, 0xc6, 0xb9, 0x67, 0x46, 0xcc, 0xec, 0xc5, 0x0e,
+ ]
+ ),
+ test_case!(
+ [
+ 0x86, 0x53, 0x1b, 0x41, 0x37, 0xeb, 0x3a, 0x82, 0xd7, 0xb2, 0xca, 0x24, 0xd9,
+ 0xfa, 0x81, 0x48, 0xf3, 0x97, 0x20, 0xc4, 0x11, 0x08, 0x47, 0x02, 0x2c, 0x91,
+ 0x20, 0x20, 0xd6, 0x38, 0xa9, 0x69, 0x2d, 0x0f, 0x93, 0x4b, 0x1d, 0x66, 0xd6,
+ 0x59, 0xd1, 0x25, 0x9a, 0x87, 0x90, 0xba, 0x56, 0x13, 0xed, 0x7a, 0xbc, 0x5a,
+ 0x94, 0xf8, 0x5f, 0xfd, 0xdb, 0x01, 0x32, 0xf1, 0xe0, 0x04, 0xf2, 0xc4, 0x52,
+ 0x73, 0x6c, 0x3e, 0xe4, 0x70, 0xb3,
+ ],
+ [
+ 0x6c, 0x50, 0x2f, 0x67, 0x62, 0x17, 0x30, 0x7c, 0xed, 0x42, 0x7a, 0xb7, 0xf4,
+ 0x63, 0xd0, 0xd9, 0xc9, 0xe3, 0xd6, 0x9a,
+ ],
+ [
+ 0xc3, 0xc4, 0x00, 0x6e, 0x51, 0xbb, 0xbc, 0x55, 0xa3, 0xa8, 0xd2, 0x17, 0xeb,
+ 0x19, 0xd8, 0x29, 0x39, 0x1d, 0x3c, 0x4d, 0x30, 0xdc, 0x0d, 0xe8, 0x32, 0xbb,
+ 0x66, 0x59, 0x29, 0xe9, 0x7c, 0xd9,
+ ],
+ [
+ 0x00, 0x6c, 0xb9, 0xe6, 0x3e, 0x95, 0x77, 0x7f, 0x97, 0xb6, 0x07, 0x97, 0x4c,
+ 0x3c, 0x94, 0x83, 0x7d, 0x46, 0xc0, 0xff, 0xdf, 0x22, 0xa3, 0xc7, 0x9a, 0x96,
+ 0x5f, 0xc0, 0x09, 0x31, 0x2f, 0x57, 0xe6, 0xb1, 0x7d, 0x5b, 0xb5, 0xdd, 0x9b,
+ 0x16, 0xd4, 0xbe, 0xeb, 0x87, 0xa8, 0x88, 0xda, 0x5f,
+ ],
+ [
+ 0x62, 0x4a, 0x92, 0x2d, 0x96, 0xdb, 0xaa, 0x58, 0x4c, 0x47, 0x48, 0xbb, 0x8b,
+ 0x6a, 0xa6, 0xff, 0xe0, 0xf1, 0xc9, 0xa4, 0xd0, 0xea, 0x4a, 0xcd, 0xa8, 0x94,
+ 0x9a, 0x35, 0x81, 0x72, 0xfd, 0xe8, 0xcb, 0xec, 0x0b, 0x42, 0x9b, 0x10, 0x4b,
+ 0x08, 0xb9, 0x3b, 0x24, 0x4a, 0x4d, 0xc6, 0xcb, 0xb9, 0xaa, 0xfd, 0x3c, 0x89,
+ 0xe4, 0x87, 0xa5, 0xff, 0x74, 0x85, 0xa9, 0x2e, 0x23, 0x3c, 0x27, 0xe1,
+ ]
+ ),
+ test_case!(
+ [
+ 0xfb, 0x68, 0x87, 0x9d, 0x96, 0x8c, 0x7e, 0xa5, 0xfd, 0x03, 0x4e, 0x21, 0x0b,
+ 0x75, 0x01, 0xad, 0x24, 0x34, 0x05, 0xda, 0x7f, 0x7a, 0x6c, 0x21, 0x69, 0xb0,
+ 0x93, 0x93, 0xb8, 0x06, 0x09, 0xd1, 0x51, 0x4d, 0x4a, 0x69, 0xfc, 0x38, 0xa0,
+ 0x40, 0x8c, 0xe3, 0xd7, 0xd0, 0x2b, 0xb3, 0x65, 0xc3, 0x16, 0x6d, 0xe7, 0xc0,
+ 0xcc, 0x44, 0x8c, 0xe9, 0x0f, 0x62, 0xe9, 0x7e, 0xef, 0xe5, 0x5d, 0x57, 0x7b,
+ 0x92, 0xdb, 0xcd, 0xef, 0xd0, 0xde, 0xda,
+ ],
+ [
+ 0x62, 0x5d, 0x51, 0x84, 0xbe, 0x35, 0x83, 0x1f, 0x78, 0xa2, 0x56, 0xf0, 0x6a,
+ 0xbb, 0x40, 0x1c, 0xb9, 0xcd, 0x74, 0x15,
+ ],
+ [
+ 0xe6, 0x9b, 0xc5, 0xbc, 0x32, 0x0a, 0xac, 0x84, 0x68, 0xce, 0xdc, 0x59, 0x56,
+ 0x79, 0x13, 0x0c, 0x14, 0x3b, 0x8e, 0xa3, 0x53, 0x40, 0x16, 0x9d, 0xc0, 0x4c,
+ 0x86, 0xfb, 0x4d, 0x73, 0xd9, 0xfa,
+ ],
+ [
+ 0x39, 0xd1, 0x81, 0xfa, 0x34, 0x4e, 0xed, 0x3b, 0x55, 0xc5, 0x3e, 0xc4, 0xd5,
+ 0x3a, 0x54, 0xf6, 0xa4, 0xad, 0x6c, 0xe5, 0x82, 0xf6, 0x5b, 0x53, 0xa2, 0x1d,
+ 0xa5, 0x2a, 0x18, 0xfb, 0x3d, 0x01, 0x85, 0x8d, 0x54, 0x0b, 0xb1, 0xd8, 0x29,
+ 0x98, 0x6a, 0x12, 0xb8, 0x60, 0x6b, 0x56, 0x71, 0xf2,
+ ],
+ [
+ 0x55, 0xc8, 0xdb, 0x0a, 0x39, 0x10, 0x2c, 0x4f, 0x98, 0xac, 0x8a, 0x06, 0x41,
+ 0xaa, 0x63, 0x3b, 0xd4, 0x21, 0x74, 0x7a, 0xe8, 0xb9, 0x5a, 0x9f, 0xd4, 0x91,
+ 0xcd, 0x49, 0x5a, 0x29, 0x7a, 0x8c, 0x98, 0xd1, 0xda, 0x1c, 0xb2, 0x50, 0xc4,
+ 0x26, 0xf6, 0x40, 0x21, 0x6c, 0x15, 0x11, 0xee, 0x82, 0x1a, 0xc2, 0x6e, 0xd9,
+ 0x69, 0x1c, 0xd2, 0x0e, 0x18, 0xa5, 0x6a, 0xaa, 0xd5, 0x1a, 0xa3, 0x76,
+ ]
+ ),
+ test_case!(
+ [
+ 0xc5, 0xba, 0x96, 0x79, 0xdd, 0x18, 0xe9, 0xb8, 0xcb, 0xd3, 0x8a, 0x60, 0x89,
+ 0xd6, 0xec, 0x41, 0x2f, 0x8c, 0x11, 0xc0, 0x17, 0xab, 0x9d, 0x3c, 0xa6, 0x1f,
+ 0x62, 0xe8, 0x0b, 0x4b, 0xdf, 0xca, 0xe5, 0x62, 0x7a, 0x61, 0x56, 0x45, 0xc1,
+ 0xc0, 0x47, 0x34, 0x24, 0x54, 0x0f, 0xa1, 0xe6, 0xfc, 0x2c, 0x45, 0xac, 0xb1,
+ 0xe6, 0xde, 0xf1, 0x25, 0x84, 0x9e, 0xec, 0xea, 0xcd, 0x1e, 0x5f, 0xce, 0x06,
+ 0xed, 0xe9, 0x74, 0x65, 0x40, 0x45, 0xaf, 0x5a,
+ ],
+ [
+ 0x7b, 0xa7, 0x92, 0xbe, 0x42, 0xb6, 0x4a, 0x49, 0xa6, 0xfd, 0x45, 0xfd, 0xf1,
+ 0x39, 0x43, 0x99, 0xed, 0x51, 0x45, 0x8d,
+ ],
+ [
+ 0xae, 0x5e, 0xa0, 0xbd, 0x47, 0xd7, 0xd4, 0x55, 0xd2, 0xbe, 0xd1, 0x9b, 0x07,
+ 0x41, 0xaa, 0x48, 0x84, 0x1c, 0x25, 0x77, 0x5a, 0x2a, 0xdf, 0x02, 0xc6, 0x78,
+ 0xf8, 0xe3, 0x58, 0xfe, 0x75, 0xbb,
+ ],
+ [
+ 0x38, 0x42, 0xfa, 0xb6, 0x98, 0x8f, 0xa4, 0x75, 0x84, 0xd8, 0xb4, 0x31, 0x04,
+ 0x6b, 0x8c, 0x2f, 0xfe, 0x90, 0x32, 0xf6, 0xa2, 0x03, 0x1c, 0xce, 0x0e, 0x0d,
+ 0x23, 0xd1, 0x1e, 0xc4, 0xa9, 0x07, 0x68, 0x30, 0x9b, 0x06, 0x2b, 0x0f, 0xd3,
+ 0xb7, 0x7f, 0x84, 0xa2, 0x3b, 0x3e, 0x6e, 0xa8, 0x0b,
+ ],
+ [
+ 0xf1, 0x3e, 0x07, 0xb9, 0x52, 0x68, 0xc9, 0xa5, 0x22, 0xa6, 0x75, 0xac, 0x0c,
+ 0x36, 0x97, 0xf3, 0x1c, 0x48, 0xab, 0x11, 0x73, 0xb6, 0x6f, 0x2e, 0x4e, 0x56,
+ 0xc4, 0x00, 0x24, 0x82, 0x51, 0xa7, 0xd1, 0x64, 0x57, 0x8d, 0x25, 0x2e, 0xf8,
+ 0x6c, 0x57, 0x49, 0xbe, 0xb9, 0x8f, 0x49, 0xb1, 0x19, 0x2c, 0xa1, 0xda, 0x96,
+ 0xe5, 0x42, 0x2f, 0x8e, 0x9a, 0xa6, 0xfe, 0xa3, 0xb5, 0xeb, 0x46, 0x48,
+ ]
+ ),
+ test_case!(
+ [
+ 0xef, 0xd4, 0x39, 0x2e, 0x58, 0x6d, 0x6b, 0x4d, 0x00, 0xff, 0xe3, 0x18, 0xbd,
+ 0x17, 0xbf, 0x2d, 0x76, 0x30, 0xa0, 0xd1, 0xa1, 0xdf, 0xb6, 0x19, 0xf5, 0xc6,
+ 0x16, 0xfb, 0x3c, 0x73, 0xc2, 0x1f, 0xd6, 0x81, 0x4f, 0x52, 0x6a, 0xc1, 0xbc,
+ 0x0f, 0xe1, 0x25, 0xf0, 0x95, 0x4a, 0xc1, 0x3a, 0x55, 0xa7, 0x7c, 0xa1, 0x35,
+ 0xe7, 0x9a, 0xca, 0xc8, 0xa5, 0x83, 0x2a, 0x14, 0x5d, 0x5d, 0x87, 0x70, 0x6f,
+ 0x94, 0x15, 0x3b, 0xe9, 0x21, 0x31, 0x5e, 0x35, 0xde,
+ ],
+ [
+ 0xef, 0x61, 0x8f, 0x1e, 0x5e, 0x63, 0xe4, 0x5d, 0xb8, 0x8d, 0xb3, 0xfd, 0x04,
+ 0x39, 0x98, 0xa6, 0xd1, 0xdb, 0x90, 0x2c,
+ ],
+ [
+ 0x7a, 0xdf, 0x93, 0x5e, 0xc2, 0x6c, 0x0e, 0xf2, 0x81, 0x35, 0xa4, 0xbe, 0xc6,
+ 0x66, 0xb1, 0xad, 0x18, 0xc3, 0x2f, 0x7b, 0x7e, 0xd1, 0x77, 0x1b, 0x79, 0xe2,
+ 0x80, 0xe3, 0x6f, 0x11, 0x47, 0x9e,
+ ],
+ [
+ 0xa5, 0xc4, 0x16, 0x17, 0x33, 0x73, 0x61, 0x8e, 0xcf, 0x7a, 0x81, 0x07, 0x5b,
+ 0xeb, 0x22, 0xce, 0xb2, 0xaa, 0xe9, 0xc6, 0x45, 0x82, 0x6d, 0x8b, 0xb7, 0x15,
+ 0x0f, 0x9d, 0x7b, 0x1a, 0xb4, 0xd8, 0x84, 0xc9, 0xe7, 0x99, 0xa7, 0xf5, 0xa8,
+ 0xb2, 0x87, 0x52, 0xd7, 0xe8, 0x17, 0xf9, 0x4f, 0xb7,
+ ],
+ [
+ 0xdb, 0x79, 0x51, 0xba, 0x4c, 0x6b, 0x10, 0xac, 0xb1, 0xda, 0xd9, 0x76, 0x10,
+ 0xad, 0x51, 0xf3, 0x06, 0x52, 0x2e, 0x1d, 0x6f, 0x81, 0x8f, 0x23, 0xb3, 0xee,
+ 0x01, 0xa2, 0xab, 0x37, 0x59, 0xa4, 0x57, 0x5d, 0xb6, 0x8c, 0x7a, 0x91, 0x01,
+ 0xc1, 0xcf, 0xcd, 0x10, 0xbb, 0x99, 0xc0, 0xba, 0xd7, 0x8b, 0x78, 0xbd, 0x78,
+ 0xa5, 0xfd, 0xd2, 0xaa, 0x1e, 0xb7, 0xf5, 0xb7, 0x53, 0xe0, 0x1e, 0x64,
+ ]
+ ),
+ test_case!(
+ [
+ 0x29, 0xf6, 0xd8, 0xac, 0x17, 0xc7, 0xb3, 0x48, 0xbc, 0x8d, 0x58, 0x4c, 0x4b,
+ 0x75, 0x68, 0x4a, 0x21, 0xf6, 0x37, 0x7f, 0x3e, 0xc7, 0x66, 0xc1, 0x6d, 0xb9,
+ 0x6b, 0x3a, 0x23, 0x27, 0xef, 0x37, 0x43, 0x66, 0x35, 0xe1, 0x6c, 0x34, 0x19,
+ 0xea, 0xfe, 0x58, 0x36, 0x80, 0x71, 0xa5, 0x5e, 0x73, 0xb6, 0x09, 0x43, 0xe8,
+ 0x4a, 0xf5, 0x27, 0x8c, 0x5d, 0xab, 0xb3, 0x97, 0x53, 0xae, 0xb0, 0xee, 0xbf,
+ 0x3b, 0x52, 0x4b, 0x73, 0x20, 0x21, 0xd5, 0x31, 0x2a, 0x7d,
+ ],
+ [
+ 0x28, 0x76, 0xbc, 0xa4, 0x0f, 0x29, 0xdc, 0x6a, 0x64, 0xc3, 0xb2, 0x03, 0xbf,
+ 0xca, 0xfd, 0x95, 0x34, 0x27, 0x04, 0xac,
+ ],
+ [
+ 0xd5, 0x3e, 0x89, 0x88, 0xac, 0x91, 0x97, 0x19, 0xd5, 0x1f, 0xe4, 0xd5, 0xaf,
+ 0x42, 0xe9, 0x42, 0x71, 0xde, 0x7c, 0x6b, 0x0b, 0x3d, 0x48, 0xef, 0x84, 0xad,
+ 0x70, 0xab, 0x6e, 0x47, 0xf0, 0x90,
+ ],
+ [
+ 0x67, 0xfb, 0x2f, 0x7e, 0x1a, 0x0a, 0xe1, 0x07, 0xf6, 0x70, 0x00, 0xb1, 0x37,
+ 0xcb, 0x57, 0x5e, 0xaa, 0x1f, 0x6a, 0xd6, 0x66, 0xff, 0xfa, 0xbe, 0xf0, 0x63,
+ 0x06, 0x34, 0xa2, 0xec, 0x81, 0x1b, 0xf0, 0x92, 0xdc, 0x66, 0x02, 0x3d, 0x57,
+ 0x8a, 0xd8, 0x23, 0xd3, 0x1c, 0x66, 0x83, 0x3d, 0x67,
+ ],
+ [
+ 0x25, 0x32, 0x25, 0xab, 0x19, 0xb5, 0x05, 0x13, 0xdb, 0x41, 0x0f, 0x5b, 0xb9,
+ 0x18, 0x91, 0x3d, 0xfc, 0x49, 0x29, 0x9c, 0xe2, 0x6c, 0xfd, 0xc2, 0xe7, 0x15,
+ 0xb7, 0x08, 0x27, 0x20, 0x8f, 0x31, 0xa9, 0x6b, 0x07, 0x61, 0xb6, 0xe3, 0x9b,
+ 0xcc, 0x22, 0x09, 0x04, 0xc8, 0x0f, 0xae, 0xac, 0x7f, 0xe1, 0x99, 0x3d, 0x00,
+ 0x2b, 0xfc, 0x64, 0x9e, 0x6a, 0x43, 0x72, 0x3f, 0x5c, 0x34, 0xa8, 0x18,
+ ]
+ ),
+ test_case!(
+ [
+ 0xba, 0x34, 0xb3, 0x4e, 0xf7, 0x57, 0x8c, 0x9a, 0xe9, 0xd3, 0xc6, 0xd4, 0x19,
+ 0x0c, 0xd2, 0xd1, 0x87, 0x77, 0xf1, 0x2c, 0xd3, 0x40, 0x14, 0x9e, 0x6b, 0xa0,
+ 0x5b, 0xf0, 0x83, 0x8a, 0xc3, 0x29, 0x4d, 0x3f, 0x01, 0xba, 0x62, 0x8c, 0xc6,
+ 0x08, 0xae, 0x57, 0x35, 0x66, 0xac, 0xa9, 0x00, 0xda, 0x14, 0xa5, 0xdb, 0xba,
+ 0x2a, 0x3e, 0x85, 0x63, 0xae, 0xad, 0x1d, 0x70, 0xa5, 0x0d, 0x94, 0xe2, 0xbd,
+ 0x72, 0x79, 0xc0, 0x56, 0x71, 0x53, 0x49, 0x4d, 0x20, 0x69, 0x0c,
+ ],
+ [
+ 0x42, 0x53, 0x8f, 0x1e, 0x36, 0xea, 0xd2, 0x86, 0xb6, 0x0f, 0x25, 0x12, 0x7a,
+ 0x37, 0xbb, 0x52, 0x8a, 0x33, 0x30, 0xb8,
+ ],
+ [
+ 0x6f, 0xb9, 0xbe, 0x1d, 0xf1, 0x87, 0x93, 0x35, 0x31, 0xd3, 0xe3, 0x3e, 0x31,
+ 0x8b, 0x92, 0xfd, 0x73, 0x27, 0xe5, 0xfb, 0x08, 0xf3, 0x23, 0xb6, 0xe8, 0xa4,
+ 0xe9, 0x7b, 0x23, 0xfb, 0x1c, 0xf6,
+ ],
+ [
+ 0x20, 0x82, 0x98, 0x77, 0xe9, 0x83, 0x62, 0xb8, 0x10, 0xe6, 0x55, 0x64, 0x54,
+ 0x94, 0xf4, 0x07, 0x30, 0xab, 0x57, 0x53, 0x62, 0x0f, 0x86, 0x3d, 0x49, 0x53,
+ 0x2b, 0x85, 0xad, 0xc1, 0xab, 0x9b, 0xb7, 0x60, 0x43, 0x55, 0xe4, 0xae, 0x01,
+ 0x37, 0xf6, 0xe3, 0x9d, 0x9a, 0x4d, 0xe4, 0x4b, 0x75,
+ ],
+ [
+ 0x94, 0x39, 0x6c, 0xdc, 0xcc, 0xca, 0x61, 0x8a, 0x94, 0x57, 0x4c, 0x8d, 0x81,
+ 0x66, 0x1c, 0xf8, 0x89, 0xd3, 0x3c, 0x1d, 0x60, 0x4e, 0xae, 0x35, 0xf8, 0x26,
+ 0xc4, 0xc5, 0xce, 0xe9, 0xe2, 0xc0, 0xf3, 0x86, 0xba, 0x68, 0xe1, 0xc7, 0x6d,
+ 0xee, 0xba, 0xc0, 0x74, 0x67, 0x73, 0x65, 0x8d, 0xc2, 0x73, 0xf0, 0x9b, 0x39,
+ 0xb6, 0x34, 0x56, 0x00, 0xde, 0xd7, 0x39, 0xda, 0x4e, 0x8c, 0xe3, 0xee,
+ ]
+ ),
+ test_case!(
+ [
+ 0xe7, 0xfa, 0x43, 0x5f, 0x27, 0xdb, 0x37, 0x40, 0x2d, 0x97, 0x0e, 0x17, 0x46,
+ 0x45, 0xb1, 0x46, 0x5f, 0x6c, 0xf7, 0x88, 0x6c, 0xd8, 0x18, 0xae, 0xd5, 0x6b,
+ 0x4f, 0x40, 0xdf, 0x28, 0x2b, 0x3e, 0x65, 0x56, 0x34, 0x0a, 0xe3, 0x81, 0x3b,
+ 0x83, 0xbc, 0x9a, 0x95, 0xea, 0x2e, 0xc6, 0x48, 0x39, 0x9a, 0x9a, 0xa6, 0x87,
+ 0x59, 0xa1, 0x29, 0xe0, 0xc0, 0xcb, 0x3e, 0x45, 0x72, 0xfc, 0x1e, 0x7d, 0x5e,
+ 0x72, 0x2d, 0xc2, 0x01, 0xa0, 0xf3, 0xc1, 0xc4, 0x1c, 0x68, 0x16, 0xf4,
+ ],
+ [
+ 0xe6, 0xf7, 0xa6, 0x70, 0x37, 0xdd, 0x0a, 0x54, 0xc3, 0x5c, 0xd6, 0x28, 0x1f,
+ 0x8c, 0x11, 0x73, 0x38, 0x71, 0xbc, 0x42,
+ ],
+ [
+ 0x37, 0x64, 0xbe, 0xc7, 0x1e, 0xb8, 0xfd, 0xfb, 0x5a, 0xe8, 0xb4, 0xd7, 0x28,
+ 0xc5, 0x11, 0x54, 0x85, 0xd5, 0xd1, 0xb2, 0x9f, 0x50, 0x13, 0x35, 0x7c, 0x12,
+ 0x87, 0x3f, 0xdc, 0xef, 0xad, 0x7f,
+ ],
+ [
+ 0x35, 0x5e, 0xca, 0xc7, 0x52, 0xb3, 0x3b, 0xf5, 0xfb, 0x48, 0x56, 0x15, 0xb3,
+ 0x92, 0x1a, 0x0b, 0x85, 0x90, 0xac, 0x84, 0x56, 0xf2, 0x6a, 0x7d, 0x2f, 0x7b,
+ 0x03, 0x2a, 0x2a, 0xc5, 0x35, 0x76, 0x25, 0x5b, 0x4d, 0x9e, 0xcf, 0xbf, 0x5f,
+ 0x9a, 0xa1, 0x86, 0x5f, 0xc4, 0xd7, 0xed, 0x13, 0xe6,
+ ],
+ [
+ 0x02, 0xf2, 0x7e, 0x98, 0x3e, 0x60, 0xf6, 0x2b, 0x40, 0x8d, 0x94, 0x28, 0xd8,
+ 0xed, 0x6e, 0x2b, 0x6c, 0x55, 0x89, 0x48, 0x54, 0x07, 0xc7, 0x8c, 0xcb, 0x3c,
+ 0x71, 0x08, 0xd2, 0x06, 0x0b, 0xf2, 0x4e, 0x5c, 0xe7, 0x26, 0x6d, 0xd4, 0x7a,
+ 0xde, 0xd0, 0xd5, 0xab, 0xdf, 0xe9, 0xf2, 0x78, 0xbb, 0x35, 0x88, 0x06, 0xdd,
+ 0x34, 0x5a, 0x05, 0x12, 0x33, 0x9b, 0x69, 0xda, 0xcf, 0x28, 0x46, 0x7c,
+ ]
+ ),
+ test_case!(
+ [
+ 0x58, 0xab, 0xd6, 0x8c, 0x2c, 0xa5, 0x97, 0x40, 0x6c, 0xde, 0xdb, 0xef, 0xa2,
+ 0x3c, 0xbc, 0xd7, 0xd8, 0x66, 0xaf, 0x36, 0x06, 0x8c, 0x80, 0x3f, 0xbd, 0xa6,
+ 0xb2, 0xcb, 0xb2, 0x4b, 0xa0, 0x47, 0xec, 0xcf, 0xc2, 0xe7, 0x37, 0xbe, 0xa9,
+ 0x6c, 0x8f, 0xcd, 0x92, 0xe4, 0x3f, 0xd3, 0x92, 0x70, 0x25, 0xd9, 0x03, 0xbf,
+ 0xb4, 0x27, 0xf7, 0xc5, 0x34, 0x0e, 0x69, 0xae, 0x9a, 0x2e, 0x0a, 0x77, 0xf7,
+ 0x3e, 0xda, 0x5e, 0x28, 0x96, 0xb3, 0xa0, 0xca, 0x43, 0xd6, 0xd6, 0x22, 0x17,
+ ],
+ [
+ 0xa0, 0xff, 0x83, 0x7d, 0xbb, 0xdc, 0xc5, 0x69, 0x0a, 0xf0, 0x82, 0x92, 0x8e,
+ 0x72, 0xec, 0x37, 0xb7, 0x46, 0x22, 0xb4,
+ ],
+ [
+ 0xf9, 0x4d, 0xac, 0xdd, 0x0b, 0x44, 0x59, 0x1a, 0x34, 0x8f, 0xaa, 0x32, 0x48,
+ 0x95, 0x7a, 0xbf, 0x64, 0x19, 0xd2, 0xe3, 0xd3, 0x95, 0x61, 0x5d, 0x93, 0x9f,
+ 0x55, 0x48, 0xe2, 0x1d, 0xe2, 0xb7,
+ ],
+ [
+ 0x80, 0x7b, 0x2b, 0x14, 0xd5, 0x29, 0x31, 0xf3, 0x00, 0xfa, 0x1c, 0x48, 0xe4,
+ 0xea, 0xcc, 0xb7, 0xed, 0x26, 0x17, 0x93, 0xe8, 0x52, 0x9f, 0xf2, 0xc5, 0x3e,
+ 0xc2, 0x14, 0x04, 0xd3, 0xef, 0x9a, 0x3a, 0xb1, 0xe0, 0xb4, 0x13, 0xbb, 0x8c,
+ 0x3c, 0x95, 0x44, 0x2b, 0xa6, 0x02, 0x04, 0x1e, 0x13,
+ ],
+ [
+ 0xc8, 0x92, 0x8b, 0x40, 0xc0, 0x1a, 0xd8, 0xbb, 0x9b, 0xc7, 0x02, 0xd0, 0x43,
+ 0x19, 0xf3, 0xac, 0xdc, 0x88, 0x3a, 0x06, 0x81, 0x85, 0x2e, 0xfb, 0x62, 0x5b,
+ 0x35, 0x38, 0x7f, 0x17, 0x0e, 0xfa, 0x04, 0xe3, 0x54, 0xa9, 0x45, 0xc2, 0x4a,
+ 0x8e, 0x59, 0xf4, 0x23, 0x67, 0x9e, 0x7c, 0xba, 0xda, 0x32, 0xcb, 0xac, 0xe6,
+ 0xbf, 0x7f, 0xd2, 0x32, 0x0c, 0xb4, 0x87, 0xb2, 0xf2, 0x9d, 0x2d, 0x06,
+ ]
+ ),
+ test_case!(
+ [
+ 0xf9, 0x87, 0x3b, 0x77, 0xa7, 0xfd, 0xa1, 0x42, 0xc1, 0xc7, 0x7b, 0xa5, 0x3a,
+ 0x8e, 0xaf, 0x80, 0xf5, 0x97, 0xd5, 0x54, 0xfd, 0xf6, 0xc5, 0xb2, 0xcc, 0xf4,
+ 0x32, 0x74, 0x79, 0x3d, 0xa7, 0x19, 0x91, 0xb9, 0xe3, 0x17, 0xa9, 0xe5, 0x36,
+ 0x7c, 0x3d, 0x5e, 0x9c, 0x75, 0x5d, 0x6f, 0x7d, 0x31, 0x7e, 0xeb, 0xb2, 0x79,
+ 0xe6, 0x90, 0x87, 0x82, 0x8c, 0x9c, 0xa6, 0x7e, 0x9f, 0x5d, 0x6e, 0x63, 0x50,
+ 0x37, 0xd5, 0xaa, 0x69, 0x03, 0x31, 0x30, 0x45, 0x42, 0x78, 0xe7, 0x02, 0xfe,
+ 0x7f,
+ ],
+ [
+ 0x1b, 0x3d, 0x94, 0x2f, 0xf0, 0x45, 0x64, 0x71, 0xad, 0x6e, 0xd1, 0x30, 0x56,
+ 0xea, 0x8d, 0xe1, 0xf0, 0xb0, 0xc1, 0xd9,
+ ],
+ [
+ 0x7f, 0xc2, 0x87, 0x10, 0x9f, 0x66, 0x20, 0x20, 0x1c, 0xcd, 0x68, 0x20, 0x5a,
+ 0x20, 0x72, 0x67, 0xc6, 0x57, 0x39, 0x49, 0xf3, 0x6e, 0xe9, 0x81, 0xd1, 0xee,
+ 0x08, 0xda, 0x7e, 0xa2, 0xf0, 0x87,
+ ],
+ [
+ 0x33, 0x9f, 0x29, 0x4b, 0x71, 0x67, 0x3d, 0x18, 0xd8, 0x82, 0xc7, 0xcd, 0x76,
+ 0x08, 0x81, 0x5b, 0x66, 0x0f, 0x4e, 0x02, 0xc8, 0xb2, 0x1d, 0xef, 0xb0, 0x0e,
+ 0x0f, 0xdf, 0xc8, 0x2e, 0x49, 0x10, 0x1c, 0x0d, 0x75, 0x8a, 0xb5, 0x8c, 0x98,
+ 0x2a, 0x43, 0x2e, 0xfc, 0xc6, 0xab, 0xf9, 0xb4, 0x47,
+ ],
+ [
+ 0x3a, 0x0a, 0xae, 0xe5, 0x11, 0xb8, 0x1f, 0x6a, 0x82, 0x0a, 0x23, 0x2d, 0x55,
+ 0x5f, 0x09, 0xa4, 0x7d, 0x71, 0x28, 0x03, 0xb4, 0xc2, 0x14, 0xee, 0x66, 0x73,
+ 0x9d, 0x44, 0xd9, 0x55, 0x3d, 0xd2, 0x31, 0xc0, 0x58, 0x7d, 0x0a, 0xef, 0xf4,
+ 0xaf, 0xd0, 0x58, 0x34, 0x81, 0x38, 0x32, 0x1c, 0x80, 0xbc, 0xc6, 0xf2, 0xee,
+ 0xad, 0x1a, 0x6f, 0x39, 0x5a, 0xf7, 0x50, 0x02, 0xe7, 0x4c, 0xe1, 0x77,
+ ]
+ ),
+ test_case!(
+ [
+ 0x1a, 0x9a, 0x09, 0x23, 0xe6, 0xa4, 0x56, 0x40, 0xc5, 0xa7, 0x9a, 0x80, 0x4b,
+ 0xa6, 0x12, 0x8d, 0xbf, 0xbc, 0xb8, 0x72, 0xbb, 0x3b, 0x5b, 0x27, 0xde, 0x84,
+ 0xca, 0xc9, 0x7a, 0x10, 0x3e, 0xe3, 0x09, 0x5f, 0xa9, 0x2b, 0x15, 0x5d, 0x44,
+ 0xa8, 0x1e, 0xa7, 0x76, 0xe2, 0x71, 0x9c, 0x0b, 0xa9, 0x2c, 0x28, 0x3b, 0xfd,
+ 0xdb, 0x8b, 0xb5, 0x1c, 0xbf, 0x9a, 0xe0, 0xd4, 0xf2, 0x3c, 0x38, 0xe9, 0x7b,
+ 0x70, 0x1a, 0x0c, 0x1d, 0x90, 0xf8, 0x10, 0xe9, 0x3e, 0x3e, 0x52, 0xde, 0x30,
+ 0x70, 0x17,
+ ],
+ [
+ 0xd0, 0x3a, 0x32, 0x13, 0x38, 0x7a, 0x7c, 0x4d, 0xfc, 0x0a, 0xf4, 0x5c, 0x53,
+ 0x6e, 0x8c, 0x13, 0x23, 0x5b, 0xac, 0x03,
+ ],
+ [
+ 0x26, 0xfd, 0x50, 0x21, 0x71, 0xa6, 0x85, 0xc1, 0xd6, 0x0a, 0xcc, 0xe8, 0x42,
+ 0x9b, 0x05, 0xec, 0xac, 0xe9, 0x1e, 0x86, 0x6c, 0x31, 0x81, 0x75, 0x19, 0x26,
+ 0x18, 0x27, 0xb9, 0xf0, 0x50, 0x0d,
+ ],
+ [
+ 0xe4, 0xbd, 0x4a, 0x00, 0xc0, 0x29, 0x3a, 0xcb, 0x47, 0xa4, 0x63, 0xde, 0xaa,
+ 0x24, 0x51, 0x37, 0xbe, 0x22, 0x8c, 0x23, 0xc9, 0xdd, 0x4c, 0x05, 0x00, 0xfc,
+ 0x41, 0x52, 0xa2, 0xfb, 0x59, 0x63, 0xfe, 0x84, 0xce, 0x4c, 0xe8, 0x20, 0xfe,
+ 0x0f, 0x65, 0xf6, 0x8a, 0xeb, 0x37, 0x13, 0x68, 0xf4,
+ ],
+ [
+ 0x1f, 0x2e, 0x44, 0xb9, 0x04, 0xd3, 0x3f, 0x81, 0x6e, 0x05, 0xd8, 0x4f, 0x5b,
+ 0x6e, 0xa0, 0x82, 0x1e, 0xbc, 0xab, 0x6a, 0xfe, 0xf7, 0xd6, 0xc8, 0x52, 0xe4,
+ 0xac, 0xb5, 0xd3, 0xfb, 0xa5, 0x05, 0x64, 0xf0, 0x77, 0xbb, 0x48, 0xa5, 0xf7,
+ 0x49, 0x37, 0x58, 0xb9, 0x2c, 0x99, 0xf9, 0x95, 0x60, 0x94, 0xac, 0x88, 0xef,
+ 0x41, 0x63, 0x6f, 0xec, 0x0f, 0xcd, 0x79, 0x93, 0x05, 0x3c, 0xd2, 0xc3,
+ ]
+ ),
+ test_case!(
+ [
+ 0x6e, 0x3b, 0xda, 0x5c, 0x2f, 0x69, 0x90, 0x1b, 0xf4, 0x49, 0x4c, 0xea, 0x23,
+ 0x89, 0x63, 0xd6, 0x95, 0x48, 0x6f, 0x21, 0xfe, 0x25, 0x3b, 0xc9, 0xb6, 0xbe,
+ 0x5b, 0x10, 0x72, 0x3c, 0x1f, 0x5d, 0xf5, 0x91, 0xd2, 0x6e, 0x14, 0xd0, 0x55,
+ 0xe1, 0xa7, 0xc7, 0x2e, 0x82, 0x06, 0x29, 0x40, 0x2f, 0x3b, 0x02, 0x92, 0x7e,
+ 0x72, 0x56, 0x44, 0x50, 0x89, 0xa5, 0xcb, 0xda, 0x66, 0xcf, 0x79, 0xbd, 0xe0,
+ 0x01, 0x39, 0x8e, 0x4d, 0x66, 0xc3, 0xaa, 0xc3, 0xfc, 0x93, 0x46, 0x23, 0x7b,
+ 0xdd, 0x92, 0xf9,
+ ],
+ [
+ 0x05, 0x6f, 0x8a, 0x01, 0xe9, 0xd7, 0x6b, 0xc5, 0xbd, 0xdd, 0x2c, 0xf4, 0xf0,
+ 0xde, 0xdb, 0x2a, 0xed, 0x80, 0xa9, 0x81,
+ ],
+ [
+ 0x87, 0x7a, 0x27, 0xbd, 0x7b, 0xd9, 0x2e, 0xd5, 0x87, 0x99, 0x08, 0x86, 0xd1,
+ 0x7c, 0x44, 0x6a, 0x9c, 0x47, 0x06, 0xa5, 0x2b, 0x69, 0xd7, 0x73, 0x4a, 0x44,
+ 0x2d, 0x11, 0x1e, 0xbe, 0xf4, 0x7f,
+ ],
+ [
+ 0xab, 0x57, 0x46, 0xf9, 0xfd, 0x65, 0x54, 0x52, 0x12, 0x00, 0xbd, 0x54, 0x56,
+ 0x8d, 0x00, 0xbe, 0xfe, 0xe6, 0x63, 0x6c, 0x65, 0x5c, 0x21, 0x47, 0x16, 0x23,
+ 0x01, 0xed, 0xda, 0x15, 0xb1, 0xea, 0x06, 0xdf, 0xdd, 0xa1, 0x44, 0xa9, 0x6c,
+ 0x57, 0x6b, 0x7f, 0x3c, 0xcc, 0xa1, 0xae, 0xd1, 0x81,
+ ],
+ [
+ 0xe0, 0xd7, 0x16, 0x17, 0x3a, 0xc5, 0xc1, 0xf1, 0x5d, 0xed, 0x5e, 0xe7, 0x37,
+ 0x47, 0x06, 0x01, 0x73, 0xa4, 0x29, 0xe5, 0xeb, 0xf6, 0xfa, 0x5c, 0xbe, 0x91,
+ 0x22, 0xf4, 0x44, 0x47, 0x4f, 0xba, 0x92, 0x18, 0x49, 0x42, 0xcd, 0x55, 0x84,
+ 0x24, 0x6b, 0x26, 0xfc, 0x80, 0xee, 0xc5, 0x80, 0xbb, 0x0f, 0xf8, 0x0f, 0xd4,
+ 0x7a, 0x4f, 0x14, 0xa6, 0xc5, 0x13, 0xff, 0xa3, 0x32, 0xed, 0x57, 0x92,
+ ]
+ ),
+ test_case!(
+ [
+ 0xaf, 0xce, 0x16, 0xf3, 0x3a, 0x89, 0xbe, 0xdd, 0x44, 0x7b, 0x3e, 0x74, 0x09,
+ 0x1b, 0x3d, 0x20, 0x02, 0x52, 0x65, 0x60, 0xeb, 0xeb, 0x1f, 0x72, 0x70, 0x32,
+ 0x61, 0xcb, 0x2c, 0xaa, 0x25, 0x40, 0x36, 0x78, 0x27, 0x14, 0x4b, 0x8f, 0x67,
+ 0x2a, 0xd8, 0xcd, 0x13, 0x3c, 0x44, 0xf6, 0x05, 0x11, 0xa0, 0x2e, 0x16, 0x20,
+ 0xa1, 0x88, 0xfc, 0xbe, 0xe8, 0x1b, 0x77, 0x86, 0x6d, 0xa0, 0x39, 0x73, 0xd0,
+ 0x06, 0x22, 0x63, 0xa3, 0xf9, 0xc0, 0xa1, 0x5b, 0x22, 0x71, 0x96, 0xd3, 0x5f,
+ 0xed, 0xbb, 0xd4, 0x00,
+ ],
+ [
+ 0x30, 0x22, 0xb4, 0x8c, 0x5f, 0x18, 0x3f, 0x72, 0x20, 0x1b, 0x5d, 0xf7, 0x3d,
+ 0xd8, 0x3a, 0x85, 0xfb, 0xf0, 0x43, 0x4f,
+ ],
+ [
+ 0x01, 0xb2, 0x31, 0x49, 0x1c, 0xf9, 0x58, 0x54, 0x6b, 0x59, 0x42, 0xbd, 0x21,
+ 0x0c, 0x2c, 0xef, 0xfc, 0xf3, 0x23, 0xb6, 0xc0, 0x5c, 0x75, 0x50, 0x0f, 0x74,
+ 0x4a, 0x68, 0x8d, 0xb9, 0x21, 0x4a,
+ ],
+ [
+ 0x7c, 0x63, 0x89, 0x2d, 0x2f, 0x85, 0x5e, 0xe7, 0x8a, 0x67, 0x46, 0xad, 0xf1,
+ 0x93, 0x54, 0x64, 0x5b, 0x3a, 0x26, 0x40, 0x23, 0x9c, 0xfe, 0x76, 0xa8, 0x04,
+ 0xf8, 0x11, 0x53, 0x2c, 0xd9, 0x54, 0x6c, 0xde, 0xb9, 0xc8, 0xf0, 0x2e, 0x6e,
+ 0xc8, 0x3d, 0xf4, 0x63, 0x34, 0xfe, 0xb7, 0x63, 0x27,
+ ],
+ [
+ 0xa8, 0x05, 0xe0, 0xeb, 0x3e, 0xa2, 0x34, 0x4c, 0x39, 0x39, 0xb8, 0x28, 0x6e,
+ 0xa6, 0x47, 0x26, 0x8c, 0x53, 0x26, 0x3d, 0xc4, 0x3b, 0x47, 0x38, 0x52, 0xa5,
+ 0xbd, 0x74, 0xd0, 0x36, 0xff, 0xaa, 0x2d, 0xf7, 0xd7, 0x10, 0xe7, 0x7b, 0x58,
+ 0x59, 0x2e, 0xe5, 0x96, 0x49, 0x56, 0x11, 0x03, 0x61, 0xeb, 0x26, 0xbd, 0xa9,
+ 0x50, 0x24, 0x3e, 0xbd, 0x10, 0xef, 0x8d, 0x0e, 0x0c, 0x65, 0x2f, 0xb0,
+ ]
+ ),
+ test_case!(
+ [
+ 0x24, 0x74, 0x2b, 0xce, 0xd1, 0x3b, 0x44, 0xf8, 0xc0, 0xd0, 0xd0, 0xc3, 0xe4,
+ 0x11, 0x39, 0x61, 0x80, 0x69, 0xba, 0x5f, 0x04, 0xcc, 0x95, 0xf5, 0xb5, 0x68,
+ 0xae, 0xf8, 0xe9, 0xe9, 0x35, 0x2d, 0x66, 0x06, 0x72, 0x42, 0x1f, 0x34, 0x8c,
+ 0x50, 0xa7, 0x6f, 0xdb, 0x8b, 0xab, 0xa7, 0xac, 0xba, 0xa0, 0x93, 0x62, 0x7d,
+ 0x4b, 0xfe, 0x4a, 0xa6, 0xdd, 0xf0, 0x01, 0x02, 0xd2, 0x6f, 0x94, 0x9a, 0x07,
+ 0x24, 0x16, 0xba, 0x4c, 0xe8, 0xab, 0x0d, 0x43, 0xa5, 0x25, 0x96, 0xbb, 0x9a,
+ 0x38, 0x84, 0x97, 0xc1, 0xf7,
+ ],
+ [
+ 0xb8, 0x74, 0xed, 0x06, 0x84, 0x5c, 0x68, 0x73, 0x97, 0xe2, 0xea, 0x17, 0x5c,
+ 0x14, 0x26, 0x85, 0xa6, 0x50, 0x3a, 0x0c,
+ ],
+ [
+ 0x5e, 0x39, 0x4e, 0x4e, 0x37, 0xa2, 0x05, 0x40, 0x61, 0x95, 0x8d, 0xac, 0xbf,
+ 0x75, 0xcc, 0xc1, 0x14, 0x4d, 0xc8, 0xd8, 0xf9, 0x3f, 0xb7, 0x24, 0x2c, 0x9a,
+ 0xca, 0x3a, 0xe2, 0xae, 0x99, 0x90,
+ ],
+ [
+ 0xe2, 0x71, 0xe9, 0xfc, 0xb2, 0x06, 0x60, 0xc0, 0x4a, 0xeb, 0xca, 0x45, 0xdd,
+ 0x72, 0x83, 0x49, 0xe8, 0xf4, 0x99, 0xb2, 0xcc, 0xc0, 0x36, 0xd7, 0xda, 0xcd,
+ 0xb6, 0xe8, 0xb1, 0xc1, 0x03, 0xcc, 0x9b, 0x10, 0xe4, 0x4e, 0xa4, 0xe5, 0x95,
+ 0xc0, 0xd4, 0x7a, 0xaf, 0x43, 0xd0, 0x33, 0x5a, 0xd0,
+ ],
+ [
+ 0x63, 0xbd, 0x39, 0x1d, 0xd1, 0x46, 0xba, 0x4e, 0xde, 0xad, 0xf4, 0xb0, 0xd9,
+ 0xda, 0x7a, 0xff, 0x90, 0xeb, 0x48, 0x60, 0x5b, 0x7f, 0xd2, 0x9e, 0xbf, 0x2c,
+ 0xaf, 0x54, 0xae, 0x83, 0x7a, 0x5b, 0xfb, 0xf8, 0x25, 0xd0, 0xc5, 0x17, 0x29,
+ 0xac, 0xbd, 0xaf, 0x4e, 0x23, 0xa2, 0x6f, 0x42, 0x73, 0xfc, 0x7b, 0x01, 0x38,
+ 0xa9, 0x42, 0x1d, 0xb9, 0xe8, 0x16, 0xd3, 0xf2, 0xc0, 0xa9, 0x20, 0x9c,
+ ]
+ ),
+ test_case!(
+ [
+ 0xdd, 0x89, 0xd7, 0x92, 0x13, 0xa0, 0xf7, 0xe1, 0x48, 0x3a, 0x4b, 0x14, 0x8d,
+ 0x04, 0xc7, 0x3a, 0xee, 0xad, 0xb3, 0x22, 0x0f, 0x94, 0xa2, 0x76, 0x12, 0x00,
+ 0x38, 0x70, 0x48, 0xf7, 0x8a, 0x98, 0x2a, 0x0f, 0x86, 0x85, 0x10, 0x8e, 0xf8,
+ 0x49, 0xff, 0x8d, 0xff, 0x26, 0xda, 0x55, 0xf0, 0xa8, 0x97, 0x10, 0x3d, 0xc2,
+ 0x79, 0xce, 0x2f, 0x85, 0x21, 0x1a, 0x6b, 0x00, 0x5c, 0xea, 0xbb, 0x82, 0x98,
+ 0x63, 0x66, 0x38, 0xaf, 0x4b, 0xf6, 0xda, 0x03, 0xda, 0xf6, 0xd2, 0xc9, 0x08,
+ 0xa9, 0xdc, 0x26, 0x16, 0x18, 0x96,
+ ],
+ [
+ 0x6f, 0x57, 0xe8, 0x81, 0x52, 0x91, 0x70, 0x0a, 0x47, 0x94, 0x9b, 0x7a, 0x0a,
+ 0xcc, 0x8f, 0x9e, 0x46, 0x75, 0xe5, 0xa0,
+ ],
+ [
+ 0xbc, 0x4f, 0x03, 0xf0, 0x1d, 0x98, 0x9f, 0xec, 0xd0, 0xf4, 0xe6, 0xb3, 0xfa,
+ 0x8b, 0x98, 0x80, 0x4d, 0xba, 0x35, 0x4f, 0xa1, 0x5f, 0x1a, 0x71, 0x84, 0x42,
+ 0x17, 0x57, 0xcb, 0x2d, 0xb4, 0x65,
+ ],
+ [
+ 0xff, 0xc5, 0x61, 0xa9, 0x33, 0x2e, 0xb8, 0x12, 0x0f, 0x67, 0x38, 0x57, 0xde,
+ 0x4a, 0x46, 0x94, 0xbe, 0xae, 0xc7, 0x92, 0xca, 0x06, 0xdc, 0x85, 0xcf, 0xa9,
+ 0xa0, 0xd1, 0xb9, 0xf0, 0x22, 0xbf, 0x02, 0x61, 0x21, 0xf6, 0x64, 0x3a, 0x08,
+ 0x37, 0x7b, 0xed, 0x41, 0x9f, 0x0c, 0x71, 0x93, 0x4f,
+ ],
+ [
+ 0xfb, 0x74, 0x8d, 0x63, 0x78, 0xc6, 0x9a, 0x92, 0xaa, 0xfb, 0x97, 0x0b, 0xcd,
+ 0x29, 0xab, 0x98, 0xe6, 0xda, 0x5e, 0xf7, 0x18, 0xf1, 0x09, 0x0a, 0x04, 0x23,
+ 0x38, 0x2c, 0x10, 0x42, 0x90, 0x2c, 0xaf, 0x1b, 0x7e, 0x50, 0x17, 0x77, 0xac,
+ 0xa0, 0xe0, 0x9e, 0xb5, 0xa4, 0xf9, 0xbb, 0x70, 0x5e, 0x57, 0xf8, 0x2c, 0xb3,
+ 0xa0, 0x3a, 0x2d, 0x70, 0x7e, 0x32, 0x7c, 0xaa, 0x1b, 0xef, 0xd0, 0x3c,
+ ]
+ ),
+ test_case!(
+ [
+ 0x3b, 0x7c, 0xcb, 0x82, 0xa8, 0x15, 0xf2, 0x9f, 0x7b, 0x93, 0x32, 0x1e, 0x76,
+ 0x8e, 0x59, 0x39, 0x81, 0x1a, 0xa9, 0xd3, 0x5e, 0xc5, 0xd6, 0x1a, 0xbf, 0x31,
+ 0x35, 0x91, 0xc3, 0xeb, 0xeb, 0xc5, 0xbb, 0x99, 0xac, 0xc9, 0x5e, 0x67, 0x9c,
+ 0x02, 0x1f, 0x85, 0x4c, 0x7a, 0x10, 0x2b, 0x53, 0x0c, 0x82, 0x18, 0x21, 0x5a,
+ 0x09, 0x80, 0x7c, 0xb7, 0xdf, 0x81, 0x52, 0xa1, 0xe4, 0x05, 0xab, 0xef, 0xd3,
+ 0x21, 0x25, 0x8d, 0xa1, 0x72, 0x00, 0x10, 0x8b, 0xcd, 0xbf, 0x7c, 0xb1, 0x4a,
+ 0x0e, 0x7f, 0x51, 0x5a, 0xe9, 0x75, 0x06,
+ ],
+ [
+ 0x8d, 0x3f, 0xeb, 0x47, 0x2e, 0xfd, 0x02, 0x3f, 0x2b, 0x20, 0x22, 0x41, 0x6d,
+ 0x47, 0xf1, 0xf5, 0x4b, 0x8e, 0x18, 0xbf,
+ ],
+ [
+ 0x20, 0x10, 0xab, 0x80, 0x10, 0x4e, 0x64, 0x12, 0xe0, 0x59, 0x02, 0x23, 0xd4,
+ 0xb1, 0x38, 0x10, 0xf0, 0x54, 0xf4, 0xfa, 0x52, 0xdd, 0x9c, 0x10, 0x17, 0x62,
+ 0x8f, 0x5a, 0x30, 0x8e, 0x8f, 0x77,
+ ],
+ [
+ 0x27, 0x03, 0xbe, 0x2e, 0x01, 0xb2, 0x45, 0xf5, 0x79, 0xc9, 0xa4, 0x00, 0xdb,
+ 0xdc, 0x9e, 0x16, 0x59, 0xdd, 0xb2, 0x9e, 0xf5, 0xe7, 0x8a, 0xb7, 0x21, 0xb4,
+ 0x83, 0xf7, 0xb2, 0x33, 0x70, 0x21, 0x28, 0x40, 0x3e, 0x3c, 0xdf, 0xfe, 0x3b,
+ 0x47, 0x04, 0x9e, 0x89, 0xef, 0x26, 0x75, 0x36, 0xc9,
+ ],
+ [
+ 0x44, 0x09, 0x79, 0x6e, 0xf4, 0x46, 0xa3, 0xad, 0x04, 0xd6, 0x21, 0xbb, 0x2a,
+ 0x6b, 0x22, 0xc4, 0x88, 0xca, 0xc2, 0xc5, 0xe2, 0x0f, 0x75, 0x74, 0x87, 0xaa,
+ 0x1b, 0xd3, 0xc4, 0x93, 0xd2, 0x7c, 0x24, 0x6d, 0x27, 0x53, 0x5f, 0xc0, 0xa2,
+ 0x15, 0xe3, 0x7f, 0x46, 0xba, 0x39, 0x08, 0xcf, 0x01, 0x54, 0x95, 0xb4, 0x98,
+ 0x4b, 0x28, 0x9e, 0x0b, 0x87, 0xa1, 0xa1, 0xc9, 0x0d, 0x4c, 0x2b, 0x19,
+ ]
+ ),
+ test_case!(
+ [
+ 0xb1, 0xc5, 0x05, 0x68, 0xf3, 0x5a, 0xcd, 0x3a, 0xd6, 0x64, 0x7b, 0x9f, 0x0e,
+ 0xe9, 0x6d, 0x1b, 0xa4, 0xd9, 0x29, 0xc7, 0xa5, 0x63, 0xf7, 0xe6, 0x28, 0x5c,
+ 0x7d, 0x44, 0x85, 0xc5, 0xde, 0x59, 0xf7, 0x0c, 0x40, 0x2a, 0x36, 0x4c, 0x38,
+ 0x7b, 0x40, 0x9d, 0xf7, 0xff, 0xe3, 0xb1, 0x0a, 0xe9, 0x4e, 0x85, 0x06, 0xad,
+ 0x8d, 0x61, 0x21, 0xb2, 0x1f, 0xab, 0x82, 0xc4, 0xaa, 0xa5, 0x12, 0xf9, 0xfe,
+ 0x41, 0x3c, 0xab, 0x5e, 0xcd, 0x94, 0x6e, 0x27, 0x78, 0x08, 0x65, 0xe9, 0x0a,
+ 0x2e, 0x56, 0x66, 0xc5, 0xbb, 0xd1, 0xd2, 0x4e,
+ ],
+ [
+ 0xa7, 0x6f, 0x58, 0x3e, 0xa3, 0x3c, 0x1d, 0xb9, 0x1e, 0xb6, 0xf0, 0x66, 0x40,
+ 0x59, 0x1d, 0xdb, 0xdf, 0xfb, 0x6c, 0x61,
+ ],
+ [
+ 0x82, 0xe5, 0x96, 0x58, 0x93, 0xad, 0x82, 0x74, 0x80, 0xb9, 0xfa, 0x58, 0xfa,
+ 0xae, 0x18, 0x54, 0x3f, 0xa3, 0x44, 0x27, 0x93, 0xa9, 0xa1, 0xa0, 0xd9, 0x08,
+ 0xcb, 0x3b, 0xa8, 0x66, 0x7d, 0x2a,
+ ],
+ [
+ 0xea, 0xcd, 0x4a, 0xeb, 0x89, 0xd5, 0xfb, 0xd1, 0x46, 0x2a, 0x53, 0x5a, 0x52,
+ 0xd9, 0xcf, 0xc8, 0x3a, 0x25, 0xfd, 0xfa, 0x35, 0xa0, 0x46, 0xb7, 0x9c, 0x13,
+ 0x9a, 0x90, 0x06, 0x1c, 0x2f, 0x1e, 0x23, 0x25, 0xb2, 0x50, 0x85, 0x03, 0x69,
+ 0x9a, 0x5e, 0x22, 0x78, 0x89, 0x82, 0x76, 0x5f, 0x4d,
+ ],
+ [
+ 0xd8, 0x19, 0x7b, 0x1e, 0x45, 0x6b, 0xbb, 0x03, 0x27, 0x34, 0xf5, 0xe4, 0xd7,
+ 0x78, 0x31, 0x4a, 0x12, 0x2d, 0x45, 0xbc, 0x93, 0x81, 0xeb, 0xfb, 0x9b, 0x07,
+ 0x4d, 0xd0, 0x52, 0x49, 0x0c, 0xf3, 0x5d, 0x28, 0xd5, 0xfe, 0xfa, 0xa8, 0x32,
+ 0x12, 0x47, 0x7f, 0x75, 0xc5, 0x03, 0xe1, 0x5c, 0x71, 0x97, 0xaf, 0xe1, 0x0f,
+ 0xc4, 0x80, 0xcc, 0xbf, 0x5a, 0x70, 0xd8, 0x89, 0xe2, 0xb7, 0x9c, 0x23,
+ ]
+ ),
+ test_case!(
+ [
+ 0x68, 0x52, 0x52, 0x63, 0x7a, 0xe5, 0xa6, 0xf2, 0x2a, 0x48, 0x32, 0xe6, 0xc6,
+ 0xb9, 0xed, 0x30, 0x94, 0x86, 0xe6, 0x9e, 0x30, 0xba, 0x38, 0xaf, 0xcf, 0x0f,
+ 0xe0, 0x4f, 0xfd, 0x23, 0xa3, 0x49, 0x02, 0x89, 0xfe, 0xdd, 0xac, 0x56, 0xe9,
+ 0xcc, 0xf9, 0xcb, 0x69, 0x27, 0xb1, 0x8c, 0x52, 0x30, 0xa9, 0xdb, 0xad, 0x64,
+ 0xca, 0xef, 0x36, 0x8f, 0x83, 0x10, 0xd8, 0x27, 0x5d, 0x87, 0x4a, 0x4a, 0x54,
+ 0x6e, 0xcc, 0x4b, 0x01, 0x10, 0x4f, 0x18, 0x8d, 0xc6, 0x71, 0x63, 0x99, 0xd9,
+ 0x1b, 0xab, 0xbf, 0x5e, 0xd6, 0xae, 0x1d, 0xe7, 0x8c,
+ ],
+ [
+ 0x1a, 0x98, 0x3d, 0xa0, 0xe0, 0x65, 0xb3, 0x49, 0x37, 0x73, 0xd6, 0xab, 0x88,
+ 0xf1, 0x9e, 0xe7, 0x11, 0x92, 0xfe, 0x2f,
+ ],
+ [
+ 0x2b, 0x63, 0x5e, 0x04, 0x99, 0xde, 0x2d, 0xc9, 0x0d, 0xa0, 0xca, 0x9c, 0xc9,
+ 0xfc, 0xd6, 0x72, 0xc6, 0x76, 0xe8, 0xba, 0x5b, 0x60, 0x24, 0x4c, 0x80, 0x52,
+ 0x9d, 0x12, 0x46, 0x8b, 0xe0, 0xe4,
+ ],
+ [
+ 0xe9, 0xdf, 0x02, 0x76, 0x61, 0x50, 0xad, 0x9e, 0xa6, 0xd9, 0x07, 0x5c, 0xae,
+ 0x70, 0x00, 0x58, 0x10, 0x83, 0xdf, 0x3c, 0xf4, 0xf3, 0x30, 0x4b, 0x56, 0xa3,
+ 0x47, 0x00, 0xe8, 0x78, 0x2a, 0x5e, 0x6f, 0x86, 0x84, 0x38, 0x1d, 0x3a, 0xdf,
+ 0x11, 0x4f, 0x13, 0xa0, 0xf2, 0x3e, 0x6e, 0x58, 0xdf,
+ ],
+ [
+ 0xac, 0x23, 0xc2, 0x5a, 0x3f, 0x10, 0x1f, 0x78, 0x68, 0xe0, 0x67, 0x2b, 0xdf,
+ 0x51, 0xfa, 0xb6, 0x2e, 0x06, 0x21, 0x26, 0x21, 0x3f, 0xd8, 0xb7, 0x7e, 0x88,
+ 0x00, 0xda, 0xa2, 0x71, 0xf5, 0x09, 0x18, 0xe7, 0xc5, 0xfc, 0xb1, 0x97, 0x2a,
+ 0x46, 0xb9, 0x4f, 0x74, 0x92, 0x8d, 0xbb, 0xa6, 0x1c, 0xcf, 0x7e, 0x39, 0x91,
+ 0xe8, 0x1a, 0x68, 0x8e, 0x63, 0xaa, 0x5a, 0xcd, 0xc6, 0x7b, 0x27, 0x09,
+ ]
+ ),
+ test_case!(
+ [
+ 0x50, 0xc7, 0x6d, 0x59, 0x4d, 0x87, 0x71, 0x96, 0x16, 0x17, 0xeb, 0xb8, 0xf8,
+ 0x07, 0xb4, 0xda, 0xd7, 0xb3, 0x7b, 0xf1, 0x8c, 0x6d, 0x75, 0x85, 0xd7, 0x1d,
+ 0xc5, 0x29, 0x38, 0x00, 0xd5, 0x95, 0x87, 0x10, 0xd4, 0x1f, 0x0b, 0x93, 0x49,
+ 0xe2, 0xe7, 0xa1, 0x5c, 0xf5, 0xaa, 0x66, 0x5b, 0xb3, 0x7c, 0x2e, 0x66, 0xa6,
+ 0xa8, 0xcc, 0xaf, 0xc2, 0xaa, 0xfa, 0x6f, 0xf6, 0x27, 0xc7, 0x7f, 0xab, 0xee,
+ 0x67, 0x38, 0x2e, 0x19, 0xeb, 0xac, 0x07, 0x87, 0x22, 0x85, 0xc6, 0x5d, 0x62,
+ 0x9c, 0x52, 0x34, 0x21, 0x80, 0xdf, 0x5c, 0x3d, 0x69, 0x9f,
+ ],
+ [
+ 0x98, 0x5b, 0xb6, 0x6e, 0x2c, 0xc0, 0x38, 0xe1, 0xb0, 0x5f, 0x78, 0xbc, 0x44,
+ 0xf0, 0xd9, 0xc3, 0xa9, 0xc8, 0x35, 0x30,
+ ],
+ [
+ 0xab, 0x3a, 0x81, 0x65, 0xbe, 0x03, 0xe3, 0x96, 0x80, 0xbb, 0x7f, 0xc6, 0x53,
+ 0x38, 0x48, 0x75, 0x53, 0xfa, 0x7f, 0xa2, 0xfc, 0x3b, 0xe9, 0xa1, 0xec, 0xe8,
+ 0xf0, 0x5c, 0xf0, 0x70, 0x79, 0x82,
+ ],
+ [
+ 0x73, 0x00, 0x9f, 0x94, 0x7a, 0xea, 0x04, 0xcf, 0x4f, 0x4d, 0x57, 0xe9, 0xad,
+ 0xf7, 0xe3, 0x07, 0x66, 0xc1, 0x36, 0xe0, 0x05, 0x75, 0xe9, 0x97, 0x00, 0x6e,
+ 0x07, 0xec, 0xe4, 0xd8, 0x29, 0x07, 0x27, 0xf1, 0x42, 0xdd, 0x45, 0xc9, 0xa3,
+ 0x29, 0x9c, 0x5e, 0x1c, 0x5a, 0x33, 0x05, 0xe2, 0x7d,
+ ],
+ [
+ 0x16, 0x8b, 0x4b, 0x18, 0xb8, 0x6d, 0x8b, 0x17, 0x77, 0x61, 0xa8, 0xe3, 0x38,
+ 0x71, 0x58, 0x47, 0x40, 0x39, 0x0e, 0x63, 0xa7, 0xbd, 0xd8, 0x87, 0x36, 0xfa,
+ 0x16, 0xa8, 0x86, 0x88, 0xef, 0x2e, 0xb3, 0x2d, 0xcc, 0xf6, 0xd2, 0x9e, 0x09,
+ 0xab, 0xf0, 0x75, 0xf7, 0x3d, 0x46, 0xe0, 0x2c, 0x09, 0x18, 0x76, 0x74, 0xfd,
+ 0xb9, 0xa4, 0x80, 0xd8, 0x60, 0x1f, 0xc6, 0x0c, 0xb4, 0xc9, 0x45, 0xa9,
+ ]
+ ),
+ test_case!(
+ [
+ 0x3d, 0x4d, 0x10, 0xb4, 0xbb, 0x6a, 0xed, 0x74, 0x4a, 0xeb, 0xf0, 0x64, 0x45,
+ 0x24, 0x15, 0x5f, 0xaf, 0xdf, 0x77, 0xb4, 0xf9, 0x0a, 0xfd, 0x4c, 0x4c, 0x3d,
+ 0x6b, 0x87, 0x7a, 0x78, 0xe6, 0x80, 0x1c, 0x65, 0x42, 0xf7, 0x8c, 0xbe, 0xb3,
+ 0xb3, 0x4b, 0x65, 0xc0, 0xa3, 0x5e, 0x4a, 0x12, 0xda, 0x34, 0x57, 0xed, 0x8a,
+ 0xdc, 0x5c, 0xb8, 0x68, 0xd3, 0x0d, 0xca, 0xf3, 0xd8, 0xe9, 0xd6, 0x51, 0x3e,
+ 0x4e, 0xc6, 0xc8, 0x1a, 0x93, 0x95, 0xa5, 0x82, 0x35, 0xbc, 0x73, 0xdc, 0x09,
+ 0x42, 0xb7, 0x7e, 0x96, 0xb8, 0xf4, 0x20, 0x95, 0x0a, 0x64, 0x5d,
+ ],
+ [
+ 0x57, 0x04, 0x84, 0x3e, 0xe2, 0x4f, 0x33, 0x37, 0x6f, 0x42, 0xf9, 0xa2, 0x6f,
+ 0xcf, 0x63, 0xe6, 0x35, 0xf5, 0xcf, 0x88,
+ ],
+ [
+ 0x5b, 0x48, 0x0c, 0xe1, 0x2e, 0x67, 0xc3, 0x1b, 0xf8, 0xb1, 0xe9, 0x9e, 0x4c,
+ 0x1e, 0x57, 0xad, 0x3d, 0xb3, 0xa1, 0xe4, 0xb1, 0x16, 0x2b, 0xc5, 0x54, 0x12,
+ 0x17, 0x70, 0xe6, 0xaa, 0xfe, 0x86,
+ ],
+ [
+ 0xb2, 0xc2, 0x3c, 0x73, 0x8c, 0xc2, 0x3d, 0x76, 0x63, 0x14, 0xb0, 0xd2, 0x84,
+ 0x83, 0x34, 0xe3, 0xb0, 0x38, 0x3f, 0xc9, 0x64, 0xb0, 0xf6, 0x3e, 0x49, 0x53,
+ 0xec, 0x4d, 0xdc, 0xbc, 0xbf, 0x6d, 0x27, 0x8c, 0x1b, 0x69, 0x3a, 0xd6, 0xe6,
+ 0xc7, 0xc2, 0x7f, 0xc4, 0x9f, 0xee, 0xf1, 0xb2, 0xeb,
+ ],
+ [
+ 0x17, 0x65, 0x12, 0x21, 0x3e, 0x00, 0xb1, 0x52, 0x26, 0x23, 0xc8, 0x7d, 0x17,
+ 0x3c, 0x5e, 0x43, 0xe2, 0x9c, 0xc2, 0x57, 0x48, 0xa9, 0x7d, 0x86, 0x43, 0x88,
+ 0x97, 0x46, 0x58, 0xb7, 0x78, 0x29, 0x93, 0x0a, 0x42, 0x47, 0xff, 0x23, 0x42,
+ 0x20, 0xcf, 0x4b, 0x22, 0xb7, 0x10, 0xe1, 0x8c, 0x49, 0x11, 0x48, 0x4a, 0xb0,
+ 0x95, 0x86, 0x1c, 0x2e, 0x1b, 0x27, 0xce, 0x4e, 0x42, 0xc6, 0xc2, 0x78,
+ ]
+ ),
+ test_case!(
+ [
+ 0xf2, 0xd7, 0x9b, 0x37, 0x30, 0x67, 0x67, 0x69, 0x7e, 0x54, 0xc7, 0xc7, 0x84,
+ 0xc1, 0xd5, 0xc2, 0x72, 0x18, 0x66, 0x2f, 0x5a, 0x79, 0x27, 0xd1, 0x7a, 0x61,
+ 0x3c, 0xfc, 0xc8, 0x13, 0xa1, 0xc2, 0x01, 0x1d, 0xa1, 0xec, 0xba, 0xe5, 0xa3,
+ 0x23, 0x6a, 0xd5, 0xaf, 0xf1, 0x26, 0x03, 0x8d, 0x97, 0xee, 0x71, 0xac, 0xd5,
+ 0xbb, 0x34, 0xcd, 0x3e, 0x55, 0x18, 0xa6, 0x37, 0x11, 0xe1, 0x8b, 0x72, 0x9a,
+ 0x0c, 0x19, 0x13, 0xaf, 0x3d, 0x47, 0xae, 0x23, 0x71, 0x41, 0x08, 0x39, 0x28,
+ 0x19, 0xe8, 0x1d, 0x81, 0x1e, 0x72, 0x4d, 0x1b, 0x32, 0x9a, 0xf1, 0xad,
+ ],
+ [
+ 0x95, 0x04, 0xd4, 0x1f, 0x7d, 0x85, 0xa7, 0x38, 0xb8, 0x9e, 0x2d, 0x0f, 0x76,
+ 0x3d, 0x1d, 0x0c, 0xa4, 0xfa, 0xa2, 0x0c,
+ ],
+ [
+ 0x29, 0x67, 0x6d, 0x2d, 0x6b, 0xa3, 0x24, 0x8a, 0x5f, 0xb0, 0x82, 0xd6, 0xd4,
+ 0xb8, 0xb8, 0x69, 0x49, 0x16, 0xc7, 0x74, 0x03, 0x7a, 0x73, 0x3d, 0x3f, 0x0b,
+ 0x50, 0xd8, 0xf5, 0x4f, 0x20, 0x5a,
+ ],
+ [
+ 0x31, 0xb0, 0xa6, 0x44, 0xf2, 0x87, 0x0d, 0x48, 0x1e, 0xfe, 0x0a, 0x57, 0x05,
+ 0xef, 0x90, 0x0a, 0xe7, 0xb8, 0xf1, 0x16, 0x0f, 0x9a, 0x3e, 0xb1, 0x06, 0xd8,
+ 0xba, 0xd8, 0xe2, 0x56, 0xe5, 0xd5, 0x27, 0x25, 0x61, 0x94, 0xe3, 0x98, 0x5b,
+ 0x01, 0xa4, 0x08, 0x0f, 0x63, 0xac, 0xaf, 0x4c, 0xc2,
+ ],
+ [
+ 0x27, 0xf0, 0x97, 0xa3, 0x38, 0xb4, 0x3f, 0x35, 0x61, 0xba, 0x16, 0x4d, 0x2d,
+ 0x56, 0x79, 0x23, 0x34, 0x31, 0x2b, 0x50, 0xbe, 0xf9, 0x90, 0xef, 0x99, 0x47,
+ 0xdb, 0x05, 0xce, 0xec, 0x07, 0xcc, 0x16, 0x5e, 0x91, 0x35, 0xa5, 0x97, 0x7a,
+ 0xa8, 0x8e, 0x6f, 0xc9, 0x59, 0xcb, 0x8e, 0x95, 0x03, 0xc2, 0x28, 0x20, 0x24,
+ 0x7d, 0x0b, 0xbf, 0x12, 0xb3, 0x50, 0xbb, 0xce, 0xca, 0x6d, 0xb9, 0xdc,
+ ]
+ ),
+ test_case!(
+ [
+ 0xa1, 0xd1, 0x9f, 0xf3, 0xac, 0x76, 0xfa, 0x14, 0xed, 0xe0, 0xda, 0x5c, 0x6e,
+ 0x21, 0xca, 0x42, 0xb5, 0xd7, 0x76, 0x0c, 0x4f, 0x95, 0x7e, 0x94, 0xed, 0x6c,
+ 0x3a, 0xf6, 0xdf, 0x8a, 0xe6, 0x79, 0xa1, 0xe1, 0xd7, 0x19, 0x5c, 0x79, 0x6c,
+ 0xdb, 0x9f, 0xb8, 0x45, 0x7d, 0xd9, 0xca, 0x4d, 0xc8, 0x46, 0x15, 0x7e, 0xb5,
+ 0x76, 0x9b, 0x18, 0xca, 0xba, 0xbb, 0x34, 0x23, 0x28, 0x4d, 0x9c, 0x4b, 0x5c,
+ 0x66, 0x8c, 0x0f, 0x1d, 0xab, 0xaa, 0x43, 0x47, 0x49, 0x26, 0x82, 0xb5, 0xb2,
+ 0x2b, 0x6a, 0xa5, 0xf7, 0x41, 0xce, 0x68, 0x79, 0x77, 0xe1, 0x08, 0x93, 0xbe,
+ ],
+ [
+ 0xa4, 0x05, 0x71, 0x6f, 0x05, 0xbf, 0xf0, 0xfa, 0x1a, 0x21, 0x6f, 0xbf, 0xf2,
+ 0x82, 0xbd, 0x33, 0x89, 0xed, 0xb7, 0xc3,
+ ],
+ [
+ 0x6c, 0x0b, 0x97, 0xdf, 0xb9, 0x30, 0xbc, 0x3d, 0x16, 0x69, 0x0b, 0x6f, 0xcc,
+ 0x50, 0xcf, 0xa3, 0x5d, 0x31, 0xea, 0x45, 0xd7, 0x2f, 0xb6, 0x93, 0xb3, 0xbe,
+ 0x54, 0xe6, 0x13, 0xc3, 0x0b, 0xf2,
+ ],
+ [
+ 0x52, 0x62, 0xa3, 0xbe, 0xe4, 0xe7, 0x2d, 0x69, 0x20, 0x4b, 0xda, 0x36, 0x5d,
+ 0x09, 0xa8, 0x09, 0xc2, 0x3f, 0x84, 0x77, 0x9f, 0xdd, 0x09, 0xfb, 0x08, 0x3a,
+ 0xbe, 0x9d, 0x5c, 0x71, 0xa2, 0xf2, 0xf0, 0xf3, 0xe3, 0x41, 0xa9, 0xec, 0x19,
+ 0x28, 0xaf, 0xa8, 0x58, 0x7f, 0xb5, 0x92, 0x2f, 0xdd,
+ ],
+ [
+ 0x6e, 0xdd, 0x39, 0x65, 0x40, 0x81, 0x2f, 0x01, 0x34, 0x14, 0x9b, 0xa9, 0xb0,
+ 0x70, 0xdf, 0xa5, 0x23, 0xbe, 0x43, 0xb4, 0xb9, 0x16, 0x10, 0x87, 0x75, 0x41,
+ 0x85, 0x9a, 0xfe, 0x9c, 0xc3, 0xc0, 0x5f, 0xf2, 0x8a, 0xf1, 0xc2, 0x1c, 0xba,
+ 0x40, 0x2c, 0x80, 0x78, 0x5b, 0x75, 0x41, 0x31, 0xfa, 0xa3, 0xc4, 0x06, 0x5b,
+ 0x55, 0x79, 0x2f, 0x65, 0x82, 0x29, 0x58, 0x75, 0xf5, 0x58, 0xc5, 0x86,
+ ]
+ ),
+ test_case!(
+ [
+ 0x9f, 0xd7, 0xcb, 0x9d, 0x11, 0x2c, 0xe5, 0x40, 0x9a, 0xfb, 0x0b, 0xf0, 0x97,
+ 0x8c, 0x46, 0xb0, 0xb3, 0x4a, 0x73, 0xb3, 0xa9, 0xac, 0xb0, 0xc8, 0x0e, 0x54,
+ 0x15, 0xa5, 0x2b, 0x0f, 0xae, 0xfd, 0x41, 0xf1, 0xd4, 0xae, 0xdd, 0xb5, 0x95,
+ 0x2a, 0x26, 0xb1, 0x66, 0x1b, 0x75, 0x3b, 0x87, 0x10, 0x39, 0xbe, 0xec, 0x04,
+ 0x30, 0xe1, 0x83, 0xe7, 0x4a, 0x2c, 0x0c, 0xb1, 0xee, 0x8d, 0x6b, 0xe3, 0x90,
+ 0x5c, 0x34, 0xa8, 0xe9, 0x21, 0xd0, 0xc7, 0x68, 0x5b, 0xc6, 0x55, 0xc0, 0x33,
+ 0x27, 0xc6, 0x83, 0xcb, 0x06, 0xb0, 0x6d, 0x39, 0x5a, 0x1c, 0x53, 0xd1, 0xc1,
+ 0x7b,
+ ],
+ [
+ 0xce, 0x45, 0x1f, 0xc7, 0xa4, 0xd9, 0x11, 0x41, 0x3f, 0x92, 0xd2, 0x86, 0x32,
+ 0x49, 0x39, 0xcc, 0xeb, 0xaa, 0x8d, 0x29,
+ ],
+ [
+ 0xd4, 0x41, 0x28, 0xd6, 0xe9, 0x8a, 0xa6, 0x8a, 0xa3, 0x4b, 0x56, 0x02, 0xb5,
+ 0x54, 0xf3, 0xc2, 0x63, 0xfd, 0x42, 0x2f, 0x2d, 0x2b, 0x72, 0x87, 0xf7, 0x34,
+ 0xb1, 0xb0, 0x10, 0x6b, 0xf3, 0xa5,
+ ],
+ [
+ 0x64, 0xaa, 0x62, 0x6d, 0x73, 0x02, 0x32, 0xec, 0x4d, 0x5c, 0x4f, 0x5a, 0x00,
+ 0x43, 0xd1, 0x36, 0x29, 0xd1, 0x2f, 0xb3, 0x86, 0x52, 0x85, 0x97, 0x23, 0x22,
+ 0x72, 0x51, 0xa0, 0xbd, 0x8c, 0x79, 0x04, 0xa4, 0x22, 0x61, 0x28, 0x67, 0x9a,
+ 0x64, 0x00, 0x89, 0x55, 0xc7, 0xc2, 0x3f, 0x25, 0xe1,
+ ],
+ [
+ 0xc1, 0xda, 0x78, 0xfe, 0xef, 0xc0, 0x3b, 0xc7, 0xaa, 0xab, 0x69, 0x63, 0x94,
+ 0x16, 0x0d, 0x05, 0xac, 0x17, 0xf2, 0xd8, 0x27, 0x4b, 0x1c, 0xa9, 0x1f, 0x3d,
+ 0xbd, 0x92, 0x81, 0xe5, 0x29, 0x51, 0x61, 0x05, 0x6d, 0x13, 0x45, 0x41, 0xc7,
+ 0x75, 0x29, 0xbe, 0x7b, 0x84, 0xd7, 0x3d, 0x76, 0xb1, 0x09, 0xec, 0xf7, 0x25,
+ 0x20, 0xa2, 0x2f, 0xef, 0xa6, 0x91, 0xe4, 0xe3, 0x6c, 0x7d, 0x20, 0x88,
+ ]
+ ),
+ test_case!(
+ [
+ 0x9b, 0x15, 0x79, 0xa0, 0x52, 0xd9, 0xa1, 0x06, 0x89, 0xa1, 0x63, 0x17, 0xa8,
+ 0x95, 0xb8, 0x48, 0x23, 0x23, 0xb1, 0x54, 0x3d, 0x83, 0x20, 0xa5, 0x2e, 0xa2,
+ 0xff, 0xde, 0x30, 0x7c, 0xda, 0x29, 0x12, 0x9d, 0x76, 0x35, 0x0c, 0x62, 0x08,
+ 0xc0, 0x5f, 0xb2, 0xb8, 0x4a, 0x32, 0x9a, 0xd2, 0x68, 0xff, 0x9b, 0xc4, 0xa4,
+ 0x22, 0xae, 0x06, 0xbf, 0x00, 0x78, 0x37, 0x92, 0xce, 0xde, 0x1a, 0xf2, 0xbd,
+ 0x52, 0xac, 0xe5, 0x06, 0xba, 0xe2, 0x8f, 0xff, 0x87, 0xe7, 0xda, 0x8c, 0x6c,
+ 0xcb, 0xb4, 0xad, 0xfa, 0x8d, 0x94, 0xce, 0xdb, 0x5a, 0xe0, 0xee, 0xbc, 0x5b,
+ 0x61, 0x4b,
+ ],
+ [
+ 0x1b, 0xf2, 0x3c, 0x86, 0x4e, 0x2d, 0x47, 0x18, 0xf8, 0xbf, 0x6e, 0x47, 0x1f,
+ 0x40, 0x64, 0xaf, 0xb8, 0xaa, 0xc6, 0xda,
+ ],
+ [
+ 0x11, 0x71, 0x41, 0x3a, 0x6b, 0x37, 0xf1, 0x21, 0x10, 0xe8, 0xa8, 0xe5, 0x9a,
+ 0x56, 0xce, 0xd8, 0xb2, 0xdc, 0xff, 0xd7, 0xe7, 0x3f, 0xe8, 0x42, 0x90, 0x45,
+ 0x26, 0x85, 0x0b, 0xd6, 0xe0, 0xb4,
+ ],
+ [
+ 0x45, 0xa4, 0x20, 0x6b, 0x1d, 0x0e, 0xc7, 0x42, 0x18, 0xf5, 0x01, 0xc4, 0xdb,
+ 0x04, 0x7f, 0x00, 0x04, 0xfc, 0xcb, 0x62, 0x5f, 0x7b, 0x9d, 0x47, 0x56, 0xef,
+ 0x52, 0x18, 0xab, 0xb1, 0x1a, 0x5e, 0x7f, 0xac, 0x62, 0xb4, 0xd5, 0x1c, 0x0c,
+ 0x6c, 0xbd, 0xcf, 0xf7, 0x27, 0x85, 0x1a, 0xd2, 0x6d,
+ ],
+ [
+ 0x6b, 0x70, 0x22, 0x94, 0x99, 0x8a, 0x37, 0x52, 0x81, 0xa3, 0x56, 0x64, 0x25,
+ 0x0c, 0xc8, 0xfd, 0x6f, 0x9e, 0x72, 0xa7, 0xd2, 0x3d, 0x46, 0xa0, 0xb7, 0xe8,
+ 0x6f, 0x5c, 0xef, 0x4f, 0xec, 0x75, 0x99, 0x1e, 0x5f, 0xc6, 0xd1, 0xd2, 0x38,
+ 0x45, 0x37, 0xfa, 0x3f, 0xef, 0x1f, 0xda, 0x8b, 0xce, 0x14, 0x32, 0x58, 0x63,
+ 0x3e, 0x3f, 0xfa, 0x22, 0x38, 0xbd, 0x52, 0xd8, 0x69, 0xa6, 0x15, 0x2e,
+ ]
+ ),
+ test_case!(
+ [
+ 0xf8, 0xb6, 0x35, 0x4e, 0x4f, 0x7a, 0xd2, 0x6f, 0xe5, 0x4f, 0x0c, 0x3a, 0xb0,
+ 0xe9, 0xe4, 0x70, 0x8f, 0x0a, 0x06, 0x32, 0x8b, 0xdb, 0xcb, 0xd8, 0x0a, 0x64,
+ 0x3a, 0x87, 0xbb, 0x41, 0x5f, 0xfe, 0x53, 0xd4, 0x48, 0xb2, 0xd6, 0xf0, 0x48,
+ 0x98, 0xf0, 0xc7, 0xb4, 0x92, 0x58, 0xbc, 0xbe, 0x88, 0xe2, 0x2f, 0xb8, 0x39,
+ 0x15, 0xce, 0x5e, 0xce, 0xb1, 0x7f, 0x39, 0xc5, 0x81, 0x27, 0x10, 0xc8, 0xbb,
+ 0x3a, 0x79, 0x02, 0xb1, 0xd2, 0xd5, 0x5a, 0x69, 0x48, 0xbf, 0xb3, 0xe8, 0x58,
+ 0xd3, 0x3b, 0xf4, 0xea, 0x26, 0xc6, 0xe4, 0x62, 0x64, 0xad, 0x5d, 0x6a, 0x36,
+ 0x51, 0x98, 0x53,
+ ],
+ [
+ 0x65, 0x08, 0xb9, 0x99, 0xe6, 0xda, 0xd1, 0xd9, 0xd6, 0xae, 0xa4, 0xe2, 0x04,
+ 0xfe, 0xc3, 0xa6, 0xdc, 0x1a, 0x6c, 0x66,
+ ],
+ [
+ 0x95, 0x79, 0x52, 0x84, 0xe7, 0xb8, 0xf2, 0x77, 0x1c, 0x80, 0x02, 0x4f, 0xe1,
+ 0xaa, 0xd8, 0x5b, 0x01, 0xe9, 0x04, 0x4b, 0xf2, 0xe0, 0x2f, 0x8d, 0x6e, 0xad,
+ 0x82, 0x42, 0x9d, 0xef, 0x7e, 0x42,
+ ],
+ [
+ 0xf5, 0x54, 0xd4, 0xe1, 0x1d, 0xca, 0xde, 0xd3, 0x31, 0xae, 0x1f, 0x88, 0x6e,
+ 0x57, 0xc1, 0x56, 0xfd, 0x4a, 0x47, 0x3d, 0xba, 0x2c, 0x05, 0x84, 0x65, 0x3c,
+ 0x7a, 0x31, 0x58, 0xf7, 0xa2, 0x07, 0x1f, 0x7b, 0xd2, 0x2b, 0x39, 0xd2, 0x30,
+ 0x8f, 0xf1, 0x1a, 0x1f, 0x6a, 0x99, 0xd1, 0x8e, 0x72,
+ ],
+ [
+ 0x2f, 0xdd, 0x3c, 0x16, 0xf8, 0x02, 0x92, 0xca, 0x04, 0xe6, 0xe1, 0x70, 0x20,
+ 0xd1, 0x23, 0x9c, 0xc7, 0xe6, 0x72, 0x41, 0xef, 0x88, 0xc4, 0x4a, 0x62, 0x55,
+ 0x0e, 0x44, 0xcf, 0x06, 0x21, 0xea, 0xc1, 0x42, 0x07, 0x4c, 0x31, 0x0f, 0x67,
+ 0x10, 0x44, 0x42, 0x96, 0xbb, 0x03, 0xbf, 0x2a, 0xe8, 0xd8, 0x72, 0x29, 0x8c,
+ 0x62, 0xed, 0xfa, 0xad, 0x97, 0x73, 0x93, 0x06, 0xb3, 0x4f, 0x8a, 0xe5,
+ ]
+ ),
+ test_case!(
+ [
+ 0x9e, 0x58, 0x76, 0x45, 0xb7, 0x0c, 0xad, 0xf0, 0x93, 0xf1, 0x11, 0x66, 0x58,
+ 0x49, 0xe4, 0x5c, 0x62, 0x8c, 0x79, 0x13, 0x10, 0x5b, 0xa4, 0xc2, 0x2e, 0x31,
+ 0x40, 0x94, 0x7e, 0x11, 0xde, 0x90, 0xa0, 0x5e, 0xe1, 0x68, 0x9b, 0x5d, 0xd9,
+ 0xe9, 0xb5, 0xc1, 0x15, 0x2a, 0xf2, 0xfd, 0x4c, 0xc6, 0x38, 0xaa, 0xad, 0x51,
+ 0x97, 0x1e, 0x85, 0x54, 0xaf, 0x13, 0xfe, 0x82, 0x2e, 0xa0, 0xf2, 0x21, 0x93,
+ 0x9f, 0xf2, 0xec, 0x17, 0x6e, 0xf3, 0x63, 0x5a, 0xc2, 0xef, 0xd1, 0x66, 0x50,
+ 0xcb, 0xfb, 0xea, 0x6e, 0x87, 0xce, 0x8d, 0x60, 0xaf, 0xf4, 0xe4, 0xc2, 0xd5,
+ 0x09, 0x9e, 0x0e, 0xc0,
+ ],
+ [
+ 0xf0, 0x6b, 0x4a, 0xe2, 0x29, 0xc7, 0x09, 0x9a, 0x4c, 0x5a, 0x41, 0xad, 0x7c,
+ 0x22, 0x9a, 0xa9, 0x77, 0xfc, 0x29, 0xd6,
+ ],
+ [
+ 0x63, 0x2b, 0xfd, 0x02, 0xd7, 0xb9, 0x57, 0xa5, 0x89, 0x6d, 0x78, 0xdd, 0x49,
+ 0x1e, 0x57, 0x7b, 0xaa, 0xb9, 0x35, 0xe1, 0x0b, 0x81, 0xcd, 0xa4, 0xbd, 0xdc,
+ 0x13, 0x55, 0x4a, 0x3d, 0xac, 0x1a,
+ ],
+ [
+ 0x62, 0x9d, 0x15, 0xb3, 0x88, 0xbd, 0x51, 0x39, 0x85, 0x6b, 0xbb, 0xa4, 0x05,
+ 0x9d, 0xc7, 0xc7, 0xcc, 0xa4, 0x91, 0x5e, 0x7e, 0x04, 0x85, 0xb2, 0xce, 0x07,
+ 0xf9, 0x97, 0x91, 0x72, 0xf5, 0x42, 0x36, 0x73, 0x19, 0xb8, 0x88, 0x00, 0x66,
+ 0xf2, 0x6b, 0x46, 0x9e, 0xfb, 0xfd, 0xd7, 0xbd, 0x3a,
+ ],
+ [
+ 0x78, 0x48, 0xf2, 0xe6, 0x49, 0xf6, 0x24, 0x81, 0xae, 0x54, 0xdc, 0x17, 0x67,
+ 0xc7, 0x7e, 0x9a, 0x73, 0x8b, 0x3e, 0x53, 0xc5, 0xb4, 0x2e, 0x3c, 0x0e, 0x54,
+ 0x91, 0x07, 0x72, 0xa6, 0x6b, 0x16, 0xb1, 0xfc, 0x83, 0x5a, 0x2c, 0x73, 0x38,
+ 0x8c, 0xed, 0x25, 0x4c, 0xc8, 0x0b, 0x37, 0x20, 0x82, 0xe8, 0x36, 0xf2, 0x90,
+ 0xbb, 0x52, 0x76, 0x2a, 0xa9, 0x68, 0x6d, 0xd9, 0x9d, 0xbf, 0x74, 0x72,
+ ]
+ ),
+ test_case!(
+ [
+ 0xe9, 0xa2, 0x61, 0x9a, 0x31, 0x58, 0xd8, 0xac, 0x3c, 0xa3, 0x92, 0x90, 0xba,
+ 0xa1, 0x97, 0x7b, 0x2e, 0xef, 0xe6, 0xda, 0x10, 0x4e, 0xd7, 0x72, 0xc8, 0xca,
+ 0x24, 0x5d, 0xaf, 0x6d, 0xa1, 0x41, 0x86, 0x17, 0x8b, 0x13, 0x1c, 0x01, 0x2b,
+ 0xa0, 0xa5, 0x08, 0x53, 0xfa, 0x31, 0xef, 0x27, 0x3b, 0x7e, 0x10, 0xaa, 0x80,
+ 0x3f, 0xad, 0x4c, 0xb6, 0x64, 0x0b, 0x71, 0x95, 0x4c, 0xa6, 0xa9, 0x75, 0xe9,
+ 0xe6, 0x95, 0x83, 0x5d, 0x57, 0x8c, 0x3d, 0xd4, 0x4a, 0x6f, 0x2d, 0xac, 0xe2,
+ 0xc9, 0xf3, 0x2a, 0xea, 0xee, 0x0b, 0x44, 0x90, 0x8c, 0x16, 0xd6, 0x01, 0x34,
+ 0x3a, 0x8e, 0x5d, 0x94, 0xbc,
+ ],
+ [
+ 0x48, 0x2f, 0xf5, 0x98, 0x72, 0xf5, 0xe9, 0x3f, 0x89, 0xe5, 0xea, 0x83, 0x6c,
+ 0xe7, 0x7e, 0x06, 0xae, 0x81, 0x52, 0xb3,
+ ],
+ [
+ 0x16, 0x62, 0x2e, 0xa3, 0xa3, 0xd0, 0x5c, 0xb2, 0xb4, 0x5d, 0x7c, 0xf2, 0x81,
+ 0xed, 0x7f, 0x5e, 0xc3, 0x0d, 0xee, 0x92, 0x9f, 0x0a, 0x50, 0x61, 0x5d, 0x36,
+ 0x69, 0x79, 0xd8, 0x0f, 0xc9, 0x0a,
+ ],
+ [
+ 0x0c, 0x1e, 0xa5, 0xfd, 0x87, 0xfb, 0xa0, 0x87, 0xdb, 0x75, 0x40, 0xe2, 0x80,
+ 0x97, 0x1b, 0x94, 0x32, 0x29, 0xc6, 0xb9, 0x68, 0x00, 0x7a, 0x87, 0xdf, 0xa1,
+ 0x3a, 0x00, 0xa2, 0xfc, 0x36, 0x96, 0xbd, 0x16, 0xc2, 0x4f, 0x13, 0xc7, 0xef,
+ 0x7b, 0x36, 0xbf, 0xdb, 0x33, 0xa9, 0xb2, 0x6b, 0xb2,
+ ],
+ [
+ 0xf1, 0xb3, 0x75, 0x86, 0x68, 0xbd, 0x5a, 0x2f, 0x5b, 0x05, 0x3c, 0x80, 0x01,
+ 0x72, 0xf9, 0x80, 0xa8, 0xc3, 0xba, 0x64, 0x5a, 0xcd, 0x0c, 0xca, 0x49, 0x2f,
+ 0x4b, 0xf1, 0x5a, 0x67, 0xcf, 0xd5, 0xae, 0xbf, 0x57, 0xad, 0x66, 0x25, 0xc6,
+ 0x31, 0x47, 0xc2, 0x81, 0x02, 0x45, 0x9b, 0x13, 0x94, 0x87, 0x8c, 0x05, 0x87,
+ 0x8a, 0x41, 0x31, 0x6e, 0x67, 0x0d, 0xac, 0x68, 0x9a, 0xbe, 0xdd, 0xdc,
+ ]
+ ),
+ test_case!(
+ [
+ 0x25, 0xff, 0x04, 0x82, 0x1f, 0xae, 0xd8, 0x58, 0x6e, 0x29, 0xe6, 0xf7, 0x46,
+ 0xa0, 0xad, 0x30, 0xda, 0x97, 0x12, 0xce, 0x64, 0x39, 0xb4, 0xe5, 0xbc, 0xa5,
+ 0xa8, 0xeb, 0xc5, 0xca, 0x2e, 0x11, 0xbf, 0x46, 0x03, 0x87, 0x10, 0x95, 0x3c,
+ 0x55, 0x1a, 0x04, 0xfc, 0xe7, 0xac, 0xfd, 0xc3, 0x30, 0x3f, 0x24, 0x3b, 0x0c,
+ 0xc4, 0x3f, 0x83, 0x6b, 0x08, 0x77, 0x39, 0x6e, 0x0c, 0x05, 0x10, 0xcf, 0x8f,
+ 0xa0, 0x32, 0xa0, 0xed, 0x88, 0x42, 0x4c, 0x65, 0xbb, 0x39, 0xcd, 0x2f, 0x13,
+ 0x88, 0x6b, 0xbc, 0x46, 0x77, 0xdd, 0x98, 0xb7, 0x68, 0x9c, 0xec, 0x5b, 0x68,
+ 0x21, 0x09, 0x9a, 0xb5, 0xd9, 0x1e,
+ ],
+ [
+ 0x90, 0x34, 0xa3, 0x1a, 0xc4, 0xe8, 0xd9, 0xe3, 0x3f, 0x63, 0xe1, 0xd2, 0xe1,
+ 0xbb, 0xf7, 0xf1, 0x06, 0xeb, 0xcd, 0xca,
+ ],
+ [
+ 0xeb, 0x61, 0x9c, 0xc9, 0xf8, 0x0a, 0xfb, 0x28, 0x41, 0x6f, 0xed, 0xbc, 0x8c,
+ 0xaa, 0x9c, 0x03, 0x46, 0xed, 0x7a, 0x3a, 0x83, 0xb6, 0x71, 0xc9, 0xa3, 0x99,
+ 0x0f, 0x69, 0xf7, 0x7f, 0x4c, 0x80,
+ ],
+ [
+ 0x35, 0xd5, 0x9a, 0xcf, 0xd9, 0x6a, 0x71, 0x81, 0x7a, 0xeb, 0x61, 0xec, 0xe3,
+ 0x37, 0xd8, 0x03, 0xeb, 0x0c, 0xda, 0x66, 0xa6, 0x05, 0x80, 0x61, 0x4f, 0x53,
+ 0x20, 0xd2, 0xdd, 0xfc, 0xfa, 0x6a, 0x6e, 0x34, 0xbb, 0x98, 0x91, 0x07, 0x4e,
+ 0xe2, 0x88, 0xd4, 0xbd, 0x9b, 0x2d, 0xf3, 0x3d, 0x62,
+ ],
+ [
+ 0xac, 0x73, 0xae, 0xec, 0x3d, 0x6e, 0x61, 0xf4, 0x71, 0x21, 0x90, 0xa5, 0x92,
+ 0x98, 0x92, 0x75, 0xc0, 0xb7, 0xc2, 0x72, 0xd0, 0x45, 0xcc, 0x7d, 0x1f, 0xf8,
+ 0x28, 0x73, 0xa4, 0xf2, 0xd2, 0x83, 0xa0, 0xa2, 0x3d, 0xd4, 0xfd, 0x1a, 0x90,
+ 0x8f, 0x24, 0x09, 0x45, 0x65, 0x60, 0xeb, 0x2d, 0x5b, 0x1d, 0xbc, 0x5f, 0x26,
+ 0x5d, 0x33, 0x5c, 0xf3, 0xce, 0xa6, 0x3d, 0x98, 0x9f, 0xc6, 0x1c, 0xae,
+ ]
+ ),
+ test_case!(
+ [
+ 0x65, 0x00, 0xdc, 0x9a, 0x79, 0x8c, 0x78, 0xb5, 0x6d, 0x46, 0xd5, 0x64, 0xfc,
+ 0x95, 0xe4, 0x36, 0x17, 0x24, 0xfe, 0x20, 0x74, 0xaf, 0x8e, 0xe0, 0xd9, 0xfa,
+ 0x38, 0x37, 0x8d, 0xc3, 0x62, 0x3e, 0x61, 0xc1, 0x05, 0x52, 0x12, 0x21, 0x38,
+ 0x03, 0x96, 0x9e, 0x38, 0x6f, 0xbb, 0xad, 0x33, 0xe2, 0xea, 0x73, 0x42, 0x0b,
+ 0x33, 0x8a, 0x73, 0x12, 0x0f, 0x43, 0x0a, 0xbf, 0x6d, 0x62, 0xf2, 0xf2, 0xaa,
+ 0x67, 0x04, 0xaf, 0xa7, 0xa8, 0x23, 0x79, 0xce, 0x60, 0xad, 0x49, 0x59, 0xbe,
+ 0x81, 0x26, 0xe7, 0x49, 0x0c, 0xd3, 0x7a, 0xbe, 0xa9, 0x92, 0x35, 0xb6, 0xe5,
+ 0x74, 0x2f, 0x83, 0x2a, 0x45, 0x88, 0xcc,
+ ],
+ [
+ 0x42, 0xde, 0x59, 0x89, 0xb6, 0xe9, 0x5d, 0xb2, 0x3d, 0x99, 0xa9, 0xfd, 0xcf,
+ 0x54, 0x94, 0x6c, 0x37, 0x8d, 0xdf, 0x42,
+ ],
+ [
+ 0x8c, 0x05, 0x33, 0xe5, 0xa2, 0x08, 0x36, 0xf2, 0xdc, 0x71, 0x48, 0x6a, 0x6d,
+ 0x4c, 0x46, 0xa4, 0xe3, 0xc6, 0xda, 0xb7, 0xb2, 0x0c, 0x08, 0x92, 0x27, 0xcf,
+ 0xb1, 0x56, 0xba, 0xfe, 0x3f, 0x4f,
+ ],
+ [
+ 0x92, 0x82, 0x45, 0x5f, 0x18, 0x5d, 0xc0, 0x90, 0x9a, 0xdd, 0x19, 0x46, 0x51,
+ 0xe6, 0x74, 0xbb, 0x00, 0x1e, 0xfb, 0x1e, 0x89, 0x98, 0xf6, 0x33, 0x62, 0xf6,
+ 0xed, 0xee, 0xa4, 0xf5, 0x37, 0xe0, 0x77, 0x5f, 0x46, 0xfd, 0x79, 0x80, 0x97,
+ 0xfc, 0xf3, 0xd2, 0xdb, 0x49, 0x7e, 0xd5, 0x49, 0x09,
+ ],
+ [
+ 0x48, 0x5b, 0xeb, 0xfc, 0x0b, 0xe8, 0x12, 0xc2, 0x8c, 0x1d, 0xbe, 0xf9, 0xa8,
+ 0xa0, 0x89, 0x57, 0xc6, 0x9d, 0xa3, 0x3d, 0x3b, 0x0c, 0x77, 0x2b, 0x93, 0xde,
+ 0xf9, 0xbc, 0x5e, 0xe1, 0x5e, 0xa9, 0xba, 0x7b, 0x3c, 0x19, 0xd0, 0xcf, 0x87,
+ 0x49, 0xff, 0xd7, 0xfa, 0x24, 0x5b, 0x98, 0xca, 0xca, 0x91, 0xff, 0xbd, 0x5c,
+ 0x3d, 0x4f, 0xb9, 0x36, 0x56, 0xda, 0x93, 0xfc, 0x68, 0xd7, 0x6f, 0x21,
+ ]
+ ),
+ test_case!(
+ [
+ 0x4e, 0x91, 0x0e, 0x74, 0x00, 0xe8, 0xe7, 0xa0, 0x94, 0xb1, 0x85, 0x15, 0xef,
+ 0x7f, 0xf4, 0xf4, 0x64, 0xc9, 0xac, 0x6b, 0xca, 0xfe, 0x61, 0xa4, 0xc5, 0x54,
+ 0x41, 0x70, 0xe1, 0x98, 0x85, 0xe5, 0x00, 0x19, 0xd0, 0x60, 0xfe, 0x3e, 0x6b,
+ 0x78, 0x0e, 0xeb, 0x50, 0x15, 0x44, 0x8b, 0x05, 0xa2, 0x85, 0x3c, 0x44, 0x81,
+ 0x04, 0x86, 0x40, 0xd6, 0x1b, 0xf2, 0xc8, 0x2e, 0xbf, 0x5a, 0x1f, 0x7f, 0x40,
+ 0xe8, 0x67, 0x2d, 0x00, 0x75, 0x24, 0x3c, 0x06, 0x8b, 0x79, 0x01, 0xe3, 0x78,
+ 0x9c, 0x9c, 0x20, 0x98, 0x2b, 0x8f, 0x38, 0x14, 0x44, 0x3f, 0xd4, 0xbb, 0x23,
+ 0x15, 0x25, 0x6d, 0x17, 0xcd, 0x22, 0xe5, 0xd2,
+ ],
+ [
+ 0xf4, 0x0e, 0x28, 0x97, 0x5e, 0xda, 0xcd, 0xa1, 0x9c, 0x42, 0xa6, 0xcb, 0x5b,
+ 0x25, 0x41, 0xa5, 0xf8, 0xd1, 0xb4, 0xd7,
+ ],
+ [
+ 0x13, 0xa6, 0xf2, 0x8e, 0x6c, 0x2e, 0x7c, 0xfd, 0x30, 0xf1, 0xb6, 0x90, 0xff,
+ 0x1f, 0x78, 0x9a, 0xe3, 0x8a, 0xd1, 0x8e, 0xd5, 0xae, 0x0a, 0x59, 0xc3, 0xa6,
+ 0x1b, 0xd2, 0x4b, 0xbb, 0x3d, 0xc8,
+ ],
+ [
+ 0x92, 0x8b, 0x01, 0xd8, 0xaa, 0x92, 0x19, 0x84, 0xa8, 0x85, 0xf8, 0x1a, 0x58,
+ 0xc5, 0xcd, 0x56, 0xda, 0xf0, 0x43, 0x04, 0xa1, 0xb1, 0xd3, 0x56, 0xa6, 0x16,
+ 0x12, 0x5c, 0x1a, 0x9a, 0xf4, 0x7f, 0xde, 0x3d, 0x9f, 0xc2, 0xc6, 0x53, 0x66,
+ 0x7e, 0xcd, 0x22, 0x8b, 0xc5, 0x01, 0xfb, 0xef, 0xae,
+ ],
+ [
+ 0xcd, 0x4f, 0xf9, 0x55, 0xd8, 0x4f, 0xfa, 0xe0, 0x76, 0x64, 0x21, 0xcb, 0x06,
+ 0x08, 0xce, 0x62, 0xf2, 0x77, 0xbe, 0xc2, 0x8b, 0xb9, 0x13, 0x22, 0xde, 0x93,
+ 0x1d, 0xf2, 0x22, 0x5a, 0x73, 0x3f, 0xf6, 0xf4, 0x7e, 0x95, 0xf2, 0xae, 0xd4,
+ 0x65, 0x6c, 0x28, 0x3e, 0xb3, 0x89, 0x0a, 0x4e, 0xcd, 0xe0, 0x8e, 0x85, 0xe3,
+ 0x38, 0xdf, 0x67, 0x07, 0xa8, 0x99, 0x70, 0x2f, 0xba, 0x0b, 0x26, 0x80,
+ ]
+ ),
+ test_case!(
+ [
+ 0x4c, 0x31, 0x0f, 0x63, 0x3d, 0xe8, 0xea, 0x29, 0x18, 0x82, 0xb7, 0x25, 0x8c,
+ 0xfa, 0x20, 0xa9, 0x9a, 0xda, 0x85, 0x4c, 0x09, 0x34, 0x0f, 0x64, 0xe7, 0x14,
+ 0x46, 0x37, 0x24, 0x6a, 0xa7, 0xb4, 0xa8, 0x45, 0x98, 0xb4, 0xf4, 0x16, 0x5c,
+ 0x2f, 0xd4, 0x1e, 0x44, 0xc3, 0xbd, 0x7d, 0xb1, 0xea, 0x23, 0x45, 0x1a, 0xaa,
+ 0x44, 0xfb, 0x51, 0xc0, 0x43, 0x94, 0xbe, 0x41, 0x10, 0x4b, 0x9e, 0x05, 0x8c,
+ 0x36, 0xe0, 0xa1, 0x3e, 0xef, 0x3d, 0x12, 0x65, 0x57, 0x80, 0x44, 0x32, 0x4b,
+ 0xbb, 0x55, 0xef, 0x09, 0x93, 0x11, 0xc9, 0x89, 0x9b, 0xcf, 0x2b, 0xad, 0x50,
+ 0xc9, 0x01, 0xb3, 0x72, 0x94, 0xc1, 0x63, 0x77, 0x6a,
+ ],
+ [
+ 0x47, 0x94, 0xaf, 0x2e, 0x2d, 0xe3, 0xbd, 0x70, 0x5d, 0x83, 0x2a, 0x41, 0xeb,
+ 0x89, 0xe8, 0x70, 0xe7, 0x04, 0x9f, 0xa0,
+ ],
+ [
+ 0x2f, 0xc0, 0xab, 0xea, 0x3c, 0xd2, 0xd6, 0x98, 0xa1, 0xb3, 0x90, 0xce, 0xab,
+ 0xcb, 0x0e, 0xa3, 0xd5, 0xd8, 0x6f, 0x9c, 0x1d, 0x50, 0x6c, 0xdb, 0xfd, 0x1c,
+ 0x0c, 0xc7, 0xab, 0x32, 0xab, 0x2a,
+ ],
+ [
+ 0x40, 0x27, 0x64, 0xe5, 0x34, 0xd5, 0x7e, 0xd4, 0xe3, 0xba, 0x87, 0x26, 0x48,
+ 0xef, 0x87, 0xde, 0xd9, 0xe4, 0xa7, 0x16, 0xcb, 0x1e, 0x2d, 0x76, 0x46, 0xcb,
+ 0xc6, 0xb1, 0xab, 0x7d, 0xd6, 0xd2, 0x48, 0x62, 0x3d, 0x4b, 0xf4, 0x8d, 0xee,
+ 0xbd, 0xdb, 0xe3, 0xa3, 0x0f, 0xc5, 0x48, 0x01, 0xea,
+ ],
+ [
+ 0xf7, 0xb7, 0x76, 0xdd, 0x38, 0xb8, 0x62, 0x76, 0x7b, 0xca, 0x79, 0x71, 0x68,
+ 0x73, 0x0f, 0xf6, 0x47, 0x36, 0xce, 0x1c, 0x74, 0x95, 0xb5, 0x02, 0x10, 0x3b,
+ 0x85, 0x44, 0x75, 0x5e, 0x85, 0xb1, 0x19, 0xa6, 0x57, 0x47, 0x41, 0xb0, 0x27,
+ 0x24, 0x25, 0xd9, 0xc7, 0x3d, 0xa9, 0x22, 0xe4, 0x9d, 0xe2, 0x41, 0xfc, 0xe4,
+ 0x56, 0x2f, 0x69, 0x9d, 0x15, 0x5b, 0xa8, 0x93, 0xc0, 0x37, 0x36, 0x05,
+ ]
+ ),
+ test_case!(
+ [
+ 0x7a, 0x57, 0xb6, 0x71, 0xf8, 0x69, 0x57, 0xf7, 0xd3, 0x80, 0xf5, 0x54, 0xd0,
+ 0xdd, 0x97, 0xad, 0xd6, 0x58, 0x5d, 0xa2, 0x0e, 0x9c, 0xc5, 0xee, 0x07, 0xc4,
+ 0x79, 0x1d, 0x92, 0xcc, 0xb2, 0xa5, 0x10, 0x37, 0x4c, 0xce, 0x44, 0xd7, 0xbf,
+ 0xbf, 0x1d, 0x26, 0x66, 0xca, 0x6c, 0x44, 0x95, 0x98, 0x09, 0x4c, 0xd6, 0x41,
+ 0x14, 0xd6, 0xfa, 0x45, 0xb8, 0x39, 0x95, 0x9e, 0x83, 0xc5, 0xc3, 0x90, 0x4a,
+ 0xb3, 0x2c, 0x24, 0xfb, 0xe3, 0x40, 0xa7, 0xfa, 0xeb, 0x2d, 0xc6, 0xc0, 0xad,
+ 0x74, 0x8e, 0x48, 0x59, 0xa7, 0x64, 0x73, 0xf7, 0x2b, 0xd2, 0xb4, 0xa9, 0x83,
+ 0x9a, 0x69, 0x0a, 0xc9, 0x01, 0xab, 0x9b, 0x85, 0xf0, 0xa4,
+ ],
+ [
+ 0x6f, 0x4b, 0x03, 0x8b, 0xd7, 0x18, 0x83, 0x41, 0xa5, 0x00, 0xc6, 0x6b, 0x83,
+ 0xcb, 0xdb, 0x32, 0x76, 0x70, 0xf3, 0xf1,
+ ],
+ [
+ 0xf1, 0x4c, 0x09, 0xf7, 0xdf, 0x3e, 0x1d, 0x51, 0xdb, 0x5b, 0x25, 0xc9, 0xcc,
+ 0xbf, 0xff, 0xb8, 0xb5, 0x38, 0xb1, 0x1b, 0x4b, 0x1f, 0x01, 0xbf, 0x32, 0xe1,
+ 0x54, 0x2a, 0x6e, 0xdc, 0xb0, 0x8b,
+ ],
+ [
+ 0x61, 0xda, 0xcd, 0xbd, 0x28, 0x18, 0xc5, 0x48, 0x6d, 0xbc, 0xb1, 0xc7, 0xde,
+ 0x54, 0x45, 0x92, 0x81, 0xea, 0x3d, 0x49, 0xaa, 0x06, 0xda, 0xa1, 0x9a, 0x49,
+ 0xdc, 0xd9, 0xe7, 0x58, 0x89, 0xe2, 0xf9, 0xec, 0xb9, 0xe9, 0xc0, 0x6b, 0x48,
+ 0xd0, 0x03, 0x33, 0x93, 0x4d, 0x1c, 0xe9, 0xf6, 0x3a,
+ ],
+ [
+ 0x34, 0x81, 0xd0, 0xba, 0x19, 0xc4, 0xdf, 0xa6, 0x4d, 0x78, 0x64, 0xf3, 0x64,
+ 0xc6, 0xfd, 0x4a, 0x03, 0xc1, 0x01, 0xb9, 0x58, 0xf7, 0x7b, 0xb9, 0x3d, 0x05,
+ 0x3d, 0xf9, 0xf6, 0xba, 0xb0, 0x39, 0x48, 0x55, 0x48, 0x6b, 0x54, 0x02, 0x1a,
+ 0xbc, 0xe9, 0xec, 0xf5, 0xea, 0x2d, 0x99, 0x6a, 0x98, 0x79, 0x33, 0xf5, 0x31,
+ 0x3d, 0xef, 0x59, 0x54, 0x0a, 0x95, 0xb6, 0x71, 0x71, 0x3f, 0x29, 0x27,
+ ]
+ ),
+ test_case!(
+ [
+ 0x41, 0xf5, 0x30, 0xf0, 0x2e, 0x95, 0x87, 0x70, 0x03, 0x97, 0xd1, 0xe2, 0x04,
+ 0xa4, 0x00, 0x08, 0x17, 0xeb, 0x68, 0x3e, 0xd0, 0x64, 0xca, 0x79, 0x9d, 0x0b,
+ 0x67, 0xbc, 0xb0, 0x79, 0xcd, 0xca, 0x78, 0x50, 0x30, 0x46, 0xb7, 0x02, 0xaf,
+ 0x3f, 0x3c, 0x9f, 0xe2, 0xde, 0xcb, 0x9b, 0xd7, 0x96, 0xc1, 0xfd, 0xf4, 0xca,
+ 0x9a, 0x2a, 0x85, 0x28, 0xf0, 0x8f, 0xe1, 0x59, 0xab, 0xdc, 0xa8, 0x6b, 0xb5,
+ 0x3d, 0x02, 0x8a, 0xd9, 0xa3, 0x91, 0x1b, 0xd0, 0xaa, 0x48, 0x5e, 0xb3, 0x04,
+ 0xb4, 0x2c, 0x36, 0xac, 0x0d, 0x2c, 0x5c, 0x12, 0x20, 0xf5, 0x4c, 0x3c, 0x91,
+ 0x87, 0x84, 0xad, 0x95, 0x65, 0x64, 0x7d, 0xb3, 0xba, 0x82, 0x88,
+ ],
+ [
+ 0x34, 0xbb, 0x67, 0x6a, 0x86, 0x7d, 0xa8, 0x56, 0x11, 0x84, 0xf3, 0x04, 0x5e,
+ 0xf8, 0x1d, 0x33, 0x83, 0x54, 0xa4, 0xcd,
+ ],
+ [
+ 0xaf, 0x69, 0xe7, 0x98, 0xd4, 0x88, 0x89, 0x44, 0x9c, 0x6a, 0xc7, 0xc9, 0xfc,
+ 0x1b, 0xcd, 0x47, 0x52, 0x39, 0x82, 0xd2, 0xa2, 0xe2, 0x9b, 0x98, 0x40, 0x88,
+ 0x7b, 0xd1, 0x26, 0x1a, 0x5a, 0xdb,
+ ],
+ [
+ 0xe8, 0x02, 0xb8, 0x18, 0x37, 0x7c, 0x75, 0xbb, 0xb6, 0xb2, 0x56, 0x12, 0x28,
+ 0x39, 0xa5, 0x00, 0xc9, 0xdc, 0x0a, 0x62, 0x3c, 0xed, 0xac, 0x97, 0x04, 0x50,
+ 0x9c, 0x34, 0xfe, 0x4e, 0x40, 0x52, 0xcc, 0x7c, 0x65, 0x38, 0x3e, 0x01, 0x0b,
+ 0x2e, 0x48, 0xb5, 0x35, 0xc6, 0x54, 0x65, 0x43, 0xe7,
+ ],
+ [
+ 0x6f, 0x52, 0xd8, 0x18, 0xd1, 0xf4, 0x88, 0x3d, 0xaf, 0x8c, 0xc4, 0xcd, 0x4e,
+ 0xe4, 0xb3, 0x29, 0x0d, 0x27, 0x06, 0x45, 0xdc, 0xbb, 0x2c, 0x5d, 0x3b, 0xd7,
+ 0xdb, 0xc9, 0xd9, 0xb4, 0x5a, 0xbe, 0x43, 0x05, 0xc6, 0x60, 0xaa, 0x69, 0x45,
+ 0x59, 0xf2, 0x39, 0xeb, 0x68, 0x05, 0x51, 0xba, 0x5e, 0x57, 0xd7, 0x95, 0x5e,
+ 0xec, 0x12, 0x75, 0x0e, 0x70, 0xe9, 0x03, 0xe9, 0x0b, 0xb7, 0x4c, 0x71,
+ ]
+ ),
+ test_case!(
+ [
+ 0x63, 0xd8, 0x56, 0x2a, 0x0b, 0x46, 0x3f, 0xda, 0x47, 0x27, 0xa0, 0x91, 0xed,
+ 0x90, 0x02, 0x64, 0xd6, 0x8f, 0x0a, 0x37, 0x98, 0xa8, 0x7d, 0x24, 0xba, 0x53,
+ 0x8f, 0xdb, 0x7c, 0xb0, 0x9a, 0x37, 0x45, 0xe5, 0x87, 0xac, 0x67, 0xc9, 0x44,
+ 0xd7, 0x47, 0xb0, 0x0c, 0x67, 0x86, 0xe5, 0x3b, 0x61, 0x04, 0x2f, 0x24, 0x89,
+ 0x3b, 0xf8, 0xb6, 0x3c, 0x3b, 0xde, 0xcd, 0xec, 0x95, 0x6d, 0x6c, 0xbd, 0x24,
+ 0x39, 0x24, 0xbc, 0x0f, 0x28, 0xdb, 0x1c, 0x0a, 0x4b, 0x40, 0x08, 0x55, 0x1c,
+ 0xd0, 0x84, 0xcc, 0x4a, 0xaa, 0x1f, 0xaa, 0x73, 0x4a, 0xc9, 0x0b, 0x57, 0x2b,
+ 0x6a, 0xc7, 0x22, 0xd2, 0xf3, 0x87, 0x4a, 0xfe, 0xe4, 0x0b, 0x15, 0xdb,
+ ],
+ [
+ 0x9d, 0x37, 0xab, 0x6a, 0x60, 0xcd, 0xa6, 0x80, 0x14, 0x29, 0x09, 0x23, 0xf9,
+ 0x78, 0xe5, 0xf3, 0x01, 0x22, 0xab, 0x0b,
+ ],
+ [
+ 0x3b, 0xd1, 0xa9, 0xb1, 0xf3, 0x83, 0x1f, 0x5d, 0xfe, 0x45, 0x09, 0x17, 0xce,
+ 0x3f, 0x90, 0x9a, 0xaa, 0xa2, 0xa7, 0xc0, 0xd7, 0x7b, 0x2c, 0x29, 0x65, 0xe1,
+ 0xa5, 0x15, 0xfc, 0xf5, 0x2f, 0x4c,
+ ],
+ [
+ 0xcc, 0x84, 0x9d, 0x11, 0xbe, 0xc3, 0x6a, 0xf1, 0xfb, 0xb8, 0x3b, 0x85, 0x7c,
+ 0x5b, 0xcc, 0xf1, 0xa6, 0x77, 0xf5, 0x96, 0xc0, 0xcc, 0xf8, 0x4e, 0x3e, 0xaa,
+ 0x17, 0x0b, 0xfb, 0x0b, 0xa2, 0xb1, 0xdc, 0xe6, 0xd5, 0xd1, 0x2b, 0x09, 0x3c,
+ 0x75, 0x80, 0x60, 0x31, 0x8b, 0x51, 0x70, 0x0e, 0xe1,
+ ],
+ [
+ 0x25, 0x74, 0xa7, 0x93, 0x86, 0x18, 0x74, 0x86, 0xec, 0x04, 0x75, 0xfb, 0xe3,
+ 0xbe, 0x36, 0xb2, 0x33, 0xd5, 0x51, 0x31, 0x38, 0x3b, 0x5e, 0xef, 0xb0, 0x23,
+ 0x50, 0x91, 0xbe, 0xd1, 0x5b, 0x17, 0xc8, 0xf5, 0xe6, 0xcd, 0xce, 0x2c, 0x6e,
+ 0x7b, 0x2c, 0xb7, 0x09, 0x48, 0xd1, 0x70, 0xfd, 0xd1, 0xe0, 0x6d, 0x5e, 0xa9,
+ 0xba, 0x31, 0x61, 0xbe, 0xc3, 0x79, 0x08, 0x37, 0x44, 0x49, 0x0b, 0xf5,
+ ]
+ ),
+ test_case!(
+ [
+ 0x0e, 0x5f, 0xac, 0x86, 0x14, 0xb6, 0xf5, 0x04, 0xde, 0x28, 0x18, 0x4f, 0x57,
+ 0xfc, 0x6e, 0xfa, 0x8d, 0x00, 0x2d, 0xb3, 0x30, 0x24, 0xc4, 0xdc, 0xb2, 0xc7,
+ 0x24, 0xa4, 0x4e, 0x08, 0x6e, 0xf5, 0xce, 0x88, 0x10, 0xef, 0xc2, 0x46, 0xbe,
+ 0x3b, 0x72, 0x31, 0xa2, 0x1b, 0xa8, 0x1e, 0xe3, 0x27, 0x9f, 0xe8, 0x34, 0x10,
+ 0xa6, 0xd8, 0x4a, 0xb8, 0x70, 0xfd, 0x65, 0x29, 0x60, 0xeb, 0x15, 0x53, 0xe2,
+ 0x24, 0xf5, 0x7e, 0xbc, 0xd7, 0x3d, 0x28, 0x9b, 0x81, 0x36, 0xe4, 0x83, 0x41,
+ 0x9f, 0x44, 0x3c, 0x7a, 0xe2, 0x62, 0x8f, 0xee, 0xf1, 0xa0, 0x5c, 0x13, 0x4d,
+ 0x43, 0x8b, 0x40, 0xd8, 0x9c, 0xf1, 0x1c, 0x74, 0x90, 0x25, 0x90, 0x68, 0xe3,
+ ],
+ [
+ 0x17, 0x36, 0x80, 0x59, 0xfe, 0x8b, 0xbb, 0x09, 0xff, 0x8d, 0x41, 0x3e, 0xee,
+ 0x65, 0xb2, 0x39, 0x6e, 0x84, 0x0a, 0x41,
+ ],
+ [
+ 0x2f, 0x7c, 0x45, 0x90, 0xa8, 0xbf, 0x38, 0xeb, 0xff, 0xaa, 0x49, 0xdb, 0xbd,
+ 0x9a, 0xdb, 0x3f, 0x7f, 0x11, 0x2a, 0xf5, 0x0f, 0xbb, 0x1e, 0x31, 0x07, 0x02,
+ 0xbf, 0x69, 0x98, 0xac, 0xbb, 0xc0,
+ ],
+ [
+ 0xb0, 0x5c, 0xad, 0x84, 0x0a, 0x9f, 0x33, 0x5b, 0x84, 0x39, 0x2a, 0xfe, 0x9d,
+ 0x4e, 0x20, 0xb8, 0x89, 0x83, 0x1b, 0x7e, 0xba, 0x24, 0x2b, 0x19, 0x08, 0x95,
+ 0x0b, 0x6c, 0x2e, 0xd3, 0x74, 0x51, 0xa4, 0xaf, 0xe1, 0x7d, 0xbe, 0x23, 0xcc,
+ 0x56, 0xdf, 0xe3, 0xfc, 0xf4, 0xcc, 0xc6, 0x59, 0x09,
+ ],
+ [
+ 0x14, 0xbd, 0xb7, 0x70, 0xc8, 0x3a, 0x3b, 0xb9, 0x7f, 0xaf, 0xe0, 0x17, 0x0a,
+ 0x6c, 0xdb, 0xdc, 0xf0, 0xb6, 0x68, 0x9f, 0xe9, 0xa4, 0xf7, 0x9e, 0x14, 0xef,
+ 0x9d, 0xda, 0xb7, 0xa0, 0x9a, 0xd8, 0x79, 0x4d, 0xd8, 0xbf, 0xed, 0x2d, 0x52,
+ 0xa2, 0xb4, 0x38, 0x68, 0x06, 0x9e, 0x41, 0x38, 0x3a, 0x4b, 0x2c, 0x30, 0x2d,
+ 0xee, 0xee, 0x03, 0x9e, 0xa9, 0x75, 0xec, 0xa3, 0x96, 0x1f, 0x07, 0x13,
+ ]
+ ),
+ test_case!(
+ [
+ 0x98, 0x9d, 0x34, 0x47, 0x65, 0xd1, 0xe7, 0xf4, 0xb5, 0x19, 0x7b, 0xb6, 0x44,
+ 0x55, 0x30, 0x8e, 0x83, 0xe0, 0x29, 0xba, 0x33, 0xc0, 0x50, 0xdf, 0xfd, 0x22,
+ 0xb2, 0xec, 0x5b, 0x46, 0x0f, 0x38, 0xf9, 0x23, 0x85, 0x66, 0xd9, 0xbd, 0x9f,
+ 0x83, 0xe3, 0x5a, 0x24, 0x1e, 0x7a, 0x72, 0xa8, 0x6c, 0x2b, 0xe9, 0xe1, 0xf6,
+ 0xec, 0xd1, 0xcf, 0x08, 0xce, 0xa1, 0xf7, 0x07, 0xd7, 0x38, 0xa5, 0x05, 0x86,
+ 0xc0, 0x09, 0xbe, 0x10, 0x0e, 0x6f, 0xca, 0xf0, 0x39, 0xaf, 0xaf, 0x95, 0x52,
+ 0xc8, 0x8b, 0xd9, 0x10, 0x7e, 0xdb, 0x32, 0xa4, 0xda, 0x8a, 0xef, 0xa3, 0xe0,
+ 0xc7, 0xe2, 0x07, 0x9f, 0x12, 0x09, 0xcc, 0x2d, 0x7a, 0xe2, 0xa9, 0x96, 0xf1,
+ 0xcd,
+ ],
+ [
+ 0xc2, 0x27, 0x51, 0xbc, 0x2c, 0x1a, 0x4c, 0x91, 0xe4, 0xcc, 0xf3, 0xaf, 0x37,
+ 0xd0, 0xbd, 0x4b, 0xee, 0xc5, 0xc0, 0x40,
+ ],
+ [
+ 0xd5, 0xfe, 0x72, 0x21, 0x4f, 0x27, 0x10, 0x17, 0x5b, 0x7a, 0xda, 0x27, 0x22,
+ 0xb7, 0x05, 0xd2, 0xdb, 0xab, 0xf2, 0xdd, 0x69, 0x26, 0x4d, 0xbb, 0x5f, 0xe6,
+ 0xa5, 0x50, 0xcc, 0x5a, 0x56, 0x43,
+ ],
+ [
+ 0x0f, 0x00, 0x36, 0xf2, 0x53, 0x6b, 0x7b, 0xff, 0xbc, 0xe4, 0x1a, 0x48, 0xd9,
+ 0x92, 0x89, 0xf0, 0x11, 0xb0, 0x43, 0x4b, 0x4a, 0xd5, 0x55, 0x8a, 0xd2, 0xd0,
+ 0x80, 0x4b, 0x41, 0x81, 0xc3, 0x35, 0xf0, 0x3c, 0xc1, 0xab, 0xc3, 0x87, 0xda,
+ 0xe2, 0x28, 0x22, 0xfb, 0x5d, 0x33, 0x32, 0x3b, 0x0c,
+ ],
+ [
+ 0x40, 0xcf, 0xe8, 0xc5, 0x02, 0xc4, 0x89, 0x08, 0xaf, 0x10, 0xec, 0x65, 0x88,
+ 0x12, 0xde, 0xee, 0x94, 0x3a, 0x45, 0x18, 0x7c, 0x83, 0xdd, 0x03, 0xe0, 0x99,
+ 0x44, 0x3f, 0x8c, 0xf5, 0xe6, 0x0c, 0x2f, 0x00, 0xc0, 0xbf, 0xb0, 0x9c, 0x36,
+ 0x96, 0x9e, 0x33, 0x2f, 0xae, 0x5f, 0x9d, 0x76, 0x0e, 0x03, 0x90, 0x31, 0x1c,
+ 0xca, 0x3b, 0x82, 0x8b, 0x6b, 0x4b, 0x58, 0x19, 0xc3, 0x6f, 0xd0, 0x3a,
+ ]
+ ),
+ test_case!(
+ [
+ 0xc6, 0x7e, 0x6d, 0xa1, 0x5a, 0x82, 0x7b, 0xbe, 0x2c, 0x40, 0x56, 0xfe, 0xf8,
+ 0x59, 0xcc, 0x95, 0x7a, 0xcc, 0x51, 0x6d, 0x93, 0xe9, 0xc3, 0x34, 0x60, 0x1d,
+ 0x2e, 0x60, 0x74, 0x97, 0x60, 0x36, 0x41, 0xd5, 0x62, 0x70, 0x61, 0xc4, 0x4d,
+ 0x3c, 0xea, 0xd5, 0x8a, 0x12, 0x2b, 0x3a, 0x8e, 0xab, 0xbd, 0xd1, 0x7c, 0x43,
+ 0xc4, 0x9b, 0x34, 0xb4, 0x9b, 0x0c, 0x4a, 0x8f, 0xd3, 0xa0, 0xcf, 0x8c, 0x60,
+ 0xf4, 0xde, 0xee, 0x15, 0xfd, 0xe9, 0x0c, 0xdd, 0x32, 0x4e, 0x6e, 0xb2, 0x77,
+ 0x83, 0xd8, 0x6a, 0x0b, 0x83, 0xa7, 0x68, 0x8f, 0x07, 0x35, 0xa8, 0x83, 0x65,
+ 0x92, 0x1f, 0x16, 0xc4, 0x63, 0xe0, 0xeb, 0xc9, 0x20, 0xa2, 0x95, 0xbc, 0x5a,
+ 0x28, 0x5f,
+ ],
+ [
+ 0xe0, 0xdb, 0x00, 0xfd, 0x72, 0x76, 0x2a, 0xfc, 0x34, 0x46, 0x6b, 0xd8, 0xaf,
+ 0x74, 0x1c, 0xa7, 0x59, 0xfc, 0x70, 0xd5,
+ ],
+ [
+ 0x80, 0xf0, 0xd5, 0x5c, 0x1a, 0x8f, 0x04, 0x21, 0x7c, 0x06, 0x8e, 0x3b, 0x55,
+ 0xaa, 0x52, 0xdb, 0x4a, 0x96, 0xde, 0xea, 0x68, 0x4d, 0x7f, 0xd0, 0x67, 0xc3,
+ 0xd1, 0xf4, 0x52, 0x02, 0x68, 0x25,
+ ],
+ [
+ 0x6e, 0x14, 0x19, 0xba, 0xf9, 0x81, 0x5f, 0x21, 0xf3, 0x9e, 0x57, 0x8c, 0xe1,
+ 0xb7, 0x39, 0x2f, 0xd6, 0xf2, 0xfe, 0xe1, 0xd5, 0x16, 0xc3, 0xc4, 0xb8, 0x69,
+ 0xae, 0x70, 0xf8, 0xb4, 0x63, 0x7b, 0xdb, 0x27, 0xc3, 0x4a, 0x80, 0xde, 0xa0,
+ 0xcb, 0x82, 0xa7, 0x1e, 0x87, 0xc0, 0xbe, 0x7f, 0xf3,
+ ],
+ [
+ 0xf0, 0x83, 0x7b, 0x73, 0x65, 0x95, 0x96, 0x4c, 0x95, 0xc1, 0xf5, 0x1e, 0x82,
+ 0xdf, 0xae, 0x41, 0xa5, 0x71, 0x26, 0x52, 0x95, 0x01, 0xbb, 0x3d, 0x45, 0x0c,
+ 0xae, 0xb6, 0x8a, 0xba, 0x6d, 0xeb, 0xad, 0x57, 0xf4, 0x31, 0x92, 0x3a, 0x4d,
+ 0xa3, 0x32, 0x45, 0xfe, 0x72, 0x05, 0x5a, 0xae, 0xa0, 0xd9, 0x3e, 0x18, 0x21,
+ 0x5b, 0x54, 0xe7, 0x48, 0xab, 0x9c, 0x87, 0xcd, 0xf2, 0x0a, 0x20, 0x8c,
+ ]
+ ),
+ test_case!(
+ [
+ 0xae, 0x49, 0x35, 0xad, 0xdc, 0xa1, 0x98, 0x8a, 0x06, 0x46, 0xf9, 0x75, 0xaa,
+ 0x8b, 0x96, 0xd3, 0xd1, 0x67, 0xea, 0x8e, 0x9a, 0xc6, 0xc4, 0xcb, 0xe0, 0xa8,
+ 0xa6, 0xa0, 0x1c, 0x34, 0x19, 0x29, 0xd5, 0x46, 0x0b, 0xd6, 0x36, 0x09, 0x3b,
+ 0xa7, 0xf3, 0xd1, 0x9d, 0x6f, 0x29, 0xbd, 0x63, 0xcd, 0xbc, 0xe8, 0x2a, 0x49,
+ 0x98, 0x1f, 0x38, 0xd6, 0xda, 0xb0, 0xdf, 0x5e, 0x33, 0x00, 0x08, 0xfd, 0x11,
+ 0xe1, 0x4d, 0xa0, 0x39, 0x78, 0xba, 0x83, 0x76, 0x60, 0xed, 0x7e, 0x1f, 0xa3,
+ 0xcf, 0x6b, 0xcb, 0x9c, 0x78, 0xf7, 0xb9, 0x9e, 0xb8, 0xd8, 0x33, 0xcb, 0x42,
+ 0x8d, 0x1f, 0x3a, 0x9f, 0xcc, 0x44, 0x6a, 0x7a, 0x1d, 0x73, 0x4c, 0xdc, 0xf6,
+ 0x05, 0x6b, 0xbc,
+ ],
+ [
+ 0x13, 0x40, 0x12, 0xcc, 0x6f, 0x06, 0x07, 0xa1, 0x64, 0x38, 0x57, 0xfb, 0xfe,
+ 0x05, 0x55, 0xf0, 0x84, 0xe3, 0x79, 0x0c,
+ ],
+ [
+ 0x5b, 0x7d, 0x4d, 0x7f, 0x3e, 0x7c, 0x02, 0xe6, 0xeb, 0x3a, 0x53, 0xc3, 0x1c,
+ 0x24, 0xcf, 0x5c, 0xc2, 0x69, 0x97, 0x29, 0x7e, 0x7a, 0x2e, 0x71, 0xc7, 0x4e,
+ 0xc0, 0x96, 0xf4, 0x9b, 0xda, 0x30,
+ ],
+ [
+ 0x0a, 0x5a, 0xcb, 0xc2, 0x72, 0x47, 0x41, 0xa4, 0xf7, 0xcb, 0x3d, 0x9a, 0x13,
+ 0x75, 0xa9, 0x37, 0xd6, 0xe3, 0x79, 0x1c, 0x24, 0x3f, 0xea, 0xb3, 0x0e, 0x3e,
+ 0xc0, 0xb2, 0xea, 0x67, 0xe5, 0xce, 0xf1, 0xd0, 0xf7, 0xa1, 0x5e, 0x32, 0x44,
+ 0x42, 0x97, 0xbb, 0xa8, 0x82, 0xaf, 0x42, 0x42, 0xd1,
+ ],
+ [
+ 0x75, 0xb5, 0x1e, 0x80, 0x80, 0x56, 0xd7, 0x67, 0x23, 0x63, 0xc8, 0x4e, 0x7a,
+ 0xfd, 0x13, 0x4e, 0x27, 0x90, 0xfb, 0xad, 0xcb, 0x49, 0x7d, 0x1c, 0x49, 0x0a,
+ 0x61, 0x2a, 0x80, 0xbc, 0x47, 0x60, 0x3b, 0x35, 0x0d, 0x76, 0xa2, 0x14, 0x50,
+ 0xbd, 0x22, 0x94, 0xc9, 0x63, 0xd5, 0x48, 0xa3, 0x2d, 0xb0, 0x13, 0x63, 0x49,
+ 0x02, 0xc8, 0x3d, 0x8d, 0x32, 0x5d, 0x8d, 0x13, 0x09, 0x01, 0x5d, 0x1c,
+ ]
+ ),
+ test_case!(
+ [
+ 0x08, 0x39, 0x24, 0xb6, 0x21, 0xd2, 0x2e, 0x80, 0x5f, 0xd2, 0x73, 0x84, 0x8e,
+ 0x71, 0x3b, 0x9f, 0x31, 0x8d, 0x10, 0x8a, 0x75, 0x41, 0xfa, 0x87, 0xbc, 0x6b,
+ 0xa1, 0x4c, 0x4d, 0xd9, 0xfb, 0xbe, 0xf3, 0x6f, 0x10, 0x4a, 0x91, 0xc7, 0x58,
+ 0x26, 0x57, 0x31, 0x52, 0x4f, 0x59, 0x49, 0xae, 0x47, 0xc0, 0xac, 0xb3, 0x99,
+ 0xfd, 0x52, 0x27, 0x41, 0xd6, 0xfa, 0x59, 0x1e, 0x1e, 0x45, 0xcc, 0x17, 0x5b,
+ 0x4e, 0x29, 0x54, 0xad, 0xb9, 0xf7, 0xa1, 0x6f, 0x8b, 0x94, 0x40, 0xbb, 0x12,
+ 0xd3, 0x3b, 0x32, 0x76, 0xc9, 0xa9, 0x99, 0x70, 0xda, 0xe8, 0x79, 0x7a, 0xee,
+ 0xe2, 0x3e, 0xb9, 0x4d, 0x43, 0xf0, 0x49, 0x1e, 0x02, 0x63, 0xec, 0xf5, 0x25,
+ 0xbb, 0x0f, 0x44, 0x26,
+ ],
+ [
+ 0x54, 0x8e, 0x7a, 0xf0, 0xf4, 0x89, 0x04, 0xbc, 0x96, 0xc4, 0x61, 0x0d, 0x38,
+ 0x5f, 0xfc, 0xf2, 0xe2, 0xf7, 0x01, 0x55,
+ ],
+ [
+ 0x85, 0x45, 0x01, 0x67, 0xf0, 0x68, 0x54, 0xaf, 0xfa, 0x20, 0x7a, 0x83, 0xe4,
+ 0xfb, 0xa2, 0x36, 0xe6, 0x06, 0x72, 0xa7, 0x0e, 0x9b, 0xcf, 0xa9, 0x66, 0x48,
+ 0xc6, 0x6f, 0x35, 0xb5, 0x93, 0x3d,
+ ],
+ [
+ 0x81, 0x90, 0xe3, 0x36, 0x41, 0xd8, 0xba, 0x97, 0x45, 0x49, 0xce, 0x9e, 0x76,
+ 0x11, 0xdc, 0x7e, 0x9d, 0x9d, 0x79, 0x31, 0xc7, 0xa2, 0x94, 0xba, 0x18, 0x75,
+ 0xfc, 0x7f, 0x68, 0x99, 0x49, 0x93, 0x87, 0xe8, 0x98, 0x94, 0xe2, 0x93, 0x93,
+ 0x6f, 0x1f, 0xa7, 0xfa, 0x06, 0x45, 0x61, 0x9d, 0x08,
+ ],
+ [
+ 0x8e, 0x70, 0x56, 0x7e, 0x99, 0x0a, 0x3d, 0xcc, 0x62, 0x5a, 0x22, 0x4c, 0x7c,
+ 0x4f, 0x41, 0xf2, 0xef, 0x4e, 0xbc, 0x7f, 0x4d, 0xe1, 0x75, 0xaf, 0xf6, 0x2e,
+ 0xe3, 0x22, 0x40, 0x3d, 0x04, 0xe8, 0xff, 0xf9, 0x89, 0x5c, 0xa7, 0xdf, 0x90,
+ 0xcc, 0x1b, 0x44, 0x4a, 0x61, 0xe6, 0x25, 0x28, 0x43, 0x41, 0xfb, 0x95, 0x60,
+ 0xb7, 0x42, 0x71, 0x9b, 0x3d, 0x76, 0x6e, 0x05, 0x9a, 0xdc, 0x32, 0x95,
+ ]
+ ),
+ test_case!(
+ [
+ 0xb5, 0x14, 0x6d, 0x49, 0x4c, 0xa9, 0x01, 0xfc, 0x77, 0x8f, 0x03, 0x8e, 0x97,
+ 0x88, 0x9c, 0x42, 0x8e, 0x9e, 0x4a, 0x69, 0x04, 0x83, 0x6f, 0x04, 0x43, 0xd7,
+ 0x1b, 0x26, 0x68, 0xed, 0xef, 0x3d, 0x59, 0x1a, 0xbd, 0x32, 0x05, 0x3f, 0x66,
+ 0x94, 0x4c, 0x92, 0x31, 0x51, 0xcd, 0xa3, 0xaa, 0xde, 0xe9, 0xf2, 0x57, 0xf3,
+ 0xb4, 0x06, 0x0c, 0xf1, 0xc3, 0x4e, 0x11, 0x78, 0x21, 0x56, 0x30, 0xfb, 0xd1,
+ 0xc8, 0x59, 0x14, 0xfc, 0x49, 0xeb, 0xf0, 0xf7, 0x57, 0x8c, 0xb3, 0xae, 0x8f,
+ 0x5c, 0x77, 0xb0, 0x31, 0xe7, 0x44, 0x75, 0x37, 0x78, 0x59, 0x99, 0x80, 0x0b,
+ 0x9d, 0x65, 0x21, 0x2d, 0xc2, 0x08, 0x8c, 0x42, 0xf6, 0x47, 0x66, 0x2d, 0x3c,
+ 0xb9, 0x20, 0x0a, 0xdc, 0x58,
+ ],
+ [
+ 0x8c, 0x13, 0x3b, 0x86, 0x53, 0x53, 0x53, 0x8e, 0x8c, 0x14, 0x29, 0x75, 0xbf,
+ 0x4b, 0xb3, 0x9f, 0xa7, 0x47, 0xee, 0x43,
+ ],
+ [
+ 0xfc, 0x6b, 0x1c, 0x1d, 0x9b, 0x7f, 0xb5, 0x4b, 0xf0, 0x24, 0x6b, 0x5e, 0x08,
+ 0x1e, 0x8e, 0xe9, 0x7c, 0x0f, 0xc0, 0x9c, 0xfc, 0x5b, 0x64, 0x3e, 0xb7, 0x0b,
+ 0x17, 0x8b, 0xe4, 0xcb, 0x6e, 0x57,
+ ],
+ [
+ 0x41, 0xb7, 0x43, 0xa2, 0xe3, 0x7c, 0xee, 0x23, 0x5f, 0x7e, 0xbb, 0x99, 0x5d,
+ 0x20, 0xcd, 0x64, 0x1e, 0x58, 0x9d, 0x3d, 0x64, 0x8f, 0x1d, 0xaf, 0xc0, 0x8e,
+ 0xa7, 0x1b, 0x9d, 0x46, 0x39, 0x51, 0x4b, 0xf6, 0xf5, 0x36, 0xa7, 0x27, 0x69,
+ 0x34, 0xc6, 0x33, 0x2a, 0x76, 0xdd, 0x1c, 0xe9, 0x86,
+ ],
+ [
+ 0x61, 0x6b, 0xdd, 0xe7, 0x6b, 0x81, 0xa1, 0x1f, 0x23, 0xd2, 0xe8, 0x86, 0xe9,
+ 0x84, 0x6b, 0x17, 0x11, 0x64, 0x54, 0x54, 0x1a, 0x75, 0xb8, 0xf5, 0xc0, 0xa5,
+ 0x57, 0x46, 0x87, 0x80, 0x2c, 0xcf, 0xda, 0x37, 0xff, 0xea, 0xde, 0xbb, 0xac,
+ 0x3b, 0xb6, 0x26, 0xd4, 0xf3, 0x40, 0x11, 0x86, 0xea, 0xe6, 0x8c, 0x79, 0xeb,
+ 0x50, 0x5b, 0xa2, 0x76, 0x79, 0xb4, 0x3e, 0x55, 0x6d, 0x3a, 0xcd, 0xcf,
+ ]
+ ),
+ test_case!(
+ [
+ 0xf1, 0xea, 0x8d, 0x82, 0x6d, 0x9b, 0xe3, 0xd7, 0x78, 0x2c, 0x7d, 0x5b, 0xca,
+ 0x2d, 0x4a, 0x63, 0x44, 0x8c, 0xa2, 0x1b, 0xf6, 0x3c, 0xb7, 0x0e, 0x3c, 0x35,
+ 0x92, 0x9a, 0x16, 0xe3, 0xd3, 0x47, 0x9a, 0xc8, 0xcd, 0x98, 0x6d, 0x7b, 0x9d,
+ 0xaf, 0xb5, 0x01, 0x91, 0x18, 0x70, 0x58, 0x1d, 0xba, 0x9f, 0x80, 0xdf, 0x3c,
+ 0x92, 0xc1, 0x4d, 0x66, 0x0a, 0xec, 0x73, 0x00, 0xdb, 0x2c, 0x8d, 0x0d, 0x7e,
+ 0xe1, 0x8a, 0x90, 0x7a, 0x20, 0xf2, 0xe6, 0xbf, 0x00, 0x08, 0xbd, 0xee, 0x92,
+ 0x95, 0xa9, 0x3c, 0xdb, 0x11, 0x01, 0x8f, 0x92, 0x8d, 0xc2, 0xdb, 0x9f, 0xe1,
+ 0x81, 0xb6, 0x4f, 0x73, 0xdd, 0x67, 0x3e, 0x8d, 0x0b, 0xb9, 0x32, 0xfd, 0x47,
+ 0xab, 0x0d, 0xdf, 0x9b, 0xcb, 0x1d,
+ ],
+ [
+ 0x41, 0x7b, 0xa5, 0xc8, 0x71, 0xe8, 0x44, 0x75, 0xe4, 0x26, 0x7e, 0x08, 0x6f,
+ 0x2e, 0x4e, 0xe5, 0xc8, 0x53, 0xcc, 0x8e,
+ ],
+ [
+ 0x3e, 0x14, 0x86, 0xd7, 0x1e, 0x1d, 0xf3, 0xd6, 0x94, 0x28, 0xf9, 0x7a, 0x31,
+ 0xf4, 0x3a, 0x61, 0x08, 0x5b, 0x39, 0xc1, 0x6d, 0xf4, 0x24, 0x94, 0xd5, 0x4d,
+ 0x99, 0x42, 0xad, 0x5b, 0xd3, 0x92,
+ ],
+ [
+ 0x4f, 0x96, 0xad, 0xe7, 0x50, 0x21, 0x99, 0xbd, 0xba, 0xe4, 0x03, 0xd3, 0x28,
+ 0x53, 0x0c, 0x38, 0xd4, 0xca, 0x4f, 0x03, 0x8d, 0xea, 0x0d, 0x38, 0x93, 0xbd,
+ 0xe7, 0x2e, 0xbd, 0xc3, 0xaa, 0xab, 0x1b, 0xb8, 0xe6, 0xd4, 0x8a, 0x93, 0x2a,
+ 0x39, 0x8e, 0x3d, 0x96, 0x8c, 0xab, 0x00, 0x2d, 0x0c,
+ ],
+ [
+ 0x40, 0x9a, 0x8a, 0x20, 0xd8, 0x6d, 0x0b, 0x2f, 0x82, 0x90, 0x50, 0xd1, 0x8a,
+ 0x1d, 0xb3, 0x80, 0x25, 0x5a, 0xbd, 0xf4, 0xc7, 0x0d, 0xb3, 0xa0, 0x8e, 0xfc,
+ 0xde, 0x96, 0x40, 0x27, 0xd4, 0x64, 0x79, 0x60, 0x98, 0xd0, 0xcb, 0xf5, 0x53,
+ 0x7b, 0xdf, 0x2d, 0x32, 0xdf, 0x7c, 0x5b, 0x09, 0xec, 0x7f, 0x7a, 0x08, 0x41,
+ 0x1c, 0x4e, 0x3b, 0x2d, 0x59, 0x67, 0xc3, 0x25, 0xce, 0x5e, 0x91, 0x45,
+ ]
+ ),
+ test_case!(
+ [
+ 0xa4, 0x18, 0x9d, 0xfd, 0x9a, 0x35, 0x34, 0xe4, 0x73, 0x63, 0x36, 0xd3, 0xf3,
+ 0x95, 0x7f, 0x49, 0x2b, 0x8f, 0x02, 0xa0, 0x5d, 0xa5, 0x10, 0xd1, 0x56, 0x4e,
+ 0xb0, 0xa6, 0x99, 0xb1, 0xf5, 0x4d, 0x30, 0xab, 0x82, 0xf1, 0x48, 0xbf, 0x6f,
+ 0x01, 0x42, 0x3c, 0x1e, 0xba, 0xad, 0xc5, 0x66, 0x9a, 0xe4, 0xe1, 0x60, 0xd1,
+ 0x56, 0x7f, 0x2f, 0x16, 0xdf, 0xe7, 0x5e, 0x52, 0xee, 0xe6, 0x59, 0x2b, 0x99,
+ 0x41, 0x29, 0xa8, 0xa1, 0x4c, 0xe7, 0x97, 0x07, 0x22, 0x30, 0x34, 0x07, 0x82,
+ 0x0d, 0x20, 0xb9, 0xcb, 0xa0, 0x39, 0xaa, 0x38, 0x00, 0xf9, 0xcf, 0x02, 0xe8,
+ 0xc3, 0x4b, 0xb6, 0xee, 0x62, 0x54, 0x6c, 0xbd, 0x08, 0xe8, 0xab, 0xe3, 0x51,
+ 0x09, 0x32, 0x1b, 0xe7, 0xe8, 0x37, 0x7c,
+ ],
+ [
+ 0x2b, 0x2f, 0x47, 0x4c, 0x74, 0xe9, 0x54, 0x25, 0xa4, 0x02, 0xd4, 0xf3, 0xa4,
+ 0xba, 0x04, 0x4e, 0x6d, 0x4d, 0x8b, 0xf1,
+ ],
+ [
+ 0xd4, 0xb2, 0xa8, 0x5d, 0xff, 0x21, 0xc8, 0x17, 0xeb, 0x40, 0xb2, 0xd6, 0x3f,
+ 0xbd, 0x3a, 0xf2, 0x42, 0xb1, 0x13, 0x04, 0x05, 0x94, 0xf8, 0x5c, 0xce, 0x69,
+ 0x82, 0x5c, 0x98, 0x54, 0xb6, 0x0d,
+ ],
+ [
+ 0x6e, 0xad, 0xbc, 0x38, 0x81, 0xa6, 0x3f, 0x8e, 0xed, 0xe1, 0x71, 0x72, 0xc1,
+ 0x79, 0xd8, 0xa9, 0xf9, 0x4e, 0x9d, 0x0a, 0x48, 0x1d, 0x55, 0xfc, 0xbd, 0xc2,
+ 0xdf, 0x71, 0xd0, 0x9b, 0x19, 0x06, 0xf0, 0xf5, 0x07, 0x4f, 0x12, 0x5b, 0x45,
+ 0xd5, 0x45, 0xa2, 0xdf, 0x0c, 0x15, 0xd4, 0x03, 0xa0,
+ ],
+ [
+ 0xaa, 0x0d, 0x5e, 0x4c, 0xc6, 0x9e, 0x85, 0x47, 0x30, 0x67, 0xdb, 0x63, 0xe9,
+ 0xed, 0x74, 0x6e, 0x11, 0x33, 0x02, 0xf1, 0xd0, 0xa8, 0x9f, 0xb9, 0x81, 0x49,
+ 0x88, 0x2b, 0x37, 0x04, 0x2a, 0x53, 0xd7, 0x1d, 0x2f, 0x9f, 0xdc, 0xe0, 0x00,
+ 0x8f, 0x0c, 0xe5, 0x74, 0x1e, 0x48, 0x73, 0x4f, 0x14, 0x07, 0x93, 0x3e, 0x24,
+ 0xed, 0xea, 0x58, 0x7a, 0x72, 0xbb, 0xce, 0x99, 0xb6, 0x85, 0xa8, 0x04,
+ ]
+ ),
+ test_case!(
+ [
+ 0xe1, 0x66, 0x54, 0x9d, 0x89, 0xba, 0x1a, 0x92, 0x89, 0x90, 0x82, 0xac, 0x46,
+ 0x27, 0xb2, 0xb3, 0x04, 0x5d, 0x9a, 0xef, 0x4e, 0x0c, 0xe2, 0x7a, 0xe8, 0xdd,
+ 0xda, 0xb7, 0x16, 0x87, 0x58, 0xf7, 0x25, 0xcb, 0x23, 0xfc, 0x59, 0x23, 0x4f,
+ 0x8f, 0x40, 0x44, 0x75, 0xff, 0x7a, 0xcd, 0x6c, 0x41, 0x74, 0x39, 0x00, 0xad,
+ 0xca, 0x50, 0xff, 0x91, 0x77, 0x16, 0xe5, 0x05, 0x02, 0xc2, 0x21, 0x08, 0x81,
+ 0x50, 0x5d, 0x0a, 0xd7, 0x9b, 0x41, 0xe4, 0x48, 0x4e, 0x19, 0xd4, 0xe8, 0x6c,
+ 0xca, 0x99, 0xf3, 0x81, 0xc9, 0xa6, 0x0f, 0x62, 0x23, 0x53, 0x43, 0x35, 0x40,
+ 0x53, 0x34, 0xc6, 0xa2, 0xf2, 0x81, 0x54, 0xe2, 0xb5, 0x33, 0xf3, 0x18, 0x61,
+ 0x4d, 0x76, 0xe1, 0xe4, 0xa9, 0xaf, 0x86, 0xaf,
+ ],
+ [
+ 0x12, 0xf0, 0x89, 0x09, 0x46, 0xed, 0xac, 0x56, 0x44, 0x72, 0x73, 0x8e, 0xd2,
+ 0x7f, 0x22, 0x2e, 0x28, 0xbb, 0x8f, 0x67,
+ ],
+ [
+ 0xc8, 0x90, 0x61, 0xa1, 0x10, 0x1d, 0xaa, 0xed, 0x5d, 0x84, 0xaa, 0xe7, 0xbc,
+ 0x16, 0x4e, 0x75, 0xcf, 0x14, 0x4e, 0x65, 0x0c, 0x43, 0xc1, 0x7a, 0xc4, 0x47,
+ 0x40, 0x01, 0x51, 0x8a, 0x9d, 0x9c,
+ ],
+ [
+ 0x07, 0xfa, 0x94, 0x07, 0x67, 0xe9, 0x1f, 0xbd, 0x03, 0x21, 0x98, 0xe3, 0x55,
+ 0xaf, 0x8b, 0x17, 0xcd, 0xfe, 0xad, 0x99, 0x39, 0x67, 0x80, 0xb4, 0x52, 0xf6,
+ 0x4b, 0x71, 0x92, 0x8a, 0xc2, 0x90, 0x5c, 0x54, 0x9d, 0xcc, 0xee, 0xa1, 0x5e,
+ 0x88, 0xe7, 0x6e, 0xb9, 0x8e, 0xb5, 0xfd, 0x03, 0x86,
+ ],
+ [
+ 0x4d, 0x1e, 0x52, 0xd8, 0xdc, 0x7b, 0x67, 0x3f, 0xe4, 0xa1, 0x03, 0x79, 0xf1,
+ 0xfe, 0x76, 0xb0, 0xfc, 0x82, 0xe3, 0x75, 0x00, 0x2c, 0x85, 0x80, 0xf7, 0xa8,
+ 0x53, 0x32, 0x8f, 0xae, 0x3d, 0xeb, 0xd3, 0x7a, 0xd8, 0xa2, 0xe0, 0x1a, 0x4c,
+ 0x0a, 0x79, 0x6e, 0x7c, 0x06, 0x44, 0x0f, 0x87, 0x71, 0x38, 0x07, 0x61, 0x91,
+ 0x79, 0x34, 0xbb, 0x0e, 0xf2, 0x48, 0x45, 0x8f, 0x8c, 0xfb, 0x4a, 0x01,
+ ]
+ ),
+ test_case!(
+ [
+ 0x4a, 0x53, 0xae, 0x9f, 0xa6, 0x30, 0xa1, 0x42, 0x37, 0xb2, 0x8f, 0x03, 0xa6,
+ 0xfa, 0x1d, 0x67, 0x72, 0xda, 0xbd, 0xd1, 0xa9, 0x0f, 0xcc, 0x6c, 0xbd, 0x40,
+ 0xa9, 0xf3, 0x3b, 0x76, 0x6d, 0x4c, 0x1e, 0x91, 0x9c, 0x5b, 0x65, 0xf5, 0x43,
+ 0xcb, 0x07, 0x50, 0x90, 0x5c, 0x89, 0xb2, 0xcc, 0x25, 0xff, 0xf4, 0x20, 0xf2,
+ 0x7c, 0x81, 0x52, 0x49, 0x39, 0xf1, 0xc1, 0x66, 0x3d, 0xf8, 0xed, 0x07, 0xd8,
+ 0xf9, 0xb1, 0x9a, 0x50, 0x0e, 0x8a, 0xe9, 0xdc, 0x5b, 0xdd, 0xb4, 0xda, 0x74,
+ 0xb1, 0x8c, 0xf2, 0xf0, 0x2c, 0xb3, 0x6a, 0x78, 0x7a, 0x44, 0x1d, 0x2f, 0x7c,
+ 0xa4, 0x8b, 0x7b, 0x3e, 0xd6, 0x14, 0x6f, 0x36, 0xfe, 0xdc, 0x37, 0x00, 0xe4,
+ 0x3b, 0xb8, 0xbe, 0x0c, 0x7f, 0x05, 0xa3, 0x17, 0xb6,
+ ],
+ [
+ 0x9b, 0xa1, 0x42, 0x6a, 0xff, 0x8a, 0xad, 0xf4, 0x58, 0x32, 0xee, 0x84, 0x43,
+ 0x92, 0x5d, 0xc1, 0x67, 0x21, 0x73, 0x99,
+ ],
+ [
+ 0x09, 0xed, 0x65, 0x34, 0xf7, 0x07, 0xe8, 0xb0, 0x70, 0x84, 0xf2, 0x79, 0xee,
+ 0x4b, 0xf0, 0x96, 0x14, 0xa4, 0x43, 0xee, 0xdc, 0xd1, 0xbe, 0x5e, 0xe9, 0x27,
+ 0x50, 0x07, 0xb5, 0x0b, 0xeb, 0xa7,
+ ],
+ [
+ 0x5e, 0xff, 0x39, 0x41, 0x0c, 0xb0, 0xce, 0x63, 0x87, 0xe3, 0xb7, 0x2b, 0xe7,
+ 0xf1, 0xa2, 0x9e, 0xf8, 0x5f, 0xa4, 0x2e, 0xc8, 0x6b, 0x3a, 0x44, 0x69, 0xce,
+ 0xa6, 0x42, 0x94, 0x6e, 0x2b, 0x18, 0x2b, 0x6f, 0xdf, 0x9f, 0x2e, 0x5d, 0x71,
+ 0xf7, 0xf3, 0x3e, 0xb6, 0x7f, 0xce, 0x39, 0x95, 0x83,
+ ],
+ [
+ 0x6b, 0xc8, 0x6e, 0x6a, 0xac, 0xcc, 0x3a, 0x5f, 0xe8, 0x56, 0x92, 0x7b, 0x3a,
+ 0xf0, 0x51, 0x4c, 0xbc, 0x14, 0x3f, 0x1b, 0x1d, 0xd8, 0x05, 0x48, 0x9e, 0x00,
+ 0x21, 0xfa, 0xfb, 0x7f, 0xaa, 0xd2, 0x7c, 0xd8, 0x92, 0x22, 0x79, 0x08, 0x99,
+ 0xf9, 0xe4, 0x06, 0x05, 0x2e, 0x54, 0x62, 0xcc, 0x0d, 0x7c, 0xdf, 0x8c, 0x07,
+ 0x25, 0xca, 0x3d, 0x11, 0xa0, 0xec, 0x0e, 0x06, 0x23, 0x42, 0x97, 0xb8,
+ ]
+ ),
+ test_case!(
+ [
+ 0x76, 0xd7, 0x3d, 0x4f, 0x69, 0xdc, 0x8c, 0x5c, 0xf5, 0xb6, 0x67, 0x9c, 0x21,
+ 0x46, 0x5c, 0x96, 0x9a, 0xcf, 0x70, 0x93, 0xa7, 0x5e, 0xa9, 0x10, 0x6e, 0xaa,
+ 0x97, 0xa7, 0xee, 0x4b, 0xaf, 0x22, 0xb8, 0xaf, 0x17, 0x53, 0xe6, 0xb9, 0x24,
+ 0x44, 0x74, 0xb0, 0x46, 0xc9, 0xd0, 0x4b, 0xdc, 0xa8, 0xb7, 0x0f, 0x40, 0xf1,
+ 0xac, 0xea, 0x50, 0xfe, 0x29, 0x5b, 0x3e, 0x5d, 0xc5, 0x03, 0x95, 0xc2, 0x7c,
+ 0x86, 0xe2, 0x5d, 0x6f, 0x96, 0x42, 0xae, 0x78, 0x59, 0xeb, 0xde, 0xb5, 0xa8,
+ 0x3b, 0x1c, 0xed, 0x22, 0x69, 0x20, 0xef, 0x40, 0x49, 0xff, 0xa0, 0x67, 0x99,
+ 0xf6, 0x8b, 0x5e, 0xb9, 0x03, 0x04, 0xcb, 0x6e, 0x7d, 0x73, 0x55, 0xd1, 0x11,
+ 0xe1, 0xed, 0xe7, 0xf7, 0xfc, 0xd3, 0xb2, 0x6b, 0xdc, 0x60,
+ ],
+ [
+ 0x48, 0xab, 0xed, 0x0a, 0x34, 0x1e, 0xdb, 0x52, 0x91, 0xad, 0xb4, 0xfd, 0x6e,
+ 0x8d, 0xf4, 0x56, 0x69, 0x20, 0x12, 0x2a,
+ ],
+ [
+ 0x74, 0x3d, 0x94, 0xca, 0x8b, 0xad, 0x40, 0x3d, 0x7f, 0x35, 0xaa, 0x18, 0xb2,
+ 0x38, 0xad, 0x2d, 0x99, 0x90, 0x82, 0xe7, 0x1a, 0x0f, 0x53, 0xe2, 0x3f, 0x59,
+ 0x21, 0xfa, 0x3b, 0x33, 0x37, 0x18,
+ ],
+ [
+ 0x89, 0xbf, 0x09, 0xe1, 0xac, 0xcc, 0xb8, 0x0e, 0xf9, 0x5d, 0x8b, 0x2f, 0x96,
+ 0x17, 0x11, 0x6c, 0x45, 0x83, 0xcb, 0x01, 0xfb, 0xcb, 0x0a, 0xb5, 0x17, 0xef,
+ 0xdf, 0x3f, 0x26, 0x2a, 0x07, 0xbb, 0x3e, 0x8b, 0xf3, 0x7a, 0x4f, 0x48, 0xe1,
+ 0x26, 0x34, 0x65, 0x0b, 0x6d, 0x8a, 0x5b, 0x6a, 0xed,
+ ],
+ [
+ 0x7b, 0x85, 0x82, 0xb1, 0x7d, 0xd2, 0x72, 0x1f, 0xc9, 0x05, 0xc7, 0xda, 0xd0,
+ 0x89, 0x97, 0xff, 0xe6, 0x28, 0xdc, 0xfe, 0x92, 0x7f, 0x12, 0xde, 0xef, 0x36,
+ 0x83, 0xc6, 0x10, 0x77, 0x39, 0xfb, 0xf3, 0x2a, 0xbd, 0x04, 0xed, 0x33, 0x7d,
+ 0xb1, 0x76, 0x3e, 0xc7, 0x93, 0x8e, 0x12, 0x0d, 0x66, 0xd9, 0x33, 0x76, 0xf7,
+ 0x90, 0xe3, 0x27, 0xa3, 0x21, 0xbc, 0xde, 0x93, 0x2f, 0x83, 0x73, 0xe0,
+ ]
+ ),
+ test_case!(
+ [
+ 0x42, 0xdc, 0x01, 0xc6, 0x21, 0x6f, 0x63, 0xc4, 0xd7, 0x90, 0xe0, 0xdc, 0x4a,
+ 0xf0, 0xe8, 0x01, 0x96, 0x97, 0x00, 0x8a, 0x8b, 0xd6, 0x6e, 0x45, 0x0b, 0x3c,
+ 0x09, 0xa5, 0x7f, 0xe8, 0x1e, 0xa7, 0x56, 0x2f, 0x0a, 0x56, 0x59, 0x0c, 0xe5,
+ 0x21, 0xb8, 0xe9, 0x18, 0x50, 0x03, 0xb6, 0xbf, 0x8c, 0x65, 0xc9, 0xd1, 0x95,
+ 0x81, 0x1e, 0xa4, 0xa8, 0x0e, 0xec, 0x86, 0x27, 0xe4, 0x55, 0xe9, 0xe8, 0x2f,
+ 0xf0, 0xfa, 0x95, 0xfc, 0xe8, 0x4a, 0x0d, 0x31, 0x0e, 0x7b, 0x8a, 0xda, 0xf2,
+ 0xd6, 0x24, 0x8a, 0x60, 0x2f, 0x5e, 0x42, 0x9b, 0x3d, 0xc2, 0x67, 0x6d, 0x6b,
+ 0x82, 0x1f, 0x9e, 0x2e, 0x8d, 0x89, 0xf6, 0xc3, 0xe9, 0x21, 0x66, 0x6d, 0xf1,
+ 0x8f, 0x88, 0x03, 0xbe, 0xfe, 0xa2, 0xdf, 0x5d, 0x5d, 0xd7, 0x4e,
+ ],
+ [
+ 0x87, 0xd1, 0x06, 0xff, 0x32, 0xef, 0x61, 0xfc, 0xbf, 0x4e, 0x1e, 0x03, 0xad,
+ 0xe0, 0x7a, 0x92, 0x66, 0x43, 0xeb, 0x70,
+ ],
+ [
+ 0x5a, 0xc0, 0x1f, 0x00, 0xf8, 0xf9, 0x0b, 0x30, 0x06, 0x10, 0xe0, 0xf8, 0xfb,
+ 0x4e, 0xae, 0x3e, 0xad, 0x3d, 0xd8, 0xaf, 0x65, 0xa4, 0xae, 0xe6, 0xd6, 0x6d,
+ 0x6c, 0xc9, 0x48, 0x12, 0xe6, 0x13,
+ ],
+ [
+ 0x7e, 0xf3, 0x75, 0xab, 0xc5, 0x4a, 0x89, 0xe0, 0x89, 0xb5, 0x02, 0x7a, 0xda,
+ 0x3c, 0xac, 0x91, 0x59, 0xe7, 0xb7, 0xcd, 0x24, 0xfd, 0x8a, 0x7c, 0xf0, 0x78,
+ 0xa3, 0xea, 0xfa, 0x49, 0x9d, 0x9d, 0x90, 0x13, 0x27, 0x5b, 0x26, 0x6e, 0x57,
+ 0xd7, 0x89, 0xe3, 0x4a, 0x05, 0xf0, 0xb7, 0xc6, 0x14,
+ ],
+ [
+ 0xb7, 0x57, 0x73, 0xe3, 0x87, 0xc1, 0x44, 0xe5, 0x59, 0xd4, 0xb6, 0x1a, 0x3c,
+ 0x21, 0x82, 0x0e, 0xd4, 0x76, 0xd1, 0x53, 0x3e, 0x12, 0xa7, 0x0c, 0x24, 0xd3,
+ 0xf6, 0x35, 0xee, 0xfe, 0x06, 0xcb, 0xb9, 0xea, 0x50, 0x89, 0x61, 0x69, 0x4a,
+ 0x34, 0x26, 0x6c, 0xec, 0x3a, 0x08, 0x8e, 0x5e, 0x21, 0xc9, 0x41, 0x31, 0x45,
+ 0x09, 0x04, 0xb1, 0x16, 0x44, 0x47, 0xa1, 0x83, 0x23, 0xae, 0x41, 0xe0,
+ ]
+ ),
+ test_case!(
+ [
+ 0xff, 0xfb, 0xcd, 0x72, 0x05, 0x36, 0xe0, 0xbf, 0x38, 0x8a, 0xeb, 0xe0, 0xb7,
+ 0x48, 0xeb, 0xc2, 0x51, 0xac, 0xd6, 0xd3, 0xe3, 0x10, 0xbe, 0x8e, 0x79, 0x95,
+ 0xd0, 0x36, 0x37, 0x94, 0xed, 0x56, 0x2e, 0x3a, 0x09, 0x0a, 0x52, 0x0d, 0xb5,
+ 0x03, 0xd2, 0xd5, 0xcb, 0xcf, 0x21, 0x32, 0x4c, 0x57, 0xed, 0x74, 0x15, 0x7f,
+ 0xd6, 0x84, 0x8f, 0xc5, 0x0f, 0x14, 0xb0, 0x49, 0xc8, 0x1d, 0xbf, 0x29, 0x9a,
+ 0xa5, 0x42, 0x32, 0x10, 0x0f, 0x39, 0x68, 0x0f, 0x5b, 0x06, 0xdc, 0x04, 0x09,
+ 0xbb, 0x22, 0x7d, 0xe6, 0x46, 0x8a, 0x6c, 0xfb, 0x1d, 0xe3, 0xd6, 0x14, 0x50,
+ 0xb6, 0x77, 0xc2, 0x0a, 0x09, 0xb2, 0x10, 0xe5, 0xf2, 0xe2, 0x3d, 0x1f, 0xe5,
+ 0x75, 0xbc, 0xa6, 0xaa, 0xa5, 0x27, 0xa6, 0x38, 0xae, 0xf2, 0x0d, 0x87,
+ ],
+ [
+ 0x6d, 0x88, 0x3b, 0x25, 0xb1, 0xa3, 0xf5, 0xcc, 0xae, 0xd8, 0xea, 0xa5, 0xd6,
+ 0xa6, 0xb3, 0x9d, 0xa4, 0xd8, 0x9a, 0xf0,
+ ],
+ [
+ 0x32, 0x02, 0xf4, 0xd0, 0xb4, 0x18, 0x76, 0x4b, 0x1f, 0x92, 0x7f, 0xcf, 0xcf,
+ 0x21, 0x08, 0x58, 0xaa, 0x13, 0xc6, 0x11, 0xd1, 0x5f, 0x47, 0x8f, 0xf1, 0x00,
+ 0x5c, 0xa3, 0x29, 0x60, 0x1d, 0x8c,
+ ],
+ [
+ 0xf2, 0x0e, 0xd9, 0x4c, 0xbe, 0x00, 0xa6, 0x3b, 0x11, 0x48, 0x08, 0xc2, 0x72,
+ 0xd7, 0xa7, 0x07, 0x2f, 0xbb, 0xf8, 0xcb, 0x14, 0x58, 0xa1, 0xc7, 0x62, 0x78,
+ 0x23, 0x06, 0x58, 0x84, 0xe9, 0x51, 0xd8, 0x9c, 0xf4, 0xc8, 0xad, 0xb1, 0xed,
+ 0x09, 0x81, 0xbb, 0x1b, 0x2b, 0xde, 0x5c, 0x8a, 0x49,
+ ],
+ [
+ 0xc7, 0x27, 0x9d, 0x89, 0x51, 0x15, 0xfc, 0x29, 0x9b, 0x2c, 0x78, 0x24, 0x22,
+ 0xdf, 0xe2, 0x8e, 0x23, 0x28, 0xd1, 0xd6, 0x29, 0x5b, 0x6f, 0x24, 0xcb, 0x2d,
+ 0xbb, 0xc5, 0xea, 0xbb, 0xce, 0xf7, 0x8d, 0xde, 0x95, 0xe4, 0x2c, 0x63, 0x69,
+ 0x88, 0x51, 0x2f, 0xe5, 0x19, 0x9e, 0xbf, 0xd2, 0x91, 0xab, 0x1e, 0x9a, 0x11,
+ 0xa3, 0x3e, 0xfe, 0x0d, 0x68, 0xf1, 0xc3, 0xb6, 0xe2, 0xd2, 0xcb, 0x26,
+ ]
+ ),
+ test_case!(
+ [
+ 0xda, 0x98, 0x3b, 0x70, 0x4a, 0x7d, 0x30, 0x39, 0x41, 0x43, 0xca, 0x08, 0x31,
+ 0xf0, 0xfe, 0x8d, 0x07, 0x26, 0x08, 0x78, 0x82, 0xa6, 0x73, 0x4a, 0xcc, 0x5e,
+ 0xa3, 0xc4, 0x77, 0xbb, 0xbf, 0x70, 0x6f, 0x36, 0x4a, 0x49, 0xac, 0xb4, 0xc0,
+ 0xc3, 0x28, 0xbd, 0x7f, 0xfd, 0xf6, 0x24, 0x7d, 0x81, 0x2e, 0xc4, 0xcb, 0x5b,
+ 0x95, 0xb6, 0x68, 0x70, 0xaf, 0x5e, 0x14, 0xf6, 0x2c, 0x3e, 0xda, 0xa6, 0x6f,
+ 0xc5, 0x6a, 0x53, 0xde, 0x32, 0x22, 0x88, 0xe6, 0x0d, 0x84, 0x22, 0x78, 0x41,
+ 0x42, 0x85, 0x43, 0xe0, 0x19, 0x1b, 0x05, 0xeb, 0x44, 0xc0, 0x19, 0xf5, 0xb6,
+ 0x36, 0xd2, 0xbb, 0x28, 0x9f, 0x24, 0x4b, 0x35, 0x4d, 0xfe, 0x1f, 0x18, 0x8c,
+ 0x55, 0x5f, 0x7b, 0x75, 0x94, 0xfa, 0x72, 0xd7, 0x1d, 0xc5, 0xd5, 0x0c, 0xf1,
+ ],
+ [
+ 0x6c, 0x39, 0xee, 0xef, 0xb9, 0xbc, 0x44, 0x19, 0x69, 0x90, 0x7a, 0xf8, 0xe2,
+ 0x99, 0x0f, 0xda, 0x64, 0x5f, 0xd5, 0x1e,
+ ],
+ [
+ 0x71, 0x1d, 0x8f, 0x4d, 0xbe, 0x0c, 0xf0, 0xa5, 0x9a, 0x1a, 0x15, 0xcc, 0x2d,
+ 0xa7, 0x78, 0xcf, 0xfc, 0xe1, 0xba, 0x0c, 0xc3, 0x9e, 0xf3, 0x32, 0xb9, 0xa3,
+ 0x85, 0x1c, 0x96, 0xd9, 0xe9, 0xb2,
+ ],
+ [
+ 0x8b, 0x68, 0x75, 0xa4, 0x97, 0x19, 0x9e, 0x08, 0x98, 0xe0, 0x43, 0x57, 0x25,
+ 0xcb, 0x8a, 0xef, 0xcb, 0x32, 0x1b, 0x11, 0x30, 0x5d, 0x4d, 0xb4, 0xfc, 0xf0,
+ 0xfe, 0xc5, 0xff, 0xe0, 0x6f, 0x45, 0x7e, 0x91, 0xaa, 0xb0, 0x57, 0x0c, 0x37,
+ 0xe5, 0xdd, 0x95, 0xc5, 0x25, 0x67, 0x96, 0x09, 0x3d,
+ ],
+ [
+ 0x76, 0xa7, 0x57, 0xe1, 0x06, 0x7e, 0x3e, 0xfe, 0x97, 0xd0, 0x72, 0x06, 0x6a,
+ 0xab, 0x5c, 0x70, 0xa1, 0x2e, 0xa6, 0x51, 0x2c, 0x17, 0x18, 0x07, 0xad, 0xae,
+ 0xd4, 0xda, 0x27, 0x64, 0x03, 0x5b, 0xa7, 0x9e, 0xeb, 0xaf, 0x85, 0xe2, 0x88,
+ 0x47, 0xef, 0xd7, 0x10, 0x26, 0x2a, 0x47, 0xe0, 0xb3, 0x61, 0xdc, 0xbe, 0xf5,
+ 0x9a, 0x76, 0xc2, 0x28, 0x72, 0x7f, 0x5d, 0x88, 0x07, 0x6e, 0xf7, 0x63,
+ ]
+ ),
+ test_case!(
+ [
+ 0x9d, 0xd4, 0x85, 0x38, 0x98, 0x21, 0xf8, 0x31, 0x9d, 0x8f, 0x41, 0x82, 0x9d,
+ 0x3b, 0xad, 0x47, 0x7e, 0x57, 0xd8, 0x88, 0x55, 0xff, 0xdf, 0x60, 0x25, 0xe4,
+ 0x97, 0xdf, 0x36, 0x71, 0x3f, 0x8c, 0xa2, 0x11, 0x45, 0x53, 0xf6, 0x01, 0xa0,
+ 0x18, 0xcd, 0x08, 0x34, 0xb4, 0xdc, 0x25, 0x68, 0xbe, 0x26, 0x2d, 0x6b, 0x74,
+ 0x11, 0x24, 0x26, 0x9c, 0x24, 0xbb, 0xa7, 0x0a, 0x88, 0xf3, 0x47, 0x5c, 0xfe,
+ 0x0b, 0xb8, 0x32, 0x6a, 0x64, 0x04, 0x0c, 0xa8, 0x18, 0xf9, 0x86, 0x0a, 0x14,
+ 0x15, 0x2b, 0x18, 0x6b, 0x19, 0x6b, 0xf7, 0xe6, 0x06, 0xff, 0xfc, 0xf8, 0xf2,
+ 0x59, 0xf6, 0x06, 0x1b, 0x69, 0x8d, 0xf0, 0xb4, 0x42, 0x96, 0x80, 0x3c, 0xad,
+ 0x30, 0x1c, 0xfd, 0x4c, 0x85, 0xe0, 0x97, 0xe7, 0xbc, 0x99, 0x52, 0x5b, 0x6a,
+ 0xc1,
+ ],
+ [
+ 0xae, 0x01, 0x87, 0x69, 0xd0, 0x5b, 0x04, 0xc4, 0x92, 0x37, 0x4d, 0x4d, 0xa8,
+ 0x5f, 0x99, 0x73, 0x64, 0xf9, 0x09, 0x2c,
+ ],
+ [
+ 0xa1, 0xd7, 0xf6, 0x13, 0x56, 0xb8, 0xae, 0xda, 0xbd, 0x85, 0x37, 0xe3, 0x29,
+ 0x0a, 0x97, 0x5f, 0x7c, 0x21, 0x4c, 0xf5, 0x1c, 0xba, 0xeb, 0x5a, 0x16, 0xde,
+ 0x10, 0x91, 0xc4, 0x5b, 0xad, 0xba,
+ ],
+ [
+ 0x61, 0x0c, 0xc7, 0x8a, 0xc5, 0xa9, 0x88, 0x51, 0x72, 0xf9, 0x00, 0xb2, 0x45,
+ 0xcf, 0xed, 0x09, 0x61, 0xf9, 0xb6, 0x3d, 0x50, 0xb9, 0xe4, 0xbe, 0x49, 0x47,
+ 0xeb, 0xc6, 0x71, 0xb6, 0xd9, 0xf6, 0x72, 0xf8, 0xf3, 0xc4, 0x30, 0x60, 0x38,
+ 0xff, 0x28, 0xdf, 0xb8, 0x74, 0x65, 0x79, 0xbd, 0xad,
+ ],
+ [
+ 0x51, 0xd5, 0xbd, 0x85, 0x91, 0x64, 0x55, 0xdb, 0x2e, 0x7f, 0xaa, 0xb2, 0xef,
+ 0xe7, 0xef, 0x03, 0x8b, 0x94, 0xf2, 0x1e, 0x05, 0x76, 0xe3, 0x4d, 0xbe, 0x59,
+ 0xcd, 0xce, 0xd2, 0xe1, 0xc2, 0xe3, 0xf6, 0xda, 0xea, 0xd1, 0x5f, 0x00, 0x13,
+ 0x6a, 0x46, 0x1e, 0xd7, 0xf3, 0x5e, 0xc6, 0x8c, 0xb7, 0x90, 0xc1, 0xbd, 0x79,
+ 0xcf, 0x5b, 0xa4, 0xc9, 0x5a, 0xa2, 0x5d, 0x82, 0xd0, 0x4b, 0xae, 0xac,
+ ]
+ ),
+ test_case!(
+ [
+ 0x4c, 0x09, 0x85, 0x45, 0x82, 0x76, 0xb4, 0xff, 0x7e, 0x31, 0x8c, 0xa9, 0xf0,
+ 0x80, 0xda, 0x0c, 0x7f, 0x83, 0xc5, 0x55, 0x61, 0x52, 0xbe, 0xdc, 0x75, 0x53,
+ 0x7c, 0x14, 0x25, 0xfd, 0xa7, 0x52, 0x49, 0xe3, 0xf4, 0x7f, 0xcf, 0x93, 0x6b,
+ 0xf9, 0xe0, 0x45, 0x0a, 0xbd, 0xeb, 0xf6, 0x88, 0x3e, 0x0f, 0x64, 0xea, 0xf2,
+ 0xe5, 0x73, 0x2d, 0x67, 0x09, 0x21, 0xa1, 0x8c, 0xdc, 0xf7, 0xe1, 0xfd, 0x5d,
+ 0xb3, 0x4b, 0xd5, 0x06, 0xfc, 0x65, 0x3d, 0x4f, 0xd6, 0xf0, 0x74, 0x77, 0xc6,
+ 0x11, 0xfd, 0x6a, 0x46, 0x05, 0x29, 0x69, 0x52, 0x89, 0x53, 0xf8, 0x3a, 0xcf,
+ 0xdc, 0xd5, 0x26, 0x10, 0xf7, 0xab, 0x17, 0x50, 0x6a, 0x96, 0x50, 0x45, 0xc2,
+ 0x2e, 0xf9, 0x1b, 0x3e, 0xdb, 0x85, 0x0a, 0x9e, 0xa1, 0xd4, 0x59, 0x84, 0x2b,
+ 0xc1, 0x40,
+ ],
+ [
+ 0xf1, 0xa9, 0x90, 0x89, 0xd5, 0x24, 0x2e, 0x1d, 0x7c, 0x91, 0x19, 0x5d, 0x5a,
+ 0x8b, 0x55, 0x74, 0xf3, 0xfe, 0xfe, 0x2f,
+ ],
+ [
+ 0xe7, 0xdb, 0xb4, 0xcc, 0x82, 0xb4, 0x60, 0xc2, 0xe5, 0x65, 0x87, 0x7f, 0x80,
+ 0xcf, 0x3a, 0xfc, 0xa0, 0xcb, 0x2a, 0xf9, 0xe4, 0xfa, 0x7b, 0x0f, 0x9d, 0x55,
+ 0x3a, 0x50, 0xfc, 0x2c, 0x0c, 0x6f,
+ ],
+ [
+ 0x52, 0xd4, 0xff, 0x43, 0x7e, 0xc9, 0x7e, 0x3f, 0xee, 0xbe, 0x46, 0x14, 0xe3,
+ 0xc3, 0xde, 0x1d, 0xa0, 0xe7, 0x7a, 0x56, 0x94, 0x8e, 0xb4, 0x20, 0xe9, 0xbe,
+ 0x88, 0xa4, 0x2b, 0xc1, 0xb5, 0x10, 0x17, 0xea, 0x72, 0x44, 0x98, 0xe7, 0x24,
+ 0xba, 0xb7, 0xf7, 0x49, 0xf9, 0xe2, 0x6d, 0x0f, 0xa8,
+ ],
+ [
+ 0x47, 0x18, 0x39, 0xb3, 0xf1, 0xf5, 0x8a, 0x2f, 0x17, 0x01, 0x21, 0x28, 0xdf,
+ 0xd2, 0xe1, 0x3f, 0x47, 0xea, 0xb5, 0xe5, 0x8d, 0xef, 0xe9, 0xcd, 0x1e, 0xab,
+ 0x84, 0xed, 0x90, 0xa1, 0xc4, 0x24, 0x85, 0x0b, 0xc7, 0x18, 0xe8, 0xe0, 0x73,
+ 0xcd, 0x71, 0x30, 0xfd, 0xdb, 0x47, 0xad, 0x39, 0x8f, 0xf4, 0x1b, 0xe3, 0xe3,
+ 0x22, 0x7e, 0x4e, 0x0b, 0x51, 0x5d, 0xdb, 0x4b, 0xd0, 0x01, 0x76, 0xbf,
+ ]
+ ),
+ test_case!(
+ [
+ 0x11, 0x82, 0xce, 0xe5, 0x78, 0xce, 0x8e, 0xc7, 0x8d, 0x79, 0xb7, 0xbe, 0x18,
+ 0xac, 0x02, 0x60, 0xce, 0x98, 0x4b, 0xa8, 0xa3, 0xe6, 0x83, 0xee, 0x1f, 0x11,
+ 0x1a, 0xb8, 0xba, 0x5f, 0x83, 0x5b, 0x55, 0x7b, 0x2b, 0xe4, 0x97, 0x50, 0x69,
+ 0xa1, 0x62, 0x40, 0xf8, 0x59, 0xce, 0x03, 0xb6, 0x4a, 0x2f, 0xe6, 0xba, 0x71,
+ 0x90, 0xad, 0xa0, 0x34, 0xe3, 0x65, 0xc5, 0x90, 0x5c, 0x35, 0xbd, 0x63, 0x71,
+ 0x4f, 0xc4, 0xf6, 0x1e, 0xa7, 0x8f, 0x16, 0x34, 0x8c, 0x3d, 0x89, 0x5c, 0x0a,
+ 0x03, 0x5a, 0x29, 0x18, 0x30, 0x24, 0x1a, 0xfd, 0x03, 0xf1, 0x40, 0x05, 0xdf,
+ 0x3b, 0xd8, 0xa7, 0xb4, 0xfb, 0x5b, 0xc2, 0xf0, 0x6f, 0x8c, 0x16, 0x39, 0x1a,
+ 0x0f, 0x8e, 0x90, 0xc4, 0x1f, 0xdb, 0x10, 0xdd, 0x58, 0xaf, 0x4c, 0x23, 0x2b,
+ 0x86, 0xc6, 0xa7,
+ ],
+ [
+ 0x8f, 0xd6, 0x1c, 0x8e, 0xf7, 0xf3, 0xa5, 0x72, 0xc6, 0x2e, 0x28, 0x12, 0x79,
+ 0x35, 0xaf, 0x4c, 0x22, 0xfb, 0xcf, 0x51,
+ ],
+ [
+ 0x36, 0xcc, 0xa0, 0x29, 0xd4, 0x41, 0xb4, 0x5a, 0xd5, 0x38, 0x10, 0xc8, 0x6c,
+ 0xce, 0x07, 0x45, 0x91, 0x91, 0x52, 0x2b, 0xf4, 0x0e, 0x14, 0xf2, 0x69, 0xad,
+ 0xf4, 0x4d, 0x8e, 0xa7, 0xf7, 0x3f,
+ ],
+ [
+ 0x83, 0x95, 0x5a, 0xe5, 0x4b, 0xa7, 0x52, 0x97, 0xb1, 0xa9, 0x34, 0x8d, 0xcf,
+ 0xd3, 0x56, 0x66, 0x6e, 0x95, 0xe9, 0x54, 0x97, 0xec, 0xa3, 0xd4, 0xed, 0xe4,
+ 0x30, 0x71, 0x49, 0x82, 0xa3, 0x77, 0x5b, 0xcd, 0xd8, 0x44, 0xaf, 0x98, 0x0b,
+ 0x34, 0x6e, 0x8a, 0x3f, 0xbe, 0x7c, 0xaf, 0x35, 0x82,
+ ],
+ [
+ 0x06, 0xb0, 0xb7, 0xb4, 0xe0, 0x84, 0xf9, 0xd5, 0x7c, 0xb8, 0x37, 0x8b, 0x56,
+ 0x3d, 0xcb, 0x6e, 0xc9, 0xc9, 0xa5, 0xf7, 0x8d, 0x30, 0xea, 0x23, 0x67, 0x7b,
+ 0x65, 0x3e, 0x07, 0xef, 0x64, 0xee, 0x7e, 0x95, 0x23, 0x78, 0xea, 0x34, 0x5b,
+ 0x86, 0xc2, 0x49, 0x88, 0x93, 0x30, 0xa4, 0xa7, 0xd0, 0x1c, 0x0e, 0x94, 0xd9,
+ 0x35, 0x57, 0x73, 0x82, 0xd1, 0x9b, 0x6f, 0x5e, 0xa8, 0xd3, 0x30, 0x22,
+ ]
+ ),
+ test_case!(
+ [
+ 0xf2, 0xb5, 0xe5, 0xe6, 0x7c, 0x23, 0x99, 0x48, 0xa0, 0x21, 0x8f, 0xbd, 0x4c,
+ 0xe4, 0xbb, 0x16, 0x6c, 0xa3, 0x9d, 0x84, 0xf7, 0x5c, 0x8b, 0x20, 0x15, 0x95,
+ 0xf4, 0x81, 0x4d, 0x7a, 0x09, 0xa2, 0xd1, 0xdb, 0xbf, 0x0e, 0x09, 0x46, 0xfa,
+ 0xfa, 0xed, 0x1f, 0x36, 0xe6, 0x0f, 0xc4, 0x3c, 0x8c, 0xb7, 0x0d, 0x95, 0xc9,
+ 0xd8, 0x05, 0x0a, 0x44, 0x7c, 0x59, 0x8c, 0x43, 0x12, 0xf1, 0x80, 0xd4, 0xdb,
+ 0x6e, 0xc9, 0xc3, 0xa8, 0x99, 0xdd, 0x8b, 0xd9, 0x4e, 0xea, 0xff, 0x60, 0x52,
+ 0x11, 0xb5, 0x53, 0xee, 0x6f, 0x7d, 0x93, 0x68, 0x3a, 0x55, 0x71, 0x41, 0xcc,
+ 0xd0, 0x08, 0x05, 0xaa, 0x91, 0x12, 0x94, 0x98, 0x69, 0xac, 0xd2, 0x58, 0x2c,
+ 0x8e, 0x73, 0x04, 0x6e, 0xd0, 0xf0, 0xe3, 0x1b, 0x5d, 0xd1, 0x84, 0x81, 0x1d,
+ 0xa4, 0xd6, 0x26, 0xb8,
+ ],
+ [
+ 0xf5, 0x3c, 0x07, 0x5c, 0x04, 0xdc, 0x6c, 0xee, 0x71, 0xcd, 0x1c, 0xd4, 0xee,
+ 0x57, 0x69, 0x05, 0x21, 0x72, 0xc3, 0xad,
+ ],
+ [
+ 0xaf, 0x4c, 0x8f, 0xf9, 0x6b, 0xf4, 0xe7, 0xc7, 0x13, 0xff, 0x59, 0x35, 0x2b,
+ 0x51, 0x35, 0xa4, 0x8c, 0xf4, 0xca, 0xc3, 0xb1, 0x56, 0xc1, 0xce, 0x09, 0x48,
+ 0x7c, 0x70, 0xd4, 0x2c, 0x03, 0x38,
+ ],
+ [
+ 0xd5, 0xb5, 0xf4, 0x47, 0xa6, 0xe3, 0xb4, 0xf1, 0xd7, 0x66, 0x71, 0x27, 0x4e,
+ 0x7d, 0xc2, 0x07, 0x98, 0xfb, 0x3d, 0x72, 0x38, 0xce, 0xf1, 0xd5, 0xf0, 0x75,
+ 0x36, 0xc1, 0x5d, 0xde, 0x71, 0x56, 0x9b, 0x8d, 0x04, 0xd2, 0xc4, 0x0d, 0x17,
+ 0xfc, 0x8d, 0x8d, 0xa5, 0xc9, 0x6a, 0xac, 0x5b, 0xf9,
+ ],
+ [
+ 0x11, 0x4f, 0xeb, 0x01, 0xba, 0xe2, 0x8d, 0x03, 0xfd, 0x28, 0x56, 0x5c, 0x4d,
+ 0x29, 0x40, 0xdc, 0x57, 0xf6, 0x19, 0xbe, 0x98, 0x37, 0x70, 0xa0, 0x63, 0x07,
+ 0x06, 0x3a, 0x42, 0x68, 0x34, 0x55, 0x36, 0xf7, 0x0f, 0x12, 0x0d, 0x1e, 0x49,
+ 0xf3, 0x0d, 0x35, 0xa4, 0x27, 0x5a, 0xa4, 0xf6, 0x02, 0x57, 0x84, 0x48, 0xb4,
+ 0xfc, 0x39, 0xcb, 0x32, 0x34, 0xc7, 0x55, 0xec, 0xfb, 0xcf, 0x45, 0x6a,
+ ]
+ ),
+ test_case!(
+ [
+ 0xd2, 0x36, 0xf4, 0x62, 0x69, 0x1b, 0x68, 0x21, 0x7a, 0xc4, 0x6a, 0xf3, 0x0e,
+ 0x1d, 0x09, 0xb9, 0xb6, 0x64, 0xc4, 0x8c, 0x11, 0x5a, 0xf8, 0x7a, 0xcc, 0x0d,
+ 0x3a, 0x0e, 0xd8, 0x28, 0xb6, 0xb1, 0xd4, 0xcc, 0x3d, 0xa9, 0xa2, 0xf6, 0x4b,
+ 0xd7, 0xc9, 0x8b, 0xed, 0xc3, 0xcc, 0xde, 0x83, 0x6d, 0xfd, 0x53, 0x94, 0xd1,
+ 0xbe, 0xa8, 0x7a, 0xcc, 0x0b, 0x27, 0xd6, 0x4a, 0xfa, 0x38, 0x4c, 0x11, 0x9b,
+ 0xa1, 0x80, 0x9f, 0xc3, 0xfc, 0xcd, 0xb3, 0x92, 0x88, 0x06, 0xbf, 0x66, 0x26,
+ 0x55, 0xa6, 0x0e, 0x1b, 0x25, 0x9c, 0x2b, 0xf4, 0x9d, 0x50, 0xf0, 0x9a, 0x15,
+ 0xa9, 0x55, 0x5a, 0xe5, 0x0d, 0x02, 0x8c, 0xf3, 0x7d, 0x9d, 0x2c, 0xfc, 0x00,
+ 0xdb, 0xf0, 0x98, 0x0d, 0xec, 0x35, 0x14, 0x8c, 0xc6, 0xed, 0x14, 0xc7, 0x4e,
+ 0xe7, 0x16, 0xbe, 0xb5, 0x0a,
+ ],
+ [
+ 0x06, 0xa5, 0xff, 0xb3, 0x35, 0xd0, 0x97, 0xca, 0x04, 0x6c, 0xd9, 0xcf, 0x8e,
+ 0x1c, 0x99, 0x6b, 0x5f, 0xe4, 0x8e, 0x07,
+ ],
+ [
+ 0x62, 0x1a, 0xe4, 0xc7, 0x4e, 0x8e, 0x18, 0x91, 0x14, 0xa8, 0x8c, 0x01, 0x76,
+ 0x99, 0x4a, 0x85, 0x67, 0xc7, 0x41, 0x58, 0x05, 0xde, 0xf4, 0xaf, 0x65, 0x99,
+ 0x62, 0x44, 0xb3, 0x21, 0x4a, 0x22,
+ ],
+ [
+ 0xac, 0x59, 0x70, 0xe8, 0xb0, 0x53, 0xa7, 0x6f, 0xf6, 0x15, 0x6e, 0xb6, 0xb7,
+ 0x80, 0xfe, 0xea, 0x6f, 0x1d, 0xff, 0x25, 0x75, 0xd1, 0x80, 0x49, 0x46, 0xbc,
+ 0xcc, 0x36, 0xd2, 0xa9, 0x82, 0xdf, 0x72, 0x55, 0xc8, 0x9d, 0x7c, 0x80, 0x6e,
+ 0x1e, 0xf8, 0x6d, 0x55, 0x4b, 0x31, 0xbf, 0xd6, 0xfc,
+ ],
+ [
+ 0x11, 0x4f, 0x70, 0x33, 0x2f, 0xf7, 0x1c, 0xc8, 0xa6, 0x9c, 0x91, 0x72, 0x4b,
+ 0xbf, 0x1c, 0x4e, 0x2c, 0x61, 0x05, 0x79, 0x36, 0xea, 0xd8, 0x84, 0x11, 0x5a,
+ 0xb0, 0x1f, 0x98, 0x4c, 0xe1, 0x7d, 0x0b, 0xb6, 0x7b, 0xec, 0xbc, 0x0b, 0x91,
+ 0x40, 0x5d, 0x86, 0xe4, 0x28, 0x52, 0x2b, 0x62, 0x8c, 0xcf, 0x9d, 0x63, 0xe2,
+ 0xb1, 0xf3, 0x8a, 0xd7, 0x6d, 0x7b, 0x4f, 0xd9, 0x82, 0x28, 0x6d, 0x6c,
+ ]
+ ),
+ test_case!(
+ [
+ 0xf0, 0x31, 0x92, 0xdd, 0x53, 0xed, 0x8c, 0x16, 0xd8, 0x98, 0xf6, 0xd0, 0xf1,
+ 0x5c, 0xad, 0xff, 0xf0, 0x4b, 0x8e, 0x6f, 0xc9, 0x5c, 0xb7, 0xc3, 0x16, 0xa1,
+ 0x2e, 0x15, 0xd5, 0x4f, 0x52, 0x6f, 0xaf, 0x4c, 0x14, 0xfb, 0x09, 0x18, 0xf8,
+ 0xb7, 0x76, 0x71, 0x6c, 0xd4, 0x7c, 0xd5, 0x69, 0x06, 0x31, 0x1f, 0x45, 0xce,
+ 0x9d, 0x1c, 0xfc, 0x2e, 0x14, 0xbb, 0x42, 0x1c, 0x6c, 0x12, 0x9a, 0x1c, 0xb9,
+ 0xac, 0x03, 0x04, 0x27, 0xc4, 0x87, 0x84, 0x2d, 0x64, 0xb5, 0x33, 0x5c, 0xf1,
+ 0x8c, 0xdf, 0x4a, 0x64, 0x71, 0x9d, 0xff, 0x1c, 0xd2, 0x60, 0xcd, 0x69, 0x1b,
+ 0x22, 0x30, 0x7f, 0x5c, 0x3b, 0x93, 0x97, 0x7b, 0xab, 0x7c, 0x54, 0xc8, 0xfa,
+ 0x8b, 0xde, 0x24, 0x7a, 0x0d, 0x86, 0x44, 0x67, 0xb0, 0xde, 0x8e, 0xde, 0xfc,
+ 0xd7, 0x24, 0xa4, 0xe5, 0x2d, 0x74,
+ ],
+ [
+ 0xe6, 0xe4, 0x77, 0xb9, 0xd7, 0x69, 0x8f, 0x64, 0x36, 0x03, 0x8a, 0x41, 0xab,
+ 0x63, 0xe4, 0x8c, 0x12, 0x13, 0x77, 0x74,
+ ],
+ [
+ 0xba, 0xef, 0xe7, 0x1a, 0xc5, 0x1e, 0xe0, 0x9e, 0x72, 0x9d, 0xfb, 0x7a, 0xad,
+ 0x90, 0xb4, 0x7c, 0x66, 0xb4, 0x48, 0xcc, 0xdf, 0xc5, 0xa4, 0x04, 0x2e, 0x67,
+ 0xf3, 0x33, 0x82, 0x8b, 0xab, 0x47,
+ ],
+ [
+ 0x56, 0xab, 0x79, 0x45, 0x8b, 0x2a, 0x28, 0xa9, 0x02, 0xf1, 0x03, 0x08, 0xd0,
+ 0x95, 0x43, 0x97, 0x4d, 0x2f, 0x2f, 0x7b, 0xd3, 0x7a, 0x58, 0x9d, 0x2b, 0xca,
+ 0x77, 0x06, 0x81, 0xbd, 0xf0, 0x03, 0xef, 0x18, 0x96, 0x6b, 0xb6, 0xec, 0x76,
+ 0x92, 0x22, 0xd2, 0x20, 0x4d, 0x94, 0x16, 0xc7, 0x3f,
+ ],
+ [
+ 0xe5, 0x52, 0x60, 0x65, 0x88, 0x60, 0x2e, 0x87, 0x4a, 0xf6, 0xe6, 0x3b, 0x58,
+ 0x28, 0xa6, 0x98, 0x84, 0x5d, 0x6f, 0xe3, 0xbf, 0x6f, 0x4a, 0x4a, 0x86, 0xcd,
+ 0x49, 0xad, 0xcb, 0xe9, 0xbc, 0xf8, 0x79, 0x73, 0x64, 0x45, 0x99, 0x1f, 0xbe,
+ 0xd5, 0x69, 0x09, 0x44, 0xa5, 0xb8, 0x55, 0xae, 0x71, 0x63, 0x9c, 0x85, 0x8b,
+ 0xbe, 0x0a, 0xa9, 0x3e, 0xfd, 0xdb, 0xcd, 0xda, 0x03, 0xb8, 0xe6, 0xd8,
+ ]
+ ),
+ test_case!(
+ [
+ 0xf7, 0x9c, 0x30, 0x50, 0xb6, 0x40, 0xb4, 0x7c, 0x71, 0x25, 0x3a, 0xa3, 0xb5,
+ 0xf1, 0x5a, 0x26, 0x8c, 0xaf, 0x3c, 0xc3, 0xe5, 0x5d, 0x18, 0x85, 0x6d, 0xf5,
+ 0x37, 0x26, 0x8f, 0x64, 0x00, 0xd5, 0x1e, 0x90, 0xbe, 0x84, 0xc7, 0x56, 0xfa,
+ 0x9b, 0xcf, 0xc9, 0x9d, 0x5c, 0x50, 0x1b, 0x44, 0xbf, 0x63, 0x25, 0xbf, 0xe3,
+ 0x0d, 0xd9, 0xea, 0xd3, 0x97, 0xc2, 0xfd, 0xd7, 0x86, 0x61, 0xb7, 0xbd, 0x15,
+ 0x2f, 0xa8, 0x16, 0xe9, 0x2f, 0xca, 0x16, 0x41, 0x6b, 0xbb, 0x05, 0x59, 0xfa,
+ 0x84, 0xcb, 0xf6, 0x00, 0xc9, 0xb9, 0xc6, 0xe6, 0x3e, 0x52, 0x68, 0x83, 0x7c,
+ 0x99, 0x53, 0x2e, 0x14, 0x98, 0xcf, 0x16, 0xe3, 0x80, 0xb7, 0x3c, 0x3f, 0x00,
+ 0x1d, 0xe4, 0xd6, 0x6c, 0x5c, 0x0b, 0x5f, 0xe0, 0xa4, 0x8d, 0x89, 0x9d, 0x6a,
+ 0x44, 0xa0, 0x75, 0x73, 0x59, 0xbf, 0xce,
+ ],
+ [
+ 0x18, 0x12, 0x5f, 0xe5, 0xef, 0xac, 0x2e, 0xd0, 0x6e, 0x37, 0x28, 0xb1, 0xfd,
+ 0x34, 0xa2, 0xe7, 0xca, 0xcb, 0xac, 0xa9,
+ ],
+ [
+ 0x63, 0x79, 0x63, 0xe9, 0xed, 0xbb, 0x5c, 0xaa, 0xec, 0xe1, 0xf1, 0xd1, 0xe3,
+ 0x5c, 0xa9, 0x95, 0x60, 0xe1, 0x05, 0x4c, 0xc5, 0x56, 0x28, 0x2f, 0x99, 0xf3,
+ 0x14, 0xb6, 0x18, 0xcc, 0x4e, 0x30,
+ ],
+ [
+ 0xb1, 0xd0, 0xaf, 0xf6, 0xee, 0xbd, 0xde, 0x45, 0xd7, 0xfa, 0x0b, 0x9a, 0x10,
+ 0x3a, 0x78, 0xf8, 0xf0, 0xef, 0xdd, 0x24, 0x90, 0x7b, 0x3b, 0x25, 0x1a, 0x78,
+ 0x43, 0xc7, 0x17, 0x01, 0xbf, 0x01, 0x57, 0xaa, 0xfc, 0x61, 0x09, 0x53, 0xba,
+ 0x0c, 0x02, 0x3a, 0x99, 0x38, 0xb0, 0xd0, 0x71, 0x04,
+ ],
+ [
+ 0x02, 0xce, 0x26, 0x11, 0xb3, 0x4b, 0x1c, 0x3b, 0x1d, 0x62, 0xca, 0xcf, 0x17,
+ 0x07, 0xf5, 0xbd, 0x12, 0x60, 0xd0, 0x30, 0x89, 0xa9, 0xb4, 0x74, 0x5b, 0xb3,
+ 0xa3, 0x7d, 0xb8, 0xec, 0xdb, 0xd2, 0x1d, 0x00, 0x6a, 0x62, 0x50, 0x0f, 0x54,
+ 0xf4, 0x67, 0x8c, 0x47, 0x19, 0x0d, 0x02, 0x02, 0x0e, 0x22, 0x30, 0xd8, 0xcd,
+ 0x39, 0xd8, 0xa5, 0x4c, 0x2a, 0x32, 0x11, 0xfa, 0x3e, 0x09, 0x1e, 0xd0,
+ ]
+ ),
+ test_case!(
+ [
+ 0x18, 0x8d, 0xb6, 0x50, 0xe7, 0xc6, 0x52, 0x64, 0xd8, 0x2d, 0x85, 0xd3, 0x01,
+ 0x9c, 0xbd, 0xd1, 0xe9, 0xe8, 0x2d, 0x52, 0x13, 0xee, 0x20, 0x0c, 0x4d, 0x83,
+ 0xe0, 0x05, 0xd1, 0x9e, 0x52, 0x8a, 0xea, 0xe2, 0x7c, 0x3c, 0xa5, 0x4c, 0x92,
+ 0x94, 0x6a, 0x39, 0x0a, 0x2d, 0xf5, 0x35, 0x16, 0xc1, 0x89, 0xe8, 0x16, 0xc5,
+ 0x3e, 0x29, 0xe6, 0xc6, 0xa1, 0x9f, 0xcc, 0xb3, 0x13, 0x51, 0xa5, 0xec, 0xc2,
+ 0x91, 0x94, 0x42, 0x64, 0xcf, 0x1b, 0xba, 0x9e, 0xc3, 0x89, 0x96, 0x9a, 0x81,
+ 0x2d, 0xb5, 0x04, 0xb0, 0xe3, 0xb3, 0xaf, 0x70, 0x0a, 0x20, 0x87, 0xde, 0x2f,
+ 0x7c, 0x01, 0xaa, 0x05, 0xa0, 0xe2, 0x6f, 0xd8, 0x68, 0x48, 0x94, 0x93, 0xa1,
+ 0x77, 0xe8, 0xd3, 0x8d, 0x1c, 0x09, 0x54, 0x10, 0x17, 0x21, 0xee, 0x4d, 0xbd,
+ 0x3b, 0xfb, 0x1a, 0xb6, 0xd7, 0x53, 0x7f, 0xf2,
+ ],
+ [
+ 0xc1, 0xb6, 0xed, 0x84, 0x79, 0xda, 0xa9, 0xc2, 0x06, 0xf0, 0x9c, 0xbf, 0x85,
+ 0xaf, 0xed, 0x82, 0x1f, 0xd6, 0x97, 0x01,
+ ],
+ [
+ 0x80, 0x5d, 0xdf, 0x7f, 0x0c, 0xfb, 0x96, 0x44, 0x4f, 0x26, 0xe4, 0x87, 0xa0,
+ 0x55, 0x94, 0x25, 0x68, 0x4f, 0x2d, 0x55, 0x1f, 0x67, 0x03, 0x7a, 0xd0, 0xcd,
+ 0x32, 0x13, 0x49, 0x3b, 0x1f, 0x35,
+ ],
+ [
+ 0x8c, 0xa5, 0x66, 0x01, 0xe5, 0x6e, 0xd6, 0x2e, 0x5b, 0x59, 0x46, 0x25, 0xa2,
+ 0xbd, 0xfa, 0xc7, 0xac, 0xf6, 0x03, 0x0b, 0x3f, 0xa0, 0xe9, 0x1f, 0x37, 0xba,
+ 0xbe, 0x1b, 0x57, 0x0c, 0xf8, 0xca, 0xb6, 0x36, 0xf7, 0x9b, 0x51, 0xf7, 0xa8,
+ 0xa9, 0x77, 0x9e, 0x42, 0x61, 0xeb, 0x20, 0x60, 0x42,
+ ],
+ [
+ 0x60, 0xea, 0x72, 0x81, 0x0f, 0x3e, 0xd4, 0xf7, 0x36, 0x0b, 0xd5, 0x63, 0x14,
+ 0xb8, 0x66, 0xef, 0xb2, 0x26, 0xd8, 0x86, 0x0e, 0x7a, 0x03, 0xd0, 0xdf, 0x97,
+ 0x88, 0xd9, 0x0f, 0xbb, 0x49, 0xaa, 0xbb, 0x83, 0x77, 0xbc, 0x6c, 0x09, 0x0d,
+ 0xd8, 0xaa, 0xb8, 0x89, 0xcd, 0x27, 0x12, 0xb2, 0xe3, 0xbc, 0x73, 0x83, 0xf2,
+ 0x55, 0xaa, 0x78, 0xb1, 0x66, 0x0f, 0x9e, 0xcf, 0xf1, 0x02, 0x1d, 0x71,
+ ]
+ ),
+ test_case!(
+ [
+ 0xa1, 0xb5, 0x83, 0x1e, 0x1d, 0xb1, 0x48, 0x1e, 0x38, 0x07, 0x6d, 0x3c, 0x1f,
+ 0xa4, 0x1f, 0x32, 0x2c, 0xcc, 0x0e, 0xac, 0xa2, 0x98, 0x86, 0xad, 0x42, 0x49,
+ 0xa4, 0x7b, 0x66, 0x2f, 0x2a, 0xde, 0x40, 0xf6, 0xc1, 0x0f, 0xe4, 0xfe, 0x96,
+ 0x08, 0x7a, 0xb4, 0x98, 0x06, 0x38, 0x07, 0x51, 0x52, 0x0b, 0xe9, 0x4c, 0x87,
+ 0x6b, 0xa0, 0x3f, 0x5b, 0xe3, 0x7e, 0x95, 0xfc, 0xa3, 0xe9, 0xad, 0xf1, 0x0b,
+ 0x1c, 0xfd, 0x85, 0x26, 0x4f, 0xf6, 0x1e, 0x1c, 0xa3, 0x9c, 0x71, 0x50, 0x91,
+ 0x62, 0x69, 0x22, 0x35, 0x40, 0x11, 0xfc, 0x71, 0x62, 0xfd, 0xcc, 0xc1, 0xcd,
+ 0x2b, 0x69, 0x2f, 0x0f, 0x77, 0x7e, 0x61, 0x4a, 0xf2, 0x34, 0x1e, 0x73, 0x1a,
+ 0xa7, 0xb5, 0xaf, 0x2f, 0x34, 0xb9, 0xdf, 0x49, 0xd0, 0x9e, 0x50, 0x53, 0x52,
+ 0x22, 0x47, 0x4b, 0x98, 0x45, 0x1b, 0x04, 0x82, 0x80,
+ ],
+ [
+ 0xac, 0xc6, 0x74, 0x48, 0x75, 0xe7, 0x23, 0x48, 0x75, 0x67, 0x6d, 0x6d, 0x9e,
+ 0xc7, 0x56, 0x5b, 0x8b, 0x57, 0x7a, 0xeb,
+ ],
+ [
+ 0x6f, 0xcf, 0x39, 0x76, 0xc5, 0x67, 0xdf, 0x53, 0xa7, 0xcb, 0x68, 0x78, 0x5d,
+ 0xbb, 0xa1, 0x51, 0xdf, 0xe8, 0xdd, 0x3c, 0x53, 0xc6, 0xa7, 0xad, 0xcd, 0x22,
+ 0x42, 0x27, 0x17, 0x58, 0x81, 0x21,
+ ],
+ [
+ 0x48, 0x1e, 0x1d, 0x8d, 0xbd, 0xf1, 0x4c, 0x82, 0x2e, 0x3b, 0xcf, 0x93, 0xc2,
+ 0xcf, 0x59, 0xcc, 0xc3, 0x46, 0x64, 0x38, 0xa0, 0x75, 0x90, 0x8d, 0x18, 0xd2,
+ 0xb4, 0xb8, 0x37, 0x06, 0xd4, 0x47, 0x3f, 0x4f, 0xb9, 0xb0, 0x55, 0x7b, 0x27,
+ 0x4f, 0x7c, 0x79, 0xcf, 0xfa, 0x3b, 0x4f, 0x2b, 0xc5,
+ ],
+ [
+ 0xab, 0xb8, 0x26, 0x0a, 0x70, 0x30, 0x88, 0xbb, 0xbb, 0x7d, 0x33, 0xa9, 0x19,
+ 0x2d, 0x82, 0x80, 0x5b, 0x3b, 0x68, 0x7b, 0x44, 0xb1, 0x81, 0x8a, 0xc7, 0x6b,
+ 0xb1, 0x49, 0xf2, 0x22, 0x49, 0x31, 0x0c, 0xf9, 0xb7, 0x03, 0xe8, 0xa5, 0xcf,
+ 0xcc, 0xd9, 0xad, 0xfe, 0xb3, 0x1c, 0x16, 0x9a, 0x0c, 0x2a, 0xb0, 0x4a, 0xda,
+ 0xaf, 0x1b, 0xe8, 0xb4, 0x70, 0xa6, 0x05, 0x54, 0xc2, 0x69, 0x23, 0x01,
+ ]
+ ),
+ test_case!(
+ [
+ 0x4b, 0x27, 0xe8, 0xbb, 0xdd, 0x90, 0x84, 0x61, 0x55, 0x4d, 0x1b, 0xf9, 0xdb,
+ 0xb6, 0x0b, 0x9f, 0xb6, 0xd5, 0x71, 0x94, 0x2b, 0x33, 0x6a, 0x2e, 0xd6, 0xfb,
+ 0xe6, 0x2e, 0x79, 0xce, 0x6e, 0xfa, 0xb1, 0xe0, 0x66, 0x1e, 0xef, 0x1a, 0x37,
+ 0xa5, 0x69, 0x7f, 0x0b, 0x3b, 0xf0, 0x09, 0x02, 0x3e, 0x98, 0x86, 0x70, 0x6c,
+ 0x9c, 0x9b, 0x72, 0x2d, 0x12, 0x81, 0x84, 0xfb, 0xac, 0x83, 0x42, 0xf7, 0xb7,
+ 0x46, 0x53, 0x31, 0x2a, 0x40, 0xf9, 0x98, 0xae, 0x5b, 0x05, 0x88, 0xaf, 0xd6,
+ 0xc1, 0x8e, 0xb6, 0x6f, 0x59, 0x2c, 0xaa, 0x44, 0x54, 0x6c, 0xf8, 0x0e, 0x09,
+ 0x99, 0x61, 0xd6, 0xc7, 0x6b, 0xd0, 0xc0, 0x34, 0x10, 0x2b, 0x3f, 0x61, 0x58,
+ 0xb1, 0xad, 0x3d, 0xdf, 0x34, 0xea, 0x0d, 0xe5, 0x02, 0xda, 0x7c, 0xb5, 0xe6,
+ 0x98, 0xa5, 0x20, 0x52, 0xc0, 0xbc, 0xb9, 0x05, 0x77, 0x93,
+ ],
+ [
+ 0x01, 0xfb, 0xc4, 0xd0, 0x5e, 0x7d, 0x64, 0x44, 0xb8, 0x70, 0xf9, 0x64, 0x71,
+ 0xbc, 0x2a, 0xa3, 0x37, 0xc7, 0x99, 0xf8,
+ ],
+ [
+ 0xdf, 0x36, 0x1a, 0x31, 0xd1, 0x6a, 0x5f, 0xf9, 0x3c, 0x20, 0xa9, 0xc6, 0x18,
+ 0x80, 0xcc, 0x30, 0x30, 0x9c, 0x01, 0x4e, 0x2c, 0x08, 0xfd, 0x33, 0xf1, 0x48,
+ 0x66, 0x9e, 0x33, 0xe6, 0x36, 0xa3,
+ ],
+ [
+ 0x70, 0x83, 0xb7, 0xa3, 0xb7, 0x1c, 0x52, 0x64, 0xec, 0xb3, 0x63, 0xc2, 0xee,
+ 0xcb, 0xa0, 0x57, 0xb5, 0x37, 0xcd, 0xc7, 0xc7, 0xdd, 0xf8, 0x3b, 0x21, 0x14,
+ 0x84, 0x2a, 0x65, 0xbb, 0x84, 0x91, 0x36, 0xde, 0x8b, 0x21, 0x36, 0x27, 0x12,
+ 0xf1, 0x28, 0xc9, 0xc8, 0x8a, 0x74, 0xdd, 0x7f, 0xb1,
+ ],
+ [
+ 0x30, 0xd8, 0x56, 0xd2, 0xc6, 0x90, 0xa0, 0x53, 0x2d, 0x58, 0x6e, 0x21, 0x0c,
+ 0xbd, 0x92, 0x03, 0xda, 0x89, 0x75, 0x1c, 0x37, 0xd0, 0xda, 0x6d, 0xd1, 0x98,
+ 0x03, 0x80, 0x62, 0x93, 0xe2, 0xef, 0x4e, 0x77, 0xde, 0xa8, 0x9d, 0x4a, 0x63,
+ 0xef, 0xf0, 0x5e, 0x93, 0xcb, 0x39, 0xbf, 0x26, 0x73, 0xcb, 0x26, 0x98, 0xe5,
+ 0x64, 0x08, 0xff, 0x26, 0xcf, 0xfc, 0xa4, 0x4c, 0x88, 0x74, 0x5d, 0x95,
+ ]
+ ),
+ test_case!(
+ [
+ 0x1a, 0x55, 0xe0, 0xb6, 0x41, 0x24, 0x2a, 0xed, 0x58, 0x88, 0x73, 0xee, 0x88,
+ 0x47, 0x3a, 0x98, 0x9d, 0x09, 0xad, 0x14, 0x60, 0xf8, 0x67, 0xd5, 0x77, 0xc0,
+ 0xa1, 0x5c, 0xa0, 0xfa, 0xaf, 0xee, 0x3d, 0x8b, 0xdc, 0xf5, 0xe4, 0x9e, 0x08,
+ 0xdb, 0xdf, 0x57, 0x1a, 0xcb, 0x0b, 0xab, 0x71, 0x5f, 0xfc, 0xef, 0xd3, 0x5d,
+ 0x11, 0x5a, 0xbd, 0x65, 0x37, 0x6e, 0xa4, 0x98, 0x53, 0x85, 0x75, 0xe8, 0x96,
+ 0x72, 0x64, 0xbe, 0x34, 0x9c, 0x4e, 0x4f, 0x22, 0x31, 0x10, 0x00, 0xf6, 0x46,
+ 0x65, 0x8b, 0xdc, 0x9e, 0x33, 0x9d, 0x5d, 0xe9, 0xa0, 0xc3, 0x1b, 0x98, 0xf8,
+ 0x81, 0x99, 0xba, 0xaa, 0xe5, 0xff, 0x3c, 0x2a, 0xd7, 0xc9, 0x80, 0x3a, 0x34,
+ 0x98, 0x67, 0x0e, 0xb9, 0x2e, 0x42, 0xa9, 0x8e, 0x82, 0xc1, 0xcb, 0x54, 0x87,
+ 0x44, 0x9b, 0xbf, 0x5f, 0x45, 0x19, 0xa0, 0x43, 0xe2, 0xb3, 0x41,
+ ],
+ [
+ 0x81, 0xb5, 0x99, 0x54, 0xaf, 0x53, 0x79, 0xe9, 0x25, 0xb3, 0x20, 0xb5, 0x88,
+ 0x47, 0x1d, 0x99, 0x43, 0xad, 0x33, 0x61,
+ ],
+ [
+ 0x15, 0xd6, 0xec, 0x09, 0xb8, 0xdc, 0xdd, 0xd9, 0x25, 0x55, 0x84, 0xf1, 0x81,
+ 0xab, 0xdd, 0xf5, 0x62, 0x4f, 0x3e, 0x3f, 0x8e, 0x34, 0x19, 0x8f, 0x14, 0x85,
+ 0xed, 0xd3, 0xb7, 0xc1, 0x31, 0x54,
+ ],
+ [
+ 0x5a, 0xb0, 0x46, 0x17, 0x1b, 0x70, 0x20, 0x9c, 0xbc, 0x6c, 0x24, 0xfb, 0xd3,
+ 0x3e, 0x77, 0x3e, 0x52, 0x0c, 0x56, 0x75, 0x52, 0xa3, 0x12, 0x76, 0x69, 0xd3,
+ 0x0d, 0x38, 0x45, 0x41, 0x3c, 0x21, 0x86, 0xa8, 0x57, 0xba, 0xb5, 0xeb, 0x32,
+ 0x45, 0xec, 0x46, 0xd0, 0xa7, 0xcf, 0x5b, 0x17, 0x2c,
+ ],
+ [
+ 0x6c, 0x5d, 0x94, 0x61, 0x1e, 0xe6, 0xcb, 0xa0, 0xda, 0xcf, 0xcf, 0xca, 0x7c,
+ 0x40, 0xba, 0xb2, 0x97, 0x0f, 0x8c, 0xbc, 0xd3, 0x6e, 0x60, 0x04, 0xa5, 0x64,
+ 0x61, 0xa0, 0xd3, 0x7d, 0x8b, 0x0a, 0x56, 0x4d, 0x53, 0xad, 0x5f, 0xdc, 0x5c,
+ 0x09, 0x73, 0x29, 0x0d, 0xdd, 0xf5, 0x32, 0xc1, 0x1e, 0xec, 0xf2, 0x43, 0xc4,
+ 0xd0, 0x93, 0x20, 0x20, 0xed, 0xd0, 0xa7, 0x0d, 0xcb, 0x3e, 0x46, 0xe3,
+ ]
+ ),
+ ];
+ }
+}
diff --git a/src/insecure.rs b/src/insecure.rs
new file mode 100644
index 0000000..ef255b3
--- /dev/null
+++ b/src/insecure.rs
@@ -0,0 +1,22 @@
+// Copyright 2018 Google LLC
+//
+// Use of this source code is governed by an MIT-style
+// license that can be found in the LICENSE file or at
+// https://opensource.org/licenses/MIT.
+
+//! WARNING: INSECURE CRYPTOGRAPHIC OPERATIONS.
+//!
+//! This module contains cryptographic operations which are considered insecure.
+//! These operations should only be used for compatibility with legacy systems,
+//! but never in new systems!
+
+#![deprecated(note = "insecure cryptographic operations")]
+
+#[allow(deprecated)]
+pub use hash::insecure_sha1_digest::InsecureSha1Digest;
+#[allow(deprecated)]
+pub use hmac::insecure_hmac_sha1::InsecureHmacSha1;
+
+#[cfg(feature = "kdf")]
+#[allow(deprecated)]
+pub use kdf::insecure_pbkdf2_hmac_sha1::insecure_pbkdf2_hmac_sha1;
diff --git a/src/kdf.rs b/src/kdf.rs
new file mode 100644
index 0000000..0d48ee8
--- /dev/null
+++ b/src/kdf.rs
@@ -0,0 +1,136 @@
+// Copyright 2018 Google LLC
+//
+// Use of this source code is governed by an MIT-style
+// license that can be found in the LICENSE file or at
+// https://opensource.org/licenses/MIT.
+
+//! Key Derivation Functions (KDFs).
+//!
+//! KDFs are low-level primitives often used to construct higher-level
+//! protocols. Unless you're sure that this is what you need, you should
+//! probably be using something else. In particular:
+//! - If you need password verification, see the [`password`] module.
+//!
+//! [`password`]: ::password
+
+use std::num::NonZeroU32;
+
+use boringssl;
+use hash::Hasher;
+
+/// The PBKDF2 Key Derivation Function.
+///
+/// `pbkdf2` computes `iter` iterations of PBKDF2 of `password` and `salt`,
+/// using an HMAC based on the hash function `H`. It stores the result in
+/// `out_key`. Note that PBKDF2 can produce variable-length output, so it will
+/// always fill the entirety of `out_key` regardless of its length.
+///
+/// PBKDF2 is defined in RSA Security LLC's Public Key Cryptography Standards #5
+/// (PKCS #5) v2.0. For details, see [RFC 2898 Section 5.2].
+///
+/// # Security
+///
+/// While PBKDF2 can produce any amount of key output, the entropy of its output
+/// is bounded by the internal state. Be careful that the output key has enough
+/// entropy for your needs. See [RFC 2898 Appendix B.1] for a discussion on
+/// calculating the effective entropy of PBKDF2. Also remember that new attacks
+/// are sometimes discovered, and it is your responsibility to keep up with the
+/// latest attacks; RFC 2898's analysis may not be valid forever!
+///
+/// [RFC 2898 Section 5.2]: https://tools.ietf.org/html/rfc2898#section-5.2
+/// [RFC 2898 Appendix B.1]: https://tools.ietf.org/html/rfc2898#appendix-B.1
+#[must_use]
+pub fn pbkdf2<H: Hasher>(password: &[u8], salt: &[u8], iters: NonZeroU32, out_key: &mut [u8]) {
+ // PKCS5_PBKDF2_HMAC can only fail on OOM or if iters is 0.
+ boringssl::pkcs5_pbkdf2_hmac(password, salt, iters.get(), &H::evp_md(), out_key).unwrap();
+}
+
+#[cfg(feature = "insecure")]
+pub(crate) mod insecure_pbkdf2_hmac_sha1 {
+ use std::num::NonZeroU32;
+
+ #[allow(deprecated)]
+ use hash::InsecureSha1;
+ use kdf::pbkdf2;
+
+ /// INSECURE: The PBKDF2 Key Derivation Function over HMAC-SHA1.
+ ///
+ /// # Security
+ ///
+ /// PBKDF2-HMAC-SHA1 is considered insecure, and should only be used for
+ /// compatibility with legacy applications.
+ ///
+ /// # Behavior
+ ///
+ /// `pbkdf2_hmac_sha1` computes `iter` iterations of PBKDF2-HMAC-SHA1 of
+ /// `password` and `salt`. It stores the result in `out_key`.
+ ///
+ /// PBKDF2 is defined in RSA Security LLC's Public Key Cryptography
+ /// Standards #5 (PKCS #5) v2.0. For details, see [RFC 2898 Section 5.2].
+ ///
+ /// # Further Security Considerations
+ ///
+ /// While PBKDF2 can produce any amount of key output, the entropy of its
+ /// output is bounded by the internal state. Be careful that the output key
+ /// has enough entropy for your needs. See [RFC 2898 Appendix B.1] for a
+ /// discussion on calculating the effective entropy of PBKDF2, but keep in
+ /// mind that SHA-1's insecurities may affect this analysis! Also remember
+ /// that new attacks are sometimes discovered, and it is your responsibility
+ /// to keep up with the latest attacks; RFC 2898's analysis may not be valid
+ /// forever!
+ ///
+ /// [RFC 2898 Section 5.2]: https://tools.ietf.org/html/rfc2898#section-5.2
+ /// [RFC 2898 Appendix B.1]: https://tools.ietf.org/html/rfc2898#appendix-B.1
+ #[must_use]
+ #[deprecated(note = "PBKDF2-HMAC-SHA1 is considered insecure")]
+ pub fn insecure_pbkdf2_hmac_sha1(
+ password: &[u8], salt: &[u8], iters: NonZeroU32, out_key: &mut [u8],
+ ) {
+ #[allow(deprecated)]
+ pbkdf2::<InsecureSha1>(password, salt, iters, out_key)
+ }
+}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+ use hash::*;
+
+ #[test]
+ fn test_smoke() {
+ for password_len in 0..8 {
+ for salt_len in 0..8 {
+ for iters in 1..8 {
+ for out_key_len in 0..8 {
+ fn test<H: Hasher>(
+ password_len: usize, salt_len: usize, iters: u32, out_key_len: usize,
+ ) {
+ let password = [0, 1, 2, 3, 4, 5, 6, 7];
+ let salt = [0, 1, 2, 3, 4, 5, 6, 7];
+ let mut out_key_0 = [0; 8];
+ let mut out_key_1 = [0; 8];
+
+ pbkdf2::<H>(
+ &password[..password_len],
+ &salt[..salt_len],
+ NonZeroU32::new(iters).unwrap(),
+ &mut out_key_0[..out_key_len],
+ );
+ pbkdf2::<H>(
+ &password[..password_len],
+ &salt[..salt_len],
+ NonZeroU32::new(iters).unwrap(),
+ &mut out_key_1[..out_key_len],
+ );
+ assert_eq!(&out_key_0[..out_key_len], &out_key_1[..out_key_len]);
+ }
+
+ test::<Sha256>(password_len, salt_len, iters, out_key_len);
+ test::<Sha384>(password_len, salt_len, iters, out_key_len);
+ test::<Sha512>(password_len, salt_len, iters, out_key_len);
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/src/lib.rs b/src/lib.rs
new file mode 100644
index 0000000..468ee9b
--- /dev/null
+++ b/src/lib.rs
@@ -0,0 +1,167 @@
+// Copyright 2018 Google LLC
+//
+// Use of this source code is governed by an MIT-style
+// license that can be found in the LICENSE file or at
+// https://opensource.org/licenses/MIT.
+
+//! Cryptography in Rust.
+//!
+//! `mundane` is a Rust cryptography library backed by BoringSSL that is
+//! difficult to misuse, ergonomic, and performant (in that order).
+//!
+//! # Features
+//!
+//! By default, `mundane` provides only high-level cryptographic primitives.
+//! Unless you are implementing cryptographic protocols, these high-level
+//! primitives should be all you need. However, if you are sure that you need
+//! something lower level, `mundane` provides features to enable a number of
+//! different low level primitives.
+//!
+//! WARNING: Being low level, these primitives provide the programmer with more
+//! degrees of freedom. There are more conditions that the programmer must meet
+//! in order to guarantee security, and thus more ways for the programmer to
+//! shoot themself in the foot. Please only use these primitives if you're aware
+//! of the risks and are comfortable with the responsibility of using them
+//! correctly!
+//!
+//! **Features**
+//!
+//! | Name | Description |
+//! | ------------ | ------------------------ |
+//! | `kdf` | Key derivation functions |
+//! | `rand-bytes` | Generate random bytes |
+//!
+//! # Insecure Operations
+//!
+//! `mundane` supports one additional feature not listed in the previous
+//! section: `insecure`. This enables some cryptographic primitives which are
+//! today considered insecure. These should only be used for compatibility with
+//! legacy systems, but never in new systems! When the `insecure` feature is
+//! used, an `insecure` module is added to the crate root. All insecure
+//! primitives are exposed through this module.
+
+#![doc(html_root_url = "https://docs.rs/mundane/0.2.0")]
+#![deny(missing_docs)]
+#![deny(warnings)]
+#![feature(tool_lints)]
+#![allow(stable_features)]
+// just in case we forget to add #[forbid(unsafe_code)] on new module
+// definitions
+#![deny(unsafe_code)]
+
+#[macro_use]
+mod macros;
+
+// Forbid unsafe code except in the boringssl module.
+#[allow(unsafe_code)]
+mod boringssl;
+#[forbid(unsafe_code)]
+pub mod hash;
+#[forbid(unsafe_code)]
+pub mod hmac;
+#[cfg(feature = "insecure")]
+#[forbid(unsafe_code)]
+pub mod insecure;
+#[cfg(feature = "kdf")]
+#[forbid(unsafe_code)]
+pub mod kdf;
+#[forbid(unsafe_code)]
+pub mod password;
+#[forbid(unsafe_code)]
+pub mod public;
+#[forbid(unsafe_code)]
+mod util;
+
+use std::fmt::{self, Debug, Display, Formatter};
+
+use boringssl::BoringError;
+
+/// Reads cryptographically-secure random bytes.
+///
+/// This is a low-level primitive often used to construct higher-level
+/// protocols. Unless you're sure that this is what you need, you should
+/// probably be using something else. For example, all key types can be randomly
+/// generated using higher-level functions (e.g., [`EcPrivKey::generate`]),
+/// scrypt nonces are generated using the [`scrypt_generate`] function, etc.
+///
+/// [`EcPrivKey::generate`]: ::public::ec::EcPrivKey::generate
+/// [`scrypt_generate`]: ::password::scrypt::scrypt_generate
+#[cfg(feature = "rand-bytes")]
+pub fn rand_bytes(bytes: &mut [u8]) {
+ boringssl::rand_bytes(bytes);
+}
+
+/// Errors generated by this crate.
+///
+/// `Error` represents two types of errors: errors generated by BoringSSL, and
+/// errors generated by the Rust code in this crate. When printed (using either
+/// `Display` or `Debug`), BoringSSL errors are of the form `boringssl:
+/// <error>`, while errors generated by Rust code are of the form `<error>`.
+pub struct Error(ErrorInner);
+
+impl Error {
+ fn new(s: String) -> Error {
+ Error(ErrorInner::Mundane(s))
+ }
+}
+
+#[doc(hidden)]
+impl From<BoringError> for Error {
+ fn from(err: BoringError) -> Error {
+ Error(ErrorInner::Boring(err))
+ }
+}
+
+impl Display for Error {
+ fn fmt(&self, f: &mut Formatter) -> Result<(), fmt::Error> {
+ match &self.0 {
+ ErrorInner::Mundane(err) => write!(f, "{}", err),
+ ErrorInner::Boring(err) => write!(f, "boringssl: {}", err),
+ }
+ }
+}
+
+impl Debug for Error {
+ fn fmt(&self, f: &mut Formatter) -> Result<(), fmt::Error> {
+ match &self.0 {
+ ErrorInner::Mundane(err) => write!(f, "{}", err),
+
+ ErrorInner::Boring(err) => {
+ if err.stack_depth() == 1 {
+ // Either there was no stack trace, or the stack trace only
+ // contained a single frame. In either case, don't bother
+ // printing a preceding newline.
+ write!(f, "boringssl: {:?}", err)
+ } else {
+ // There's a multi-line stack trace, so print a preceding
+ // newline.
+ write!(f, "boringssl:\n{:?}", err)
+ }
+ }
+ }
+ }
+}
+
+impl std::error::Error for Error {}
+
+enum ErrorInner {
+ Mundane(String),
+ Boring(BoringError),
+}
+
+#[cfg(test)]
+mod tests {
+ use super::Error;
+
+ #[test]
+ fn test_send() {
+ fn assert_send<T: Send>() {}
+ assert_send::<Error>();
+ }
+
+ #[test]
+ fn test_sync() {
+ fn assert_sync<T: Sync>() {}
+ assert_sync::<Error>();
+ }
+}
diff --git a/src/macros.rs b/src/macros.rs
new file mode 100644
index 0000000..4c98d13
--- /dev/null
+++ b/src/macros.rs
@@ -0,0 +1,15 @@
+// Copyright 2018 Google LLC
+//
+// Use of this source code is governed by an MIT-style
+// license that can be found in the LICENSE file or at
+// https://opensource.org/licenses/MIT.
+
+macro_rules! impl_debug {
+ ($type:ty, $str:expr) => {
+ impl ::std::fmt::Debug for $type {
+ fn fmt(&self, f: &mut ::std::fmt::Formatter) -> Result<(), ::std::fmt::Error> {
+ write!(f, $str)
+ }
+ }
+ };
+}
diff --git a/src/password.rs b/src/password.rs
new file mode 100644
index 0000000..e89f0eb
--- /dev/null
+++ b/src/password.rs
@@ -0,0 +1,253 @@
+// Copyright 2018 Google LLC
+//
+// Use of this source code is governed by an MIT-style
+// license that can be found in the LICENSE file or at
+// https://opensource.org/licenses/MIT.
+
+//! Password verification.
+
+/// The scrypt password hashing function.
+///
+/// scrypt was originally proposed in [Stronger Key Derivation via Sequential
+/// Memory-Hard Functions] and standardized in [RFC 7914].
+///
+/// A note on terminology: scrypt is technically a key derivation function, and
+/// its output is thus technically a key. However, we expose it here only for
+/// the purposes of password verification, and thus we use the term "hash" to
+/// refer to its output.
+///
+/// [Stronger Key Derivation via Sequential Memory-Hard Functions]: https://www.tarsnap.com/scrypt/scrypt.pdf
+/// [RFC 7914]: https://tools.ietf.org/html/rfc7914
+pub mod scrypt {
+ use boringssl;
+
+ // NOTE(joshlf): These are both set to 32 bytes (256 bits). This is probably
+ // overkill (128 bits is probably fine, as the lack of entropy in password
+ // hashes usually comes primarily from the passwords themselves), but better
+ // safe than sorry. Note that this is consistent with the Go scrypt
+ // documentation examples (https://godoc.org/golang.org/x/crypto/scrypt),
+ // while Go's bcrypt implementation
+ // (https://godoc.org/golang.org/x/crypto/bcrypt) uses a 128-bit salt and a
+ // 192-bit hash.
+
+ /// The length of an scrypt hash.
+ ///
+ /// The value of this constant - 32 - is considered part of this API. Any
+ /// changes to it will be considered breaking changes.
+ pub const SCRYPT_HASH_LEN: usize = 32;
+ /// The length of an scrypt salt.
+ ///
+ /// The value of this constant - 32 - is considered part of this API. Any
+ /// changes to it will be considered breaking changes.
+ pub const SCRYPT_SALT_LEN: usize = 32;
+
+ /// Recommended parameters for a production server.
+ ///
+ /// `SCRYPT_PARAMS_SERVER` is an appropriate set of parameters for running
+ /// scrypt on a production server in 2018. It targets 100ms of execution
+ /// time per generation or verification.
+ ///
+ /// The value of this constant may be updated periodically in order to keep
+ /// up with hardware trends.
+ pub const SCRYPT_PARAMS_SERVER: ScryptParams = ScryptParams {
+ // NOTE(joshlf): These were taken from the Go scrypt implementation
+ // (https://godoc.org/golang.org/x/crypto/scrypt) on 08/14/2018.
+ N: 32768,
+ r: 8,
+ p: 1,
+ };
+
+ /// Recommended paramaters for a laptop.
+ ///
+ /// `SCRYPT_PARAMS_LAPTOP` is an appropriate set of parameters for running
+ /// scrypt on a medium-range laptop in 2018. It targets 100ms of execution
+ /// time per generation or verification.
+ ///
+ /// The value of this constant may be updated periodically in order to keep
+ /// up with hardware trends.
+ pub const SCRYPT_PARAMS_LAPTOP: ScryptParams = ScryptParams {
+ // NOTE(joshlf): These were benchmarked on my laptop (2017 MacBook Pro
+ // 13-inch with a 3.5 GHz Intel Core i7 - model identifier
+ // MacBookPro14,2) on 08/14/2018.
+ N: 16384,
+ r: 8,
+ p: 1,
+ };
+
+ /// The parameters to the scrypt function.
+ ///
+ /// These parameters determine how much effort will be required in order to
+ /// generate or verify an scrypt hash. "Effort" here refers to utilization
+ /// of of CPU, memory, and memory bandwidth. For more details on what these
+ /// parameters mean and their implications, see [The scrypt Parameters]. For
+ /// sane defaults, see the `SCRYPT_PARAMS_XXX` constants.
+ ///
+ /// [The scrypt Parameters]: https://blog.filippo.io/the-scrypt-parameters/
+ #[allow(non_snake_case)]
+ #[allow(missing_docs)]
+ #[derive(Debug, Copy, Clone)]
+ pub struct ScryptParams {
+ // NOTE(joshlf): These are private so that the user is forced to use one
+ // of our presets. If this turns out to be too brittle, it might be
+ // worth considering making these public, and simply discouraging
+ // (perhaps via a deprecation attribute) setting them directly.
+ N: u64,
+ r: u64,
+ p: u64,
+ }
+
+ impl ScryptParams {
+ /// Gets the parameter N.
+ #[allow(non_snake_case)]
+ #[must_use]
+ pub fn N(&self) -> u64 {
+ self.N
+ }
+
+ /// Gets the parameter r.
+ #[must_use]
+ pub fn r(&self) -> u64 {
+ self.r
+ }
+
+ /// Gets the parameter p.
+ #[must_use]
+ pub fn p(&self) -> u64 {
+ self.p
+ }
+ }
+
+ // Don't put a limit on the memory used by scrypt; it's too prone to
+ // failure. Instead, rely on choosing sane defaults for N, r, and p to
+ // ensure that we don't use too much memory.
+ const SCRYPT_MAX_MEM: usize = usize::max_value();
+
+ // TODO(joshlf): Provide a custom Debug impl for ScryptHash?
+
+ /// The output of the scrypt password hashing function.
+ #[must_use]
+ #[allow(non_snake_case)]
+ #[derive(Debug, Copy, Clone)]
+ pub struct ScryptHash {
+ hash: [u8; SCRYPT_HASH_LEN],
+ salt: [u8; SCRYPT_SALT_LEN],
+ params: ScryptParams,
+ }
+
+ impl ScryptHash {
+ // NOTE(joshlf): Normally, having three different parameters in a row of
+ // the same type would be dangerous because it's too easy to
+ // accidentally pass arguments in the wrong order. In this particular
+ // case, it's less of a concern because ScryptHash is only passed to the
+ // scrypt_verify function, so the worst that reordering these parameters
+ // can due is cause a valid hash to be mistakenly rejected as invalid.
+ // If this were a constructor on ScryptParams, which is passed as an
+ // argument to scrypt_generate, then a mistake might lead to
+ // accidentally generating a hash with weak security parameters, which
+ // would be a problem.
+
+ /// Constructs a new `ScryptHash`.
+ #[allow(non_snake_case)]
+ #[must_use]
+ pub fn new(
+ hash: [u8; SCRYPT_HASH_LEN], salt: [u8; SCRYPT_SALT_LEN], N: u64, r: u64, p: u64,
+ ) -> ScryptHash {
+ ScryptHash {
+ hash,
+ salt,
+ params: ScryptParams { N, r, p },
+ }
+ }
+
+ /// Gets the hash.
+ #[must_use]
+ pub fn hash(&self) -> &[u8; SCRYPT_HASH_LEN] {
+ &self.hash
+ }
+
+ /// Gets the salt.
+ #[must_use]
+ pub fn salt(&self) -> &[u8; SCRYPT_SALT_LEN] {
+ &self.salt
+ }
+
+ /// Gets the params.
+ #[must_use]
+ pub fn params(&self) -> ScryptParams {
+ self.params
+ }
+ }
+
+ /// Generates an scrypt hash for the given password.
+ ///
+ /// `scrypt_generate` uses scrypt to generate a hash for the given
+ /// `password` using the provided `params`.
+ #[must_use]
+ pub fn scrypt_generate(password: &[u8], params: &ScryptParams) -> ScryptHash {
+ let mut salt = [0u8; SCRYPT_SALT_LEN];
+ boringssl::rand_bytes(&mut salt);
+ let mut hash = [0u8; SCRYPT_HASH_LEN];
+ // Can only fail on OOM, max_mem exceeded (SCRYPT_MAX_MEM is max usize,
+ // so that definitely won't happen), or if any of the parameters are
+ // invalid (which would be a bug on our part). Thus, we unwrap.
+ boringssl::evp_pbe_scrypt(
+ password,
+ &salt,
+ params.N,
+ params.r,
+ params.p,
+ SCRYPT_MAX_MEM,
+ &mut hash,
+ ).unwrap();
+ ScryptHash {
+ hash,
+ salt,
+ params: *params,
+ }
+ }
+
+ /// Verifies a password against an scrypt hash.
+ ///
+ /// `scrypt_verify` verifies that `password` is the same password that was
+ /// used to generate `hash` using scrypt.
+ #[must_use]
+ pub fn scrypt_verify(password: &[u8], hash: &ScryptHash) -> bool {
+ let mut out_hash = [0u8; SCRYPT_HASH_LEN];
+ if boringssl::evp_pbe_scrypt(
+ password,
+ &hash.salt,
+ hash.params.N,
+ hash.params.r,
+ hash.params.p,
+ SCRYPT_MAX_MEM,
+ &mut out_hash,
+ ).is_err()
+ {
+ return false;
+ }
+ boringssl::crypto_memcmp(&out_hash, &hash.hash)
+ }
+
+ #[cfg(test)]
+ mod tests {
+ use super::*;
+
+ #[test]
+ fn test_scrypt() {
+ for _ in 0..16 {
+ let mut pass = [0; 128];
+ boringssl::rand_bytes(&mut pass);
+ // target 1 second of execution for this test on a laptop
+ let mut params = SCRYPT_PARAMS_LAPTOP;
+ params.N /= 4;
+ let hash = scrypt_generate(&pass, ¶ms);
+ assert!(
+ scrypt_verify(&pass, &hash),
+ "pass: {:?}, hash: {:?}",
+ &pass[..],
+ hash
+ );
+ }
+ }
+ }
+}
diff --git a/src/public/ec/curve.rs b/src/public/ec/curve.rs
new file mode 100644
index 0000000..f7e0da7
--- /dev/null
+++ b/src/public/ec/curve.rs
@@ -0,0 +1,144 @@
+// Copyright 2018 Google LLC
+//
+// Use of this source code is governed by an MIT-style
+// license that can be found in the LICENSE file or at
+// https://opensource.org/licenses/MIT.
+
+use std::borrow::Cow;
+use std::fmt::{self, Debug, Display, Formatter};
+use std::os::raw::c_int;
+
+use boringssl::{self, BoringError};
+use util::Sealed;
+use Error;
+
+/// The meat of the `Curve` trait.
+///
+/// We put the meat of the trait - an inner `Curve` trait which actually has
+/// methods on it - in a separate, private module because we don't want these
+/// methods to be visible to users.
+mod inner {
+ use Error;
+
+ use boringssl::{self, CRef};
+ use util::Sealed;
+
+ /// An elliptic curve.
+ ///
+ /// `PCurve` is implemented by `P256`, `P384`, `P521`.
+ pub trait PCurve: Sized + Sealed {
+ /// Returns this curve's NID.
+ ///
+ /// Callers are allowed to assume that this NID is a valid one, and are
+ /// allowed to panic if it is not.
+ fn nid() -> i32;
+
+ /// Returns the group named by `Self::nid()`.
+ fn group() -> CRef<'static, boringssl::EC_GROUP> {
+ CRef::ec_group_new_by_curve_name(Self::nid()).unwrap()
+ }
+
+ /// Validate that an `EC_GROUP` is matches this group.
+ ///
+ /// If `group` is not equal to the curve's group, `from_group` returns
+ /// an error.
+ fn validate_group(group: CRef<boringssl::EC_GROUP>) -> Result<(), Error>;
+ }
+}
+
+/// A NIST P elliptic curve.
+///
+/// `PCurve` is implemented by [`P256`], [`P384`], and [`P521`]. The P-224 curve
+/// is considered insecure, and thus is not supported.
+///
+/// The P curves are defined by NIST and are used in the ECDSA and ECDH
+/// algorithms.
+///
+/// [`P256`]: ::public::ec::P256
+/// [`P384`]: ::public::ec::P384
+/// [`P521`]: ::public::ec::P521
+pub trait PCurve: Sized + Copy + Clone + Default + Display + Debug + self::inner::PCurve {}
+
+/// The P-256 curve.
+#[derive(Copy, Clone, Default, Debug, Eq, PartialEq, Hash)]
+pub struct P256;
+/// The P-384 curve.
+#[derive(Copy, Clone, Default, Debug, Eq, PartialEq, Hash)]
+pub struct P384;
+/// The P-521 curve.
+#[derive(Copy, Clone, Default, Debug, Eq, PartialEq, Hash)]
+pub struct P521;
+
+impl Display for P256 {
+ fn fmt(&self, f: &mut Formatter) -> Result<(), fmt::Error> {
+ write!(f, "P-256")
+ }
+}
+impl Display for P384 {
+ fn fmt(&self, f: &mut Formatter) -> Result<(), fmt::Error> {
+ write!(f, "P-384")
+ }
+}
+impl Display for P521 {
+ fn fmt(&self, f: &mut Formatter) -> Result<(), fmt::Error> {
+ write!(f, "P-521")
+ }
+}
+
+const NID_P256: i32 = boringssl::NID_X9_62_prime256v1 as i32;
+const NID_P384: i32 = boringssl::NID_secp384r1 as i32;
+const NID_P521: i32 = boringssl::NID_secp521r1 as i32;
+
+macro_rules! impl_curve {
+ ($name:ident, $str:expr, $nid:ident) => {
+ impl self::inner::PCurve for $name {
+ fn nid() -> i32 {
+ $nid
+ }
+ fn validate_group(group: boringssl::CRef<boringssl::EC_GROUP>) -> Result<(), ::Error> {
+ let nid = group.ec_group_get_curve_name();
+ if nid != $nid {
+ return Err(::Error::new(format!(
+ concat!("unexpected curve: got {}; want ", $str),
+ nid_name(nid).unwrap(),
+ )));
+ }
+ Ok(())
+ }
+ }
+
+ impl Sealed for $name {}
+ impl PCurve for $name {}
+ };
+}
+
+impl_curve!(P256, "P-256", NID_P256);
+impl_curve!(P384, "P-384", NID_P384);
+impl_curve!(P521, "P-521", NID_P521);
+
+/// A dynamic representation of a curve.
+pub enum CurveKind {
+ P256,
+ P384,
+ P521,
+}
+
+impl CurveKind {
+ /// Get the `CurveKind` associated with a NID.
+ pub fn from_nid(nid: i32) -> Result<CurveKind, Error> {
+ match nid {
+ self::NID_P256 => Ok(CurveKind::P256),
+ self::NID_P384 => Ok(CurveKind::P384),
+ self::NID_P521 => Ok(CurveKind::P521),
+ _ => Err(Error::new(format!(
+ "unsupported curve: {}",
+ nid_name(nid).unwrap()
+ ))),
+ }
+ }
+}
+
+// NOTE: Can only return an error due to an unknown NID
+fn nid_name(nid: c_int) -> Result<Cow<'static, str>, BoringError> {
+ Ok(boringssl::ec_curve_nid2nist(nid)?.to_string_lossy())
+}
diff --git a/src/public/ec/mod.rs b/src/public/ec/mod.rs
new file mode 100644
index 0000000..93a725a
--- /dev/null
+++ b/src/public/ec/mod.rs
@@ -0,0 +1,726 @@
+// Copyright 2018 Google LLC
+//
+// Use of this source code is governed by an MIT-style
+// license that can be found in the LICENSE file or at
+// https://opensource.org/licenses/MIT.
+
+//! Elliptic Curve-based cryptographic algorithms over NIST P curves.
+//!
+//! This module only supports elliptic curve cryptography over NIST's P curves,
+//! defined in FIPS 186-3. These are the P-256, P-384, and P-521 curves (P-224
+//! is considered insecure, and thus is not supported). The ECDSA and ECDH
+//! algorithms are both defined over P curves, and so are exposed in this
+//! module.
+//!
+//! Other elliptic curve algorithms on non-P curves live in other modules (e.g.,
+//! operations on the Edwards 25519 curve live in the [`ed25519`] module).
+//!
+//! [`ed25519`]: ::public::ed25519
+
+mod curve;
+
+pub use public::ec::curve::{PCurve, P256, P384, P521};
+
+use std::fmt::{self, Debug, Formatter};
+
+use boringssl::{CHeapWrapper, CStackWrapper};
+use public::ec::curve::CurveKind;
+use public::ec::inner::EcKey;
+use public::{inner::DerKey, DerPrivateKey, DerPublicKey, PrivateKey, PublicKey};
+use util::Sealed;
+use Error;
+
+mod inner {
+ use std::marker::PhantomData;
+
+ use boringssl::{self, BoringError, CHeapWrapper, CStackWrapper};
+ use public::ec::curve::PCurve;
+ use public::inner::BoringDerKey;
+ use Error;
+
+ // A convenience wrapper around boringssl::EC_KEY.
+ //
+ // EcKey maintains the following invariants:
+ // - The key is valid.
+ // - The key is on the curve C.
+ //
+ // This is marked pub and put in this (non-public) module so that using it in impls of
+ // the Key trait don't result in public-in-private errors.
+ #[derive(Clone)]
+ pub struct EcKey<C: PCurve> {
+ pub key: CHeapWrapper<boringssl::EC_KEY>,
+ _marker: PhantomData<C>,
+ }
+
+ impl<C: PCurve> EcKey<C> {
+ pub fn generate() -> Result<EcKey<C>, BoringError> {
+ let mut key = CHeapWrapper::default();
+ // EC_KEY_set_group only errors if there's already a group set
+ key.ec_key_set_group(&C::group()).unwrap();
+ key.ec_key_generate_key()?;
+ Ok(EcKey {
+ key,
+ _marker: PhantomData,
+ })
+ }
+
+ /// Creates an `EcKey` from a BoringSSL `EC_KEY`.
+ ///
+ /// `from_EC_KEY` validates that `key`'s curve is `C`.
+ ///
+ /// # Panics
+ ///
+ /// `from_EC_KEY` panics if `key`'s group is not set.
+ #[allow(non_snake_case)]
+ pub fn from_EC_KEY(key: CHeapWrapper<boringssl::EC_KEY>) -> Result<EcKey<C>, Error> {
+ // ec_key_get0_group returns the EC_KEY's internal group pointer,
+ // which is guaranteed to be set by the caller.
+ C::validate_group(key.ec_key_get0_group().unwrap())?;
+ Ok(EcKey {
+ key,
+ _marker: PhantomData,
+ })
+ }
+ }
+
+ impl<C: PCurve> BoringDerKey for EcKey<C> {
+ fn pkey_assign(&self, pkey: &mut CHeapWrapper<boringssl::EVP_PKEY>) {
+ pkey.evp_pkey_assign_ec_key(self.key.clone())
+ }
+
+ // NOTE: panics if the key is an EC key and doesn't have a group set
+ // (due to EcKey::from_EC_KEY)
+ fn pkey_get(pkey: &mut CHeapWrapper<boringssl::EVP_PKEY>) -> Result<Self, Error> {
+ let key = pkey.evp_pkey_get1_ec_key()?;
+ EcKey::from_EC_KEY(key)
+ }
+
+ fn parse_private_key(cbs: &mut CStackWrapper<boringssl::CBS>) -> Result<EcKey<C>, Error> {
+ // The last argument is a group. If it's not None, then it is either
+ // used as the group or, if the DER encoding also contains a group,
+ // the encoded group is validated against the group passed as an
+ // argument. Note that this validation is mostly redundant - similar
+ // validation is performed in EcKey::from_EC_KEY - however, it's not
+ // fully redundant, since it allows keys to be parsed which have no
+ // group.
+ let key = CHeapWrapper::ec_key_parse_private_key(cbs, Some(C::group()))?;
+ EcKey::from_EC_KEY(key)
+ }
+
+ fn marshal_private_key(
+ &self, cbb: &mut CStackWrapper<boringssl::CBB>,
+ ) -> Result<(), Error> {
+ self.key.ec_key_marshal_private_key(cbb).map_err(From::from)
+ }
+ }
+
+ #[cfg(test)]
+ mod tests {
+ use std::mem;
+
+ use super::*;
+ use public::ec::{P256, P384, P521};
+
+ #[test]
+ fn test_refcount() {
+ fn test<C: PCurve>() {
+ let key = EcKey::<C>::generate().unwrap();
+ for i in 0..8 {
+ // make i clones and then free them all
+ let mut keys = Vec::new();
+ for _ in 0..i {
+ keys.push(key.clone());
+ }
+ mem::drop(keys);
+ }
+ mem::drop(key);
+ }
+
+ test::<P256>();
+ test::<P384>();
+ test::<P521>();
+ }
+ }
+}
+
+/// An elliptic curve public key over a P curve.
+///
+/// `EcPubKey` is a public key over the curve `C`.
+pub struct EcPubKey<C: PCurve> {
+ inner: EcKey<C>,
+}
+
+impl<C: PCurve> Sealed for EcPubKey<C> {}
+impl<C: PCurve> DerPublicKey for EcPubKey<C> {}
+
+impl<C: PCurve> DerKey for EcPubKey<C> {
+ type Boring = EcKey<C>;
+ fn boring(&self) -> &EcKey<C> {
+ &self.inner
+ }
+ fn from_boring(inner: EcKey<C>) -> EcPubKey<C> {
+ EcPubKey { inner }
+ }
+}
+
+impl<C: PCurve> PublicKey for EcPubKey<C> {
+ type Private = EcPrivKey<C>;
+}
+
+impl<C: PCurve> Debug for EcPubKey<C> {
+ fn fmt(&self, f: &mut Formatter) -> Result<(), fmt::Error> {
+ write!(f, "EcPubKey")
+ }
+}
+
+/// An elliptic curve private key over a P curve.
+///
+/// `EcPrivKey` is a private key over the curve `C`.
+pub struct EcPrivKey<C: PCurve> {
+ inner: EcKey<C>,
+}
+
+impl<C: PCurve> EcPrivKey<C> {
+ /// Generates a new private key.
+ #[must_use]
+ pub fn generate() -> Result<EcPrivKey<C>, Error> {
+ Ok(EcPrivKey {
+ inner: EcKey::generate()?,
+ })
+ }
+}
+
+impl<C: PCurve> Sealed for EcPrivKey<C> {}
+impl<C: PCurve> DerPrivateKey for EcPrivKey<C> {}
+
+impl<C: PCurve> DerKey for EcPrivKey<C> {
+ type Boring = EcKey<C>;
+ fn boring(&self) -> &EcKey<C> {
+ &self.inner
+ }
+ fn from_boring(inner: EcKey<C>) -> EcPrivKey<C> {
+ EcPrivKey { inner }
+ }
+}
+
+impl<C: PCurve> PrivateKey for EcPrivKey<C> {
+ type Public = EcPubKey<C>;
+
+ fn public(&self) -> EcPubKey<C> {
+ EcPubKey {
+ inner: self.inner.clone(),
+ }
+ }
+}
+
+impl<C: PCurve> Debug for EcPrivKey<C> {
+ fn fmt(&self, f: &mut Formatter) -> Result<(), fmt::Error> {
+ write!(f, "EcPrivKey")
+ }
+}
+
+/// An elliptic curve public key whose curve is unknown at compile time.
+///
+/// An `EcPubKeyAnyCurve` is an enum of [`EcPubKey`]s over the three supported
+/// curves. It is returned from [`parse_public_key_der_any_curve`].
+#[allow(missing_docs)]
+#[derive(Debug)]
+pub enum EcPubKeyAnyCurve {
+ P256(EcPubKey<P256>),
+ P384(EcPubKey<P384>),
+ P521(EcPubKey<P521>),
+}
+
+/// An elliptic curve private key whose curve is unknown at compile time.
+///
+/// An `EcPrivKeyAnyCurve` is an enum of [`EcPrivKey`]s over the three supported
+/// curves. It is returned from [`parse_private_key_der_any_curve`].
+#[allow(missing_docs)]
+#[derive(Debug)]
+pub enum EcPrivKeyAnyCurve {
+ P256(EcPrivKey<P256>),
+ P384(EcPrivKey<P384>),
+ P521(EcPrivKey<P521>),
+}
+
+impl EcPrivKeyAnyCurve {
+ /// Gets the public key corresponding to this private key.
+ #[must_use]
+ pub fn public(&self) -> EcPubKeyAnyCurve {
+ match self {
+ EcPrivKeyAnyCurve::P256(key) => EcPubKeyAnyCurve::P256(key.public()),
+ EcPrivKeyAnyCurve::P384(key) => EcPubKeyAnyCurve::P384(key.public()),
+ EcPrivKeyAnyCurve::P521(key) => EcPubKeyAnyCurve::P521(key.public()),
+ }
+ }
+}
+
+/// Parses a public key in DER format with any curve.
+///
+/// `parse_public_key_der_any_curve` is like [`parse_public_key_der`], but it
+/// accepts any [`PCurve`] rather than a particular, static curve.
+///
+/// Since `parse_public_key_der` takes a [`PublicKey`] type argument, and
+/// [`EcPubKey`] requires a static [`PCurve`] type parameter,
+/// `parse_public_key_der` can only be called when the curve is known ahead of
+/// time. `parse_public_key_der_any_curve`, on the other hand, accepts any
+/// curve. It returns an [`EcPubKeyAnyCurve`], which is an enum of keys over the
+/// three supported curves.
+///
+/// Because the curve is not known statically, one must be specified in the DER
+/// input.
+///
+/// [`parse_public_key_der`]: ::public::parse_public_key_der
+/// [`PublicKey`]: ::public::PublicKey
+#[must_use]
+pub fn parse_public_key_der_any_curve(bytes: &[u8]) -> Result<EcPubKeyAnyCurve, Error> {
+ CStackWrapper::cbs_with_temp_buffer(bytes, |cbs| {
+ let mut evp_pkey = CHeapWrapper::evp_parse_public_key(cbs)?;
+ let key = evp_pkey.evp_pkey_get1_ec_key()?;
+ if cbs.cbs_len() > 0 {
+ return Err(Error::new("malformed DER input".to_string()));
+ }
+
+ // EVP_parse_public_key guarantees that the returned key has its group
+ // set, so this unwrap is safe.
+ let group = key.ec_key_get0_group().unwrap();
+ Ok(
+ match CurveKind::from_nid(group.ec_group_get_curve_name())? {
+ CurveKind::P256 => EcPubKeyAnyCurve::P256(EcPubKey {
+ inner: EcKey::from_EC_KEY(key.clone())?,
+ }),
+ CurveKind::P384 => EcPubKeyAnyCurve::P384(EcPubKey {
+ inner: EcKey::from_EC_KEY(key.clone())?,
+ }),
+ CurveKind::P521 => EcPubKeyAnyCurve::P521(EcPubKey {
+ inner: EcKey::from_EC_KEY(key.clone())?,
+ }),
+ },
+ )
+ })
+}
+
+/// Parses a private key in DER format with any curve.
+///
+/// `parse_private_key_der_any_curve` is like [`parse_private_key_der`], but it
+/// accepts any [`PCurve`] rather than a particular, static curve.
+///
+/// Since `parse_private_key_der` takes a [`PrivateKey`] type argument, and
+/// [`EcPrivKey`] requires a static [`PCurve`] type parameter,
+/// `parse_private_key_der` can only be called when the curve is known ahead of
+/// time. `parse_private_key_der_any_curve`, on the other hand, accepts any
+/// curve. It returns an [`EcPrivKeyAnyCurve`], which is an enum of keys over
+/// the three supported curves.
+///
+/// Because the curve is not known statically, one must be specified in the DER
+/// input.
+///
+/// [`parse_private_key_der`]: ::public::parse_private_key_der
+/// [`PrivateKey`]: ::public::PrivateKey
+#[must_use]
+pub fn parse_private_key_der_any_curve(bytes: &[u8]) -> Result<EcPrivKeyAnyCurve, Error> {
+ CStackWrapper::cbs_with_temp_buffer(bytes, |cbs| {
+ // The last argument is a group. Since it's None,
+ // EC_KEY_parse_private_key will require the DER to name the group.
+ let key = CHeapWrapper::ec_key_parse_private_key(cbs, None)?;
+ if cbs.cbs_len() > 0 {
+ return Err(Error::new("malformed DER input".to_string()));
+ }
+
+ // TODO(joshlf): Add documentation to EC_KEY_parse_private_key
+ // guaranteeing that the internal group pointer is set.
+ let group = key.ec_key_get0_group().unwrap();
+ Ok(
+ match CurveKind::from_nid(group.ec_group_get_curve_name())? {
+ CurveKind::P256 => EcPrivKeyAnyCurve::P256(EcPrivKey {
+ inner: EcKey::from_EC_KEY(key.clone())?,
+ }),
+ CurveKind::P384 => EcPrivKeyAnyCurve::P384(EcPrivKey {
+ inner: EcKey::from_EC_KEY(key.clone())?,
+ }),
+ CurveKind::P521 => EcPrivKeyAnyCurve::P521(EcPrivKey {
+ inner: EcKey::from_EC_KEY(key.clone())?,
+ }),
+ },
+ )
+ })
+}
+
+/// The Elliptic Curve Digital Signature Algorithm.
+pub mod ecdsa {
+ use std::fmt::{self, Debug, Formatter};
+ use std::marker::PhantomData;
+
+ use boringssl;
+ use hash::{inner::Digest, Hasher, Sha256, Sha384};
+ use public::{ec::{EcPrivKey, EcPubKey, PCurve, P256, P384, P521},
+ Signature};
+ use util::Sealed;
+ use Error;
+
+ /// A hash function which is compatible with ECDSA signatures over the curve
+ /// `C`.
+ ///
+ /// An ECDSA signature is constructed by hashing the message and then
+ /// signing the resulting digest. However, EC keys over certain curves may
+ /// not be compatible with all hashes. In particular, some digests may be
+ /// too long (in number of bytes) and thus not correspond to a point on the
+ /// curve. `EcdsaHash<C>` is implemented by all hash functions whose digests
+ /// are compatible with ECDSA signatures over the curve `C`.
+ pub trait EcdsaHash<C: PCurve>: Sealed {}
+
+ impl EcdsaHash<P256> for Sha256 {}
+ impl EcdsaHash<P384> for Sha256 {}
+ impl EcdsaHash<P384> for Sha384 {}
+ impl EcdsaHash<P521> for Sha256 {}
+ impl EcdsaHash<P521> for Sha384 {}
+
+ // The maximum length of an ECDSA signature over P-521. Since this isn't
+ // exposed in the API, we can increase later if we add support for curves
+ // with larger signatures.
+ //
+ // This was calculated with the following equation, which is thanks to
+ // agl@google.com:
+ //
+ // r = s = (521 + 7)/8 # Bytes to store the integers r and s
+ // = 66
+ // DER encoded bytes = (1 # type byte 0x02
+ // + 1 # length byte
+ // + 1 # possible 0 padding
+ // + 66) * 2 # one for each of r and s
+ // + 1 # ASN.1 SEQUENCE type byte
+ // + 2 # outer length
+ // = 141
+ const MAX_SIGNATURE_LEN: usize = 141;
+
+ /// A DER-encoded ECDSA signature.
+ #[must_use]
+ pub struct EcdsaSignature<C: PCurve, H: Hasher + EcdsaHash<C>> {
+ bytes: [u8; MAX_SIGNATURE_LEN],
+ // Invariant: len is in [0; MAX_SIGNATURE_LEN). If len is 0, it
+ // indicates an invalid signature. Invalid signatures can be produced
+ // when a caller invokes from_bytes with a byte slice longer than
+ // MAX_SIGNATURE_LEN. Such signatures cannot possibly have been
+ // generated by an ECDSA signature over any of the curves we support,
+ // and so it could not possibly be valid. In other words, it would never
+ // be correct for ecdsa_verify to return true when invoked on such a
+ // signature.
+ //
+ // However, if we were to simply truncate the byte slice and store a
+ // subset of it, then we might open ourselves up to attacks in which an
+ // attacker induces a mismatch between the signature that the caller
+ // /thinks/ is being verified and the signature that is /actually/ being
+ // verified. Thus, it's important that we always reject such signatures.
+ //
+ // Finally, it's OK for us to use 0 as the sentinal value to mean
+ // "invalid signature" because ECDSA can never produce a 0-byte
+ // signature. Thus, we will never produce a 0-byte signature from
+ // ecdsa_sign, and similarly, if the caller constructs a 0-byte
+ // signature using from_bytes, it's correct for us to treat it as
+ // invalid.
+ len: usize,
+ _marker: PhantomData<(C, H)>,
+ }
+
+ impl<C: PCurve, H: Hasher + EcdsaHash<C>> EcdsaSignature<C, H> {
+ /// Constructs an `EcdsaSignature` from raw bytes.
+ #[must_use]
+ pub fn from_bytes(bytes: &[u8]) -> EcdsaSignature<C, H> {
+ if bytes.len() > MAX_SIGNATURE_LEN {
+ // see comment on the len field for why we do this
+ return Self::empty();
+ }
+ let mut ret = Self::empty();
+ (&mut ret.bytes[..bytes.len()]).copy_from_slice(bytes);
+ ret.len = bytes.len();
+ ret
+ }
+
+ // TODO(joshlf): Once we have const generics, have this return a
+ // fixed-length array.
+
+ /// Gets the raw bytes of this `EcdsaSignature`.
+ #[must_use]
+ pub fn bytes(&self) -> &[u8] {
+ &self.bytes[..self.len]
+ }
+
+ fn is_valid(&self) -> bool {
+ self.len != 0
+ }
+
+ fn empty() -> EcdsaSignature<C, H> {
+ EcdsaSignature {
+ bytes: [0u8; MAX_SIGNATURE_LEN],
+ len: 0,
+ _marker: PhantomData,
+ }
+ }
+ }
+
+ impl<C: PCurve, H: Hasher + EcdsaHash<C>> Sealed for EcdsaSignature<C, H> {}
+ impl<C: PCurve, H: Hasher + EcdsaHash<C>> Signature for EcdsaSignature<C, H> {
+ type PrivateKey = EcPrivKey<C>;
+
+ fn sign(key: &EcPrivKey<C>, message: &[u8]) -> Result<EcdsaSignature<C, H>, Error> {
+ let digest = H::hash(message);
+ let mut sig = EcdsaSignature::empty();
+ sig.len = boringssl::ecdsa_sign(digest.as_ref(), &mut sig.bytes[..], &key.inner.key)?;
+ Ok(sig)
+ }
+
+ fn verify(&self, key: &EcPubKey<C>, message: &[u8]) -> bool {
+ if !self.is_valid() {
+ // see comment on EcdsaSignature::len for why we do this
+ return false;
+ }
+ let digest = H::hash(message);
+ boringssl::ecdsa_verify(digest.as_ref(), self.bytes(), &key.inner.key)
+ }
+ }
+
+ impl<C: PCurve, H: Hasher + EcdsaHash<C>> Debug for EcdsaSignature<C, H> {
+ fn fmt(&self, f: &mut Formatter) -> Result<(), fmt::Error> {
+ write!(f, "EcdsaSignature")
+ }
+ }
+
+ #[cfg(test)]
+ mod tests {
+ use super::{super::*, *};
+ use public::testutil::test_signature_smoke;
+
+ #[test]
+ fn test_smoke() {
+ let p256 = EcPrivKey::<P256>::generate().unwrap();
+ let p384 = EcPrivKey::<P384>::generate().unwrap();
+ let p521 = EcPrivKey::<P521>::generate().unwrap();
+
+ test_signature_smoke(
+ &p256,
+ EcdsaSignature::<_, Sha256>::from_bytes,
+ EcdsaSignature::bytes,
+ );
+ test_signature_smoke(
+ &p384,
+ EcdsaSignature::<_, Sha256>::from_bytes,
+ EcdsaSignature::bytes,
+ );
+ test_signature_smoke(
+ &p384,
+ EcdsaSignature::<_, Sha384>::from_bytes,
+ EcdsaSignature::bytes,
+ );
+ test_signature_smoke(
+ &p521,
+ EcdsaSignature::<_, Sha256>::from_bytes,
+ EcdsaSignature::bytes,
+ );
+ test_signature_smoke(
+ &p521,
+ EcdsaSignature::<_, Sha384>::from_bytes,
+ EcdsaSignature::bytes,
+ );
+ }
+
+ #[test]
+ fn test_invalid_signature() {
+ fn test_is_invalid(sig: &EcdsaSignature<P256, Sha256>) {
+ assert_eq!(sig.len, 0);
+ assert!(!sig.is_valid());
+ assert!(!sig.verify(&EcPrivKey::<P256>::generate().unwrap().public(), &[],));
+ }
+ test_is_invalid(&EcdsaSignature::from_bytes(&[0; MAX_SIGNATURE_LEN + 1]));
+ test_is_invalid(&EcdsaSignature::from_bytes(&[]));
+ }
+ }
+}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+ use hash::Sha256;
+ use public::ec::ecdsa::*;
+ use public::{marshal_private_key_der, marshal_public_key_der, parse_private_key_der,
+ parse_public_key_der, Signature};
+ use util::should_fail;
+
+ #[test]
+ fn test_generate() {
+ EcPrivKey::<P256>::generate().unwrap();
+ EcPrivKey::<P384>::generate().unwrap();
+ EcPrivKey::<P521>::generate().unwrap();
+ }
+
+ #[test]
+ fn test_marshal_parse() {
+ // Test various combinations of parsing and serializing keys.
+ //
+ // Since we need to test dynamic parsing (the
+ // parse_private_key_der_any_curve and parse_public_key_der_any_curve
+ // functions), we need a way of unwrapping their return values into a
+ // static key type. Unfortunately, there's no way (on stable Rust) to do
+ // that generically, so the caller must pass a function which will do
+ // it.
+ fn test<
+ C: PCurve,
+ F: Fn(EcPrivKeyAnyCurve) -> EcPrivKey<C>,
+ G: Fn(EcPubKeyAnyCurve) -> EcPubKey<C>,
+ >(
+ unwrap_priv_any: F, unwrap_pub_any: G,
+ ) where
+ Sha256: EcdsaHash<C>,
+ {
+ const MESSAGE: &[u8] = &[0, 1, 2, 3, 4, 5, 6, 7];
+ let key = EcPrivKey::<C>::generate().unwrap();
+
+ let parsed_key: EcPrivKey<C> =
+ parse_private_key_der(&marshal_private_key_der(&key)).unwrap();
+ let parsed_key_any_curve = unwrap_priv_any(
+ parse_private_key_der_any_curve(&marshal_private_key_der(&key)).unwrap(),
+ );
+ let pubkey = key.public();
+ let parsed_pubkey: EcPubKey<C> =
+ parse_public_key_der(&marshal_public_key_der(&pubkey)).unwrap();
+ let parsed_pubkey_any_curve = unwrap_pub_any(
+ parse_public_key_der_any_curve(&marshal_public_key_der(&pubkey)).unwrap(),
+ );
+
+ fn sign_and_verify<C1: PCurve, C2: PCurve>(
+ privkey: &EcPrivKey<C1>, pubkey: &EcPubKey<C2>,
+ ) where
+ Sha256: EcdsaHash<C1>,
+ Sha256: EcdsaHash<C2>,
+ {
+ let sig = EcdsaSignature::<C1, Sha256>::sign(&privkey, MESSAGE).unwrap();
+ assert!(
+ EcdsaSignature::<C2, Sha256>::from_bytes(sig.bytes()).verify(&pubkey, MESSAGE)
+ )
+ }
+
+ // Sign and verify with every pair of keys to make sure we parsed
+ // the same key we marshaled.
+ sign_and_verify(&key, &pubkey);
+ sign_and_verify(&key, &parsed_pubkey);
+ sign_and_verify(&key, &parsed_pubkey_any_curve);
+ sign_and_verify(&parsed_key, &pubkey);
+ sign_and_verify(&parsed_key, &parsed_pubkey);
+ sign_and_verify(&parsed_key, &parsed_pubkey_any_curve);
+ sign_and_verify(&parsed_key_any_curve, &pubkey);
+ sign_and_verify(&parsed_key_any_curve, &parsed_pubkey);
+ sign_and_verify(&parsed_key_any_curve, &parsed_pubkey_any_curve);
+
+ let _ = marshal_public_key_der::<EcPubKey<C>>;
+ let _ = parse_public_key_der::<EcPubKey<C>>;
+ }
+
+ macro_rules! unwrap_any_curve {
+ ($name:ident, $any_type:ty, $key_type:ty, $curve_variant:path) => {
+ fn $name(key: $any_type) -> $key_type {
+ match key {
+ $curve_variant(key) => key,
+ _ => panic!("unexpected curve"),
+ }
+ }
+ };
+ }
+
+ unwrap_any_curve!(
+ unwrap_priv_key_any_p256,
+ EcPrivKeyAnyCurve,
+ EcPrivKey<P256>,
+ EcPrivKeyAnyCurve::P256
+ );
+ unwrap_any_curve!(
+ unwrap_priv_key_any_p384,
+ EcPrivKeyAnyCurve,
+ EcPrivKey<P384>,
+ EcPrivKeyAnyCurve::P384
+ );
+ unwrap_any_curve!(
+ unwrap_priv_key_any_p521,
+ EcPrivKeyAnyCurve,
+ EcPrivKey<P521>,
+ EcPrivKeyAnyCurve::P521
+ );
+ unwrap_any_curve!(
+ unwrap_pub_key_any_p256,
+ EcPubKeyAnyCurve,
+ EcPubKey<P256>,
+ EcPubKeyAnyCurve::P256
+ );
+ unwrap_any_curve!(
+ unwrap_pub_key_any_p384,
+ EcPubKeyAnyCurve,
+ EcPubKey<P384>,
+ EcPubKeyAnyCurve::P384
+ );
+ unwrap_any_curve!(
+ unwrap_pub_key_any_p521,
+ EcPubKeyAnyCurve,
+ EcPubKey<P521>,
+ EcPubKeyAnyCurve::P521
+ );
+
+ test::<P256, _, _>(unwrap_priv_key_any_p256, unwrap_pub_key_any_p256);
+ test::<P384, _, _>(unwrap_priv_key_any_p384, unwrap_pub_key_any_p384);
+ test::<P521, _, _>(unwrap_priv_key_any_p521, unwrap_pub_key_any_p521);
+ }
+
+ #[test]
+ fn test_parse_fail() {
+ // Test that invalid input is rejected.
+ fn test_parse_invalid<C: PCurve>() {
+ should_fail(
+ parse_private_key_der::<EcPrivKey<C>>(&[]),
+ "parse_private_key_der",
+ "elliptic curve routines:OPENSSL_internal:DECODE_ERROR",
+ );
+ should_fail(
+ parse_public_key_der::<EcPubKey<C>>(&[]),
+ "parse_public_key_der",
+ "public key routines:OPENSSL_internal:DECODE_ERROR",
+ );
+ should_fail(
+ parse_private_key_der_any_curve(&[]),
+ "parse_private_key_der_any_curve",
+ "elliptic curve routines:OPENSSL_internal:DECODE_ERROR",
+ );
+ should_fail(
+ parse_public_key_der_any_curve(&[]),
+ "parse_public_key_der_any_curve",
+ "public key routines:OPENSSL_internal:DECODE_ERROR",
+ );
+ }
+
+ test_parse_invalid::<P256>();
+ test_parse_invalid::<P384>();
+ test_parse_invalid::<P521>();
+
+ // Test that, when a particular curve is expected, other curves are
+ // rejected.
+ fn test_parse_wrong_curve<C1: PCurve, C2: PCurve>() {
+ let privkey = EcPrivKey::<C1>::generate().unwrap();
+ let key_der = marshal_private_key_der(&privkey);
+ should_fail(
+ parse_private_key_der::<EcPrivKey<C2>>(&key_der),
+ "parse_private_key_der",
+ "elliptic curve routines:OPENSSL_internal:GROUP_MISMATCH",
+ );
+ let key_der = marshal_public_key_der(&privkey.public());
+ should_fail(
+ parse_public_key_der::<EcPubKey<C2>>(&key_der),
+ "parse_public_key_der",
+ "mundane: unexpected curve:",
+ );
+ }
+
+ // All pairs of curves, (X, Y), such that X != Y.
+ test_parse_wrong_curve::<P256, P384>();
+ test_parse_wrong_curve::<P256, P521>();
+ test_parse_wrong_curve::<P384, P256>();
+ test_parse_wrong_curve::<P384, P521>();
+ test_parse_wrong_curve::<P521, P256>();
+ test_parse_wrong_curve::<P521, P384>();
+ }
+}
diff --git a/src/public/ed25519.rs b/src/public/ed25519.rs
new file mode 100644
index 0000000..21bf3ea
--- /dev/null
+++ b/src/public/ed25519.rs
@@ -0,0 +1,212 @@
+// Copyright 2018 Google LLC
+//
+// Use of this source code is governed by an MIT-style
+// license that can be found in the LICENSE file or at
+// https://opensource.org/licenses/MIT.
+
+//! The Ed25519 signature algorithm.
+
+use boringssl::{ed25519_keypair, ed25519_keypair_from_seed, ed25519_sign, ed25519_verify};
+use public::{PrivateKey, PublicKey, Signature};
+use util::Sealed;
+use Error;
+
+const ED25519_PUBLIC_KEY_LEN: usize = ::boringssl::ED25519_PUBLIC_KEY_LEN as usize;
+const ED25519_PRIVATE_KEY_LEN: usize = ::boringssl::ED25519_PRIVATE_KEY_LEN as usize;
+const ED25519_SIGNATURE_LEN: usize = ::boringssl::ED25519_SIGNATURE_LEN as usize;
+// BoringSSL stores both a private and a public key in their private key
+// representation. The private key comes first, followed by the public key.
+const ED25519_PUBLIC_KEY_OFFSET: usize = ED25519_PRIVATE_KEY_LEN - ED25519_PUBLIC_KEY_LEN;
+
+/// An Ed25519 public key.
+pub struct Ed25519PubKey {
+ key: [u8; ED25519_PUBLIC_KEY_LEN],
+}
+
+impl Ed25519PubKey {
+ /// Constructs a new public key from bytes.
+ #[must_use]
+ pub fn from_bytes(bytes: [u8; ED25519_PUBLIC_KEY_LEN]) -> Ed25519PubKey {
+ Ed25519PubKey { key: bytes }
+ }
+
+ /// Gets the raw bytes of the public key.
+ #[must_use]
+ pub fn bytes(&self) -> &[u8; ED25519_PUBLIC_KEY_LEN] {
+ &self.key
+ }
+}
+
+impl_debug!(Ed25519PubKey, "Ed25519PubKey");
+
+impl Sealed for Ed25519PubKey {}
+impl PublicKey for Ed25519PubKey {
+ type Private = Ed25519PrivKey;
+}
+
+/// An Ed25519 private key.
+///
+/// An `Ed25519PrivKey` actually includes both the private key and the public
+/// key in order to make multiple key signing operations with the same key more
+/// efficient.
+pub struct Ed25519PrivKey {
+ key: [u8; ED25519_PRIVATE_KEY_LEN],
+}
+
+impl_debug!(Ed25519PrivKey, "Ed25519PrivKey");
+
+impl Ed25519PrivKey {
+ /// Generates a new private key.
+ #[must_use]
+ pub fn generate() -> Ed25519PrivKey {
+ Ed25519PrivKey {
+ key: ed25519_keypair(),
+ }
+ }
+
+ /// Constructs a new private key from a key pair.
+ ///
+ /// Usually, an Ed25519 private key will be stored as a single 64-byte blob:
+ /// the 32-byte private key followed by the 32-byte public key. However, we
+ /// accept the two keys as separate arguments in case they are stored
+ /// separately.
+ #[must_use]
+ pub fn from_key_pair_bytes(private: [u8; 32], public: &Ed25519PubKey) -> Ed25519PrivKey {
+ let mut key = [0u8; ED25519_PRIVATE_KEY_LEN];
+ (&mut key[..32]).copy_from_slice(&private);
+ (&mut key[ED25519_PUBLIC_KEY_OFFSET..]).copy_from_slice(&public.key);
+ Ed25519PrivKey { key }
+ }
+
+ /// Constructs a new private key.
+ ///
+ /// Unlike [`from_key_pair_bytes`], `from_private_key_bytes` reconstructs
+ /// the key (which includes both the private key and the public key
+ /// internally) from only the private key.
+ ///
+ /// [`from_key_pair_bytes`]: ::public::ed25519::Ed25519PrivKey::from_key_pair_bytes
+ #[must_use]
+ pub fn from_private_key_bytes(private: [u8; 32]) -> Ed25519PrivKey {
+ let (_, key) = ed25519_keypair_from_seed(&private);
+ Ed25519PrivKey { key }
+ }
+
+ /// Gets the raw bytes of the private key.
+ #[must_use]
+ pub fn bytes(&self) -> &[u8; ED25519_PRIVATE_KEY_LEN] {
+ &self.key
+ }
+}
+
+impl Sealed for Ed25519PrivKey {}
+impl PrivateKey for Ed25519PrivKey {
+ type Public = Ed25519PubKey;
+
+ fn public(&self) -> Ed25519PubKey {
+ let mut public = [0u8; ED25519_PUBLIC_KEY_LEN];
+ (&mut public[..]).copy_from_slice(&self.key[ED25519_PUBLIC_KEY_OFFSET..]);
+ Ed25519PubKey { key: public }
+ }
+}
+
+/// An Ed25519 signature.
+#[must_use]
+pub struct Ed25519Signature {
+ sig: [u8; ED25519_SIGNATURE_LEN],
+}
+
+impl_debug!(Ed25519Signature, "Ed25519Signature");
+
+impl Ed25519Signature {
+ /// Constructs an `Ed25519Signature` signature from raw bytes.
+ #[must_use]
+ pub fn from_bytes(bytes: [u8; ED25519_SIGNATURE_LEN]) -> Ed25519Signature {
+ Ed25519Signature { sig: bytes }
+ }
+
+ /// Gets the raw bytes of the signature.
+ #[must_use]
+ pub fn bytes(&self) -> &[u8; ED25519_SIGNATURE_LEN] {
+ &self.sig
+ }
+
+ /// Sign a message.
+ ///
+ /// `Ed25519Signature` implements [`Signature`], but `Signature`'s [`sign`]
+ /// function conservatively returns a `Result`. Ed25519 signatures never
+ /// fail, so this function is provided to allow the user to compute an
+ /// Ed25519 signature without having to perform error checking.
+ ///
+ /// [`Signature`]: ::public::Signature
+ /// [`sign`]: ::public::Signature::sign
+ #[must_use]
+ pub fn sign_ed25519(key: &Ed25519PrivKey, message: &[u8]) -> Ed25519Signature {
+ Ed25519Signature {
+ // ED25519_sign can only return an error on OOM
+ sig: ed25519_sign(message, &key.key).unwrap(),
+ }
+ }
+}
+
+impl Sealed for Ed25519Signature {}
+impl Signature for Ed25519Signature {
+ type PrivateKey = Ed25519PrivKey;
+
+ /// Sign a message.
+ ///
+ /// Though the [`Signature`] trait requires that [`sign`] return a `Result`,
+ /// `Ed25519Signature`'s implementation is guaranteed to always return `Ok`.
+ /// Callers may prefer the [`sign_ed25519`] function, which returns an
+ /// `Ed25519Signature` rather than a `Result`.
+ ///
+ /// [`Signature`]: ::public::Signature
+ /// [`sign`]: ::public::Signature::sign
+ /// [`sign_ed25519`]: ::public::ed25519::Ed25519Signature::sign_ed25519
+ fn sign(key: &Ed25519PrivKey, message: &[u8]) -> Result<Ed25519Signature, Error> {
+ Ok(Ed25519Signature::sign_ed25519(key, message))
+ }
+
+ fn verify(&self, key: &Ed25519PubKey, message: &[u8]) -> bool {
+ ed25519_verify(message, &self.sig, &key.key)
+ }
+}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+ use public::testutil::test_signature_smoke;
+
+ #[test]
+ fn test_priv_key_constructors() {
+ let key = Ed25519PrivKey::generate();
+ let mut private = [0u8; 32];
+ (&mut private[..]).copy_from_slice(&key.key[..32]);
+ let key2 = Ed25519PrivKey::from_private_key_bytes(private);
+ assert_eq!(&key.key[..], &key2.key[..]);
+
+ let mut private = [0u8; 32];
+ let mut public = [0u8; 32];
+ let bytes = *key.bytes();
+ (&mut private[..]).copy_from_slice(&bytes[..32]);
+ (&mut public[..]).copy_from_slice(&bytes[32..]);
+ let key2 = Ed25519PrivKey::from_key_pair_bytes(private, &Ed25519PubKey::from_bytes(public));
+ assert_eq!(&key.key[..], &key2.key[..]);
+ }
+
+ #[test]
+ fn test_smoke() {
+ let key = Ed25519PrivKey::generate();
+ let from_bytes = |bytes: &[u8]| {
+ let mut sig = [0u8; ED25519_SIGNATURE_LEN];
+ let len = ::std::cmp::min(sig.len(), bytes.len());
+ (&mut sig[..len]).copy_from_slice(&bytes[..len]);
+ Ed25519Signature::from_bytes(sig)
+ };
+ // for some reason, defining this as a closure results in type inference
+ // issues that aren't worth debugging
+ fn to_bytes(sig: &Ed25519Signature) -> &[u8] {
+ &sig.bytes()[..]
+ }
+ test_signature_smoke(&key, from_bytes, to_bytes);
+ }
+}
diff --git a/src/public/mod.rs b/src/public/mod.rs
new file mode 100644
index 0000000..26dc754
--- /dev/null
+++ b/src/public/mod.rs
@@ -0,0 +1,226 @@
+// Copyright 2018 Google LLC
+//
+// Use of this source code is governed by an MIT-style
+// license that can be found in the LICENSE file or at
+// https://opensource.org/licenses/MIT.
+
+//! Public key cryptography.
+
+pub mod ec;
+pub mod ed25519;
+
+use boringssl::{CHeapWrapper, CStackWrapper};
+use public::inner::BoringDerKey;
+use util::Sealed;
+use Error;
+
+/// The public component of a public/private key pair.
+pub trait PublicKey: Sealed + Sized {
+ /// The type of the private component.
+ type Private: PrivateKey<Public = Self>;
+}
+
+/// The private component of a public/private key pair.
+pub trait PrivateKey: Sealed + Sized {
+ /// The type of the public component.
+ type Public: PublicKey<Private = Self>;
+
+ /// Gets the public key corresponding to this private key.
+ #[must_use]
+ fn public(&self) -> Self::Public;
+}
+
+/// A public key which can be encoded as a DER object.
+pub trait DerPublicKey: PublicKey + self::inner::DerKey {}
+
+/// A private key which can be encoded as a DER object.
+pub trait DerPrivateKey: PrivateKey + self::inner::DerKey {}
+
+/// A cryptographic signature generated by a private key.
+pub trait Signature: Sealed + Sized {
+ /// The private key type used to generate this signature.
+ type PrivateKey: PrivateKey;
+
+ /// Sign a message.
+ ///
+ /// The input to this function is always a message, never a digest. If a
+ /// signature scheme calls for hashing a message and signing the hash
+ /// digest, `sign` is responsible for both hashing and signing.
+ #[must_use]
+ fn sign(key: &Self::PrivateKey, message: &[u8]) -> Result<Self, Error>;
+
+ /// Verify a signature.
+ ///
+ /// The input to this function is always a message, never a digest. If a
+ /// signature scheme calls for hashing a message and signing the hash
+ /// digest, `verify` is responsible for both hashing and verifying the
+ /// digest.
+ #[must_use]
+ fn verify(&self, key: &<Self::PrivateKey as PrivateKey>::Public, message: &[u8]) -> bool;
+}
+
+mod inner {
+ use boringssl::{self, CHeapWrapper, CStackWrapper};
+ use Error;
+
+ /// A wrapper around a BoringSSL key object.
+ pub trait BoringDerKey: Sized {
+ // evp_pkey_assign_xxx
+ fn pkey_assign(&self, pkey: &mut CHeapWrapper<boringssl::EVP_PKEY>);
+
+ // evp_pkey_get_xxx; panics if the key is an EC key and doesn't have a group set,
+ // and errors if pkey isn't the expected key type
+ fn pkey_get(pkey: &mut CHeapWrapper<boringssl::EVP_PKEY>) -> Result<Self, Error>;
+
+ // xxx_parse_private_key
+ fn parse_private_key(cbs: &mut CStackWrapper<boringssl::CBS>) -> Result<Self, Error>;
+
+ // xxx_marshal_private_key
+ fn marshal_private_key(&self, cbb: &mut CStackWrapper<boringssl::CBB>)
+ -> Result<(), Error>;
+ }
+
+ /// Properties shared by both public and private keys of a given type.
+ pub trait DerKey {
+ /// The underlying BoringSSL object wrapper type.
+ type Boring: BoringDerKey;
+
+ fn boring(&self) -> &Self::Boring;
+
+ fn from_boring(Self::Boring) -> Self;
+ }
+}
+
+/// Marshals a public key in DER format.
+///
+/// `marshal_public_key_der` marshals a public key as a DER-encoded
+/// SubjectPublicKeyInfo structure as defined in [RFC 5280].
+///
+/// [RFC 5280]: https://tools.ietf.org/html/rfc5280
+#[must_use]
+pub fn marshal_public_key_der<P: DerPublicKey>(key: &P) -> Vec<u8> {
+ let mut evp_pkey = CHeapWrapper::default();
+ key.boring().pkey_assign(&mut evp_pkey);
+ // cbb_new can only fail due to OOM
+ let mut cbb = CStackWrapper::cbb_new(64).unwrap();
+ evp_pkey
+ .evp_marshal_public_key(&mut cbb)
+ .expect("failed to marshal public key");
+ cbb.cbb_with_data(<[u8]>::to_vec)
+}
+
+/// Marshals a private key in DER format.
+///
+/// `marshal_private_key_der` marshal a private key as a DER-encoded structure.
+/// The exact structure encoded depends on the type of key:
+/// - For an EC key, it is an ECPrivateKey structure as defined in [RFC 5915].
+/// - For an RSA key, it is an RSAPrivateKey structure as defined in [RFC 3447].
+///
+/// [RFC 5915]: https://tools.ietf.org/html/rfc5915
+/// [RFC 3447]: https://tools.ietf.org/html/rfc3447
+#[must_use]
+pub fn marshal_private_key_der<P: DerPrivateKey>(key: &P) -> Vec<u8> {
+ // cbb_new can only fail due to OOM
+ let mut cbb = CStackWrapper::cbb_new(64).unwrap();
+ key.boring()
+ .marshal_private_key(&mut cbb)
+ .expect("failed to marshal private key");
+ cbb.cbb_with_data(<[u8]>::to_vec)
+}
+
+/// Parses a public key in DER format.
+///
+/// `parse_public_key_der` parses a public key from a DER-encoded
+/// SubjectPublicKeyInfo structure as defined in [RFC 5280].
+///
+/// # Elliptic Curve Keys
+///
+/// For Elliptic Curve keys ([`EcPubKey`]), the curve itself is validated. If
+/// the curve is not known ahead of time, and any curve must be supported at
+/// runtime, use the [`parse_public_key_der_any_curve`] function.
+///
+/// [RFC 5280]: https://tools.ietf.org/html/rfc5280
+/// [`EcPubKey`]: ::public::ec::EcPubKey
+/// [`parse_public_key_der_any_curve`]: ::public::ec::parse_public_key_der_any_curve
+#[must_use]
+pub fn parse_public_key_der<P: DerPublicKey>(bytes: &[u8]) -> Result<P, Error> {
+ CStackWrapper::cbs_with_temp_buffer(bytes, |cbs| {
+ let mut evp_pkey = CHeapWrapper::evp_parse_public_key(cbs)?;
+ // NOTE: For EC, panics if evp_pkey doesn't have its group set. This is
+ // OK because EVP_parse_public_key guarantees that the returned key has
+ // its group set.
+ let key = P::Boring::pkey_get(&mut evp_pkey)?;
+ if cbs.cbs_len() > 0 {
+ return Err(Error::new("malformed DER input".to_string()));
+ }
+ Ok(P::from_boring(key))
+ })
+}
+
+/// Parses a private key in DER format.
+///
+/// `parse_private_key_der` parses a private key from a DER-encoded format. The
+/// exact structure expected depends on the type of key:
+/// - For an EC key, it is an ECPrivateKey structure as defined in [RFC 5915].
+/// - For an RSA key, it is an RSAPrivateKey structure as defined in [RFC 3447].
+///
+/// # Elliptic Curve Keys
+///
+/// For Elliptic Curve keys ([`EcPrivKey`]), the curve itself is validated. If
+/// the curve is not known ahead of time, and any curve must be supported at
+/// runtime, use the [`parse_private_key_der_any_curve`] function.
+///
+/// [RFC 5915]: https://tools.ietf.org/html/rfc5915
+/// [RFC 3447]: https://tools.ietf.org/html/rfc3447
+/// [`EcPrivKey`]: ::public::ec::EcPrivKey
+/// [`parse_private_key_der_any_curve`]: ::public::ec::parse_private_key_der_any_curve
+#[must_use]
+pub fn parse_private_key_der<P: DerPrivateKey>(bytes: &[u8]) -> Result<P, Error> {
+ CStackWrapper::cbs_with_temp_buffer(bytes, |cbs| {
+ let key = P::Boring::parse_private_key(cbs)?;
+ if cbs.cbs_len() > 0 {
+ return Err(Error::new("malformed DER input".to_string()));
+ }
+ Ok(P::from_boring(key))
+ })
+}
+
+#[cfg(test)]
+mod testutil {
+ use super::*;
+
+ /// Smoke test a signature scheme.
+ ///
+ /// `sig_from_bytes` takes a byte slice and converts it into a signature. If
+ /// the byte slice is too long, it either truncate it or treats it as
+ /// invalid (it's up to the caller). If the byte slice is too short, it
+ /// fills in the remaining bytes with zeroes.
+ pub fn test_signature_smoke<S: Signature, F: Fn(&[u8]) -> S, G: Fn(&S) -> &[u8]>(
+ key: &S::PrivateKey, sig_from_bytes: F, bytes_from_sig: G,
+ ) {
+ // Sign the message, verify the signature, and return the signature.
+ // Also verify that, if the wrong signature is used, the signature fails
+ // to verify. Also verify that sig_from_bytes works.
+ fn sign_and_verify<S: Signature, F: Fn(&[u8]) -> S, G: Fn(&S) -> &[u8]>(
+ key: &S::PrivateKey, message: &[u8], sig_from_bytes: F, bytes_from_sig: G,
+ ) -> S {
+ let sig = S::sign(key, message).unwrap();
+ assert!(sig.verify(&key.public(), message));
+ let sig2 = S::sign(&key, bytes_from_sig(&sig)).unwrap();
+ assert!(!sig2.verify(&key.public(), message));
+ sig_from_bytes(bytes_from_sig(&sig))
+ }
+
+ // Sign an empty message, and verify the signature. Use the signature as
+ // the next message to test, and repeat many times.
+ let mut msg = Vec::new();
+ for _ in 0..16 {
+ msg = bytes_from_sig(&sign_and_verify(
+ key,
+ &msg,
+ &sig_from_bytes,
+ &bytes_from_sig,
+ )).to_vec();
+ }
+ }
+}
diff --git a/src/util.rs b/src/util.rs
new file mode 100644
index 0000000..b9bb0e7
--- /dev/null
+++ b/src/util.rs
@@ -0,0 +1,37 @@
+// Copyright 2018 Google LLC
+//
+// Use of this source code is governed by an MIT-style
+// license that can be found in the LICENSE file or at
+// https://opensource.org/licenses/MIT.
+
+/// A trait that can be used to ensure that users of this crate can't implement
+/// a trait.
+///
+/// See the [API Guidelines] for details.
+///
+/// [API Guidelines]: https://rust-lang-nursery.github.io/api-guidelines/future-proofing.html#sealed-traits-protect-against-downstream-implementations-c-sealed
+pub trait Sealed {}
+
+/// Expects that a `Result` is an error.
+///
+/// `should_fail` ensures that `result` is an error, and that the error's
+/// `Debug` representation contains the string `expected_substr`. Otherwise, it
+/// panics.
+#[cfg(test)]
+pub fn should_fail<O, E: ::std::fmt::Debug>(
+ result: Result<O, E>, desc: &str, expected_substr: &str,
+) {
+ // Credit to agl@google.com for this implementation.
+ match result {
+ Ok(_) => panic!("{} unexpectedly succeeded", desc),
+ Err(err) => {
+ let err_str = format!("{:?}", err);
+ err_str.find(expected_substr).unwrap_or_else(|| {
+ panic!(
+ "{} resulted in error that doesn't include {:?}: {:?}",
+ desc, expected_substr, err_str
+ )
+ });
+ }
+ }
+}