commit d8a0c25e49992685c0b9d91b553c1d04f81b6b4b
Author: johnsalmon <salmonj@deshawresearch.com>
Date: Sat, 16 Jan 2021 21:52:44 -0500
Initial commit
Sync'ed from in-house repo.
Diffstat:
105 files changed, 26220 insertions(+), 0 deletions(-)
diff --git a/.gitignore b/.gitignore
@@ -0,0 +1,45 @@
+*~
+*.[oa]
+*.pyc
+*.metallib
+*.air
+/.sconsign.dblite
+/objs
+docs/html
+# make leaves a lot of junk in examples/ and tests/
+# We really should create objects in a subdir!
+**/kat_c
+**/kat_cpp
+**/kat_metal
+**/pi_aes
+**/pi_capi
+**/pi_cppapi
+**/pi_gsl
+**/pi_microurng
+**/pi_uniform
+**/pi_metal
+**/pi_opencl
+**/simple
+**/simplepp
+**/time_boxmuller
+**/time_serial
+**/time_thread
+**/timers
+**/ut_Engine
+**/ut_M128
+**/ut_ReinterpretCtr
+**/ut_aes
+**/ut_ars
+**/ut_carray
+**/ut_features
+**/ut_gsl
+**/ut_ua
+**/ut_uniform
+**/ut_uniform_IEEEkat
+**/kat_cuda
+**/pi_cuda
+**/pi_cudapp
+**/pi_opencl
+**/time_boxmuller_cuda
+**/time_cuda
+**/*.i
diff --git a/GNUmakefile b/GNUmakefile
@@ -0,0 +1,46 @@
+# This Makefile is EXTREMELY simple. Let's keep it that way.
+
+all:
+ @echo Random123 is a header-only package. There is nothing to build.
+ @echo 'However, "make install" understands prefix, DESTDIR, etc.,'
+ @echo 'and "make check" understands CFLAGS, CXXFLAGS, LDFLAGS, etc.'
+.PHONY: all
+
+check:
+ cd tests && $(MAKE) runcore
+.PHONY: check
+
+prefix?=/usr/local
+includedir?=$(prefix)/include
+datarootdir?=$(prefix)/share
+datadir?=$(datarootdir)
+docdir?=$(datarootdir)/doc/Random123
+export prefix includedir datarootdir datadir docdir
+
+install: install-html install-include install-examples install-tests
+.PHONY: install
+
+# recursively copy include/Random123 to $(includedir)
+install-include:
+ mkdir -p $(DESTDIR)$(includedir)
+ cp -dr include/Random123 $(DESTDIR)$(includedir)
+.PHONY: install-include
+
+# Run doxygen to install html documentation
+install-html:
+ mkdir -p $(DESTDIR)$(docdir)
+ cd docs; (cat Doxyfile; echo OUTPUT_DIRECTORY=$(DESTDIR)$(docdir)) | doxygen -
+.PHONY: install-html
+
+# install-examples and install-tests copy files to
+# $(DESTDIR)$(docdir). Since 'make check' (or other devel activity)
+# might "pollute" the examples/ and tests/ directories, the files to
+# be copied are enumerated in {examples,tests}/GNUmakefile.
+install-examples:
+ cd examples; $(MAKE) install
+.PHONY: install-examples
+
+install-tests:
+ cd tests; $(MAKE) install
+.PHONY: install-tests
+
diff --git a/LICENSE b/LICENSE
@@ -0,0 +1,31 @@
+/** @page LICENSE
+Copyright 2010-2012, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+ notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions, and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
diff --git a/README.md b/README.md
@@ -0,0 +1,421 @@
+# Random123: a Library of Counter-Based Random Number Generators
+
+The Random123 library is a collection of counter-based random
+number generators (<!-- @ref CBRNG--> "CBRNGs") for CPUs (C and C++) and GPUs (CUDA and OpenCL), as described in
+<a href="http://dl.acm.org/citation.cfm?doid=2063405"><i>Parallel Random Numbers: As Easy
+as 1, 2, 3</i>, Salmon, Moraes, Dror & Shaw, SC11, Seattle, Washington, USA, 2011, ACM </a>.
+They are intended for use in statistical
+applications and Monte Carlo simulation
+and have passed all of the rigorous
+SmallCrush, Crush and BigCrush tests in the
+<a href="http://www.iro.umontreal.ca/~simardr/testu01/tu01.html">
+extensive TestU01 suite</a> of statistical tests for random number generators.
+They are **not** suitable for use in cryptography or security
+even though they are constructed using principles drawn from cryptography.
+
+The Random123 library is implemented entirely in header files.
+See [below](#installation-and-testing), for how to
+install and use the library, and how to generate documentation
+with doxygen.
+
+CBRNGs are as fast as, or faster than conventional RNGs, much
+easier to parallelize, use minimal memory/cache resources, and
+require very little code. On modern architectures, the
+Random123 CBRNGs require a few cycles per byte of random data
+returned and return random data in convenient sizes (arrays of
+two or four elements, each of which is an unsigned integer of 32
+or 64 bits). The range of random numbers is the full
+representable range of the 32 or 64 bit unsigned integer)
+The `<Random123/uniform.h>` header contains utility functions
+to convert 32- and 64-bit unsigned integers to open or closed
+ranges of single or double precision floating point numbers.
+
+The Random123 library was written by John Salmon and Mark Moraes.
+It is available at <a href="https://github.com/DEShawResearch/random123">
+https://github.com/DEShawResearch/random123</a>
+Archived releases are also
+available from
+<a href="http://deshawresearch.com/resources_random123.html">
+http://deshawresearch.com/resources_random123.html.</a> Please see
+the <!-- @ref LICENSE--> "LICENSE" for terms and conditions. Please
+send
+feedback, including bug reports, suggestions, patches, etc. to
+random123@deshawresearch.com.
+
+## Overview
+
+Unlike conventional RNGs, counter-based RNGs are
+*stateless* functions (or function classes i.e. functors) whose
+arguments are a *counter*, and a *key*
+that return a result of the same type as the counter.
+
+ result = CBRNGname(counter, key)
+
+The returned result is a deterministic function of the key and counter,
+i.e. a unique (counter, key) tuple will always produce the same
+result. The result is highly sensitive to small changes in the inputs,
+so that the sequence of values produced by simply
+incrementing the counter (or key) is effectively indistinguishable from a
+sequence of samples of a uniformly distributed random variable.
+
+For all the CBRNGs in the Random123 library, the result and
+counter are the same type, specifically an array of *N* words,
+where words have a width of *W* bits, encapsulated in <!-- @ref
+arrayNxW--> "r123arrayNxW" structs, or equivalently, for C++, in
+the <!-- @ref r123::Array1x32--> "ArrayNxW" typedefs in the r123
+namespace. Keys are usually also arrayMxW types, but sometimes M is
+a different size than the counter N (e.g. Philox keys have half the
+number of elements as the counter, Threefry and ARS have the same number,
+AES uses an opaque key type rather than an array) The N random
+numbers returned in `result.v[]` are unsigned integers of
+width W (32 or 64), and the range of the random numbers is the full
+range of the unsigned integer of that width (i.e. 0 to 2^W-1)
+
+In C++, all public names (classes, structs, typedefs, etc) are in the
+`r123` namespace. In C, the public names (functions, enums, structs,
+typedefs) begin either with `r123` or with one of the RNG family names, e.g.,
+`threefry`, `philox`, `ars`, `aesni`. The RNG functions themselves have names like
+`philox4x32`. C++ class names are capitalized, e.g., `Threefry4x32`.
+
+## <!--families--> The different families of Random123 generators
+
+Several families of CBRNGs are available in this version of the library:
+<ul>
+<li> <!-- @ref ThreefryNxW--> "Threefry" is a **non-cryptographic**
+adaptation of the Threefish block cipher from the <a href="http://www.skein-hash.info/"> Skein Hash Function</a>.
+See <!-- @ref--> r123::Threefry2x32, <!-- @ref--> r123::Threefry4x32, <!-- @ref--> r123::Threefry2x64, <!-- @ref--> r123::Threefry4x64.
+<li> <!-- @ref PhiloxNxW--> "Philox" uses a Feistel network and integer multiplication.
+See <!-- @ref--> r123::Philox2x32, <!-- @ref--> r123::Philox4x32, <!-- @ref--> r123::Philox2x64, <!-- @ref--> r123::Philox4x64.
+The Nx64 forms are only available on hardware
+that supports 64-bit multiplication producing a 128-bit result.
+<li> <!@ref AESNI--> "AESNI" uses the Advanced Encryption Standard (AES) New Instruction,
+available on certain modern x86 processors (some models of Intel Westmere and Sandy Bridge,
+and AMD Interlagos, as of 2011). AESNI CBRNGs can operate on four 32bit words (internally converting
+them to the 128bit SSE type needed by the AES-NI instructions, or on a single m128i "word",
+which holds the SSE type.
+See <!-- @ref--> r123::AESNI4x32, <!-- @ref--> r123::AESNI1xm128i.
+<li> <!-- @ref AESNI--> "ARS" (Advanced Randomization System) is a **non-cryptographic** simplification of <!-- @ref AESNI--> "AESNI".
+See <!-- @ref--> r123::ARS4x32_R, <!-- @ref--> r123::ARS1xm128i_R.
+</ul>
+
+## Installation and Testing
+
+The Random123 library is implemented entirely in header files. Thus,
+there is nothing to compile before using it and nothing to link after
+you `#include` it in your source files. Simply direct your C or
+C++ compiler to find the header files in the `include/` directory
+of the cloned repo and use the Random123
+header files, types and functions in your application.
+
+There is a top-level GNUmakefile with "install" and "install-html"
+targets. The former will copy header files to $(DESTDIR)$(includedir)
+(default: /usr/local/include). The latter will run doxygen, with
+OUTPUT_DIRECTORY=$(DESTDIR)$(docdir)/html (default: /usr/local/doc/Random123/html).
+
+In addition to the `include/` files which implement the library, the
+distribution also contains an `examples/` and a `tests/` directory. Users are
+**STRONGLY ADVISED** to compile and run the tests in `tests/` before using
+Random123 in an application (see <!-- @ref TestsREADME--> `tests/README`).
+Do not use the library if any tests fail. (It is not a failure for
+a test to report that it cannot run because of missing
+hardware capabilities like 64bit multiply,
+SSE, AES-NI or compiler capabilities)
+
+## Usage
+
+### C++ API
+
+A typical C++ use case might look like:
+
+```
+#include <Random123/philox.h>
+
+typedef r123::Philox4x32 RNG;
+RNG rng;
+RNG::ctr_type c={{}};
+RNG::ukey_type uk={{}};
+uk[0] = ???; // some user_supplied_seed
+RNG::key_type k=uk;
+
+for(...){
+ c[0] = ???; // some loop-dependent application variable
+ c[1] = ???; // another loop-dependent application variable
+ RNG::ctr_type r = rng(c, k);
+ // use the random values in r for some operation related to
+ // this iteration on objectid
+}
+```
+
+On each iteration, `r` contains an array of 4 32-bit random values that
+will not be repeated by any other call to `rng` as long as `c` and `k`
+are not reused.
+
+In the example above, we use the <!-- @ref--> r123::Philox4x32, but any of the
+other <!-- @ref CBRNG--> "CBRNGs" would serve equally well. Also note that
+for most CBRNGs, the `ukey_type` and the `key_type` are identical; the code
+could just as well ignore the `ukey_type` and directly construct the
+`key_type`. However, for the <!-- @ref AESNI--> "AESNI" CBRNGs, the `key_type` is opaque, and
+must be constructed from a `ukey_type`, as shown.
+
+### The C API
+
+In C, the example above could be written as:
+```
+#include <Random123/philox.h>
+
+philox4x32_ctr_t c={{}};
+philox4x32_ukey_t uk={{}};
+
+uk.v[0] = user_supplied_seed;
+philox4x32_key_t k = philox4x32keyinit(uk);
+
+for(...){
+ c.v[0] = ???; /* some loop-dependent application variable */
+ c.v[1] = ???; /* another loop-dependent application variable */
+ philox4x32_ctr_t r = philox4x32(c, k);
+}
+```
+
+In C, access to the contents of the counter and key is through
+the fixed-size array member `v`.
+
+## The CUDA platform
+
+All relevant functions in the C and C++ APIs for Random123 are declared
+as CUDA device functions if they are included in a CUDA kernel source file
+and compiled with a CUDA compiler (nvcc). They can be used exactly
+as described/documented for regular C or C++ programs. Note that
+CUDA device functions and host functions share the same namespace, so
+it is not currently possible to use Random123 functions in
+both the host portion and the device portion of the same .cu source file.
+To work around this, you must compile Random123-using host code in
+a separate .c source file from your .cu device-resident code.
+The Nx32 forms are faster than the Nx64 variants on current (2011)
+32-bit GPU architectures.
+
+It has been reported that Random123 uses 16 bytes of
+static memory per thread. This is undesirable and not intentional,
+but we do not have a workaround other than to suggest adjusting memory
+allocation accordingly.
+
+The
+pi_cuda.cu and pi_cudapp.cu examples illustrate the use of CUDA.
+
+In a machine with different GPUs, the
+R123EXAMPLE_ENVCONF_CUDA_DEVICE environment variable can be set
+to a unique substring of the CUDA GPU device name to select a
+specific GPU (else examples try to choose the GPU with the most
+cores)
+
+## The OpenCL platform
+
+The functions in the Random123 C API can all be used in
+OpenCL kernels, just as in regular C functions.
+As with CUDA, the Nx32 forms are faster than the Nx64 variants on current (2011)
+32-bit GPU architectures.
+
+The `pi_opencl.c` and `pi_opencl_kernel.ocl` examples illustrate the use
+of OpenCL.
+
+In a machine with different OpenCL devices, the
+R123EXAMPLE_ENVCONF_OPENCL_DEVICE environment variable can be
+set to a unique substring of the OpenCL device name to select a
+specific OpenCL device (else examples try to choose the device
+with the most cores)
+
+## C++11 \<random\> interface
+
+In addition to the stateless ("pure/functional") C++ API above,
+the Random123 package includes two C++ classes
+that leverage the C++11 \<random\> API.
+
+<ul>
+<li>r123::MicroURNG provides an adapter class that provides a
+more conventional interface compatible with the C++11 URNG
+(uniform random number generator) API; the MicroURNG adapter can
+be used with C++11 random number distributions and is
+fast/lightweight enough that a new MicroURNG can be instantiated
+with a unique key,counter tuple and used for each call to a
+distribution, there is little or no overhead to creating
+billions of unique MicroURNGs. This adapter retains one of the
+key advantages of CBRNGs -- complete application control over
+the RNG state.
+<li>r123::Engine provides the C++11 Random Engine API. This can
+also be used with any of the C++11 random distributions, but
+sacrifices the application control over RNG state that is a
+defining characteristic of CBRNGs.
+</ul>
+
+## The GNU Scientific Library (GSL) interface
+
+In addition to the stateless ("pure/functional") C API above,
+the Random123 package includes two C adapter interfaces
+to the <a href="http://www.gnu.org/s/gsl/">GNU Scientific Library (GSL).</a>
+
+<ul>
+<li>The <!--\ref--> GSL_MICRORNG macro allows the application to
+define a GSL random number generator. It
+can be used with GSL random distributions but still provides the
+application with complete control over the RNG state (it is
+analogous to the MicroURNG class, in that it uses shorter
+periods, and is intended to be instantiated in large numbers for
+a few calls to the random distribution).
+<li>The <!--\ref--> GSL_CBRNG macro allows the application to create a GSL
+RNG with a completely conventional interface, sacrificing
+application control over the internal RNG state.
+</ul>
+
+## Generating uniformly distributed and Gaussian distributed floats and doubles
+
+The Random123 library provides generators for uniformly distributed
+random **integers**. Often, applications want random **real** values or
+samples from other distributions. The general problem of generating
+samples from arbitrary distributions is beyond the scope of the Random123
+library. One can, of course, use GSL or MicroURNG and the
+distributions in the C++11 \<random\> library, but a few simple cases
+are common enough that all that extra machinery seems like overkill.
+We have included a few generic conversion utilities which developers may
+find useful.
+
+<ul>
+<li> uniform.hpp - C++ functions that convert random integers to
+ random, uniformly distributed floating point values.
+<li> u01fixedpt.h - C functions that convert random integers to
+ random, uniformly distributed, equi-spaced, i.e., fixed point,
+ values.
+<li> boxmuller.hpp - C++ functions that take two
+ uniformly distributed integers (32 or 64 bit) and
+ return a pair of Gaussian distributed floats or doubles.
+</ul>
+
+The Box-Muller method of generating Gaussian random variables is
+particularly well suited to Random123 because it deterministically
+consumes exactly two uniform randoms to generate exactly two gaussian
+randoms. It uses math library functions: sincos, log and sqrt which
+may be slow on some platforms, but which are surprisingly fast on
+others. Notably, on GPUs, the lack of branching in the Box-Muller
+method and hardware support for math functions overcomes the
+transcendental function overhead, making it the fastest generator of
+Gaussians that we are aware of.
+
+## Examples
+
+The <!-- @ref ExamplesREADME--> "examples/" directory, contains example code
+intended to illustrate use of the library.
+
+Complete, short programs estimate pi by counting the number of random
+points that fall inside a circle inscribed in a square, demonstrating
+the C, C++, AES, GSL, OpenCL, CUDA and C++11 APIs. The environment
+variable R123EXAMPLE_ENVCONF_SEED can be set to any unsigned integer value to run
+the example with a different seed. Many of the pi_* examples run different
+numbers of iterations if that number is specified as the first argument
+on the command line.
+
+### Tests and Benchmarks
+
+The <!-- @ref TestsREADME--> "tests/" directory contains tests and benchmarks.
+This code is complicated due to the fact that it is
+largely "single source" for CUDA, OpenCL and CPU implmentations.
+Developers are strongly discouraged from emulating its style.
+It contains:
+<ul>
+<li> Unit tests for individual components and "known-answer-tests", which
+should be run to ensure that these RNGs build correctly on desired platforms.
+These help to provide assurance that the code is being compiled correctly.
+<li> A variety of timing harnesses are provided
+which measure performance of a variety of generators in different
+programming environments.
+</ul>
+
+## Portability
+
+Although we have done our best to make Random123 portable and standards conforming,
+it is an unfortunate fact that there is no portable code. There is only
+code that has been ported.
+
+Prior to release, we test Random123 on a variety of systems and with a
+variety of toolchains that are readily available to us. Our
+current test environment includes:
+
+<ul>
+<li> Linux, gcc-5.2.0, 6.3.0, 8.1.0 using -march=native on Xeon hardware with
+ AES and SSE4_2 and AVX2 support.
+<li> Linux, gcc-5.2.0 using -m32.
+<li> Linux, clang-8.0.0 with libc++ (8.0.0) on Xeon hardware.
+<li> Linux, CentOS7 using the vendor supplied gcc toolchain (4.8.5-16).
+<li> Linux, Ubuntu 16.04(LTS) using the vendor supplied gcc toolchain (5.4.0-6ubuntu1-16.04.11).
+<li> Linux, Ubuntu 16.04(LTS) using OpenCL beignet 1.1.1-2 and https://github.com/intel/compute-runtime/releases/tag/19.07.12410
+<li> Linux, Ubuntu 18.04(LTS) with clang-11.0.1 and both libc++ and libstdc++.
+<li> Linux, icc-18.0.3 on Xeon hardware with AES, SSE4 and AVX2 support.
+<li> Linux, NVIDIA CUDA 10.0.130 with GTX 980 and 1080, and Titan RTX (aka Turing) hardware.
+<li> MacOS, with Xcode-10.1 and Metal on a 2018 Mac mini.
+</ul>
+
+In the past, we have tested Random123 with additional toolchains and
+hardware. Although we no longer test on these platforms, we know of
+no reason that they should not work.
+
+<ul>
+<li>Linux, gcc (multiple versions from 3.4.3 through 6.3.0), on x86_64.
+<li>Linux, gcc-4.1.2 and 4.4.1 on i686.
+<li>Linux, gcc-4.8 on ARMv7 (32bit) Freescale/NXP LS1021A & ARM A53 (64bit) Freescale/NXP 1043A.
+<li>Linux, clang-2.9, 3.0, 3.1, 3.3 and 3.6 on x86_64.
+<li>Linux, clang-3.0 and 3.1 with lib++ (2012-04-19 svn checkout) on x86_64.
+<li>Linux, clang-8.0.0 with libc++ on x86_64
+<li>Linux, open64-4.2.4 on x86_64.
+<li>Linux, Intel icc and icpc 12.0.2 on x86_64.
+<li>Linux, NVIDIA CUDA 4.1.15, 4.2.6, 5.5.22 and 7.5.1. (NOTE: We recommend against the use of CUDA before 4.1)
+<li>Linux, OpenCL (NVIDIA SDK 4.0.17) on GTX480, M2090, GTX580 and GTX680 GPUs.
+<li>Linux, OpenCL (AMD APP SDK 2.4 or 2.5), on x86_64 CPUs and Radeon HD6970 GPUs.
+<li>Linux, OpenCL (Intel OpenCL 1.5), on x86_64 CPUs.
+<li>Solaris, both gcc-3.4.3 and Sun C/C++ 5.8, on x86_64.
+<li>FreeBSD 8.2, gcc-4.2.1, on x86_64.
+<li>MacOS X 5.8, gcc-4.0.1, on i686.
+<li>MacOS X 5.8, llvm-2.9.1 on i686 (problems with catching C++ exceptions).
+<li>Windows 7, Microsoft Visual Studio, version 10.0, Microsoft C/C++ compiler 16.00.
+</ul>
+
+Others have reported success on
+<ul>
+<li>MacOS, OpenCL on x86_64 CPUs
+<li>Linux, gcc-4.7.2 on Powerpc64 (BlueGene/Q)
+<li>Linux, Portland Group Compiler on Powerpc64 (BlueGene/Q)
+<li>Linux, IBM xlc on Powerpc64 (BlueGene/Q)
+<li>MacOS, Metal on x86_64 CPUs and AMD Radeon R9 M380 GPU
+</ul>
+
+## Warnings
+
+With some compilation options, the CUDA nvcc compiler warns about
+unreachable code in array.h. The compiler doesn't recognize that the
+code that is unreachable for some values of some macro parameters, is
+actually reachable for other values of the parameters. It is possible
+to disable that particular warning for a specific compilation unit by
+adding -Wcudafe --diag_suppress=111 to the compilation command
+line.
+
+On our ARMv7 test platform, we suspect a compiler bug with -O3,
+which does not seem to affect Random123 code itself, but
+produces nondeterministic results from time_serial. The
+offending compiler version was
+"aarch64-fsl-linux-gcc (Linaro GCC 4.8-2014.04) 4.8.3 20140401 (prerelease)".
+We slightly reordered a couple of innocuous statements (a
+timer() and dprintf() call) in time_serial to avoid the bug, but
+we would avoid -O3 on ARMv7 with that particular version of the
+compiler at least.
+
+## Contributors
+
+We welcome bug reports, new ports, success stories or any
+feedback to random123@deshawresearch.com
+
+We are grateful for contributions from the following users:
+<ul>
+<li> Geoffrey Irving and Gabriel Rockefeller - BlueGene/Q and powerpc ports
+<li> Yan Zhou - MacOS and clang ports
+<li> David Lawrie - allowing 64-bit philox to compile for both host and device with CUDA
+<li> Bogdan Opanchuk - pointing out the inconsistent rotation constants in the implementation of threefry2xW in version 1.07 and earlier.
+<li> Tom Schoonjans - Support for Metal (Apple's successor to OpenCL).
+</ul>
+
+
diff --git a/docs/Doxyfile b/docs/Doxyfile
@@ -0,0 +1,44 @@
+# generated with doxygen -g and edited
+# Doxyfile 1.8.11
+
+PROJECT_NAME = "Random123"
+STRIP_FROM_PATH = ../include ..
+STRIP_FROM_INC_PATH = ../include/
+TAB_SIZE = 8
+EXTENSION_MAPPING = .h=C++
+MARKDOWN_SUPPORT = NO
+AUTOLINK_SUPPORT = NO
+EXTRACT_ALL = YES
+EXTRACT_STATIC = YES
+INPUT = main.dox cbrng.dox releasenotes.dox \
+ ../include/Random123 \
+ ../include/Random123/conventional \
+ ../include/Random123/features/sse.h \
+ ../include/Random123/features/compilerfeatures.h \
+ ../tests/README \
+ ../examples/README \
+ ../LICENSE
+
+#USE_MDFILE_AS_MAINPAGE =
+
+HTML_HEADER = header.html
+HTML_TIMESTAMP = YES
+GENERATE_LATEX = NO
+MACRO_EXPANSION = YES
+
+PREDEFINED = \
+ "R123_STATIC_ASSERT(e,m)= " \
+ "R123_FORCE_INLINE(decl)= decl " \
+ "R123_STATIC_INLINE= static inline " \
+ "R123_CUDA_DEVICE= " \
+ "__cplusplus " \
+ "R123_USE_SSE= 1" \
+ "R123_USE_AES_NI= 1" \
+ "R123_USE_U01_DOUBLE= 1" \
+ "R123_USE_PHILOX_64BIT= 1" \
+ "R123_USE_64BIT= 1" \
+ "R123_USE_CXX11_STD_ARRAY= 1"
+EXPAND_AS_DEFINED = \
+ R123_ULONG_LONG \
+ R123_STATIC_INLINE \
+ R123_CUDA_DEVICE
diff --git a/docs/cbrng.dox b/docs/cbrng.dox
@@ -0,0 +1,198 @@
+/**
+@page CBRNG Counter Based RNGs (CBRNGs).
+
+The counter-based random number generators (CBRNGs)
+in the Random123 library are described in more detail in
+<a href="http://dl.acm.org/citation.cfm?doid=2063405"><i>Parallel Random Numbers: As Easy as 1, 2, 3</i> </a>,
+which was named the Best Paper at the ACM SC'11 International Conference on High Performance Computing, Networking,
+Storage, and Analysis.
+All the CBRNGs in the library conform to a consistent
+interface. Basically:
+\verbatim
+ value = CBRNGname(counter, key)
+\endverbatim
+
+Thus, with some care, they can be used
+interchangeably in applications. (Since code
+compiled with AES-NI instructions will result
+in an illegal instruction exception on processors
+without those instructions, Random123 provides a
+@ref haveAESNI function that can be used
+to detect the existence of AES at run-time;
+user code could use it to either report an
+error or substitute an alternative compatible
+CBRNG.)
+
+The API descriptions below are generic, but apply to
+all the different @ref families "families" of
+Random123 CBRNGs.
+
+\section arrays Fixed-size Array Types
+
+Data is passed into and back from the Random123 functions as
+@ref arrayNxW "r123arrayNxW"
+types; these types
+contain fixed-size arrays of W-bit types (\c uintW_t for the
+most part, but also a special r123m128i wrapper for the @ref
+AESNI "ARS and AESNI" CBRNGs). The counter argument
+and the return value have the same type,
+referred to as \c ctr_type in C++, and \c ctr_t in C. The
+type of the key argument is referred to as \c key_type in C++,
+and \c key_t in C.
+For an @ref arrayNxW "r123arrayNxW", \c r, the data member \c r.v is an array of N elements,
+each of width W (each element is
+type \c uintW_t or an r123m128i wrapper object).
+C programs can access these elements as \c r.v[0], ... \c r.v[N-1] for
+the \c uintW_t types.
+
+In C++, these array types closely resemble the C++0x std::array<N, uintW_t> template, but do not
+require C++11 libraries or compiler features.
+C++ programs can access array elements via operator[]
+\c r[0], ... \c r[N-1], or via most of the capabilities
+of a C++ "Container" e.g. \c at(), \c begin(), \c end(),
+\c size() and others. In addition, containers have <c> incr() </c> and <c> incr(unsigned long long)</c>
+member function that do increment-with-carry, which facilitate
+using r123arrays as very-long-period counters.
+
+If the compiler environment supports it,
+\c Random123/array.h also declares \c r123array1xm128i, which contains an array of one
+\c r123m128i, which in turn is a class wrapping a single element
+of \c __m128i SSE type, which can be accessed as \c r.v[0].m.
+The @ref r123::ARS1xm128i_R RNGs
+use \c r123array1xm128i for both \c ctr_type and \c key_type.
+For the @ref AESNI "AESNI" RNG, \c ctr_type is an \c r123array1xm128i, but
+\c key_type is an opaque type, which must be initialized
+by assignment from a <c>userkey_type</c> (an r123array1xm128i).
+
+\section aliasing A note on aliasing and type-punning
+It is easiest (though not necessarily fastest) to choose a CBRNG whose
+\c ctr_type matches the width of the random data needed by the
+application, e.g., Philox4x32 for applications that need random data in
+32-bit words. If the application's needs don't match the counter's value_type,
+it is tempting to use "type punning" and pointer casts to interconvert between
+types. Such conversions require great care and are very difficult to do
+safely without use of unions or memcpy.
+See <a
+href="http://blog.worldofcoding.com/2010/02/solving-gcc-44-strict-aliasing-problems.html">
+here</a>
+and
+<a href="http://dbp-consulting.com/tutorials/StrictAliasing.html">
+here</a>
+for discussions of the pitfalls related to aliasing.
+The C++
+@ref r123::ReinterpretCtr template is a safe way to reinterpret \c CBRNG
+counter types.
+Gcc's \c
+-Wstrict-aliasing=2 warning level will warn if strict aliasing
+violations are detected. If you find yourself ignoring or disabling
+warnings about strict aliasing, you should strongly consider adding something
+like gcc's \c -fnostrict-aliasing option to your compiler
+flags.
+
+\section cxxapi C++ API
+
+There are four families of CBRNGs in the library:
+<ul>
+<li> @ref ThreefryNxW "Threefry": @ref r123::Threefry2x32, @ref r123::Threefry4x32, @ref r123::Threefry2x64, @ref r123::Threefry4x64
+<li> @ref PhiloxNxW "Philox": @ref r123::Philox2x32, @ref r123::Philox4x32, @ref r123::Philox2x64, @ref r123::Philox4x64
+<li> @ref r123::AESNI4x32, r123::AESNI1xm128i
+<li> @ref r123::ARS4x32_R
+</ul>
+
+A <i> counter based RNG </i> (CBRNG) with a name of the form
+<i>FamilynameN</i>x<i>W</i> is a type G
+with the three member typedefs:
+
+<ul>
+<li> G::ctr_type, which is an @ref arrayNxW "r123arrayNxW" container class.
+<li> G::ukey_type, which is an @ref arrayNxW "r123arrayMxV" container class.
+Note that the width, \c MxV of the key
+may not be the same as the width \c NxW of
+the ctr_type (@ref PhiloxNxW "Philox" keys are half as wide as the counter,
+and future CBRNGs may well have different widths).
+<li> G::key_type, which in most cases is identical to
+G::ukey_type, but is different for the @ref AESNI "AESNI" types.
+In all cases, there is a G::key_type(G::ukey_type) constructor
+and a G::key_type assignment operator for a G::ukey_type
+right-hand-side. In general, one can always write:
+@code
+ G::ukey_type uk1, uk2;
+ // user code initializes uk1 and uk2
+ G::key_type k1(uk1), k2;
+ k2 = uk2;
+@endcode
+</ul>
+For most CBRNG's, i.e., any one not in the @ref AESNI "AESNI" family, it is also
+perfectly acceptable to set the elements of a G::key_type directly from application variables.
+The quality of the results will not be compromised by using highly correlated
+or "non-random" keys.
+
+A value \c g of type \c G can be invoked as <c>g(c,k)</c>, where \c c
+is a value of type \c G::ctr_type and \c k is a value of type \c G::key_type,
+and <c>g(c,k)</c> returns a value of type \c G::ctr_type.
+
+<ul>
+<li> g() is a stateless, pure function. That is, g(c,k) may be called
+any number of times in any context and always returns the same result
+for the same inputs. In particular, c1==c2 and k1==k2 implies that g(c1,k1)
+== g(c2,k2).
+<li> For constant k, g(*,k) is a bijection. That is,
+g(c1,k) == g(c2,k) if and only if c1 == c2.
+<li> g "randomizes" its inputs. That is,
+for most sequences of inputs (c1,k1),
+(c2, k2), ... (including those obtained by following highly
+regular patterns of incrementing and striding
+through the counter and user key spaces) the output sequence, g(c1, k1),
+g(c2, k2), ... looks like a a sequence of uniformly distributed
+random variables drawn from the set of all ctr_types.
+</ul>
+
+All the CBRNGs in the library work by iterating a randomization function for a specific number of \e rounds.
+Too few rounds and the CBRNG is a poor (perhaps
+catastrophically poor) random number generator. Too many rounds and time is wasted
+with little or no improvement in the randomness of the output. Each of the CBRNGs
+has a specific number of rounds which the authors believe is a reasonable compromise
+between speed and quality. In all cases, the default number of rounds includes a margin
+of safety above the minimum number of rounds that have passed all of the SmallCrush, Crush and BigCrush
+tests in the <a href="http://www.iro.umontreal.ca/~simardr/testu01/tu01.html"> TestU01</a> suite.
+
+Users may, however wish to employ a different numbers of rounds. Each of the above
+classes is actually a typedef of a more general class with a template parameter that
+specifies the number of rounds as <i>name</i>_rounds. The template classes all end in \c _R:
+
+<ul>
+<li> @ref ThreefryNxW "Threefry": @ref r123::Threefry2x32_R, @ref r123::Threefry4x32_R, @ref r123::Threefry2x64_R, @ref r123::Threefry4x64_R
+<li> @ref PhiloxNxW "Philox": @ref r123::Philox2x32_R, @ref r123::Philox4x32_R, @ref r123::Philox2x64_R, @ref r123::Philox4x64_R
+<li> @ref r123::AESNI4x32_R, r123::AESNI1xm128i_R
+<li> @ref r123::ARS4x32_R
+</ul>
+
+\section capi C API
+
+A subset of the C++ interface
+is also directly usable by C programs. All header files may be
+safely included in C files. The C API to each of the
+supported RNGs consists of two typedefs, <i>name</i>_ctr_t,
+<i>name</i>_key_t, two functions <i>name</i>() and <i>name</i>_R(), and
+the enum <i>name</i>_rounds which specifies the recommended number of rounds.
+<ul>
+<li> <i>name</i>(c, k), performs the recommended number of rounds of the <i>name</i> CBRNG.
+<li> <i>name_R</i>(R,c,k), performs an R-round version of the <i>name</i> CBRNG.
+<i>name</i>(c,k) is equivalent to
+<i>name</i>_R(<i>name</i>_rounds, c, k).
+</ul>
+
+The \c _R functions are designed and implemented so that an optimizing compiler can achieve good performance
+when the number of rounds is a compile-time constant. It is likely that <c>philox4x32_R(10,c,k) </c>
+will perform much better than <c>philox4x32_R(r,c,k)</c> if \c r cannot be
+evaluated at compile-time.
+
+The supported names for the C API are
+<ul>
+<li> @ref ThreefryNxW "threefry": @ref threefry2x32, @ref threefry4x32, @ref threefry2x64, @ref threefry4x64.
+<li> @ref PhiloxNxW "philox": @ref philox2x32, @ref philox4x32, @ref philox2x64, @ref philox4x64.
+<li> @ref ars4x32_R, @ref ars1xm128i_R
+<li> @ref aesni4x32, @ref aesni1xm128i
+</ul>
+
+*/
diff --git a/docs/header.html b/docs/header.html
@@ -0,0 +1,11 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>$title</title>
+<link href="$relpath$tabs.css" rel="stylesheet" type="text/css"/>
+$search
+<link href="$relpath$doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body onload='searchBox.OnSelectItem(0);'>
+<div class="tabs"><ul class="tablist"><li style="padding-left: 1.5em; font-weight: bold">$projectname $projectnumber Documentation</li></ul></div>
diff --git a/docs/main.dox b/docs/main.dox
@@ -0,0 +1,421 @@
+/**
+@mainpage Random123: a Library of Counter-Based Random Number Generators
+
+The Random123 library is a collection of counter-based random
+number generators (@ref CBRNG "CBRNGs") for CPUs (C and C++) and GPUs (CUDA and OpenCL), as described in
+<a href="http://dl.acm.org/citation.cfm?doid=2063405"><i>Parallel Random Numbers: As Easy
+as 1, 2, 3</i>, Salmon, Moraes, Dror & Shaw, SC11, Seattle, Washington, USA, 2011, ACM </a>.
+They are intended for use in statistical
+applications and Monte Carlo simulation
+and have passed all of the rigorous
+SmallCrush, Crush and BigCrush tests in the
+<a href="http://www.iro.umontreal.ca/~simardr/testu01/tu01.html">
+extensive TestU01 suite</a> of statistical tests for random number generators.
+They are \b not suitable for use in cryptography or security
+even though they are constructed using principles drawn from cryptography.
+
+The Random123 library is implemented entirely in header files.
+See @ref install "below", for how to
+install and use the library, and how to generate documentation
+with doxygen.
+
+CBRNGs are as fast as, or faster than conventional RNGs, much
+easier to parallelize, use minimal memory/cache resources, and
+require very little code. On modern architectures, the
+Random123 CBRNGs require a few cycles per byte of random data
+returned and return random data in convenient sizes (arrays of
+two or four elements, each element is an unsigned integer of 32
+or 64 bits. The range of random numbers is the full
+representable range of the 32 or 64 bit unsigned integer)
+The \c <Random123/u01.h> header contains utility functions
+to convert 32- and 64-bit unsigned integers to open or closed
+ranges of single or double precision floating point numbers.
+
+The Random123 library was written by John Salmon and Mark Moraes. It is
+available from
+<a href="http://deshawresearch.com/resources_random123.html">
+http://deshawresearch.com/resources_random123.html.</a> Please see
+the @ref LICENSE "license" for terms and conditions. Please
+send
+feedback, including bug reports, suggestions, patches, etc. to
+random123@deshawresearch.com.
+
+\section overview Overview
+
+Unlike conventional RNGs, counter-based RNGs are
+<b>stateless</b> functions (or function classes i.e. functors) whose
+arguments are a \e counter, and a \e key
+that return a result of the same type as the counter.
+
+ result = CBRNGname(counter, key)
+
+The returned result is a deterministic function of the key and counter,
+i.e. a unique (counter, key) tuple will always produce the same
+result. The result is highly sensitive to small changes in the inputs,
+so that the sequence of values produced by simply
+incrementing the counter (or key) is effectively indistinguishable from a
+sequence of samples of a uniformly distributed random variable.
+
+For all the CBRNGs in the Random123 library, the result and
+counter are the same type, specifically an array of \e N words,
+where words have a width of \e W bits, encapsulated in @ref
+arrayNxW "r123arrayNxW" structs, or equivalently, for C++, in
+the @ref r123::Array1x32 "ArrayNxW" typedefs in the r123
+namespace. Keys are usually also arrayMxW types, but sometimes M is
+a different size than the counter N (e.g. Philox keys are half the
+number of elements as the counter, Threefry and ARS are the same number,
+AES uses an opaque key type rather than an array) The N random
+numbers returned in \c result.v[] are unsigned integers of
+width W (32 or 64), and the range of the random numbers is the full
+range of the unsigned integer of that width (i.e. 0 to 2^W-1)
+
+In C++, all public names (classes, structs, typedefs, etc) are in the
+\c r123 namespace. In C, the public names (functions, enums, structs,
+typedefs) begin either with \c %r123 or with one of the RNG family names, e.g., \c
+threefry, \c philox, \c ars, \c aesni. The RNG functions themselves have names like
+\c philox4x32. C++ class names are capitalized, e.g., \c Threefry4x32.
+
+\section families The different families of Random123 generators
+
+Several families of CBRNGs are available in this version of the library:
+<ul>
+<li> @ref ThreefryNxW "Threefry" is a <b>non-cryptographic</b>
+adaptation of the Threefish block cipher from the <a href="http://www.skein-hash.info/"> Skein Hash Function</a>.
+See @ref r123::Threefry2x32, @ref r123::Threefry4x32, @ref r123::Threefry2x64, @ref r123::Threefry4x64.
+<li> @ref PhiloxNxW "Philox" uses a Feistel network and integer multiplication.
+See @ref r123::Philox2x32, @ref r123::Philox4x32, @ref r123::Philox2x64, @ref r123::Philox4x64.
+The Nx64 forms are only available on hardware
+that supports 64-bit multiplication producing a 128-bit result.
+<li> @ref AESNI "AESNI" uses the Advanced Encryption Standard (AES) New Instruction,
+available on certain modern x86 processors (some models of Intel Westmere and Sandy Bridge,
+and AMD Interlagos, as of 2011). AESNI CBRNGs can operate on four 32bit words (internally converting
+them to the 128bit SSE type needed by the AES-NI instructions, or on a single m128i "word",
+which holds the SSE type.
+See @ref r123::AESNI4x32, @ref r123::AESNI1xm128i.
+<li> @ref AESNI "ARS" (Advanced Randomization System) is a \b non-cryptographic simplification of @ref AESNI "AESNI".
+See @ref r123::ARS4x32_R, @ref r123::ARS1xm128i_R.
+</ul>
+
+\section install Installation and Testing
+
+The Random123 library is implemented entirely in header files. Thus,
+there is nothing to compile before using it and nothing to link after
+you <c>\#include</c> it in your source files. Simply direct your C or
+C++ compiler to find the header files in the \c include/ directory
+of the cloned repo and use the Random123
+header files, types and functions in your application.
+
+There is a top-level GNUmakefile with "install" and "install-html"
+targets. The former will copy header files to $(DESTDIR)$(includedir)
+(default: /usr/local/include). The latter will run doxygen, with
+OUTPUT_DIRECTORY=$(DESTDIR)$(docdir)/html (default: /usr/local/doc/Random123/html).
+
+In addition to the \c include/ files which implement the library the
+distribution also contains an \c examples/ and a \c tests/ directory. Users are <b>
+STRONGLY ADVISED </b> to compile and run the tests in tests/ before using
+Random123 in an application (see <c> @ref TestsREADME "tests/README"</c>).
+Do not use the library if any tests fail. (It is not a failure for
+a test to report that it cannot run because of missing
+hardware capabilities like 64bit multiply,
+SSE, AES-NI or compiler capabilities)
+
+\section usage Usage
+
+\subsection CxxAPI C++ API
+
+A typical C++ use case might look like:
+
+@code
+#include <Random123/philox.h>
+
+typedef r123::Philox4x32 RNG;
+RNG rng;
+RNG::ctr_type c={{}};
+RNG::ukey_type uk={{}};
+uk[0] = ???; // some user_supplied_seed
+RNG::key_type k=uk;
+
+for(...){
+ c[0] = ???; // some loop-dependent application variable
+ c[1] = ???; // another loop-dependent application variable
+ RNG::ctr_type r = rng(c, k);
+ // use the random values in r for some operation related to
+ // this iteration on objectid
+}
+@endcode
+
+On each iteration,\c r contains an array of 4 32-bit random values that
+will not be repeated by any other call to \c rng as long as \c c and \c k
+are not reused.
+
+In the example above, we use the @ref r123::Philox4x32, but any of the
+other @ref CBRNG "CBRNGs" would serve equally well. Also note that
+for most CBRNGs, the ukey_type and the key_type are identical; the code
+could just as well ignore the ukey_type and directly construct the
+key_type. However, for the @ref AESNI "AESNI" CBRNGs, the key_type is opaque, and
+must be constructed from a ukey_type, as shown.
+
+\subsection Capi The C API
+
+In C, the example above could be written as:
+@code
+#include <Random123/philox.h>
+
+philox4x32_ctr_t c={{}};
+philox4x32_ukey_t uk={{}};
+
+uk.v[0] = user_supplied_seed;
+philox4x32_key_t k = philox4x32keyinit(uk);
+
+for(...){
+ c.v[0] = ???; /* some loop-dependent application variable */
+ c.v[1] = ???; /* another loop-dependent application variable */
+ philox4x32_ctr_t r = philox4x32(c, k);
+}
+@endcode
+
+In C, access to the contents of the counter and key is through
+the fixed-size array member \c v.
+
+\section cuda The CUDA platform
+
+All relevant functions in the C and C++ APIs for Random123 are declared
+as CUDA device functions if they are included in a CUDA kernel source file
+and compiled with a CUDA compiler (nvcc). They can be used exactly
+as described/documented for regular C or C++ programs. It is now
+possible to use Random123 functions in
+both the host portion and the device portion of the same .cu source file.
+The Nx32 forms were faster than the Nx64 variants on
+32-bit GPU architectures in 2011, but we haven't measured this recently.
+
+It has been reported that Random123 uses 16 bytes of
+static memory per thread. This is undesirable and not intentional,
+but we do not have a workaround other than to suggest adjusting memory
+allocation accordingly.
+
+The
+pi_cuda.cu and pi_cudapp.cu examples illustrate the use of CUDA.
+
+In a machine with different GPUs, the
+R123EXAMPLE_ENVCONF_CUDA_DEVICE environment variable can be set
+to a unique substring of the CUDA GPU device name to select a
+specific GPU (else examples try to choose the GPU with the most
+cores)
+
+\section opencl The OpenCL platform
+
+The functions in the Random123 C API can all be used in
+OpenCL kernels, just as in regular C functions.
+As with CUDA, the Nx32 forms are faster than the Nx64 variants on current (2011)
+32-bit GPU architectures.
+
+The pi_opencl.c and pi_opencl_kernel.ocl examples illustrate the use
+of OpenCL.
+
+In a machine with different OpenCL devices, the
+R123EXAMPLE_ENVCONF_OPENCL_DEVICE environment variable can be
+set to a unique substring of the OpenCL device name to select a
+specific OpenCL device (else examples try to choose the device
+with the most cores)
+
+\section cplusplus0x C++11 \<random\> interface
+
+In addition to the stateless ("pure/functional") C++ API above,
+the Random123 package includes two C++ classes
+that leverage the C++11 \<random\> API.
+
+<ul>
+<li>r123::MicroURNG provides an adapter class that provides a
+more conventional interface compatible with the C++11 URNG
+(uniform random number generator) API; the MicroURNG adapter can
+be used with C++11 random number distributions and is
+fast/lightweight enough that a new MicroURNG can be instantiated
+with a unique key,counter tuple and used for each call to a
+distribution, there is little or no overhead to creating
+billions of unique MicroURNGs. This adapter retains one of the
+key advantages of CBRNGs -- complete application control over
+the RNG state.
+<li>r123::Engine provides the C++11 Random Engine API. This can
+also be used with any of the C++11 random distributions, but
+sacrifices the application control over RNG state that is a
+defining characteristic of CBRNGs.
+</ul>
+
+\section gsl The GNU Scientific Library (GSL) interface
+
+In addition to the stateless ("pure/functional") C API above,
+the Random123 package includes two C adapter interfaces
+to the <a href="http://www.gnu.org/s/gsl/">GNU Scientific Library (GSL).</a>
+
+<ul>
+<li>The \ref GSL_MICRORNG macro allows the application to
+define a GSL random number generator. It
+can be used with GSL random distributions but still provides the
+application with complete control over the RNG state (it is
+analogous to the MicroURNG class, in that it uses shorter
+periods, and is intended to be instantiated in large numbers for
+a few calls to the random distribution).
+<li>The \ref GSL_CBRNG macro allows the application to create a GSL
+RNG with a completely conventional interface, sacrificing
+application control over the internal RNG state.
+</ul>
+
+\section u01 Generating uniformly distributed and Gaussian distributed floats and doubles
+
+The Random123 library provides generators for uniformly distributed
+random \b integers. Often, applications want random \b real values or
+samples from other distributions. The general problem of generating
+samples from arbitrary distributions is beyond the scope of the Random123
+library. One can, of course, use GSL or MicroURNG and the
+distributions in the C++11 \<random\> library, but a few simple cases
+are common enough that all that extra machinery seems like overkill.
+We have included a few generic conversion utilities which developers may
+find useful.
+
+<ul>
+<li> uniform.hpp - C++ functions that convert random integers to
+ random, uniformly distributed floating point values.
+<li> u01fixedpt.h - C functions that convert random integers to
+ random, uniformly distributed, equi-spaced, i.e., fixed point,
+ values.
+<li> boxmuller.hpp - C++ functions that take two
+ uniformly distributed integers (32 or 64 bit) and
+ return a pair of Gaussian distributed floats or doubles.
+</ul>
+
+The Box-Muller method of generating Gaussian random variables is
+particularly well suited to Random123 because it deterministically
+consumes exactly two uniform randoms to generate exactly two gaussian
+randoms. It uses math library functions: sincos, log and sqrt which
+may be slow on some platforms, but which are surprisingly fast on
+others. Notably, on GPUs, the lack of branching in the Box-Muller
+method and hardware support for math functions overcomes the
+transcendental function overhead, making it the fastest generator of
+Gaussians that we are aware of.
+
+\subsection examples Examples
+
+The @ref ExamplesREADME "examples/" directory, contains example code
+intended to illustrate use of the library.
+
+Complete, short programs estimate pi by counting the number of random
+points that fall inside a circle inscribed in a square, demonstrating
+the C, C++, AES, GSL, OpenCL, CUDA and C++11 APIs. The environment
+variable R123EXAMPLE_ENVCONF_SEED can be set to any unsigned integer value to run
+the example with a different seed. Many of the pi_* examples run different
+numbers of iterations if that number is specified as the first argument
+on the command line.
+
+\subsection tests Tests and Benchmarks
+
+The @ref TestsREADME "tests/" directory contains tests and benchmarks.
+This code is complicated due to the fact that it is
+largely "single source" for CUDA, OpenCL and CPU implmentations.
+Developers are strongly discouraged from emulating its style.
+It contains:
+<ul>
+<li> Unit tests for individual components and "known-answer-tests", which
+should be run to ensure that these RNGs build correctly on desired platforms.
+These help to provide assurance that the code is being compiled correctly.
+<li> A variety of timing harnesses are provided
+which measure performance of a variety of generators in different
+programming environments.
+</ul>
+
+\section portability Portability
+
+Although we have done our best to make Random123 portable and standards conforming,
+it is an unfortunate fact that there is no portable code. There is only
+code that has been ported.
+
+Prior to release, we test Random123 on a variety of systems and with a
+variety of toolchains that are readily available to us. Our
+current test environment includes:
+
+<ul>
+<li> Linux, gcc-5.2.0, 6.3.0, 8.1.0, 10.1.0 using -march=native on Xeon hardware with
+ AES and SSE4_2 and AVX2 support.
+<li> Linux, gcc-5.2.0 using -m32.
+<li> Linux, clang-8.0.0 with libc++ (8.0.0) on Xeon hardware.
+<li> Linux, CentOS7 using the vendor supplied gcc toolchain (4.8.5-16).
+<li> Linux, Ubuntu 16.04(LTS) using the vendor supplied gcc toolchain (5.4.0-6ubuntu1-16.04.11).
+<li> Linux, Ubuntu 16.04(LTS) using OpenCL beignet 1.1.1-2 and https://github.com/intel/compute-runtime/releases/tag/19.07.12410
+<li> Linux, Ubuntu 18.04(LTS) with clang-11.0.1 and both libc++ and libstdc++.
+<li> Linux, icc-18.0.3 and 19.1.2.254 on Xeon hardware with AES, SSE4 and AVX2 support.
+<li> Linux, NVIDIA CUDA 10.0.130 with GTX 980 and 1080, and Titan RTX (aka Turing) hardware.
+<li> MacOS, with Xcode-10.1 and Metal on a 2018 Mac mini.
+</ul>
+
+In the past, we have tested Random123 with additional toolchains and
+hardware. Although we no longer test on these platforms, we know of
+no reason that they should not work.
+
+<ul>
+<li>Linux, gcc (multiple versions from 3.4.3 through 6.3.0), on x86_64.
+<li>Linux, gcc-4.1.2 and 4.4.1 on i686.
+<li>Linux, gcc-4.8 on ARMv7 (32bit) Freescale/NXP LS1021A & ARM A53 (64bit) Freescale/NXP 1043A.
+<li>Linux, clang-2.9, 3.0, 3.1, 3.3 and 3.6 on x86_64.
+<li>Linux, clang-3.0 and 3.1 with lib++ (2012-04-19 svn checkout) on x86_64.
+<li>Linux, clang-8.0.0 with libc++ on x86_64
+<li>Linux, open64-4.2.4 on x86_64.
+<li>Linux, Intel icc and icpc 12.0.2 on x86_64.
+<li>Linux, NVIDIA CUDA 4.1.15, 4.2.6, 5.5.22 and 7.5.1. (NOTE: We recommend against the use of CUDA before 4.1)
+<li>Linux, OpenCL (NVIDIA SDK 4.0.17) on GTX480, M2090, GTX580 and GTX680 GPUs.
+<li>Linux, OpenCL (AMD APP SDK 2.4 or 2.5), on x86_64 CPUs and Radeon HD6970 GPUs.
+<li>Linux, OpenCL (Intel OpenCL 1.5), on x86_64 CPUs.
+<li>Solaris, both gcc-3.4.3 and Sun C/C++ 5.8, on x86_64.
+<li>FreeBSD 8.2, gcc-4.2.1, on x86_64.
+<li>MacOS X 5.8, gcc-4.0.1, on i686.
+<li>MacOS X 5.8, llvm-2.9.1 on i686 (problems with catching C++ exceptions).
+<li>Windows 7, Microsoft Visual Studio, version 10.0, Microsoft C/C++ compiler 16.00.
+</ul>
+
+Others have reported success on
+<ul>
+<li>MacOS, OpenCL on x86_64 CPUs
+<li>Linux, gcc-4.7.2 on Powerpc64 (BlueGene/Q)
+<li>Linux, Portland Group Compiler on Powerpc64 (BlueGene/Q)
+<li>Linux, IBM xlc on Powerpc64 (BlueGene/Q)
+<li>MacOS, Metal on x86_64 CPUs and AMD Radeon R9 M380 GPU
+<li>MacOS Sierra and Scientific Linux with Nvidia GPU and CUDA 8
+<li>Linux, on s390x
+</ul>
+
+\section warnings Warnings
+
+With some compilation options, the CUDA nvcc compiler warns about
+unreachable code in array.h. The compiler doesn't recognize that the
+code that is unreachable for some values of some macro parameters, is
+actually reachable for other values of the parameters. It is possible
+to disable that particular warning for a specific compilation unit by
+adding -Wcudafe --diag_suppress=111 to the compilation command
+line.
+
+On our ARMv7 test platform, we suspect a compiler bug with -O3,
+which does not seem to affect Random123 code itself, but
+produces nondeterministic results from time_serial. The
+offending compiler version was
+"aarch64-fsl-linux-gcc (Linaro GCC 4.8-2014.04) 4.8.3 20140401 (prerelease)".
+We slightly reordered a couple of innocuous statements (a
+timer() and dprintf() call) in time_serial to avoid the bug, but
+we would avoid -O3 on ARMv7 with that particular version of the
+compiler at least.
+
+\section contributors Contributors
+
+We welcome bug reports, new ports, success stories or any
+feedback to random123@deshawresearch.com
+
+We are grateful for contributed bug-fixes and portability enhancements from the following users:
+<ul>
+<li> Geoffrey Irving and Gabriel Rockefeller - BlueGene/Q and powerpc ports
+<li> Yan Zhou - MacOS and clang ports
+<li> David Lawrie - allowing 64-bit philox to compile for both host and device with CUDA
+<li> Bogdan Opanchuk - pointing out the inconsistent rotation constants in the implementation of threefry2xW in version 1.07 and earlier.
+<li> Tom Schoonjans - Support for Metal (Apple's successor to OpenCL)
+<li> Karl Magdsick - documentation in uniform.hpp
+<li> KT Thompson - Visual Studio 2015 and ibm xlc compiler ports
+</ul>
+*/
+
+
diff --git a/docs/releasenotes.dox b/docs/releasenotes.dox
@@ -0,0 +1,212 @@
+/**
+@page "Release Notes"
+<dl>
+<dt>1.14 - ??? ??, 2020 </dt>
+<dd><ul>
+<li> Correctly identify newer versions (16+) of IBM's XL compiler
+<li> Better support for MS Visual Studio 2015 (and hopefully later)
+<li> Allow compilation on s390x.
+<li> Don't use arrays internally in the threefry implementations.
+ This seems to avoid register spills when compiled with icc, and
+ has no apparent effect on gcc's code generation.
+<li> Remove error-prone code to discover CPU clockspeed. Don't report cpB in timing tests.
+<li> Remove error-prone code to "clean" device names and parse hex float strings.
+<li> Suppress some warnings from gcc10:
+ - don't use size_t if stddef hasn't been included
+ - declare default copy-assignment and move-assignment operators in Engine.
+</ul></dd>
+
+<dt>1.13 - Mar 22, 2019 </dt>
+<dd><ul>
+<li> Don't try to declare reverse iterators for r123array in cuda.
+<li> Add support for Apple's Metal Shading Language (2.1) - contributed by Tom Schoonjans.
+ - Implementation of 32-bit threefry and philox.
+ - metalfeatures.h, plus new macros in compilerfeatures.h,
+ used in threefry.h, philox.h and kat infrastructure.
+ - tests/kat_metal and examples/pi_metal.
+<li> Small tweaks to silence warnings from newer gcc, clang, cuda and opencl.
+<li> Cosmetic changes to doxygen markup, including fixes to work with newer releases of doxygen.
+</ul></dd>
+
+<dt>1.12 - not publicly released</dt>
+<dd>
+</dd>
+
+<dt>1.11 - Mar 30, 2017 (not publicly released)</dt>
+<dd><ul>
+<li> Changes to conventional/Engine.hpp:
+ - The sequence of generated randoms is unchanged.
+ - shrink the memory footprint by not keeping a copy of the ukey in the Engine and storing the 'elem' counter in v.back().
+ - insertion and extraction operators have changed incompatibly. I.e.,
+ engines serialized with 1.10 or earlier cannot be deserialized
+ with 1.11, and vice versa.
+ - getkey returns a key_type and setkey takes a key_type.
+ - when ukey_type is not the same as key_type, provide a constructor
+ and a seed method that takes a const key_type& argument.
+ - the getseed method is eliminated.
+<li> Move uniform.hpp, boxmuller.hpp and u01fixedpt.h into
+ include/Random123. I.e., make them available in exactly
+ the same way as threefry.h, et al. It is no longer necessary
+ to copy them from the examples directory to user code.
+<li> Incorporate ua.hpp into uniform.hpp.
+<li> Provide insertion, extraction and comparison operators to the
+ aesopenssl16x8_key_t and aesni1xm128_key_t.
+<li> Separate tests and benchmarks (which are absurdly complicated)
+ from examples (which are meant to be short and simple) in
+ the source tree. We still test and time the same things, but all
+ that code is in tests/, while the code remaining in examples/
+ really tries to be exemplary.
+<li> More careful use cl_uint and elimination of uint from opencl code.
+<li> Better (but not reliable) support for OpenCL on MacOS.
+<li> Fix documentation for examples/uniform.hpp.
+</ul></dd>
+
+<dt>1.10 - Apr 12, 2016 </dt>
+<dd><ul>
+<li> R123EXAMPLE_ENVCONF_SEED environment variable provides seed to most pi_* examples
+<li> R123EXAMPLE_ENVCONF_CUDA_DEVICE and R123EXAMPLE_ENVCONF_OPENCL_DEVICE allow selection of non-default
+ GPUs, e.g. R123EXAMPLE_ENVCONF_CUDA_DEVICE=980 pi_cuda
+ or R123EXAMPLE_ENVCONF_OPENCL_DEVICE=680 pi_opencl
+<li> Updated hardcoded device core detection with newer GPUs (Kepler, Maxwell)
+ and changed default cores from 1 to 384 to run more sensible number of
+ iterations on unrecognized devices.
+<li> moved lots of arbitrary, funny, irrelevant constants into example_seeds.h so that they do
+ not confuse the punters.
+<li> Tested on ARMv7 (32bit) and `ARM A53 (64bit) with Freescale/Linaro toolchain gcc 4.8.
+ Needed workaround for -O3 compiler bug on ARMv7.
+</ul></dd>
+<dt>1.09 - Mar 6, 2016 </dt>
+<dd><ul>
+<li> add \#define R123_USE_U01_DOUBLE to u10fixedpt.h
+<li> fix definition of const char *srcstr[] in util_opencl.h
+<li> improve nvccfeatures.h so that 64-bit philox can be used
+both on the host and on the cuda device.
+<li> add _Pragmas so R123_STATIC_ASSERT doesn't warn with clang-3.6.
+<li> boxmuller.hpp doesn't look for sincos when __APPLE__ is true.
+</ul></dd>
+<dt>1.08 - Aug 20, 2013 </dt>
+<dd><ul>
+<li> Fix a bug in threefry2xW whereby rotation constants were
+chosen incorrectly after the 20th round. There is no reason to
+suspect that the incorrectly chosen rotation constants were "bad"
+or "deficient" so there is no reason to suspect the quality of the
+random numbers produced. Using threefry with R>20 would have been
+rare in any case. The fix simply makes the implementation correspond
+correctly to the description in the paper.
+<li> Add examples/uniform.hpp, examples/boxmuller.hpp and
+ examples/ua.hpp, containing example code to generate uniformly
+ and gaussian distributed floats and doubles. Also add unit tests
+ (ut_uniform.cpp, ut_uniform_IEEEkat.cpp) and timing harnesses
+ (time_boxmuller.cpp and time_boxmuller_cuda.cpp).
+<li> overhaul u01_closed_closed and u01_open_open so they produce
+ equally spaced/probable values except for endpoints.
+<li> Demote u01.h from the include/Random123/ to examples/ufixed01.h, but
+ examples/uniform.hpp is preferred.
+<li> Add kat_vectors for threefry2xW_32 and threefry4xW_72, i.e., the
+largest number of supported rounds in each case.
+<li> Mention ukey on the first page of docs.
+<li> Fix typos in documentation and comments and in gccfeatures.h.
+<li> Don't \#include <x86intrin.h> unless (defined(__x86_64__)||defined(__i386__)).
+<li> Use __clang__ rather than __llvm__ in the predicate that decides whether to
+ include clangfeatures.h.
+<li> Add support for Portland Group compilers.
+<li> Add support for gcc and IBM XL compilers on powerpc64, e.g. BlueGene/Q.
+<li> Port to PPC. (BG/L)
+<li> Refuse to build with CUDA before 4.1 to avoid namespace bug.
+<li> Update/fix core count hackery NVIDIA Tesla K20c
+</ul></dd>
+
+<dt>1.07 - Nov 7, 2012 </dt>
+<dd><ul>
+<li> Provide const static data members: _Min and _Max in Engine and MicroURNG, which
+work around a non-standard requirement imposed by the MacOS Xcode 4.5.2 <random> library.
+<li> Fine-grained test macros for specific features of C++11 rather than
+an all-or-none USE_CXX0X macro. Features tested:
+constexpr, unrestricted unions, explicit conversions, <random> and <type_traits>.
+<li> Declare max() and min() methods with the R123_CONSTEXPR attribute
+in Engine and MicroURNG.
+<li> Improved clang support
+<li> Works with Solaris Sun CC now (requires -library=stlport4)
+<li> NVIDIA GTX6x0 should report correct core count
+<li> ut_features prints the list of features that compile on the build platform
+<li> Compiles cleanly with -Wall -Wextra (implying -Wunused-parameter -Wsign-compare)
+</ul></dd>
+
+<dt>1.06 - Apr 5, 2012 </dt>
+<dd><ul>
+<li> Added a known answer test for the u01 functions (kat_u01).
+<li> Defend headers against possible max and min macros in "system" header files.
+</ul></dd>
+
+<dt>1.05 - Mar 20, 2012 </dt><dd>
+<ul><li>
+MicroURNG and GSL_MICROURNG no longer give the programmer control
+over the number bits in the internal counter via a template or macro argument.
+Such flexibility is too easy to misuse, with the possible consequence
+of repeating random values. Now, all MicroURNGs have a period in
+excess of 2^32, and MicroURNG<CBRNG>(c1, k1)
+and MicroURNG<CBRNG>(c2, k2) "collide" if and only if c1==c2 and k1==k2.</li>
+<li>Added <Random123/u01.h> header file with static functions for conversion
+of integers to uniformly distributed floating point values.</li>
+<li>Make operator<<(ostream&, const r123array&) and operator>>(ostream&, r123array&)
+inline. This should work around ODR violations when the header files are
+included in more than one file in a project.</li>
+<li>Recognize that icpc has an _mm_set_epi64x intrinsic as of version 12.1.</li>
+<li>The gsl adapters always return 32-bits of random data, regardless of the
+width of counter type.</li>
+<li>Works around lack of anonymous enums in Intel OpenCL 1.5</li>
+<li>gencl.sh works on MacOS and systems with "classic" BSD indent.</li>
+<li>Tests run on AMD Radeon 7970 (Tahiti).</li>
+</ul>
+
+</dd>
+
+<dt>1.04 - Dec 5, 2011</dt><dd>
+<ul><li>
+new kat_vectors - there are now three tests for each tested generator: gen(ctr=0, key=0), gen(ctr=fff, key=0xfff),
+ and gen(ctr=digits-of-pi, key=more-digits-of-pi). There are fewer tests overall, but they provide
+ better coverage, especially of non-zero keys.</li>
+</ul>
+</dd>
+
+<dt>1.03 - Nov 30, 2011</dt><dd>
+<ul>
+<li> overhaul known answer tests (kat)
+ <ul>
+ <li> common source for serial C, C++, cuda and opencl replaces katc and katpp </li>
+ <li> add missing kat_vectors for threefry2x32 </li>
+ </ul></li>
+<li> make keyinit functions device/kernel functions in CUDA/OpenCL </li>
+<li> replace r123array::assemble methods with r123array::seed(SeedSeq) template </li>
+<li> cleanup of signatures of Engine and MicroURNG methods:
+ <ul>
+ <li> Engine(ukey_type&) and MicroURNG(ctr_type, ukey_type) constructors.</li>
+ <li> Engine(SeedSeq&) takes a reference argument, and, when C++0x <type_traits>
+ are available the SeedSeq templates don't participate in "surprising" overloads. </li>
+ </ul>
+</li>
+</ul>
+</dd>
+
+<dt>1.02 - Nov 21, 2011</dt><dd>
+<ul>
+<li>
+<b> BUG FIXED </b> in threefry2xW_R(R<20, ...). Earlier implementations of
+threefry2x32_R and threfry2x64_R produced incorrect
+results when called with the number of rounds less than 20.
+The bug caused extra work to be done in every call, possibly resulting in <i>more</i>
+mixing than the correct implementation delivers. Both old (buggy, more mixing) and new (bug-fixed, less mixing)
+implementations have been rechecked and are fully "Crush-Resistant". </li>
+<li>worked around problems with argument marshalling in version 2.4 of the AMDAPPSDK OpenCL implementation</li>
+</ul>
+</dd>
+
+<dt>1.01 - Nov 11, 2011</dt><dd>
+<ul>
+<li>allow the user to define __STDC_CONSTANT_MACROS</li>
+<li>allow r123arrayNxW::incr(larger_than_largest_value_type)</li>
+</ul>
+
+<dt>1.00 - Sep 26, 2011</dt><dd>Initial release</dd>
+</dl>
+*/
diff --git a/examples/GNUmakefile b/examples/GNUmakefile
@@ -0,0 +1,156 @@
+no_target_specified: runcore
+ @echo
+ @echo The default make rule is equivalent to \'make runcore\' which builds
+ @echo and runs most of the examples.
+ @echo The following \'meta-targets\' are available:
+ @echo " " $(meta_targets)
+ @echo Here is the complete list of individual program targets:
+ @echo " " $(all_primary_targets)
+ @echo Prepend \'run\' to any of the program targets or metatargets
+ @echo to run the binary and check for a zero exit status.
+ @echo Adding force=1 on the command line causes all targets to be considered out-of-date.
+.PHONY: no_target_specified
+
+# metatargets are variables which get mapped by METATARGET_template
+meta_targets:=core aesni c cpp gsl cuda opencl thread metal
+
+# Platform metatargets: each one typically has specific requirements in the build environment.
+# c is C99 (will work in MSVC), cpp is C++98, gsl requires the GNU Scientific Library
+# (specifically, the gsl-config program in the PATH), thread requires POSIX threads,
+# CUDA requires NVIDIA CUDA 3.x or newer, OpenCL requires OpenCL includes & libraries
+# (e.g. AMD APP SDK, NVIDIA SDK)
+c:=simple pi_capi
+cpp:=simplepp pi_uniform pi_cppapi pi_microurng
+gsl:=pi_gsl
+cuda:=pi_cuda pi_cudapp
+opencl:=pi_opencl
+thread:= # ?? should we have a thread example?
+metal:=pi_metal
+
+# Convenience metatargets: these are to help developers test functional subsets across platforms
+core:=$(c) $(cpp)
+aesni:=pi_aes
+
+$(gsl) : override LDLIBS += `gsl-config --libs`
+$(gsl) : override CFLAGS += `gsl-config --cflags`
+
+$(opencl) : % : %_kernel.i
+# Or try this if we USE_GENCL in kat_opencl.c
+#$(opencl) : override CPPFLAGS += -DSRCDIR=\"$(dir $(abspath $<)).\"
+
+ifeq ($(shell uname),Darwin)
+$(opencl) : override LDLIBS+=-framework OpenCL
+else
+$(opencl) : override LDLIBS+=-lOpenCL
+endif
+$(opencl) : override CFLAGS+=-I.
+# Note, the Intel OpenCL SDK (1.5) has unresolved C++ symbols in its
+# libOpenCL.so Even though 'main' is a C program, you may need to link
+# it with a C++ compiler-driver, e.g., g++. Since this Makefile does
+# compile-and-link in one step, use something like:
+# $(opencl) : CC=g++ -xc
+# which will invoke the g++ compiler-driver, but will treat the
+# program as C rather than C++.
+
+$(metal) : % : %_kernel.metallib
+$(metal) : override LDLIBS+=-framework Metal -framework Foundation -framework CoreGraphics
+
+all_primary_targets += $(addsuffix _kernel.i, $(opencl))
+all_primary_targets += $(addsuffix _kernel.metallib, $(metal))
+all_primary_targets += $(addsuffix _kernel.air, $(metal))
+
+################################################
+# Generic boilerplate from here down:
+vpath %.c $(srcdir/)
+vpath %.cpp $(srcdir/)
+vpath %.cu $(srcdir/)
+vpath %.ocl $(srcdir/)
+vpath %.metal $(srcdir/)
+
+define METATARGET_template
+.PHONY: $(1)
+$(1) : $(filter-out $(SKIP_TARGETS), $($(1)))
+.PHONY: run$(1)
+run$(1) : $(addprefix run, $(filter-out $(SKIP_TARGETS), $($(1))))
+all_primary_targets += $($(1))
+endef
+
+$(foreach T,$(meta_targets), $(eval $(call METATARGET_template,$(T))))
+
+# sort also does 'uniq'
+all_primary_targets:=$(sort $(all_primary_targets))
+
+INC=$(srcdir/)../include
+override CPPFLAGS += -I$(INC)
+
+ifndef NVCC
+NVCC:=nvcc
+endif
+# The rngs are *very* slow without optimization. In the simplest case,
+# where the user just calls 'make', we don't want them to see terrible
+# performance. Unfortunately, this might surprise someone
+# who says, e.g., make CPPFLAGS=-O0. Oh well...
+ifndef CFLAGS
+CFLAGS:=-O
+endif
+ifndef CXXFLAGS
+CXXFLAGS:=-O
+endif
+
+%.i : %.ocl
+ CC="$(CC)" CPPFLAGS="$(CPPFLAGS)" $(srcdir/)./gencl.sh $< > $@
+
+% : %.cu
+ $(NVCC) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH) $< $(LOADLIBES) $(LDLIBS) -o $@
+
+% : %.c
+ $(CC) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH) $< $(LOADLIBES) $(LDLIBS) -o $@
+
+% : %.cpp
+ $(CXX) $(CXXFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH) $< $(LOADLIBES) $(LDLIBS) -o $@
+
+% : %.m
+ $(CC) $(OBJCFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH) $< $(LOADLIBES) $(LDLIBS) -o $@
+
+%.air : %.metal
+ xcrun --sdk macosx metal $(CPPFLAGS) -c $< -o $@
+
+%.metallib : %.air
+ xcrun --sdk macosx metallib $< -o $@
+
+run% : %
+ ./$^ $(RUN_ARGS)
+
+# In lieu of autodepends, just say that all the compilation targets depend on all the headers.
+hdrs:=$(wildcard $(srcdir/)*.h $(srcdir/)gsl/*.c $(INC)/Random123/*.h $(INC)/Random123/*.hpp $(INC)/Random123/*/*.h $(INC)/Random123/*/*.hpp)
+misc:=$(wildcard $(srcdir/)*.cu $(srcdir/)*.ocl)
+$(all_primary_targets) : $(hdrs)
+$(misc) : $(hdrs)
+
+# If you put force=y on the command line, then $(all_primary_targets) will be
+# depend on FORCE, and hence will not be up-to-date.
+ifdef force
+$(all_primary_targets) : FORCE
+FORCE:
+endif
+
+.PHONY : echo_build_commands
+echo_build_commands:
+ make -n force=1 $(all_primary_targets) | grep -v 'is up to date'
+
+.PHONY : clean veryclean
+clean:
+ rm -f $(all_primary_targets)
+
+veryclean:
+ rm -f $(all_primary_targets) *.o \#* *~ *.pdb *.exe *.obj *.ilk *.suo
+
+.PHONY : install
+
+# N.B. normally these are exported by ../GNUmakefile
+prefix?=/usr/local
+datarootdir?=$(prefix)/share
+docdir?=$(datarootdir)/doc/Random123
+install:
+ mkdir -p $(DESTDIR)$(docdir)/examples
+ cp README GNUmakefile *.sh *.c *.h *.cpp *.cu *.metal *.m *.ocl $(DESTDIR)$(docdir)/examples
diff --git a/examples/README b/examples/README
@@ -0,0 +1,83 @@
+This file is examples/README and is also linked to from the doxygen main page.
+
+/**
+@page ExamplesREADME Examples
+
+The examples/ directory contains usage examples
+for the components of the Random123 library.
+
+@section building Compiling and Running the code
+
+Installing and using Random123 requires only the use
+of the header files, and has no prerequisites other than
+a reasonable C99 or C++98 compiler.
+
+With a modern GNU make (3.80 or newer), building and running the core tests
+and examples can be as easy as running gmake with no arguments.
+Note, though, that the provided examples/GNUmakefile intentionally avoids setting
+any of the standard make variables: CC, CXX, CPPFLAGS, CFLAGS,
+CXXFLAGS, TARGET_ARCH, LDFLAGS, LOADLIBES, LDLIBS. GNU make
+will inherit settings for these variables from the environment,
+or they may be set on the command line. If none are set,
+compilation will proceed using system-wide default flags, generally
+without advanced optimization, architectural tuning, warnings, or other
+common options.
+
+Before putting the Random123 library to use in an application,
+it is important to test it using the same compiler flags and
+features that the application will use. In other words,
+the conventional make variables should be set
+the same way when testing the library as they will be set when the
+library is actually compiled into your application.
+Something like:
+@code
+gmake CFLAGS="-std=c99" CXXFLAGS="-std=c++0x" CPPFLAGS="/alternate/location/include -O3 -Wall -Wstrict-aliasing=2" TARGET_ARCH="-march=native"
+@endcode
+would confirm that all is well with optimization on, and output targeted at
+an architecture with the same capabilities as the machine running the compilation.
+
+Very old versions of GNU make (pre-2002) or non-GNU
+make will not work with examples/GNUmakefile.. Lacking a suitably modern GNU make,
+our advice is to invoke the
+C or C++ compiler directly on the source files in the examples/ directory.
+
+@section examples Examples
+
+@subsection simple Simple examples in C and C++
+
+There are two extremely short examples that show all the code necessary to
+obtain and print a few random numbers in C and C++:
+<ul>
+<li> simple.c
+<li> simplepp.cpp
+</ul>
+
+@subsection pi Estimating pi using different APIs
+
+Using random numbers to estimate pi is a classic example. The idea
+is to choose points at random in a square and to count how many of
+them lie within the inscribed circle. Since the area of the square
+is 4*r^2 and the area of the circle is pi*r^2, the ratio of the
+number of points in the circle to the total number of points should
+approach pi/4 as the number of points grows.
+
+We give several examples of pi estimation, each of
+which illustrates a slightly different API
+
+<ul>
+<li> pi_capi - using only the basic C API
+<li> pi_cppapi - using only the basic C++ API
+<li> pi_u01 - using the C++ API and uniform.hpp
+<li> pi_gsl - using a Random123 generator, but a gsl distribution to obtain real-valued random numbers. <b>Requires the GNU Scientific Library</b>
+<li> pi_microurng - using a Random123 generator, but a C++11 \<random\> distribution to obtain real-valued random numbers
+<li> pi_cuda - using the Random123 library with CUDA, runnable on an NVIDIA GPU
+<li> pi_cudapp - using the C++ API with CUDA, runnable on an NVIDIA GPU
+<li> pi_opencl - using the Random123 library with OpenCL, runnable on any OpenCL platform: e.g. NVIDIA or ATI GPUs or Intel or AMD CPUs. The actual
+compute kernel lives in the \c pi_opencl_kernel.ocl file and is transformed by \c gencl.sh into strings that get included in \c pi_opencl.c, since
+the OpenCL kernels get compiled for the target OpenCL platform at run-time. Note that Apple deprecated OpenCL in MacOS 10.14 (2018). See pi_metal.
+<li> pi_aes - uses the AESNI4x32 Random123 generator
+<li> pi_metal - uses Apple's Metal framework (replacement for OpenCL).
+</ul>
+
+
+*/
diff --git a/examples/example_seeds.h b/examples/example_seeds.h
@@ -0,0 +1,72 @@
+#ifndef EXAMPLE_SEEDS_H__
+#define EXAMPLE_SEEDS_H__ 1
+
+/*
+ * This entire file is overkill to allow seeds to be set in Random123
+ * example and test programs via a R123EXAMPLE_ENVCONF_SEED environment
+ * variable, mainly to illustrate and test how one might use a user-set
+ * seed to produce different random streams for different runs.
+ * None of this code is needed for the correct functioning or
+ * use of the Random123 library.
+ */
+
+#include <stdlib.h> // for strtoul
+#include <limits.h> // for ULONG_MAX
+#include <errno.h> // for errno
+#include <string.h> // for strerror
+#include <stdio.h> // for stderr
+
+/*
+ * The following arbitrary values for sample seeds (used to
+ * initialize keys and counters in the examples) have no
+ * particular meaning. They could equally easily all be 0.
+ */
+#define EXAMPLE_SEED1_U32 0x11111111U
+#define EXAMPLE_SEED2_U32 0x22222222U
+#define EXAMPLE_SEED3_U32 0x33333333U
+#define EXAMPLE_SEED4_U32 0x44444444U
+
+#define EXAMPLE_SEED5_U32 0xdeadbeefU
+#define EXAMPLE_SEED6_U32 0xbeadcafeU
+#define EXAMPLE_SEED7_U32 0x12345678U
+#define EXAMPLE_SEED8_U32 0x90abcdefU
+#define EXAMPLE_SEED9_U32 0xdecafbadU
+
+#if R123_USE_64BIT
+#define EXAMPLE_SEED1_U64 R123_64BIT(0xdeadbeef12345678)
+#define EXAMPLE_SEED2_U64 R123_64BIT(0xdecafbadbeadfeed)
+#endif
+
+static inline unsigned long example_seed_u64(uint64_t defaultseed) {
+ const char *e = "R123EXAMPLE_ENVCONF_SEED";
+ const char *cp = getenv(e);
+ unsigned long u;
+ char *ep;
+ errno = 0;
+ if (cp) {
+ u = strtoul(cp, &ep, 0);
+ if (u == ULONG_MAX && errno != 0) {
+ fprintf(stderr, "strtoul failed to convert environment variable %s=\"%s\" to unsigned long: %s\n",
+ e, cp, strerror(errno));
+ exit(1);
+ } else if (*ep != '\0') {
+ fprintf(stderr, "strtoul failed to fully convert environment variable %s=\"%s\" to unsigned long, got 0x%lu\n",
+ e, cp, u);
+ exit(1);
+ }
+ } else {
+ u = defaultseed;
+ }
+ return u;
+}
+
+static inline uint32_t example_seed_u32(uint32_t defaultseed) {
+ uint64_t u64 = example_seed_u64(defaultseed);
+ if (u64 > 0xFFFFFFFFUL /* UINT32_MAX, which clang29 does not have, sigh */) {
+ fprintf(stderr, "Warning: truncating seed 0x%lu to uint32_t\n", (unsigned long)u64);
+ }
+ return (uint32_t)u64;
+}
+
+
+#endif /* EXAMPLE_SEEDS_H__ */
diff --git a/examples/gencl.sh b/examples/gencl.sh
@@ -0,0 +1,49 @@
+#!/bin/sh
+# Run the C preprocessor on an OpenCL kernel to generate a C string array
+# suitable for clCreateProgramWithSource. This allows us to create
+# standalone OpenCL programs that do not depend on paths to the source
+# tree (the programs will still run the OpenCL run-time compiler to
+# compile the kernel, but the kernel is a string within the program, with
+# no external include dependencies)
+# Mark Moraes, D. E. Shaw Research
+
+# indenting the cpp output makes errors from the OpenCL runtime compiler
+# much more understandable. User can override with whatever they want.
+# The classic BSD indent (yes, the one that lived in /usr/ucb/indent once)
+# defaults to -br, but recent GNU indent versions do not. Both appear to
+# accept -br, fortunately... (BSD indent does not accept -kr or -linux, alas)
+
+PATH=$PATH:/usr/bin
+export PATH
+if type indent > /dev/null 2>&1; then
+ : ${GENCL_INDENT=indent}
+else
+ : ${GENCL_INDENT=cat}
+fi
+
+# We rely on gsub in awk, which exists in everything except classic
+# old V7 awk (Solaris!). If we can find gawk or nawk, we prefer those.
+# http://www.shelldorado.com/articles/awkcompat.html
+for f in gawk nawk awk; do
+ if type "$f" > /dev/null 2>&1; then
+ : ${GENCL_AWK="$f"}
+ break
+ fi
+done
+[ ${GENCL_AWK:+set} ] || { echo "$0: could not find awk!">&2; exit 1; }
+
+usage="Usage: $0 inputoclfilename"
+case $# in
+1) ;;
+*) echo "$usage" >&2; exit 1;;
+esac
+case "$1" in
+''|-*) echo "Invalid or empty inputoclfilename: $1
+$usage" >&2; exit 1;;
+esac
+set -e
+${CC-cc} -xc -E -P -nostdinc -D__OPENCL_VERSION__=1 $CPPFLAGS "$1" |
+ ${GENCL_INDENT} |
+ ${GENCL_AWK} 'BEGIN {print "\"\\n\\"}
+ {gsub("\\", "\\\\", $0); gsub("\"", "\\\"", $0); print $0 "\\n\\"}
+ END {print "\""}'
diff --git a/examples/pi_aes.cpp b/examples/pi_aes.cpp
@@ -0,0 +1,89 @@
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+ notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions, and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+#include <Random123/aes.h>
+#include <stdio.h>
+#include <assert.h>
+using namespace r123;
+
+// Everyone's favorite PRNG example: calculate pi/4 by throwing darts
+// at a square board and counting the fraction that are inside the
+// inscribed circle.
+
+// This version uses the C++ API to AESNI.
+
+#include "pi_check.h"
+#include "example_seeds.h"
+
+int main(int, char **){
+#if R123_USE_AES_NI
+ unsigned long seed = example_seed_u32(EXAMPLE_SEED1_U32); // example user-settable seed
+ unsigned long hits = 0, tries = 0;
+ const int64_t two_to_the_62 = ((int64_t)1)<<62;
+
+ if (!haveAESNI()) {
+ std::cerr << "AES-NI instructions not available on this hardware, skipping the pi_aes test." << std::endl;
+ return 0;
+ }
+ typedef AESNI4x32 G;
+ G generator;
+ // As an example, we illustrate one user-provided seed word and the rest as arbitrary constants
+ G::ukey_type ukey = {{(G::ukey_type::value_type)seed, EXAMPLE_SEED2_U32, EXAMPLE_SEED3_U32, EXAMPLE_SEED4_U32}};
+ // The key_type constructor transforms the 128bit AES ukey_type to an expanded (1408bit) form.
+ G::key_type key = ukey;
+ // start ctr from an arbitrary point. 0 would work fine too, this is just to show that it does
+ // not matter where it starts from (or for that matter, whether it increments by 1, or some other
+ // arbitrary stride or in some other way, as long as it never repeats a key,ctr combination)
+ G::ctr_type ctr = {{EXAMPLE_SEED5_U32, EXAMPLE_SEED6_U32, EXAMPLE_SEED7_U32, EXAMPLE_SEED8_U32}};
+
+ printf("Throwing %lu darts at a square board using AESNI4x32\n", NTRIES);
+ std::cout << "Initializing AES key with hex userkey: " << std::hex << ukey << " ctr: " << ctr << std::endl;
+
+ while(tries < NTRIES){
+ ctr.incr();
+ G::ctr_type r = generator(ctr, key);
+ if (tries == 0) {
+ std::cout << "first random from AESNI is " << std::hex << r << std::endl;;
+ }
+ for(size_t j=0; j<r.size(); j+=2){
+ int64_t x = (int32_t)r[j];
+ int64_t y = (int32_t)r[j+1];
+ if( (x*x + y*y) < two_to_the_62 )
+ hits++;
+ tries++;
+ }
+ }
+ return pi_check(hits, tries);
+#else
+ std::cout << "AESNI RNG not compiled into this binary, skipping the pi_aes test.\n";
+ return 0; // Not a failure to not have AESNI compiled into this.
+#endif
+}
diff --git a/examples/pi_capi.c b/examples/pi_capi.c
@@ -0,0 +1,78 @@
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+ notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions, and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+#include <Random123/threefry.h>
+#include <stdio.h>
+#include <assert.h>
+
+/* Everyone's favorite PRNG example: calculate pi/4 by throwing darts
+// at a square board and counting the fraction that are inside the
+// inscribed circle.
+
+// This version uses the C API to threefry2x64. */
+
+#include "pi_check.h"
+
+int main(int argc, char **argv){
+ unsigned long hits = 0, tries = 0;
+ const int64_t two_to_the_62 = ((int64_t)1)<<62;
+
+ threefry2x64_key_t key = {{0, 0}};
+ threefry2x64_ctr_t ctr = {{0, 0}};
+ enum { int32s_per_counter = sizeof(ctr)/sizeof(int32_t) };
+ (void)argc;(void)argv; /* unused */
+
+ printf("Throwing %lu darts at a square board using threefry2x64\n", NTRIES);
+
+ /* make the most of each bijection by looping over as many
+ int32_t's as we can find in the ctr_type. */
+ assert( int32s_per_counter%2 == 0 );
+ while(tries < NTRIES){
+ /* Use a union to avoid strict aliasing issues. */
+ union{
+ threefry2x64_ctr_t ct;
+ int32_t i32[int32s_per_counter];
+ }u;
+ size_t j;
+ /* Don't worry about the 'carry'. We're not going to loop
+ more than 2^64 times. */
+ ctr.v[0]++;
+ u.ct = threefry2x64(ctr, key);
+ for(j=0; j<int32s_per_counter; j+=2){
+ int64_t x = u.i32[j];
+ int64_t y = u.i32[j+1];
+ if( (x*x + y*y) < two_to_the_62 )
+ hits++;
+ tries++;
+ }
+ }
+ return pi_check(hits, tries);
+}
diff --git a/examples/pi_check.h b/examples/pi_check.h
@@ -0,0 +1,67 @@
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+ notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions, and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+#ifndef PI_CHECK_H__
+#define PI_CHECK_H__ 1
+
+#include <stdio.h>
+
+const unsigned long NTRIES = 10000000UL;
+
+/* XX Cannot make this static, is included in some files that only use it
+ under ifdef-conditionally, and we do not want to ifdef this to match. */
+int pi_check(unsigned long hits, unsigned long tries)
+{
+ const double PI = 3.14159265358979323846;
+ double ourpi, mean, var, delta, chisq;
+ printf("%lu out of %lu darts thrown at a square board hit the inscribed circle\n",
+ hits, tries);
+ ourpi = 4.*hits/tries;
+ printf("pi is approximately %.8g (diff = %.2g %%)\n", ourpi, (ourpi - PI)*100./PI);
+ mean = tries*(PI/4.);
+ var = tries * (PI/4.)*(1. - (PI/4.));
+ delta = hits - mean;
+ chisq = delta*delta/var;
+ /* Sigh. Jump through hoops so we don't want to link with -lm for sqrt */
+ if( chisq < 1. )
+ printf("OK, # of hits is less than one 'sigma' away from expectation\n(chisquared = %.2g)\n", chisq);
+ else if(chisq < 4.)
+ printf("OK, # of hits is between one and two 'sigma' away from expectation\n(chisquared = %.2g)\n", chisq);
+ else if(chisq < 9.)
+ printf("Maybe OK, # of hits is between two and three 'sigma' away from expectation\n(chisquared = %.2g)\n", chisq);
+ else {
+ printf("May not be OK, # of hits is more than three 'sigma'. Worth looking into.\n(chisquared = %.2g)\n", chisq);
+ return 1;
+ }
+ return 0;
+}
+
+#endif /* PI_CHECK_H__ */
diff --git a/examples/pi_cppapi.cpp b/examples/pi_cppapi.cpp
@@ -0,0 +1,78 @@
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+ notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions, and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+#include <Random123/threefry.h>
+#include <Random123/ReinterpretCtr.hpp>
+#include <stdio.h>
+#include <assert.h>
+
+// Everyone's favorite PRNG example: calculate pi/4 by throwing darts
+// at a square board and counting the fraction that are inside the
+// inscribed circle.
+
+// This version uses the C++ API to Threefry4x64, and the
+// ReinterpretCtr template to get 32-bit values.
+
+// Note - by using ReinterpretCtr, the result depends on the
+// endianness of the hardware it runs on even though the underlying
+// generator is endian-independent. An easy way to make the result
+// endian-independent would be to eliminate ReinterpretCtr and to use
+// a generator that works natively with 32-bit quantities, e.g.,
+// Threefry4x32 or Philox4x32.
+
+using namespace r123;
+
+#include "pi_check.h"
+
+int main(int, char **){
+ unsigned long hits = 0, tries = 0;
+ const int64_t two_to_the_62 = ((int64_t)1)<<62;
+
+ typedef ReinterpretCtr<r123array8x32, Threefry4x64> G;
+ G generator;
+ G::key_type key = {{}}; // initialize with zeros
+ G::ctr_type ctr = {{}};
+
+ printf("Throwing %lu darts at a square board using Threefry4x64\n", NTRIES);
+
+ while(tries < NTRIES){
+ ctr.incr();
+ G::ctr_type r = generator(ctr, key);
+ for(size_t j=0; j<r.size(); j+=2){
+ int64_t x = (int32_t)r[j];
+ int64_t y = (int32_t)r[j+1];
+ if( (x*x + y*y) < two_to_the_62 )
+ hits++;
+ tries++;
+ }
+ }
+ return pi_check(hits, tries);
+}
diff --git a/examples/pi_cuda.cu b/examples/pi_cuda.cu
@@ -0,0 +1,121 @@
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+ notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions, and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+// Simple CUDA device kernel and host main program to
+// compute pi via random darts at a square
+
+// functions for boilerplate CUDA init and done
+#include "../tests/util_cuda.h"
+
+#include <Random123/philox.h>
+
+int debug = 0;
+const char *progname;
+
+// CUDA Kernel:
+// generates n x,y points and returns hits[tid] with the count of number
+// of those points within the unit circle on each thread.
+__global__ void counthits(unsigned n, unsigned useed, uint2 *hitsp)
+{
+ unsigned tid = blockDim.x * blockIdx.x + threadIdx.x;
+ unsigned hits = 0, tries = 0;
+ philox4x32_key_t k = {{tid, useed}};
+ philox4x32_ctr_t c = {{}}; // start counter from 0
+
+ while (tries < n) {
+ union {
+ philox4x32_ctr_t c;
+ int4 i;
+ }u;
+ c.v[0] = tries;
+ u.c = philox4x32(c, k);
+ int64_t x1 = u.i.x, y1 = u.i.y;
+ int64_t x2 = u.i.z, y2 = u.i.w;
+ if ((x1*x1 + y1*y1) < (1LL<<62)) {
+ hits++;
+ }
+ tries++;
+ if ((x2*x2 + y2*y2) < (1LL<<62)) {
+ hits++;
+ }
+ tries++;
+ }
+ hitsp[tid] = make_uint2(hits, tries);
+}
+
+#include "pi_check.h"
+#include "example_seeds.h"
+
+int
+main(int argc, char **argv)
+{
+ unsigned seed = example_seed_u32(EXAMPLE_SEED9_U32); // example user-settable seed
+ CUDAInfo *infop;
+ uint2 *hits_host, *hits_dev;
+ size_t hits_sz;
+ unsigned nthreads;
+ unsigned count = argc > 1 ? atoi(argv[1]) : 0;
+ double d = 0.;
+
+ d = timer(&d);
+ progname = argv[0];
+ debug = argc > 2 ? atoi(argv[2]): 0;
+
+ infop = cuda_init(argc > 3 ? argv[3] : NULL);
+ nthreads = infop->blocks_per_grid * infop->threads_per_block;
+ if (count == 0)
+ count = NTRIES/nthreads;
+
+ hits_sz = nthreads * sizeof(hits_host[0]);
+ CHECKCALL(cudaMalloc(&hits_dev, hits_sz));
+ CHECKNOTZERO((hits_host = (uint2 *)malloc(hits_sz)));
+
+ printf("starting %u blocks with %u threads/block for %u points each with seed 0x%x\n",
+ infop->blocks_per_grid, infop->threads_per_block, count, seed);
+ fflush(stdout);
+
+ counthits<<<infop->blocks_per_grid, infop->threads_per_block>>>(count, seed, hits_dev);
+
+ CHECKCALL(cudaDeviceSynchronize());
+ CHECKCALL(cudaMemcpy(hits_host, hits_dev, hits_sz, cudaMemcpyDeviceToHost));
+
+ unsigned long long hits = 0, tries = 0;
+ for (unsigned i = 0; i < nthreads; i++) {
+ if (debug)
+ printf("%u %u %u\n", i, hits_host[i].x, hits_host[i].y);
+ hits += hits_host[i].x;
+ tries += hits_host[i].y;
+ }
+ CHECKCALL(cudaFree(hits_dev));
+ free(hits_host);
+ cuda_done(infop);
+ return pi_check(hits, tries);
+}
diff --git a/examples/pi_cudapp.cu b/examples/pi_cudapp.cu
@@ -0,0 +1,127 @@
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+ notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions, and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+// Simple CUDA device kernel and host main program to
+// compute pi via random darts at a square
+
+// functions for boilerplate CUDA init and done
+#include "../tests/util_cuda.h"
+
+#include <Random123/philox.h>
+
+using namespace r123;
+
+int debug = 0;
+const char *progname;
+
+
+// CUDA Kernel:
+// generates n x,y points and returns hits[tid] with the count of number
+// of those points within the unit circle on each thread.
+__global__ void counthits(unsigned n, unsigned useed, uint2 *hitsp)
+{
+ unsigned tid = blockDim.x * blockIdx.x + threadIdx.x;
+ unsigned hits = 0, tries = 0;
+ typedef Philox4x32 G;
+ G rng;
+ G::key_type k = {{tid, useed}};
+ G::ctr_type c = {{}};
+
+ while (tries < n) {
+ union {
+ G::ctr_type c;
+ int4 i;
+ }u;
+ c.incr();
+ u.c = rng(c, k);
+ int64_t x1 = u.i.x, y1 = u.i.y;
+ int64_t x2 = u.i.z, y2 = u.i.w;
+ if ((x1*x1 + y1*y1) < (1LL<<62)) {
+ hits++;
+ }
+ tries++;
+ if ((x2*x2 + y2*y2) < (1LL<<62)) {
+ hits++;
+ }
+ tries++;
+ }
+ hitsp[tid] = make_uint2(hits, tries);
+}
+
+#include "pi_check.h"
+#include "example_seeds.h"
+
+int
+main(int argc, char **argv)
+{
+ unsigned seed = example_seed_u32(EXAMPLE_SEED9_U32); // example user-settable seed
+ CUDAInfo *infop;
+ uint2 *hits_host, *hits_dev;
+ size_t hits_sz;
+ unsigned nthreads;
+ unsigned count = argc > 1 ? atoi(argv[1]) : 0;
+ double d = 0.;
+
+ d = timer(&d);
+ progname = argv[0];
+ debug = argc > 2 ? atoi(argv[2]): 0;
+
+ infop = cuda_init(argc > 3 ? argv[3] : NULL);
+ nthreads = infop->blocks_per_grid * infop->threads_per_block;
+ if (count == 0)
+ count = NTRIES/nthreads;
+
+ hits_sz = nthreads * sizeof(hits_host[0]);
+ CHECKCALL(cudaMalloc(&hits_dev, hits_sz));
+ CHECKNOTZERO((hits_host = (uint2 *)malloc(hits_sz)));
+
+ printf("starting %u blocks with %u threads/block for %u points each with seed 0x%x\n",
+ infop->blocks_per_grid, infop->threads_per_block, count, seed);
+ fflush(stdout);
+
+ counthits<<<infop->blocks_per_grid, infop->threads_per_block>>>(count, seed, hits_dev);
+
+ CHECKCALL(cudaDeviceSynchronize());
+ CHECKCALL(cudaMemcpy(hits_host, hits_dev, nthreads*sizeof(hits_dev[0]),
+ cudaMemcpyDeviceToHost));
+
+ unsigned long hits = 0, tries = 0;
+ for (unsigned i = 0; i < nthreads; i++) {
+ if (debug)
+ printf("%u %u %u\n", i, hits_host[i].x, hits_host[i].y);
+ hits += hits_host[i].x;
+ tries += hits_host[i].y;
+ }
+ CHECKCALL(cudaFree(hits_dev));
+ free(hits_host);
+ cuda_done(infop);
+ return pi_check(hits, tries);
+}
diff --git a/examples/pi_gsl.c b/examples/pi_gsl.c
@@ -0,0 +1,67 @@
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+ notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions, and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+#include <gsl/gsl_randist.h>
+#include <stdio.h>
+#include "Random123/philox.h"
+#include "Random123/threefry.h"
+#include "Random123/gsl_microrng.h"
+
+/* Compute pi, using the gsl_ran_flat distribution with
+ an underlying threefry4x64 counter-based rng (cbrng).
+ We can call cbrng 8 times between calls to cbrng_reset */
+
+GSL_MICRORNG(cbrng, threefry4x64); /* creates gsl_rng_cbrng */
+
+#include "pi_check.h"
+
+int main(int argc, char **argv){
+ unsigned long hits = 0, tries = 0;
+ gsl_rng *r;
+ (void)argc; (void)argv; /* unused */
+
+ threefry4x64_ctr_t c = {{0}};
+ threefry4x64_key_t k = {{0}};
+ r = gsl_rng_alloc(gsl_rng_cbrng);
+ printf("%lu uniforms from %s\n", NTRIES, gsl_rng_name(r));
+ while (tries < NTRIES) {
+ double x, y;
+ c.v[0]++; /* increment the counter */
+ cbrng_reset(r, c, k); /* reset the rng to the new counter */
+ x = gsl_ran_flat (r, -1.0, 1.0);
+ y = gsl_ran_flat (r, -1.0, 1.0);
+ if( x*x + y*y < 1.0 )
+ hits++;
+ tries++;
+ }
+ gsl_rng_free (r);
+ return pi_check(hits, tries);
+}
diff --git a/examples/pi_metal.m b/examples/pi_metal.m
@@ -0,0 +1,107 @@
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+ notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions, and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+// Simple Metal device kernel and host main program to
+// compute pi via random darts at a square
+//
+// Written by Tom Schoonjans <Tom.Schoonjans@me.com>
+
+// functions to do boilerplate Metal begin and end
+#include "../tests/util_metal.h"
+#include "pi_check.h"
+
+const char *progname;
+int verbose = 0;
+int debug = 0;
+
+int
+main(int argc, char **argv)
+{
+ unsigned count = argc > 1 ? atoi(argv[1]) : 0;
+ UMetalInfo *infop;
+ size_t i, nthreads = 1024, hits_sz;
+ uint *hits_host;
+ uint *tries_host;
+ NSString *kernelname = @"counthits";
+ NSError *err = nil;
+ double d = 0.;
+ id<MTLFunction> function;
+ id<MTLBuffer> hits_dev, tries_dev;
+ id<MTLCommandBuffer> buffer;
+ id<MTLComputeCommandEncoder> encoder;
+ id<MTLComputePipelineState> pipeline;
+
+ d = timer(&d);
+ progname = argv[0];
+ verbose = debug = argc > 2 ? atoi(argv[2]): 0;
+ infop = metal_init(argc > 3 ? argv[3] : NULL, "pi_metal_kernel.metallib");
+ CHECKNOTZERO(function = [infop->library newFunctionWithName: kernelname]);
+ CHECKNOTZERO(hits_dev = [infop->device newBufferWithLength: sizeof(uint) * nthreads options:0]);
+ CHECKNOTZERO(tries_dev = [infop->device newBufferWithLength: sizeof(uint) * nthreads options:0]);
+
+ if (count == 0)
+ count = NTRIES/nthreads;
+
+ CHECKNOTZERO(buffer = [infop->queue commandBuffer]);
+ CHECKNOTZERO(encoder = [buffer computeCommandEncoder]);
+ CHECKERR(pipeline = [infop->device newComputePipelineStateWithFunction:function error:&err]);
+ [encoder setComputePipelineState:pipeline];
+ [encoder setBytes:&count length:sizeof(uint) atIndex:0];
+ [encoder setBuffer:hits_dev offset:0 atIndex:1];
+ [encoder setBuffer:tries_dev offset:0 atIndex:2];
+
+ MTLSize threadsPerThreadgroup = MTLSizeMake([pipeline maxTotalThreadsPerThreadgroup], 1, 1);
+ MTLSize grid = MTLSizeMake(nthreads, 1, 1);
+
+ [encoder dispatchThreads:grid threadsPerThreadgroup:threadsPerThreadgroup];
+ [encoder endEncoding];
+ [buffer commit];
+ [buffer waitUntilCompleted];
+
+ hits_host = [hits_dev contents];
+ tries_host = [tries_dev contents];
+
+ unsigned long hits = 0, tries = 0;
+ for (i = 0; i < nthreads; i++) {
+ if (debug)
+ printf("%lu %u %u\n", (unsigned long)i, hits_host[i], tries_host[i]);
+ hits += hits_host[i];
+ tries += tries_host[i];
+ }
+ metal_done(infop);
+ [function release];
+ [hits_dev release];
+ [tries_dev release];
+ [buffer release];
+ [encoder release];
+ [pipeline release];
+ return pi_check(hits, tries);
+}
diff --git a/examples/pi_metal_kernel.metal b/examples/pi_metal_kernel.metal
@@ -0,0 +1,73 @@
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+ notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions, and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ * This file is the Metal kernel.
+ *
+ * Written by Tom Schoonjans <Tom.Schoonjans@me.com>
+ */
+
+#include <Random123/threefry.h>
+
+/*
+ * counthits generates n x,y points and returns hits[tid] with
+ * the count of number of those points within the unit circle on
+ * each thread.
+ */
+kernel void counthits(const device unsigned &n [[ buffer(0) ]],
+ device uint *hitsp [[ buffer(1) ]],
+ device uint *triesp [[ buffer(2) ]],
+ uint tid [[thread_position_in_grid]]) {
+ unsigned hits = 0, tries = 0;
+ threefry4x32_key_t k = {{tid, 0xdecafbad, 0xfacebead, 0x12345678}};
+ threefry4x32_ctr_t c = {{0, 0xf00dcafe, 0xdeadbeef, 0xbeeff00d}};
+ const float uint_max_fl = (float) UINT_MAX;
+ while (tries < n) {
+ union {
+ threefry4x32_ctr_t c;
+ uint4 i;
+ } u;
+ c.v[0]++;
+ u.c = threefry4x32(c, k);
+ float x1 = ((float) u.i.x) / uint_max_fl, y1 = ((float) u.i.y) / uint_max_fl;
+ float x2 = ((float) u.i.z) / uint_max_fl, y2 = ((float) u.i.w) / uint_max_fl;
+ if ((x1*x1 + y1*y1) < (1.0)) {
+ hits++;
+ }
+ tries++;
+ if ((x2*x2 + y2*y2) < (1.0)) {
+ hits++;
+ }
+ tries++;
+ }
+ hitsp[tid] = hits;
+ triesp[tid] = tries;
+}
diff --git a/examples/pi_microurng.cpp b/examples/pi_microurng.cpp
@@ -0,0 +1,108 @@
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+ notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions, and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+// Everyone's favorite PRNG example: calculate pi/4 by throwing darts
+// at a square board and counting the fraction that are inside the
+// inscribed circle.
+
+// This version uses Philox4x32 with a MicroURNG and the C++11 standard
+// library std::uniform_real distribution to generate floats in [-1..1]
+
+// N.B. The results are hardware dependent even though the underlying
+// counter based RNG is hardware and endian-invariant. On x86,
+// floating point temporaries, e.g., x, y, x*x, etc., are stored in
+// 80-bit extended precision registers. On x86-64 (and other IEEE-754
+// systems), temporaries are stored in 32-bit SSE registers.
+
+#include <Random123/philox.h>
+#include <Random123/MicroURNG.hpp>
+#include <Random123/ReinterpretCtr.hpp>
+#if R123_USE_CXX11_RANDOM
+#include <random>
+#endif
+#include <iostream>
+#include <iomanip>
+#include "pi_check.h"
+
+using namespace r123;
+
+int main(int, char**){
+ typedef Philox4x32 RNG;
+ RNG::ctr_type c = {{}};
+ RNG::key_type k = {{}};
+ MicroURNG<RNG> longmurng(c.incr(), k);
+#if R123_USE_STD_RANDOM
+ std::uniform_real_distribution<float> u(-1., 1.);
+
+ // First, compute pi with a nice long MicroURNG that we cancall
+ // billions of times (2^31) before it runs out of state:
+ unsigned long hits=0;
+ std::cout << "Calling a single MicroURNG " << NTRIES << " times" << std::endl;
+ for(unsigned long i=0; i<NTRIES; ++i){
+ float x = u(longmurng);
+ float y = u(longmurng);
+ if( (x*x + y*y) < 1.0f )
+ hits++;
+ }
+ if (pi_check(hits, NTRIES) != 0) {
+ return 1;
+ }
+ // MicroURNGs are very light-weight. It shouldn't be
+ // too expensive to create a new one every time through the loop:
+ std::cout << "Creating and calling a new MicroURNG " << NTRIES << " times" << std::endl;
+ hits=0;
+ for(unsigned long i=0; i<NTRIES; ++i){
+ MicroURNG<RNG> shorturng(c.incr(), k);
+ float x = u(shorturng);
+ float y = u(shorturng);
+ if( (x*x + y*y) < 1.0f )
+ hits++;
+ }
+ return pi_check(hits, NTRIES);
+#else
+ // MicroURNG's are interesting because they allow us to use std::distributions,
+ // as in the above code. Std::distributions are nice, but if all we need is
+ // a uniform integer, we can do without such fancy C++11 features:
+ unsigned long hits=0;
+ std::cout << "Calling a single MicroURNG " << NTRIES << " times" << std::endl;
+ for(unsigned long i=0; i<NTRIES; ++i){
+ float x = 2.*longmurng()/(double)std::numeric_limits<uint32_t>::max() - 1.;
+ float y = 2.*longmurng()/(double)std::numeric_limits<uint32_t>::max() - 1.;
+ if( (x*x + y*y) < 1.0f )
+ hits++;
+ }
+ if (pi_check(hits, NTRIES) != 0) {
+ return 1;
+ }
+#endif
+
+
+}
diff --git a/examples/pi_opencl.c b/examples/pi_opencl.c
@@ -0,0 +1,98 @@
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+ notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions, and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+// Simple OpenCL device kernel and host main program to
+// compute pi via random darts at a square
+
+// util_opencl.h has a large amount of OpenCL boilerplate.
+// It contains nothing RNG-specific.
+#include "../tests/util_opencl.h"
+#include "pi_check.h"
+#include "example_seeds.h"
+
+static const char *opencl_src =
+// pi_opencl_kernel.i contains a literal string
+// with the kernel source code. It's generated
+// by ./gencl.sh opencl_kernel.ocl
+#include "pi_opencl_kernel.i"
+ ;
+
+const char *progname;
+int verbose = 0;
+int debug = 0;
+
+int
+main(int argc, char **argv)
+{
+ unsigned seed = example_seed_u32(EXAMPLE_SEED9_U32); // example user-settable seed
+ unsigned count = argc > 1 ? atoi(argv[1]) : 0;
+ UCLInfo *infop;
+ size_t i, nthreads, hits_sz;
+ cl_mem hits_dev;
+ cl_uint2 *hits_host;
+ const char *kernelname = "counthits";
+ cl_int err;
+ cl_kernel kern;
+ double d = 0.;
+
+ d = timer(&d);
+ progname = argv[0];
+ verbose = debug = argc > 2 ? atoi(argv[2]): 0;
+ infop = opencl_init(argc > 3 ? argv[3] : NULL, opencl_src, argc > 4 ? argv[4] : "");
+ CHECKERR(kern = clCreateKernel(infop->prog, kernelname, &err));
+ if (infop->wgsize > 64) infop->wgsize /= 2;
+ nthreads = infop->cores * infop->wgsize;
+ if (count == 0)
+ count = NTRIES/nthreads;
+ hits_sz = nthreads * sizeof(hits_host[0]);
+ CHECKNOTZERO(hits_host = (cl_uint2 *)malloc(hits_sz));
+ CHECKERR(hits_dev = clCreateBuffer(infop->ctx, CL_MEM_WRITE_ONLY, hits_sz, 0, &err));
+ CHECK(clSetKernelArg(kern, 0, sizeof(unsigned), (void*)&count));
+ CHECK(clSetKernelArg(kern, 1, sizeof(unsigned), (void*)&seed));
+ CHECK(clSetKernelArg(kern, 2, sizeof(cl_mem), (void*)&hits_dev));
+ printf("queuing kernel for %lu threads with %lu work group size, %u points with seed 0x%x\n",
+ (unsigned long)nthreads, (unsigned long)infop->wgsize, count, seed);
+ CHECK(clEnqueueNDRangeKernel(infop->cmdq, kern, 1, 0, &nthreads, &infop->wgsize, 0, 0, 0));
+ CHECK(clFinish(infop->cmdq));
+ CHECK(clEnqueueReadBuffer(infop->cmdq, hits_dev, CL_TRUE, 0, hits_sz, hits_host, 0, 0, 0));
+
+ unsigned long hits = 0, tries = 0;
+ for (i = 0; i < nthreads; i++) {
+ if (debug)
+ printf("%lu %u %u\n", (unsigned long)i, hits_host[i].x, hits_host[i].y);
+ hits += hits_host[i].x;
+ tries += hits_host[i].y;
+ }
+ CHECK(clReleaseMemObject(hits_dev));
+ CHECK(clReleaseKernel(kern));
+ opencl_done(infop);
+ return pi_check(hits, tries);
+}
diff --git a/examples/pi_opencl_kernel.ocl b/examples/pi_opencl_kernel.ocl
@@ -0,0 +1,71 @@
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+ notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions, and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ * This file is the OpenCL kernel. It gets preprocessed, munged
+ * into a C string declaration and included in pi_opencl, so that
+ * running the compiled pi_opencl does not depend on any include
+ * files, paths etc.
+ */
+
+#include <Random123/threefry.h>
+
+/*
+ * counthits generates n x,y points and returns hits[tid] with
+ * the count of number of those points within the unit circle on
+ * each thread.
+ */
+__kernel void counthits(unsigned n, unsigned useed, __global uint2 *hitsp) {
+ unsigned tid = get_global_id(0);
+ unsigned hits = 0, tries = 0;
+ threefry4x32_key_t k = {{tid, useed}};
+ threefry4x32_ctr_t c = {{}}; // start counter from 0
+ while (tries < n) {
+ union {
+ threefry4x32_ctr_t c;
+ int4 i;
+ } u;
+ c.v[0]++;
+ u.c = threefry4x32(c, k);
+ long x1 = u.i.x, y1 = u.i.y;
+ long x2 = u.i.z, y2 = u.i.w;
+ if ((x1*x1 + y1*y1) < (1L<<62)) {
+ hits++;
+ }
+ tries++;
+ if ((x2*x2 + y2*y2) < (1L<<62)) {
+ hits++;
+ }
+ tries++;
+ }
+ hitsp[tid].x = hits;
+ hitsp[tid].y = tries;
+}
diff --git a/examples/pi_uniform.cpp b/examples/pi_uniform.cpp
@@ -0,0 +1,154 @@
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+ notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions, and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+#include <stdio.h>
+#include <Random123/threefry.h>
+#include <Random123/uniform.hpp>
+
+/* Compute pi, using the u01 conversion with threefry2x64 and threefry2x32 */
+
+#include "pi_check.h"
+#include "example_seeds.h"
+
+using namespace r123;
+
+template<typename Ftype, typename CBRNG>
+void pi(typename CBRNG::key_type k);
+
+int errs = 0;
+int main(int, char **){
+ uint64_t seed64 = example_seed_u64(EXAMPLE_SEED1_U64); // example user-settable seed
+ unsigned long hits = 0, tries = 0;
+
+ // First, we demonstrate how to compute pi
+ // using uneg11 to convert the integer output
+ // of threefry2x64 to a double in (-1, 1).
+ Threefry2x64::ctr_type c = {{0}}, r;
+ Threefry2x64::ukey_type uk = {{seed64}};
+ Threefry2x64::key_type k = uk;
+ printf("%lu uniform doubles from threefry2x64\n", NTRIES);
+ while (tries < NTRIES) {
+ double x, y;
+ c.v[0]++; /* increment the counter */
+ r = threefry2x64(c, k);
+ x = uneg11<double>(r.v[0]);
+ y = uneg11<double>(r.v[1]);
+ if( x*x + y*y < 1.0 )
+ hits++;
+ tries++;
+ }
+ errs += pi_check(hits, tries);
+
+ // Extra credit: use some template hackery to exercise various
+ // combinations of float, double and long double, unit64_t and
+ // uint32_t and the conversion functions u01, uneg11 and ufixed01.
+ // This provides minimal testing of the conversion functions.
+ pi<float, Threefry2x64>(k);
+ pi<double, Threefry2x64>(k);
+ pi<long double, Threefry2x64>(k);
+ uint32_t seed32 = example_seed_u32(EXAMPLE_SEED9_U32);
+
+ Threefry2x32::ukey_type ukh = {{seed32}};
+ Threefry2x32::key_type kh = ukh;
+ pi<float, Threefry2x32>(kh);
+ pi<double, Threefry2x32>(kh);
+ pi<long double, Threefry2x32>(kh);
+
+ return !!errs;
+}
+
+template<typename Ftype, typename CBRNG>
+void pi(typename CBRNG::key_type k){
+ unsigned long hits = 0, tries = 0;
+ CBRNG rng;
+
+ printf("Compute pi with uneg11:\n");
+ typename CBRNG::ctr_type c = {{0}}, r;
+ hits = tries = 0;
+ while (tries < NTRIES) {
+ Ftype x, y;
+ c.v[0]++; /* increment the counter */
+ r = rng(c, k);
+ // x and y in the entire square from (-1,-1) to (1,1)
+ x = uneg11<Ftype>(r.v[0]);
+ y = uneg11<Ftype>(r.v[1]);
+ if( x*x + y*y < 1.0 )
+ hits++;
+ tries++;
+ }
+ errs += pi_check(hits, tries);
+
+#if __cplusplus >= 201103L
+ printf("Compute pi with uneg11all (requires C++11):\n");
+ hits = tries = 0;
+ while (tries < NTRIES) {
+ c.v[0]++; /* increment the counter */
+ r = rng(c, k);
+ // x and y in the entire square from (-1,-1) to (1,1)
+ auto a = uneg11all<Ftype>(r);
+ if( a[0]*a[0] + a[1]*a[1] < 1.0 )
+ hits++;
+ tries++;
+ }
+ errs += pi_check(hits, tries);
+#endif
+
+ printf("Compute pi with u01:\n");
+ hits = tries = 0;
+ while (tries < NTRIES) {
+ Ftype x, y;
+ c.v[0]++; /* increment the counter */
+ r = rng(c, k);
+ // generate x and y in the first quadrant from (0,0) to (1,1)
+ x = u01<Ftype>(r.v[0]);
+ y = u01<Ftype>(r.v[1]);
+ if( x*x + y*y < 1.0 )
+ hits++;
+ tries++;
+ }
+ errs += pi_check(hits, tries);
+
+ printf("Compute pi with u01fixedpt:\n");
+ hits = tries = 0;
+ while (tries < NTRIES) {
+ Ftype x, y;
+ c.v[0]++; /* increment the counter */
+ r = rng(c, k);
+ // generate x and y in the first quadrant from (0,0) to (1,1)
+ x = u01fixedpt<Ftype>(r.v[0]);
+ y = u01fixedpt<Ftype>(r.v[1]);
+ if( x*x + y*y < 1.0 )
+ hits++;
+ tries++;
+ }
+ errs += pi_check(hits, tries);
+ }
+
diff --git a/examples/simple.c b/examples/simple.c
@@ -0,0 +1,59 @@
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+ notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions, and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+#include <Random123/threefry.h>
+#include <stdio.h>
+#include "example_seeds.h"
+
+int main(int argc, char **argv){
+ int i;
+ uint32_t seed = example_seed_u32(EXAMPLE_SEED1_U32); // example of user-settable seed
+
+ /* while this example starts the counter from 0 and then increments by 0,
+ this could start anywhere and increment by any stride or pattern that
+ makes sense for the application as long as it produces a non-repeating stream */
+ threefry4x32_ctr_t ctr = {{0,0,0,0}};
+ /* we illustrate one user-specified seed and one constant as the key */
+ threefry4x32_key_t key = {{seed, EXAMPLE_SEED2_U32,0,0}};
+ (void)argc; (void)argv; /* unused */
+ printf( "The first few randoms with key 0x%llx 0x%llx\n",
+ (unsigned long long)key.v[0], (unsigned long long)key.v[1]);
+ for(i=0; i<10; ++i){
+ ctr.v[0] = i;
+ {
+ threefry4x32_ctr_t rand = threefry4x32(ctr, key);
+ printf("ctr: %llx %llx threefry4x32(20, ctr, key): %llx %llx\n",
+ (unsigned long long)ctr.v[0], (unsigned long long)ctr.v[1],
+ (unsigned long long)rand.v[0], (unsigned long long)rand.v[1]);
+ }
+ }
+ return 0;
+}
diff --git a/examples/simplepp.cpp b/examples/simplepp.cpp
@@ -0,0 +1,49 @@
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+ notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions, and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+#include <Random123/threefry.h>
+#include <iostream>
+#include "example_seeds.h"
+
+int main(int, char **){
+ typedef r123::Threefry2x64 CBRNG;
+ CBRNG::key_type::value_type seed = example_seed_u64(EXAMPLE_SEED1_U64); // example of user-settable seed
+ CBRNG::key_type key = {{seed}};
+ CBRNG::ctr_type ctr = {{0,0}};
+ CBRNG g;
+ std::cout << std::hex << "The first few 2x64 randoms from Threefry2x64 with hex key " << key << "\n";
+ for(int i=0; i<10; ++i){
+ ctr[0] = i;
+ CBRNG::ctr_type rand = g(ctr, key);
+ std::cout << "ctr: " << ctr << " Threefry2x64<>(ctr, key): " << rand << "\n";
+ }
+ return 0;
+}
diff --git a/include/Random123/MicroURNG.hpp b/include/Random123/MicroURNG.hpp
@@ -0,0 +1,146 @@
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+ notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions, and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+#ifndef __MicroURNG_dot_hpp__
+#define __MicroURNG_dot_hpp__
+
+#include <stdexcept>
+#include <limits>
+
+namespace r123{
+/**
+ Given a CBRNG whose ctr_type has an unsigned integral value_type,
+ MicroURNG<CBRNG>(c, k) is a type that satisfies the
+ requirements of a C++11 Uniform Random Number Generator.
+
+ The intended purpose is for a MicroURNG to be passed
+ as an argument to a C++11 Distribution, e.g.,
+ std::normal_distribution. See examples/MicroURNG.cpp.
+
+ The MicroURNG functor has a period of "only"
+
+ ctr_type.size()*2^32,
+
+ after which it will silently repeat.
+
+ The high 32 bits of the highest word in the counter c, passed to
+ the constructor must be zero. MicroURNG uses these bits to
+ "count".
+
+ Older versions of the library permitted a second template
+ parameter by which the caller could control the number of
+ bits devoted to the URNG's internal counter. This flexibility
+ has been disabled because URNGs created with different
+ numbers of counter bits could, conceivably "collide".
+
+\code
+ typedef ?someCBRNG? RNG;
+ RNG::ctr_type c = ...; // under application control
+ RNG::key_type k = ...; //
+ std::normal_distribution<float> nd;
+ MicroURNG<RNG> urng(c, k);
+ for(???){
+ ...
+ nd(urng); // may be called several hundred times with BITS=10
+ ...
+ }
+\endcode
+*/
+
+template<typename CBRNG>
+class MicroURNG{
+ // According to C++11, a URNG requires only a result_type,
+ // operator()(), min() and max() methods. Everything else
+ // (ctr_type, key_type, reset() method, etc.) is "value added"
+ // for the benefit of users that "know" that they're dealing with
+ // a MicroURNG.
+public:
+ typedef CBRNG cbrng_type;
+ static const int BITS = 32;
+ typedef typename cbrng_type::ctr_type ctr_type;
+ typedef typename cbrng_type::key_type key_type;
+ typedef typename cbrng_type::ukey_type ukey_type;
+ typedef typename ctr_type::value_type result_type;
+
+ R123_STATIC_ASSERT( std::numeric_limits<result_type>::digits >= BITS, "The result_type must have at least 32 bits" );
+
+ result_type operator()(){
+ if(last_elem == 0){
+ // jam n into the high bits of c
+ const size_t W = std::numeric_limits<result_type>::digits;
+ ctr_type c = c0;
+ c[c0.size()-1] |= n<<(W-BITS);
+ rdata = b(c,k);
+ n++;
+ last_elem = rdata.size();
+ }
+ return rdata[--last_elem];
+ }
+ MicroURNG(cbrng_type _b, ctr_type _c0, ukey_type _uk) : b(_b), c0(_c0), k(_uk), n(0), last_elem(0) {
+ chkhighbits();
+ }
+ MicroURNG(ctr_type _c0, ukey_type _uk) : b(), c0(_c0), k(_uk), n(0), last_elem(0) {
+ chkhighbits();
+ }
+
+ // _Min and _Max work around a bug in the library shipped with MacOS Xcode 4.5.2.
+ // See the commment in conventional/Engine.hpp.
+ const static result_type _Min = 0;
+ const static result_type _Max = ~((result_type)0);
+
+ static R123_CONSTEXPR result_type min R123_NO_MACRO_SUBST () { return _Min; }
+ static R123_CONSTEXPR result_type max R123_NO_MACRO_SUBST () { return _Max; }
+ // extra methods:
+ const ctr_type& counter() const{ return c0; }
+ void reset(ctr_type _c0, ukey_type _uk){
+ c0 = _c0;
+ chkhighbits();
+ k = _uk;
+ n = 0;
+ last_elem = 0;
+ }
+
+private:
+ cbrng_type b;
+ ctr_type c0;
+ key_type k;
+ R123_ULONG_LONG n;
+ size_t last_elem;
+ ctr_type rdata;
+ void chkhighbits(){
+ result_type r = c0[c0.size()-1];
+ result_type mask = ((uint64_t)std::numeric_limits<result_type>::max R123_NO_MACRO_SUBST ())>>BITS;
+ if((r&mask) != r)
+ throw std::runtime_error("MicroURNG: c0, does not have high bits clear");
+ }
+};
+} // namespace r123
+#endif
diff --git a/include/Random123/ReinterpretCtr.hpp b/include/Random123/ReinterpretCtr.hpp
@@ -0,0 +1,88 @@
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+ notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions, and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+#ifndef __ReinterpretCtr_dot_hpp__
+#define __ReinterpretCtr_dot_hpp__
+
+#include "features/compilerfeatures.h"
+#include <cstring>
+
+namespace r123{
+/*!
+ ReinterpretCtr uses memcpy to map back and forth
+ between a CBRNG's ctr_type and the specified ToType. For example,
+ after:
+
+ typedef ReinterpretCtr<r123array4x32, Philox2x64> G;
+
+ G is a bona fide CBRNG with ctr_type r123array4x32.
+
+ WARNING: ReinterpretCtr is endian dependent. The
+ values returned by G, declared as above,
+ will depend on the endianness of the machine on which it runs.
+ */
+
+template <typename ToType, typename CBRNG>
+struct ReinterpretCtr{
+ typedef ToType ctr_type;
+ typedef typename CBRNG::key_type key_type;
+ typedef typename CBRNG::ctr_type bctype;
+ typedef typename CBRNG::ukey_type ukey_type;
+ R123_STATIC_ASSERT(sizeof(ToType) == sizeof(bctype) && sizeof(typename bctype::value_type) != 16,
+ "ReinterpretCtr: sizeof(ToType) is not the same as sizeof(CBRNG::ctr_type) or CBRNG::ctr_type::value_type looks like it might be __m128i");
+ // It's amazingly difficult to safely do conversions with __m128i.
+ // If we use the operator() implementation below with a CBRNG
+ // whose ctr_type is r123array1xm128i, gcc4.6 optimizes away the
+ // memcpys, inlines the operator()(c,k), and produces assembly
+ // language that ends with an aesenclast instruction with a
+ // destination operand pointing to an unaligned memory address ...
+ // Segfault! See: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=50444
+ // MSVC also produces code that crashes. We suspect a
+ // similar mechanism but haven't done the debugging necessary to
+ // be sure. We were able to 'fix' gcc4.6 by making bc a mutable
+ // data member rather than declaring it in the scope of
+ // operator(). That didn't fix the MSVC problems, though.
+ //
+ // Conclusion - don't touch __m128i, at least for now. The
+ // easiest (but highly imprecise) way to do that is the static
+ // assertion above that rejects bctype::value_types of size 16. -
+ // Sep 2011.
+ ctr_type operator()(ctr_type c, key_type k){
+ bctype bc;
+ std::memcpy(&bc, &c, sizeof(c));
+ CBRNG b;
+ bc = b(bc, k);
+ std::memcpy(&c, &bc, sizeof(bc));
+ return c;
+ }
+};
+} // namespace r123
+#endif
diff --git a/include/Random123/aes.h b/include/Random123/aes.h
@@ -0,0 +1,398 @@
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+ notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions, and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+#ifndef __Random123_aes_dot_hpp__
+#define __Random123_aes_dot_hpp__
+
+#include "features/compilerfeatures.h"
+#include "array.h"
+
+/* Implement a bona fide AES block cipher. It's minimally
+// checked against the test vector in FIPS-197 in ut_aes.cpp. */
+#if R123_USE_AES_NI
+
+/** @ingroup AESNI */
+typedef struct r123array1xm128i aesni1xm128i_ctr_t;
+/** @ingroup AESNI */
+typedef struct r123array1xm128i aesni1xm128i_ukey_t;
+/** @ingroup AESNI */
+typedef struct r123array4x32 aesni4x32_ukey_t;
+/** @ingroup AESNI */
+enum r123_enum_aesni1xm128i { aesni1xm128i_rounds = 10 };
+
+/** \cond HIDDEN_FROM_DOXYGEN */
+R123_STATIC_INLINE __m128i AES_128_ASSIST (__m128i temp1, __m128i temp2) {
+ __m128i temp3;
+ temp2 = _mm_shuffle_epi32 (temp2 ,0xff);
+ temp3 = _mm_slli_si128 (temp1, 0x4);
+ temp1 = _mm_xor_si128 (temp1, temp3);
+ temp3 = _mm_slli_si128 (temp3, 0x4);
+ temp1 = _mm_xor_si128 (temp1, temp3);
+ temp3 = _mm_slli_si128 (temp3, 0x4);
+ temp1 = _mm_xor_si128 (temp1, temp3);
+ temp1 = _mm_xor_si128 (temp1, temp2);
+ return temp1;
+}
+
+R123_STATIC_INLINE void aesni1xm128iexpand(aesni1xm128i_ukey_t uk, __m128i ret[11])
+{
+ __m128i rkey = uk.v[0].m;
+ __m128i tmp2;
+
+ ret[0] = rkey;
+ tmp2 = _mm_aeskeygenassist_si128(rkey, 0x1);
+ rkey = AES_128_ASSIST(rkey, tmp2);
+ ret[1] = rkey;
+
+ tmp2 = _mm_aeskeygenassist_si128(rkey, 0x2);
+ rkey = AES_128_ASSIST(rkey, tmp2);
+ ret[2] = rkey;
+
+ tmp2 = _mm_aeskeygenassist_si128(rkey, 0x4);
+ rkey = AES_128_ASSIST(rkey, tmp2);
+ ret[3] = rkey;
+
+ tmp2 = _mm_aeskeygenassist_si128(rkey, 0x8);
+ rkey = AES_128_ASSIST(rkey, tmp2);
+ ret[4] = rkey;
+
+ tmp2 = _mm_aeskeygenassist_si128(rkey, 0x10);
+ rkey = AES_128_ASSIST(rkey, tmp2);
+ ret[5] = rkey;
+
+ tmp2 = _mm_aeskeygenassist_si128(rkey, 0x20);
+ rkey = AES_128_ASSIST(rkey, tmp2);
+ ret[6] = rkey;
+
+ tmp2 = _mm_aeskeygenassist_si128(rkey, 0x40);
+ rkey = AES_128_ASSIST(rkey, tmp2);
+ ret[7] = rkey;
+
+ tmp2 = _mm_aeskeygenassist_si128(rkey, 0x80);
+ rkey = AES_128_ASSIST(rkey, tmp2);
+ ret[8] = rkey;
+
+ tmp2 = _mm_aeskeygenassist_si128(rkey, 0x1b);
+ rkey = AES_128_ASSIST(rkey, tmp2);
+ ret[9] = rkey;
+
+ tmp2 = _mm_aeskeygenassist_si128(rkey, 0x36);
+ rkey = AES_128_ASSIST(rkey, tmp2);
+ ret[10] = rkey;
+}
+/** \endcond */
+
+#ifdef __cplusplus
+/** @ingroup AESNI */
+struct aesni1xm128i_key_t{
+ __m128i k[11];
+ aesni1xm128i_key_t(){
+ aesni1xm128i_ukey_t uk;
+ uk.v[0].m = _mm_setzero_si128();
+ aesni1xm128iexpand(uk, k);
+ }
+ aesni1xm128i_key_t(const aesni1xm128i_ukey_t& uk){
+ aesni1xm128iexpand(uk, k);
+ }
+ aesni1xm128i_key_t(const aesni4x32_ukey_t& uk){
+ aesni1xm128i_ukey_t uk128;
+ uk128.v[0].m = _mm_set_epi32(uk.v[3], uk.v[2], uk.v[1], uk.v[0]);
+ aesni1xm128iexpand(uk128, k);
+ }
+ aesni1xm128i_key_t& operator=(const aesni1xm128i_ukey_t& uk){
+ aesni1xm128iexpand(uk, k);
+ return *this;
+ }
+ aesni1xm128i_key_t& operator=(const aesni4x32_ukey_t& uk){
+ aesni1xm128i_ukey_t uk128;
+ uk128.v[0].m = _mm_set_epi32(uk.v[3], uk.v[2], uk.v[1], uk.v[0]);
+ aesni1xm128iexpand(uk128, k);
+ return *this;
+ }
+ bool operator==(const aesni1xm128i_key_t& rhs) const{
+ for(int i=0; i<11; ++i){
+ // Sigh... No r123m128i(__m128i) constructor!
+ r123m128i li; li.m = k[i];
+ r123m128i ri; ri.m = rhs.k[i];
+ if( li != ri ) return false;
+ }
+ return true;
+ }
+ bool operator!=(const aesni1xm128i_key_t& rhs) const{
+ return !(*this == rhs);
+ }
+ friend std::ostream& operator<<(std::ostream& os, const aesni1xm128i_key_t& v){
+ r123m128i ki;
+ for(int i=0; i<10; ++i){
+ ki.m = v.k[i];
+ os << ki << " ";
+ }
+ ki.m = v.k[10];
+ return os << ki;
+ }
+ friend std::istream& operator>>(std::istream& is, aesni1xm128i_key_t& v){
+ r123m128i ki;
+ for(int i=0; i<11; ++i){
+ is >> ki;
+ v.k[i] = ki;
+ }
+ return is;
+ }
+};
+#else
+typedef struct {
+ __m128i k[11];
+}aesni1xm128i_key_t;
+
+/** @ingroup AESNI */
+R123_STATIC_INLINE aesni1xm128i_key_t aesni1xm128ikeyinit(aesni1xm128i_ukey_t uk){
+ aesni1xm128i_key_t ret;
+ aesni1xm128iexpand(uk, ret.k);
+ return ret;
+}
+#endif
+
+/** @ingroup AESNI */
+R123_STATIC_INLINE aesni1xm128i_ctr_t aesni1xm128i(aesni1xm128i_ctr_t in, aesni1xm128i_key_t k) {
+ __m128i x = _mm_xor_si128(k.k[0], in.v[0].m);
+ x = _mm_aesenc_si128(x, k.k[1]);
+ x = _mm_aesenc_si128(x, k.k[2]);
+ x = _mm_aesenc_si128(x, k.k[3]);
+ x = _mm_aesenc_si128(x, k.k[4]);
+ x = _mm_aesenc_si128(x, k.k[5]);
+ x = _mm_aesenc_si128(x, k.k[6]);
+ x = _mm_aesenc_si128(x, k.k[7]);
+ x = _mm_aesenc_si128(x, k.k[8]);
+ x = _mm_aesenc_si128(x, k.k[9]);
+ x = _mm_aesenclast_si128(x, k.k[10]);
+ {
+ aesni1xm128i_ctr_t ret;
+ ret.v[0].m = x;
+ return ret;
+ }
+}
+
+/** @ingroup AESNI */
+R123_STATIC_INLINE aesni1xm128i_ctr_t aesni1xm128i_R(unsigned R, aesni1xm128i_ctr_t in, aesni1xm128i_key_t k){
+ R123_ASSERT(R==10);
+ return aesni1xm128i(in, k);
+}
+
+
+/** @ingroup AESNI */
+typedef struct r123array4x32 aesni4x32_ctr_t;
+/** @ingroup AESNI */
+typedef aesni1xm128i_key_t aesni4x32_key_t;
+/** @ingroup AESNI */
+enum r123_enum_aesni4x32 { aesni4x32_rounds = 10 };
+/** @ingroup AESNI */
+R123_STATIC_INLINE aesni4x32_key_t aesni4x32keyinit(aesni4x32_ukey_t uk){
+ aesni1xm128i_ukey_t uk128;
+ aesni4x32_key_t ret;
+ uk128.v[0].m = _mm_set_epi32(uk.v[3], uk.v[2], uk.v[1], uk.v[0]);
+ aesni1xm128iexpand(uk128, ret.k);
+ return ret;
+}
+
+/** @ingroup AESNI */
+/** The aesni4x32_R function provides a C API to the @ref AESNI "AESNI" CBRNG, allowing the number of rounds to be specified explicitly **/
+R123_STATIC_INLINE aesni4x32_ctr_t aesni4x32_R(unsigned int Nrounds, aesni4x32_ctr_t c, aesni4x32_key_t k){
+ aesni1xm128i_ctr_t c128;
+ c128.v[0].m = _mm_set_epi32(c.v[3], c.v[2], c.v[1], c.v[0]);
+ c128 = aesni1xm128i_R(Nrounds, c128, k);
+ _mm_storeu_si128((__m128i*)&c.v[0], c128.v[0].m);
+ return c;
+}
+
+#define aesni4x32_rounds aesni1xm128i_rounds
+
+/** The aesni4x32 macro provides a C API to the @ref AESNI "AESNI" CBRNG, uses the default number of rounds i.e. \c aesni4x32_rounds **/
+/** @ingroup AESNI */
+#define aesni4x32(c,k) aesni4x32_R(aesni4x32_rounds, c, k)
+
+#ifdef __cplusplus
+namespace r123{
+/**
+@defgroup AESNI ARS and AESNI Classes and Typedefs
+
+The ARS4x32, ARS1xm128i, AESNI4x32 and AESNI1xm128i classes export the member functions, typedefs and
+operator overloads required by a @ref CBRNG "CBRNG" class.
+
+ARS1xm128i and AESNI1xm128i are based on the AES block cipher and rely on the AES-NI hardware instructions
+available on some some new (2011) CPUs.
+
+The ARS1xm128i CBRNG and the use of AES for random number generation are described in
+<a href="http://dl.acm.org/citation.cfm?doid=2063405"><i>Parallel Random Numbers: As Easy as 1, 2, 3</i> </a>.
+Although it uses some cryptographic primitives, ARS1xm128i uses a cryptographically weak key schedule and is \b not suitable for cryptographic use.
+
+@class AESNI1xm128i
+@ingroup AESNI
+AESNI exports the member functions, typedefs and operator overloads required by a @ref CBRNG class.
+
+AESNI1xm128i uses the crypotgraphic AES round function, including the cryptographic key schedule.
+
+In contrast to the other CBRNGs in the Random123 library, the AESNI1xm128i_R::key_type is opaque
+and is \b not identical to the AESNI1xm128i_R::ukey_type. Creating a key_type, using either the constructor
+or assignment operator, is significantly more time-consuming than running the bijection (hundreds
+of clock cycles vs. tens of clock cycles).
+
+AESNI1xm128i is only available when the feature-test macro R123_USE_AES_NI is true, which
+should occur only when the compiler is configured to generate AES-NI instructions (or
+when defaults are overridden by compile-time, compiler-command-line options).
+
+As of September 2011, the authors know of no statistical flaws with AESNI1xm128i. It
+would be an event of major cryptographic note if any such flaws were ever found.
+*/
+struct AESNI1xm128i{
+ typedef aesni1xm128i_ctr_t ctr_type;
+ typedef aesni1xm128i_ukey_t ukey_type;
+ typedef aesni1xm128i_key_t key_type;
+ static const unsigned int rounds=10;
+ ctr_type operator()(ctr_type ctr, key_type key) const{
+ return aesni1xm128i(ctr, key);
+ }
+};
+
+/* @class AESNI4x32 */
+struct AESNI4x32{
+ typedef aesni4x32_ctr_t ctr_type;
+ typedef aesni4x32_ukey_t ukey_type;
+ typedef aesni4x32_key_t key_type;
+ static const unsigned int rounds=10;
+ ctr_type operator()(ctr_type ctr, key_type key) const{
+ return aesni4x32(ctr, key);
+ }
+};
+
+/** @ingroup AESNI
+ @class AESNI1xm128i_R
+
+AESNI1xm128i_R is provided for completeness, but is only instantiable with ROUNDS=10, in
+which case it is identical to AESNI1xm128i */
+template <unsigned ROUNDS=10>
+struct AESNI1xm128i_R : public AESNI1xm128i{
+ R123_STATIC_ASSERT(ROUNDS==10, "AESNI1xm128i_R<R> is only valid with R=10");
+};
+
+/** @class AESNI4x32_R **/
+template <unsigned ROUNDS=10>
+struct AESNI4x32_R : public AESNI4x32{
+ R123_STATIC_ASSERT(ROUNDS==10, "AESNI4x32_R<R> is only valid with R=10");
+};
+} // namespace r123
+#endif /* __cplusplus */
+
+#endif /* R123_USE_AES_NI */
+
+#if R123_USE_AES_OPENSSL
+#include "string.h"
+#include <openssl/aes.h>
+typedef struct r123array16x8 aesopenssl16x8_ctr_t;
+typedef struct r123array16x8 aesopenssl16x8_ukey_t;
+#ifdef __cplusplus
+struct aesopenssl16x8_key_t{
+ AES_KEY k;
+ aesopenssl16x8_key_t(){
+ aesopenssl16x8_ukey_t ukey={{}};
+ AES_set_encrypt_key((const unsigned char *)&ukey.v[0], 128, &k);
+ }
+ aesopenssl16x8_key_t(const aesopenssl16x8_ukey_t& ukey){
+ AES_set_encrypt_key((const unsigned char *)&ukey.v[0], 128, &k);
+ }
+ aesopenssl16x8_key_t& operator=(const aesopenssl16x8_ukey_t& ukey){
+ AES_set_encrypt_key((const unsigned char *)&ukey.v[0], 128, &k);
+ return *this;
+ }
+ bool operator==(const aesopenssl16x8_key_t& rhs) const{
+ return (k.rounds == rhs.k.rounds) && 0==::memcmp(&k.rd_key[0], &rhs.k.rd_key[0], (k.rounds+1) * 4 * sizeof(uint32_t));
+ }
+ bool operator!=(const aesopenssl16x8_key_t& rhs) const{
+ return !(*this == rhs);
+ }
+ friend std::ostream& operator<<(std::ostream& os, const aesopenssl16x8_key_t& v){
+ os << v.k.rounds;
+ const unsigned int *p = &v.k.rd_key[0];
+ for(int i=0; i<(v.k.rounds+1); ++i){
+ os << " " << p[0] << " " << p[1] << " " << p[2] << " " << p[3];
+ p += 4;
+ }
+ return os;
+ }
+ friend std::istream& operator>>(std::istream& is, aesopenssl16x8_key_t& v){
+ is >> v.k.rounds;
+ unsigned int *p = &v.k.rd_key[0];
+ for(int i=0; i<(v.k.rounds+1); ++i){
+ is >> p[0] >> p[1] >> p[2] >> p[3];
+ p += 4;
+ }
+ return is;
+ }
+};
+#else
+typedef struct aesopenssl16x8_key_t{
+ AES_KEY k;
+}aesopenssl16x8_key_t;
+R123_STATIC_INLINE struct aesopenssl16x8_key_t aesopenssl16x8keyinit(aesopenssl16x8_ukey_t uk){
+ aesopenssl16x8_key_t ret;
+ AES_set_encrypt_key((const unsigned char *)&uk.v[0], 128, &ret.k);
+ return ret;
+}
+#endif
+
+R123_STATIC_INLINE R123_FORCE_INLINE(aesopenssl16x8_ctr_t aesopenssl16x8_R(aesopenssl16x8_ctr_t ctr, aesopenssl16x8_key_t key));
+R123_STATIC_INLINE
+aesopenssl16x8_ctr_t aesopenssl16x8_R(aesopenssl16x8_ctr_t ctr, aesopenssl16x8_key_t key){
+ aesopenssl16x8_ctr_t ret;
+ AES_encrypt((const unsigned char*)&ctr.v[0], (unsigned char *)&ret.v[0], &key.k);
+ return ret;
+}
+
+#define aesopenssl16x8_rounds aesni4x32_rounds
+#define aesopenssl16x8(c,k) aesopenssl16x8_R(aesopenssl16x8_rounds)
+
+#ifdef __cplusplus
+namespace r123{
+struct AESOpenSSL16x8{
+ typedef aesopenssl16x8_ctr_t ctr_type;
+ typedef aesopenssl16x8_key_t key_type;
+ typedef aesopenssl16x8_ukey_t ukey_type;
+ static const unsigned int rounds=10;
+ ctr_type operator()(const ctr_type& in, const key_type& k){
+ ctr_type out;
+ AES_encrypt((const unsigned char *)&in[0], (unsigned char *)&out[0], &k.k);
+ return out;
+ }
+};
+} // namespace r123
+#endif /* __cplusplus */
+#endif /* R123_USE_AES_OPENSSL */
+
+#endif
diff --git a/include/Random123/array.h b/include/Random123/array.h
@@ -0,0 +1,355 @@
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+ notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions, and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+#ifndef _r123array_dot_h__
+#define _r123array_dot_h__
+#include "features/compilerfeatures.h"
+#include "features/sse.h"
+
+#if !defined(__cplusplus) || defined(__METAL_MACOS__)
+#define CXXMETHODS(_N, W, T)
+#define CXXOVERLOADS(_N, W, T)
+#define CXXMETHODS_REQUIRING_STL
+#else
+
+#include <stddef.h>
+#include <algorithm>
+#include <stdexcept>
+#include <iterator>
+#include <limits>
+#include <iostream>
+
+/** @defgroup arrayNxW The r123arrayNxW classes
+
+ Each of the r123arrayNxW is a fixed size array of N W-bit unsigned integers.
+ It is functionally equivalent to the C++11 std::array<N, uintW_t>,
+ but does not require C++11 features or libraries.
+
+ In addition to meeting most of the requirements of a Container,
+ it also has a member function, incr(), which increments the zero-th
+ element and carrys overflows into higher indexed elements. Thus,
+ by using incr(), sequences of up to 2^(N*W) distinct values
+ can be produced.
+
+ If SSE is supported by the compiler, then the class
+ r123array1xm128i is also defined, in which the data member is an
+ array of one r123m128i object.
+
+ When compiling with __CUDA_ARCH__ defined, the reverse iterator
+ methods (rbegin, rend, crbegin, crend) are not defined because
+ CUDA does not support std::reverse_iterator.
+
+*/
+
+/** @cond HIDDEN_FROM_DOXYGEN */
+
+template <typename value_type>
+inline R123_CUDA_DEVICE value_type assemble_from_u32(uint32_t *p32){
+ value_type v=0;
+ for(size_t i=0; i<(3+sizeof(value_type))/4; ++i)
+ v |= ((value_type)(*p32++)) << (32*i);
+ return v;
+}
+
+/** @endcond */
+
+#ifdef __CUDA_ARCH__
+/* CUDA can't handle std::reverse_iterator. We *could* implement it
+ ourselves, but let's not bother until somebody really feels a need
+ to reverse-iterate through an r123array */
+#define CXXMETHODS_REQUIRING_STL
+#else
+#define CXXMETHODS_REQUIRING_STL \
+ public: \
+ typedef std::reverse_iterator<iterator> reverse_iterator; \
+ typedef std::reverse_iterator<const_iterator> const_reverse_iterator; \
+ R123_CUDA_DEVICE reverse_iterator rbegin(){ return reverse_iterator(end()); } \
+ R123_CUDA_DEVICE const_reverse_iterator rbegin() const{ return const_reverse_iterator(end()); } \
+ R123_CUDA_DEVICE reverse_iterator rend(){ return reverse_iterator(begin()); } \
+ R123_CUDA_DEVICE const_reverse_iterator rend() const{ return const_reverse_iterator(begin()); } \
+ R123_CUDA_DEVICE const_reverse_iterator crbegin() const{ return const_reverse_iterator(cend()); } \
+ R123_CUDA_DEVICE const_reverse_iterator crend() const{ return const_reverse_iterator(cbegin()); }
+#endif
+
+// Work-alike methods and typedefs modeled on std::array:
+#define CXXMETHODS(_N, W, T) \
+ typedef T value_type; \
+ typedef T* iterator; \
+ typedef const T* const_iterator; \
+ typedef value_type& reference; \
+ typedef const value_type& const_reference; \
+ typedef size_t size_type; \
+ typedef ptrdiff_t difference_type; \
+ typedef T* pointer; \
+ typedef const T* const_pointer; \
+ /* Boost.array has static_size. C++11 specializes tuple_size */ \
+ enum {static_size = _N}; \
+ R123_CUDA_DEVICE reference operator[](size_type i){return v[i];} \
+ R123_CUDA_DEVICE const_reference operator[](size_type i) const {return v[i];} \
+ R123_CUDA_DEVICE reference at(size_type i){ if(i >= _N) R123_THROW(std::out_of_range("array index out of range")); return (*this)[i]; } \
+ R123_CUDA_DEVICE const_reference at(size_type i) const { if(i >= _N) R123_THROW(std::out_of_range("array index out of range")); return (*this)[i]; } \
+ R123_CUDA_DEVICE size_type size() const { return _N; } \
+ R123_CUDA_DEVICE size_type max_size() const { return _N; } \
+ R123_CUDA_DEVICE bool empty() const { return _N==0; }; \
+ R123_CUDA_DEVICE iterator begin() { return &v[0]; } \
+ R123_CUDA_DEVICE iterator end() { return &v[_N]; } \
+ R123_CUDA_DEVICE const_iterator begin() const { return &v[0]; } \
+ R123_CUDA_DEVICE const_iterator end() const { return &v[_N]; } \
+ R123_CUDA_DEVICE const_iterator cbegin() const { return &v[0]; } \
+ R123_CUDA_DEVICE const_iterator cend() const { return &v[_N]; } \
+ R123_CUDA_DEVICE pointer data(){ return &v[0]; } \
+ R123_CUDA_DEVICE const_pointer data() const{ return &v[0]; } \
+ R123_CUDA_DEVICE reference front(){ return v[0]; } \
+ R123_CUDA_DEVICE const_reference front() const{ return v[0]; } \
+ R123_CUDA_DEVICE reference back(){ return v[_N-1]; } \
+ R123_CUDA_DEVICE const_reference back() const{ return v[_N-1]; } \
+ R123_CUDA_DEVICE bool operator==(const r123array##_N##x##W& rhs) const{ \
+ /* CUDA3 does not have std::equal */ \
+ for (size_t i = 0; i < _N; ++i) \
+ if (v[i] != rhs.v[i]) return false; \
+ return true; \
+ } \
+ R123_CUDA_DEVICE bool operator!=(const r123array##_N##x##W& rhs) const{ return !(*this == rhs); } \
+ /* CUDA3 does not have std::fill_n */ \
+ R123_CUDA_DEVICE void fill(const value_type& val){ for (size_t i = 0; i < _N; ++i) v[i] = val; } \
+ R123_CUDA_DEVICE void swap(r123array##_N##x##W& rhs){ \
+ /* CUDA3 does not have std::swap_ranges */ \
+ for (size_t i = 0; i < _N; ++i) { \
+ T tmp = v[i]; \
+ v[i] = rhs.v[i]; \
+ rhs.v[i] = tmp; \
+ } \
+ } \
+ R123_CUDA_DEVICE r123array##_N##x##W& incr(R123_ULONG_LONG n=1){ \
+ /* This test is tricky because we're trying to avoid spurious \
+ complaints about illegal shifts, yet still be compile-time \
+ evaulated. */ \
+ if(sizeof(T)<sizeof(n) && n>>((sizeof(T)<sizeof(n))?8*sizeof(T):0) ) \
+ return incr_carefully(n); \
+ if(n==1){ \
+ ++v[0]; \
+ if(_N==1 || R123_BUILTIN_EXPECT(!!v[0], 1)) return *this; \
+ }else{ \
+ v[0] += n; \
+ if(_N==1 || R123_BUILTIN_EXPECT(n<=v[0], 1)) return *this; \
+ } \
+ /* We expect that the N==?? tests will be \
+ constant-folded/optimized away by the compiler, so only the \
+ overflow tests (!!v[i]) remain to be done at runtime. For \
+ small values of N, it would be better to do this as an \
+ uncondtional sequence of adc. An experiment/optimization \
+ for another day... \
+ N.B. The weird subscripting: v[_N>3?3:0] is to silence \
+ a spurious error from icpc \
+ */ \
+ ++v[_N>1?1:0]; \
+ if(_N==2 || R123_BUILTIN_EXPECT(!!v[_N>1?1:0], 1)) return *this; \
+ ++v[_N>2?2:0]; \
+ if(_N==3 || R123_BUILTIN_EXPECT(!!v[_N>2?2:0], 1)) return *this; \
+ ++v[_N>3?3:0]; \
+ for(size_t i=4; i<_N; ++i){ \
+ if( R123_BUILTIN_EXPECT(!!v[i-1], 1) ) return *this; \
+ ++v[i]; \
+ } \
+ return *this; \
+ } \
+ /* seed(SeedSeq) would be a constructor if having a constructor */ \
+ /* didn't cause headaches with defaults */ \
+ template <typename SeedSeq> \
+ R123_CUDA_DEVICE static r123array##_N##x##W seed(SeedSeq &ss){ \
+ r123array##_N##x##W ret; \
+ const size_t Ngen = _N*((3+sizeof(value_type))/4); \
+ uint32_t u32[Ngen]; \
+ uint32_t *p32 = &u32[0]; \
+ ss.generate(&u32[0], &u32[Ngen]); \
+ for(size_t i=0; i<_N; ++i){ \
+ ret.v[i] = assemble_from_u32<value_type>(p32); \
+ p32 += (3+sizeof(value_type))/4; \
+ } \
+ return ret; \
+ } \
+protected: \
+ R123_CUDA_DEVICE r123array##_N##x##W& incr_carefully(R123_ULONG_LONG n){ \
+ /* n may be greater than the maximum value of a single value_type */ \
+ value_type vtn; \
+ vtn = n; \
+ v[0] += n; \
+ const unsigned rshift = 8* ((sizeof(n)>sizeof(value_type))? sizeof(value_type) : 0); \
+ for(size_t i=1; i<_N; ++i){ \
+ if(rshift){ \
+ n >>= rshift; \
+ }else{ \
+ n=0; \
+ } \
+ if( v[i-1] < vtn ) \
+ ++n; \
+ if( n==0 ) break; \
+ vtn = n; \
+ v[i] += n; \
+ } \
+ return *this; \
+ } \
+
+/** @cond HIDDEN_FROM_DOXYGEN */
+
+// There are several tricky considerations for the insertion and extraction
+// operators:
+// - we would like to be able to print r123array16x8 as a sequence of 16 integers,
+// not as 16 bytes.
+// - we would like to be able to print r123array1xm128i.
+// - we do not want an int conversion operator in r123m128i because it causes
+// lots of ambiguity problems with automatic promotions.
+// Solution: r123arrayinsertable and r123arrayextractable
+
+template<typename T>
+struct r123arrayinsertable{
+ const T& v;
+ r123arrayinsertable(const T& t_) : v(t_) {}
+ friend std::ostream& operator<<(std::ostream& os, const r123arrayinsertable<T>& t){
+ return os << t.v;
+ }
+};
+
+template<>
+struct r123arrayinsertable<uint8_t>{
+ const uint8_t& v;
+ r123arrayinsertable(const uint8_t& t_) : v(t_) {}
+ friend std::ostream& operator<<(std::ostream& os, const r123arrayinsertable<uint8_t>& t){
+ return os << (int)t.v;
+ }
+};
+
+template<typename T>
+struct r123arrayextractable{
+ T& v;
+ r123arrayextractable(T& t_) : v(t_) {}
+ friend std::istream& operator>>(std::istream& is, r123arrayextractable<T>& t){
+ return is >> t.v;
+ }
+};
+
+template<>
+struct r123arrayextractable<uint8_t>{
+ uint8_t& v;
+ r123arrayextractable(uint8_t& t_) : v(t_) {}
+ friend std::istream& operator>>(std::istream& is, r123arrayextractable<uint8_t>& t){
+ int i;
+ is >> i;
+ t.v = i;
+ return is;
+ }
+};
+/** @endcond */
+
+#define CXXOVERLOADS(_N, W, T) \
+ \
+inline std::ostream& operator<<(std::ostream& os, const r123array##_N##x##W& a){ \
+ os << r123arrayinsertable<T>(a.v[0]); \
+ for(size_t i=1; i<_N; ++i) \
+ os << " " << r123arrayinsertable<T>(a.v[i]); \
+ return os; \
+} \
+ \
+inline std::istream& operator>>(std::istream& is, r123array##_N##x##W& a){ \
+ for(size_t i=0; i<_N; ++i){ \
+ r123arrayextractable<T> x(a.v[i]); \
+ is >> x; \
+ } \
+ return is; \
+} \
+ \
+namespace r123{ \
+ typedef r123array##_N##x##W Array##_N##x##W; \
+}
+
+#endif /* __cplusplus */
+
+/* _r123array_tpl expands to a declaration of struct r123arrayNxW.
+
+ In C, it's nothing more than a struct containing an array of N
+ objects of type T.
+
+ In C++ it's the same, but endowed with an assortment of member
+ functions, typedefs and friends. In C++, r123arrayNxW looks a lot
+ like std::array<T,N>, has most of the capabilities of a container,
+ and satisfies the requirements outlined in compat/Engine.hpp for
+ counter and key types. ArrayNxW, in the r123 namespace is
+ a typedef equivalent to r123arrayNxW.
+*/
+
+#define _r123array_tpl(_N, W, T) \
+ /** @ingroup arrayNxW */ \
+ /** @see arrayNxW */ \
+struct r123array##_N##x##W{ \
+ T v[_N]; \
+ CXXMETHODS(_N, W, T) \
+ CXXMETHODS_REQUIRING_STL \
+}; \
+ \
+CXXOVERLOADS(_N, W, T)
+
+
+#if defined(__CUDACC__)
+/* Disable complaints from CUDA8 and C++ */
+#pragma diag_suppress = code_is_unreachable
+#endif
+_r123array_tpl(1, 32, uint32_t) /* r123array1x32 */
+_r123array_tpl(2, 32, uint32_t) /* r123array2x32 */
+_r123array_tpl(4, 32, uint32_t) /* r123array4x32 */
+_r123array_tpl(8, 32, uint32_t) /* r123array8x32 */
+
+#if R123_USE_64BIT
+_r123array_tpl(1, 64, uint64_t) /* r123array1x64 */
+_r123array_tpl(2, 64, uint64_t) /* r123array2x64 */
+_r123array_tpl(4, 64, uint64_t) /* r123array4x64 */
+#endif
+#if defined(__CUDACC__)
+#pragma diag_default = code_is_unreachable
+#endif
+
+_r123array_tpl(16, 8, uint8_t) /* r123array16x8 for ARSsw, AESsw */
+
+#if R123_USE_SSE
+_r123array_tpl(1, m128i, r123m128i) /* r123array1x128i for ARSni, AESni */
+#endif
+
+/* In C++, it's natural to use sizeof(a::value_type), but in C it's
+ pretty convoluted to figure out the width of the value_type of an
+ r123arrayNxW:
+*/
+#define R123_W(a) (8*sizeof(((a *)0)->v[0]))
+
+/** @namespace r123
+ Most of the Random123 C++ API is contained in the r123 namespace.
+*/
+
+#endif
+
diff --git a/include/Random123/ars.h b/include/Random123/ars.h
@@ -0,0 +1,204 @@
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+ notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions, and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+#ifndef __Random123_ars_dot_hpp__
+#define __Random123_ars_dot_hpp__
+
+#include "features/compilerfeatures.h"
+#include "array.h"
+
+#if R123_USE_AES_NI
+
+#ifndef ARS1xm128i_DEFAULT_ROUNDS
+#define ARS1xm128i_DEFAULT_ROUNDS 7
+#endif
+
+/** @ingroup AESNI */
+enum r123_enum_ars1xm128i {ars1xm128i_rounds = ARS1xm128i_DEFAULT_ROUNDS};
+
+/* ARS1xm128i with Weyl keys. Fast, and Crush-resistant, but NOT CRYPTO. */
+/** @ingroup AESNI */
+typedef struct r123array1xm128i ars1xm128i_ctr_t;
+/** @ingroup AESNI */
+typedef struct r123array1xm128i ars1xm128i_key_t;
+/** @ingroup AESNI */
+typedef struct r123array1xm128i ars1xm128i_ukey_t;
+/** @ingroup AESNI */
+R123_STATIC_INLINE ars1xm128i_key_t ars1xm128ikeyinit(ars1xm128i_ukey_t uk) { return uk; }
+/** @ingroup AESNI */
+R123_STATIC_INLINE ars1xm128i_ctr_t ars1xm128i_R(unsigned int Nrounds, ars1xm128i_ctr_t in, ars1xm128i_key_t k){
+ __m128i kweyl = _mm_set_epi64x(R123_64BIT(0xBB67AE8584CAA73B), /* sqrt(3) - 1.0 */
+ R123_64BIT(0x9E3779B97F4A7C15)); /* golden ratio */
+ /* N.B. the aesenc instructions do the xor *after*
+ // so if we want to follow the AES pattern, we
+ // have to do the initial xor explicitly */
+ __m128i kk = k.v[0].m;
+ __m128i v = _mm_xor_si128(in.v[0].m, kk);
+ ars1xm128i_ctr_t ret;
+ R123_ASSERT(Nrounds<=10);
+ if( Nrounds>1 ){
+ kk = _mm_add_epi64(kk, kweyl);
+ v = _mm_aesenc_si128(v, kk);
+ }
+ if( Nrounds>2 ){
+ kk = _mm_add_epi64(kk, kweyl);
+ v = _mm_aesenc_si128(v, kk);
+ }
+ if( Nrounds>3 ){
+ kk = _mm_add_epi64(kk, kweyl);
+ v = _mm_aesenc_si128(v, kk);
+ }
+ if( Nrounds>4 ){
+ kk = _mm_add_epi64(kk, kweyl);
+ v = _mm_aesenc_si128(v, kk);
+ }
+ if( Nrounds>5 ){
+ kk = _mm_add_epi64(kk, kweyl);
+ v = _mm_aesenc_si128(v, kk);
+ }
+ if( Nrounds>6 ){
+ kk = _mm_add_epi64(kk, kweyl);
+ v = _mm_aesenc_si128(v, kk);
+ }
+ if( Nrounds>7 ){
+ kk = _mm_add_epi64(kk, kweyl);
+ v = _mm_aesenc_si128(v, kk);
+ }
+ if( Nrounds>8 ){
+ kk = _mm_add_epi64(kk, kweyl);
+ v = _mm_aesenc_si128(v, kk);
+ }
+ if( Nrounds>9 ){
+ kk = _mm_add_epi64(kk, kweyl);
+ v = _mm_aesenc_si128(v, kk);
+ }
+ kk = _mm_add_epi64(kk, kweyl);
+ v = _mm_aesenclast_si128(v, kk);
+ ret.v[0].m = v;
+ return ret;
+}
+
+/** @def ars1xm128i
+@ingroup AESNI
+The ars1mx128i macro provides a C API interface to the @ref AESNI "ARS" CBRNG with the default number of rounds i.e. \c ars1xm128i_rounds **/
+#define ars1xm128i(c,k) ars1xm128i_R(ars1xm128i_rounds, c, k)
+
+/** @ingroup AESNI */
+typedef struct r123array4x32 ars4x32_ctr_t;
+/** @ingroup AESNI */
+typedef struct r123array4x32 ars4x32_key_t;
+/** @ingroup AESNI */
+typedef struct r123array4x32 ars4x32_ukey_t;
+/** @ingroup AESNI */
+enum r123_enum_ars4x32 {ars4x32_rounds = ARS1xm128i_DEFAULT_ROUNDS};
+/** @ingroup AESNI */
+R123_STATIC_INLINE ars4x32_key_t ars4x32keyinit(ars4x32_ukey_t uk) { return uk; }
+/** @ingroup AESNI */
+R123_STATIC_INLINE ars4x32_ctr_t ars4x32_R(unsigned int Nrounds, ars4x32_ctr_t c, ars4x32_key_t k){
+ ars1xm128i_ctr_t c128;
+ ars1xm128i_key_t k128;
+ c128.v[0].m = _mm_set_epi32(c.v[3], c.v[2], c.v[1], c.v[0]);
+ k128.v[0].m = _mm_set_epi32(k.v[3], k.v[2], k.v[1], k.v[0]);
+ c128 = ars1xm128i_R(Nrounds, c128, k128);
+ _mm_storeu_si128((__m128i*)&c.v[0], c128.v[0].m);
+ return c;
+}
+
+/** @def ars4x32
+@ingroup AESNI
+The ars4x32 macro provides a C API interface to the @ref AESNI "ARS" CBRNG with the default number of rounds i.e. \c ars4x32_rounds **/
+#define ars4x32(c,k) ars4x32_R(ars4x32_rounds, c, k)
+
+#ifdef __cplusplus
+namespace r123{
+/**
+@ingroup AESNI
+
+ARS1xm128i_R exports the member functions, typedefs and operator overloads required by a @ref CBRNG class.
+
+ARS1xm128i uses the crypotgraphic AES round function, but a @b non-cryptographc key schedule
+to save time and space.
+
+ARS1xm128i is only available when the feature-test macro R123_USE_AES_NI is true, which
+should occur only when the compiler is configured to generate AES-NI instructions (or
+when defaults are overridden by compile-time, compiler-command-line options).
+
+The template argument, ROUNDS, is the number of times the ARS round
+functions will be applied.
+
+As of September 2011, the authors know of no statistical flaws with
+ROUNDS=5 or more.
+
+@class ARS1xm128i_R
+
+*/
+template<unsigned int ROUNDS>
+struct ARS1xm128i_R{
+ typedef ars1xm128i_ctr_t ctr_type;
+ typedef ars1xm128i_key_t key_type;
+ typedef ars1xm128i_key_t ukey_type;
+ static const unsigned int rounds=ROUNDS;
+ R123_FORCE_INLINE(ctr_type operator()(ctr_type ctr, key_type key) const){
+ return ars1xm128i_R(ROUNDS, ctr, key);
+ }
+};
+
+/** @class ARS4x32_R
+ @ingroup AESNI
+*/
+
+template<unsigned int ROUNDS>
+struct ARS4x32_R{
+ typedef ars4x32_ctr_t ctr_type;
+ typedef ars4x32_key_t key_type;
+ typedef ars4x32_key_t ukey_type;
+ static const unsigned int rounds=ROUNDS;
+ R123_FORCE_INLINE(ctr_type operator()(ctr_type ctr, key_type key) const){
+ return ars4x32_R(ROUNDS, ctr, key);
+ }
+};
+/**
+@ingroup AESNI
+
+@class ARS1xm128i_R
+ ARS1xm128i is equivalent to ARS1xm128i_R<7>. With 7 rounds,
+ the ARS1xm128i CBRNG has a considerable safety margin over the minimum number
+ of rounds with no known statistical flaws, but still has excellent
+ performance. */
+typedef ARS1xm128i_R<ars1xm128i_rounds> ARS1xm128i;
+typedef ARS4x32_R<ars4x32_rounds> ARS4x32;
+} // namespace r123
+
+#endif /* __cplusplus */
+
+#endif /* R123_USE_AES_NI */
+
+#endif
diff --git a/include/Random123/boxmuller.hpp b/include/Random123/boxmuller.hpp
@@ -0,0 +1,139 @@
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+ notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions, and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+// This file implements the Box-Muller method for generating gaussian
+// random variables (GRVs). Box-Muller has the advantage of
+// deterministically requiring exactly two uniform random variables as
+// input and producing exactly two GRVs as output, which makes it
+// especially well-suited to the counter-based generators in
+// Random123. Other methods (e.g., Ziggurat, polar) require an
+// indeterminate number of inputs for each output and so require a
+// 'MicroURNG' to be used with Random123. The down side of Box-Muller
+// is that it calls sincos, log and sqrt, which may be slow. However,
+// on GPUs, these functions are remarkably fast, which makes
+// Box-Muller the fastest GRV generator we know of on GPUs.
+//
+// This file exports two structs and one overloaded function,
+// all in the r123 namespace:
+// struct r123::float2{ float x,y; }
+// struct r123::double2{ double x,y; }
+//
+// r123::float2 r123::boxmuller(uint32_t u0, uint32_t u1);
+// r123::double2 r123::boxmuller(uint64_t u0, uint64_t u1);
+//
+// float2 and double2 are identical to their synonymous global-
+// namespace structures in CUDA.
+//
+// This file may not be as portable, and has not been tested as
+// rigorously as other files in the library, e.g., the generators.
+// Nevertheless, we hope it is useful and we encourage developers to
+// copy it and modify it for their own use. We invite comments and
+// improvements.
+
+#ifndef _r123_BOXMULLER_HPP__
+#define _r123_BOXMULLER_HPP__
+
+#include <Random123/features/compilerfeatures.h>
+#include <Random123/uniform.hpp>
+#include <math.h>
+
+namespace r123{
+
+#if !defined(__CUDACC__)
+typedef struct { float x, y; } float2;
+typedef struct { double x, y; } double2;
+#else
+typedef ::float2 float2;
+typedef ::double2 double2;
+#endif
+
+#if !defined(R123_NO_SINCOS) && defined(__APPLE__)
+/* MacOS X 10.10.5 (2015) doesn't have sincosf */
+#define R123_NO_SINCOS 1
+#endif
+
+#if R123_NO_SINCOS /* enable this if sincos and sincosf are not in the math library */
+R123_CUDA_DEVICE R123_STATIC_INLINE void sincosf(float x, float *s, float *c) {
+ *s = sinf(x);
+ *c = cosf(x);
+}
+
+R123_CUDA_DEVICE R123_STATIC_INLINE void sincos(double x, double *s, double *c) {
+ *s = sin(x);
+ *c = cos(x);
+}
+#endif /* sincos is not in the math library */
+
+#if !defined(CUDART_VERSION) || CUDART_VERSION < 5000 /* enabled if sincospi and sincospif are not in math lib */
+
+R123_CUDA_DEVICE R123_STATIC_INLINE void sincospif(float x, float *s, float *c){
+ const float PIf = 3.1415926535897932f;
+ sincosf(PIf*x, s, c);
+}
+
+R123_CUDA_DEVICE R123_STATIC_INLINE void sincospi(double x, double *s, double *c) {
+ const double PI = 3.1415926535897932;
+ sincos(PI*x, s, c);
+}
+#endif /* sincospi is not in math lib */
+
+/*
+ * take two 32bit unsigned random values and return a float2 with
+ * two random floats in a normal distribution via a Box-Muller transform
+ */
+R123_CUDA_DEVICE R123_STATIC_INLINE float2 boxmuller(uint32_t u0, uint32_t u1) {
+ float r;
+ float2 f;
+ sincospif(uneg11<float>(u0), &f.x, &f.y);
+ r = sqrtf(-2.f * logf(u01<float>(u1))); // u01 is guaranteed to avoid 0.
+ f.x *= r;
+ f.y *= r;
+ return f;
+}
+
+/*
+ * take two 64bit unsigned random values and return a double2 with
+ * two random doubles in a normal distribution via a Box-Muller transform
+ */
+R123_CUDA_DEVICE R123_STATIC_INLINE double2 boxmuller(uint64_t u0, uint64_t u1) {
+ double r;
+ double2 f;
+
+ sincospi(uneg11<double>(u0), &f.x, &f.y);
+ r = sqrt(-2. * log(u01<double>(u1))); // u01 is guaranteed to avoid 0.
+ f.x *= r;
+ f.y *= r;
+ return f;
+}
+} // namespace r123
+
+#endif /* BOXMULLER_H__ */
diff --git a/include/Random123/conventional/Engine.hpp b/include/Random123/conventional/Engine.hpp
@@ -0,0 +1,280 @@
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+ notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions, and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+#ifndef __Engine_dot_hpp_
+#define __Engine_dot_hpp_
+
+#include "../features/compilerfeatures.h"
+#include "../array.h"
+#include <limits>
+#include <stdexcept>
+#include <sstream>
+#include <algorithm>
+#include <vector>
+#if R123_USE_CXX11_TYPE_TRAITS
+#include <type_traits>
+#endif
+
+namespace r123{
+/**
+ If G satisfies the requirements of a CBRNG, and has a ctr_type whose
+ value_type is an unsigned integral type, then Engine<G> satisfies
+ the requirements of a C++11 "Uniform Random Number Engine" and can
+ be used in any context where such an object is expected.
+
+ Note that wrapping a counter based RNG with a traditional API in
+ this way obscures much of the power of counter based PRNGs.
+ Nevertheless, it may be of value in applications that are already
+ coded to work with the C++11 random number engines.
+
+ The MicroURNG template in MicroURNG.hpp
+ provides the more limited functionality of a C++11 "Uniform
+ Random Number Generator", but leaves the application in control
+ of counters and keys and hence may be preferable to the Engine template.
+ For example, a MicroURNG allows one to use C++11 "Random Number
+ Distributions" without giving up control over the counters
+ and keys.
+*/
+
+template<typename CBRNG>
+struct Engine {
+ typedef CBRNG cbrng_type;
+ typedef typename CBRNG::ctr_type ctr_type;
+ typedef typename CBRNG::key_type key_type;
+ typedef typename CBRNG::ukey_type ukey_type;
+ typedef typename ctr_type::value_type result_type;
+
+protected:
+ cbrng_type b;
+ key_type key;
+ ctr_type c;
+ ctr_type v;
+
+ void fix_invariant(){
+ if( v.back() != 0 ) {
+ result_type vv = v.back();
+ v = b(c, key);
+ v.back() = vv;
+ }
+ }
+public:
+ explicit Engine() : b(), c() {
+ ukey_type x = {{}};
+ v.back() = 0;
+ key = x;
+ }
+ explicit Engine(result_type r) : b(), c() {
+ ukey_type x = {{typename ukey_type::value_type(r)}};
+ v.back() = 0;
+ key = x;
+ }
+ // 26.5.3 says that the SeedSeq templates shouldn't particpate in
+ // overload resolution unless the type qualifies as a SeedSeq.
+ // How that is determined is unspecified, except that "as a
+ // minimum a type shall not qualify as a SeedSeq if it is
+ // implicitly convertible to a result_type."
+ //
+ // First, we make sure that even the non-const copy constructor
+ // works as expected. In addition, if we've got C++11
+ // type_traits, we use enable_if and is_convertible to implement
+ // the convertible-to-result_type restriction. Otherwise, the
+ // template is unconditional and will match in some surpirsing
+ // and undesirable situations.
+ Engine(Engine& e) : b(e.b), key(e.key), c(e.c){
+ v.back() = e.v.back();
+ fix_invariant();
+ }
+ Engine(const Engine& e) : b(e.b), key(e.key), c(e.c){
+ v.back() = e.v.back();
+ fix_invariant();
+ }
+#if __cplusplus >= 201103L
+ Engine& operator=(const Engine&) = default;
+ Engine& operator=(Engine&&) = default;
+#endif
+
+ template <typename SeedSeq>
+ explicit Engine(SeedSeq &s
+#if R123_USE_CXX11_TYPE_TRAITS
+ , typename std::enable_if<!std::is_convertible<SeedSeq, result_type>::value>::type* =0
+#endif
+ )
+ : b(), c() {
+ ukey_type ukey = ukey_type::seed(s);
+ key = ukey;
+ v.back() = 0;
+ }
+ void seed(result_type r){
+ *this = Engine(r);
+ }
+ template <typename SeedSeq>
+ void seed(SeedSeq &s
+#if R123_USE_CXX11_TYPE_TRAITS
+ , typename std::enable_if<!std::is_convertible<SeedSeq, result_type>::value>::type* =0
+#endif
+ ){
+ *this = Engine(s);
+ }
+ void seed(){
+ *this = Engine();
+ }
+ friend bool operator==(const Engine& lhs, const Engine& rhs){
+ return lhs.c==rhs.c && lhs.v.back() == rhs.v.back() && lhs.key == rhs.key;
+ }
+ friend bool operator!=(const Engine& lhs, const Engine& rhs){
+ return lhs.c!=rhs.c || lhs.v.back()!=rhs.v.back() || lhs.key!=rhs.key;
+ }
+
+ friend std::ostream& operator<<(std::ostream& os, const Engine& be){
+ return os << be.c << " " << be.key << " " << be.v.back();
+ }
+
+ friend std::istream& operator>>(std::istream& is, Engine& be){
+ is >> be.c >> be.key >> be.v.back();
+ be.fix_invariant();
+ return is;
+ }
+
+ // The <random> shipped with MacOS Xcode 4.5.2 imposes a
+ // non-standard requirement that URNGs also have static data
+ // members: _Min and _Max. Later versions of libc++ impose the
+ // requirement only when constexpr isn't supported. Although the
+ // Xcode 4.5.2 requirement is clearly non-standard, it is unlikely
+ // to be fixed and it is very easy work around. We certainly
+ // don't want to go to great lengths to accommodate every buggy
+ // library we come across, but in this particular case, the effort
+ // is low and the benefit is high, so it's worth doing. Thanks to
+ // Yan Zhou for pointing this out to us. See similar code in
+ // ../MicroURNG.hpp
+ const static result_type _Min = 0;
+ const static result_type _Max = ~((result_type)0);
+
+ static R123_CONSTEXPR result_type min R123_NO_MACRO_SUBST () { return _Min; }
+ static R123_CONSTEXPR result_type max R123_NO_MACRO_SUBST () { return _Max; }
+
+ result_type operator()(){
+ if( c.size() == 1 ) // short-circuit the scalar case. Compilers aren't mind-readers.
+ return b(c.incr(), key)[0];
+ result_type& elem = v.back();
+ if( elem == 0 ){
+ v = b(c.incr(), key);
+ result_type ret = v.back();
+ elem = c.size()-1;
+ return ret;
+ }
+ return v[--elem];
+ }
+
+ void discard(R123_ULONG_LONG skip){
+ // don't forget: elem counts down
+ size_t nelem = c.size();
+ size_t sub = skip % nelem;
+ result_type& elem = v.back();
+ skip /= nelem;
+ if (elem < sub) {
+ elem += nelem;
+ skip++;
+ }
+ elem -= sub;
+ c.incr(skip);
+ fix_invariant();
+ }
+
+ //--------------------------
+ // Some bonus methods, not required for a Random Number
+ // Engine
+
+ // Constructors and seed() method for ukey_type seem useful
+ // We need const and non-const to supersede the SeedSeq template.
+ explicit Engine(const ukey_type &uk) : key(uk), c(){ v.back() = 0; }
+ explicit Engine(ukey_type &uk) : key(uk), c(){ v.back() = 0; }
+ void seed(const ukey_type& uk){
+ *this = Engine(uk);
+ }
+ void seed(ukey_type& uk){
+ *this = Engine(uk);
+ }
+
+#if R123_USE_CXX11_TYPE_TRAITS
+ template <typename DUMMY=void>
+ explicit Engine(const key_type& k,
+ typename std::enable_if<!std::is_same<ukey_type, key_type>::value, DUMMY>::type* = 0)
+ : key(k), c(){ v.back() = 0; }
+
+ template <typename DUMMY=void>
+ void seed(const key_type& k,
+ typename std::enable_if<!std::is_same<ukey_type, key_type>::value, DUMMY>::type* = 0){
+ *this = Engine(k);
+ }
+#endif
+
+ // Forward the e(counter) to the CBRNG we are templated
+ // on, using the current value of the key.
+ ctr_type operator()(const ctr_type& c) const{
+ return b(c, key);
+ }
+
+ key_type getkey() const{
+ return key;
+ }
+
+ // N.B. setkey(k) is different from seed(k) because seed(k) zeros
+ // the counter (per the C++11 requirements for an Engine), whereas
+ // setkey does not.
+ void setkey(const key_type& k){
+ key = k;
+ fix_invariant();
+ }
+
+ // Maybe the caller want's to know the details of
+ // the internal state, e.g., so it can call a different
+ // bijection with the same counter.
+ std::pair<ctr_type, result_type> getcounter() const {
+ return std::make_pair(c, v.back());
+ }
+
+ // And the inverse.
+ void setcounter(const ctr_type& _c, result_type _elem){
+ static const size_t nelem = c.size();
+ if( _elem >= nelem )
+ throw std::range_error("Engine::setcounter called with elem out of range");
+ c = _c;
+ v.back() = _elem;
+ fix_invariant();
+ }
+
+ void setcounter(const std::pair<ctr_type, result_type>& ce){
+ setcounter(ce.first, ce.second);
+ }
+};
+} // namespace r123
+
+#endif
diff --git a/include/Random123/conventional/gsl_cbrng.h b/include/Random123/conventional/gsl_cbrng.h
@@ -0,0 +1,128 @@
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+ notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions, and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+#ifndef __r123_compat_gslrng_dot_h__
+#define __r123_compat_gslrng_dot_h__
+
+#include <gsl/gsl_rng.h>
+#include <string.h>
+
+/**
+ The macro: GSL_CBRNG(NAME, CBRNGNAME)
+ declares the necessary structs and constants that define a
+ gsl_rng_NAME type based on the counter-based RNG CBRNGNAME. For example:
+
+ Usage:
+
+ @code
+ #include <Random123/threefry.h>
+ #include <Random123/conventional/gsl_cbrng.h> // this file
+ GSL_CBRNG(cbrng, threefry4x32); // creates gsl_rng_cbrng
+
+ int main(int argc, char **argv){
+ gsl_rng *r = gsl_rng_alloc(gsl_rng_cbrng);
+ ... use r as you would use any other gsl_rng ...
+ }
+ @endcode
+
+ It requires that NAME be the name of a CBRNG that follows the
+ naming and stylistic conventions of the Random123 library.
+
+ Note that wrapping a \ref CBRNG "counter-based PRNG" with a traditional API in
+ this way obscures much of the power of the CBRNG API.
+ Nevertheless, it may be of value to applications that are already
+ coded to work with GSL random number generators, and that wish
+ to use the RNGs in the Random123 library.
+
+ */
+
+#define GSL_CBRNG(NAME, CBRNGNAME) \
+const gsl_rng_type *gsl_rng_##NAME; \
+ \
+typedef struct{ \
+ CBRNGNAME##_ctr_t ctr; \
+ CBRNGNAME##_ctr_t r; \
+ CBRNGNAME##_key_t key; \
+ int elem; \
+} NAME##_state; \
+ \
+static unsigned long int NAME##_get(void *vstate){ \
+ NAME##_state *st = (NAME##_state *)vstate; \
+ const int N=sizeof(st->ctr.v)/sizeof(st->ctr.v[0]); \
+ if( st->elem == 0 ){ \
+ ++st->ctr.v[0]; \
+ if( N>1 && st->ctr.v[0] == 0 ) ++st->ctr.v[1]; \
+ if( N>2 && st->ctr.v[1] == 0 ) ++st->ctr.v[2]; \
+ if( N>3 && st->ctr.v[2] == 0 ) ++st->ctr.v[3]; \
+ st->r = CBRNGNAME(st->ctr, st->key); \
+ st->elem = N; \
+ } \
+ return 0xffffffffUL & st->r.v[--st->elem]; \
+} \
+ \
+static double \
+NAME##_get_double (void * vstate) \
+{ \
+ return NAME##_get (vstate)/4294967296.0; \
+} \
+ \
+static void NAME##_set(void *vstate, unsigned long int s){ \
+ NAME##_state *st = (NAME##_state *)vstate; \
+ st->elem = 0; \
+ /* Assume that key and ctr have an array member, v, \
+ as if they are r123arrayNxW. If not, this will fail \
+ to compile. In particular, this macro fails to compile \
+ when the underlying CBRNG requires use of keyinit */ \
+ memset(&st->ctr.v[0], 0, sizeof(st->ctr.v)); \
+ memset(&st->key.v[0], 0, sizeof(st->key.v)); \
+ /* GSL 1.15 documentation says this about gsl_rng_set: \
+ Note that the most generators only accept 32-bit seeds, with higher \
+ values being reduced modulo 2^32. For generators with smaller \
+ ranges the maximum seed value will typically be lower. \
+ so we won't jump through any hoops here to deal with \
+ high bits if sizeof(unsigned long) > sizeof(uint32_t). */ \
+ st->key.v[0] = s; \
+} \
+ \
+static const gsl_rng_type NAME##_type = { \
+ #NAME, \
+ 0xffffffffUL, \
+ 0, \
+ sizeof(NAME##_state), \
+ &NAME##_set, \
+ &NAME##_get, \
+ &NAME##_get_double \
+}; \
+ \
+const gsl_rng_type *gsl_rng_##NAME = &NAME##_type
+
+#endif
+
diff --git a/include/Random123/features/clangfeatures.h b/include/Random123/features/clangfeatures.h
@@ -0,0 +1,93 @@
+/*
+Copyright 2010-2016, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+ notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions, and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+#ifndef __clangfeatures_dot_hpp
+#define __clangfeatures_dot_hpp
+
+#ifndef R123_USE_X86INTRIN_H
+#if (defined(__x86_64__)||defined(__i386__))
+#define R123_USE_X86INTRIN_H 1
+#else
+#define R123_USE_X86INTRIN_H 0
+#endif
+#endif
+
+#ifndef R123_USE_CXX11_UNRESTRICTED_UNIONS
+#define R123_USE_CXX11_UNRESTRICTED_UNIONS __has_feature(cxx_unrestricted_unions)
+#endif
+
+#ifndef R123_USE_CXX11_STATIC_ASSERT
+#define R123_USE_CXX11_STATIC_ASSERT __has_feature(cxx_static_assert)
+#endif
+
+// With clang-3.6, -Wall warns about unused-local-typedefs.
+// The "obvious" thing to do is to ignore -Wunused-local-typedefs,
+// but that doesn't work because earlier versions of clang blow
+// up on an 'unknown warning group'. So we briefly ignore -Wall...
+// It's tempting to just give up on static assertions in pre-c++11 code.
+#if !R123_USE_CXX11_STATIC_ASSERT && !defined(R123_STATIC_ASSERT)
+#define R123_STATIC_ASSERT(expr, msg) \
+_Pragma("clang diagnostic push") \
+_Pragma("clang diagnostic ignored \"-Wall\"") \
+typedef char static_assertion[(!!(expr))*2-1] \
+_Pragma("clang diagnostic pop")
+#endif
+
+#ifndef R123_USE_CXX11_CONSTEXPR
+#define R123_USE_CXX11_CONSTEXPR __has_feature(cxx_constexpr)
+#endif
+
+#ifndef R123_USE_CXX11_EXPLICIT_CONVERSIONS
+#define R123_USE_CXX11_EXPLICIT_CONVERSIONS __has_feature(cxx_explicit_conversions)
+#endif
+
+// With clang-3.0, the apparently simpler:
+// #define R123_USE_CXX11_RANDOM __has_include(<random>)
+// dumps core.
+#ifndef R123_USE_CXX11_RANDOM
+#if __cplusplus>=201103L && __has_include(<random>)
+#define R123_USE_CXX11_RANDOM 1
+#else
+#define R123_USE_CXX11_RANDOM 0
+#endif
+#endif
+
+#ifndef R123_USE_CXX11_TYPE_TRAITS
+#if __cplusplus>=201103L && __has_include(<type_traits>)
+#define R123_USE_CXX11_TYPE_TRAITS 1
+#else
+#define R123_USE_CXX11_TYPE_TRAITS 0
+#endif
+#endif
+
+#include "gccfeatures.h"
+
+#endif
diff --git a/include/Random123/features/compilerfeatures.h b/include/Random123/features/compilerfeatures.h
@@ -0,0 +1,343 @@
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+ notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions, and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+/**
+
+@page porting Preprocessor symbols for porting Random123 to different platforms.
+
+The Random123 library is portable across C, C++, CUDA, OpenCL environments,
+and multiple operating systems (Linux, Windows 7, Mac OS X, FreeBSD, Solaris).
+This level of portability requires the abstraction of some features
+and idioms that are either not standardized (e.g., asm statments), or for which
+different vendors have their own standards (e.g., SSE intrinsics) or for
+which vendors simply refuse to conform to well-established standards (e.g., <inttypes.h>).
+
+Random123/features/compilerfeatures.h
+conditionally includes a compiler-or-OS-specific Random123/featires/XXXfeatures.h file which
+defines appropriate values for the preprocessor symbols which can be used with
+a specific compiler or OS. Those symbols will then
+be used by other header files and source files in the Random123
+library (and may be used by applications) to control what actually
+gets presented to the compiler.
+
+Most of the symbols are boolean valued. In general, they will
+\b always be defined with value either 1 or 0, so do
+\b NOT use \#ifdef. Use \#if R123_USE_SOMETHING instead.
+
+Library users can override any value by defining the pp-symbol with a compiler option,
+e.g.,
+
+ cc -DR123_USE_MULHILO64_C99
+
+will use a strictly c99 version of the full-width 64x64->128-bit multiplication
+function, even if it would be disabled by default.
+
+All boolean-valued pre-processor symbols in Random123/features/compilerfeatures.h start with the prefix R123_USE_
+@verbatim
+ AES_NI
+ AES_OPENSSL
+ SSE4_2
+ SSE4_1
+ SSE
+
+ STD_RANDOM
+
+ GNU_UINT128
+ ASM_GNU
+ ASM_MSASM
+
+ CPUID_MSVC
+
+ CXX11_RANDOM
+ CXX11_TYPE_TRAITS
+ CXX11_STATIC_ASSERT
+ CXX11_CONSTEXPR
+ CXX11_UNRESTRICTED_UNIONS
+ CXX11_EXPLICIT_CONVERSIONS
+ CXX11_LONG_LONG
+ CXX11_STD_ARRAY
+ CXX11
+
+ X86INTRIN_H
+ IA32INTRIN_H
+ XMMINTRIN_H
+ EMMINTRIN_H
+ SMMINTRIN_H
+ WMMINTRIN_H
+ INTRIN_H
+
+ MULHILO32_ASM
+ MULHILO64_ASM
+ MULHILO64_MSVC_INTRIN
+ MULHILO64_CUDA_INTRIN
+ MULHILO64_OPENCL_INTRIN
+ MULHILO64_C99
+
+ U01_DOUBLE
+
+@endverbatim
+Most have obvious meanings. Some non-obvious ones:
+
+AES_NI and AES_OPENSSL are not mutually exclusive. You can have one,
+both or neither.
+
+GNU_UINT128 says that it's safe to use __uint128_t, but it
+does not require its use. In particular, it should be
+used in mulhilo<uint64_t> only if MULHILO64_ASM is unset.
+
+If the XXXINTRIN_H macros are true, then one should
+@code
+#include <xxxintrin.h>
+@endcode
+to gain accesss to compiler intrinsics.
+
+The CXX11_SOME_FEATURE macros allow the code to use specific
+features of the C++11 language and library. The catchall
+In the absence of a specific CXX11_SOME_FEATURE, the feature
+is controlled by the catch-all R123_USE_CXX11 macro.
+
+U01_DOUBLE defaults on, and can be turned off (set to 0)
+if one does not want the utility functions that convert to double
+(i.e. u01_*_53()), e.g. on OpenCL without the cl_khr_fp64 extension.
+
+There are a number of invariants that are always true. Application code may
+choose to rely on these:
+
+<ul>
+<li>ASM_GNU and ASM_MASM are mutually exclusive
+<li>The "higher" SSE values imply the lower ones.
+</ul>
+
+There are also non-boolean valued symbols:
+
+<ul>
+<li>R123_STATIC_INLINE -
+ According to both C99 and GNU99, the 'static inline' declaration allows
+ the compiler to not emit code if the function is not used.
+ Note that the semantics of 'inline', 'static' and 'extern' in
+ gcc have changed over time and are subject to modification by
+ command line options, e.g., -std=gnu89, -fgnu-inline.
+ Nevertheless, it appears that the meaning of 'static inline'
+ has not changed over time and (with a little luck) the use of 'static inline'
+ here will be portable between versions of gcc and to other C99
+ compilers.
+ See: http://gcc.gnu.org/onlinedocs/gcc/Inline.html
+ http://www.greenend.org.uk/rjk/2003/03/inline.html
+
+<li>R123_FORCE_INLINE(decl) -
+ which expands to 'decl', adorned with the compiler-specific
+ embellishments to strongly encourage that the declared function be
+ inlined. If there is no such compiler-specific magic, it should
+ expand to decl, unadorned.
+
+<li>R123_CUDA_DEVICE - which expands to __device__ (or something else with
+ sufficiently similar semantics) when CUDA is in use, and expands
+ to nothing in other cases.
+
+<li>R123_METAL_THREAD_ADDRESS_SPACE - which expands to 'thread' (or
+ something else with sufficiently similar semantics) when compiling a
+ Metal kernel, and expands to nothing in other cases.
+
+<li>R123_ASSERT(x) - which expands to assert(x), or maybe to nothing at
+ all if we're in an environment so feature-poor that you can't even
+ call assert (I'm looking at you, CUDA and OpenCL), or even include
+ assert.h safely (OpenCL).
+
+<li>R123_STATIC_ASSERT(expr,msg) - which expands to
+ static_assert(expr,msg), or to an expression that
+ will raise a compile-time exception if expr is not true.
+
+<li>R123_ULONG_LONG - which expands to a declaration of the longest available
+ unsigned integer.
+
+<li>R123_64BIT(x) - expands to something equivalent to
+ UINT64_C(x) from <stdint.h>, even in environments where <stdint.h>
+ is not available, e.g., MSVC and OpenCL.
+
+<li>R123_BUILTIN_EXPECT(expr,likely_value) - expands to something with
+ the semantics of gcc's __builtin_expect(expr,likely_value). If
+ the environment has nothing like __builtin_expect, it should expand
+ to just expr.
+</ul>
+
+
+\cond HIDDEN_FROM_DOXYGEN
+*/
+
+/*
+N.B. When something is added to the list of features, it should be
+added to each of the *features.h files, AND to examples/ut_features.cpp.
+*/
+
+/* N.B. most other compilers (icc, nvcc, open64, llvm) will also define __GNUC__, so order matters. */
+#if defined(__METAL_MACOS__)
+#include "metalfeatures.h"
+#elif defined(__OPENCL_VERSION__) && __OPENCL_VERSION__ > 0
+#include "openclfeatures.h"
+#elif defined(__CUDACC__)
+#include "nvccfeatures.h"
+#elif defined(__ICC)
+#include "iccfeatures.h"
+#elif defined(__xlC__) || defined(__ibmxl__)
+#include "xlcfeatures.h"
+#elif defined(__SUNPRO_C) || defined(__SUNPRO_CC)
+#include "sunprofeatures.h"
+#elif defined(__OPEN64__)
+#include "open64features.h"
+#elif defined(__clang__)
+#include "clangfeatures.h"
+#elif defined(__GNUC__)
+#include "gccfeatures.h"
+#elif defined(__PGI)
+#include "pgccfeatures.h"
+#elif defined(_MSC_FULL_VER)
+#include "msvcfeatures.h"
+#else
+#error "Can't identify compiler. You'll need to add a new xxfeatures.hpp"
+{ /* maybe an unbalanced brace will terminate the compilation */
+#endif
+
+#ifndef R123_USE_CXX11
+#define R123_USE_CXX11 (__cplusplus >= 201103L)
+#endif
+
+#ifndef R123_USE_CXX11_UNRESTRICTED_UNIONS
+#define R123_USE_CXX11_UNRESTRICTED_UNIONS R123_USE_CXX11
+#endif
+
+#ifndef R123_USE_CXX11_STATIC_ASSERT
+#define R123_USE_CXX11_STATIC_ASSERT R123_USE_CXX11
+#endif
+
+#ifndef R123_USE_CXX11_CONSTEXPR
+#define R123_USE_CXX11_CONSTEXPR R123_USE_CXX11
+#endif
+
+#ifndef R123_USE_CXX11_EXPLICIT_CONVERSIONS
+#define R123_USE_CXX11_EXPLICIT_CONVERSIONS R123_USE_CXX11
+#endif
+
+#ifndef R123_USE_CXX11_RANDOM
+#define R123_USE_CXX11_RANDOM R123_USE_CXX11
+#endif
+
+#ifndef R123_USE_CXX11_TYPE_TRAITS
+#define R123_USE_CXX11_TYPE_TRAITS R123_USE_CXX11
+#endif
+
+#ifndef R123_USE_CXX11_LONG_LONG
+#define R123_USE_CXX11_LONG_LONG R123_USE_CXX11
+#endif
+
+#ifndef R123_USE_CXX11_STD_ARRAY
+#define R123_USE_CXX11_STD_ARRAY R123_USE_CXX11
+#endif
+
+#ifndef R123_USE_MULHILO64_C99
+#define R123_USE_MULHILO64_C99 0
+#endif
+
+#ifndef R123_USE_MULHILO64_MULHI_INTRIN
+#define R123_USE_MULHILO64_MULHI_INTRIN 0
+#endif
+
+#ifndef R123_USE_MULHILO32_MULHI_INTRIN
+#define R123_USE_MULHILO32_MULHI_INTRIN 0
+#endif
+
+#ifndef R123_STATIC_ASSERT
+#if R123_USE_CXX11_STATIC_ASSERT
+#define R123_STATIC_ASSERT(expr, msg) static_assert(expr, msg)
+#else
+ /* if msg always_looked_like_this, we could paste it into the name. Worth it? */
+#define R123_STATIC_ASSERT(expr, msg) typedef char static_assertion[(!!(expr))*2-1]
+#endif
+#endif
+
+#ifndef R123_CONSTEXPR
+#if R123_USE_CXX11_CONSTEXPR
+#define R123_CONSTEXPR constexpr
+#else
+#define R123_CONSTEXPR
+#endif
+#endif
+
+#ifndef R123_USE_64BIT
+#define R123_USE_64BIT 1
+#endif
+
+#ifndef R123_USE_PHILOX_64BIT
+#define R123_USE_PHILOX_64BIT (R123_USE_64BIT && (R123_USE_MULHILO64_ASM || R123_USE_MULHILO64_MSVC_INTRIN || R123_USE_MULHILO64_CUDA_INTRIN || R123_USE_GNU_UINT128 || R123_USE_MULHILO64_C99 || R123_USE_MULHILO64_OPENCL_INTRIN || R123_USE_MULHILO64_MULHI_INTRIN))
+#endif
+
+#ifndef R123_ULONG_LONG
+#if defined(__cplusplus) && !R123_USE_CXX11_LONG_LONG
+/* C++98 doesn't have long long. It doesn't have uint64_t either, but
+ we will have typedef'ed uint64_t to something in the xxxfeatures.h.
+ With luck, it won't elicit complaints from -pedantic. Cross your
+ fingers... */
+#define R123_ULONG_LONG uint64_t
+#else
+#define R123_ULONG_LONG unsigned long long
+#endif
+#endif
+
+/* UINT64_C should have been #defined by XXXfeatures.h, either by
+ #include <stdint.h> or through compiler-dependent hacks */
+#ifndef R123_64BIT
+#define R123_64BIT(x) UINT64_C(x)
+#endif
+
+#ifndef R123_THROW
+#define R123_THROW(x) throw (x)
+#endif
+
+#ifndef R123_METAL_THREAD_ADDRESS_SPACE
+#define R123_METAL_THREAD_ADDRESS_SPACE
+#endif
+
+#ifndef R123_METAL_CONSTANT_ADDRESS_SPACE
+#define R123_METAL_CONSTANT_ADDRESS_SPACE
+#endif
+
+/*
+ * Windows.h (and perhaps other "well-meaning" code define min and
+ * max, so there's a high chance that our definition of min, max
+ * methods or use of std::numeric_limits min and max will cause
+ * complaints in any program that happened to include Windows.h or
+ * suchlike first. We use the null macro below in our own header
+ * files definition or use of min, max to defensively preclude
+ * this problem. It may not be enough; one might need to #define
+ * NOMINMAX before including Windows.h or compile with -DNOMINMAX.
+ */
+#define R123_NO_MACRO_SUBST
+
+/** \endcond */
diff --git a/include/Random123/features/gccfeatures.h b/include/Random123/features/gccfeatures.h
@@ -0,0 +1,285 @@
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+ notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions, and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+#ifndef __gccfeatures_dot_hpp
+#define __gccfeatures_dot_hpp
+
+#define R123_GNUC_VERSION (__GNUC__*10000 + __GNUC_MINOR__*100 + __GNUC_PATCHLEVEL__)
+
+#if !defined(__x86_64__) && !defined(__i386__) && !defined(__powerpc__) && !defined(__arm__) && !defined(__aarch64__) && !defined(__s390x__)
+# error "This code has only been tested on x86, powerpc and a few arm platforms."
+#include <including_a_nonexistent_file_will_stop_some_compilers_from_continuing_with_a_hopeless_task>
+{ /* maybe an unbalanced brace will terminate the compilation */
+ /* Feel free to try the Random123 library on other architectures by changing
+ the conditions that reach this error, but you should consider it a
+ porting exercise and expect to encounter bugs and deficiencies.
+ Please let the authors know of any successes (or failures). */
+#endif
+
+#if defined(__powerpc__) && !defined(__clang__)
+#include <ppu_intrinsics.h>
+#endif
+
+#ifndef R123_STATIC_INLINE
+#define R123_STATIC_INLINE static __inline__
+#endif
+
+#ifndef R123_FORCE_INLINE
+#if R123_GNUC_VERSION >= 40000
+#define R123_FORCE_INLINE(decl) decl __attribute__((always_inline))
+#else
+#define R123_FORCE_INLINE(decl) decl
+#endif
+#endif
+
+#ifndef R123_CUDA_DEVICE
+#define R123_CUDA_DEVICE
+#endif
+
+#ifndef R123_ASSERT
+#include <assert.h>
+#define R123_ASSERT(x) assert(x)
+#endif
+
+#ifndef R123_BUILTIN_EXPECT
+#define R123_BUILTIN_EXPECT(expr,likely) __builtin_expect(expr,likely)
+#endif
+
+/* According to the C++0x standard, we should be able to test the numeric
+ value of __cplusplus == 199701L for C++98, __cplusplus == 201103L for C++11
+ But gcc has had an open bug http://gcc.gnu.org/bugzilla/show_bug.cgi?id=1773
+ since early 2001, which was finally fixed in 4.7 (early 2012). For
+ earlier versions, the only way to detect whether --std=c++0x was requested
+ on the command line is to look at the __GCC_EXPERIMENTAL_CXX0X__ pp-symbol.
+*/
+#if defined(__GCC_EXPERIMENTAL_CXX0X__)
+#define GNU_CXX11 (__cplusplus>=201103L || (R123_GNUC_VERSION<40700 && 1/* defined(__GCC_EXPERIMENTAL_CXX0X__) */))
+#else
+#define GNU_CXX11 (__cplusplus>=201103L || (R123_GNUC_VERSION<40700 && 0/* defined(__GCC_EXPERIMENTAL_CXX0X__) */))
+#endif
+
+#ifndef R123_USE_CXX11_UNRESTRICTED_UNIONS
+#define R123_USE_CXX11_UNRESTRICTED_UNIONS ((R123_GNUC_VERSION >= 40600) && GNU_CXX11)
+#endif
+
+#ifndef R123_USE_CXX11_STATIC_ASSERT
+#define R123_USE_CXX11_STATIC_ASSERT ((R123_GNUC_VERSION >= 40300) && GNU_CXX11)
+#endif
+
+#ifndef R123_USE_CXX11_CONSTEXPR
+#define R123_USE_CXX11_CONSTEXPR ((R123_GNUC_VERSION >= 40600) && GNU_CXX11)
+#endif
+
+#ifndef R123_USE_CXX11_EXPLICIT_CONVERSIONS
+#define R123_USE_CXX11_EXPLICIT_CONVERSIONS ((R123_GNUC_VERSION >= 40500) && GNU_CXX11)
+#endif
+
+#ifndef R123_USE_CXX11_RANDOM
+#define R123_USE_CXX11_RANDOM ((R123_GNUC_VERSION>=40500) && GNU_CXX11)
+#endif
+
+#ifndef R123_USE_CXX11_TYPE_TRAITS
+#define R123_USE_CXX11_TYPE_TRAITS ((R123_GNUC_VERSION>=40400) && GNU_CXX11)
+#endif
+
+#ifndef R123_USE_AES_NI
+#ifdef __AES__
+#define R123_USE_AES_NI 1
+#else
+#define R123_USE_AES_NI 0
+#endif
+#endif
+
+#ifndef R123_USE_SSE4_2
+#ifdef __SSE4_2__
+#define R123_USE_SSE4_2 1
+#else
+#define R123_USE_SSE4_2 0
+#endif
+#endif
+
+#ifndef R123_USE_SSE4_1
+#ifdef __SSE4_1__
+#define R123_USE_SSE4_1 1
+#else
+#define R123_USE_SSE4_1 0
+#endif
+#endif
+
+#ifndef R123_USE_SSE
+/* There's no point in trying to compile SSE code in Random123
+ unless SSE2 is available. */
+#ifdef __SSE2__
+#define R123_USE_SSE 1
+#else
+#define R123_USE_SSE 0
+#endif
+#endif
+
+#ifndef R123_USE_AES_OPENSSL
+/* There isn't really a good way to tell at compile time whether
+ openssl is available. Without a pre-compilation configure-like
+ tool, it's less error-prone to guess that it isn't available. Add
+ -DR123_USE_AES_OPENSSL=1 and any necessary LDFLAGS or LDLIBS to
+ play with openssl */
+#define R123_USE_AES_OPENSSL 0
+#endif
+
+#ifndef R123_USE_GNU_UINT128
+#if defined(__x86_64__) || defined(__aarch64__)
+#define R123_USE_GNU_UINT128 1
+#else
+#define R123_USE_GNU_UINT128 0
+#endif
+#endif
+
+#ifndef R123_USE_ASM_GNU
+#if (defined(__x86_64__)||defined(__i386__))
+#define R123_USE_ASM_GNU 1
+#else
+#define R123_USE_ASM_GNU 1
+#endif
+#endif
+
+#ifndef R123_USE_CPUID_MSVC
+#define R123_USE_CPUID_MSVC 0
+#endif
+
+#ifndef R123_USE_X86INTRIN_H
+#if (defined(__x86_64__)||defined(__i386__))
+#define R123_USE_X86INTRIN_H (1/* (defined(__x86_64__)||defined(__i386__)) */ && R123_GNUC_VERSION >= 40402)
+#else
+#define R123_USE_X86INTRIN_H (0/* (defined(__x86_64__)||defined(__i386__)) */ && R123_GNUC_VERSION >= 40402)
+#endif
+#endif
+
+#ifndef R123_USE_IA32INTRIN_H
+#define R123_USE_IA32INTRIN_H 0
+#endif
+
+#ifndef R123_USE_XMMINTRIN_H
+#define R123_USE_XMMINTRIN_H 0
+#endif
+
+#ifndef R123_USE_EMMINTRIN_H
+/* gcc -m64 on Solaris 10 defines __SSE2__ but doesn't have
+ emmintrin.h in the include search path. This is
+ so broken that I refuse to try to work around it. If this
+ affects you, figure out where your emmintrin.h lives and
+ add an appropriate -I to your CPPFLAGS. Or add -DR123_USE_SSE=0. */
+#define R123_USE_EMMINTRIN_H (R123_USE_SSE && (R123_GNUC_VERSION < 40402))
+#endif
+
+#ifndef R123_USE_SMMINTRIN_H
+#define R123_USE_SMMINTRIN_H ((R123_USE_SSE4_1 || R123_USE_SSE4_2) && (R123_GNUC_VERSION < 40402))
+#endif
+
+#ifndef R123_USE_WMMINTRIN_H
+#define R123_USE_WMMINTRIN_H 0
+#endif
+
+#ifndef R123_USE_INTRIN_H
+#define R123_USE_INTRIN_H 0
+#endif
+
+#ifndef R123_USE_MULHILO32_ASM
+#define R123_USE_MULHILO32_ASM 0
+#endif
+
+#ifndef R123_USE_MULHILO64_MSVC_INTRIN
+#define R123_USE_MULHILO64_MSVC_INTRIN 0
+#endif
+
+#ifndef R123_USE_MULHILO64_CUDA_INTRIN
+#define R123_USE_MULHILO64_CUDA_INTRIN 0
+#endif
+
+#ifndef R123_USE_MULHILO64_OPENCL_INTRIN
+#define R123_USE_MULHILO64_OPENCL_INTRIN 0
+#endif
+
+#ifndef R123_USE_MULHILO64_MULHI_INTRIN
+#if (defined(__powerpc64__))
+#define R123_USE_MULHILO64_MULHI_INTRIN 1
+#else
+#define R123_USE_MULHILO64_MULHI_INTRIN 0
+#endif
+#endif
+
+#ifndef R123_USE_MULHILO64_ASM
+/* Shouldn't we use asm for mulhilo64 when the #ifdefs above haven't
+ chosen something else? Everything about the mulhilo64
+ implementation is so fragile and difficult to test that I'm
+ reluctant to make this change without a compelling reason, but this
+ seems preferable to just turning off USE_MULHILO64_ASM.
+
+#define R123_USE_MULHILO64_ASM (R123_USE_ASM_GNU && (!R123_USE_GNU_UINT128) && (!R123_USE_MULHILO64_CUDA_INTRIN) && (!R123_USE_MULHILO64_MULHI_INTRIN) && (!R123_USE_MULHILO64_OPENCL_INTRIN) && (!R123_USE_MULHILO64_MSVC_INTRIN))
+*/
+#define R123_USE_MULHILO64_ASM 0
+#endif
+
+#if defined(__powerpc__) && defined(__clang__)
+#ifdef __powerpc64__
+static inline unsigned long long __mulhdu(unsigned long long a, unsigned long long b) {
+ __uint128_t c = (__uint128_t) a * (__uint128_t) b;
+ return c >> 64;
+}
+#endif
+
+static inline unsigned int __mulhwu(unsigned int a, unsigned int b) {
+ unsigned long long c = (unsigned long long) a * (unsigned long long) b;
+ return c >> 32;
+}
+#endif
+
+#ifndef R123_MULHILO64_MULHI_INTRIN
+#define R123_MULHILO64_MULHI_INTRIN __mulhdu
+#endif
+
+#ifndef R123_USE_MULHILO32_MULHI_INTRIN
+#define R123_USE_MULHILO32_MULHI_INTRIN 0
+#endif
+
+#ifndef R123_MULHILO32_MULHI_INTRIN
+#define R123_MULHILO32_MULHI_INTRIN __mulhwu
+#endif
+
+#ifndef __STDC_CONSTANT_MACROS
+#define __STDC_CONSTANT_MACROS
+#endif
+#include <stdint.h>
+#ifndef UINT64_C
+#error UINT64_C not defined. You must define __STDC_CONSTANT_MACROS before you #include <stdint.h>
+#endif
+
+/* If you add something, it must go in all the other XXfeatures.hpp
+ and in ../ut_features.cpp */
+#endif
diff --git a/include/Random123/features/iccfeatures.h b/include/Random123/features/iccfeatures.h
@@ -0,0 +1,212 @@
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+ notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions, and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+#ifndef __icpcfeatures_dot_hpp
+#define __icpcfeatures_dot_hpp
+
+// icc relies on gcc libraries and other toolchain components.
+#define R123_GNUC_VERSION (__GNUC__*10000 + __GNUC_MINOR__*100 + __GNUC_PATCHLEVEL__)
+
+#if !defined(__x86_64__) && !defined(__i386__)
+# error "This code has only been tested on x86 platforms."
+{ // maybe an unbalanced brace will terminate the compilation
+// You are invited to try Easy123 on other architectures, by changing
+// the conditions that reach this error, but you should consider it a
+// porting exercise and expect to encounter bugs and deficiencies.
+// Please let the authors know of any successes (or failures).
+#endif
+
+#ifndef R123_STATIC_INLINE
+#define R123_STATIC_INLINE static inline
+#endif
+
+#ifndef R123_FORCE_INLINE
+#define R123_FORCE_INLINE(decl) decl __attribute__((always_inline))
+#endif
+
+#ifndef R123_CUDA_DEVICE
+#define R123_CUDA_DEVICE
+#endif
+
+#ifndef R123_ASSERT
+#include <assert.h>
+#define R123_ASSERT(x) assert(x)
+#endif
+
+#ifndef R123_BUILTIN_EXPECT
+#define R123_BUILTIN_EXPECT(expr,likely) __builtin_expect(expr,likely)
+#endif
+
+// The basic idiom is:
+// #ifndef R123_SOMETHING
+// #if some condition
+// #define R123_SOMETHING 1
+// #else
+// #define R123_SOMETHING 0
+// #endif
+// #endif
+// This idiom allows an external user to override any decision
+// in this file with a command-line -DR123_SOMETHING=1 or -DR123_SOMETHINE=0
+
+// An alternative idiom is:
+// #ifndef R123_SOMETHING
+// #define R123_SOMETHING (some boolean expression)
+// #endif
+// where the boolean expression might contain previously-defined R123_SOMETHING_ELSE
+// pp-symbols.
+
+#ifndef R123_USE_SSE4_2
+#ifdef __SSE4_2__
+#define R123_USE_SSE4_2 1
+#else
+#define R123_USE_SSE4_2 0
+#endif
+#endif
+
+#ifndef R123_USE_SSE4_1
+#ifdef __SSE4_1__
+#define R123_USE_SSE4_1 1
+#else
+#define R123_USE_SSE4_1 0
+#endif
+#endif
+
+#ifndef R123_USE_SSE
+#ifdef __SSE2__
+#define R123_USE_SSE 1
+#else
+#define R123_USE_SSE 0
+#endif
+#endif
+
+#ifndef R123_USE_AES_NI
+// Unlike gcc, icc (version 12) does not pre-define an __AES__
+// pp-symbol when -maes or -xHost is on the command line. This feels
+// like a defect in icc (it defines __SSE4_2__ in analogous
+// circumstances), but until Intel fixes it, we're better off erring
+// on the side of caution and not generating instructions that are
+// going to raise SIGILL when executed. To get the AES-NI
+// instructions with icc, the caller must puts something like
+// -DR123_USE_AES_NI=1 or -D__AES__ on the command line. FWIW, the
+// AES-NI Whitepaper by Gueron says that icc has supported AES-NI from
+// 11.1 onwards.
+//
+#if defined(__AES__)
+#define R123_USE_AES_NI ((__ICC>=1101) && 1/*defined(__AES__)*/)
+#else
+#define R123_USE_AES_NI ((__ICC>=1101) && 0/*defined(__AES__)*/)
+#endif
+#endif
+
+#ifndef R123_USE_AES_OPENSSL
+/* There isn't really a good way to tell at compile time whether
+ openssl is available. Without a pre-compilation configure-like
+ tool, it's less error-prone to guess that it isn't available. Add
+ -DR123_USE_AES_OPENSSL=1 and any necessary LDFLAGS or LDLIBS to
+ play with openssl */
+#define R123_USE_AES_OPENSSL 0
+#endif
+
+#ifndef R123_USE_GNU_UINT128
+#define R123_USE_GNU_UINT128 0
+#endif
+
+#ifndef R123_USE_ASM_GNU
+#define R123_USE_ASM_GNU 1
+#endif
+
+#ifndef R123_USE_CPUID_MSVC
+#define R123_USE_CPUID_MSVC 0
+#endif
+
+#ifndef R123_USE_X86INTRIN_H
+#define R123_USE_X86INTRIN_H 0
+#endif
+
+#ifndef R123_USE_IA32INTRIN_H
+#define R123_USE_IA32INTRIN_H 1
+#endif
+
+#ifndef R123_USE_XMMINTRIN_H
+#define R123_USE_XMMINTRIN_H 0
+#endif
+
+#ifndef R123_USE_EMMINTRIN_H
+#define R123_USE_EMMINTRIN_H 1
+#endif
+
+#ifndef R123_USE_SMMINTRIN_H
+#define R123_USE_SMMINTRIN_H 1
+#endif
+
+#ifndef R123_USE_WMMINTRIN_H
+#define R123_USE_WMMINTRIN_H 1
+#endif
+
+#ifndef R123_USE_INTRIN_H
+#define R123_USE_INTRIN_H 0
+#endif
+
+#ifndef R123_USE_MULHILO16_ASM
+#define R123_USE_MULHILO16_ASM 0
+#endif
+
+#ifndef R123_USE_MULHILO32_ASM
+#define R123_USE_MULHILO32_ASM 0
+#endif
+
+#ifndef R123_USE_MULHILO64_ASM
+#define R123_USE_MULHILO64_ASM 1
+#endif
+
+#ifndef R123_USE_MULHILO64_MSVC_INTRIN
+#define R123_USE_MULHILO64_MSVC_INTRIN 0
+#endif
+
+#ifndef R123_USE_MULHILO64_CUDA_INTRIN
+#define R123_USE_MULHILO64_CUDA_INTRIN 0
+#endif
+
+#ifndef R123_USE_MULHILO64_OPENCL_INTRIN
+#define R123_USE_MULHILO64_OPENCL_INTRIN 0
+#endif
+
+#ifndef __STDC_CONSTANT_MACROS
+#define __STDC_CONSTANT_MACROS
+#endif
+#include <stdint.h>
+#ifndef UINT64_C
+#error UINT64_C not defined. You must define __STDC_CONSTANT_MACROS before you #include <stdint.h>
+#endif
+
+// If you add something, it must go in all the other XXfeatures.hpp
+// and in ../ut_features.cpp
+#endif
diff --git a/include/Random123/features/metalfeatures.h b/include/Random123/features/metalfeatures.h
@@ -0,0 +1,111 @@
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+ notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions, and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/*
+ * Written by Tom Schoonjans <Tom.Schoonjans@me.com>
+ */
+
+#ifndef __metalfeatures_dot_hpp
+#define __metalfeatures_dot_hpp
+
+#ifndef R123_STATIC_INLINE
+#define R123_STATIC_INLINE inline
+#endif
+
+#ifndef R123_FORCE_INLINE
+#define R123_FORCE_INLINE(decl) decl __attribute__((always_inline))
+#endif
+
+#ifndef R123_CUDA_DEVICE
+#define R123_CUDA_DEVICE
+#endif
+
+#ifndef R123_METAL_THREAD_ADDRESS_SPACE
+#define R123_METAL_THREAD_ADDRESS_SPACE thread
+#endif
+
+#ifndef R123_METAL_CONSTANT_ADDRESS_SPACE
+#define R123_METAL_CONSTANT_ADDRESS_SPACE constant
+#endif
+
+#ifndef R123_ASSERT
+#define R123_ASSERT(x)
+#endif
+
+#ifndef R123_BUILTIN_EXPECT
+#define R123_BUILTIN_EXPECT(expr,likely) expr
+#endif
+
+#ifndef R123_USE_GNU_UINT128
+#define R123_USE_GNU_UINT128 0
+#endif
+
+#ifndef R123_USE_MULHILO64_ASM
+#define R123_USE_MULHILO64_ASM 0
+#endif
+
+#ifndef R123_USE_MULHILO64_MSVC_INTRIN
+#define R123_USE_MULHILO64_MSVC_INTRIN 0
+#endif
+
+#ifndef R123_USE_MULHILO64_CUDA_INTRIN
+#define R123_USE_MULHILO64_CUDA_INTRIN 0
+#endif
+
+#ifndef R123_USE_MULHILO64_OPENCL_INTRIN
+#define R123_USE_MULHILO64_OPENCL_INTRIN 0
+#endif
+
+#ifndef R123_USE_MULHILO32_MULHI_INTRIN
+#define R123_USE_MULHILO32_MULHI_INTRIN 1
+#endif
+
+#if R123_USE_MULHILO32_MULHI_INTRIN
+#include <metal_integer>
+#define R123_MULHILO32_MULHI_INTRIN metal::mulhi
+#endif
+
+#ifndef R123_USE_AES_NI
+#define R123_USE_AES_NI 0
+#endif
+
+#ifndef R123_USE_64BIT
+#define R123_USE_64BIT 0 /* Metal currently (Feb 2019, Specification-2) does not support 64-bit variable types */
+#endif
+
+#ifndef R123_ULONG_LONG
+/* the longest integer type in Metal (Feb 2019, Specification-2) is a
+ * 32-bit unsigned int. Let's hope for the best... */
+#define R123_ULONG_LONG unsigned int
+#endif
+
+#endif
diff --git a/include/Random123/features/msvcfeatures.h b/include/Random123/features/msvcfeatures.h
@@ -0,0 +1,200 @@
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+ notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions, and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+#ifndef __msvcfeatures_dot_hpp
+#define __msvcfeatures_dot_hpp
+
+//#if _MSVC_FULL_VER <= 15
+//#error "We've only tested MSVC_FULL_VER==15."
+//#endif
+
+#if !defined(_M_IX86) && !defined(_M_X64)
+# error "This code has only been tested on x86 platforms."
+{ // maybe an unbalanced brace will terminate the compilation
+// You are invited to try Random123 on other architectures, by changing
+// the conditions that reach this error, but you should consider it a
+// porting exercise and expect to encounter bugs and deficiencies.
+// Please let the authors know of any successes (or failures).
+#endif
+
+#ifndef R123_STATIC_INLINE
+#define R123_STATIC_INLINE static __inline
+#endif
+
+#ifndef R123_FORCE_INLINE
+#define R123_FORCE_INLINE(decl) _forceinline decl
+#endif
+
+#ifndef R123_CUDA_DEVICE
+#define R123_CUDA_DEVICE
+#endif
+
+#ifndef R123_ASSERT
+#include <assert.h>
+#define R123_ASSERT(x) assert(x)
+#endif
+
+#ifndef R123_BUILTIN_EXPECT
+#define R123_BUILTIN_EXPECT(expr,likely) expr
+#endif
+
+// The basic idiom is:
+// #ifndef R123_SOMETHING
+// #if some condition
+// #define R123_SOMETHING 1
+// #else
+// #define R123_SOMETHING 0
+// #endif
+// #endif
+// This idiom allows an external user to override any decision
+// in this file with a command-line -DR123_SOMETHING=1 or -DR123_SOMETHINE=0
+
+// An alternative idiom is:
+// #ifndef R123_SOMETHING
+// #define R123_SOMETHING (some boolean expression)
+// #endif
+// where the boolean expression might contain previously-defined R123_SOMETHING_ELSE
+// pp-symbols.
+
+#ifndef R123_USE_AES_NI
+#if defined(_M_X64)
+#define R123_USE_AES_NI 1
+#else
+#define R123_USE_AES_NI 0
+#endif
+#endif
+
+#ifndef R123_USE_SSE4_2
+#if defined(_M_X64) || _MSC_VER > 1899
+#define R123_USE_SSE4_2 1
+#else
+#define R123_USE_SSE4_2 0
+#endif
+#endif
+
+#ifndef R123_USE_SSE4_1
+#if defined(_M_X64) || _MSC_VER > 1899
+#define R123_USE_SSE4_1 1
+#else
+#define R123_USE_SSE4_1 0
+#endif
+#endif
+
+#ifndef R123_USE_SSE
+#define R123_USE_SSE 1
+#endif
+
+#ifndef R123_USE_AES_OPENSSL
+#define R123_USE_AES_OPENSSL 0
+#endif
+
+#ifndef R123_USE_GNU_UINT128
+#define R123_USE_GNU_UINT128 0
+#endif
+
+#ifndef R123_USE_ASM_GNU
+#define R123_USE_ASM_GNU 0
+#endif
+
+#ifndef R123_USE_CPUID_MSVC
+#define R123_USE_CPUID_MSVC 1
+#endif
+
+#ifndef R123_USE_X86INTRIN_H
+#define R123_USE_X86INTRIN_H 0
+#endif
+
+#ifndef R123_USE_IA32INTRIN_H
+#define R123_USE_IA32INTRIN_H 0
+#endif
+
+#ifndef R123_USE_XMMINTRIN_H
+#define R123_USE_XMMINTRIN_H 0
+#endif
+
+#ifndef R123_USE_EMMINTRIN_H
+#define R123_USE_EMMINTRIN_H 1
+#endif
+
+#ifndef R123_USE_SMMINTRIN_H
+#define R123_USE_SMMINTRIN_H 1
+#endif
+
+#ifndef R123_USE_WMMINTRIN_H
+#define R123_USE_WMMINTRIN_H 1
+#endif
+
+#ifndef R123_USE_INTRIN_H
+#define R123_USE_INTRIN_H 1
+#endif
+
+#ifndef R123_USE_MULHILO16_ASM
+#define R123_USE_MULHILO16_ASM 0
+#endif
+
+#ifndef R123_USE_MULHILO32_ASM
+#define R123_USE_MULHILO32_ASM 0
+#endif
+
+#ifndef R123_USE_MULHILO64_ASM
+#define R123_USE_MULHILO64_ASM 0
+#endif
+
+#ifndef R123_USE_MULHILO64_MSVC_INTRIN
+#if defined(_M_X64)
+#define R123_USE_MULHILO64_MSVC_INTRIN 1
+#else
+#define R123_USE_MULHILO64_MSVC_INTRIN 0
+#endif
+#endif
+
+#ifndef R123_USE_MULHILO64_CUDA_INTRIN
+#define R123_USE_MULHILO64_CUDA_INTRIN 0
+#endif
+
+#ifndef R123_USE_MULHILO64_OPENCL_INTRIN
+#define R123_USE_MULHILO64_OPENCL_INTRIN 0
+#endif
+
+#ifndef __STDC_CONSTANT_MACROS
+#define __STDC_CONSTANT_MACROS
+#endif
+#include <stdint.h>
+#ifndef UINT64_C
+#error UINT64_C not defined. You must define __STDC_CONSTANT_MACROS before you #include <stdint.h>
+#endif
+
+#pragma warning(disable:4244)
+#pragma warning(disable:4996)
+
+// If you add something, it must go in all the other XXfeatures.hpp
+// and in ../ut_features.cpp
+#endif
diff --git a/include/Random123/features/nvccfeatures.h b/include/Random123/features/nvccfeatures.h
@@ -0,0 +1,129 @@
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+ notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions, and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+#ifndef __r123_nvcc_features_dot_h__
+#define __r123_nvcc_features_dot_h__
+
+#if !defined(CUDART_VERSION)
+#error "why are we in nvccfeatures.h if CUDART_VERSION is not defined"
+#endif
+
+#if CUDART_VERSION < 4010
+#error "CUDA versions earlier than 4.1 produce incorrect results for some templated functions in namespaces. Random123 isunsupported. See comments in nvccfeatures.h"
+// This test was added in Random123-1.08 (August, 2013) because we
+// discovered that Ftype(maxTvalue<T>()) with Ftype=double and
+// T=uint64_t in examples/uniform.hpp produces -1 for CUDA4.0 and
+// earlier. We can't be sure this bug doesn't also affect invocations
+// of other templated functions, e.g., essentially all of Random123.
+// Thus, we no longer trust CUDA versions earlier than 4.1 even though
+// we had previously tested and timed Random123 with CUDA 3.x and 4.0.
+// If you feel lucky or desperate, you can change #error to #warning, but
+// please take extra care to be sure that you are getting correct
+// results.
+#endif
+
+// nvcc falls through to gcc or msvc. So first define
+// a couple of things and then include either gccfeatures.h
+// or msvcfeatures.h
+
+//#ifdef __CUDA_ARCH__ allows Philox32 and Philox64 to be compiled
+//for both device and host functions in CUDA by setting compiler flags
+//for the device function
+#ifdef __CUDA_ARCH__
+#ifndef R123_CUDA_DEVICE
+#define R123_CUDA_DEVICE __device__
+#endif
+
+#ifndef R123_USE_MULHILO64_CUDA_INTRIN
+#define R123_USE_MULHILO64_CUDA_INTRIN 1
+#endif
+
+#ifndef R123_THROW
+// No exceptions in CUDA, at least upto 4.0
+#define R123_THROW(x) R123_ASSERT(0)
+#endif
+
+#ifndef R123_ASSERT
+#define R123_ASSERT(x) if((x)) ; else asm("trap;")
+#endif
+
+#ifndef R123_BUILTIN_EXPECT
+#define R123_BUILTIN_EXPECT(expr,likely) expr
+#endif
+
+#ifndef R123_USE_AES_NI
+#define R123_USE_AES_NI 0
+#endif
+
+#ifndef R123_USE_SSE4_2
+#define R123_USE_SSE4_2 0
+#endif
+
+#ifndef R123_USE_SSE4_1
+#define R123_USE_SSE4_1 0
+#endif
+
+#ifndef R123_USE_SSE
+#define R123_USE_SSE 0
+#endif
+
+#ifndef R123_USE_GNU_UINT128
+#define R123_USE_GNU_UINT128 0
+#endif
+
+#ifndef R123_ULONG_LONG
+// uint64_t, which is what we'd get without this, is
+// not the same as unsigned long long
+#define R123_ULONG_LONG unsigned long long
+#endif
+
+#else // ! __CUDA_ARCH__
+
+// If we're using nvcc, but not compiling for the CUDA architecture,
+// then we must be compiling for the host. But host-compilation might
+// use gcc, msvc, or xlc. This #else/#endif used to be higher up,
+// mistakenly turning off all kinds of things the host that are really
+// problematic only in device code. It's not clear that we need to do
+// anything special for host-code that we wouldn't otherwise do in
+// xlcfeatures, gccfeatures or msvcfeatures. But if we do, this is
+// the place to do it.
+
+#endif // __CUDA_ARCH__
+
+#if defined(__xlC__) || defined(__ibmxl__)
+#include "xlcfeatures.h"
+#elif defined(__GNUC__)
+#include "gccfeatures.h"
+#elif defined(_MSC_FULL_VER)
+#include "msvcfeatures.h"
+#endif
+
+#endif
diff --git a/include/Random123/features/open64features.h b/include/Random123/features/open64features.h
@@ -0,0 +1,50 @@
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+ notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions, and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+#ifndef __open64features_dot_hpp
+#define __open64features_dot_hpp
+
+/* The gcc features are mostly right. We just override a few and then include gccfeatures.h */
+
+/* Open64 4.2.3 and 4.2.4 accept the __uint128_t code without complaint
+ but produce incorrect code for 64-bit philox. The MULHILO64_ASM
+ seems to work fine */
+#ifndef R123_USE_GNU_UINT128
+#define R123_USE_GNU_UINT128 0
+#endif
+
+#ifndef R123_USE_MULHILO64_ASM
+#define R123_USE_MULHILO64_ASM 1
+#endif
+
+#include "gccfeatures.h"
+
+#endif
diff --git a/include/Random123/features/openclfeatures.h b/include/Random123/features/openclfeatures.h
@@ -0,0 +1,89 @@
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+ notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions, and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+#ifndef __openclfeatures_dot_hpp
+#define __openclfeatures_dot_hpp
+
+#ifndef R123_STATIC_INLINE
+#define R123_STATIC_INLINE inline
+#endif
+
+#ifndef R123_FORCE_INLINE
+#define R123_FORCE_INLINE(decl) decl __attribute__((always_inline))
+#endif
+
+#ifndef R123_CUDA_DEVICE
+#define R123_CUDA_DEVICE
+#endif
+
+#ifndef R123_ASSERT
+#define R123_ASSERT(x)
+#endif
+
+#ifndef R123_BUILTIN_EXPECT
+#define R123_BUILTIN_EXPECT(expr,likely) expr
+#endif
+
+#ifndef R123_USE_GNU_UINT128
+#define R123_USE_GNU_UINT128 0
+#endif
+
+#ifndef R123_USE_MULHILO64_ASM
+#define R123_USE_MULHILO64_ASM 0
+#endif
+
+#ifndef R123_USE_MULHILO64_MSVC_INTRIN
+#define R123_USE_MULHILO64_MSVC_INTRIN 0
+#endif
+
+#ifndef R123_USE_MULHILO64_CUDA_INTRIN
+#define R123_USE_MULHILO64_CUDA_INTRIN 0
+#endif
+
+#ifndef R123_USE_MULHILO64_OPENCL_INTRIN
+#define R123_USE_MULHILO64_OPENCL_INTRIN 1
+#endif
+
+#ifndef R123_USE_AES_NI
+#define R123_USE_AES_NI 0
+#endif
+
+// XXX ATI APP SDK 2.4 clBuildProgram SEGVs if one uses uint64_t instead of
+// ulong to mul_hi. And gets lots of complaints from stdint.h
+// on some machines.
+// But these typedefs mean we cannot include stdint.h with
+// these headers? Do we need R123_64T, R123_32T, R123_8T?
+typedef ulong uint64_t;
+typedef uint uint32_t;
+typedef uchar uint8_t;
+#define UINT64_C(x) ((ulong)(x##UL))
+
+#endif
diff --git a/include/Random123/features/pgccfeatures.h b/include/Random123/features/pgccfeatures.h
@@ -0,0 +1,195 @@
+/* This derivative file contributed via email by Gabriel Rockefeller on 8/5/2013 */
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+ notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions, and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Copyright (c) 2013, Los Alamos National Security, LLC
+All rights reserved.
+
+Copyright 2013. Los Alamos National Security, LLC. This software was produced
+under U.S. Government contract DE-AC52-06NA25396 for Los Alamos National
+Laboratory (LANL), which is operated by Los Alamos National Security, LLC for
+the U.S. Department of Energy. The U.S. Government has rights to use,
+reproduce, and distribute this software. NEITHER THE GOVERNMENT NOR LOS
+ALAMOS NATIONAL SECURITY, LLC MAKES ANY WARRANTY, EXPRESS OR IMPLIED, OR
+ASSUMES ANY LIABILITY FOR THE USE OF THIS SOFTWARE. If software is modified
+to produce derivative works, such modified software should be clearly marked,
+so as not to confuse it with the version available from LANL.
+*/
+#ifndef __pgccfeatures_dot_hpp
+#define __pgccfeatures_dot_hpp
+
+#if !defined(__x86_64__) && !defined(__i386__)
+# error "This code has only been tested on x86 platforms."
+#include <including_a_nonexistent_file_will_stop_some_compilers_from_continuing_with_a_hopeless_task>
+{ /* maybe an unbalanced brace will terminate the compilation */
+ /* Feel free to try the Random123 library on other architectures by changing
+ the conditions that reach this error, but you should consider it a
+ porting exercise and expect to encounter bugs and deficiencies.
+ Please let the authors know of any successes (or failures). */
+#endif
+
+#ifndef R123_STATIC_INLINE
+#define R123_STATIC_INLINE static inline
+#endif
+
+/* Found this example in PGI's emmintrin.h. */
+#ifndef R123_FORCE_INLINE
+#define R123_FORCE_INLINE(decl) decl __attribute__((__always_inline__))
+#endif
+
+#ifndef R123_CUDA_DEVICE
+#define R123_CUDA_DEVICE
+#endif
+
+#ifndef R123_ASSERT
+#include <assert.h>
+#define R123_ASSERT(x) assert(x)
+#endif
+
+#ifndef R123_BUILTIN_EXPECT
+#define R123_BUILTIN_EXPECT(expr,likely) (expr)
+#endif
+
+/* PGI through 13.2 doesn't appear to support AES-NI. */
+#ifndef R123_USE_AES_NI
+#define R123_USE_AES_NI 0
+#endif
+
+/* PGI through 13.2 appears to support MMX, SSE, SSE3, SSE3, SSSE3, SSE4a, and
+ ABM, but not SSE4.1 or SSE4.2. */
+#ifndef R123_USE_SSE4_2
+#define R123_USE_SSE4_2 0
+#endif
+
+#ifndef R123_USE_SSE4_1
+#define R123_USE_SSE4_1 0
+#endif
+
+#ifndef R123_USE_SSE
+/* There's no point in trying to compile SSE code in Random123
+ unless SSE2 is available. */
+#ifdef __SSE2__
+#define R123_USE_SSE 1
+#else
+#define R123_USE_SSE 0
+#endif
+#endif
+
+#ifndef R123_USE_AES_OPENSSL
+/* There isn't really a good way to tell at compile time whether
+ openssl is available. Without a pre-compilation configure-like
+ tool, it's less error-prone to guess that it isn't available. Add
+ -DR123_USE_AES_OPENSSL=1 and any necessary LDFLAGS or LDLIBS to
+ play with openssl */
+#define R123_USE_AES_OPENSSL 0
+#endif
+
+#ifndef R123_USE_GNU_UINT128
+#define R123_USE_GNU_UINT128 0
+#endif
+
+#ifndef R123_USE_ASM_GNU
+#define R123_USE_ASM_GNU 1
+#endif
+
+#ifndef R123_USE_CPUID_MSVC
+#define R123_USE_CPUID_MSVC 0
+#endif
+
+#ifndef R123_USE_X86INTRIN_H
+#define R123_USE_X86INTRIN_H 0
+#endif
+
+#ifndef R123_USE_IA32INTRIN_H
+#define R123_USE_IA32INTRIN_H 0
+#endif
+
+/* emmintrin.h from PGI #includes xmmintrin.h but then complains at link time
+ about undefined references to _mm_castsi128_ps(__m128i). Why? */
+#ifndef R123_USE_XMMINTRIN_H
+#define R123_USE_XMMINTRIN_H 1
+#endif
+
+#ifndef R123_USE_EMMINTRIN_H
+#define R123_USE_EMMINTRIN_H 1
+#endif
+
+#ifndef R123_USE_SMMINTRIN_H
+#define R123_USE_SMMINTRIN_H 0
+#endif
+
+#ifndef R123_USE_WMMINTRIN_H
+#define R123_USE_WMMINTRIN_H 0
+#endif
+
+#ifndef R123_USE_INTRIN_H
+#ifdef __ABM__
+#define R123_USE_INTRIN_H 1
+#else
+#define R123_USE_INTRIN_H 0
+#endif
+#endif
+
+#ifndef R123_USE_MULHILO32_ASM
+#define R123_USE_MULHILO32_ASM 0
+#endif
+
+#ifndef R123_USE_MULHILO64_MULHI_INTRIN
+#define R123_USE_MULHILO64_MULHI_INTRIN 0
+#endif
+
+#ifndef R123_USE_MULHILO64_ASM
+#define R123_USE_MULHILO64_ASM 1
+#endif
+
+#ifndef R123_USE_MULHILO64_MSVC_INTRIN
+#define R123_USE_MULHILO64_MSVC_INTRIN 0
+#endif
+
+#ifndef R123_USE_MULHILO64_CUDA_INTRIN
+#define R123_USE_MULHILO64_CUDA_INTRIN 0
+#endif
+
+#ifndef R123_USE_MULHILO64_OPENCL_INTRIN
+#define R123_USE_MULHILO64_OPENCL_INTRIN 0
+#endif
+
+#ifndef __STDC_CONSTANT_MACROS
+#define __STDC_CONSTANT_MACROS
+#endif
+#include <stdint.h>
+#ifndef UINT64_C
+#error UINT64_C not defined. You must define __STDC_CONSTANT_MACROS before you #include <stdint.h>
+#endif
+
+/* If you add something, it must go in all the other XXfeatures.hpp
+ and in ../ut_features.cpp */
+#endif
diff --git a/include/Random123/features/sse.h b/include/Random123/features/sse.h
@@ -0,0 +1,280 @@
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+ notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions, and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+#ifndef _Random123_sse_dot_h__
+#define _Random123_sse_dot_h__
+
+#if R123_USE_SSE
+
+#if R123_USE_X86INTRIN_H
+#include <x86intrin.h>
+#endif
+#if R123_USE_IA32INTRIN_H
+#include <ia32intrin.h>
+#endif
+#if R123_USE_XMMINTRIN_H
+#include <xmmintrin.h>
+#endif
+#if R123_USE_EMMINTRIN_H
+#include <emmintrin.h>
+#endif
+#if R123_USE_SMMINTRIN_H
+#include <smmintrin.h>
+#endif
+#if R123_USE_WMMINTRIN_H
+#include <wmmintrin.h>
+#endif
+#if R123_USE_INTRIN_H
+#include <intrin.h>
+#endif
+#ifdef __cplusplus
+#include <iostream>
+#include <limits>
+#include <stdexcept>
+#endif
+
+#if R123_USE_ASM_GNU
+
+/* bit25 of CX tells us whether AES is enabled. */
+R123_STATIC_INLINE int haveAESNI(){
+ unsigned int eax, ebx, ecx, edx;
+ __asm__ __volatile__ ("cpuid": "=a" (eax), "=b" (ebx), "=c" (ecx), "=d" (edx) :
+ "a" (1));
+ return (ecx>>25) & 1;
+}
+#elif R123_USE_CPUID_MSVC
+R123_STATIC_INLINE int haveAESNI(){
+ int CPUInfo[4];
+ __cpuid(CPUInfo, 1);
+ return (CPUInfo[2]>>25)&1;
+}
+#else /* R123_USE_CPUID_??? */
+#warning "No R123_USE_CPUID_XXX method chosen. haveAESNI will always return false"
+R123_STATIC_INLINE int haveAESNI(){
+ return 0;
+}
+#endif /* R123_USE_ASM_GNU || R123_USE_CPUID_MSVC */
+
+// There is a lot of annoying and inexplicable variation in the
+// SSE intrinsics available in different compilation environments.
+// The details seem to depend on the compiler, the version and
+// the target architecture. Rather than insisting on
+// R123_USE_feature tests for each of these in each of the
+// compilerfeatures.h files we just keep the complexity localized
+// to here...
+#if (defined(__ICC) && __ICC<1210) || (defined(_MSC_VER) && !defined(_WIN64) && _MSC_VER < 1900)
+/* Is there an intrinsic to assemble an __m128i from two 64-bit words?
+ If not, use the 4x32-bit intrisic instead. N.B. It looks like Intel
+ added _mm_set_epi64x to icc version 12.1 in Jan 2012.
+*/
+R123_STATIC_INLINE __m128i _mm_set_epi64x(uint64_t v1, uint64_t v0){
+ union{
+ uint64_t u64;
+ uint32_t u32[2];
+ } u1, u0;
+ u1.u64 = v1;
+ u0.u64 = v0;
+ return _mm_set_epi32(u1.u32[1], u1.u32[0], u0.u32[1], u0.u32[0]);
+}
+#endif
+/* _mm_extract_lo64 abstracts the task of extracting the low 64-bit
+ word from an __m128i. The _mm_cvtsi128_si64 intrinsic does the job
+ on 64-bit platforms. Unfortunately, both MSVC and Open64 fail
+ assertions in ut_M128.cpp and ut_carray.cpp when we use the
+ _mm_cvtsi128_si64 intrinsic. (See
+ https://bugs.open64.net/show_bug.cgi?id=873 for the Open64 bug).
+ On 32-bit platforms, there's no MOVQ, so there's no intrinsic.
+ Finally, even if the intrinsic exists, it may be spelled with or
+ without the 'x'.
+*/
+#if !defined(__x86_64__) || defined(_MSC_VER) || defined(__OPEN64__)
+R123_STATIC_INLINE uint64_t _mm_extract_lo64(__m128i si){
+ union{
+ uint64_t u64[2];
+ __m128i m;
+ }u;
+ _mm_store_si128(&u.m, si);
+ return u.u64[0];
+}
+#elif defined(__llvm__) || defined(__ICC)
+R123_STATIC_INLINE uint64_t _mm_extract_lo64(__m128i si){
+ return (uint64_t)_mm_cvtsi128_si64(si);
+}
+#else /* GNUC, others */
+/* FWIW, gcc's emmintrin.h has had the 'x' spelling
+ since at least gcc-3.4.4. The no-'x' spelling showed up
+ around 4.2. */
+R123_STATIC_INLINE uint64_t _mm_extract_lo64(__m128i si){
+ return (uint64_t)_mm_cvtsi128_si64x(si);
+}
+#endif
+#if defined(__GNUC__) && __GNUC__ < 4
+/* the cast builtins showed up in gcc4. */
+R123_STATIC_INLINE __m128 _mm_castsi128_ps(__m128i si){
+ return (__m128)si;
+}
+#endif
+
+#ifdef __cplusplus
+
+struct r123m128i{
+ __m128i m;
+#if R123_USE_CXX11_UNRESTRICTED_UNIONS
+ // C++98 forbids a union member from having *any* constructors.
+ // C++11 relaxes this, and allows union members to have constructors
+ // as long as there is a "trivial" default construtor. So in C++11
+ // we can provide a r123m128i constructor with an __m128i argument, and still
+ // have the default (and hence trivial) default constructor.
+ r123m128i() = default;
+ r123m128i(__m128i _m): m(_m){}
+#endif
+ r123m128i& operator=(const __m128i& rhs){ m=rhs; return *this;}
+ r123m128i& operator=(R123_ULONG_LONG n){ m = _mm_set_epi64x(0, n); return *this;}
+#if R123_USE_CXX11_EXPLICIT_CONVERSIONS
+ // With C++11 we can attach explicit to the bool conversion operator
+ // to disambiguate undesired promotions. For g++, this works
+ // only in 4.5 and above.
+ explicit operator bool() const {return _bool();}
+#else
+ // Pre-C++11, we have to do something else. Google for the "safe bool"
+ // idiom for other ideas...
+ operator const void*() const{return _bool()?this:0;}
+#endif
+ operator __m128i() const {return m;}
+
+private:
+#if R123_USE_SSE4_1
+ bool _bool() const{ return !_mm_testz_si128(m,m); }
+#else
+ bool _bool() const{ return 0xf != _mm_movemask_ps(_mm_castsi128_ps(_mm_cmpeq_epi32(m, _mm_setzero_si128()))); }
+#endif
+};
+
+R123_STATIC_INLINE r123m128i& operator++(r123m128i& v){
+ __m128i& c = v.m;
+ __m128i zeroone = _mm_set_epi64x(R123_64BIT(0), R123_64BIT(1));
+ c = _mm_add_epi64(c, zeroone);
+ //return c;
+#if R123_USE_SSE4_1
+ __m128i zerofff = _mm_set_epi64x(0, ~(R123_64BIT(0)));
+ if( R123_BUILTIN_EXPECT(_mm_testz_si128(c,zerofff), 0) ){
+ __m128i onezero = _mm_set_epi64x(R123_64BIT(1), R123_64BIT(0));
+ c = _mm_add_epi64(c, onezero);
+ }
+#else
+ unsigned mask = _mm_movemask_ps( _mm_castsi128_ps(_mm_cmpeq_epi32(c, _mm_setzero_si128())));
+ // The low two bits of mask are 11 iff the low 64 bits of
+ // c are zero.
+ if( R123_BUILTIN_EXPECT((mask&0x3) == 0x3, 0) ){
+ __m128i onezero = _mm_set_epi64x(1,0);
+ c = _mm_add_epi64(c, onezero);
+ }
+#endif
+ return v;
+}
+
+R123_STATIC_INLINE r123m128i& operator+=(r123m128i& lhs, R123_ULONG_LONG n){
+ __m128i c = lhs.m;
+ __m128i incr128 = _mm_set_epi64x(0, n);
+ c = _mm_add_epi64(c, incr128);
+ // return c; // NO CARRY!
+
+ int64_t lo64 = _mm_extract_lo64(c);
+ if((uint64_t)lo64 < n)
+ c = _mm_add_epi64(c, _mm_set_epi64x(R123_64BIT(1),R123_64BIT(0)));
+ lhs.m = c;
+ return lhs;
+}
+
+// We need this one because it's present, but never used in r123array1xm128i::incr
+R123_STATIC_INLINE bool operator<=(R123_ULONG_LONG, const r123m128i &){
+ throw std::runtime_error("operator<=(unsigned long long, r123m128i) is unimplemented.");}
+
+// The comparisons aren't implemented, but if we leave them out, and
+// somebody writes, e.g., M1 < M2, the compiler will do an implicit
+// conversion through void*. Sigh...
+R123_STATIC_INLINE bool operator<(const r123m128i&, const r123m128i&){
+ throw std::runtime_error("operator<(r123m128i, r123m128i) is unimplemented.");}
+R123_STATIC_INLINE bool operator<=(const r123m128i&, const r123m128i&){
+ throw std::runtime_error("operator<=(r123m128i, r123m128i) is unimplemented.");}
+R123_STATIC_INLINE bool operator>(const r123m128i&, const r123m128i&){
+ throw std::runtime_error("operator>(r123m128i, r123m128i) is unimplemented.");}
+R123_STATIC_INLINE bool operator>=(const r123m128i&, const r123m128i&){
+ throw std::runtime_error("operator>=(r123m128i, r123m128i) is unimplemented.");}
+
+R123_STATIC_INLINE bool operator==(const r123m128i &lhs, const r123m128i &rhs){
+ return 0xf==_mm_movemask_ps(_mm_castsi128_ps(_mm_cmpeq_epi32(lhs, rhs))); }
+R123_STATIC_INLINE bool operator!=(const r123m128i &lhs, const r123m128i &rhs){
+ return !(lhs==rhs);}
+R123_STATIC_INLINE bool operator==(R123_ULONG_LONG lhs, const r123m128i &rhs){
+ r123m128i LHS; LHS.m=_mm_set_epi64x(0, lhs); return LHS == rhs; }
+R123_STATIC_INLINE bool operator!=(R123_ULONG_LONG lhs, const r123m128i &rhs){
+ return !(lhs==rhs);}
+R123_STATIC_INLINE std::ostream& operator<<(std::ostream& os, const r123m128i& m){
+ union{
+ uint64_t u64[2];
+ __m128i m;
+ }u;
+ _mm_storeu_si128(&u.m, m.m);
+ return os << u.u64[0] << " " << u.u64[1];
+}
+
+R123_STATIC_INLINE std::istream& operator>>(std::istream& is, r123m128i& m){
+ uint64_t u64[2];
+ is >> u64[0] >> u64[1];
+ m.m = _mm_set_epi64x(u64[1], u64[0]);
+ return is;
+}
+
+template<typename T> inline T assemble_from_u32(uint32_t *p32); // forward declaration
+
+template <>
+inline r123m128i assemble_from_u32<r123m128i>(uint32_t *p32){
+ r123m128i ret;
+ ret.m = _mm_set_epi32(p32[3], p32[2], p32[1], p32[0]);
+ return ret;
+}
+
+#else
+
+typedef struct {
+ __m128i m;
+} r123m128i;
+
+#endif /* __cplusplus */
+
+#else /* !R123_USE_SSE */
+R123_STATIC_INLINE int haveAESNI(){
+ return 0;
+}
+#endif /* R123_USE_SSE */
+
+#endif /* _Random123_sse_dot_h__ */
diff --git a/include/Random123/features/sunprofeatures.h b/include/Random123/features/sunprofeatures.h
@@ -0,0 +1,172 @@
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+ notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions, and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+#ifndef __sunprofeatures_dot_hpp
+#define __sunprofeatures_dot_hpp
+
+#ifndef R123_STATIC_INLINE
+#define R123_STATIC_INLINE static inline
+#endif
+
+#ifndef R123_FORCE_INLINE
+#define R123_FORCE_INLINE(decl) decl
+#endif
+
+#ifndef R123_CUDA_DEVICE
+#define R123_CUDA_DEVICE
+#endif
+
+#ifndef R123_ASSERT
+#include <assert.h>
+#define R123_ASSERT(x) assert(x)
+#endif
+
+#ifndef R123_BUILTIN_EXPECT
+#define R123_BUILTIN_EXPECT(expr,likely) expr
+#endif
+
+// The basic idiom is:
+// #ifndef R123_SOMETHING
+// #if some condition
+// #define R123_SOMETHING 1
+// #else
+// #define R123_SOMETHING 0
+// #endif
+// #endif
+// This idiom allows an external user to override any decision
+// in this file with a command-line -DR123_SOMETHING=1 or -DR123_SOMETHINE=0
+
+// An alternative idiom is:
+// #ifndef R123_SOMETHING
+// #define R123_SOMETHING (some boolean expression)
+// #endif
+// where the boolean expression might contain previously-defined R123_SOMETHING_ELSE
+// pp-symbols.
+
+#ifndef R123_USE_AES_NI
+#define R123_USE_AES_NI 0
+#endif
+
+#ifndef R123_USE_SSE4_2
+#define R123_USE_SSE4_2 0
+#endif
+
+#ifndef R123_USE_SSE4_1
+#define R123_USE_SSE4_1 0
+#endif
+
+#ifndef R123_USE_SSE
+#define R123_USE_SSE 0
+#endif
+
+#ifndef R123_USE_AES_OPENSSL
+#define R123_USE_AES_OPENSSL 0
+#endif
+
+#ifndef R123_USE_GNU_UINT128
+#define R123_USE_GNU_UINT128 0
+#endif
+
+#ifndef R123_USE_ASM_GNU
+#define R123_USE_ASM_GNU 0
+#endif
+
+#ifndef R123_USE_CPUID_MSVC
+#define R123_USE_CPUID_MSVC 0
+#endif
+
+#ifndef R123_USE_X86INTRIN_H
+#define R123_USE_X86INTRIN_H 0
+#endif
+
+#ifndef R123_USE_IA32INTRIN_H
+#define R123_USE_IA32INTRIN_H 0
+#endif
+
+#ifndef R123_USE_XMMINTRIN_H
+#define R123_USE_XMMINTRIN_H 0
+#endif
+
+#ifndef R123_USE_EMMINTRIN_H
+#define R123_USE_EMMINTRIN_H 0
+#endif
+
+#ifndef R123_USE_SMMINTRIN_H
+#define R123_USE_SMMINTRIN_H 0
+#endif
+
+#ifndef R123_USE_WMMINTRIN_H
+#define R123_USE_WMMINTRIN_H 0
+#endif
+
+#ifndef R123_USE_INTRIN_H
+#define R123_USE_INTRIN_H 0
+#endif
+
+#ifndef R123_USE_MULHILO16_ASM
+#define R123_USE_MULHILO16_ASM 0
+#endif
+
+#ifndef R123_USE_MULHILO32_ASM
+#define R123_USE_MULHILO32_ASM 0
+#endif
+
+#ifndef R123_USE_MULHILO64_ASM
+#define R123_USE_MULHILO64_ASM 0
+#endif
+
+#ifndef R123_USE_MULHILO64_MSVC_INTRIN
+#define R123_USE_MULHILO64_MSVC_INTRIN 0
+#endif
+
+#ifndef R123_USE_MULHILO64_CUDA_INTRIN
+#define R123_USE_MULHILO64_CUDA_INTRIN 0
+#endif
+
+#ifndef R123_USE_MULHILO64_OPENCL_INTRIN
+#define R123_USE_MULHILO64_OPENCL_INTRIN 0
+#endif
+
+#ifndef R123_USE_PHILOX_64BIT
+#define R123_USE_PHILOX_64BIT 0
+#endif
+
+#ifndef __STDC_CONSTANT_MACROS
+#define __STDC_CONSTANT_MACROS
+#endif
+#include <stdint.h>
+#ifndef UINT64_C
+#error UINT64_C not defined. You must define __STDC_CONSTANT_MACROS before you #include <stdint.h>
+#endif
+
+// If you add something, it must go in all the other XXfeatures.hpp
+// and in ../ut_features.cpp
+#endif
diff --git a/include/Random123/features/xlcfeatures.h b/include/Random123/features/xlcfeatures.h
@@ -0,0 +1,211 @@
+/* This derivative file contributed via email by Gabriel Rockefeller on 8/5/2013 */
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+ notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions, and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Copyright (c) 2013, Los Alamos National Security, LLC
+All rights reserved.
+
+Copyright 2013. Los Alamos National Security, LLC. This software was produced
+under U.S. Government contract DE-AC52-06NA25396 for Los Alamos National
+Laboratory (LANL), which is operated by Los Alamos National Security, LLC for
+the U.S. Department of Energy. The U.S. Government has rights to use,
+reproduce, and distribute this software. NEITHER THE GOVERNMENT NOR LOS
+ALAMOS NATIONAL SECURITY, LLC MAKES ANY WARRANTY, EXPRESS OR IMPLIED, OR
+ASSUMES ANY LIABILITY FOR THE USE OF THIS SOFTWARE. If software is modified
+to produce derivative works, such modified software should be clearly marked,
+so as not to confuse it with the version available from LANL.
+*/
+#ifndef __xlcfeatures_dot_hpp
+#define __xlcfeatures_dot_hpp
+
+#if !defined(__x86_64__) && !defined(__i386__) && !defined(__powerpc__)
+# error "This code has only been tested on x86 and PowerPC platforms."
+#include <including_a_nonexistent_file_will_stop_some_compilers_from_continuing_with_a_hopeless_task>
+{ /* maybe an unbalanced brace will terminate the compilation */
+ /* Feel free to try the Random123 library on other architectures by changing
+ the conditions that reach this error, but you should consider it a
+ porting exercise and expect to encounter bugs and deficiencies.
+ Please let the authors know of any successes (or failures). */
+#endif
+
+#ifdef __cplusplus
+/* builtins are automatically available to xlc. To use them with xlc++,
+ one must include builtins.h. c.f
+ http://publib.boulder.ibm.com/infocenter/cellcomp/v101v121/index.jsp?topic=/com.ibm.xlcpp101.cell.doc/compiler_ref/compiler_builtins.html
+*/
+#include <builtins.h>
+#endif
+
+#ifndef R123_STATIC_INLINE
+#define R123_STATIC_INLINE static inline
+#endif
+
+#ifndef R123_FORCE_INLINE
+#define R123_FORCE_INLINE(decl) decl __attribute__((__always_inline__))
+#endif
+
+#ifndef R123_CUDA_DEVICE
+#define R123_CUDA_DEVICE
+#endif
+
+#ifndef R123_ASSERT
+#include <assert.h>
+#define R123_ASSERT(x) assert(x)
+#endif
+
+#ifndef R123_BUILTIN_EXPECT
+#define R123_BUILTIN_EXPECT(expr,likely) __builtin_expect(expr,likely)
+#endif
+
+#ifndef R123_USE_AES_NI
+#define R123_USE_AES_NI 0
+#endif
+
+#ifndef R123_USE_SSE4_2
+#define R123_USE_SSE4_2 0
+#endif
+
+#ifndef R123_USE_SSE4_1
+#define R123_USE_SSE4_1 0
+#endif
+
+#ifndef R123_USE_SSE
+#define R123_USE_SSE 0
+#endif
+
+#ifndef R123_USE_AES_OPENSSL
+/* There isn't really a good way to tell at compile time whether
+ openssl is available. Without a pre-compilation configure-like
+ tool, it's less error-prone to guess that it isn't available. Add
+ -DR123_USE_AES_OPENSSL=1 and any necessary LDFLAGS or LDLIBS to
+ play with openssl */
+#define R123_USE_AES_OPENSSL 0
+#endif
+
+#ifndef R123_USE_GNU_UINT128
+#define R123_USE_GNU_UINT128 0
+#endif
+
+#ifndef R123_USE_ASM_GNU
+#define R123_USE_ASM_GNU 1
+#endif
+
+#ifndef R123_USE_CPUID_MSVC
+#define R123_USE_CPUID_MSVC 0
+#endif
+
+#ifndef R123_USE_X86INTRIN_H
+#define R123_USE_X86INTRIN_H 0
+#endif
+
+#ifndef R123_USE_IA32INTRIN_H
+#define R123_USE_IA32INTRIN_H 0
+#endif
+
+#ifndef R123_USE_XMMINTRIN_H
+#define R123_USE_XMMINTRIN_H 0
+#endif
+
+#ifndef R123_USE_EMMINTRIN_H
+#define R123_USE_EMMINTRIN_H 0
+#endif
+
+#ifndef R123_USE_SMMINTRIN_H
+#define R123_USE_SMMINTRIN_H 0
+#endif
+
+#ifndef R123_USE_WMMINTRIN_H
+#define R123_USE_WMMINTRIN_H 0
+#endif
+
+#ifndef R123_USE_INTRIN_H
+#ifdef __ABM__
+#define R123_USE_INTRIN_H 1
+#else
+#define R123_USE_INTRIN_H 0
+#endif
+#endif
+
+#ifndef R123_USE_MULHILO32_ASM
+#define R123_USE_MULHILO32_ASM 0
+#endif
+
+#ifndef R123_USE_MULHILO64_MULHI_INTRIN
+#if (defined(__powerpc64__))
+#define R123_USE_MULHILO64_MULHI_INTRIN 1
+#else
+#define R123_USE_MULHILO64_MULHI_INTRIN 0
+#endif
+#endif
+
+#ifndef R123_MULHILO64_MULHI_INTRIN
+#define R123_MULHILO64_MULHI_INTRIN __mulhdu
+#endif
+
+#ifndef R123_USE_MULHILO32_MULHI_INTRIN
+#define R123_USE_MULHILO32_MULHI_INTRIN 0
+#endif
+
+#ifndef R123_MULHILO32_MULHI_INTRIN
+#define R123_MULHILO32_MULHI_INTRIN __mulhwu
+#endif
+
+#ifndef R123_USE_MULHILO64_ASM
+#if defined(__powerpc64__)
+#define R123_USE_MULHILO64_ASM (1 /*defined(__powerpc64__)*/ && !(R123_USE_MULHILO64_MULHI_INTRIN))
+#else
+#define R123_USE_MULHILO64_ASM (0 /*defined(__powerpc64__)*/ && !(R123_USE_MULHILO64_MULHI_INTRIN))
+#endif
+#endif
+
+#ifndef R123_USE_MULHILO64_MSVC_INTRIN
+#define R123_USE_MULHILO64_MSVC_INTRIN 0
+#endif
+
+#ifndef R123_USE_MULHILO64_CUDA_INTRIN
+#define R123_USE_MULHILO64_CUDA_INTRIN 0
+#endif
+
+#ifndef R123_USE_MULHILO64_OPENCL_INTRIN
+#define R123_USE_MULHILO64_OPENCL_INTRIN 0
+#endif
+
+#ifndef __STDC_CONSTANT_MACROS
+#define __STDC_CONSTANT_MACROS
+#endif
+#include <stdint.h>
+#ifndef UINT64_C
+#error UINT64_C not defined. You must define __STDC_CONSTANT_MACROS before you #include <stdint.h>
+#endif
+
+/* If you add something, it must go in all the other XXfeatures.hpp
+ and in ../ut_features.cpp */
+#endif
diff --git a/include/Random123/gsl_microrng.h b/include/Random123/gsl_microrng.h
@@ -0,0 +1,136 @@
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+ notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions, and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+#ifndef __r123_gslmicrorng_dot_h__
+#define __r123_gslmicrorng_dot_h__
+
+
+#include <gsl/gsl_rng.h>
+#include <string.h>
+
+/** The macro: GSL_MICRORNG(NAME, CBRNGNAME) is the GSL
+ analog analog of the C++ r123::MicroURNG template. It declares a gsl_rng
+ type named gsl_rng_NAME which uses the underlying CBRNGNAME
+ and can be invoked a limited number of times between calls to NAME_reset.
+
+ When the underlying CBRNG's \c ctr_t is an \ref arrayNxW "r123arrayNxW",
+ and the gsl_rng_NAME may called up to \c N*2^32 times
+ between calls to \c NAME_reset.
+
+ \c NAME_reset takes a gsl_rng_NAME type, a counter and a key as arguments.
+ It restarts the micro-rng with a new base counter and key.
+
+ Note that you must call NAME_reset before the first use
+ of a gsl_rng. NAME_reset is not called automatically by
+ gsl_rng_alloc().
+
+ @code
+ #include <Random123/threefry.h>
+ #include <Random123/gsl_microrng.h> // this file
+ GSL_MICRORNG(microcbrng, threefry4x64, 20) // creates gsl_rng_microcbrng
+
+ int main(int argc, char** argv) {
+ gsl_rng *r = gsl_rng_alloc(gsl_rng_microcbrng);
+ threefry4x64_ctr_t c = {{}};
+ threefry4x64_key_t k = {{}};
+
+ for (...) {
+ c.v[0] = ??; // some application variable
+ microcbrng_reset(r, c, k);
+ for (...) {
+ // gaussian calls r several times. It is safe for
+ // r to be used upto 2^20 times in this loop
+ something[i] = gsl_ran_gaussian(r, 1.5);
+ }
+ }
+ }
+ @endcode
+
+*/
+
+#define GSL_MICRORNG(NAME, CBRNGNAME) \
+const gsl_rng_type *gsl_rng_##NAME; \
+ \
+typedef struct{ \
+ CBRNGNAME##_ctr_t ctr; \
+ CBRNGNAME##_ctr_t r; \
+ CBRNGNAME##_key_t key; \
+ R123_ULONG_LONG n; \
+ int elem; \
+} NAME##_state; \
+ \
+static unsigned long int NAME##_get(void *vstate){ \
+ NAME##_state *st = (NAME##_state *)vstate; \
+ const int N=sizeof(st->ctr.v)/sizeof(st->ctr.v[0]); \
+ if( st->elem == 0 ){ \
+ CBRNGNAME##_ctr_t c = st->ctr; \
+ c.v[N-1] |= st->n<<(R123_W(CBRNGNAME##_ctr_t)-32); \
+ st->n++; \
+ st->r = CBRNGNAME(c, st->key); \
+ st->elem = N; \
+ } \
+ return 0xffffffff & st->r.v[--st->elem]; \
+} \
+ \
+static double \
+NAME##_get_double (void * vstate) \
+{ \
+ return NAME##_get (vstate)/4294967296.; \
+} \
+ \
+static void NAME##_set(void *vstate, unsigned long int s){ \
+ NAME##_state *st = (NAME##_state *)vstate; \
+ (void)s; /* ignored */ \
+ st->elem = 0; \
+ st->n = ~0; /* will abort if _reset is not called */ \
+} \
+ \
+static const gsl_rng_type NAME##_type = { \
+ #NAME, \
+ 0xffffffffUL, \
+ 0, \
+ sizeof(NAME##_state), \
+ &NAME##_set, \
+ &NAME##_get, \
+ &NAME##_get_double \
+}; \
+ \
+R123_STATIC_INLINE void NAME##_reset(const gsl_rng* gr, CBRNGNAME##_ctr_t c, CBRNGNAME##_key_t k) { \
+ NAME##_state* state = (NAME##_state *)gr->state; \
+ state->ctr = c; \
+ state->key = k; \
+ state->n = 0; \
+ state->elem = 0; \
+} \
+ \
+const gsl_rng_type *gsl_rng_##NAME = &NAME##_type
+
+#endif
diff --git a/include/Random123/philox.h b/include/Random123/philox.h
@@ -0,0 +1,493 @@
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+ notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions, and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+#ifndef _philox_dot_h_
+#define _philox_dot_h_
+
+/** \cond HIDDEN_FROM_DOXYGEN */
+
+#include "features/compilerfeatures.h"
+#include "array.h"
+
+
+/*
+// Macros _Foo_tpl are code generation 'templates' They define
+// inline functions with names obtained by mangling Foo and the
+// macro arguments. E.g.,
+// _mulhilo_tpl(32, uint32_t, uint64_t)
+// expands to a definition of:
+// mulhilo32(uint32_t, uint32_t, uint32_t *, uint32_t *)
+// We then 'instantiate the template' to define
+// several different functions, e.g.,
+// mulhilo32
+// mulhilo64
+// These functions will be visible to user code, and may
+// also be used later in subsequent templates and definitions.
+
+// A template for mulhilo using a temporary of twice the word-width.
+// Gcc figures out that this can be reduced to a single 'mul' instruction,
+// despite the apparent use of double-wide variables, shifts, etc. It's
+// obviously not guaranteed that all compilers will be that smart, so
+// other implementations might be preferable, e.g., using an intrinsic
+// or an asm block. On the other hand, for 32-bit multiplies,
+// this *is* perfectly standard C99 - any C99 compiler should
+// understand it and produce correct code. For 64-bit multiplies,
+// it's only usable if the compiler recognizes that it can do
+// arithmetic on a 128-bit type. That happens to be true for gcc on
+// x86-64, and powerpc64 but not much else.
+*/
+#define _mulhilo_dword_tpl(W, Word, Dword) \
+R123_CUDA_DEVICE R123_STATIC_INLINE Word mulhilo##W(Word a, Word b, Word* hip){ \
+ Dword product = ((Dword)a)*((Dword)b); \
+ *hip = product>>W; \
+ return (Word)product; \
+}
+
+/*
+// A template for mulhilo using gnu-style asm syntax.
+// INSN can be "mulw", "mull" or "mulq".
+// FIXME - porting to other architectures, we'll need still-more conditional
+// branching here. Note that intrinsics are usually preferable.
+*/
+#ifdef __powerpc__
+#define _mulhilo_asm_tpl(W, Word, INSN) \
+R123_STATIC_INLINE Word mulhilo##W(Word ax, Word b, Word *hip){ \
+ Word dx = 0; \
+ __asm__("\n\t" \
+ INSN " %0,%1,%2\n\t" \
+ : "=r"(dx) \
+ : "r"(b), "r"(ax) \
+ ); \
+ *hip = dx; \
+ return ax*b; \
+}
+#else
+#define _mulhilo_asm_tpl(W, Word, INSN) \
+R123_STATIC_INLINE Word mulhilo##W(Word ax, Word b, Word *hip){ \
+ Word dx; \
+ __asm__("\n\t" \
+ INSN " %2\n\t" \
+ : "=a"(ax), "=d"(dx) \
+ : "r"(b), "0"(ax) \
+ ); \
+ *hip = dx; \
+ return ax; \
+}
+#endif /* __powerpc__ */
+
+/*
+// A template for mulhilo using MSVC-style intrinsics
+// For example,_umul128 is an msvc intrinsic, c.f.
+// http://msdn.microsoft.com/en-us/library/3dayytw9.aspx
+*/
+#define _mulhilo_msvc_intrin_tpl(W, Word, INTRIN) \
+R123_STATIC_INLINE Word mulhilo##W(Word a, Word b, Word* hip){ \
+ return INTRIN(a, b, hip); \
+}
+
+/* N.B. This really should be called _mulhilo_mulhi_intrin. It just
+ happens that CUDA was the first time we used the idiom. */
+#define _mulhilo_cuda_intrin_tpl(W, Word, INTRIN) \
+R123_CUDA_DEVICE R123_STATIC_INLINE Word mulhilo##W(Word a, Word b, R123_METAL_THREAD_ADDRESS_SPACE Word* hip){ \
+ *hip = INTRIN(a, b); \
+ return a*b; \
+}
+
+/*
+// A template for mulhilo using only word-size operations and
+// C99 operators (no adc, no mulhi). It
+// requires four multiplies and a dozen or so shifts, adds
+// and tests. It's *SLOW*. It can be used to
+// implement philoxNx32 on platforms that completely lack
+// 64-bit types, e.g., Metal.
+// On 32-bit platforms, it could be used to
+// implement philoxNx64, but on such platforms both the philoxNx32
+// and the threefryNx64 cbrngs are going to have much better
+// performance. It is enabled below by R123_USE_MULHILO64_C99,
+// but that is currently (Feb 2019) only set by
+// features/metalfeatures.h headers. It can, of course, be
+// set with a compile-time -D option.
+*/
+#define _mulhilo_c99_tpl(W, Word) \
+R123_STATIC_INLINE Word mulhilo##W(Word a, Word b, R123_METAL_THREAD_ADDRESS_SPACE Word *hip){ \
+ const unsigned WHALF = W/2; \
+ const Word LOMASK = ((((Word)1)<<WHALF)-1); \
+ Word lo = a*b; /* full low multiply */ \
+ Word ahi = a>>WHALF; \
+ Word alo = a& LOMASK; \
+ Word bhi = b>>WHALF; \
+ Word blo = b& LOMASK; \
+ \
+ Word ahbl = ahi*blo; \
+ Word albh = alo*bhi; \
+ \
+ Word ahbl_albh = ((ahbl&LOMASK) + (albh&LOMASK)); \
+ Word hi = ahi*bhi + (ahbl>>WHALF) + (albh>>WHALF); \
+ hi += ahbl_albh >> WHALF; /* carry from the sum of lo(ahbl) + lo(albh) ) */ \
+ /* carry from the sum with alo*blo */ \
+ hi += ((lo >> WHALF) < (ahbl_albh&LOMASK)); \
+ *hip = hi; \
+ return lo; \
+}
+
+/*
+// A template for mulhilo on a platform that can't do it
+// We could put a C version here, but is it better to run *VERY*
+// slowly or to just stop and force the user to find another CBRNG?
+*/
+#define _mulhilo_fail_tpl(W, Word) \
+R123_STATIC_INLINE Word mulhilo##W(Word a, Word b, Word *hip){ \
+ R123_STATIC_ASSERT(0, "mulhilo" #W " is not implemented on this machine\n"); \
+}
+
+/*
+// N.B. There's an MSVC intrinsic called _emul,
+// which *might* compile into better code than
+// _mulhilo_dword_tpl
+*/
+#if R123_USE_MULHILO32_ASM
+#ifdef __powerpc__
+_mulhilo_asm_tpl(32, uint32_t, "mulhwu")
+#else
+_mulhilo_asm_tpl(32, uint32_t, "mull")
+#endif /* __powerpc__ */
+#else
+#if R123_USE_64BIT
+_mulhilo_dword_tpl(32, uint32_t, uint64_t)
+#elif R123_USE_MULHILO32_MULHI_INTRIN
+_mulhilo_cuda_intrin_tpl(32, uint32_t, R123_MULHILO32_MULHI_INTRIN)
+#else
+_mulhilo_c99_tpl(32, uint32_t)
+#endif
+#endif
+
+#if R123_USE_PHILOX_64BIT
+#if R123_USE_MULHILO64_ASM
+#ifdef __powerpc64__
+_mulhilo_asm_tpl(64, uint64_t, "mulhdu")
+#else
+_mulhilo_asm_tpl(64, uint64_t, "mulq")
+#endif /* __powerpc64__ */
+#elif R123_USE_MULHILO64_MSVC_INTRIN
+_mulhilo_msvc_intrin_tpl(64, uint64_t, _umul128)
+#elif R123_USE_MULHILO64_CUDA_INTRIN
+_mulhilo_cuda_intrin_tpl(64, uint64_t, __umul64hi)
+#elif R123_USE_MULHILO64_OPENCL_INTRIN
+_mulhilo_cuda_intrin_tpl(64, uint64_t, mul_hi)
+#elif R123_USE_MULHILO64_MULHI_INTRIN
+_mulhilo_cuda_intrin_tpl(64, uint64_t, R123_MULHILO64_MULHI_INTRIN)
+#elif R123_USE_GNU_UINT128
+_mulhilo_dword_tpl(64, uint64_t, __uint128_t)
+#elif R123_USE_MULHILO64_C99
+_mulhilo_c99_tpl(64, uint64_t)
+#else
+_mulhilo_fail_tpl(64, uint64_t)
+#endif
+#endif
+
+/*
+// The multipliers and Weyl constants are "hard coded".
+// To change them, you can #define them with different
+// values before #include-ing this file.
+// This isn't terribly elegant, but it works for C as
+// well as C++. A nice C++-only solution would be to
+// use template parameters in the style of <random>
+*/
+#ifndef PHILOX_M2x64_0
+#define PHILOX_M2x64_0 R123_64BIT(0xD2B74407B1CE6E93)
+#endif
+
+#ifndef PHILOX_M4x64_0
+#define PHILOX_M4x64_0 R123_64BIT(0xD2E7470EE14C6C93)
+#endif
+
+#ifndef PHILOX_M4x64_1
+#define PHILOX_M4x64_1 R123_64BIT(0xCA5A826395121157)
+#endif
+
+#ifndef PHILOX_M2x32_0
+#define PHILOX_M2x32_0 ((uint32_t)0xd256d193)
+#endif
+
+#ifndef PHILOX_M4x32_0
+#define PHILOX_M4x32_0 ((uint32_t)0xD2511F53)
+#endif
+#ifndef PHILOX_M4x32_1
+#define PHILOX_M4x32_1 ((uint32_t)0xCD9E8D57)
+#endif
+
+#ifndef PHILOX_W64_0
+#define PHILOX_W64_0 R123_64BIT(0x9E3779B97F4A7C15) /* golden ratio */
+#endif
+#ifndef PHILOX_W64_1
+#define PHILOX_W64_1 R123_64BIT(0xBB67AE8584CAA73B) /* sqrt(3)-1 */
+#endif
+
+#ifndef PHILOX_W32_0
+#define PHILOX_W32_0 ((uint32_t)0x9E3779B9)
+#endif
+#ifndef PHILOX_W32_1
+#define PHILOX_W32_1 ((uint32_t)0xBB67AE85)
+#endif
+
+/** \endcond */
+#ifndef PHILOX2x32_DEFAULT_ROUNDS
+#define PHILOX2x32_DEFAULT_ROUNDS 10
+#endif
+
+#ifndef PHILOX2x64_DEFAULT_ROUNDS
+#define PHILOX2x64_DEFAULT_ROUNDS 10
+#endif
+
+#ifndef PHILOX4x32_DEFAULT_ROUNDS
+#define PHILOX4x32_DEFAULT_ROUNDS 10
+#endif
+
+#ifndef PHILOX4x64_DEFAULT_ROUNDS
+#define PHILOX4x64_DEFAULT_ROUNDS 10
+#endif
+/** \cond HIDDEN_FROM_DOXYGEN */
+
+/* The ignored fourth argument allows us to instantiate the
+ same macro regardless of N. */
+#define _philox2xWround_tpl(W, T) \
+R123_CUDA_DEVICE R123_STATIC_INLINE R123_FORCE_INLINE(struct r123array2x##W _philox2x##W##round(struct r123array2x##W ctr, struct r123array1x##W key)); \
+R123_CUDA_DEVICE R123_STATIC_INLINE struct r123array2x##W _philox2x##W##round(struct r123array2x##W ctr, struct r123array1x##W key){ \
+ T hi; \
+ T lo = mulhilo##W(PHILOX_M2x##W##_0, ctr.v[0], &hi); \
+ struct r123array2x##W out = {{hi^key.v[0]^ctr.v[1], lo}}; \
+ return out; \
+}
+#define _philox2xWbumpkey_tpl(W) \
+R123_CUDA_DEVICE R123_STATIC_INLINE struct r123array1x##W _philox2x##W##bumpkey( struct r123array1x##W key) { \
+ key.v[0] += PHILOX_W##W##_0; \
+ return key; \
+}
+
+#define _philox4xWround_tpl(W, T) \
+R123_CUDA_DEVICE R123_STATIC_INLINE R123_FORCE_INLINE(struct r123array4x##W _philox4x##W##round(struct r123array4x##W ctr, struct r123array2x##W key)); \
+R123_CUDA_DEVICE R123_STATIC_INLINE struct r123array4x##W _philox4x##W##round(struct r123array4x##W ctr, struct r123array2x##W key){ \
+ T hi0; \
+ T hi1; \
+ T lo0 = mulhilo##W(PHILOX_M4x##W##_0, ctr.v[0], &hi0); \
+ T lo1 = mulhilo##W(PHILOX_M4x##W##_1, ctr.v[2], &hi1); \
+ struct r123array4x##W out = {{hi1^ctr.v[1]^key.v[0], lo1, \
+ hi0^ctr.v[3]^key.v[1], lo0}}; \
+ return out; \
+}
+
+#define _philox4xWbumpkey_tpl(W) \
+R123_CUDA_DEVICE R123_STATIC_INLINE struct r123array2x##W _philox4x##W##bumpkey( struct r123array2x##W key) { \
+ key.v[0] += PHILOX_W##W##_0; \
+ key.v[1] += PHILOX_W##W##_1; \
+ return key; \
+}
+
+/** \endcond */
+#define _philoxNxW_tpl(N, Nhalf, W, T) \
+/** @ingroup PhiloxNxW */ \
+enum r123_enum_philox##N##x##W { philox##N##x##W##_rounds = PHILOX##N##x##W##_DEFAULT_ROUNDS }; \
+typedef struct r123array##N##x##W philox##N##x##W##_ctr_t; \
+typedef struct r123array##Nhalf##x##W philox##N##x##W##_key_t; \
+typedef struct r123array##Nhalf##x##W philox##N##x##W##_ukey_t; \
+R123_CUDA_DEVICE R123_STATIC_INLINE philox##N##x##W##_key_t philox##N##x##W##keyinit(philox##N##x##W##_ukey_t uk) { return uk; } \
+R123_CUDA_DEVICE R123_STATIC_INLINE R123_FORCE_INLINE(philox##N##x##W##_ctr_t philox##N##x##W##_R(unsigned int R, philox##N##x##W##_ctr_t ctr, philox##N##x##W##_key_t key)); \
+R123_CUDA_DEVICE R123_STATIC_INLINE philox##N##x##W##_ctr_t philox##N##x##W##_R(unsigned int R, philox##N##x##W##_ctr_t ctr, philox##N##x##W##_key_t key) { \
+ R123_ASSERT(R<=16); \
+ if(R>0){ ctr = _philox##N##x##W##round(ctr, key); } \
+ if(R>1){ key = _philox##N##x##W##bumpkey(key); ctr = _philox##N##x##W##round(ctr, key); } \
+ if(R>2){ key = _philox##N##x##W##bumpkey(key); ctr = _philox##N##x##W##round(ctr, key); } \
+ if(R>3){ key = _philox##N##x##W##bumpkey(key); ctr = _philox##N##x##W##round(ctr, key); } \
+ if(R>4){ key = _philox##N##x##W##bumpkey(key); ctr = _philox##N##x##W##round(ctr, key); } \
+ if(R>5){ key = _philox##N##x##W##bumpkey(key); ctr = _philox##N##x##W##round(ctr, key); } \
+ if(R>6){ key = _philox##N##x##W##bumpkey(key); ctr = _philox##N##x##W##round(ctr, key); } \
+ if(R>7){ key = _philox##N##x##W##bumpkey(key); ctr = _philox##N##x##W##round(ctr, key); } \
+ if(R>8){ key = _philox##N##x##W##bumpkey(key); ctr = _philox##N##x##W##round(ctr, key); } \
+ if(R>9){ key = _philox##N##x##W##bumpkey(key); ctr = _philox##N##x##W##round(ctr, key); } \
+ if(R>10){ key = _philox##N##x##W##bumpkey(key); ctr = _philox##N##x##W##round(ctr, key); } \
+ if(R>11){ key = _philox##N##x##W##bumpkey(key); ctr = _philox##N##x##W##round(ctr, key); } \
+ if(R>12){ key = _philox##N##x##W##bumpkey(key); ctr = _philox##N##x##W##round(ctr, key); } \
+ if(R>13){ key = _philox##N##x##W##bumpkey(key); ctr = _philox##N##x##W##round(ctr, key); } \
+ if(R>14){ key = _philox##N##x##W##bumpkey(key); ctr = _philox##N##x##W##round(ctr, key); } \
+ if(R>15){ key = _philox##N##x##W##bumpkey(key); ctr = _philox##N##x##W##round(ctr, key); } \
+ return ctr; \
+}
+
+_philox2xWbumpkey_tpl(32)
+_philox4xWbumpkey_tpl(32)
+_philox2xWround_tpl(32, uint32_t) /* philox2x32round */
+_philox4xWround_tpl(32, uint32_t) /* philo4x32round */
+
+_philoxNxW_tpl(2, 1, 32, uint32_t) /* philox2x32bijection */
+_philoxNxW_tpl(4, 2, 32, uint32_t) /* philox4x32bijection */
+#if R123_USE_PHILOX_64BIT
+/** \cond HIDDEN_FROM_DOXYGEN */
+_philox2xWbumpkey_tpl(64)
+_philox4xWbumpkey_tpl(64)
+_philox2xWround_tpl(64, uint64_t) /* philo2x64round */
+_philox4xWround_tpl(64, uint64_t) /* philo4x64round */
+/** \endcond */
+_philoxNxW_tpl(2, 1, 64, uint64_t) /* philox2x64bijection */
+_philoxNxW_tpl(4, 2, 64, uint64_t) /* philox4x64bijection */
+#endif /* R123_USE_PHILOX_64BIT */
+
+#define philox2x32(c,k) philox2x32_R(philox2x32_rounds, c, k)
+#define philox4x32(c,k) philox4x32_R(philox4x32_rounds, c, k)
+#if R123_USE_PHILOX_64BIT
+#define philox2x64(c,k) philox2x64_R(philox2x64_rounds, c, k)
+#define philox4x64(c,k) philox4x64_R(philox4x64_rounds, c, k)
+#endif /* R123_USE_PHILOX_64BIT */
+
+#if defined(__cplusplus)
+
+#define _PhiloxNxW_base_tpl(CType, KType, N, W) \
+namespace r123{ \
+template<unsigned int ROUNDS> \
+struct Philox##N##x##W##_R{ \
+ typedef CType ctr_type; \
+ typedef KType key_type; \
+ typedef KType ukey_type; \
+ static const R123_METAL_CONSTANT_ADDRESS_SPACE unsigned int rounds=ROUNDS; \
+ inline R123_CUDA_DEVICE R123_FORCE_INLINE(ctr_type operator()(ctr_type ctr, key_type key) const){ \
+ R123_STATIC_ASSERT(ROUNDS<=16, "philox is only unrolled up to 16 rounds\n"); \
+ return philox##N##x##W##_R(ROUNDS, ctr, key); \
+ } \
+}; \
+typedef Philox##N##x##W##_R<philox##N##x##W##_rounds> Philox##N##x##W; \
+ } // namespace r123
+
+_PhiloxNxW_base_tpl(r123array2x32, r123array1x32, 2, 32) // Philox2x32_R<R>
+_PhiloxNxW_base_tpl(r123array4x32, r123array2x32, 4, 32) // Philox4x32_R<R>
+#if R123_USE_PHILOX_64BIT
+_PhiloxNxW_base_tpl(r123array2x64, r123array1x64, 2, 64) // Philox2x64_R<R>
+_PhiloxNxW_base_tpl(r123array4x64, r123array2x64, 4, 64) // Philox4x64_R<R>
+#endif
+
+/* The _tpl macros don't quite work to do string-pasting inside comments.
+ so we just write out the boilerplate documentation four times... */
+
+/**
+@defgroup PhiloxNxW Philox Classes and Typedefs
+
+The PhiloxNxW classes export the member functions, typedefs and
+operator overloads required by a @ref CBRNG "CBRNG" class.
+
+As described in
+<a href="http://dl.acm.org/citation.cfm?doid=2063405"><i>Parallel Random Numbers: As Easy as 1, 2, 3</i> </a>.
+The Philox family of counter-based RNGs use integer multiplication, xor and permutation of W-bit words
+to scramble its N-word input key. Philox is a mnemonic for Product HI LO Xor).
+
+
+@class r123::Philox2x32_R
+@ingroup PhiloxNxW
+
+exports the member functions, typedefs and operator overloads required by a @ref CBRNG "CBRNG" class.
+
+The template argument, ROUNDS, is the number of times the Philox round
+function will be applied.
+
+As of November 2011, the authors know of no statistical flaws with
+ROUNDS=6 or more for Philox2x32.
+
+@typedef r123::Philox2x32
+@ingroup PhiloxNxW
+ Philox2x32 is equivalent to Philox2x32_R<10>. With 10 rounds,
+ Philox2x32 has a considerable safety margin over the minimum number
+ of rounds with no known statistical flaws, but still has excellent
+ performance.
+
+
+
+@class r123::Philox2x64_R
+@ingroup PhiloxNxW
+
+exports the member functions, typedefs and operator overloads required by a @ref CBRNG "CBRNG" class.
+
+The template argument, ROUNDS, is the number of times the Philox round
+function will be applied.
+
+As of September 2011, the authors know of no statistical flaws with
+ROUNDS=6 or more for Philox2x64.
+
+@typedef r123::Philox2x64
+@ingroup PhiloxNxW
+ Philox2x64 is equivalent to Philox2x64_R<10>. With 10 rounds,
+ Philox2x64 has a considerable safety margin over the minimum number
+ of rounds with no known statistical flaws, but still has excellent
+ performance.
+
+
+
+@class r123::Philox4x32_R
+@ingroup PhiloxNxW
+
+exports the member functions, typedefs and operator overloads required by a @ref CBRNG "CBRNG" class.
+
+The template argument, ROUNDS, is the number of times the Philox round
+function will be applied.
+
+In November 2011, the authors recorded some suspicious p-values (approximately 1.e-7) from
+some very long (longer than the default BigCrush length) SimpPoker tests. Despite
+the fact that even longer tests reverted to "passing" p-values, a cloud remains over
+Philox4x32 with 7 rounds. The authors know of no statistical flaws with
+ROUNDS=8 or more for Philox4x32.
+
+@typedef r123::Philox4x32
+@ingroup PhiloxNxW
+ Philox4x32 is equivalent to Philox4x32_R<10>. With 10 rounds,
+ Philox4x32 has a considerable safety margin over the minimum number
+ of rounds with no known statistical flaws, but still has excellent
+ performance.
+
+
+
+@class r123::Philox4x64_R
+@ingroup PhiloxNxW
+
+exports the member functions, typedefs and operator overloads required by a @ref CBRNG "CBRNG" class.
+
+The template argument, ROUNDS, is the number of times the Philox round
+function will be applied.
+
+As of September 2011, the authors know of no statistical flaws with
+ROUNDS=7 or more for Philox4x64.
+
+@typedef r123::Philox4x64
+@ingroup PhiloxNxW
+ Philox4x64 is equivalent to Philox4x64_R<10>. With 10 rounds,
+ Philox4x64 has a considerable safety margin over the minimum number
+ of rounds with no known statistical flaws, but still has excellent
+ performance.
+*/
+
+#endif /* __cplusplus */
+
+#endif /* _philox_dot_h_ */
diff --git a/include/Random123/threefry.h b/include/Random123/threefry.h
@@ -0,0 +1,874 @@
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+ notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions, and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+#ifndef _threefry_dot_h_
+#define _threefry_dot_h_
+#include "features/compilerfeatures.h"
+#include "array.h"
+
+/** \cond HIDDEN_FROM_DOXYGEN */
+/* Significant parts of this file were copied from
+ from:
+ Skein_FinalRnd/ReferenceImplementation/skein.h
+ Skein_FinalRnd/ReferenceImplementation/skein_block.c
+
+ in http://csrc.nist.gov/groups/ST/hash/sha-3/Round3/documents/Skein_FinalRnd.zip
+
+ This file has been modified so that it may no longer perform its originally
+ intended function. If you're looking for a Skein or Threefish source code,
+ please consult the original file.
+
+ The original file had the following header:
+**************************************************************************
+**
+** Interface declarations and internal definitions for Skein hashing.
+**
+** Source code author: Doug Whiting, 2008.
+**
+** This algorithm and source code is released to the public domain.
+**
+***************************************************************************
+
+*/
+
+/* See comment at the top of philox.h for the macro pre-process
+ strategy. */
+
+/* Rotation constants: */
+enum r123_enum_threefry64x4 {
+ /* These are the R_256 constants from the Threefish reference sources
+ with names changed to R_64x4... */
+ R_64x4_0_0=14, R_64x4_0_1=16,
+ R_64x4_1_0=52, R_64x4_1_1=57,
+ R_64x4_2_0=23, R_64x4_2_1=40,
+ R_64x4_3_0= 5, R_64x4_3_1=37,
+ R_64x4_4_0=25, R_64x4_4_1=33,
+ R_64x4_5_0=46, R_64x4_5_1=12,
+ R_64x4_6_0=58, R_64x4_6_1=22,
+ R_64x4_7_0=32, R_64x4_7_1=32
+};
+
+enum r123_enum_threefry64x2 {
+ /*
+ // Output from skein_rot_search: (srs64_B64-X1000)
+ // Random seed = 1. BlockSize = 128 bits. sampleCnt = 1024. rounds = 8, minHW_or=57
+ // Start: Tue Mar 1 10:07:48 2011
+ // rMin = 0.136. #0325[*15] [CRC=455A682F. hw_OR=64. cnt=16384. blkSize= 128].format
+ */
+ R_64x2_0_0=16,
+ R_64x2_1_0=42,
+ R_64x2_2_0=12,
+ R_64x2_3_0=31,
+ R_64x2_4_0=16,
+ R_64x2_5_0=32,
+ R_64x2_6_0=24,
+ R_64x2_7_0=21
+ /* 4 rounds: minHW = 4 [ 4 4 4 4 ]
+ // 5 rounds: minHW = 8 [ 8 8 8 8 ]
+ // 6 rounds: minHW = 16 [ 16 16 16 16 ]
+ // 7 rounds: minHW = 32 [ 32 32 32 32 ]
+ // 8 rounds: minHW = 64 [ 64 64 64 64 ]
+ // 9 rounds: minHW = 64 [ 64 64 64 64 ]
+ //10 rounds: minHW = 64 [ 64 64 64 64 ]
+ //11 rounds: minHW = 64 [ 64 64 64 64 ] */
+};
+
+enum r123_enum_threefry32x4 {
+ /* Output from skein_rot_search: (srs-B128-X5000.out)
+ // Random seed = 1. BlockSize = 64 bits. sampleCnt = 1024. rounds = 8, minHW_or=28
+ // Start: Mon Aug 24 22:41:36 2009
+ // ...
+ // rMin = 0.472. #0A4B[*33] [CRC=DD1ECE0F. hw_OR=31. cnt=16384. blkSize= 128].format */
+ R_32x4_0_0=10, R_32x4_0_1=26,
+ R_32x4_1_0=11, R_32x4_1_1=21,
+ R_32x4_2_0=13, R_32x4_2_1=27,
+ R_32x4_3_0=23, R_32x4_3_1= 5,
+ R_32x4_4_0= 6, R_32x4_4_1=20,
+ R_32x4_5_0=17, R_32x4_5_1=11,
+ R_32x4_6_0=25, R_32x4_6_1=10,
+ R_32x4_7_0=18, R_32x4_7_1=20
+
+ /* 4 rounds: minHW = 3 [ 3 3 3 3 ]
+ // 5 rounds: minHW = 7 [ 7 7 7 7 ]
+ // 6 rounds: minHW = 12 [ 13 12 13 12 ]
+ // 7 rounds: minHW = 22 [ 22 23 22 23 ]
+ // 8 rounds: minHW = 31 [ 31 31 31 31 ]
+ // 9 rounds: minHW = 32 [ 32 32 32 32 ]
+ //10 rounds: minHW = 32 [ 32 32 32 32 ]
+ //11 rounds: minHW = 32 [ 32 32 32 32 ] */
+
+};
+
+enum r123_enum_threefry32x2 {
+ /* Output from skein_rot_search (srs32x2-X5000.out)
+ // Random seed = 1. BlockSize = 64 bits. sampleCnt = 1024. rounds = 8, minHW_or=28
+ // Start: Tue Jul 12 11:11:33 2011
+ // rMin = 0.334. #0206[*07] [CRC=1D9765C0. hw_OR=32. cnt=16384. blkSize= 64].format */
+ R_32x2_0_0=13,
+ R_32x2_1_0=15,
+ R_32x2_2_0=26,
+ R_32x2_3_0= 6,
+ R_32x2_4_0=17,
+ R_32x2_5_0=29,
+ R_32x2_6_0=16,
+ R_32x2_7_0=24
+
+ /* 4 rounds: minHW = 4 [ 4 4 4 4 ]
+ // 5 rounds: minHW = 6 [ 6 8 6 8 ]
+ // 6 rounds: minHW = 9 [ 9 12 9 12 ]
+ // 7 rounds: minHW = 16 [ 16 24 16 24 ]
+ // 8 rounds: minHW = 32 [ 32 32 32 32 ]
+ // 9 rounds: minHW = 32 [ 32 32 32 32 ]
+ //10 rounds: minHW = 32 [ 32 32 32 32 ]
+ //11 rounds: minHW = 32 [ 32 32 32 32 ] */
+ };
+
+enum r123_enum_threefry_wcnt {
+ WCNT2=2,
+ WCNT4=4
+};
+
+#if R123_USE_64BIT
+R123_CUDA_DEVICE R123_STATIC_INLINE R123_FORCE_INLINE(uint64_t RotL_64(uint64_t x, unsigned int N));
+R123_CUDA_DEVICE R123_STATIC_INLINE uint64_t RotL_64(uint64_t x, unsigned int N)
+{
+ return (x << (N & 63)) | (x >> ((64-N) & 63));
+}
+#endif
+
+R123_CUDA_DEVICE R123_STATIC_INLINE R123_FORCE_INLINE(uint32_t RotL_32(uint32_t x, unsigned int N));
+R123_CUDA_DEVICE R123_STATIC_INLINE uint32_t RotL_32(uint32_t x, unsigned int N)
+{
+ return (x << (N & 31)) | (x >> ((32-N) & 31));
+}
+
+#define SKEIN_MK_64(hi32,lo32) ((lo32) + (((uint64_t) (hi32)) << 32))
+#define SKEIN_KS_PARITY64 SKEIN_MK_64(0x1BD11BDA,0xA9FC1A22)
+#define SKEIN_KS_PARITY32 0x1BD11BDA
+
+/** \endcond */
+
+#ifndef THREEFRY2x32_DEFAULT_ROUNDS
+#define THREEFRY2x32_DEFAULT_ROUNDS 20
+#endif
+
+#ifndef THREEFRY2x64_DEFAULT_ROUNDS
+#define THREEFRY2x64_DEFAULT_ROUNDS 20
+#endif
+
+#ifndef THREEFRY4x32_DEFAULT_ROUNDS
+#define THREEFRY4x32_DEFAULT_ROUNDS 20
+#endif
+
+#ifndef THREEFRY4x64_DEFAULT_ROUNDS
+#define THREEFRY4x64_DEFAULT_ROUNDS 20
+#endif
+
+#define _threefry2x_tpl(W) \
+typedef struct r123array2x##W threefry2x##W##_ctr_t; \
+typedef struct r123array2x##W threefry2x##W##_key_t; \
+typedef struct r123array2x##W threefry2x##W##_ukey_t; \
+R123_CUDA_DEVICE R123_STATIC_INLINE threefry2x##W##_key_t threefry2x##W##keyinit(threefry2x##W##_ukey_t uk) { return uk; } \
+R123_CUDA_DEVICE R123_STATIC_INLINE R123_FORCE_INLINE(threefry2x##W##_ctr_t threefry2x##W##_R(unsigned int Nrounds, threefry2x##W##_ctr_t in, threefry2x##W##_key_t k)); \
+R123_CUDA_DEVICE R123_STATIC_INLINE \
+threefry2x##W##_ctr_t threefry2x##W##_R(unsigned int Nrounds, threefry2x##W##_ctr_t in, threefry2x##W##_key_t k){ \
+ uint##W##_t X0,X1; \
+ uint##W##_t ks0, ks1, ks2; \
+ R123_ASSERT(Nrounds<=32); \
+ ks2 = SKEIN_KS_PARITY##W; \
+ ks0 = k.v[0]; \
+ X0 = in.v[0] + ks0; \
+ ks2 ^= ks0; \
+\
+ ks1 = k.v[1]; \
+ X1 = in.v[1] + ks1; \
+ ks2 ^= ks1; \
+ \
+ if(Nrounds>0){ X0 += X1; X1 = RotL_##W(X1,R_##W##x2_0_0); X1 ^= X0; } \
+ if(Nrounds>1){ X0 += X1; X1 = RotL_##W(X1,R_##W##x2_1_0); X1 ^= X0; } \
+ if(Nrounds>2){ X0 += X1; X1 = RotL_##W(X1,R_##W##x2_2_0); X1 ^= X0; } \
+ if(Nrounds>3){ X0 += X1; X1 = RotL_##W(X1,R_##W##x2_3_0); X1 ^= X0; } \
+ if(Nrounds>3){ \
+ /* InjectKey(r=1) */ \
+ X0 += ks1; X1 += ks2; \
+ X1 += 1; /* X.v[2-1] += r */ \
+ } \
+ if(Nrounds>4){ X0 += X1; X1 = RotL_##W(X1,R_##W##x2_4_0); X1 ^= X0; } \
+ if(Nrounds>5){ X0 += X1; X1 = RotL_##W(X1,R_##W##x2_5_0); X1 ^= X0; } \
+ if(Nrounds>6){ X0 += X1; X1 = RotL_##W(X1,R_##W##x2_6_0); X1 ^= X0; } \
+ if(Nrounds>7){ X0 += X1; X1 = RotL_##W(X1,R_##W##x2_7_0); X1 ^= X0; } \
+ if(Nrounds>7){ \
+ /* InjectKey(r=2) */ \
+ X0 += ks2; X1 += ks0; \
+ X1 += 2; \
+ } \
+ if(Nrounds>8){ X0 += X1; X1 = RotL_##W(X1,R_##W##x2_0_0); X1 ^= X0; } \
+ if(Nrounds>9){ X0 += X1; X1 = RotL_##W(X1,R_##W##x2_1_0); X1 ^= X0; } \
+ if(Nrounds>10){ X0 += X1; X1 = RotL_##W(X1,R_##W##x2_2_0); X1 ^= X0; } \
+ if(Nrounds>11){ X0 += X1; X1 = RotL_##W(X1,R_##W##x2_3_0); X1 ^= X0; } \
+ if(Nrounds>11){ \
+ /* InjectKey(r=3) */ \
+ X0 += ks0; X1 += ks1; \
+ X1 += 3; \
+ } \
+ if(Nrounds>12){ X0 += X1; X1 = RotL_##W(X1,R_##W##x2_4_0); X1 ^= X0; } \
+ if(Nrounds>13){ X0 += X1; X1 = RotL_##W(X1,R_##W##x2_5_0); X1 ^= X0; } \
+ if(Nrounds>14){ X0 += X1; X1 = RotL_##W(X1,R_##W##x2_6_0); X1 ^= X0; } \
+ if(Nrounds>15){ X0 += X1; X1 = RotL_##W(X1,R_##W##x2_7_0); X1 ^= X0; } \
+ if(Nrounds>15){ \
+ /* InjectKey(r=4) */ \
+ X0 += ks1; X1 += ks2; \
+ X1 += 4; \
+ } \
+ if(Nrounds>16){ X0 += X1; X1 = RotL_##W(X1,R_##W##x2_0_0); X1 ^= X0; } \
+ if(Nrounds>17){ X0 += X1; X1 = RotL_##W(X1,R_##W##x2_1_0); X1 ^= X0; } \
+ if(Nrounds>18){ X0 += X1; X1 = RotL_##W(X1,R_##W##x2_2_0); X1 ^= X0; } \
+ if(Nrounds>19){ X0 += X1; X1 = RotL_##W(X1,R_##W##x2_3_0); X1 ^= X0; } \
+ if(Nrounds>19){ \
+ /* InjectKey(r=5) */ \
+ X0 += ks2; X1 += ks0; \
+ X1 += 5; \
+ } \
+ if(Nrounds>20){ X0 += X1; X1 = RotL_##W(X1,R_##W##x2_4_0); X1 ^= X0; } \
+ if(Nrounds>21){ X0 += X1; X1 = RotL_##W(X1,R_##W##x2_5_0); X1 ^= X0; } \
+ if(Nrounds>22){ X0 += X1; X1 = RotL_##W(X1,R_##W##x2_6_0); X1 ^= X0; } \
+ if(Nrounds>23){ X0 += X1; X1 = RotL_##W(X1,R_##W##x2_7_0); X1 ^= X0; } \
+ if(Nrounds>23){ \
+ /* InjectKey(r=6) */ \
+ X0 += ks0; X1 += ks1; \
+ X1 += 6; \
+ } \
+ if(Nrounds>24){ X0 += X1; X1 = RotL_##W(X1,R_##W##x2_0_0); X1 ^= X0; } \
+ if(Nrounds>25){ X0 += X1; X1 = RotL_##W(X1,R_##W##x2_1_0); X1 ^= X0; } \
+ if(Nrounds>26){ X0 += X1; X1 = RotL_##W(X1,R_##W##x2_2_0); X1 ^= X0; } \
+ if(Nrounds>27){ X0 += X1; X1 = RotL_##W(X1,R_##W##x2_3_0); X1 ^= X0; } \
+ if(Nrounds>27){ \
+ /* InjectKey(r=7) */ \
+ X0 += ks1; X1 += ks2; \
+ X1 += 7; \
+ } \
+ if(Nrounds>28){ X0 += X1; X1 = RotL_##W(X1,R_##W##x2_4_0); X1 ^= X0; } \
+ if(Nrounds>29){ X0 += X1; X1 = RotL_##W(X1,R_##W##x2_5_0); X1 ^= X0; } \
+ if(Nrounds>30){ X0 += X1; X1 = RotL_##W(X1,R_##W##x2_6_0); X1 ^= X0; } \
+ if(Nrounds>31){ X0 += X1; X1 = RotL_##W(X1,R_##W##x2_7_0); X1 ^= X0; } \
+ if(Nrounds>31){ \
+ /* InjectKey(r=8) */ \
+ X0 += ks2; X1 += ks0; \
+ X1 += 8; \
+ } \
+ threefry2x##W##_ctr_t ret={{X0, X1}}; \
+ return ret; \
+} \
+ /** @ingroup ThreefryNxW */ \
+enum r123_enum_threefry2x##W { threefry2x##W##_rounds = THREEFRY2x##W##_DEFAULT_ROUNDS }; \
+R123_CUDA_DEVICE R123_STATIC_INLINE R123_FORCE_INLINE(threefry2x##W##_ctr_t threefry2x##W(threefry2x##W##_ctr_t in, threefry2x##W##_key_t k)); \
+R123_CUDA_DEVICE R123_STATIC_INLINE \
+threefry2x##W##_ctr_t threefry2x##W(threefry2x##W##_ctr_t in, threefry2x##W##_key_t k){ \
+ return threefry2x##W##_R(threefry2x##W##_rounds, in, k); \
+}
+
+
+#define _threefry4x_tpl(W) \
+typedef struct r123array4x##W threefry4x##W##_ctr_t; \
+typedef struct r123array4x##W threefry4x##W##_key_t; \
+typedef struct r123array4x##W threefry4x##W##_ukey_t; \
+R123_CUDA_DEVICE R123_STATIC_INLINE threefry4x##W##_key_t threefry4x##W##keyinit(threefry4x##W##_ukey_t uk) { return uk; } \
+R123_CUDA_DEVICE R123_STATIC_INLINE R123_FORCE_INLINE(threefry4x##W##_ctr_t threefry4x##W##_R(unsigned int Nrounds, threefry4x##W##_ctr_t in, threefry4x##W##_key_t k)); \
+R123_CUDA_DEVICE R123_STATIC_INLINE \
+threefry4x##W##_ctr_t threefry4x##W##_R(unsigned int Nrounds, threefry4x##W##_ctr_t in, threefry4x##W##_key_t k){ \
+ uint##W##_t X0, X1, X2, X3; \
+ uint##W##_t ks0, ks1, ks2, ks3, ks4; \
+ R123_ASSERT(Nrounds<=72); \
+ ks4 = SKEIN_KS_PARITY##W; \
+ ks0 = k.v[0]; \
+ X0 = in.v[0] + ks0; \
+ ks4 ^= ks0; \
+ \
+ ks1 = k.v[1]; \
+ X1 = in.v[1] + ks1; \
+ ks4 ^= ks1; \
+ \
+ ks2 = k.v[2]; \
+ X2 = in.v[2] + ks2; \
+ ks4 ^= ks2; \
+ \
+ ks3 = k.v[3]; \
+ X3 = in.v[3] + ks3; \
+ ks4 ^= ks3; \
+ \
+ if(Nrounds>0){ \
+ X0 += X1; X1 = RotL_##W(X1,R_##W##x4_0_0); X1 ^= X0; \
+ X2 += X3; X3 = RotL_##W(X3,R_##W##x4_0_1); X3 ^= X2; \
+ } \
+ if(Nrounds>1){ \
+ X0 += X3; X3 = RotL_##W(X3,R_##W##x4_1_0); X3 ^= X0; \
+ X2 += X1; X1 = RotL_##W(X1,R_##W##x4_1_1); X1 ^= X2; \
+ } \
+ if(Nrounds>2){ \
+ X0 += X1; X1 = RotL_##W(X1,R_##W##x4_2_0); X1 ^= X0; \
+ X2 += X3; X3 = RotL_##W(X3,R_##W##x4_2_1); X3 ^= X2; \
+ } \
+ if(Nrounds>3){ \
+ X0 += X3; X3 = RotL_##W(X3,R_##W##x4_3_0); X3 ^= X0; \
+ X2 += X1; X1 = RotL_##W(X1,R_##W##x4_3_1); X1 ^= X2; \
+ } \
+ if(Nrounds>3){ \
+ /* InjectKey(r=1) */ \
+ X0 += ks1; X1 += ks2; X2 += ks3; X3 += ks4; \
+ X3 += 1; /* XWCNT4-1 += r */ \
+ } \
+ \
+ if(Nrounds>4){ \
+ X0 += X1; X1 = RotL_##W(X1,R_##W##x4_4_0); X1 ^= X0; \
+ X2 += X3; X3 = RotL_##W(X3,R_##W##x4_4_1); X3 ^= X2; \
+ } \
+ if(Nrounds>5){ \
+ X0 += X3; X3 = RotL_##W(X3,R_##W##x4_5_0); X3 ^= X0; \
+ X2 += X1; X1 = RotL_##W(X1,R_##W##x4_5_1); X1 ^= X2; \
+ } \
+ if(Nrounds>6){ \
+ X0 += X1; X1 = RotL_##W(X1,R_##W##x4_6_0); X1 ^= X0; \
+ X2 += X3; X3 = RotL_##W(X3,R_##W##x4_6_1); X3 ^= X2; \
+ } \
+ if(Nrounds>7){ \
+ X0 += X3; X3 = RotL_##W(X3,R_##W##x4_7_0); X3 ^= X0; \
+ X2 += X1; X1 = RotL_##W(X1,R_##W##x4_7_1); X1 ^= X2; \
+ } \
+ if(Nrounds>7){ \
+ /* InjectKey(r=2) */ \
+ X0 += ks2; X1 += ks3; X2 += ks4; X3 += ks0; \
+ X3 += 2; /* XWCNT4-1 += r */ \
+ } \
+ \
+ if(Nrounds>8){ \
+ X0 += X1; X1 = RotL_##W(X1,R_##W##x4_0_0); X1 ^= X0; \
+ X2 += X3; X3 = RotL_##W(X3,R_##W##x4_0_1); X3 ^= X2; \
+ } \
+ if(Nrounds>9){ \
+ X0 += X3; X3 = RotL_##W(X3,R_##W##x4_1_0); X3 ^= X0; \
+ X2 += X1; X1 = RotL_##W(X1,R_##W##x4_1_1); X1 ^= X2; \
+ } \
+ if(Nrounds>10){ \
+ X0 += X1; X1 = RotL_##W(X1,R_##W##x4_2_0); X1 ^= X0; \
+ X2 += X3; X3 = RotL_##W(X3,R_##W##x4_2_1); X3 ^= X2; \
+ } \
+ if(Nrounds>11){ \
+ X0 += X3; X3 = RotL_##W(X3,R_##W##x4_3_0); X3 ^= X0; \
+ X2 += X1; X1 = RotL_##W(X1,R_##W##x4_3_1); X1 ^= X2; \
+ } \
+ if(Nrounds>11){ \
+ /* InjectKey(r=3) */ \
+ X0 += ks3; X1 += ks4; X2 += ks0; X3 += ks1; \
+ X3 += 3; /* XWCNT4-1 += r */ \
+ } \
+ \
+ if(Nrounds>12){ \
+ X0 += X1; X1 = RotL_##W(X1,R_##W##x4_4_0); X1 ^= X0; \
+ X2 += X3; X3 = RotL_##W(X3,R_##W##x4_4_1); X3 ^= X2; \
+ } \
+ if(Nrounds>13){ \
+ X0 += X3; X3 = RotL_##W(X3,R_##W##x4_5_0); X3 ^= X0; \
+ X2 += X1; X1 = RotL_##W(X1,R_##W##x4_5_1); X1 ^= X2; \
+ } \
+ if(Nrounds>14){ \
+ X0 += X1; X1 = RotL_##W(X1,R_##W##x4_6_0); X1 ^= X0; \
+ X2 += X3; X3 = RotL_##W(X3,R_##W##x4_6_1); X3 ^= X2; \
+ } \
+ if(Nrounds>15){ \
+ X0 += X3; X3 = RotL_##W(X3,R_##W##x4_7_0); X3 ^= X0; \
+ X2 += X1; X1 = RotL_##W(X1,R_##W##x4_7_1); X1 ^= X2; \
+ } \
+ if(Nrounds>15){ \
+ /* InjectKey(r=1) */ \
+ X0 += ks4; X1 += ks0; X2 += ks1; X3 += ks2; \
+ X3 += 4; /* XWCNT4-1 += r */ \
+ } \
+ \
+ if(Nrounds>16){ \
+ X0 += X1; X1 = RotL_##W(X1,R_##W##x4_0_0); X1 ^= X0; \
+ X2 += X3; X3 = RotL_##W(X3,R_##W##x4_0_1); X3 ^= X2; \
+ } \
+ if(Nrounds>17){ \
+ X0 += X3; X3 = RotL_##W(X3,R_##W##x4_1_0); X3 ^= X0; \
+ X2 += X1; X1 = RotL_##W(X1,R_##W##x4_1_1); X1 ^= X2; \
+ } \
+ if(Nrounds>18){ \
+ X0 += X1; X1 = RotL_##W(X1,R_##W##x4_2_0); X1 ^= X0; \
+ X2 += X3; X3 = RotL_##W(X3,R_##W##x4_2_1); X3 ^= X2; \
+ } \
+ if(Nrounds>19){ \
+ X0 += X3; X3 = RotL_##W(X3,R_##W##x4_3_0); X3 ^= X0; \
+ X2 += X1; X1 = RotL_##W(X1,R_##W##x4_3_1); X1 ^= X2; \
+ } \
+ if(Nrounds>19){ \
+ /* InjectKey(r=1) */ \
+ X0 += ks0; X1 += ks1; X2 += ks2; X3 += ks3; \
+ X3 += 5; /* XWCNT4-1 += r */ \
+ } \
+ \
+ if(Nrounds>20){ \
+ X0 += X1; X1 = RotL_##W(X1,R_##W##x4_4_0); X1 ^= X0; \
+ X2 += X3; X3 = RotL_##W(X3,R_##W##x4_4_1); X3 ^= X2; \
+ } \
+ if(Nrounds>21){ \
+ X0 += X3; X3 = RotL_##W(X3,R_##W##x4_5_0); X3 ^= X0; \
+ X2 += X1; X1 = RotL_##W(X1,R_##W##x4_5_1); X1 ^= X2; \
+ } \
+ if(Nrounds>22){ \
+ X0 += X1; X1 = RotL_##W(X1,R_##W##x4_6_0); X1 ^= X0; \
+ X2 += X3; X3 = RotL_##W(X3,R_##W##x4_6_1); X3 ^= X2; \
+ } \
+ if(Nrounds>23){ \
+ X0 += X3; X3 = RotL_##W(X3,R_##W##x4_7_0); X3 ^= X0; \
+ X2 += X1; X1 = RotL_##W(X1,R_##W##x4_7_1); X1 ^= X2; \
+ } \
+ if(Nrounds>23){ \
+ /* InjectKey(r=1) */ \
+ X0 += ks1; X1 += ks2; X2 += ks3; X3 += ks4; \
+ X3 += 6; /* XWCNT4-1 += r */ \
+ } \
+ \
+ if(Nrounds>24){ \
+ X0 += X1; X1 = RotL_##W(X1,R_##W##x4_0_0); X1 ^= X0; \
+ X2 += X3; X3 = RotL_##W(X3,R_##W##x4_0_1); X3 ^= X2; \
+ } \
+ if(Nrounds>25){ \
+ X0 += X3; X3 = RotL_##W(X3,R_##W##x4_1_0); X3 ^= X0; \
+ X2 += X1; X1 = RotL_##W(X1,R_##W##x4_1_1); X1 ^= X2; \
+ } \
+ if(Nrounds>26){ \
+ X0 += X1; X1 = RotL_##W(X1,R_##W##x4_2_0); X1 ^= X0; \
+ X2 += X3; X3 = RotL_##W(X3,R_##W##x4_2_1); X3 ^= X2; \
+ } \
+ if(Nrounds>27){ \
+ X0 += X3; X3 = RotL_##W(X3,R_##W##x4_3_0); X3 ^= X0; \
+ X2 += X1; X1 = RotL_##W(X1,R_##W##x4_3_1); X1 ^= X2; \
+ } \
+ if(Nrounds>27){ \
+ /* InjectKey(r=1) */ \
+ X0 += ks2; X1 += ks3; X2 += ks4; X3 += ks0; \
+ X3 += 7; /* XWCNT4-1 += r */ \
+ } \
+ \
+ if(Nrounds>28){ \
+ X0 += X1; X1 = RotL_##W(X1,R_##W##x4_4_0); X1 ^= X0; \
+ X2 += X3; X3 = RotL_##W(X3,R_##W##x4_4_1); X3 ^= X2; \
+ } \
+ if(Nrounds>29){ \
+ X0 += X3; X3 = RotL_##W(X3,R_##W##x4_5_0); X3 ^= X0; \
+ X2 += X1; X1 = RotL_##W(X1,R_##W##x4_5_1); X1 ^= X2; \
+ } \
+ if(Nrounds>30){ \
+ X0 += X1; X1 = RotL_##W(X1,R_##W##x4_6_0); X1 ^= X0; \
+ X2 += X3; X3 = RotL_##W(X3,R_##W##x4_6_1); X3 ^= X2; \
+ } \
+ if(Nrounds>31){ \
+ X0 += X3; X3 = RotL_##W(X3,R_##W##x4_7_0); X3 ^= X0; \
+ X2 += X1; X1 = RotL_##W(X1,R_##W##x4_7_1); X1 ^= X2; \
+ } \
+ if(Nrounds>31){ \
+ /* InjectKey(r=1) */ \
+ X0 += ks3; X1 += ks4; X2 += ks0; X3 += ks1; \
+ X3 += 8; /* XWCNT4-1 += r */ \
+ } \
+ \
+ if(Nrounds>32){ \
+ X0 += X1; X1 = RotL_##W(X1,R_##W##x4_0_0); X1 ^= X0; \
+ X2 += X3; X3 = RotL_##W(X3,R_##W##x4_0_1); X3 ^= X2; \
+ } \
+ if(Nrounds>33){ \
+ X0 += X3; X3 = RotL_##W(X3,R_##W##x4_1_0); X3 ^= X0; \
+ X2 += X1; X1 = RotL_##W(X1,R_##W##x4_1_1); X1 ^= X2; \
+ } \
+ if(Nrounds>34){ \
+ X0 += X1; X1 = RotL_##W(X1,R_##W##x4_2_0); X1 ^= X0; \
+ X2 += X3; X3 = RotL_##W(X3,R_##W##x4_2_1); X3 ^= X2; \
+ } \
+ if(Nrounds>35){ \
+ X0 += X3; X3 = RotL_##W(X3,R_##W##x4_3_0); X3 ^= X0; \
+ X2 += X1; X1 = RotL_##W(X1,R_##W##x4_3_1); X1 ^= X2; \
+ } \
+ if(Nrounds>35){ \
+ /* InjectKey(r=1) */ \
+ X0 += ks4; X1 += ks0; X2 += ks1; X3 += ks2; \
+ X3 += 9; /* XWCNT4-1 += r */ \
+ } \
+ \
+ if(Nrounds>36){ \
+ X0 += X1; X1 = RotL_##W(X1,R_##W##x4_4_0); X1 ^= X0; \
+ X2 += X3; X3 = RotL_##W(X3,R_##W##x4_4_1); X3 ^= X2; \
+ } \
+ if(Nrounds>37){ \
+ X0 += X3; X3 = RotL_##W(X3,R_##W##x4_5_0); X3 ^= X0; \
+ X2 += X1; X1 = RotL_##W(X1,R_##W##x4_5_1); X1 ^= X2; \
+ } \
+ if(Nrounds>38){ \
+ X0 += X1; X1 = RotL_##W(X1,R_##W##x4_6_0); X1 ^= X0; \
+ X2 += X3; X3 = RotL_##W(X3,R_##W##x4_6_1); X3 ^= X2; \
+ } \
+ if(Nrounds>39){ \
+ X0 += X3; X3 = RotL_##W(X3,R_##W##x4_7_0); X3 ^= X0; \
+ X2 += X1; X1 = RotL_##W(X1,R_##W##x4_7_1); X1 ^= X2; \
+ } \
+ if(Nrounds>39){ \
+ /* InjectKey(r=1) */ \
+ X0 += ks0; X1 += ks1; X2 += ks2; X3 += ks3; \
+ X3 += 10; /* XWCNT4-1 += r */ \
+ } \
+ \
+ if(Nrounds>40){ \
+ X0 += X1; X1 = RotL_##W(X1,R_##W##x4_0_0); X1 ^= X0; \
+ X2 += X3; X3 = RotL_##W(X3,R_##W##x4_0_1); X3 ^= X2; \
+ } \
+ if(Nrounds>41){ \
+ X0 += X3; X3 = RotL_##W(X3,R_##W##x4_1_0); X3 ^= X0; \
+ X2 += X1; X1 = RotL_##W(X1,R_##W##x4_1_1); X1 ^= X2; \
+ } \
+ if(Nrounds>42){ \
+ X0 += X1; X1 = RotL_##W(X1,R_##W##x4_2_0); X1 ^= X0; \
+ X2 += X3; X3 = RotL_##W(X3,R_##W##x4_2_1); X3 ^= X2; \
+ } \
+ if(Nrounds>43){ \
+ X0 += X3; X3 = RotL_##W(X3,R_##W##x4_3_0); X3 ^= X0; \
+ X2 += X1; X1 = RotL_##W(X1,R_##W##x4_3_1); X1 ^= X2; \
+ } \
+ if(Nrounds>43){ \
+ /* InjectKey(r=1) */ \
+ X0 += ks1; X1 += ks2; X2 += ks3; X3 += ks4; \
+ X3 += 11; /* XWCNT4-1 += r */ \
+ } \
+ \
+ if(Nrounds>44){ \
+ X0 += X1; X1 = RotL_##W(X1,R_##W##x4_4_0); X1 ^= X0; \
+ X2 += X3; X3 = RotL_##W(X3,R_##W##x4_4_1); X3 ^= X2; \
+ } \
+ if(Nrounds>45){ \
+ X0 += X3; X3 = RotL_##W(X3,R_##W##x4_5_0); X3 ^= X0; \
+ X2 += X1; X1 = RotL_##W(X1,R_##W##x4_5_1); X1 ^= X2; \
+ } \
+ if(Nrounds>46){ \
+ X0 += X1; X1 = RotL_##W(X1,R_##W##x4_6_0); X1 ^= X0; \
+ X2 += X3; X3 = RotL_##W(X3,R_##W##x4_6_1); X3 ^= X2; \
+ } \
+ if(Nrounds>47){ \
+ X0 += X3; X3 = RotL_##W(X3,R_##W##x4_7_0); X3 ^= X0; \
+ X2 += X1; X1 = RotL_##W(X1,R_##W##x4_7_1); X1 ^= X2; \
+ } \
+ if(Nrounds>47){ \
+ /* InjectKey(r=1) */ \
+ X0 += ks2; X1 += ks3; X2 += ks4; X3 += ks0; \
+ X3 += 12; /* XWCNT4-1 += r */ \
+ } \
+ \
+ if(Nrounds>48){ \
+ X0 += X1; X1 = RotL_##W(X1,R_##W##x4_0_0); X1 ^= X0; \
+ X2 += X3; X3 = RotL_##W(X3,R_##W##x4_0_1); X3 ^= X2; \
+ } \
+ if(Nrounds>49){ \
+ X0 += X3; X3 = RotL_##W(X3,R_##W##x4_1_0); X3 ^= X0; \
+ X2 += X1; X1 = RotL_##W(X1,R_##W##x4_1_1); X1 ^= X2; \
+ } \
+ if(Nrounds>50){ \
+ X0 += X1; X1 = RotL_##W(X1,R_##W##x4_2_0); X1 ^= X0; \
+ X2 += X3; X3 = RotL_##W(X3,R_##W##x4_2_1); X3 ^= X2; \
+ } \
+ if(Nrounds>51){ \
+ X0 += X3; X3 = RotL_##W(X3,R_##W##x4_3_0); X3 ^= X0; \
+ X2 += X1; X1 = RotL_##W(X1,R_##W##x4_3_1); X1 ^= X2; \
+ } \
+ if(Nrounds>51){ \
+ /* InjectKey(r=1) */ \
+ X0 += ks3; X1 += ks4; X2 += ks0; X3 += ks1; \
+ X3 += 13; /* XWCNT4-1 += r */ \
+ } \
+ \
+ if(Nrounds>52){ \
+ X0 += X1; X1 = RotL_##W(X1,R_##W##x4_4_0); X1 ^= X0; \
+ X2 += X3; X3 = RotL_##W(X3,R_##W##x4_4_1); X3 ^= X2; \
+ } \
+ if(Nrounds>53){ \
+ X0 += X3; X3 = RotL_##W(X3,R_##W##x4_5_0); X3 ^= X0; \
+ X2 += X1; X1 = RotL_##W(X1,R_##W##x4_5_1); X1 ^= X2; \
+ } \
+ if(Nrounds>54){ \
+ X0 += X1; X1 = RotL_##W(X1,R_##W##x4_6_0); X1 ^= X0; \
+ X2 += X3; X3 = RotL_##W(X3,R_##W##x4_6_1); X3 ^= X2; \
+ } \
+ if(Nrounds>55){ \
+ X0 += X3; X3 = RotL_##W(X3,R_##W##x4_7_0); X3 ^= X0; \
+ X2 += X1; X1 = RotL_##W(X1,R_##W##x4_7_1); X1 ^= X2; \
+ } \
+ if(Nrounds>55){ \
+ /* InjectKey(r=1) */ \
+ X0 += ks4; X1 += ks0; X2 += ks1; X3 += ks2; \
+ X3 += 14; /* XWCNT4-1 += r */ \
+ } \
+ \
+ if(Nrounds>56){ \
+ X0 += X1; X1 = RotL_##W(X1,R_##W##x4_0_0); X1 ^= X0; \
+ X2 += X3; X3 = RotL_##W(X3,R_##W##x4_0_1); X3 ^= X2; \
+ } \
+ if(Nrounds>57){ \
+ X0 += X3; X3 = RotL_##W(X3,R_##W##x4_1_0); X3 ^= X0; \
+ X2 += X1; X1 = RotL_##W(X1,R_##W##x4_1_1); X1 ^= X2; \
+ } \
+ if(Nrounds>58){ \
+ X0 += X1; X1 = RotL_##W(X1,R_##W##x4_2_0); X1 ^= X0; \
+ X2 += X3; X3 = RotL_##W(X3,R_##W##x4_2_1); X3 ^= X2; \
+ } \
+ if(Nrounds>59){ \
+ X0 += X3; X3 = RotL_##W(X3,R_##W##x4_3_0); X3 ^= X0; \
+ X2 += X1; X1 = RotL_##W(X1,R_##W##x4_3_1); X1 ^= X2; \
+ } \
+ if(Nrounds>59){ \
+ /* InjectKey(r=1) */ \
+ X0 += ks0; X1 += ks1; X2 += ks2; X3 += ks3; \
+ X3 += 15; /* XWCNT4-1 += r */ \
+ } \
+ \
+ if(Nrounds>60){ \
+ X0 += X1; X1 = RotL_##W(X1,R_##W##x4_4_0); X1 ^= X0; \
+ X2 += X3; X3 = RotL_##W(X3,R_##W##x4_4_1); X3 ^= X2; \
+ } \
+ if(Nrounds>61){ \
+ X0 += X3; X3 = RotL_##W(X3,R_##W##x4_5_0); X3 ^= X0; \
+ X2 += X1; X1 = RotL_##W(X1,R_##W##x4_5_1); X1 ^= X2; \
+ } \
+ if(Nrounds>62){ \
+ X0 += X1; X1 = RotL_##W(X1,R_##W##x4_6_0); X1 ^= X0; \
+ X2 += X3; X3 = RotL_##W(X3,R_##W##x4_6_1); X3 ^= X2; \
+ } \
+ if(Nrounds>63){ \
+ X0 += X3; X3 = RotL_##W(X3,R_##W##x4_7_0); X3 ^= X0; \
+ X2 += X1; X1 = RotL_##W(X1,R_##W##x4_7_1); X1 ^= X2; \
+ } \
+ if(Nrounds>63){ \
+ /* InjectKey(r=1) */ \
+ X0 += ks1; X1 += ks2; X2 += ks3; X3 += ks4; \
+ X3 += 16; /* XWCNT4-1 += r */ \
+ } \
+ \
+ if(Nrounds>64){ \
+ X0 += X1; X1 = RotL_##W(X1,R_##W##x4_0_0); X1 ^= X0; \
+ X2 += X3; X3 = RotL_##W(X3,R_##W##x4_0_1); X3 ^= X2; \
+ } \
+ if(Nrounds>65){ \
+ X0 += X3; X3 = RotL_##W(X3,R_##W##x4_1_0); X3 ^= X0; \
+ X2 += X1; X1 = RotL_##W(X1,R_##W##x4_1_1); X1 ^= X2; \
+ } \
+ if(Nrounds>66){ \
+ X0 += X1; X1 = RotL_##W(X1,R_##W##x4_2_0); X1 ^= X0; \
+ X2 += X3; X3 = RotL_##W(X3,R_##W##x4_2_1); X3 ^= X2; \
+ } \
+ if(Nrounds>67){ \
+ X0 += X3; X3 = RotL_##W(X3,R_##W##x4_3_0); X3 ^= X0; \
+ X2 += X1; X1 = RotL_##W(X1,R_##W##x4_3_1); X1 ^= X2; \
+ } \
+ if(Nrounds>67){ \
+ /* InjectKey(r=1) */ \
+ X0 += ks2; X1 += ks3; X2 += ks4; X3 += ks0; \
+ X3 += 17; /* XWCNT4-1 += r */ \
+ } \
+ \
+ if(Nrounds>68){ \
+ X0 += X1; X1 = RotL_##W(X1,R_##W##x4_4_0); X1 ^= X0; \
+ X2 += X3; X3 = RotL_##W(X3,R_##W##x4_4_1); X3 ^= X2; \
+ } \
+ if(Nrounds>69){ \
+ X0 += X3; X3 = RotL_##W(X3,R_##W##x4_5_0); X3 ^= X0; \
+ X2 += X1; X1 = RotL_##W(X1,R_##W##x4_5_1); X1 ^= X2; \
+ } \
+ if(Nrounds>70){ \
+ X0 += X1; X1 = RotL_##W(X1,R_##W##x4_6_0); X1 ^= X0; \
+ X2 += X3; X3 = RotL_##W(X3,R_##W##x4_6_1); X3 ^= X2; \
+ } \
+ if(Nrounds>71){ \
+ X0 += X3; X3 = RotL_##W(X3,R_##W##x4_7_0); X3 ^= X0; \
+ X2 += X1; X1 = RotL_##W(X1,R_##W##x4_7_1); X1 ^= X2; \
+ } \
+ if(Nrounds>71){ \
+ /* InjectKey(r=1) */ \
+ X0 += ks3; X1 += ks4; X2 += ks0; X3 += ks1; \
+ X3 += 18; /* XWCNT4-1 += r */ \
+ } \
+ \
+ threefry4x##W##_ctr_t ret = {{X0, X1, X2, X3}}; \
+ return ret; \
+} \
+ \
+ /** @ingroup ThreefryNxW */ \
+enum r123_enum_threefry4x##W { threefry4x##W##_rounds = THREEFRY4x##W##_DEFAULT_ROUNDS }; \
+R123_CUDA_DEVICE R123_STATIC_INLINE R123_FORCE_INLINE(threefry4x##W##_ctr_t threefry4x##W(threefry4x##W##_ctr_t in, threefry4x##W##_key_t k)); \
+R123_CUDA_DEVICE R123_STATIC_INLINE \
+threefry4x##W##_ctr_t threefry4x##W(threefry4x##W##_ctr_t in, threefry4x##W##_key_t k){ \
+ return threefry4x##W##_R(threefry4x##W##_rounds, in, k); \
+}
+
+#if R123_USE_64BIT
+_threefry2x_tpl(64)
+_threefry4x_tpl(64)
+#endif
+_threefry2x_tpl(32)
+_threefry4x_tpl(32)
+
+/* gcc4.5 and 4.6 seem to optimize a macro-ized threefryNxW better
+ than a static inline function. Why? */
+#define threefry2x32(c,k) threefry2x32_R(threefry2x32_rounds, c, k)
+#define threefry4x32(c,k) threefry4x32_R(threefry4x32_rounds, c, k)
+#define threefry2x64(c,k) threefry2x64_R(threefry2x64_rounds, c, k)
+#define threefry4x64(c,k) threefry4x64_R(threefry4x64_rounds, c, k)
+
+#if defined(__cplusplus)
+#define _threefryNxWclass_tpl(NxW) \
+namespace r123{ \
+template<unsigned int ROUNDS> \
+ struct Threefry##NxW##_R{ \
+ typedef threefry##NxW##_ctr_t ctr_type; \
+ typedef threefry##NxW##_key_t key_type; \
+ typedef threefry##NxW##_key_t ukey_type; \
+ static const R123_METAL_CONSTANT_ADDRESS_SPACE unsigned int rounds=ROUNDS; \
+ inline R123_CUDA_DEVICE R123_FORCE_INLINE(ctr_type operator()(ctr_type ctr, key_type key)){ \
+ R123_STATIC_ASSERT(ROUNDS<=72, "threefry is only unrolled up to 72 rounds\n"); \
+ return threefry##NxW##_R(ROUNDS, ctr, key); \
+ } \
+}; \
+ typedef Threefry##NxW##_R<threefry##NxW##_rounds> Threefry##NxW; \
+} // namespace r123
+
+_threefryNxWclass_tpl(2x32)
+_threefryNxWclass_tpl(4x32)
+#if R123_USE_64BIT
+_threefryNxWclass_tpl(2x64)
+_threefryNxWclass_tpl(4x64)
+#endif
+
+/* The _tpl macros don't quite work to do string-pasting inside comments.
+ so we just write out the boilerplate documentation four times... */
+
+/**
+@defgroup ThreefryNxW Threefry Classes and Typedefs
+
+The ThreefryNxW classes export the member functions, typedefs and
+operator overloads required by a @ref CBRNG "CBRNG" class.
+
+As described in
+<a href="http://dl.acm.org/citation.cfm?doid=2063405"><i>Parallel Random Numbers: As Easy as 1, 2, 3</i> </a>,
+the Threefry family is closely related to the Threefish block cipher from
+<a href="http://www.skein-hash.info/"> Skein Hash Function</a>.
+Threefry is \b not suitable for cryptographic use.
+
+Threefry uses integer addition, bitwise rotation, xor and permutation of words to randomize its output.
+
+@class r123::Threefry2x32_R
+@ingroup ThreefryNxW
+
+exports the member functions, typedefs and operator overloads required by a @ref CBRNG "CBRNG" class.
+
+The template argument, ROUNDS, is the number of times the Threefry round
+function will be applied.
+
+As of September 2011, the authors know of no statistical flaws with
+ROUNDS=13 or more for Threefry2x32.
+
+@typedef r123::Threefry2x32
+@ingroup ThreefryNxW
+ Threefry2x32 is equivalent to Threefry2x32_R<20>. With 20 rounds,
+ Threefry2x32 has a considerable safety margin over the minimum number
+ of rounds with no known statistical flaws, but still has excellent
+ performance.
+
+@class r123::Threefry2x64_R
+@ingroup ThreefryNxW
+
+exports the member functions, typedefs and operator overloads required by a @ref CBRNG "CBRNG" class.
+
+The template argument, ROUNDS, is the number of times the Threefry round
+function will be applied.
+
+In November 2011, the authors discovered that 13 rounds of
+Threefry2x64 sequenced by strided, interleaved key and counter
+increments failed a very long (longer than the default BigCrush
+length) WeightDistrub test. At the same time, it was confirmed that
+14 rounds passes much longer tests (up to 5x10^12 samples) of a
+similar nature. The authors know of no statistical flaws with
+ROUNDS=14 or more for Threefry2x64.
+
+@typedef r123::Threefry2x64
+@ingroup ThreefryNxW
+ Threefry2x64 is equivalent to Threefry2x64_R<20>. With 20 rounds,
+ Threefry2x64 has a considerable safety margin over the minimum number
+ of rounds with no known statistical flaws, but still has excellent
+ performance.
+
+
+
+@class r123::Threefry4x32_R
+@ingroup ThreefryNxW
+
+exports the member functions, typedefs and operator overloads required by a @ref CBRNG "CBRNG" class.
+
+The template argument, ROUNDS, is the number of times the Threefry round
+function will be applied.
+
+As of September 2011, the authors know of no statistical flaws with
+ROUNDS=12 or more for Threefry4x32.
+
+@typedef r123::Threefry4x32
+@ingroup ThreefryNxW
+ Threefry4x32 is equivalent to Threefry4x32_R<20>. With 20 rounds,
+ Threefry4x32 has a considerable safety margin over the minimum number
+ of rounds with no known statistical flaws, but still has excellent
+ performance.
+
+
+
+@class r123::Threefry4x64_R
+@ingroup ThreefryNxW
+
+exports the member functions, typedefs and operator overloads required by a @ref CBRNG "CBRNG" class.
+
+The template argument, ROUNDS, is the number of times the Threefry round
+function will be applied.
+
+As of September 2011, the authors know of no statistical flaws with
+ROUNDS=12 or more for Threefry4x64.
+
+@typedef r123::Threefry4x64
+@ingroup ThreefryNxW
+ Threefry4x64 is equivalent to Threefry4x64_R<20>. With 20 rounds,
+ Threefry4x64 has a considerable safety margin over the minimum number
+ of rounds with no known statistical flaws, but still has excellent
+ performance.
+*/
+
+#endif
+
+#endif
diff --git a/include/Random123/u01fixedpt.h b/include/Random123/u01fixedpt.h
@@ -0,0 +1,200 @@
+/*
+Copyright 2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+ notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions, and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+#ifndef _random123_ufixed01_dot_h_
+#define _random123_ufixed01_dot_h_
+
+#include "features/compilerfeatures.h"
+
+/** @defgroup u01fixedpt The u01fixedpt conversion functions
+
+ These functions convert unsigned W-bit integers to uniformly
+ spaced real values (float or double) between 0.0 and 1.0 with
+ mantissas of M bits.
+
+ PLEASE THINK CAREFULLY BEFORE USING THESE FUNCTIONS. THEY MAY
+ NOT BE WHAT YOU WANT. YOU MAY BE MUCH BETTER SERVED BY THE
+ FUNCTIONS IN ./uniform.hpp.
+
+ These functions produce a finite number *uniformly spaced* values
+ in the range from 0.0 to 1.0 with uniform probability. The price
+ of uniform spacing is that they may not utilize the entire space
+ of possible outputs. E.g., u01fixedpt_closed_open_32_24 will never
+ produce a non-zero value less than 2^-24, even though such values
+ are representable in single-precision floating point.
+
+ There are 12 functions, corresponding to the following choices:
+
+ - W = 32 or 64
+ - M = 24 (float) or 53 (double)
+ - open0 or closed0 : whether the output is open or closed at 0.0
+ - open1 or closed1 : whether the output is open or closed at 1.0
+
+ The W=64 M=24 cases are not implemented. To obtain an M=24 float
+ from a uint64_t, use a cast (possibly with right-shift and bitwise
+ and) to convert some of the bits of the uint64_t to a uint32_t and
+ then use u01fixedpt_x_y_32_float. Note that the 64-bit random integers
+ produced by the Random123 library are random in "all the bits", so
+ with a little extra effort you can obtain two floats this way --
+ one from the high bits and one from the low bits of the 64-bit
+ value.
+
+ If the output is open at one end, then the extreme
+ value (0.0 or 1.0) will never be returned. Conversely, if the output
+ is closed at one end, then the extreme value is a possible
+ return value.
+
+ The values returned are as follows. All values are returned
+ with equal frequency, except as noted in the closed_closed case:
+
+ closed_open: Let P=min(M,W)
+ there are 2^P possible output values:
+ {0, 1, 2, ..., 2^P-1}/2^P
+
+ open_closed: Let P=min(M,W)
+ there are 2^P possible values:
+ {1, 2, ..., 2^P}/2^P
+
+ open_open: Let P=min(M, W+1)
+ there are 2^(P-1) possible values:
+ {1, 3, 5, ..., 2^P-1}/2^P
+
+ closed_closed: Let P=min(M, W-1)
+ there are 1+2^P possible values:
+ {0, 1, 2, ... 2^P}/2^P
+ The extreme values (0.0 and 1.0) are
+ returned with half the frequency of
+ all others.
+
+ On x86 hardware, especially on 32bit machines, the use of
+ internal 80bit x87-style floating point may result in
+ 'bonus' precision, which may cause closed intervals to not
+ be really closed, i.e. the conversions below might not
+ convert UINT{32,64}_MAX to 1.0. This sort of issue is
+ likely to occur when storing the output of a u01fixedpt_*_32_float
+ function in a double, though one can imagine getting extra
+ precision artifacts when going from 64_53 as well. Other
+ artifacts may exist on some GPU hardware. The tests in
+ kat_u01_main.h try to expose such issues, but caveat emptor.
+
+ @cond HIDDEN_FROM_DOXYGEN
+ */
+
+/* Hex floats were standardized by C in 1999, but weren't standardized
+ by C++ until 2011. So, we're obliged to write out our constants in
+ decimal, even though they're most naturally expressed in binary.
+ We cross our fingers and hope that the compiler does the compile-time
+ constant arithmetic properly.
+*/
+#define R123_0x1p_31f (1.f/(1024.f*1024.f*1024.f*2.f))
+#define R123_0x1p_24f (128.f*R123_0x1p_31f)
+#define R123_0x1p_23f (256.f*R123_0x1p_31f)
+#define R123_0x1p_32 (1./(1024.*1024.*1024.*4.))
+#define R123_0x1p_63 (2.*R123_0x1p_32*R123_0x1p_32)
+#define R123_0x1p_53 (1024.*R123_0x1p_63)
+#define R123_0x1p_52 (2048.*R123_0x1p_63)
+
+/** @endcond */
+
+#ifndef R123_USE_U01_DOUBLE
+#define R123_USE_U01_DOUBLE 1
+#endif
+
+#ifdef __cplusplus
+extern "C"{
+#endif
+
+/* narrowing conversions: uint32_t to float */
+R123_CUDA_DEVICE R123_STATIC_INLINE float u01fixedpt_closed_closed_32_float(uint32_t i){
+ /* N.B. we ignore the high bit, so output is not monotonic */
+ return ((i&0x7fffffc0) + (i&0x40))*R123_0x1p_31f; /* 0x1.p-31f */
+}
+
+R123_CUDA_DEVICE R123_STATIC_INLINE float u01fixedpt_closed_open_32_float(uint32_t i){
+ return (i>>8)*R123_0x1p_24f; /* 0x1.0p-24f; */
+}
+
+R123_CUDA_DEVICE R123_STATIC_INLINE float u01fixedpt_open_closed_32_float(uint32_t i){
+ return (1+(i>>8))*R123_0x1p_24f; /* *0x1.0p-24f; */
+}
+
+R123_CUDA_DEVICE R123_STATIC_INLINE float u01fixedpt_open_open_32_float(uint32_t i){
+ return (0.5f+(i>>9))*R123_0x1p_23f; /* 0x1.p-23f; */
+}
+
+#if R123_USE_U01_DOUBLE
+/* narrowing conversions: uint64_t to double */
+R123_CUDA_DEVICE R123_STATIC_INLINE double u01fixedpt_closed_closed_64_double(uint64_t i){
+ /* N.B. we ignore the high bit, so output is not monotonic */
+ return ((i&R123_64BIT(0x7ffffffffffffe00)) + (i&0x200))*R123_0x1p_63; /* 0x1.p-63; */
+}
+
+R123_CUDA_DEVICE R123_STATIC_INLINE double u01fixedpt_closed_open_64_double(uint64_t i){
+ return (i>>11)*R123_0x1p_53; /* 0x1.0p-53; */
+}
+
+R123_CUDA_DEVICE R123_STATIC_INLINE double u01fixedpt_open_closed_64_double(uint64_t i){
+ return (1+(i>>11))*R123_0x1p_53; /* 0x1.0p-53; */
+}
+
+R123_CUDA_DEVICE R123_STATIC_INLINE double u01fixedpt_open_open_64_double(uint64_t i){
+ return (0.5+(i>>12))*R123_0x1p_52; /* 0x1.0p-52; */
+}
+
+/* widening conversions: u32 to double */
+R123_CUDA_DEVICE R123_STATIC_INLINE double u01fixedpt_closed_closed_32_double(uint32_t i){
+ /* j = i+(i&1) takes on 2^31+1 possible values with a 'trapezoid' distribution:
+ p_j = 1 0 2 0 2 .... 2 0 2 0 1
+ j = 0 1 2 3 4 .... 2^32
+ by converting to double *before* doing the add, we don't wrap the high bit.
+ */
+ return (((double)(i&1)) + i)*R123_0x1p_32; /* 0x1.p-32; */
+}
+
+R123_CUDA_DEVICE R123_STATIC_INLINE double u01fixedpt_closed_open_32_double(uint32_t i){
+ return i*R123_0x1p_32; /* 0x1.p-32; */
+}
+
+R123_CUDA_DEVICE R123_STATIC_INLINE double u01fixedpt_open_closed_32_double(uint32_t i){
+ return (1.+i)*R123_0x1p_32; /* 0x1.p-32; */
+}
+
+R123_CUDA_DEVICE R123_STATIC_INLINE double u01fixedpt_open_open_32_double(uint32_t i){
+ return (0.5+i)*R123_0x1p_32; /* 0x1.p-32; */
+}
+#endif /* R123_USE_U01_DOUBLE */
+
+#ifdef __cplusplus
+}
+#endif
+
+/** @} */
+#endif
diff --git a/include/Random123/uniform.hpp b/include/Random123/uniform.hpp
@@ -0,0 +1,310 @@
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+ notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions, and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+#ifndef __r123_uniform_dot_hpp
+#define __r123_uniform_dot_hpp
+
+/** @defgroup uniform Uniform distribution scalar conversion functions
+
+This file provides some simple functions that can be used to convert
+integers of various widths to floats and doubles with various
+characteristics. It can be used to generate real-valued, uniformly
+distributed random variables from the random integers produced by
+the Random123 CBRNGs.
+
+There are three templated functions:
+
+ - u01: output is as dense as possible in (0,1}, never 0.0. May
+ return 1.0 if and only if the number of output mantissa bits
+ is less than the width of the input.
+
+ - uneg11: output is as dense as possible in {-1,1}, never 0.0. May
+ return 1.0 or -1.0 if and only if the number of output mantissa bits
+ is less than the width of the input.
+
+ - u01fixedpt: output is "fixed point", equispaced, open at both ends,
+ and is never 0.0, 0.5 nor 1.0.
+
+The behavior of u01 and uneg11 depend on the pre-processor symbol:
+R123_UNIFORM_FLOAT_STORE. When #defined to a non-zero value, u01
+and uneg11 declare a volatile intermediate result, with the
+intention of forcing architectures that have "extra bits" in their
+floating point registers to more closely conform to IEEE
+arithmetic. When compiled this way, u01 and uneg11 will be
+significantly slower, as they will incur a memory write and read on
+every call. Without it, they may fail the "known answer test"
+implemented in ut_uniform_IEEEkat.cpp even though they perform
+perfectly reasonable int to float conversions. We have used
+this option to get 32-bit x86 to produce the same results as
+64-bit x86-64 code, but we do not recommend it for normal
+use.
+
+Three additional functions are defined when C++11 or newer is in use:
+
+ - u01all
+ - uneg11all
+ - u01fixedptall
+
+These functions apply the corresponding conversion to every
+element of their argument, which must be a staticly sized
+array, e.g., an r123array or a std::array of an integer type.
+
+This file may not be as portable, and has not been tested as
+rigorously as other files in the library, e.g., the generators.
+Nevertheless, we hope it is useful and we encourage developers to
+copy it and modify it for their own use. We invite comments and
+improvements.
+*/
+
+#include <Random123/features/compilerfeatures.h>
+#include <limits>
+#if R123_USE_CXX11_TYPE_TRAITS
+#include <type_traits>
+#endif
+#if __cplusplus >= 201103L
+#include <array>
+#endif
+
+namespace r123{
+/**
+@{
+@cond HIDDEN_FROM_DOXYGEN
+*/
+
+#if R123_USE_CXX11_TYPE_TRAITS
+using std::make_signed;
+using std::make_unsigned;
+#else
+// Sigh... We could try to find another <type_traits>, e.g., from
+// boost or TR1. Or we can do it ourselves in the r123 namespace.
+// It's not clear which will cause less headache...
+template <typename T> struct make_signed{};
+template <typename T> struct make_unsigned{};
+#define R123_MK_SIGNED_UNSIGNED(ST, UT) \
+template<> struct make_signed<ST>{ typedef ST type; }; \
+template<> struct make_signed<UT>{ typedef ST type; }; \
+template<> struct make_unsigned<ST>{ typedef UT type; }; \
+template<> struct make_unsigned<UT>{ typedef UT type; }
+
+R123_MK_SIGNED_UNSIGNED(int8_t, uint8_t);
+R123_MK_SIGNED_UNSIGNED(int16_t, uint16_t);
+R123_MK_SIGNED_UNSIGNED(int32_t, uint32_t);
+R123_MK_SIGNED_UNSIGNED(int64_t, uint64_t);
+#if R123_USE_GNU_UINT128
+R123_MK_SIGNED_UNSIGNED(__int128_t, __uint128_t);
+#endif
+#undef R123_MK_SIGNED_UNSIGNED
+#endif
+
+#if defined(__CUDACC__) || defined(_LIBCPP_HAS_NO_CONSTEXPR)
+// Amazing! cuda thinks numeric_limits::max() is a __host__ function, so
+// we can't use it in a device function.
+//
+// The LIBCPP_HAS_NO_CONSTEXP test catches situations where the libc++
+// library thinks that the compiler doesn't support constexpr, but we
+// think it does. As a consequence, the library declares
+// numeric_limits::max without constexpr. This workaround should only
+// affect a narrow range of compiler/library pairings.
+//
+// In both cases, we find max() by computing ~(unsigned)0 right-shifted
+// by is_signed.
+template <typename T>
+R123_CONSTEXPR R123_STATIC_INLINE R123_CUDA_DEVICE T maxTvalue(){
+ typedef typename make_unsigned<T>::type uT;
+ return (~uT(0)) >> std::numeric_limits<T>::is_signed;
+ }
+#else
+template <typename T>
+R123_CONSTEXPR R123_STATIC_INLINE T maxTvalue(){
+ return std::numeric_limits<T>::max();
+}
+#endif
+/** @endcond
+ @}
+ */
+
+//! Return a uniform real value in (0, 1]
+/**
+ @ingroup uniform
+ Input is a W-bit integer (signed or unsigned). It is cast to
+ a W-bit unsigned integer, multiplied by Ftype(2^-W) and added to
+ Ftype(2^(-W-1)). A good compiler should optimize it down to an
+ int-to-float conversion followed by a multiply and an add, which
+ might be fused, depending on the architecture.
+
+ If the input is a uniformly distributed integer, and if Ftype
+ arithmetic follows IEEE754 round-to-nearest rules, then the
+ result is a uniformly distributed floating point number in (0, 1].
+
+- The result is never exactly 0.0.
+- The smallest value returned is 2^-(W-1).
+- Let M be the number of mantissa bits in Ftype (typically 24 or 53).
+ - If W>M then the largest value retured is 1.0.
+ - If W<=M then the largest value returned is Ftype(1.0 - 2^(-W-1)).
+*/
+template <typename Ftype, typename Itype>
+R123_CUDA_DEVICE R123_STATIC_INLINE Ftype u01(Itype in){
+ typedef typename make_unsigned<Itype>::type Utype;
+ R123_CONSTEXPR Ftype factor = Ftype(1.)/(Ftype(maxTvalue<Utype>()) + Ftype(1.));
+ R123_CONSTEXPR Ftype halffactor = Ftype(0.5)*factor;
+#if R123_UNIFORM_FLOAT_STORE
+ volatile Ftype x = Utype(in)*factor; return x+halffactor;
+#else
+ return Utype(in)*factor + halffactor;
+#endif
+}
+
+//! Return a signed value in [-1,1]
+/**
+ @ingroup uniform
+ The argument is converted to a W-bit signed integer, multiplied by Ftype(2^-(W-1)) and
+ then added to Ftype(2^-W). A good compiler should optimize
+ it down to an int-to-float conversion followed by a multiply and
+ an add, which might be fused, depending on the architecture.
+
+ If the input is a uniformly distributed integer, and if Ftype
+ arithmetic follows IEEE754 round-to-nearest rules, then the
+ output is a uniformly distributed floating point number in [-1, 1].
+
+- The result is never exactly 0.0.
+- The smallest absolute value returned is 2^-W
+- Let M be the number of mantissa bits in Ftype.
+ - If W>M then the largest value retured is 1.0 and the smallest is -1.0.
+ - If W<=M then the largest value returned is the Ftype(1.0 - 2^-W)
+ and the smallest value returned is -Ftype(1.0 - 2^-W).
+*/
+template <typename Ftype, typename Itype>
+R123_CUDA_DEVICE R123_STATIC_INLINE Ftype uneg11(Itype in){
+ typedef typename make_signed<Itype>::type Stype;
+ R123_CONSTEXPR Ftype factor = Ftype(1.)/(Ftype(maxTvalue<Stype>()) + Ftype(1.));
+ R123_CONSTEXPR Ftype halffactor = Ftype(0.5)*factor;
+#if R123_UNIFORM_FLOAT_STORE
+ volatile Ftype x = Stype(in)*factor; return x+halffactor;
+#else
+ return Stype(in)*factor + halffactor;
+#endif
+}
+
+//! Return a value in (0,1) chosen from a set of equally spaced fixed-point values
+/**
+ @ingroup uniform
+ Let:
+ - W = width of Itype, e.g., 32 or 64, regardless of signedness.
+ - M = mantissa bits of Ftype, e.g., 24, 53 or 64
+ - B = min(M, W)
+
+ Then the 2^(B-1) possible output values are: 2^-B*{1, 3, 5, ..., 2^B - 1}
+
+ The smallest output is: 2^-B
+
+ The largest output is: 1 - 2^-B
+
+ The output is never exactly 0.0, nor 0.5, nor 1.0.
+
+ The 2^(B-1) possible outputs:
+ - are equally likely,
+ - are uniformly spaced by 2^-(B-1),
+ - are balanced around 0.5
+*/
+template <typename Ftype, typename Itype>
+R123_CUDA_DEVICE R123_STATIC_INLINE Ftype u01fixedpt(Itype in){
+ typedef typename make_unsigned<Itype>::type Utype;
+ R123_CONSTEXPR int excess = std::numeric_limits<Utype>::digits - std::numeric_limits<Ftype>::digits;
+ if(excess>=0){
+ R123_CONSTEXPR int ex_nowarn = (excess>=0) ? excess : 0;
+ R123_CONSTEXPR Ftype factor = Ftype(1.)/(Ftype(1.) + Ftype((maxTvalue<Utype>()>>ex_nowarn)));
+ return (1 | (Utype(in)>>ex_nowarn)) * factor;
+ }else
+ return u01<Ftype>(in);
+}
+
+#if R123_USE_CXX11_STD_ARRAY
+
+//! Apply u01 to every item in an r123array, returning a std::array
+/** @ingroup uniform
+ * Only in C++11 and newer.
+ * The argument type may be any integer collection with a constexpr static_size member,
+ * e.g., an r123array or a std::array of an integer type.
+ */
+template <typename Ftype, typename CollType>
+static inline
+std::array<Ftype, CollType::static_size> u01all(CollType in)
+{
+ std::array<Ftype, CollType::static_size> ret;
+ auto p = ret.begin();
+ for(auto e : in){
+ *p++ = u01<Ftype>(e);
+ }
+ return ret;
+}
+
+//! Apply uneg11 to every item in an r123array, returning a std::array
+/** @ingroup uniform
+ * Only in C++11 and newer.
+ * The argument type may be any integer collection with a constexpr static_size member,
+ * e.g., an r123array or a std::array of an integer type.
+ */
+template <typename Ftype, typename CollType>
+static inline
+std::array<Ftype, CollType::static_size> uneg11all(CollType in)
+{
+ std::array<Ftype, CollType::static_size> ret;
+ auto p = ret.begin();
+ for(auto e : in){
+ *p++ = uneg11<Ftype>(e);
+ }
+ return ret;
+}
+
+//! Apply u01fixedpt to every item in an r123array, returning a std::array
+/** @ingroup uniform
+ * Only in C++11 and newer.
+ * The argument type may be any integer collection with a constexpr static_size member,
+ * e.g., an r123array or a std::array of an integer type.
+*/
+template <typename Ftype, typename CollType>
+static inline
+std::array<Ftype, CollType::static_size> u01fixedptall(CollType in)
+{
+ std::array<Ftype, CollType::static_size> ret;
+ auto p = ret.begin();
+ for(auto e : in){
+ *p++ = u01fixedpt<Ftype>(e);
+ }
+ return ret;
+}
+#endif // __cplusplus >= 201103L
+
+} // namespace r123
+
+#endif
+
diff --git a/tests/BUILDVC.BAT b/tests/BUILDVC.BAT
@@ -0,0 +1,50 @@
+:: Call this with either x86 (for 32bit compile on a 32bit machine),
+:: amd64 (if you want to do a 64bit compile on a 64bit machine),
+:: or x86_amd64 (if you want to compile for amd64 on an x86)
+:: With no argument, will default to amd64 on Win64 and x86 otherwise.
+:: Call this with the argument "run" if you want to only run the
+:: previously compiled executables.
+@echo off
+setlocal
+if not "%1"=="run" goto :Default
+set CC=echo
+set CFLAGS=
+goto :Loop
+
+:Default
+if "%~1"=="" goto :Guess
+set NEWBUILDVC=%1
+goto :Next
+
+:Guess
+set RegQry=HKLM\Hardware\Description\System\CentralProcessor\0
+REG.exe Query %RegQry% > hwdesc.o
+FIND /i "x86" < hwdesc.o > hwcheck.o
+if %errorlevel% == 0 (
+set NEWBUILDVC=x86
+) else (
+set NEWBUILDVC=amd64
+)
+
+:Next
+if "%BUILDVC%"=="%NEWBUILDVC%" goto :Continue
+if NOT DEFINED VCBAT set VCBAT="c:\Program Files (x86)\Microsoft Visual Studio 10.0\vc\vcvarsall.bat"
+call %VCBAT% %NEWBUILDVC%
+if errorlevel 1 exit /b 1
+set BUILDVC=%NEWBUILDVC%
+
+:Continue
+:: /Zi for debug. /favor:INTEL64 is ignored for 32bit compiles.
+if NOT DEFINED CFLAGS set CFLAGS=/DR123_NO_SINCOS=1 /I..\include /W3 /Ox /EHs /nologo /favor:INTEL64
+set CC=cl
+echo Using %VCBAT%
+echo Building for %BUILDVC% with %CC% %CFLAGS%
+
+:Loop
+set BUILDFILES= ( kat_c.c kat_cpp.cpp pi_aes.cpp pi_capi.c pi_cppapi.cpp pi_microurng.cpp simple.c simplepp.cpp time_serial.c time_boxmuller.cpp timers.cpp ut_Engine.cpp ut_M128.cpp ut_ReinterpretCtr.cpp ut_aes.cpp ut_ars.c ut_carray.cpp ut_features.cpp ut_uniform.cpp )
+FOR %%A IN %BUILDFILES% DO (
+ %CC% %CFLAGS% %%A
+ if errorlevel 1 exit /b 1
+ %%~nA
+ if errorlevel 1 exit /b 1 )
+endlocal
diff --git a/tests/BUILDVC11.BAT b/tests/BUILDVC11.BAT
@@ -0,0 +1,6 @@
+rem /DR123_USE_CXX11=1 will not work because VS2012 is not fully C++11 compliant yet.
+setlocal
+set CFLAGS=/I..\include /W3 /Ox /EHs /nologo /favor:INTEL64
+set VCBAT="c:\Program Files (x86)\Microsoft Visual Studio 11.0\vc\vcvarsall.bat"
+call BUILDVC.bat %1
+endlocal
diff --git a/tests/GNUmakefile b/tests/GNUmakefile
@@ -0,0 +1,172 @@
+no_target_specified: runcore
+ @echo
+ @echo The default make rule is equivalent to \'make runcore\' which runs only the most basic tests.
+ @echo The following \'meta-targets\' are available:
+ @echo " " $(meta_targets)
+ @echo Here is the complete list of individual program targets:
+ @echo " " $(all_primary_targets)
+ @echo Prepend \'run\' to any of the program targets or metatargets
+ @echo to run the binary and check for a zero exit status.
+ @echo Adding force=1 on the command line causes all targets to be considered out-of-date.
+.PHONY: no_target_specified
+
+# metatargets are variables which get mapped by METATARGET_template
+meta_targets:=kat core aesni timing c cpp gsl thread cuda opencl metal ut
+
+# Platform metatargets: each one typically has specific requirements in the build environment.
+# c is C99 (will work in MSVC), cpp is C++98, gsl requires the GNU Scientific Library
+# (specifically, the gsl-config program in the PATH), thread requires POSIX threads,
+# CUDA requires NVIDIA CUDA 3.x or newer, OpenCL requires OpenCL includes & libraries
+# (e.g. AMD APP SDK, NVIDIA SDK)
+c:=kat_c ut_ars time_serial
+cpp:=kat_cpp ut_carray ut_M128 ut_features ut_ReinterpretCtr ut_Engine ut_aes timers time_boxmuller ut_ua ut_uniform
+gsl:=ut_gsl
+thread:=time_thread
+cuda:=time_cuda kat_cuda time_boxmuller_cuda
+opencl:=time_opencl kat_opencl
+metal:=kat_metal
+
+# Convenience metatargets: these are to help developers test functional subsets across platforms
+kat:=kat_c kat_cpp
+core:=$(c) $(cpp)
+aesni:=ut_aes ut_ars
+timing:=timers time_serial time_thread
+# N.B. ut doesn't include ut_gsl, ut_ars or ut_aes
+ut:=ut_carray ut_Engine ut_features ut_M128 ut_ReinterpretCtr ut_ua ut_uniform ut_uniform_IEEEkat
+
+$(gsl) : override LDLIBS += `gsl-config --libs`
+$(gsl) : override CFLAGS += `gsl-config --cflags`
+
+$(opencl) : % : %_kernel.i
+# Or try this if we USE_GENCL in kat_opencl.c
+#$(opencl) : override CPPFLAGS += -DSRCDIR=\"$(dir $(abspath $<)).\"
+
+ifeq ($(shell uname),Darwin)
+$(opencl) : override LDLIBS+=-framework OpenCL
+else
+$(opencl) : override LDLIBS+=-lOpenCL
+endif
+$(opencl) : override CFLAGS+=-I.
+# Note, the Intel OpenCL SDK (1.5) has unresolved C++ symbols in its
+# libOpenCL.so Even though 'main' is a C program, you may need to link
+# it with a C++ compiler-driver, e.g., g++. Since this Makefile does
+# compile-and-link in one step, use something like:
+# $(opencl) : CC=g++ -xc
+# which will invoke the g++ compiler-driver, but will treat the
+# program as C rather than C++.
+
+# N.B. gcc -pthread (without the -l) on linux at compile time also
+# adds -D_REENTRANT. Unfortunately -pthread is unrecognized by
+# SunPRO. Posix says that -lpthread is portable (as if anyone cares
+# what Posix says), and it seems to work in all the environments we've
+# tested. Gcc's features.h says that _THREAD_SAFE is "often used by
+# other systems" as a synonym for _REENTRANT. Cross your fingers...
+$(thread) : override LDLIBS+=-lpthread
+$(thread) : override CPPFLAGS+=-D_REENTRANT=1 -D_THREAD_SAFE=1
+
+$(metal) : % : %_kernel.metallib
+$(metal) : override LDLIBS+=-framework Metal -framework Foundation -framework CoreGraphics
+
+all_primary_targets += $(addsuffix _kernel.i, $(opencl))
+all_primary_targets += $(addsuffix _kernel.metallib, $(metal))
+all_primary_targets += $(addsuffix _kernel.air, $(metal))
+
+################################################
+# Generic boilerplate from here down:
+vpath %.c $(srcdir/)
+vpath %.cpp $(srcdir/)
+vpath %.cu $(srcdir/)
+vpath %.ocl $(srcdir/)
+vpath %.metal $(srcdir/)
+
+define METATARGET_template
+.PHONY: $(1)
+$(1) : $(filter-out $(SKIP_TARGETS), $($(1)))
+.PHONY: run$(1)
+run$(1) : $(addprefix run, $(filter-out $(SKIP_TARGETS), $($(1))))
+all_primary_targets += $($(1))
+endef
+
+$(foreach T,$(meta_targets), $(eval $(call METATARGET_template,$(T))))
+
+# sort also does 'uniq'
+all_primary_targets:=$(sort $(all_primary_targets))
+
+INC=$(srcdir/)../include
+override CPPFLAGS += -I$(INC)
+
+ifndef NVCC
+NVCC:=nvcc
+endif
+# The rngs are *very* slow without optimization. In the simplest case,
+# where the user just calls 'make', we don't want them to see terrible
+# performance. Unfortunately, this might surprise someone
+# who says, e.g., make CPPFLAGS=-O0. Oh well...
+ifndef CFLAGS
+CFLAGS:=-O
+endif
+ifndef CXXFLAGS
+CXXFLAGS:=-O
+endif
+
+%.i : %.ocl
+ CC="$(CC)" CPPFLAGS="$(CPPFLAGS)" $(srcdir/)./gencl.sh $< > $@
+
+% : %.cu
+ $(NVCC) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH) $< $(LOADLIBES) $(LDLIBS) -o $@
+
+% : %.c
+ $(CC) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH) $< $(LOADLIBES) $(LDLIBS) -o $@
+
+% : %.cpp
+ $(CXX) $(CXXFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH) $< $(LOADLIBES) $(LDLIBS) -o $@
+
+% : %.m
+ $(CC) $(OBJCFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH) $< $(LOADLIBES) $(LDLIBS) -o $@
+
+%.air : %.metal
+ xcrun --sdk macosx metal $(CPPFLAGS) -c $< -o $@
+
+%.metallib : %.air
+ xcrun --sdk macosx metallib $< -o $@
+
+run% : %
+ ./$^ $(RUN_ARGS)
+
+# In lieu of autodepends, just say that all the compilation targets depend on all the headers.
+hdrs:=$(wildcard $(srcdir/)*.h $(srcdir/)gsl/*.c $(INC)/Random123/*.h $(INC)/Random123/*.hpp $(INC)/Random123/*/*.h $(INC)/Random123/*/*.hpp)
+misc:=$(wildcard $(srcdir/)*.cu $(srcdir/)*.ocl)
+$(all_primary_targets) : $(hdrs)
+$(misc) : $(hdrs)
+
+# If you put force=y on the command line, then $(all_primary_targets) will be
+# depend on FORCE, and hence will not be up-to-date.
+ifdef force
+$(all_primary_targets) : FORCE
+FORCE:
+endif
+
+.PHONY : echo_build_commands
+echo_build_commands:
+ make -n force=1 $(all_primary_targets) | grep -v 'is up to date'
+
+.PHONY : clean veryclean
+clean:
+ rm -f $(all_primary_targets)
+
+veryclean:
+ rm -f $(all_primary_targets) *.o \#* *~ *.pdb *.exe *.obj *.ilk *.suo
+
+.PHONY : install
+
+# N.B. normally these are exported by ../GNUmakefile
+prefix?=/usr/local
+datarootdir?=$(prefix)/share
+docdir?=$(datarootdir)/doc/Random123
+
+# Are 'tests/' "documentation" or "architecture independent data files"?
+# If the former, then they belong in $(docdir)/tests (aka /usr/local/share/doc/Random123/tests)
+# If the latter, then they belong in $(datarootdir)/Random123/tests (aka /usr/local/share/Random123/tests)
+install:
+ mkdir -p $(DESTDIR)$(docdir)/tests
+ cp README GNUmakefile BUILDVC* *kat_vectors* *.sh *.c *.h *.cpp *.cu *.metal *.m *.ocl $(DESTDIR)$(docdir)/tests
diff --git a/tests/README b/tests/README
@@ -0,0 +1,145 @@
+This file is examples/README and is also linked to from the doxygen main page.
+
+/**
+@page TestsREADME Tests and Benchmarks
+
+The tests/ directory contains tests and timing
+harnesses for the components of the Random123 library.
+
+<b>See @ref ExamplesREADME "../examples" for examples</b> of how to
+use the Random123 APIs in different contexts.
+
+The code in this directory (tests/) is not exemplary because it
+sacrifices readability to support many different generators (philox,
+threefry, ARS), programming models (C, C++, CUDA, OpenCL, Metal),
+compilers (gcc, clang, icc), hardware (Intel, ARM, NVidia), and
+operating systems (Linux, Windows, OSX).
+
+@section building Compiling and Running the code
+
+Installing and using Random123 requires only the use
+of the header files, and has no prerequisites other than
+a reasonable C99 or C++98 compiler.
+
+With a modern GNU make (3.80 or newer), building and running the core tests
+and examples can be as easy as running gmake with no arguments.
+Note, though, that the provided tests/GNUmakefile intentionally avoids setting
+any of the standard make variables: CC, CXX, CPPFLAGS, CFLAGS,
+CXXFLAGS, TARGET_ARCH, LDFLAGS, LOADLIBES, LDLIBS. GNU make
+will inherit settings for these variables from the environment,
+or they may be set on the command line. If none are set,
+compilation will proceed using system-wide default flags, generally
+without advanced optimization, architectural tuning, warnings, or other
+common options.
+
+Before putting the Random123 library to use in an application,
+it is important to test it using the same compiler flags and
+features that the application will use. In other words,
+the conventional make variables should be set
+the same way when testing the library as they will be set when the
+library is actually compiled into your application.
+Something like:
+@code
+gmake CFLAGS="-std=c99" CXXFLAGS="-std=c++0x" CPPFLAGS="/alternate/location/include -O3 -Wall -Wstrict-aliasing=2" TARGET_ARCH="-march=native"
+@endcode
+would confirm that all is well with optimization on, and output targeted at
+an architecture with the same capabilities as the machine running the compilation.
+
+Very old versions of GNU make (pre-2002) or non-GNU
+make will not work with tests/GNUmakefile.. Lacking a suitably modern GNU make,
+our advice is to invoke the
+C or C++ compiler directly on the source files in the tests/ directory.
+The file tests/BUILD.LOG contains a list of sample build commands. They
+will almost certainly need to be adapted to the target system.
+For Windows users, BUILDVC.BAT invokes the Microsoft
+Visual Studio compiler. Edit it as needed for your platform.
+
+
+@section tests Tests
+
+It is recommended that Random123 be tested <b> on the target system,
+with the target compiler, intended optimization levels, options,
+target architectures, etc.</b>
+before relying it. The library
+uses architecture- and compiler-specific intrinsics,
+features and assembly language. We have seen cases where
+one compiler (open64 version 4.2.4) masquerades as another compiler (it defines __GNUC__) accepts extensions
+specific to the other compiler (__uint128_t)
+without error or warning, and then silently produces incorrect code.
+The only way to guard against this kind of misbehavior is to
+compile and run the tests with the compiler and options that you intend to use and
+the platform that you intend to run on.
+
+@subsection kat Known Answer Tests
+
+Testing that your compiled code computes the same "Known Answers" as the
+reference implementation which has been subjected to the Crush batteries of
+statistical tests is critically important.
+
+The file \c tests/kat_vectors contains a few dozen "Known Answer
+Test" vectors, i.e., tuples of (method, counter, key, answer). The
+source file katc.c is incorporated into kat_c.c (C),
+kat_cpp.cpp (C++), kat_cuda.cu (CUDA) and kat_opencl.c
+(OpenCL), which are compiled into kat_c, kat_cpp, kat_cuda
+and kat_opencl, respectively. Each of these will read kat_vectors
+and verify that the compiled code obtains the same "known answers".
+
+The kat vectors are not language-specific. Implementations of CBRNGs in
+other languages could also be validated against \c kat_vectors. The
+kat vectors are also byte-order independent. In other
+words, the CBRNGs in the library should produce the same numerical
+results on little-endian and big-endian hardware, but this behavior
+is largely untested.
+
+@subsection ut Unit Tests
+
+tests/ also contains tests of specific components of the library. While not
+exhaustive, these tests verify that a variety of invariants are satisfied
+by the public methods (e.g., that incr(N) is the same as incr() N times). They
+also serve to verify some of the compile-time feature-test logic which, if incorrect can
+lead to mysterious errors (e.g., is it necessary to <c>#include <smmintrin.h></c>).
+Unit tests include:
+
+<ul>
+<li> ut_features - verifies compile-time feature-test logic.
+<li> ut_carray - verifies the capabilities of the @ref arrayNxW "r123arrayNxW" types.
+<li> ut_M128 - verifies the capabilities of the r123m128i type (only when SSE2 is available).
+<li> ut_ReinterpretCtr - verifies the r123::ReinterpretCtr wrapper template.
+<li> ut_Engine - verifies the capabilities of the r123::Engine wrapper template.
+<li> ut_aes - verifies that the @ref AESNI "AESNI" cbrngs match known answers from FIPS-197.
+<li> ut_gsl - tests the @ref GSL_CBRNG adapter <b>Requires the GNU Scientific Library</b>.
+</ul>
+
+@section timers Measuring performance
+
+We include some timing harnesses that can be used to measure
+the performance of these CBRNGs on various platforms. They report aggregate throughput
+in GB/sec: a direct
+measure of performance, but one that depends on clock speed
+and number of cores being used. They also report cpB (cycles-per-byte)
+if they are invoked with an environment variable. For example,
+<pre>
+<code>
+ env TIME_SERIAL_CPU_GHZ=3.2 ./time_serial
+</code>
+</pre>
+will report cpB assuming a 3.2GHz clock.
+
+<ul>
+<li> time_serial - uses the C API and reports performance for a
+single core.
+<li> timers - uses the C++ API, and is the only tool that reports
+AESNI1xm128i and ARS1xm128i performance (if your CPU supports the AES-NI instruction
+extensions).
+<li> time_thread - uses the C API and pthreads to report
+multithreaded performance. Uses TIME_THREAD_NTHREADS (or 12 if unset) threads.
+<li> time_cuda - uses the C API within NVIDIA CUDA to run on NVIDIA GPUs.
+<li> time_opencl - uses the C API within OpenCL to run on GPUs or CPUs.
+</ul>
+
+time_serial, time_thread, time_cuda, time_opencl all use a common
+kernel defined in time_random123.h. They all use various
+util_* header files for utility functions and platform-related
+boilerplate (also used by the pi_* examples).
+
+*/
diff --git a/tests/gencl.sh b/tests/gencl.sh
@@ -0,0 +1 @@
+../examples/gencl.sh
+\ No newline at end of file
diff --git a/tests/kat.h b/tests/kat.h
@@ -0,0 +1,70 @@
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+ notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions, and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+#ifndef __katdoth__
+#define __katdoth__
+
+#include <Random123/philox.h>
+#include <Random123/threefry.h>
+#include <Random123/ars.h>
+#include <Random123/aes.h>
+
+enum method_e{
+#define RNGNxW_TPL(base, N, W) base##N##x##W##_e,
+#include "rngNxW.h"
+#undef RNGNxW_TPL
+ last
+};
+
+#define RNGNxW_TPL(base, N, W) \
+ typedef struct { \
+ base##N##x##W##_ctr_t ctr; \
+ base##N##x##W##_ukey_t ukey; \
+ base##N##x##W##_ctr_t expected; \
+ base##N##x##W##_ctr_t computed; \
+ } base##N##x##W##_kat;
+#include "rngNxW.h"
+#undef RNGNxW_TPL
+
+typedef struct{
+ enum method_e method;
+ unsigned nrounds;
+ union{
+#define RNGNxW_TPL(base, N, W) base##N##x##W##_kat base##N##x##W##_data;
+#include "rngNxW.h"
+#undef RNGNxW_TPL
+ /* Sigh... For those platforms that lack uint64_t, carve
+ out 128 bytes for the counter, key, expected, and computed. */
+ char justbytes[128];
+ }u;
+} kat_instance;
+
+#endif
diff --git a/tests/kat_c.c b/tests/kat_c.c
@@ -0,0 +1,41 @@
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+ notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions, and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+#include "kat_main.h"
+
+#define KAT_KERNEL
+#define KAT_GLOBAL
+#include "kat_dev_execute.h"
+
+void host_execute_tests(kat_instance *tests, unsigned ntests){
+ (void)ntests; /* unused */
+ dev_execute_tests(tests);
+}
diff --git a/tests/kat_cpp.cpp b/tests/kat_cpp.cpp
@@ -0,0 +1,222 @@
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+ notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions, and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+#include "kat_main.h"
+
+// With C++, it's a little trickier to create the mapping from
+// method-name/round-count to functions
+// because the round-counts are template arguments that have to be
+// specified at compile-time. Thus, we can't just do #define RNGNxW_TPL
+// and #include "rngNxW.h". We have to build a static map from:
+// pair<generator, rounds> to functions that apply the right generator
+// with the right number of rounds.
+
+#ifdef _MSC_FULL_VER
+// Engines have multiple copy constructors, quite legal C++, disable MSVC complaint
+#pragma warning (disable : 4521)
+#endif
+
+#include <map>
+#include <cstring>
+#include <utility>
+#include <stdexcept>
+#include <Random123/MicroURNG.hpp>
+#include <Random123/conventional/Engine.hpp>
+
+using namespace std;
+
+typedef map<pair<method_e, unsigned>, void (*)(kat_instance *)> genmap_t;
+genmap_t genmap;
+
+void dev_execute_tests(kat_instance *tests, unsigned ntests){
+ unsigned i;
+ for(i=0; i<ntests; ++i){
+ kat_instance *ti = &tests[i];
+ genmap_t::iterator p = genmap.find(make_pair(ti->method, ti->nrounds));
+ if(p == genmap.end())
+ throw std::runtime_error("pair<generator, nrounds> not in map. You probably need to add more genmap entries in kat_cpp.cpp");
+
+ p->second(ti);
+ // TODO: check that the corresponding Engine and MicroURNG
+ // return the same values. Note that we have ut_Engine and
+ // ut_MicroURNG, which check basic functionality, but they
+ // don't have the breadth of the kat_vectors.
+ }
+}
+
+static int murng_reported;
+static int engine_reported;
+
+template <typename GEN>
+void do_test(kat_instance* ti){
+ GEN g;
+ struct gdata{
+ typename GEN::ctr_type ctr;
+ typename GEN::ukey_type ukey;
+ typename GEN::ctr_type expected;
+ typename GEN::ctr_type computed;
+ };
+ gdata data;
+ // use memcpy. A reinterpret_cast would violate strict aliasing.
+ memcpy(&data, &ti->u, sizeof(data));
+ data.computed = g(data.ctr, data.ukey);
+
+ // Before we return, let's make sure that MicroURNG<GEN,1> and
+ // Engine<GEN> work as expeccted. This doesn't really "fit" the
+ // execution model of kat.c, which just expects us to fill in
+ // ti->u.computed, so we report the error by failing to write back
+ // the computed data item in the (hopefully unlikely) event that
+ // things don't match up as expected.
+ int errs = 0;
+
+ // MicroURNG: throws if the top 32 bits of the high word of ctr
+ // are non-zero.
+ typedef typename GEN::ctr_type::value_type value_type;
+
+ value_type hibits = data.ctr[data.ctr.size()-1]>>( std::numeric_limits<value_type>::digits - 32 );
+ try{
+ r123::MicroURNG<GEN> urng(data.ctr, data.ukey);
+ if(hibits)
+ errs++; // Should have thrown.
+ for (size_t i = 0; i < data.expected.size(); i++) {
+ size_t j = data.expected.size() - i - 1;
+ if (data.expected[j] != urng()) {
+ errs++;
+ }
+ }
+ }catch(std::runtime_error& /*ignored*/){
+ // A runtime_error is expected from the constructor
+ // when hibit is set.
+ if(!hibits)
+ errs++;
+ }
+ if(errs && (murng_reported++ == 0))
+ cerr << "Error in MicroURNG<GEN>, will appear as \"computed\" value of zero in error summary\n";
+
+ // Engine
+ // N.B. exercising discard() arguably belongs in ut_Engine.cpp
+ typedef r123::Engine<GEN> Etype;
+ typedef typename GEN::ctr_type::value_type value_type;
+ Etype e(data.ukey);
+ typename GEN::ctr_type c = data.ctr;
+ value_type c0;
+ if( c[0] > 0 ){
+ c0 = c[0]-1;
+ }else{
+ // N.B. Assume that if c[0] is 0, then so are all the
+ // others. Arrange to "roll over" to {0,..,0} on the first
+ // counter-increment. Alternatively, we could just
+ // skip the test for this case...
+ c.fill(std::numeric_limits<value_type>::max());
+ c0 = c[0];
+ }
+ c[0] /= 3;
+ e.setcounter(c, 0);
+ if( c0 > c[0] ){
+ // skip one value by calling e()
+ (void)e();
+ if (c0 > c[0]+1) {
+ // skip many values by calling discard()
+ R123_ULONG_LONG ndiscard = (c0 - c[0] - 1);
+ // Take care not to overflow the long long
+ if( ndiscard >= std::numeric_limits<R123_ULONG_LONG>::max() / c.size() ){
+ for(size_t j=0; j<c.size(); ++j){
+ e.discard(ndiscard);
+ }
+ }else{
+ ndiscard *= c.size();
+ e.discard(ndiscard);
+ }
+ }
+ // skip a few more by calling e().
+ for (size_t i = 1; i < c.size(); i++) {
+ (void) e();
+ }
+ // we should be back to where we started...
+ }
+ for (size_t i = 0; i < data.expected.size(); i++) {
+ value_type val = e();
+ size_t j = data.expected.size() - i - 1;
+ if (data.expected[j] != val) {
+ cerr << hex;
+ cerr << "Engine check, j=" << j << " expected: " << data.expected[j] << " val: " << val << "\n";
+ errs++;
+ if(engine_reported++ == 0)
+ cerr << "Error in Engine<GEN, 1>, will appear as \"computed\" value of zero in error summary\n";
+ }
+ }
+
+ // Signal an error to the caller by *not* copying back
+ // the computed data object into the ti
+ if(errs == 0)
+ memcpy(&ti->u, &data, sizeof(data));
+}
+
+void host_execute_tests(kat_instance *tests, unsigned ntests){
+ // In C++1x, this could be staticly declared with an initializer list.
+ genmap[make_pair(threefry2x32_e, 13u)] = do_test<r123::Threefry2x32_R<13> >;
+ genmap[make_pair(threefry2x32_e, 20u)] = do_test<r123::Threefry2x32_R<20> >;
+ genmap[make_pair(threefry2x32_e, 32u)] = do_test<r123::Threefry2x32_R<32> >;
+#if R123_USE_64BIT
+ genmap[make_pair(threefry2x64_e, 13u)] = do_test<r123::Threefry2x64_R<13> >;
+ genmap[make_pair(threefry2x64_e, 20u)] = do_test<r123::Threefry2x64_R<20> >;
+ genmap[make_pair(threefry2x64_e, 32u)] = do_test<r123::Threefry2x64_R<32> >;
+#endif
+
+ genmap[make_pair(threefry4x32_e, 13u)] = do_test<r123::Threefry4x32_R<13> >;
+ genmap[make_pair(threefry4x32_e, 20u)] = do_test<r123::Threefry4x32_R<20> >;
+ genmap[make_pair(threefry4x32_e, 72u)] = do_test<r123::Threefry4x32_R<72> >;
+#if R123_USE_64BIT
+ genmap[make_pair(threefry4x64_e, 13u)] = do_test<r123::Threefry4x64_R<13> >;
+ genmap[make_pair(threefry4x64_e, 20u)] = do_test<r123::Threefry4x64_R<20> >;
+ genmap[make_pair(threefry4x64_e, 72u)] = do_test<r123::Threefry4x64_R<72> >;
+#endif
+
+ genmap[make_pair(philox2x32_e, 7u)] = do_test<r123::Philox2x32_R<7> >;
+ genmap[make_pair(philox2x32_e, 10u)] = do_test<r123::Philox2x32_R<10> >;
+ genmap[make_pair(philox4x32_e, 7u)] = do_test<r123::Philox4x32_R<7> >;
+ genmap[make_pair(philox4x32_e, 10u)] = do_test<r123::Philox4x32_R<10> >;
+
+#if R123_USE_PHILOX_64BIT
+ genmap[make_pair(philox2x64_e, 7u)] = do_test<r123::Philox2x64_R<7> >;
+ genmap[make_pair(philox2x64_e, 10u)] = do_test<r123::Philox2x64_R<10> >;
+ genmap[make_pair(philox4x64_e, 7u)] = do_test<r123::Philox4x64_R<7> >;
+ genmap[make_pair(philox4x64_e, 10u)] = do_test<r123::Philox4x64_R<10> >;
+#endif
+
+#if R123_USE_AES_NI
+ genmap[make_pair(aesni4x32_e, 10u)] = do_test<r123::AESNI4x32 >;
+ genmap[make_pair(ars4x32_e, 7u)] = do_test<r123::ARS4x32_R<7> >;
+ genmap[make_pair(ars4x32_e, 10u)] = do_test<r123::ARS4x32_R<10> >;
+#endif
+
+ dev_execute_tests(tests, ntests);
+}
diff --git a/tests/kat_cuda.cu b/tests/kat_cuda.cu
@@ -0,0 +1,62 @@
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+ notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions, and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+#include "util_cuda.h"
+#include "kat_main.h"
+
+#define KAT_KERNEL __global__
+#define KAT_GLOBAL
+#include "kat_dev_execute.h"
+
+void host_execute_tests(kat_instance *tests_host, unsigned ntests){
+ CUDAInfo *infop;
+ kat_instance *tests_dev;
+ size_t tests_sz;
+
+ infop = cuda_init(NULL);
+
+ tests_sz = sizeof(tests_host[0]) * (ntests+1); // +1 for sentinel test with method==last
+ CHECKCALL(cudaMalloc(&tests_dev, tests_sz));
+ CHECKCALL(cudaMemcpy(tests_dev, tests_host, tests_sz, cudaMemcpyHostToDevice));
+
+ printf("starting %u tests on 1 blocks with 1 threads/block\n", ntests);
+ fflush(stdout);
+
+ // TO DO: call this with parallelism, <<<infop->blocks_per_grid, infop->threads_per_block>>>
+ // and then insure that each of the threads got the same result.
+ dev_execute_tests<<<1, 1>>>(tests_dev);
+
+ CHECKCALL(cudaDeviceSynchronize());
+ CHECKCALL(cudaMemcpy(tests_host, tests_dev, tests_sz, cudaMemcpyDeviceToHost));
+ CHECKCALL(cudaFree(tests_dev));
+ cuda_done(infop);
+}
+
diff --git a/tests/kat_dev_execute.h b/tests/kat_dev_execute.h
@@ -0,0 +1,51 @@
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+ notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions, and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+#include "kat.h"
+#ifndef KAT_METAL_BUFFER0
+#define KAT_METAL_BUFFER0 /* non-empty only when compiling Metal kernel */
+#endif
+KAT_KERNEL void dev_execute_tests(KAT_GLOBAL kat_instance *tests KAT_METAL_BUFFER0){
+ size_t i;
+ int done = 0;
+ for(i=0; !done; ++i){
+ KAT_GLOBAL kat_instance *ti = &tests[i];
+ switch(tests[i].method){
+ //case philox2x32_e: ti->u.philox2x32_data.computed = philox2x32_R(ti->rounds, ti->u.philox2x32_data.ctr, ti->u.philox2x32_data.key);
+#define RNGNxW_TPL(base, N, W) case base##N##x##W##_e: ti->u.base##N##x##W##_data.computed = base##N##x##W##_R(ti->nrounds, ti->u.base##N##x##W##_data.ctr, base##N##x##W##keyinit(ti->u.base##N##x##W##_data.ukey)); break;
+#include "rngNxW.h"
+#undef RNGNxW_TPL
+ case last:
+ done = 1;
+ break;
+ }
+ }
+}
diff --git a/tests/kat_main.h b/tests/kat_main.h
@@ -0,0 +1,306 @@
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+ notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions, and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+/* Known Answer Test */
+
+/* We use the same source files to implement the Known Answer Test
+ (KAT) in C, C++, OpenCL and CUDA. Supporting all four environments
+ with a single source file, and getting it all to work with 'make'
+ is a bit involved:
+
+ There are five "top-level" files:
+ kat_c.c
+ kat_cpp.cpp
+ kat_cuda.c
+ kat_opencl.c
+ kat_metal.m
+
+ These correspond to make targets: kat_c, kat_cpp, kat_cuda,
+ kat_opencl and kat_metal.
+
+ Those files are relatively simple. First, they #include this file,
+ which contains all the machinery for reading test vectors,
+ complaining about errors, etc.. Then they implement the function
+ host_execute_tests() in the appropriate environment. host_execute_tests
+ looks very different in C/C++/CUDA/OpenCL/Metal.
+
+ host_execute_tests contrives to call/launch "dev_execute_tests"
+ on the device. Except for a few environment-specific keywords,
+ (e.g., __global, __kernel), which are #defined in kat_XXX.c,
+ dev_execute_tests is obtained by including a common source file:
+ #include <kat_dev_execute.h>
+
+ One final complication: in order to fully "bake" the source code
+ into the binary at compile-time, dev_execute_tests for opencl is implemented in
+ kat_opencl_kernel.ocl, which is processed by gencl.sh into
+ kat_opencl_kernel.i, which is thein #include-ed by kat_opencl.c.
+
+*/
+#include "util.h"
+#include "kat.h"
+
+#define LINESIZE 1024
+
+int have_aesni = 0;
+int verbose = 0;
+int debug = 0;
+unsigned nfailed = 0;
+const char *progname;
+
+extern void host_execute_tests(kat_instance *tests, unsigned ntests);
+
+/* A little hack to keep track of the test vectors that we don't know how to deal with: */
+int nunknowns = 0;
+#define MAXUNKNOWNS 20
+const char *unknown_names[MAXUNKNOWNS];
+int unknown_counts[MAXUNKNOWNS];
+
+void register_unknown(const char *name){
+ int i;
+ for(i=0; i<nunknowns; ++i){
+ if( strcmp(name, unknown_names[i]) == 0 ){
+ unknown_counts[i]++;
+ return;
+ }
+ }
+ if( i >= MAXUNKNOWNS ){
+ fprintf(stderr, "Too many unknown rng types. Bye.\n");
+ exit(1);
+ }
+ nunknowns++;
+ unknown_names[i] = ntcsdup(name);
+ unknown_counts[i] = 1;
+}
+
+void report_unknowns(){
+ int i;
+ for(i=0; i<nunknowns; ++i){
+ printf("%d test vectors of type %s skipped\n", unknown_counts[i], unknown_names[i]);
+ }
+}
+
+/* read_<GEN>NxW */
+#define RNGNxW_TPL(base, N, W) \
+int read_##base##N##x##W(const char *line, kat_instance* tinst){ \
+ size_t i; \
+ int nchar; \
+ const char *p = line; \
+ char *newp; \
+ size_t nkey = sizeof(tinst->u.base##N##x##W##_data.ukey.v)/sizeof(tinst->u.base##N##x##W##_data.ukey.v[0]); \
+ tinst->method = base##N##x##W##_e; \
+ sscanf(p, "%u%n", &tinst->nrounds, &nchar); \
+ p += nchar; \
+ for(i=0; i<N; ++i){ \
+ tinst->u.base##N##x##W##_data.ctr.v[i] = strtou##W(p, &newp, 16); \
+ p = newp; \
+ } \
+ for(i=0; i<nkey; ++i){ \
+ tinst->u.base##N##x##W##_data.ukey.v[i] = strtou##W(p, &newp, 16); \
+ p = newp; \
+ } \
+ for(i=0; i<N; ++i){ \
+ tinst->u.base##N##x##W##_data.expected.v[i] = strtou##W(p, &newp, 16); \
+ p = newp; \
+ } \
+ /* set the computed to 0xca. If the test fails to set computed, we'll see cacacaca in the FAILURE notices */ \
+ memset(tinst->u.base##N##x##W##_data.computed.v, 0xca, sizeof(tinst->u.base##N##x##W##_data.computed.v)); \
+ return 1; \
+}
+#include "rngNxW.h"
+#undef RNGNxW_TPL
+
+/* readtest: dispatch to one of the read_<GEN>NxW functions */
+static int readtest(const char *line, kat_instance* tinst){
+ int nchar;
+ char name[LINESIZE];
+ if( line[0] == '#') return 0;
+ sscanf(line, "%s%n", name, &nchar);
+ if(!have_aesni){
+ /* skip any tests that require AESNI */
+ if(strncmp(name, "aes", 3)==0 ||
+ strncmp(name, "ars", 3)==0){
+ register_unknown(name);
+ return 0;
+ }
+ }
+#define RNGNxW_TPL(base, N, W) if(strcmp(name, #base #N "x" #W) == 0) return read_##base##N##x##W(line+nchar, tinst);
+#include "rngNxW.h"
+#undef RNGNxW_TPL
+
+ register_unknown(name);
+ return 0;
+}
+
+#define RNGNxW_TPL(base, N, W) \
+void report_##base##N##x##W##error(const kat_instance *ti){ \
+ size_t i; \
+ size_t nkey = sizeof(ti->u.base##N##x##W##_data.ukey.v)/sizeof(ti->u.base##N##x##W##_data.ukey.v[0]); \
+ fprintf(stderr, "FAIL: expected: "); \
+ fprintf(stderr, #base #N "x" #W " %d", ti->nrounds); \
+ for(i=0; i<N; ++i){ \
+ fprintf(stderr, " "); prtu##W(ti->u.base##N##x##W##_data.ctr.v[i]); \
+ } \
+ for(i=0; i<nkey; ++i){ \
+ fprintf(stderr, " "); prtu##W(ti->u.base##N##x##W##_data.ukey.v[i]); \
+ } \
+ for(i=0; i<N; ++i){ \
+ fprintf(stderr, " "); prtu##W(ti->u.base##N##x##W##_data.expected.v[i]); \
+ } \
+ fprintf(stderr, "\n"); \
+ \
+ fprintf(stderr, "FAIL: computed: "); \
+ fprintf(stderr, #base #N "x" #W " %d", ti->nrounds); \
+ for(i=0; i<N; ++i){ \
+ fprintf(stderr, " "); prtu##W(ti->u.base##N##x##W##_data.ctr.v[i]); \
+ } \
+ for(i=0; i<nkey; ++i){ \
+ fprintf(stderr, " "); prtu##W(ti->u.base##N##x##W##_data.ukey.v[i]); \
+ } \
+ for(i=0; i<N; ++i){ \
+ fprintf(stderr, " "); prtu##W(ti->u.base##N##x##W##_data.computed.v[i]); \
+ } \
+ fprintf(stderr, "\n"); \
+ nfailed++; \
+}
+#include "rngNxW.h"
+#undef RNGNxW_TPL
+
+// dispatch to one of the report_<GEN>NxW() functions
+void analyze_tests(const kat_instance *tests, unsigned ntests){
+ unsigned i;
+ char zeros[512] = {0};
+ for(i=0; i<ntests; ++i){
+ const kat_instance *ti = &tests[i];
+ switch(tests[i].method){
+#define RNGNxW_TPL(base, N, W) case base##N##x##W##_e: \
+ if (memcmp(zeros, ti->u.base##N##x##W##_data.expected.v, N*W/8)==0){ \
+ fprintf(stderr, "kat expected all zeros? Something is wrong with the test harness!\n"); \
+ nfailed++; \
+ } \
+ if (memcmp(ti->u.base##N##x##W##_data.computed.v, ti->u.base##N##x##W##_data.expected.v, N*W/8)) \
+ report_##base##N##x##W##error(ti); \
+ break;
+#include "rngNxW.h"
+#undef RNGNxW_TPL
+ case last: ;
+ }
+ }
+}
+
+#define NTESTS 1000
+
+int main(int argc, char **argv){
+ kat_instance *tests;
+ unsigned t, ntests = NTESTS;
+ char linebuf[LINESIZE];
+ FILE *inpfile;
+ const char *p;
+ const char *inname;
+ char filename[LINESIZE];
+
+ progname = argv[0];
+
+ /* If there's an argument, open that file.
+ else if getenv("srcdir") is non-empty open getenv("srcdir")/kat_vectors
+ else open "./kat_vectors" */
+ if( argc > 1 )
+ inname = argv[1];
+ else{
+ const char *e = getenv("srcdir");
+ if(!e)
+ e = ".";
+ sprintf(filename, "%s/kat_vectors", e);
+ inname = filename;
+ }
+
+ if (strcmp(inname, "-") == 0) {
+ inpfile = stdin;
+ } else {
+ inpfile = fopen(inname, "r");
+ if (inpfile == NULL) {
+ fprintf(stderr, "%s: error opening input file %s for reading: %s\n",
+ progname, inname, strerror(errno));
+ exit(1);
+ }
+ }
+ if ((p = getenv("KATC_VERBOSE")) != NULL) {
+ verbose = atoi(p);
+ }
+ if ((p = getenv("KATC_DEBUG")) != NULL) {
+ debug = atoi(p);
+ }
+
+#if R123_USE_AES_NI
+ have_aesni = haveAESNI();
+#else
+ have_aesni = 0;
+#endif
+
+ tests = (kat_instance *) malloc(sizeof(tests[0])*ntests);
+ if (tests == NULL) {
+ fprintf(stderr, "Could not allocate %lu bytes for tests\n",
+ (unsigned long) ntests);
+ exit(1);
+ }
+ t = 0;
+ while (fgets(linebuf, sizeof linebuf, inpfile) != NULL) {
+ if( t==ntests ){
+ ntests *= 2;
+ tests = (kat_instance *)realloc(tests, sizeof(tests[0])*ntests);
+ if (tests == NULL) {
+ fprintf(stderr, "Could not grow tests to %lu bytes\n",
+ (unsigned long) ntests);
+ exit(1);
+ }
+ }
+ if( readtest(linebuf, &tests[t]) )
+ ++t;
+ }
+ if(t==ntests){
+ fprintf(stderr, "No more space for tests? Recompile with a larger NTESTS\n");
+ exit(1);
+ }
+ tests[t].method = last; // N.B *not* t++ - the 'ntests' value passed to host_execute_tests does not count the 'last' one.
+
+ report_unknowns();
+ printf("Perform %lu tests.\n", (unsigned long)t);
+ host_execute_tests(tests, t);
+
+ analyze_tests(tests, t);
+ free(tests);
+ if(nfailed != 0){
+ printf("FAILED %u out of %u\n", nfailed, t);
+ return 1;
+ }else{
+ printf("PASSED %u known answer tests\n", t);
+ return 0;
+ }
+}
diff --git a/tests/kat_metal.m b/tests/kat_metal.m
@@ -0,0 +1,85 @@
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+ notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions, and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+// Simple Metal device kernel and host main program to
+// compute pi via random darts at a square
+//
+// Written by Tom Schoonjans <Tom.Schoonjans@me.com>
+
+// We're compiling on the host, so we don't include metalfeatures.h,
+// but metal doesn't have 64-bit arithmetic, so we turn it off here.
+#define R123_USE_64BIT 0
+// functions to do boilerplate Metal begin and end
+#include "../tests/util_metal.h"
+#include "kat_main.h"
+
+void host_execute_tests(kat_instance *tests, unsigned ntests){
+ UMetalInfo *infop;
+ size_t i, nthreads = 1024, hits_sz;
+ uint *tests_host;
+ NSString *kernelname = @"dev_execute_tests";
+ NSError *err = nil;
+ id<MTLFunction> function;
+ id<MTLBuffer> tests_dev;
+ size_t tests_sz;
+ id<MTLCommandBuffer> buffer;
+ id<MTLComputeCommandEncoder> encoder;
+ id<MTLComputePipelineState> pipeline;
+
+ infop = metal_init(NULL, "kat_metal_kernel.metallib");
+ CHECKNOTZERO(function = [infop->library newFunctionWithName: kernelname]);
+ tests_sz = sizeof(kat_instance) * (ntests+1); // +1 for sentinel test with method==last
+ CHECKNOTZERO(tests_dev = [infop->device newBufferWithBytes: tests length: tests_sz options:0]);
+
+ CHECKNOTZERO(buffer = [infop->queue commandBuffer]);
+ CHECKNOTZERO(encoder = [buffer computeCommandEncoder]);
+ CHECKERR(pipeline = [infop->device newComputePipelineStateWithFunction:function error:&err]);
+ [encoder setComputePipelineState:pipeline];
+ [encoder setBuffer:tests_dev offset:0 atIndex:0];
+
+ MTLSize threadsPerThreadgroup = MTLSizeMake([pipeline maxTotalThreadsPerThreadgroup], 1, 1);
+ MTLSize grid = MTLSizeMake(nthreads, 1, 1);
+
+ [encoder dispatchThreads:grid threadsPerThreadgroup:threadsPerThreadgroup];
+ [encoder endEncoding];
+ [buffer commit];
+ [buffer waitUntilCompleted];
+
+ tests_host = [tests_dev contents];
+
+ memcpy(tests, tests_host, tests_sz);
+ metal_done(infop);
+ [function release];
+ [tests_dev release];
+ [buffer release];
+ [encoder release];
+ [pipeline release];
+}
diff --git a/tests/kat_metal_kernel.metal b/tests/kat_metal_kernel.metal
@@ -0,0 +1,38 @@
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+ notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions, and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+#include "kat.h"
+
+#define KAT_KERNEL kernel
+#define KAT_GLOBAL device
+#define KAT_METAL_BUFFER0 [[ buffer(0) ]]
+
+#include "kat_dev_execute.h"
diff --git a/tests/kat_opencl.c b/tests/kat_opencl.c
@@ -0,0 +1,100 @@
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+ notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions, and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+#include "util_opencl.h"
+#include "kat_main.h"
+
+// USE_GENCL: gencl.sh is a small shell script
+// that pre-processes foo.ocl into foo.i, containing
+// a definition like:
+// const char opencl_src[] = "preprocessed text of foo.ocl"
+// Thus, with gencl, this file says
+// #include <foo.i>
+// and the binary obtained by compiling it
+// is fully "baked". Runtime behavior doesn't depend
+// on the contents of some file (e.g., foo.ocl or some
+// header that it includes) that might have changed long after this
+// file was compiled.
+//
+// The alternative (USE_GENCL 0) seems to be more along
+// the lines of what OpenCL designers imagine. It makes the text of the
+// kernel program the string "#include <foo.c>". This eliminates
+// the need for the extra machinery in gencl.sh, but runtime
+// behavior is susceptable to changes in foo.c, or files included
+// by foo.c long after this file is compiled. It also requires some
+// hocus pocus to get absolute paths for the -I options needed
+// to compile the code at runtime. Something like:
+// override CFLAGS += -DSRCDIR=\"$(dir $(abspath $<)).\"
+#define USE_GENCL 1
+
+#if USE_GENCL
+const char *opencl_src =
+#include "kat_opencl_kernel.i"
+ ;
+#else
+#ifndef SRCDIR
+#error -DSRCDIR="/absolute/path/to/examples" should have been put on the command-line by GNUmakefile
+#endif
+#endif
+
+void host_execute_tests(kat_instance *tests, unsigned ntests){
+ UCLInfo *infop;
+ cl_kernel kern;
+ size_t nthreads, tests_sz;
+ cl_mem tests_dev;
+ const char *kernelname = "dev_execute_tests";
+ cl_int err;
+
+#if USE_GENCL
+ infop = opencl_init(NULL, opencl_src, "");
+#else
+ infop = opencl_init(NULL, "#include <kat_dev_execute.h>",
+ " -I" SRCDIR
+ " -I" SRCDIR "/../include "
+ " -DKAT_KERNEL=__kernel "
+ " -DKAT_GLOBAL=__global ");
+#endif
+ CHECKERR(kern = clCreateKernel(infop->prog, kernelname, &err));
+ if (infop->wgsize > 64) infop->wgsize /= 2;
+ nthreads = infop->cores * infop->wgsize;
+ tests_sz = sizeof(*tests) * (ntests+1); // +1 for sentinel test with method==last
+ CHECKERR(tests_dev = clCreateBuffer(infop->ctx, CL_MEM_READ_WRITE|CL_MEM_USE_HOST_PTR, tests_sz, tests, &err));
+ CHECK(clEnqueueWriteBuffer(infop->cmdq, tests_dev, CL_TRUE, 0, tests_sz, tests, 0, 0, 0));
+ CHECK(clSetKernelArg(kern, 0, sizeof(cl_mem), (void*)&tests_dev));
+ printf("queuing kernel for %lu threads with %lu work group size, %u tests\n",
+ (unsigned long)nthreads, (unsigned long)infop->wgsize, ntests);
+ CHECK(clEnqueueNDRangeKernel(infop->cmdq, kern, 1, 0, &nthreads, &infop->wgsize, 0, 0, 0));
+ CHECK(clFinish(infop->cmdq));
+ CHECK(clEnqueueReadBuffer(infop->cmdq, tests_dev, CL_TRUE, 0, tests_sz, tests, 0, 0, 0));
+ CHECK(clReleaseMemObject(tests_dev));
+ CHECK(clReleaseKernel(kern));
+ opencl_done(infop);
+}
diff --git a/tests/kat_opencl_kernel.ocl b/tests/kat_opencl_kernel.ocl
@@ -0,0 +1,37 @@
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+ notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions, and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+#include "kat.h"
+
+#define KAT_KERNEL __kernel
+#define KAT_GLOBAL __global
+
+#include "kat_dev_execute.h"
diff --git a/tests/kat_vectors b/tests/kat_vectors
@@ -0,0 +1,83 @@
+# For each generator, we test: gen(0, 0), gen(fff, fff) and gen(ctr=digits_of_pi, key=more_digits_of_pi).
+# Ignoring endianness, these are the first few hexdigits of pi:
+# 243F6A88 85A308D3 13198A2E 03707344 A4093822 299F31D0 082EFA98 EC4E6C89 452821E6 38D01377 BE5466CF 34E90C6C C0AC29B7 C97C50DD 3F84D5B5 B5470917 9216D5D9 8979FB1BD
+#
+#nameNxW R CTR KEY EXPECTED
+#
+aesni4x32 10 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 d44be966 3b2c8aef 59fa4c88 2e2b34ca
+aesni4x32 10 ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff 00000000 00000000 0f68399f cc680a67 4cbd230d 816d2e23
+aesni4x32 10 243f6a88 85a308d3 13198a2e 03707344 a4093822 299f31d0 082efa98 ec4e6c89 ca693cbf 134a4f64 965e0cfd 5217a28f
+# also test AESNI with the test vector from FIPS197
+aesni4x32 10 33221100 77665544 bbaa9988 ffeeddcc 03020100 07060504 0b0a0908 0f0e0d0c d8e0c469 30047b6a 80b7cdd8 5ac5b470
+#
+ars4x32 10 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 8d73ee19 506401ef 13c2dbe4 0cbe9c0d
+ars4x32 10 243f6a88 85a308d3 13198a2e 03707344 a4093822 299f31d0 082efa98 ec4e6c89 a516e7d6 8357ad74 5b59b3ec 8763fff3
+ars4x32 10 ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff 00000000 00000000 bb3743b1 9f635551 ecbc87fc a19478a9
+#
+philox2x32 7 00000000 00000000 00000000 257a3673 cd26be2a
+philox2x32 7 ffffffff ffffffff ffffffff ab302c4d 3dc9d239
+philox2x32 7 243f6a88 85a308d3 13198a2e bedbbe6b e4c770b3
+philox2x32 10 00000000 00000000 00000000 ff1dae59 6cd10df2
+philox2x32 10 ffffffff ffffffff ffffffff 2c3f628b ab4fd7ad
+philox2x32 10 243f6a88 85a308d3 13198a2e dd7ce038 f62a4c12
+#
+philox4x32 7 00000000 00000000 00000000 00000000 00000000 00000000 5f6fb709 0d893f64 4f121f81 4f730a48
+philox4x32 7 ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff 5207ddc2 45165e59 4d8ee751 8c52f662
+philox4x32 7 243f6a88 85a308d3 13198a2e 03707344 a4093822 299f31d0 4dfccaba 190a87f0 c47362ba b6b5242a
+philox4x32 10 00000000 00000000 00000000 00000000 00000000 00000000 6627e8d5 e169c58d bc57ac4c 9b00dbd8
+philox4x32 10 ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff 408f276d 41c83b0e a20bc7c6 6d5451fd
+philox4x32 10 243f6a88 85a308d3 13198a2e 03707344 a4093822 299f31d0 d16cfe09 94fdcceb 5001e420 24126ea1
+#
+philox2x64 7 0000000000000000 0000000000000000 0000000000000000 b41da69fbfefc666 511e9ce1a5534056
+philox2x64 7 ffffffffffffffff ffffffffffffffff ffffffffffffffff a4696cc04462015d 724782dae17169e9
+philox2x64 7 243f6a8885a308d3 13198a2e03707344 a4093822299f31d0 98ed1534392bf372 67528b1568882fd5
+philox2x64 10 0000000000000000 0000000000000000 0000000000000000 ca00a0459843d731 66c24222c9a845b5
+philox2x64 10 ffffffffffffffff ffffffffffffffff ffffffffffffffff 65b021d60cd8310f 4d02f3222f86df20
+philox2x64 10 243f6a8885a308d3 13198a2e03707344 a4093822299f31d0 0a5e742c2997341c b0f883d38000de5d
+#
+philox4x64 7 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 5dc8ee6268ec62cd 139bc570b6c125a0 84d6deb4fb65f49e aff7583376d378c2
+philox4x64 7 ffffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffff 071dd84367903154 48e2bbdc722b37d1 6afa9890bb89f76c 9194c8d8ada56ac7
+philox4x64 7 243f6a8885a308d3 13198a2e03707344 a4093822299f31d0 082efa98ec4e6c89 452821e638d01377 be5466cf34e90c6c 513a366704edf755 f05d9924c07044d3 bef2cb9cbea74c6c 8db948de4caa1f8a
+philox4x64 10 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 16554d9eca36314c db20fe9d672d0fdc d7e772cee186176b 7e68b68aec7ba23b
+philox4x64 10 ffffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffff 87b092c3013fe90b 438c3c67be8d0224 9cc7d7c69cd777b6 a09caebf594f0ba0
+philox4x64 10 243f6a8885a308d3 13198a2e03707344 a4093822299f31d0 082efa98ec4e6c89 452821e638d01377 be5466cf34e90c6c a528f45403e61d95 38c72dbd566e9788 a5a1610e72fd18b5 57bd43b5e52b7fe6
+#
+threefry2x32 13 00000000 00000000 00000000 00000000 9d1c5ec6 8bd50731
+threefry2x32 13 ffffffff ffffffff ffffffff ffffffff fd36d048 2d17272c
+threefry2x32 13 243f6a88 85a308d3 13198a2e 03707344 ba3e4725 f27d669e
+threefry2x32 20 00000000 00000000 00000000 00000000 6b200159 99ba4efe
+threefry2x32 20 ffffffff ffffffff ffffffff ffffffff 1cb996fc bb002be7
+threefry2x32 20 243f6a88 85a308d3 13198a2e 03707344 c4923a9c 483df7a0
+threefry2x32 32 00000000 00000000 00000000 00000000 cee3d47e a23dfd5c
+threefry2x32 32 ffffffff ffffffff ffffffff ffffffff 6e2fe0d0 b1b76f82
+threefry2x32 32 243f6a88 85a308d3 13198a2e 03707344 e2827716 c3c05cdf
+#
+threefry4x32 13 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 531c7e4f 39491ee5 2c855a92 3d6abf9a
+threefry4x32 13 ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff c4189358 1c9cc83a d5881c67 6a0a89e0
+threefry4x32 13 243f6a88 85a308d3 13198a2e 03707344 a4093822 299f31d0 082efa98 ec4e6c89 4aa71d8f 734738c2 431fc6a8 ae6debf1
+threefry4x32 20 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 9c6ca96a e17eae66 fc10ecd4 5256a7d8
+threefry4x32 20 ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff 2a881696 57012287 f6c7446e a16a6732
+threefry4x32 20 243f6a88 85a308d3 13198a2e 03707344 a4093822 299f31d0 082efa98 ec4e6c89 59cd1dbb b8879579 86b5d00c ac8b6d84
+threefry4x32 72 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 93171da6 9220326d b392b7b1 ff58a002
+threefry4x32 72 ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff 60743f3d 9961e684 aab21c34 8c65fb7d
+threefry4x32 72 243f6a88 85a308d3 13198a2e 03707344 a4093822 299f31d0 082efa98 ec4e6c89 09930adf 7f27bd55 9ed68ce1 97f803f6
+#
+threefry2x64 13 0000000000000000 0000000000000000 0000000000000000 0000000000000000 f167b032c3b480bd e91f9fee4b7a6fb5
+threefry2x64 13 ffffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffff ccdec5c917a874b1 4df53abca26ceb01
+threefry2x64 13 243f6a8885a308d3 13198a2e03707344 a4093822299f31d0 082efa98ec4e6c89 c3aac71561042993 3fe7ae8801aff316
+threefry2x64 20 0000000000000000 0000000000000000 0000000000000000 0000000000000000 c2b6e3a8c2c69865 6f81ed42f350084d
+threefry2x64 20 ffffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffff e02cb7c4d95d277a d06633d0893b8b68
+threefry2x64 20 243f6a8885a308d3 13198a2e03707344 a4093822299f31d0 082efa98ec4e6c89 263c7d30bb0f0af1 56be8361d3311526
+threefry2x64 32 0000000000000000 0000000000000000 0000000000000000 0000000000000000 38ba854d7f13cfb3 d02fca729d54fadc
+threefry2x64 32 ffffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffff 6b532f4f6e288646 0388f1ec135ee18e
+threefry2x64 32 243f6a8885a308d3 13198a2e03707344 a4093822299f31d0 082efa98ec4e6c89 dad492f32efbd0c4 b6d7d0cd1f193e84
+#
+threefry4x64 13 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 4071fabee1dc8e05 02ed3113695c9c62 397311b5b89f9d49 e21292c3258024bc
+threefry4x64 13 ffffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffff 7eaed935479722b5 90994358c429f31c 496381083e07a75b 627ed0d746821121
+threefry4x64 13 243f6a8885a308d3 13198a2e03707344 a4093822299f31d0 082efa98ec4e6c89 452821e638d01377 be5466cf34e90c6c c0ac29b7c97c50dd 3f84d5b5b5470917 4361288ef9c1900c 8717291521782833 0d19db18c20cf47e a0b41d63ac8581e5
+threefry4x64 20 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 09218ebde6c85537 55941f5266d86105 4bd25e16282434dc ee29ec846bd2e40b
+ threefry4x64 20 ffffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffff 29c24097942bba1b 0371bbfb0f6f4e11 3c231ffa33f83a1c cd29113fde32d168
+threefry4x64 20 243f6a8885a308d3 13198a2e03707344 a4093822299f31d0 082efa98ec4e6c89 452821e638d01377 be5466cf34e90c6c be5466cf34e90c6c c0ac29b7c97c50dd a7e8fde591651bd9 baafd0c30138319b 84a5c1a729e685b9 901d406ccebc1ba4
+threefry4x64 72 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 94eeea8b1f2ada84 adf103313eae6670 952419a1f4b16d53 d83f13e63c9f6b11
+threefry4x64 72 ffffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffff 11518c034bc1ff4c 193f10b8bcdcc9f7 d024229cb58f20d8 563ed6e48e05183f
+threefry4x64 72 243f6a8885a308d3 13198a2e03707344 a4093822299f31d0 082efa98ec4e6c89 452821e638d01377 be5466cf34e90c6c be5466cf34e90c6c c0ac29b7c97c50dd acf412ccaa3b2270 c9e99bd53f2e9173 43dad469dc825948 fbb19d06c8a2b4dc
diff --git a/tests/old_kat_vectors b/tests/old_kat_vectors
@@ -0,0 +1,5339 @@
+#Generated by gentests.py and then running parsefail
+#
+# Unfortunately, these kat_vectors don't exercise the bits of KEY very well,
+# so we have a new set in ./kat_vectors that is both smaller and
+# (we think) better.
+#
+# We keep these around because the extensive Crush tests reported in
+# the Random123 paper were all done with generators that satisfied
+# *these* kat_vectors. It is reassuring to be able to verify
+# that future versions of the library satisfy the same kat_vectors.
+#
+#nameNxW R CTR KEY EXPECTED
+philox2x32 7 00000001 00000000 00000001 dd304d50 12e4d653
+philox2x32 7 00000000 00000001 00000001 2c4a4855 9199e69b
+philox2x32 7 00000000 ffffffff 00000001 6d2698e6 b701a038
+philox2x32 7 00000000 80000000 00000001 800bb214 33f68d84
+philox2x32 7 243f6a88 85a308d3 00000001 5e8c7db7 fe555fa5
+philox2x32 7 13198a2e 03707344 00000001 8c1ec904 8e580829
+philox2x32 7 a4093822 299f31d0 00000001 057c044a 7aafdd03
+philox2x32 7 082efa98 ec4e6c89 00000001 5a522bef 4f71ff9b
+philox2x32 7 452821e6 38d01377 00000001 5dbe9036 c71bfb6f
+philox2x32 7 be5466cf 34e90c6c 00000001 f8ce43da 5d07a3bc
+philox2x32 10 00000001 00000000 00000001 df873210 f52df537
+philox2x32 10 00000000 00000001 00000001 7ed26ce8 86c7f618
+philox2x32 10 00000000 ffffffff 00000001 319f09f6 8e11e823
+philox2x32 10 00000000 80000000 00000001 b004c3a1 5aaa7aab
+philox2x32 10 243f6a88 85a308d3 00000001 249cdc9c 4f745808
+philox2x32 10 13198a2e 03707344 00000001 7fe8940c 5164f5d3
+philox2x32 10 a4093822 299f31d0 00000001 9fa9cccc da4e7ee4
+philox2x32 10 082efa98 ec4e6c89 00000001 749e4ccd 6b4efa58
+philox2x32 10 452821e6 38d01377 00000001 e352771f 210baeaa
+philox2x32 10 be5466cf 34e90c6c 00000001 4d2a7213 d84561e4
+philox2x64 7 0000000000000001 0000000000000000 0000000000000001 6731c5bf26de72d3 adb0404961332fbe
+philox2x64 7 0000000000000000 0000000000000001 0000000000000001 88c0f355559817df 613b0c0682da5d16
+philox2x64 7 0000000000000000 ffffffffffffffff 0000000000000001 ef60e579e0cc8308 d5de9d9bf11b57ce
+philox2x64 7 0000000000000000 8000000000000000 0000000000000001 f05773bd9ddff049 600bdd92470c8940
+philox2x64 7 243f6a8885a308d3 13198a2e03707344 0000000000000001 a96599d377733423 d1c51f3aa6d13b8c
+philox2x64 7 a4093822299f31d0 082efa98ec4e6c89 0000000000000001 81a0e4d3c158a51a 5e20f98aff4f692c
+philox2x64 7 452821e638d01377 be5466cf34e90c6c 0000000000000001 e9fdf171af72db90 1ed074cb2bbc90c1
+philox2x64 10 0000000000000001 0000000000000000 0000000000000001 d9942a5c25dce933 512c1502dbacf1a2
+philox2x64 10 0000000000000000 0000000000000001 0000000000000001 9d42f8da0c592ba8 626786f6b2c510b0
+philox2x64 10 0000000000000000 ffffffffffffffff 0000000000000001 2d7c99d63b91dec2 0e13046ba2a2a7e6
+philox2x64 10 0000000000000000 8000000000000000 0000000000000001 0a1c7400c97c2506 845e4df70479d69f
+philox2x64 10 243f6a8885a308d3 13198a2e03707344 0000000000000001 9da663796aaa8b69 a04cf817aceac82d
+philox2x64 10 a4093822299f31d0 082efa98ec4e6c89 0000000000000001 0bde60d810e6cfcd ed2f63ae6019fd5a
+philox4x32 7 00000001 00000000 00000000 00000000 00000001 00000000 6b3257c3 820c5486 4de08b66 8771d665
+philox4x32 7 00000000 00000001 00000000 00000000 00000001 00000000 03dd87e3 e457f6e9 36c1ef7a 2c08abd7
+philox4x32 7 00000000 00000000 00000001 00000000 00000001 00000000 7b95d061 973a01c3 34a7320a b948ba2b
+philox4x32 7 00000000 00000000 00000000 00000001 00000001 00000000 ec3a83e6 1b8a97b3 d62f2558 2bbefc0b
+philox4x32 7 00000000 ffffffff 00000000 00000000 00000001 00000000 a84bdb23 ad074f5c d009bbed dc77d86c
+philox4x32 7 00000000 80000000 00000000 00000000 00000001 00000000 fee842f9 4ab3aed6 d83a3a74 6166acec
+philox4x32 7 00000000 00000000 ffffffff 00000000 00000001 00000000 9d9941e5 c454b1a9 292e9032 012e7a5b
+philox4x32 7 00000000 00000000 80000000 00000000 00000001 00000000 450f5c67 5e4f567e 3e5ae48e eca744c7
+philox4x32 7 00000000 00000000 00000000 ffffffff 00000001 00000000 700b66cd 833b8af0 e955c344 17781353
+philox4x32 7 00000000 00000000 00000000 80000000 00000001 00000000 f5dec550 d08482a9 09e2e568 c08a2602
+philox4x32 7 243f6a88 85a308d3 13198a2e 03707344 00000001 00000000 64803f9b acd38b4b 5ea00643 770c3921
+philox4x32 7 a4093822 299f31d0 082efa98 ec4e6c89 00000001 00000000 477d1496 cd0263d3 fa87a887 a1a13750
+philox4x32 7 452821e6 38d01377 be5466cf 34e90c6c 00000001 00000000 3c182998 851c52ae 22df9a24 805a4e26
+philox4x32 7 00000001 00000000 00000000 00000000 00000000 00000001 4582d3b2 11884435 1c51f335 56b76cad
+philox4x32 7 00000000 00000001 00000000 00000000 00000000 00000001 824469c3 e2b3aee2 f27d3e79 69e5de86
+philox4x32 7 00000000 00000000 00000001 00000000 00000000 00000001 c8cc99de 36b6acce c7fde4e2 b954b1f0
+philox4x32 7 00000000 00000000 00000000 00000001 00000000 00000001 d02f5ec7 f0673bf6 027bec46 779e7874
+philox4x32 7 00000000 ffffffff 00000000 00000000 00000000 00000001 55a94893 5824e089 0aacd579 d69ce6fb
+philox4x32 7 00000000 80000000 00000000 00000000 00000000 00000001 bed1d713 08c60b2d f16241e5 37b110de
+philox4x32 7 00000000 00000000 ffffffff 00000000 00000000 00000001 a44a8fd2 10e92201 f15f62ac e00f43b6
+philox4x32 7 00000000 00000000 80000000 00000000 00000000 00000001 096862a9 6755b23c 3e211f07 49799dc7
+philox4x32 7 00000000 00000000 00000000 ffffffff 00000000 00000001 189beecf e053c60b bbd309b7 6c7a7794
+philox4x32 7 00000000 00000000 00000000 80000000 00000000 00000001 deb89556 c991d089 09e16ad6 15a24b57
+philox4x32 7 243f6a88 85a308d3 13198a2e 03707344 00000000 00000001 3eb0cda8 1c3550e7 2541d05d 068d381c
+philox4x32 7 a4093822 299f31d0 082efa98 ec4e6c89 00000000 00000001 13818be6 633e77bb 6d135b5b a3b20aa0
+philox4x32 7 452821e6 38d01377 be5466cf 34e90c6c 00000000 00000001 b3735496 aa6cda09 0d72df0b b961e99a
+philox4x32 7 00000001 00000000 00000000 00000000 00000000 ffffffff b5c9dc53 0f8b9936 5dfd28f4 80f4c67d
+philox4x32 7 00000000 00000001 00000000 00000000 00000000 ffffffff 993b616b d3aba408 076593da a2999568
+philox4x32 7 00000000 00000000 00000001 00000000 00000000 ffffffff f891827e 3b2f7ecf 41cbeeb4 596c72b8
+philox4x32 7 00000000 00000000 00000000 00000001 00000000 ffffffff 5eddf390 c16f5ad8 5480b946 92b74eb2
+philox4x32 7 00000000 ffffffff 00000000 00000000 00000000 ffffffff 41e41234 eac57ab3 3565428b 0ae4d890
+philox4x32 7 00000000 80000000 00000000 00000000 00000000 ffffffff 9bbbefb2 69155b0d 59124dbf 5fa21593
+philox4x32 7 00000000 00000000 ffffffff 00000000 00000000 ffffffff bb2d9138 e2aea83c 735542fd 142578c1
+philox4x32 7 00000000 00000000 80000000 00000000 00000000 ffffffff b9bb52fe d06f257f b5079c8f 0490d30e
+philox4x32 7 00000000 00000000 00000000 ffffffff 00000000 ffffffff 793416be 37270805 fb649c02 68a4e7c2
+philox4x32 7 00000000 00000000 00000000 80000000 00000000 ffffffff 0e6e511e 8e7045fa d56a0e60 f8e94c17
+philox4x32 7 243f6a88 85a308d3 13198a2e 03707344 00000000 ffffffff 80fda6c5 33db1407 042deee8 0dec8a67
+philox4x32 7 a4093822 299f31d0 082efa98 ec4e6c89 00000000 ffffffff 55a400f8 90e13684 1ad7c6c6 fdfdd335
+philox4x32 7 452821e6 38d01377 be5466cf 34e90c6c 00000000 ffffffff 9ea5c780 92dfd935 5f5021d0 891581d8
+philox4x32 7 00000001 00000000 00000000 00000000 00000000 80000000 5a134bed 542bab82 21429fcd 677a1dd3
+philox4x32 7 00000000 00000001 00000000 00000000 00000000 80000000 819bfdaa 2584def1 af9ca218 0a2ef133
+philox4x32 7 00000000 00000000 00000001 00000000 00000000 80000000 d7854663 74abe06e dd8f4d3c b7f52230
+philox4x32 7 00000000 00000000 00000000 00000001 00000000 80000000 0d5576d6 d37a4b50 2d544d55 33f654d6
+philox4x32 7 00000000 ffffffff 00000000 00000000 00000000 80000000 db5de1d1 534479e1 fae88f56 c66f402b
+philox4x32 7 00000000 80000000 00000000 00000000 00000000 80000000 4cd24250 9291c73f 39429688 83707553
+philox4x32 7 00000000 00000000 ffffffff 00000000 00000000 80000000 6b227dcf b5bf2a3a c60d00b8 c0e04288
+philox4x32 7 00000000 00000000 80000000 00000000 00000000 80000000 56ddb529 b18488a9 63f467c6 a689a8ad
+philox4x32 7 00000000 00000000 00000000 ffffffff 00000000 80000000 414ea6b4 083011b4 08bc62cb 76d8fb76
+philox4x32 7 00000000 00000000 00000000 80000000 00000000 80000000 323abc61 28b9f4ce 59d8d353 01a9cf42
+philox4x32 7 243f6a88 85a308d3 13198a2e 03707344 00000000 80000000 2040eb58 f609f646 bbf37f20 5d76b5f9
+philox4x32 7 a4093822 299f31d0 082efa98 ec4e6c89 00000000 80000000 f9440a22 337100bb 1845d9c8 2736ad6d
+philox4x32 7 452821e6 38d01377 be5466cf 34e90c6c 00000000 80000000 b30a1fd9 3149f07f 59ede6aa 95d62ce2
+philox4x32 10 00000001 00000000 00000000 00000000 00000001 00000000 ac08141b dfc5ccbe 79c07a47 a7f66093
+philox4x32 10 00000000 00000001 00000000 00000000 00000001 00000000 833ff8dc 225c963c 232b88b3 0b334b07
+philox4x32 10 00000000 00000000 00000001 00000000 00000001 00000000 07071c12 428264b6 3909104b 6da2bda2
+philox4x32 10 00000000 00000000 00000000 00000001 00000001 00000000 127bee41 1e047488 48842b20 0a393496
+philox4x32 10 00000000 ffffffff 00000000 00000000 00000001 00000000 04e2eae1 463cc999 e7786310 65b3dc49
+philox4x32 10 00000000 80000000 00000000 00000000 00000001 00000000 34a4d61d 340e4017 f6945830 e9f52b96
+philox4x32 10 00000000 00000000 ffffffff 00000000 00000001 00000000 fb0905e2 78378790 ca37926b cdf58cfa
+philox4x32 10 00000000 00000000 80000000 00000000 00000001 00000000 f2e15c7d 3fedcd99 90046f6c 6657f0ca
+philox4x32 10 00000000 00000000 00000000 ffffffff 00000001 00000000 f50c9398 b36cdab2 436bdc89 cc49431b
+philox4x32 10 00000000 00000000 00000000 80000000 00000001 00000000 dde26e4e 17666f3b fc1f5b3a 83ac805d
+philox4x32 10 243f6a88 85a308d3 13198a2e 03707344 00000001 00000000 38527b8f fad9a48c 20e675c0 f2fea26a
+philox4x32 10 a4093822 299f31d0 082efa98 ec4e6c89 00000001 00000000 fb9877f8 482895e2 60b01453 198ea67b
+philox4x32 10 452821e6 38d01377 be5466cf 34e90c6c 00000001 00000000 f7b7fa0a 8d970e2c 205c9c76 83b16ce5
+philox4x32 10 00000001 00000000 00000000 00000000 00000000 00000001 ccf3076a 6306f434 bea71965 d96fe48a
+philox4x32 10 00000000 00000001 00000000 00000000 00000000 00000001 532f1322 36c890fb 6504b937 07bbfef7
+philox4x32 10 00000000 00000000 00000001 00000000 00000000 00000001 7f6c13ff 114b2447 0550eced ea1fc805
+philox4x32 10 00000000 00000000 00000000 00000001 00000000 00000001 96b27e8c 28826d0f 66d958ef 081509dc
+philox4x32 10 00000000 ffffffff 00000000 00000000 00000000 00000001 00e94a67 3524f44e 22995230 bb54df1e
+philox4x32 10 00000000 80000000 00000000 00000000 00000000 00000001 ce1afc4e 4fbf97a1 6110bee9 a559be2f
+philox4x32 10 00000000 00000000 ffffffff 00000000 00000000 00000001 576241af d3b45bee 619bd94d 15dd8793
+philox4x32 10 00000000 00000000 80000000 00000000 00000000 00000001 d9da65af eced57ba c34d2661 91fe931f
+philox4x32 10 00000000 00000000 00000000 ffffffff 00000000 00000001 36241728 4d42c858 fea737d6 49f40347
+philox4x32 10 00000000 00000000 00000000 80000000 00000000 00000001 0436a39b 31be9efa 6abd0c76 e7a68f83
+philox4x32 10 243f6a88 85a308d3 13198a2e 03707344 00000000 00000001 126514c3 d1898b69 da2707b3 6e6fb436
+philox4x32 10 a4093822 299f31d0 082efa98 ec4e6c89 00000000 00000001 1c28fa3f 8c5bf977 bb989783 0c1a3737
+philox4x32 10 452821e6 38d01377 be5466cf 34e90c6c 00000000 00000001 ac87a8c1 f240abdb add6c012 68a32a78
+philox4x32 10 00000001 00000000 00000000 00000000 00000000 ffffffff 473ab778 330bacc0 acd5fc9a 5ede76b3
+philox4x32 10 00000000 00000001 00000000 00000000 00000000 ffffffff cdfbd51c caae5f2e 10739cfc 79e95162
+philox4x32 10 00000000 00000000 00000001 00000000 00000000 ffffffff 6c4b0e80 357e5a94 3255445d 6f433f0b
+philox4x32 10 00000000 00000000 00000000 00000001 00000000 ffffffff 5c4ecd0c 64c12cf9 8f9fb4c8 40c4a01f
+philox4x32 10 00000000 ffffffff 00000000 00000000 00000000 ffffffff 5f9c47aa 19861d86 ff2be81d 4c7db17e
+philox4x32 10 00000000 80000000 00000000 00000000 00000000 ffffffff 715a87cf f966a7f0 3e6dd95f e884e2fd
+philox4x32 10 00000000 00000000 ffffffff 00000000 00000000 ffffffff 07678411 9e524307 ba634e67 94ee8cb7
+philox4x32 10 00000000 00000000 80000000 00000000 00000000 ffffffff b6f48e28 f2fa9414 00b64f66 4810cdb4
+philox4x32 10 00000000 00000000 00000000 ffffffff 00000000 ffffffff 9f18bb20 62161056 7ea8c028 4c01fc6e
+philox4x32 10 00000000 00000000 00000000 80000000 00000000 ffffffff 2a460458 0a2709e5 47bc9115 0f96d8af
+philox4x32 10 243f6a88 85a308d3 13198a2e 03707344 00000000 ffffffff 08f7720c 845ee9e0 502ccd3d a9a00e27
+philox4x32 10 a4093822 299f31d0 082efa98 ec4e6c89 00000000 ffffffff 9fcce05d 837d3f3c 5cdf3e61 db2544c0
+philox4x32 10 452821e6 38d01377 be5466cf 34e90c6c 00000000 ffffffff 72ce44b3 b44f9b78 49af0267 726813ac
+philox4x32 10 00000001 00000000 00000000 00000000 00000000 80000000 e29b9f84 2903d316 42a1f56f 1ad02eab
+philox4x32 10 00000000 00000001 00000000 00000000 00000000 80000000 94f419f8 1116c316 99f2fa30 bc048ad6
+philox4x32 10 00000000 00000000 00000001 00000000 00000000 80000000 488b0258 9eea6420 afe7062e 768f5637
+philox4x32 10 00000000 00000000 00000000 00000001 00000000 80000000 dbec6d70 69cea528 f7e22262 2e9f3e8f
+philox4x32 10 00000000 ffffffff 00000000 00000000 00000000 80000000 905ee550 c7520e9a 9af9d0ad 69b97e98
+philox4x32 10 00000000 80000000 00000000 00000000 00000000 80000000 1b89d963 0defe9af 60c9d3fb 3cfae97d
+philox4x32 10 00000000 00000000 ffffffff 00000000 00000000 80000000 601b5460 fe29678b 54510a02 c72ed094
+philox4x32 10 00000000 00000000 80000000 00000000 00000000 80000000 ae56ca02 7609ba67 25abd7df 46ce39a3
+philox4x32 10 00000000 00000000 00000000 ffffffff 00000000 80000000 09812238 47b8470d 3e0d0a26 92d96c9a
+philox4x32 10 00000000 00000000 00000000 80000000 00000000 80000000 f7a0b371 e51dc93d 56ce135d 1d4b5580
+philox4x32 10 243f6a88 85a308d3 13198a2e 03707344 00000000 80000000 63675d2c 422d7c4d 3145d30d 3bce33a4
+philox4x32 10 a4093822 299f31d0 082efa98 ec4e6c89 00000000 80000000 aa74e81c c9ddb97b 2c2cd881 9390c78d
+philox4x32 10 452821e6 38d01377 be5466cf 34e90c6c 00000000 80000000 94ca5566 14924b2f 28214292 59faeaee
+philox4x64 7 0000000000000001 0000000000000000 0000000000000000 0000000000000000 0000000000000001 0000000000000000 a84f99f224f4cfbc 274efe46f0cc52a1 d63e2ec6fdb168a0 075123647506ee27
+philox4x64 7 0000000000000000 0000000000000001 0000000000000000 0000000000000000 0000000000000001 0000000000000000 eb2bf03a13a1a1e3 56e7cbc84c87ec48 fc506dd46338cd70 46a7a39083ba8489
+philox4x64 7 0000000000000000 0000000000000000 0000000000000001 0000000000000000 0000000000000001 0000000000000000 86b74b62e856f3a5 6053b9cb9274a289 4c9b75ec697ea72a a4fa1ef2ff24eae2
+philox4x64 7 0000000000000000 0000000000000000 0000000000000000 0000000000000001 0000000000000001 0000000000000000 1ca5eced2c7cecd3 b1fcae7585130dc7 c0ea46280e16a2db 6d92ea22c9ad7e25
+philox4x64 7 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 0000000000000001 0000000000000000 ae055a5045f32faf bde85edbfd887cd4 5f0dce5cb463d2c3 20e5732feedfc102
+philox4x64 7 0000000000000000 8000000000000000 0000000000000000 0000000000000000 0000000000000001 0000000000000000 716bdad82151f110 991e7ed663cda695 b538a61037fa6f7b a33b549af210f319
+philox4x64 7 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000001 0000000000000000 ef3b00173dbfc105 d4d3378c1dbc8f3a 72bdd51b26d942f9 c6a1f46aa8d6fa9f
+philox4x64 7 0000000000000000 0000000000000000 8000000000000000 0000000000000000 0000000000000001 0000000000000000 dd0b5de968e6c5c0 6b78797808867752 0b5a7aaa79ea06bc dcc26e1185e4d95c
+philox4x64 7 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000001 0000000000000000 8cf59bc42e37b57e 0b6a6e082f3ea65d 694ad11a471343a5 50da2ec78fbb66e9
+philox4x64 7 0000000000000000 0000000000000000 0000000000000000 8000000000000000 0000000000000001 0000000000000000 2d9ca006eea83ab2 b6d94afceb4e5ebb 5ade5ab35910b0f8 94ead24dc22e07da
+philox4x64 7 243f6a8885a308d3 13198a2e03707344 a4093822299f31d0 082efa98ec4e6c89 0000000000000001 0000000000000000 e08b7a33c86d98e0 33aecd4f91b264b4 b91a88e80a219875 8f2a9dd82780854e
+philox4x64 7 0000000000000001 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000001 f5e3223b00116da4 134e2e4b93c349cd 05df4d3d10fe52a4 0cd4fc5f2a6d4605
+philox4x64 7 0000000000000000 0000000000000001 0000000000000000 0000000000000000 0000000000000000 0000000000000001 fa4318f3ddcbae0c d3822c687b18fbc9 fd6efa89fdf4def3 8a6e2b28c7000d51
+philox4x64 7 0000000000000000 0000000000000000 0000000000000001 0000000000000000 0000000000000000 0000000000000001 b71736800cb19cc2 465e0b290594a26f 7d6461c312bbb3d2 ab712cce37a08231
+philox4x64 7 0000000000000000 0000000000000000 0000000000000000 0000000000000001 0000000000000000 0000000000000001 e30b487d004a7790 a0b8ddb3235e7b2c ed4d107445bed6b8 0014a98401e1c79a
+philox4x64 7 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 0000000000000000 0000000000000001 cffa905456214f44 5d92693cc6a563b6 5c156d9fc4514d26 f681331c9095f9d0
+philox4x64 7 0000000000000000 8000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000001 af633db845c5b35a 3c904c74d24a616d e058112dc1e3d77f 2b486a45fc44757c
+philox4x64 7 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 0000000000000001 51ec481f11ca6d9c 5af7aee63bbdef91 fd9219ace01ca886 371274c68c106c72
+philox4x64 7 0000000000000000 0000000000000000 8000000000000000 0000000000000000 0000000000000000 0000000000000001 84368e022df11716 9babf90b2d734275 ac2b18faf4b70450 74df64b2f1d44a4d
+philox4x64 7 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000001 a07151c1a2096454 f1a175c7c4d40fa0 cdde1a462fb4d017 3e717c0b191a75e2
+philox4x64 7 0000000000000000 0000000000000000 0000000000000000 8000000000000000 0000000000000000 0000000000000001 9059231222d6b54a c10c9276b5d8b864 3c6d04e46e384088 df9c4a211d0df316
+philox4x64 7 243f6a8885a308d3 13198a2e03707344 a4093822299f31d0 082efa98ec4e6c89 0000000000000000 0000000000000001 0046825443639c50 1c1a53c10fd6a39a 204525814c2bf9ca a2a8a25b1cfe992e
+philox4x64 7 0000000000000001 0000000000000000 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff bd030c40201c0f70 8de0448c8d01b695 e0a3f6bb1516887d 3b17f2a2ac08146f
+philox4x64 7 0000000000000000 0000000000000001 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 0adde99a7834d3be 381bec931b9ad649 a08229387d02463a dcbe1ac725399cee
+philox4x64 7 0000000000000000 0000000000000000 0000000000000001 0000000000000000 0000000000000000 ffffffffffffffff f3e86513a4e70e1e 186f958e53095344 3b971ea6c9a81548 dfafa60231e08d3d
+philox4x64 7 0000000000000000 0000000000000000 0000000000000000 0000000000000001 0000000000000000 ffffffffffffffff e0f90c7455a782a6 c552e4d263923300 22a0948ea7972b4d e387aec33822523c
+philox4x64 7 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 52a6a2780e51d7b2 3673bb81e995d85d b12dd4b6eb72d6f0 2e1909106a07a8cf
+philox4x64 7 0000000000000000 8000000000000000 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff c189106b490bd2fb 4f6d1dd470fdfbcb a7bd83ddeb0a1dab 045aa110f8f52c40
+philox4x64 7 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 ffffffffffffffff 9df8faedb521ef1e f1a120f15e091886 1d4689c5d1779200 829ef45f53092914
+philox4x64 7 0000000000000000 0000000000000000 8000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 767a5736b7d348aa efa73968ff5c0444 ede6adac4e8d4795 c366d2c5357e0bae
+philox4x64 7 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 ffffffffffffffff cd2b03d43747bf25 b1e1d178f4476f31 2f04f2e652429d2b 3f18ff71fe2b1d96
+philox4x64 7 0000000000000000 0000000000000000 0000000000000000 8000000000000000 0000000000000000 ffffffffffffffff ae8dd2e4f571e95e cbe84fe3c5c7a22e 41958d43eb183198 be273430e39dbb2d
+philox4x64 7 243f6a8885a308d3 13198a2e03707344 a4093822299f31d0 082efa98ec4e6c89 0000000000000000 ffffffffffffffff 6eaea4468842c579 61c993f6deddb8b7 32da2c8845639fea 1caa39d539440f84
+philox4x64 7 0000000000000001 0000000000000000 0000000000000000 0000000000000000 0000000000000000 8000000000000000 fdb4c38370017081 37f20a8cded028e1 07b6b7e9b441ca64 afcbb7db096a11ba
+philox4x64 7 0000000000000000 0000000000000001 0000000000000000 0000000000000000 0000000000000000 8000000000000000 77f9f02957fe399f e7bcf2e59a9c0014 60c025f137ddfdef 6e2d9e24f28b054f
+philox4x64 7 0000000000000000 0000000000000000 0000000000000001 0000000000000000 0000000000000000 8000000000000000 b1dffa9d26bb2bba a686af9fbc2fccca 7703523657b1f11d d1b1117279f5e560
+philox4x64 7 0000000000000000 0000000000000000 0000000000000000 0000000000000001 0000000000000000 8000000000000000 1ee64cc049af47d4 130f44d0d6cb90b1 8aa65fb519e08c1d 5fd2902cdd9c4b21
+philox4x64 7 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 0000000000000000 8000000000000000 5eda50bb0f6bf36b a61c3684ea63eac2 72577567a117738a 4c2f885c923f8a50
+philox4x64 7 0000000000000000 8000000000000000 0000000000000000 0000000000000000 0000000000000000 8000000000000000 62c4b12d2d6f4f43 7ac09a7a5f78a347 eaeceb4a5d707d81 ddc693c1152ca863
+philox4x64 7 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 8000000000000000 19b89a3a0ebfc396 851393a4eb9800e1 60219574c2cfdf14 99835afa209b5a5f
+philox4x64 7 0000000000000000 0000000000000000 8000000000000000 0000000000000000 0000000000000000 8000000000000000 fccd9c83d6bef5c8 495bdfc8980206ec ef6b8861816b556e 6750afa3867363f8
+philox4x64 7 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 8000000000000000 7793fdab901f40e2 0770db0a6546aebc 9414169ccb08ea4f 8e4107ded7e6fe22
+philox4x64 7 0000000000000000 0000000000000000 0000000000000000 8000000000000000 0000000000000000 8000000000000000 2e2e8b89c1ecd349 a7a9e220db717f97 39841e145bee64ec af899729cd317ab5
+philox4x64 7 243f6a8885a308d3 13198a2e03707344 a4093822299f31d0 082efa98ec4e6c89 0000000000000000 8000000000000000 c4b6db2cafd36b63 1c10b197be4bb8f9 6ccf699079df5db9 7426268167ef98ce
+philox4x64 10 0000000000000001 0000000000000000 0000000000000000 0000000000000000 0000000000000001 0000000000000000 4db6a27b756282df d944fa03babe0e2f 27f872e577060d32 07f697696a0482a2
+philox4x64 10 0000000000000000 0000000000000001 0000000000000000 0000000000000000 0000000000000001 0000000000000000 bbf738c62d3516b3 7faed3926853226b c175b4809d5da923 7a77f6c341cec732
+philox4x64 10 0000000000000000 0000000000000000 0000000000000001 0000000000000000 0000000000000001 0000000000000000 05c42b05ff257651 83431181197ac359 57be92230b7ced59 75073635c66ba84b
+philox4x64 10 0000000000000000 0000000000000000 0000000000000000 0000000000000001 0000000000000001 0000000000000000 8047f8778e0c2a18 da91ab55df266829 5a8b0adc29d708de d2ba72e9a5f8ca1f
+philox4x64 10 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 0000000000000001 0000000000000000 82a98ead15250c68 dca14805e19e01bc 7bc58279fe853ad2 4366ca54a9015751
+philox4x64 10 0000000000000000 8000000000000000 0000000000000000 0000000000000000 0000000000000001 0000000000000000 5103c647343f9197 a979e24146bddfdb a38a5cea6c70d5ea 69dbc87d145feea6
+philox4x64 10 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000001 0000000000000000 f5cfc4e5a58df07a 6fcdcdd4c962f858 9924d9474dfddf2f f5da8c63141ebe42
+philox4x64 10 0000000000000000 0000000000000000 8000000000000000 0000000000000000 0000000000000001 0000000000000000 0dd2beab02c79d3b 85868d969fc6d557 da416fa7e6efe9a5 97aa0f5a07837f3c
+philox4x64 10 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000001 0000000000000000 e3de832dbefa4f20 9d8e387753e80554 3f942711126531ab cbac59ef8a8facfc
+philox4x64 10 0000000000000000 0000000000000000 0000000000000000 8000000000000000 0000000000000001 0000000000000000 4aea7a2d45ef6b56 9d39b7727af2b34d 710b6c665646f6f3 4c266cbd9914407c
+philox4x64 10 243f6a8885a308d3 13198a2e03707344 a4093822299f31d0 082efa98ec4e6c89 0000000000000001 0000000000000000 c306b6f69047b4d3 50a141b88a52f51f c1255f575c5efa40 e9ec1af0c5fd12e7
+philox4x64 10 0000000000000001 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000001 d037f8c3f9a1d176 c057419b4c210765 abf13115117b0065 7bae035dea6ea5c0
+philox4x64 10 0000000000000000 0000000000000001 0000000000000000 0000000000000000 0000000000000000 0000000000000001 5f173f0fc52df6ee 8e8e9c9688aed89e abdae5020b0cb568 48f2b1309feded50
+philox4x64 10 0000000000000000 0000000000000000 0000000000000001 0000000000000000 0000000000000000 0000000000000001 fc2c9c4d9ddaf082 2897652bb49dcae3 baaf4535a51ae093 97a0e3db84f4deda
+philox4x64 10 0000000000000000 0000000000000000 0000000000000000 0000000000000001 0000000000000000 0000000000000001 c403b0ed4f4a56bc 4c10205602338da5 44026cf45fd8c7b3 c85ab2577611200a
+philox4x64 10 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 0000000000000000 0000000000000001 a6b0eb43d4242e83 7eb0571197ef0432 595c5ac87ab02ffd 3065201e77c7719d
+philox4x64 10 0000000000000000 8000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000001 06fc1ee830dac525 9dbd142788436b9f 5142f5068c0d523b 3a272b75f6fc8d07
+philox4x64 10 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 0000000000000001 05ea68c26fda314d bfedb09469623669 b5d90ab786f50a8a 91ab55b3322fa08b
+philox4x64 10 0000000000000000 0000000000000000 8000000000000000 0000000000000000 0000000000000000 0000000000000001 fc66f7ed4a80f91a 26321095c87d4593 b7c965253657e98f 9ec415f9832e5a5b
+philox4x64 10 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000001 0a3c7e26094a08d3 2adb8f85553814c3 2e4991e78f66b1e3 15eb86339cfe3169
+philox4x64 10 0000000000000000 0000000000000000 0000000000000000 8000000000000000 0000000000000000 0000000000000001 fc1433efdbd33e21 808ce83adf2a77f8 96ee08d151e9bb53 e8f4c80839491335
+philox4x64 10 243f6a8885a308d3 13198a2e03707344 a4093822299f31d0 082efa98ec4e6c89 0000000000000000 0000000000000001 43e89f25ef59b052 d2502d395a99506d d5c391a65ae822ed 5b049af4d110de73
+philox4x64 10 0000000000000001 0000000000000000 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 72d6708a2e33f32e cdb7d7084ea573af 7afec3befacf7bfa 973f3514d6cb878e
+philox4x64 10 0000000000000000 0000000000000001 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 78f3fb4b2e6c3b4c 8ff0de70dc8d4d15 7ff4df00521f1fa6 562c6ab0f46014a6
+philox4x64 10 0000000000000000 0000000000000000 0000000000000001 0000000000000000 0000000000000000 ffffffffffffffff 2387991c4ec7757a b5386352c0608d17 4e1652d424a4e695 0a51cf9337aa092d
+philox4x64 10 0000000000000000 0000000000000000 0000000000000000 0000000000000001 0000000000000000 ffffffffffffffff e6ffec0a65d827e2 4eda0ce957436ecb 044226366e687984 c563403773ea4586
+philox4x64 10 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 610763733452c58c 782a055afc18c1b2 9a6f11fd37bba6b7 7230bfcc8a5f81b8
+philox4x64 10 0000000000000000 8000000000000000 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 0227ecdbbe8da04d c78fb8f0b412a18b 2c95e618493dbf20 b3ecdbb8c2ef1600
+philox4x64 10 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 ffffffffffffffff 9dd4b8f423be915e 43cd5fa1ab84838c 9bdd5bc7b21d5372 ae35cb6a3d94c1fe
+philox4x64 10 0000000000000000 0000000000000000 8000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 127083ab716caa91 96939425b7ef4758 da6dbf8bfa9da76b f4a9720c1af9e0e2
+philox4x64 10 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 ffffffffffffffff 3609d7e72c5bf1ea e82604f634f7ad33 8b6c9f114736edf2 83dcba394e12f45a
+philox4x64 10 0000000000000000 0000000000000000 0000000000000000 8000000000000000 0000000000000000 ffffffffffffffff cc2e3611b341b443 d975353c6baa07e8 4d0e70419e907e10 8a4dceea01380ae1
+philox4x64 10 243f6a8885a308d3 13198a2e03707344 a4093822299f31d0 082efa98ec4e6c89 0000000000000000 ffffffffffffffff 7abbd897f6d97f60 a35c61aae7c5a341 939a3dd4f55b2e11 aca6e644802e2b83
+philox4x64 10 0000000000000001 0000000000000000 0000000000000000 0000000000000000 0000000000000000 8000000000000000 95bf028be28ca5e8 80a06590a6c807a8 1770cb520415bcba fecac07f93e9ed1f
+philox4x64 10 0000000000000000 0000000000000001 0000000000000000 0000000000000000 0000000000000000 8000000000000000 6aa3e3e8852b4cc4 eeed4a014947ee9a b347eb5bb39cbcee f048d1bc0fc2b4f2
+philox4x64 10 0000000000000000 0000000000000000 0000000000000001 0000000000000000 0000000000000000 8000000000000000 86b7bbf896316096 dbf03c3291b0e8e4 f7baf2cce7820704 6901641d0e74863d
+philox4x64 10 0000000000000000 0000000000000000 0000000000000000 0000000000000001 0000000000000000 8000000000000000 a22ba98c8739f11c 75840cee16d70e1a 59211c4195818dbb 26fd6d1dd8b4d938
+philox4x64 10 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 0000000000000000 8000000000000000 b7a2f1ee3064f644 5bfed8c7b0e09ec9 d7ef6479063d9862 b94fd6571ec99673
+philox4x64 10 0000000000000000 8000000000000000 0000000000000000 0000000000000000 0000000000000000 8000000000000000 237b3d9bab6c147b 15cd10a376b3ba31 e9fca9f852456a7c 011d03871fbcd351
+philox4x64 10 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 8000000000000000 c2af8ad32fd4de40 210519dc3915cf8d 96d7b5aaac61e656 bf890353d0e4f406
+philox4x64 10 0000000000000000 0000000000000000 8000000000000000 0000000000000000 0000000000000000 8000000000000000 deabe779ac4018bf c244924f18a0bd57 b2c176463cbcdd44 924c5c68f49efe61
+philox4x64 10 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 8000000000000000 65084d38b2079128 26278aadff5dc8a0 12b70968c429186c 3008f3151aec94d0
+philox4x64 10 0000000000000000 0000000000000000 0000000000000000 8000000000000000 0000000000000000 8000000000000000 4e5204874c73745c b416cb6ef85bba05 87819def7e3f93a0 cc38b1dbe3d9d6e9
+philox4x64 10 243f6a8885a308d3 13198a2e03707344 a4093822299f31d0 082efa98ec4e6c89 0000000000000000 8000000000000000 79b0012fa80e5ad7 15b81f9bf706cc38 6586b6802ea9ba1c 1bba4ac847739bca
+threefry2x32 13 00000001 00000000 00000001 00000000 d460839c ee5930d0
+threefry2x32 13 00000000 00000001 00000001 00000000 ea891938 471d995c
+threefry2x32 13 00000000 ffffffff 00000001 00000000 c5e14858 bd7ab190
+threefry2x32 13 00000000 00000000 00000001 00000000 61ec2d44 95654539
+threefry2x32 13 85a308d3 03707344 00000001 00000000 ade2ae91 0d6ab23f
+threefry2x32 13 299f31d0 ec4e6c89 00000001 00000000 c2e3fb83 a2106e59
+threefry2x32 13 38d01377 34e90c6c 00000001 00000000 56362c81 144ef0e3
+threefry2x32 13 00000001 00000000 00000000 00000001 2ecbda41 982f3323
+threefry2x32 13 00000000 00000001 00000000 00000001 8f4c4973 dc866a7b
+threefry2x32 13 00000000 ffffffff 00000000 00000001 83ecfb53 4e25540b
+threefry2x32 13 00000000 00000000 00000000 00000001 7a3f4f18 3aaa1dff
+threefry2x32 13 85a308d3 03707344 00000000 00000001 7fac70ab 49b0b079
+threefry2x32 13 299f31d0 ec4e6c89 00000000 00000001 244c0e5d 55ae15dd
+threefry2x32 13 38d01377 34e90c6c 00000000 00000001 da2d36d7 adebf45a
+threefry2x32 13 00000001 00000000 00000000 ffffffff d858c2ae a698929b
+threefry2x32 13 00000000 00000001 00000000 ffffffff 5da8f6fe 123c29d0
+threefry2x32 13 00000000 ffffffff 00000000 ffffffff 0e22aa9d 848090af
+threefry2x32 13 00000000 00000000 00000000 ffffffff dace553b b8265b65
+threefry2x32 13 85a308d3 03707344 00000000 ffffffff 35aa55c0 223e1b40
+threefry2x32 13 299f31d0 ec4e6c89 00000000 ffffffff 88771755 0a184a3e
+threefry2x32 13 38d01377 34e90c6c 00000000 ffffffff 4b6695da c4532c17
+threefry2x32 13 00000001 00000000 00000000 00000000 fdddad3b cb69c1c2
+threefry2x32 13 00000000 00000001 00000000 00000000 4050e5b0 f6bca927
+threefry2x32 13 00000000 ffffffff 00000000 00000000 09c64211 b4e160b6
+threefry2x32 13 00000000 00000000 00000000 00000000 9d1c5ec6 8bd50731
+threefry2x32 13 85a308d3 03707344 00000000 00000000 a985a4e2 fb491ec4
+threefry2x32 13 299f31d0 ec4e6c89 00000000 00000000 cb484bfb e0dc3459
+threefry2x32 13 38d01377 34e90c6c 00000000 00000000 40f75b24 29b5d523
+threefry2x32 20 00000001 00000000 00000001 00000000 0ec66872 2d84e7b1
+threefry2x32 20 00000000 00000001 00000001 00000000 e8de5dc1 461e61e4
+threefry2x32 20 00000000 ffffffff 00000001 00000000 74100836 8f0cc08e
+threefry2x32 20 00000000 00000000 00000001 00000000 b435a7fa 96eb2785
+threefry2x32 20 85a308d3 03707344 00000001 00000000 6d2173ca 182d2d62
+threefry2x32 20 299f31d0 ec4e6c89 00000001 00000000 053c52c2 a5fd076c
+threefry2x32 20 38d01377 34e90c6c 00000001 00000000 0aff7206 20c6b1ad
+threefry2x32 20 00000001 00000000 00000000 00000001 4233dc34 3df99f6b
+threefry2x32 20 00000000 00000001 00000000 00000001 74298876 fc8d8048
+threefry2x32 20 00000000 ffffffff 00000000 00000001 45ecd01c effc9cbd
+threefry2x32 20 00000000 00000000 00000000 00000001 1e3f1835 6e752082
+threefry2x32 20 85a308d3 03707344 00000000 00000001 985706f1 39ede42b
+threefry2x32 20 299f31d0 ec4e6c89 00000000 00000001 9b255e86 836367b6
+threefry2x32 20 38d01377 34e90c6c 00000000 00000001 eacbd1c2 ddac6576
+threefry2x32 20 00000001 00000000 00000000 ffffffff 0a5c684a 89734cfb
+threefry2x32 20 00000000 00000001 00000000 ffffffff ce53f10b 4253b296
+threefry2x32 20 00000000 ffffffff 00000000 ffffffff dd0a4b72 e61f3a35
+threefry2x32 20 00000000 00000000 00000000 ffffffff b139a81a 35816875
+threefry2x32 20 85a308d3 03707344 00000000 ffffffff 09658c63 5ab84cbb
+threefry2x32 20 299f31d0 ec4e6c89 00000000 ffffffff c2662ee4 dae195a6
+threefry2x32 20 38d01377 34e90c6c 00000000 ffffffff f57c9b26 3333f9c2
+threefry2x32 20 00000001 00000000 00000000 00000000 508efb2c c0de3f32
+threefry2x32 20 00000000 00000001 00000000 00000000 375f238f cddb151d
+threefry2x32 20 00000000 ffffffff 00000000 00000000 2c4e0437 e1e32d13
+threefry2x32 20 00000000 00000000 00000000 00000000 6b200159 99ba4efe
+threefry2x32 20 85a308d3 03707344 00000000 00000000 8a7778e0 ba02812d
+threefry2x32 20 299f31d0 ec4e6c89 00000000 00000000 46367996 5ebc6941
+threefry2x32 20 38d01377 34e90c6c 00000000 00000000 0bfcf941 19b8c9e3
+threefry2x64 13 0000000000000001 0000000000000000 0000000000000001 0000000000000000 969384cc85e4f376 7483ab72c7895c74
+threefry2x64 13 0000000000000000 0000000000000001 0000000000000001 0000000000000000 a834c98cc31101ea e55d6fcaae6c2303
+threefry2x64 13 0000000000000000 ffffffffffffffff 0000000000000001 0000000000000000 ea4631bbb7e357da 76431283a854ad4d
+threefry2x64 13 0000000000000000 8000000000000000 0000000000000001 0000000000000000 aebb048a42880e06 0a82fc96ab46703c
+threefry2x64 13 243f6a8885a308d3 13198a2e03707344 0000000000000001 0000000000000000 f76fab3d0c8c5f58 86a6582b195612d5
+threefry2x64 13 a4093822299f31d0 082efa98ec4e6c89 0000000000000001 0000000000000000 4f56a3dab3651001 cfcdd06f8b5b9839
+threefry2x64 13 452821e638d01377 be5466cf34e90c6c 0000000000000001 0000000000000000 c9fc81ac4243db43 901cfd8fd5f300fd
+threefry2x64 13 0000000000000001 0000000000000000 0000000000000000 0000000000000001 4b4b7208689c3b75 a55414a2d2ee4bb0
+threefry2x64 13 0000000000000000 0000000000000001 0000000000000000 0000000000000001 eebbc15aa98df672 e9a144a8c6cee1fd
+threefry2x64 13 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000001 4205e3c81cc0d747 ff9bee23459767fe
+threefry2x64 13 0000000000000000 8000000000000000 0000000000000000 0000000000000001 3adcde8fdf34b6ea b181e52876711403
+threefry2x64 13 243f6a8885a308d3 13198a2e03707344 0000000000000000 0000000000000001 f32f578de3c86db0 33cba85c3ab32ac2
+threefry2x64 13 a4093822299f31d0 082efa98ec4e6c89 0000000000000000 0000000000000001 8b991da7e77d5ad2 e0f66c743d048332
+threefry2x64 13 452821e638d01377 be5466cf34e90c6c 0000000000000000 0000000000000001 b3839b7842aaabdf 1b09812c3734f7d5
+threefry2x64 13 0000000000000001 0000000000000000 0000000000000000 ffffffffffffffff d734efd44c40a6b0 c200d10c90840acf
+threefry2x64 13 0000000000000000 0000000000000001 0000000000000000 ffffffffffffffff 0a54d24f2de3fe2d c94935795a374f71
+threefry2x64 13 0000000000000000 ffffffffffffffff 0000000000000000 ffffffffffffffff b05f97bf8112bd85 1e2febcdf6f2434b
+threefry2x64 13 0000000000000000 8000000000000000 0000000000000000 ffffffffffffffff 706e230984d25125 1a7fb58e33062071
+threefry2x64 13 243f6a8885a308d3 13198a2e03707344 0000000000000000 ffffffffffffffff e79c1e9a9638a94b 0696219fb2391fdd
+threefry2x64 13 a4093822299f31d0 082efa98ec4e6c89 0000000000000000 ffffffffffffffff 63b3b5d7355ee523 98226c5378d79481
+threefry2x64 13 452821e638d01377 be5466cf34e90c6c 0000000000000000 ffffffffffffffff a74b06d5dd1e77bc 78ace2fdf2fd1130
+threefry2x64 13 0000000000000001 0000000000000000 0000000000000000 8000000000000000 695a084cd9107249 7c2a145f7a914169
+threefry2x64 13 0000000000000000 0000000000000001 0000000000000000 8000000000000000 426ce9a41d6e3b44 1f406838af84fc50
+threefry2x64 13 0000000000000000 ffffffffffffffff 0000000000000000 8000000000000000 29fb2a250cb2be0e ab5d1d66743cb621
+threefry2x64 13 0000000000000000 8000000000000000 0000000000000000 8000000000000000 8f5f55581e428ef4 6f50999482bb0717
+threefry2x64 13 243f6a8885a308d3 13198a2e03707344 0000000000000000 8000000000000000 8132c0494d3a1024 1310f2c1f743337e
+threefry2x64 13 a4093822299f31d0 082efa98ec4e6c89 0000000000000000 8000000000000000 f0ac482e2f8c554e 0c250a7c2bd56d1f
+threefry2x64 13 452821e638d01377 be5466cf34e90c6c 0000000000000000 8000000000000000 c74c1599c6d82c7f 7d40926bdb8a9b86
+threefry2x64 20 0000000000000001 0000000000000000 0000000000000001 0000000000000000 76f8c465410f1b27 d44c2d67df04a330
+threefry2x64 20 0000000000000000 0000000000000001 0000000000000001 0000000000000000 a8049503dd3079f9 3d5ddeed522c0ede
+threefry2x64 20 0000000000000000 ffffffffffffffff 0000000000000001 0000000000000000 5e53259aa4258a55 0e8f38c365945d25
+threefry2x64 20 0000000000000000 8000000000000000 0000000000000001 0000000000000000 361a8be863ffb732 a4b1a2eeb58e74d0
+threefry2x64 20 243f6a8885a308d3 13198a2e03707344 0000000000000001 0000000000000000 fd6ae8f34dc33d12 038c18af4795d22a
+threefry2x64 20 a4093822299f31d0 082efa98ec4e6c89 0000000000000001 0000000000000000 7ac8bd11c1f70ff1 74639e2ca058255e
+threefry2x64 20 452821e638d01377 be5466cf34e90c6c 0000000000000001 0000000000000000 ed08efd2a170bbd7 0dd10199b9784662
+threefry2x64 20 0000000000000001 0000000000000000 0000000000000000 0000000000000001 ff2b78b5ab41d8da f62ebfe044d2eda8
+threefry2x64 20 0000000000000000 0000000000000001 0000000000000000 0000000000000001 5f3a212f661cd020 986a3ba650b3fe67
+threefry2x64 20 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000001 6a6b93a7418044f4 87b8ba42ce2ff9bf
+threefry2x64 20 0000000000000000 8000000000000000 0000000000000000 0000000000000001 bae5e0296c6a477d 0fbb8a9f8a4ce574
+threefry2x64 20 243f6a8885a308d3 13198a2e03707344 0000000000000000 0000000000000001 99cec910eff5ec80 590c31d2679b536f
+threefry2x64 20 a4093822299f31d0 082efa98ec4e6c89 0000000000000000 0000000000000001 02f8b55a501f2281 d76b4bf86e78c17a
+threefry2x64 20 452821e638d01377 be5466cf34e90c6c 0000000000000000 0000000000000001 85ed5f68252b8dad 94e7c2f00c87c774
+threefry2x64 20 0000000000000001 0000000000000000 0000000000000000 ffffffffffffffff 2315d2c0d1827ca7 6c9edc5ea9168247
+threefry2x64 20 0000000000000000 0000000000000001 0000000000000000 ffffffffffffffff e673b4093ab96a92 e6b9195814502ad9
+threefry2x64 20 0000000000000000 ffffffffffffffff 0000000000000000 ffffffffffffffff 617e1767c6bab4b3 9defeccc66ef5483
+threefry2x64 20 0000000000000000 8000000000000000 0000000000000000 ffffffffffffffff 64008223d83f51ea 703e62828caafe5c
+threefry2x64 20 243f6a8885a308d3 13198a2e03707344 0000000000000000 ffffffffffffffff 55c5791f5e6a445c 6244e287ceff815b
+threefry2x64 20 a4093822299f31d0 082efa98ec4e6c89 0000000000000000 ffffffffffffffff 69f5517074ffb421 364c6cb5114df09b
+threefry2x64 20 452821e638d01377 be5466cf34e90c6c 0000000000000000 ffffffffffffffff 8abfad0acf126feb 7e4838608dff93a6
+threefry2x64 20 0000000000000001 0000000000000000 0000000000000000 8000000000000000 f3113561b7808541 e1d6850fd01f03c8
+threefry2x64 20 0000000000000000 0000000000000001 0000000000000000 8000000000000000 1f254bdb6686f3f7 2defd1bc9a4e7d58
+threefry2x64 20 0000000000000000 ffffffffffffffff 0000000000000000 8000000000000000 becfaedd81933ce0 91105295132db554
+threefry2x64 20 0000000000000000 8000000000000000 0000000000000000 8000000000000000 08e7eef4615bbae3 16c446fef3ff2fa6
+threefry2x64 20 243f6a8885a308d3 13198a2e03707344 0000000000000000 8000000000000000 58af89abe6d07cab 12e1901ad854ba14
+threefry2x64 20 a4093822299f31d0 082efa98ec4e6c89 0000000000000000 8000000000000000 469ded4657b380b5 4e18d924d1d191f4
+threefry2x64 20 452821e638d01377 be5466cf34e90c6c 0000000000000000 8000000000000000 89983220cc01af30 756813c51f68660f
+threefry4x64 13 0000000000000001 0000000000000000 0000000000000000 0000000000000000 0000000000000001 0000000000000000 0000000000000000 0000000000000000 a6f9957bb320bd6e ef0a1039b8680652 fae787a45de5657b f9642457fdfcb48d
+threefry4x64 13 0000000000000000 0000000000000001 0000000000000000 0000000000000000 0000000000000001 0000000000000000 0000000000000000 0000000000000000 33a54b87b3cd8f2e 9fa6ecdbf563b5a8 931690edd16e1167 73f4cf17f6509ec7
+threefry4x64 13 0000000000000000 0000000000000000 0000000000000001 0000000000000000 0000000000000001 0000000000000000 0000000000000000 0000000000000000 b57fb4d862d825f6 5f5a8b05deb0f388 bdaf7ca748b32db5 dcc8a16110f45860
+threefry4x64 13 0000000000000000 0000000000000000 0000000000000000 0000000000000001 0000000000000001 0000000000000000 0000000000000000 0000000000000000 63afa273fd1e9e0c 97afe3fa44762e3b 2219a168a1c4a650 b5aa9e933220d0b6
+threefry4x64 13 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 0000000000000001 0000000000000000 0000000000000000 0000000000000000 18ebd38f634db4d4 fe8a4b02116edcae dd968dbd012bb9b1 015735f374007b55
+threefry4x64 13 0000000000000000 8000000000000000 0000000000000000 0000000000000000 0000000000000001 0000000000000000 0000000000000000 0000000000000000 dc11f8adbd11b24a 791accb12bf2dec9 b3252ca2b3d45867 32583a89606cc095
+threefry4x64 13 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000001 0000000000000000 0000000000000000 0000000000000000 142fbf027471bec7 d4a21fe298e42da0 e1809cdb47379df7 895c488e4ce2e8e4
+threefry4x64 13 0000000000000000 0000000000000000 8000000000000000 0000000000000000 0000000000000001 0000000000000000 0000000000000000 0000000000000000 56233cf7c5050e03 138e50f0180f9432 77e5abc32171ead2 22156b3a4478058e
+threefry4x64 13 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000001 0000000000000000 0000000000000000 0000000000000000 b51f94a1964e29f4 73c3547be95bcf52 cd0980b164b47740 cb7a80706dda6cd4
+threefry4x64 13 0000000000000000 0000000000000000 0000000000000000 8000000000000000 0000000000000001 0000000000000000 0000000000000000 0000000000000000 6826fc7451e6c26c 9c945a480118b238 878fdb0ccf5287a2 b721878054b3e170
+threefry4x64 13 243f6a8885a308d3 13198a2e03707344 a4093822299f31d0 082efa98ec4e6c89 0000000000000001 0000000000000000 0000000000000000 0000000000000000 1450ad64afc5f2ed e276f0d9b36896cc 1bf54af66c1ea6e1 b75bf6b012256a2f
+threefry4x64 13 0000000000000001 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000001 0000000000000000 0000000000000000 c0a579b6df85d3f0 732bf17e102f3503 e9ef8226f861b581 9c6323b1032ee103
+threefry4x64 13 0000000000000000 0000000000000001 0000000000000000 0000000000000000 0000000000000000 0000000000000001 0000000000000000 0000000000000000 419fb75d6279b45e 456c9bc33b2aa89b 6b9f17cbeaafb959 0f4d34c7bc2615dd
+threefry4x64 13 0000000000000000 0000000000000000 0000000000000001 0000000000000000 0000000000000000 0000000000000001 0000000000000000 0000000000000000 35dc176476fd83f7 11c97fffd44c6f08 803723f5c82c0c4c 915629678133f8d0
+threefry4x64 13 0000000000000000 0000000000000000 0000000000000000 0000000000000001 0000000000000000 0000000000000001 0000000000000000 0000000000000000 7b6e1a8f678caef4 db5a7994ef339ef5 b7aff2cabd5a0d5a a1b164b52ef2880c
+threefry4x64 13 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 0000000000000000 0000000000000001 0000000000000000 0000000000000000 e335bf28c658f0a2 6dc44599a8dc94ac 17ce032c8be59e34 46bf9933175c2c84
+threefry4x64 13 0000000000000000 8000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000001 0000000000000000 0000000000000000 a0ca6ff95e2395e3 f178163a7734c5a4 3fa3d6b89533b005 74ae65ed952f7779
+threefry4x64 13 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 0000000000000001 0000000000000000 0000000000000000 87043dbdc9710b4f 9257db04f6d3e197 385860312b4c2170 ce4cf41003912f85
+threefry4x64 13 0000000000000000 0000000000000000 8000000000000000 0000000000000000 0000000000000000 0000000000000001 0000000000000000 0000000000000000 7040ee2508a3b5f8 641da9784e15d9cb fd6425f2b65abfcd 52a998ee7e05bb87
+threefry4x64 13 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000001 0000000000000000 0000000000000000 c435439eadf80e26 3d1d6a0cc0c5a1ff 6e0f4ab6ccc428e6 a01b294b56f911ca
+threefry4x64 13 0000000000000000 0000000000000000 0000000000000000 8000000000000000 0000000000000000 0000000000000001 0000000000000000 0000000000000000 c6a96a811e9e7967 246e0dde25ee2e41 4f2a463cafbc149d eed2f0dd7fb7e015
+threefry4x64 13 243f6a8885a308d3 13198a2e03707344 a4093822299f31d0 082efa98ec4e6c89 0000000000000000 0000000000000001 0000000000000000 0000000000000000 3eb1e2a9f11e2bf6 c4bbbb8f8b92a4f3 a2785db07b5e26e3 dfe2c344e871d170
+threefry4x64 13 0000000000000001 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000001 0000000000000000 94daba158dd2da48 f5e6c0b25edfef90 02dc9eadc3f11073 c6bc42a8d86e82e0
+threefry4x64 13 0000000000000000 0000000000000001 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000001 0000000000000000 2f0dd3a02e097fe7 c478a58d8de77acd 432b1f1a4f0376d1 a8ffef5de8592b22
+threefry4x64 13 0000000000000000 0000000000000000 0000000000000001 0000000000000000 0000000000000000 0000000000000000 0000000000000001 0000000000000000 e145933082f42a2b 281a975a59959231 42e82c1fa3928ee2 ccc5c01c9c173ff6
+threefry4x64 13 0000000000000000 0000000000000000 0000000000000000 0000000000000001 0000000000000000 0000000000000000 0000000000000001 0000000000000000 98968fa4a639959e 31522da140cfa5f4 3925eef1f1df6024 8d364318e053e86b
+threefry4x64 13 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000001 0000000000000000 8b7a6424cd57bd36 0f14e72a776d9eba 5056bbff35bb2d8b 2bf2035a0f74457b
+threefry4x64 13 0000000000000000 8000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000001 0000000000000000 b98486865fe19a16 bbf02df5d0b6f14e 1d1d3db837473cfe 39d36d4ef6027d20
+threefry4x64 13 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 0000000000000000 0000000000000001 0000000000000000 4546fa00ed7ba2e7 b9598f5ffa69d1b5 2a31e21e7479956b 18b430b333a65956
+threefry4x64 13 0000000000000000 0000000000000000 8000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000001 0000000000000000 7e3fc60c2ba2b532 42ecfe3256df67fd 12cc29eda1e8e628 476fa98b6c20dc0c
+threefry4x64 13 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 0000000000000001 0000000000000000 0553dc3e29eb393e 4fcb860d74474ba2 a54bda273d90fa5e b2d09969a3e0781e
+threefry4x64 13 0000000000000000 0000000000000000 0000000000000000 8000000000000000 0000000000000000 0000000000000000 0000000000000001 0000000000000000 1b0d22708753d5a5 fe97c91941b129a0 43fde34d3a6b9581 684ee07a5d059bc6
+threefry4x64 13 243f6a8885a308d3 13198a2e03707344 a4093822299f31d0 082efa98ec4e6c89 0000000000000000 0000000000000000 0000000000000001 0000000000000000 c5ae23b6e14b65a0 1bb8c20cf54ee911 afd0f01436a88dc7 e27b950209d0e8ea
+threefry4x64 13 0000000000000001 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000001 d6e0471854c36f95 024f53084350d59a a746f965db3779ab aec82c5a5a89448a
+threefry4x64 13 0000000000000000 0000000000000001 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000001 c5aa1f1c7ae358f3 97a8892135e7c1ef eb25fba1cb9a4c41 7a90abbd43261fa4
+threefry4x64 13 0000000000000000 0000000000000000 0000000000000001 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000001 fb59e13f8bf1a7b6 3406ec6cdd6e2f1d 28d4622f7d272829 618f7c7e73507e00
+threefry4x64 13 0000000000000000 0000000000000000 0000000000000000 0000000000000001 0000000000000000 0000000000000000 0000000000000000 0000000000000001 641cb9a478c9a5f6 6bf494830fc3c197 836e085ed5dfb374 cbae065146b3e242
+threefry4x64 13 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000001 31f44b90e71f66c9 2f3ba3de820f4650 9097c77cde234ac5 50340ce26229fabc
+threefry4x64 13 0000000000000000 8000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000001 4e026822a87dee71 b4ab7f79ed3dfd4a 9429731fdb5c0a64 7706366fb9251512
+threefry4x64 13 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000001 1949594f1d057a72 cbaea16559f04cb0 4a0ca9e5ad24f4cb db1f95560c87f79f
+threefry4x64 13 0000000000000000 0000000000000000 8000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000001 0f9ca509614863a7 615112fd34af4c67 408fd57c3fadb45b 1f229a09ca130ea9
+threefry4x64 13 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 0000000000000000 0000000000000001 48b71c1ec5e0e1a7 61005d67d77283bd 7475cf1b42918462 9a47b84099cb8820
+threefry4x64 13 0000000000000000 0000000000000000 0000000000000000 8000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000001 f744c0e233f14f37 ec52e887545bed98 75013191d39a68a5 b5107d5fbda31dba
+threefry4x64 13 243f6a8885a308d3 13198a2e03707344 a4093822299f31d0 082efa98ec4e6c89 0000000000000000 0000000000000000 0000000000000000 0000000000000001 07bfa94414046839 c9292f370d05ec10 e5abfd88ea69c29c e5694ea31b40917e
+threefry4x64 13 0000000000000001 0000000000000000 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 5b1e5890fd4dddda 3bd7fe815d826da7 5cead66cc2d6cf4b 9f2b09ff30f4496e
+threefry4x64 13 0000000000000000 0000000000000001 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 e6dcd7854a76f333 535299e0765eda14 a649fdda2cf305f4 601265889b4f49b7
+threefry4x64 13 0000000000000000 0000000000000000 0000000000000001 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 31ce59c9547701ce 442e5c98d58dd9e5 a4272c64230571fb 54d00283ad3869b8
+threefry4x64 13 0000000000000000 0000000000000000 0000000000000000 0000000000000001 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 78e0555be3caa567 29fd32a8e78dfe2b d12e964c3bb4e95d 508ce2a099d1294a
+threefry4x64 13 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 9bfaa6924981503c 3839252d08d78e82 b5a318c512e81925 2c3df5629446cb3d
+threefry4x64 13 0000000000000000 8000000000000000 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 39f7c8350c2fd966 a296554641bfa50f 2217077aa07b2a77 f4e41f63a9bbb3c4
+threefry4x64 13 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 8dad2651f0d59fc3 3fb4b008bf0c67ae 7a4958e5704b0e42 049189499fb9d713
+threefry4x64 13 0000000000000000 0000000000000000 8000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 47ba2144a6d5593a 70cf55d5a21ced0c 7bae9fe35eedf169 5fa2bef1f0178e53
+threefry4x64 13 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 3481c43775a74a3d 594029c16094b2ac 4242c166d72c5e8a 47132e77e038a80f
+threefry4x64 13 0000000000000000 0000000000000000 0000000000000000 8000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 2583f96efb951f87 5c05dc0fad2a0640 2276fd3905536384 f52f698ab7c15254
+threefry4x64 13 243f6a8885a308d3 13198a2e03707344 a4093822299f31d0 082efa98ec4e6c89 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 860b9848db0836a6 60e2cf66b950ac3a d9d93cc3d01c0bb8 0c39d9fca3179af4
+threefry4x64 13 0000000000000001 0000000000000000 0000000000000000 0000000000000000 0000000000000000 8000000000000000 0000000000000000 0000000000000000 0b97f6aec4194f29 f807cc683239c776 92336bc0d194833e 6af28b14847cbd25
+threefry4x64 13 0000000000000000 0000000000000001 0000000000000000 0000000000000000 0000000000000000 8000000000000000 0000000000000000 0000000000000000 d0bcda618f970ad7 23bf3f0b100b6b8e c0f43c6935f03f96 8567ff6ca9bb298a
+threefry4x64 13 0000000000000000 0000000000000000 0000000000000001 0000000000000000 0000000000000000 8000000000000000 0000000000000000 0000000000000000 952d67de8cc88100 b05aeba45473ada1 a12187872e534939 6bd07569c5c1384c
+threefry4x64 13 0000000000000000 0000000000000000 0000000000000000 0000000000000001 0000000000000000 8000000000000000 0000000000000000 0000000000000000 206a6c9947cd4059 ecb599e01e678611 d76e1a6ec72eed5b 9af53b23d20fdf5d
+threefry4x64 13 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 0000000000000000 8000000000000000 0000000000000000 0000000000000000 4686adcda45f8e82 f7c04d3b241269f9 98c2c7452f1de0be 9c45ac8325862db6
+threefry4x64 13 0000000000000000 8000000000000000 0000000000000000 0000000000000000 0000000000000000 8000000000000000 0000000000000000 0000000000000000 1c1af5206f2ece54 f9bac132c72d711c a227149a44bda9d7 828db0a58587130c
+threefry4x64 13 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 8000000000000000 0000000000000000 0000000000000000 c0c6c3989f8a19c4 82ff34015e798fe5 1539e98a9cdce38a c98e62331c6329ff
+threefry4x64 13 0000000000000000 0000000000000000 8000000000000000 0000000000000000 0000000000000000 8000000000000000 0000000000000000 0000000000000000 36d9f5d821c1c83f e2db772b11f2f021 6ba03362c1c10994 8d8a339448474da9
+threefry4x64 13 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 8000000000000000 0000000000000000 0000000000000000 5225a064dbddca63 dec3c80ea3f20208 b04e786c1de1a6b1 86e5434fc1dc51cc
+threefry4x64 13 0000000000000000 0000000000000000 0000000000000000 8000000000000000 0000000000000000 8000000000000000 0000000000000000 0000000000000000 ccb716bd11cb6fe2 3dda97c9ec8c6199 23b4e9fc6557cb92 03ee97e50b557f80
+threefry4x64 13 243f6a8885a308d3 13198a2e03707344 a4093822299f31d0 082efa98ec4e6c89 0000000000000000 8000000000000000 0000000000000000 0000000000000000 cfc902fffa76fa1b 71feded34df89372 84bc39de7545239f a8a7257817796076
+threefry4x64 13 0000000000000001 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 43ac62ad40bb0dc8 f19797814ee9d712 bc733e88b4f4fc6f 8d88689a11c0e444
+threefry4x64 13 0000000000000000 0000000000000001 0000000000000000 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 87c9feb08a847950 19601bb00361a1e4 b08ea511608f3a79 e0682be6cff83767
+threefry4x64 13 0000000000000000 0000000000000000 0000000000000001 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 da75d515c7765562 a53632bf88383197 2ac07dd554ee8076 d5b5d9ca8fc4d7ef
+threefry4x64 13 0000000000000000 0000000000000000 0000000000000000 0000000000000001 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 acacc47aec597245 5603e39ea0c435be faac042a22a85a33 def0f2feabb108fb
+threefry4x64 13 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 84ceb8a17a4d921d c34ea70e11cd714c cb778d241722ad54 b6f57011c04feafd
+threefry4x64 13 0000000000000000 8000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 17df51edc9093e45 ff21858aa5e3f88c 719738071c63ae9d f78bd7d434990a43
+threefry4x64 13 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 2e68fc7dfa5150a7 13b3e50898941ecf 67a61073ce21b66b 8ae48f8761ddb641
+threefry4x64 13 0000000000000000 0000000000000000 8000000000000000 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 13019c159fd18540 56b47f4ff862d77e f0525397b38f5659 06c701aa0b5f0ce7
+threefry4x64 13 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 120841cc984c8b5d 7ef7e0e47aa11b7f 427eccd66d8ca6a7 8c9c187c5a93f9d8
+threefry4x64 13 0000000000000000 0000000000000000 0000000000000000 8000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 5cd4de739c3025d4 8b7cba4515780d90 fcb10461e7262355 80cefb8eb218096a
+threefry4x64 13 243f6a8885a308d3 13198a2e03707344 a4093822299f31d0 082efa98ec4e6c89 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 3138f3138e47b09b c3957d408434f8f8 f53e02d616b134e7 721029b2628b0497
+threefry4x64 13 0000000000000001 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 8000000000000000 0000000000000000 de825ce58d5c1163 fcc32b1bf6dba058 23ad3d0d2f87e6d2 75e05c241fc71616
+threefry4x64 13 0000000000000000 0000000000000001 0000000000000000 0000000000000000 0000000000000000 0000000000000000 8000000000000000 0000000000000000 da20c7bc4e3d9707 5d92445c4891a513 e82592343e1ad0cd fe01a1f64d1e9a00
+threefry4x64 13 0000000000000000 0000000000000000 0000000000000001 0000000000000000 0000000000000000 0000000000000000 8000000000000000 0000000000000000 154c6525d00f11aa 05559415b1cb8a8c 030bb62025d53788 18030170eda486a4
+threefry4x64 13 0000000000000000 0000000000000000 0000000000000000 0000000000000001 0000000000000000 0000000000000000 8000000000000000 0000000000000000 31e3d5a16fc4baa7 aaeb4bc3b0a7054e 76338ce0989861b0 0c883d1d87da3197
+threefry4x64 13 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 0000000000000000 0000000000000000 8000000000000000 0000000000000000 0003485836fb3812 6efa47e66ad4aaa9 dedbe1b07f5e2027 77013bbab7104b3a
+threefry4x64 13 0000000000000000 8000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 8000000000000000 0000000000000000 1812be595dda0739 4e5a2fdb16c8947b e04cab5c91c3864a 1d1afd092303374a
+threefry4x64 13 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 0000000000000000 8000000000000000 0000000000000000 bfdadb9f36d8e4ea 5b422319060bf905 53ffcae0b8c7ca1c f6562ebd20777d5a
+threefry4x64 13 0000000000000000 0000000000000000 8000000000000000 0000000000000000 0000000000000000 0000000000000000 8000000000000000 0000000000000000 96d112d938bc7771 e3fe46aa2618ac2f 206673e37bda2625 af1ebed61abd839a
+threefry4x64 13 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 8000000000000000 0000000000000000 c11769ceba44ff3f 1996279e3a7cd8b5 b0ce7ee3ee7555b6 7d932c7e563d7cc5
+threefry4x64 13 0000000000000000 0000000000000000 0000000000000000 8000000000000000 0000000000000000 0000000000000000 8000000000000000 0000000000000000 9eae02df80c59f3b 01dc7640aafa9fd8 9d5b7aa9f801ceb4 79d13e5608aedac7
+threefry4x64 13 243f6a8885a308d3 13198a2e03707344 a4093822299f31d0 082efa98ec4e6c89 0000000000000000 0000000000000000 8000000000000000 0000000000000000 dd81e5071213cb65 f95242bc69694579 ba58df28812f62ac 8fc5dcbc22f589f5
+threefry4x64 13 0000000000000001 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 706df8b143a55f67 ddff5e09840fa38c c879c4f524d998ba dc73a56cd4ae98bb
+threefry4x64 13 0000000000000000 0000000000000001 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 78053349f166715d c14d62de2c740d61 71c3e7d81060b29a 21bc36b618c97a1b
+threefry4x64 13 0000000000000000 0000000000000000 0000000000000001 0000000000000000 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 3c51fd1d7a0231a7 1c716c429b12d830 f98749855715755f d4928002384a27fa
+threefry4x64 13 0000000000000000 0000000000000000 0000000000000000 0000000000000001 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 3f2322ac3118ab7a 77342b3ce112420b a4e74eaea4b602ef d7a036a48f09bbeb
+threefry4x64 13 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 1f7d2d32b4560572 65dd77ea737af34e 7273b33fcc3a542a f4be4f5efe578555
+threefry4x64 13 0000000000000000 8000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 9c8b4bb1d1234df1 c81acf5747a7e967 8a2816c04ee41e46 5044b310241a3b3e
+threefry4x64 13 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 9669abc61b43311c 43356b81b746111b b6dc48eeb21b8699 dbe907f08d01a64c
+threefry4x64 13 0000000000000000 0000000000000000 8000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 8beb2316ebfc349a 43338972ba44efa1 027aa324111ddb2a a0cc5e126b613e9c
+threefry4x64 13 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 9ab42dcf03464387 a1ba2f214f9603a6 75659e356c523763 140c05291e373a99
+threefry4x64 13 0000000000000000 0000000000000000 0000000000000000 8000000000000000 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff cc76b2ebda048a1f 74303dd7cbc9fe2b 86bcb8baedce89d7 02e1b32c8116a108
+threefry4x64 13 243f6a8885a308d3 13198a2e03707344 a4093822299f31d0 082efa98ec4e6c89 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff cd41da269ca3c8f9 3e1b1b12a9e2aa1b 68742c4dfaa5e2f9 d905f214c4e32adb
+threefry4x64 13 0000000000000001 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 8000000000000000 a15fe10faae1413d b3ea00728b426ae8 44e0362e37778626 d76da78c8bbdb2f3
+threefry4x64 13 0000000000000000 0000000000000001 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 8000000000000000 c74b6463897871d2 3dee782ceb448d5b 76fb472b4f8dfb3c 579b0fa66a5a7e3c
+threefry4x64 13 0000000000000000 0000000000000000 0000000000000001 0000000000000000 0000000000000000 0000000000000000 0000000000000000 8000000000000000 c596fbc29750200c 5eac3cafb1b65cff 0ebf88e52a4ca31c 56ce58d36711edc8
+threefry4x64 13 0000000000000000 0000000000000000 0000000000000000 0000000000000001 0000000000000000 0000000000000000 0000000000000000 8000000000000000 344ee7b935fc9f4e 86e7bbe859b3288f 4fd5f444ff546852 379d0f15264ce291
+threefry4x64 13 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 8000000000000000 a12b7c0ae47df332 b1fb8faf8c7e055c 012f4ce8699912e8 1807370c17fe4806
+threefry4x64 13 0000000000000000 8000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 8000000000000000 309cf1978593199d 4803a4c3464b33b1 8de1cf19119e5184 0e98be6e29cc004d
+threefry4x64 13 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 0000000000000000 0000000000000000 8000000000000000 a3f741dfb4b0123e baacbbb9319e1f3c 6e2a766bd9f55e2d f85ca77e46c8ac8d
+threefry4x64 13 0000000000000000 0000000000000000 8000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 8000000000000000 b1940157b0d12078 5a6d59771301089c 5528ee2ad8191549 062755f87de1a247
+threefry4x64 13 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 0000000000000000 8000000000000000 921cfbb9ab46b160 bc60a78079a42218 dd7c39b5185d007c 046c126b53105693
+threefry4x64 13 0000000000000000 0000000000000000 0000000000000000 8000000000000000 0000000000000000 0000000000000000 0000000000000000 8000000000000000 25c6067a84995616 d33240726703b517 ca201d11dd57f427 64a6de3f4143ee6e
+threefry4x64 13 243f6a8885a308d3 13198a2e03707344 a4093822299f31d0 082efa98ec4e6c89 0000000000000000 0000000000000000 0000000000000000 8000000000000000 afeee610c4519328 8cbaaca176308e27 dc15a9770306e954 c7ece70c6b146822
+threefry4x64 20 0000000000000001 0000000000000000 0000000000000000 0000000000000000 0000000000000001 0000000000000000 0000000000000000 0000000000000000 f89ed93865056e32 bd896a3dbd85a756 62d8d73be7c894f0 e792657aabcd4d07
+threefry4x64 20 0000000000000000 0000000000000001 0000000000000000 0000000000000000 0000000000000001 0000000000000000 0000000000000000 0000000000000000 982b64d9ed17727f b92ee937b202c51f f4b17d93cfd45600 f9f8aae4c794d15e
+threefry4x64 20 0000000000000000 0000000000000000 0000000000000001 0000000000000000 0000000000000001 0000000000000000 0000000000000000 0000000000000000 b6a7225711cc34b8 53074728c278f4c7 5667235e08827615 132e773e6e7f0eb3
+threefry4x64 20 0000000000000000 0000000000000000 0000000000000000 0000000000000001 0000000000000001 0000000000000000 0000000000000000 0000000000000000 44bbf877aa21ae51 965dfe7a5d2264b4 e9f7ad5df7d8f80b f7b569832716868e
+threefry4x64 20 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 0000000000000001 0000000000000000 0000000000000000 0000000000000000 93f2387a206e8f9e 6cb5b48ffdf2d7cd 0e979b44e4dd0e1a d7bff06c4f8e5211
+threefry4x64 20 0000000000000000 8000000000000000 0000000000000000 0000000000000000 0000000000000001 0000000000000000 0000000000000000 0000000000000000 c89facdd90bc86dc 2860da6424e61172 6d062d8f0dc96667 977cd762173d0fe5
+threefry4x64 20 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000001 0000000000000000 0000000000000000 0000000000000000 c3d42d91a2e77a9d 9618b89ffb6c4c06 72f6505dff514d2c 6dac73802a09ff91
+threefry4x64 20 0000000000000000 0000000000000000 8000000000000000 0000000000000000 0000000000000001 0000000000000000 0000000000000000 0000000000000000 c65d933491370e7f 8bd8c1c43548d88b 677cbc00c0577228 9c5c490ce2485273
+threefry4x64 20 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000001 0000000000000000 0000000000000000 0000000000000000 fb128418d58c8190 a30cacdbeeaf83a4 7daabc3ee8242ca6 cdc871c48430783c
+threefry4x64 20 0000000000000000 0000000000000000 0000000000000000 8000000000000000 0000000000000001 0000000000000000 0000000000000000 0000000000000000 aa8f96391f668b67 e55eab0e8e2e5836 a1467300f7fb04f6 873ec0bc55573b89
+threefry4x64 20 243f6a8885a308d3 13198a2e03707344 a4093822299f31d0 082efa98ec4e6c89 0000000000000001 0000000000000000 0000000000000000 0000000000000000 7bbbcbf0f617f950 8eda8917ee3a6a15 56bf5df8bfd1060e df7a6d2bf0396704
+threefry4x64 20 0000000000000001 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000001 0000000000000000 0000000000000000 8ae5e8b70c436fa2 a95dbadf918998a1 0e5908b70abc9526 293f0eb4a5fdafe4
+threefry4x64 20 0000000000000000 0000000000000001 0000000000000000 0000000000000000 0000000000000000 0000000000000001 0000000000000000 0000000000000000 8186defe625c11f3 06657e8ebbc151f1 f3b446f77ff82f6e a8655aab80b83368
+threefry4x64 20 0000000000000000 0000000000000000 0000000000000001 0000000000000000 0000000000000000 0000000000000001 0000000000000000 0000000000000000 bfff7105cf64329d 5da774462017e77f 604b3d42401fcfd6 12c33a3cc0a622f7
+threefry4x64 20 0000000000000000 0000000000000000 0000000000000000 0000000000000001 0000000000000000 0000000000000001 0000000000000000 0000000000000000 543bc7d16d113372 c13b3c63636d7acc c596bf4b944e106c ebad1d5a09f2d8e2
+threefry4x64 20 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 0000000000000000 0000000000000001 0000000000000000 0000000000000000 1c72022fd804739a fb70dbc298660c89 ef584d080b442849 647fbc04f2b0ba2f
+threefry4x64 20 0000000000000000 8000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000001 0000000000000000 0000000000000000 e53b96331ed89298 87f81c5d8334482b 1ab323554c0c08ef d8a54cad427df583
+threefry4x64 20 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 0000000000000001 0000000000000000 0000000000000000 aa234e6ecafcf2a0 4744cbeaae240876 64c770d4dcc26254 153e3de28b8c62e5
+threefry4x64 20 0000000000000000 0000000000000000 8000000000000000 0000000000000000 0000000000000000 0000000000000001 0000000000000000 0000000000000000 d69224680a4d2e61 cf82a8b14c8282f6 c35caf223d708d26 d20eb877b3b194e6
+threefry4x64 20 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000001 0000000000000000 0000000000000000 05b4e3832ac3001f cabd925f6019062a 6e881791ffffcddc 3d07c493dc18ee36
+threefry4x64 20 0000000000000000 0000000000000000 0000000000000000 8000000000000000 0000000000000000 0000000000000001 0000000000000000 0000000000000000 770f680e00670cf7 55b37fe1f230b862 c60feeaa07a9a962 74b7618ae3112c62
+threefry4x64 20 243f6a8885a308d3 13198a2e03707344 a4093822299f31d0 082efa98ec4e6c89 0000000000000000 0000000000000001 0000000000000000 0000000000000000 56292009e38f1873 10629818ed1b807a ecf7a9c2699f4c84 68dee03a7ba18cc0
+threefry4x64 20 0000000000000001 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000001 0000000000000000 e976691f1b80d958 be8abbb14c5ed824 f29b8e777ca5c94b 97175c4d56649bd8
+threefry4x64 20 0000000000000000 0000000000000001 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000001 0000000000000000 99122a867130ba68 29e6fc66a54153d1 6bb286953c60faa3 15f3a11b70692bba
+threefry4x64 20 0000000000000000 0000000000000000 0000000000000001 0000000000000000 0000000000000000 0000000000000000 0000000000000001 0000000000000000 568c091d800376a4 6410b91f1213d435 5a53e48b09b33a5d d3ca8ae91eb3cb52
+threefry4x64 20 0000000000000000 0000000000000000 0000000000000000 0000000000000001 0000000000000000 0000000000000000 0000000000000001 0000000000000000 ebfa25173eba130b 872e5f2c3f858550 34ba124306653c10 75abaf6f3b82a8a5
+threefry4x64 20 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000001 0000000000000000 cb423ba5d281d13b 97355c07bffaaa4b f04be7e7841daec4 3d58b14622d0c064
+threefry4x64 20 0000000000000000 8000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000001 0000000000000000 cd807105b3a2206f 8dfbf66b057ab348 81333ca31ef60ef4 db7e5ee3664aab98
+threefry4x64 20 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 0000000000000000 0000000000000001 0000000000000000 8a7a795de1c22fb1 710a7f0c73e9c6d9 552b80b908fd894a 1b2a91bbce9b4246
+threefry4x64 20 0000000000000000 0000000000000000 8000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000001 0000000000000000 c623a20d932ccb7d 03bf8b8446d7128b 72c4a06097e4601d 06742862e6031180
+threefry4x64 20 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 0000000000000001 0000000000000000 61f394f4b8f77bb2 f73fa064e84c2daf 35c35bfbdfbef4f3 a724fb52592f935f
+threefry4x64 20 0000000000000000 0000000000000000 0000000000000000 8000000000000000 0000000000000000 0000000000000000 0000000000000001 0000000000000000 6db56dd85b84b7d0 f159755eab2ce68f 60b4cd66d0531931 593643f04eabd3df
+threefry4x64 20 243f6a8885a308d3 13198a2e03707344 a4093822299f31d0 082efa98ec4e6c89 0000000000000000 0000000000000000 0000000000000001 0000000000000000 8bae3792b1c7f028 d06b57022556fdb7 c9d485c0d516a5d0 389901e211326996
+threefry4x64 20 0000000000000001 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000001 fda4e34b6bda2e78 1bcde08f72564ebd db1ea7ab9244c332 1809e6e1f0baa36c
+threefry4x64 20 0000000000000000 0000000000000001 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000001 1f46785827cf00cc 73efc9633842cd4f 76218d83b83a8156 62bcb826031f519e
+threefry4x64 20 0000000000000000 0000000000000000 0000000000000001 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000001 e062b28847b0a31d f9931a29afe520d4 2f2d40165188a578 4a3e9e455553a412
+threefry4x64 20 0000000000000000 0000000000000000 0000000000000000 0000000000000001 0000000000000000 0000000000000000 0000000000000000 0000000000000001 cf65681072a11a30 00f9875b6228100c c6631b848fd3f81b d1391138164dffea
+threefry4x64 20 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000001 3b55def85f780ad3 7c89509a536576db 703c7a54c92adc37 a634e944edfbb1b1
+threefry4x64 20 0000000000000000 8000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000001 523c9f16575344da 3b8b47c4f2abbbed c086def85eb710d0 ccccfce7151fed41
+threefry4x64 20 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000001 2989b44b7bc9c589 6f51f1aa8194cd9c 910b471870d34248 3e16e545d6f9d3b4
+threefry4x64 20 0000000000000000 0000000000000000 8000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000001 8e68fea009eee4b2 edb5e4274c6f0a04 eb34879011e8d7b2 d9da39416b62f51c
+threefry4x64 20 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 0000000000000000 0000000000000001 1c84b638d27d7dd4 4e6dd3b04b1ff092 1adfe69682d3620e 508a1926a26bada8
+threefry4x64 20 0000000000000000 0000000000000000 0000000000000000 8000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000001 52ea8499b2a6f121 de7bf09d98328388 a93dee2da6423d6c fccbb0aa5fea8721
+threefry4x64 20 243f6a8885a308d3 13198a2e03707344 a4093822299f31d0 082efa98ec4e6c89 0000000000000000 0000000000000000 0000000000000000 0000000000000001 f83be1563ca6864f f9b2244eb9a0a0bb 77c0dce929577f0d 4312da346a75b901
+threefry4x64 20 0000000000000001 0000000000000000 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 85874a427171bd52 087203b705096abb 2b4eac4bb197cc47 668384e956bb1b88
+threefry4x64 20 0000000000000000 0000000000000001 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 558e048a3b205295 73937c2aa93e99de 59141306fb089079 ad2f30432f603af0
+threefry4x64 20 0000000000000000 0000000000000000 0000000000000001 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 ca31a1506188b7f3 e2f687331eb59e6b 2e0c5db2e49d0369 b2504b862d707d07
+threefry4x64 20 0000000000000000 0000000000000000 0000000000000000 0000000000000001 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 8e15267d675bb7f5 37e79e8f2c4f4c1a 738fd248c3fb83ce 6c5f250b42b1ead3
+threefry4x64 20 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 7a8abd584135cc95 54ae8923a9790941 36b8855f23b8c0cb d6e30da6960e6d3a
+threefry4x64 20 0000000000000000 8000000000000000 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 1b3e76a15a3d81bd 47515b766d1526a2 a8ac2e9d8c6fcbba 14842f687111ad6b
+threefry4x64 20 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 801ad32259dca163 ac610dfd986e37ab 92f0626474e43f64 f13aaf2bf6f9db40
+threefry4x64 20 0000000000000000 0000000000000000 8000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 4c2f35571e07df4f e6181172f7a4a8c2 852fe5c10b21ec0a 36859f042ba1fbb2
+threefry4x64 20 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 014828936fc30529 30b098f7baabebab bdba756ed22e67e8 dbfeb29883206ff2
+threefry4x64 20 0000000000000000 0000000000000000 0000000000000000 8000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 603bb6e0f2479da5 e51dcee4b383d277 d961095b84b3418d 2125876df94c0a88
+threefry4x64 20 243f6a8885a308d3 13198a2e03707344 a4093822299f31d0 082efa98ec4e6c89 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 5eeed616d1e3b26b d476bb39d85d25ea 2388dc0afe33a091 53fe3702435ff634
+threefry4x64 20 0000000000000001 0000000000000000 0000000000000000 0000000000000000 0000000000000000 8000000000000000 0000000000000000 0000000000000000 a702cfdfe4973280 7c249f1d0758cc0f 98454baaad673214 e3c59f707aabde84
+threefry4x64 20 0000000000000000 0000000000000001 0000000000000000 0000000000000000 0000000000000000 8000000000000000 0000000000000000 0000000000000000 3131a6508d56437b 6cd6b52c18dc1a9a 7150f4cca95bc4b5 49a586b366d35c15
+threefry4x64 20 0000000000000000 0000000000000000 0000000000000001 0000000000000000 0000000000000000 8000000000000000 0000000000000000 0000000000000000 67c05a6a0bb9ed25 de5266bab7cc9295 c343dcc30c002b27 5efb26d17a892573
+threefry4x64 20 0000000000000000 0000000000000000 0000000000000000 0000000000000001 0000000000000000 8000000000000000 0000000000000000 0000000000000000 7805bde324c1af1c 668691f3be21caf7 3d6b424c11f232da aa67d4a504d5e515
+threefry4x64 20 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 0000000000000000 8000000000000000 0000000000000000 0000000000000000 36fa107bd920d2a1 3241cb98bde958cb b0dc16d6e08b0631 6e7eee73c179ad07
+threefry4x64 20 0000000000000000 8000000000000000 0000000000000000 0000000000000000 0000000000000000 8000000000000000 0000000000000000 0000000000000000 d919b55afd55c267 722ed883e05662d4 26e2c219316f4af4 952da37749e78786
+threefry4x64 20 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 8000000000000000 0000000000000000 0000000000000000 b1480c8085f9a79c 80fc9858168a8b32 4666dd30592b2e33 823262f5f32e3ad0
+threefry4x64 20 0000000000000000 0000000000000000 8000000000000000 0000000000000000 0000000000000000 8000000000000000 0000000000000000 0000000000000000 a712d08192fb239b e6e4fe0a58a601fd e71ad1813b69e0e2 3219922b43502981
+threefry4x64 20 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 8000000000000000 0000000000000000 0000000000000000 ef86f20d6c3b68c3 917b208c644349cc 73738d7bc08f52ae 4144bc69eed1d435
+threefry4x64 20 0000000000000000 0000000000000000 0000000000000000 8000000000000000 0000000000000000 8000000000000000 0000000000000000 0000000000000000 13a65d5f806490ec 9b7641d917615d41 ff918ea8509cc729 5c120cff123aedd2
+threefry4x64 20 243f6a8885a308d3 13198a2e03707344 a4093822299f31d0 082efa98ec4e6c89 0000000000000000 8000000000000000 0000000000000000 0000000000000000 e6e9d6e5a345a1b1 ab16981d4978321a 9089eaa221460088 ae397a5f5f162e31
+threefry4x64 20 0000000000000001 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 31243c5a95e832e1 cf3dc1a984b07f34 e950b7eb25eb26ba b5593c3426a1f0d3
+threefry4x64 20 0000000000000000 0000000000000001 0000000000000000 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 fa7817180e135577 a128dcbcf2a70e97 e4932adcb9b11983 9755f62735e87f34
+threefry4x64 20 0000000000000000 0000000000000000 0000000000000001 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 b834ea24815ea121 cac44aca182f748c b0dde9fec9df32de 44b9a0fc44677efb
+threefry4x64 20 0000000000000000 0000000000000000 0000000000000000 0000000000000001 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 5a6173e2accebd38 5b131c1580e7e4f3 efa5bf67388ddf08 f9ac55e63922c0d5
+threefry4x64 20 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 b384790d86c31a9e f1fb8ddfeaa88d4d 066441fc1fd9a778 2f1c77b88b083355
+threefry4x64 20 0000000000000000 8000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 96659fc0678254da 6918643b2bde533f 5715c3b72f70b12f 03fbbca391a5696a
+threefry4x64 20 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 1c4ba033ecb49c93 966d0e8012a5a388 4a24daa292dceaab 03d2f3860af6f4e9
+threefry4x64 20 0000000000000000 0000000000000000 8000000000000000 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 15a613110b4673a0 121b874b4810f620 f64e02eaa1212920 bcffc54556c3fce1
+threefry4x64 20 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 357adb0df3abcc95 db1ab7be4520ea15 6951e8aaaa5af14c fcf212f0979c0363
+threefry4x64 20 0000000000000000 0000000000000000 0000000000000000 8000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 21f38a82dd49ebdd c9bade4b39894d89 992854bccee76282 cb11ce4b04634f01
+threefry4x64 20 243f6a8885a308d3 13198a2e03707344 a4093822299f31d0 082efa98ec4e6c89 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 ac11615cfb8804fb c26d1580d38b7c7d 3e8e683a4d20ea56 8a739c355ae4bbb9
+threefry4x64 20 0000000000000001 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 8000000000000000 0000000000000000 b587771995c1ffe7 cfd116bd3029fc42 4d8207deb6d416c2 af9483f1ce57809f
+threefry4x64 20 0000000000000000 0000000000000001 0000000000000000 0000000000000000 0000000000000000 0000000000000000 8000000000000000 0000000000000000 56a77269eff784de 07482fa109e195cc db90c9c776d70a2a 75d0913c19d22612
+threefry4x64 20 0000000000000000 0000000000000000 0000000000000001 0000000000000000 0000000000000000 0000000000000000 8000000000000000 0000000000000000 9565f1f53359b88f ad98ae294ac770bb ee99e6b7b51226f9 c4e0ab4c9a14125f
+threefry4x64 20 0000000000000000 0000000000000000 0000000000000000 0000000000000001 0000000000000000 0000000000000000 8000000000000000 0000000000000000 111a5de94005c146 2030eded2dd3b8e8 c957d395e7de6463 8d808f6ec9f73b44
+threefry4x64 20 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 0000000000000000 0000000000000000 8000000000000000 0000000000000000 40e6bb219ab5c4cd ea85ca56ac874867 bc1540419dac8e01 563ad7643a376e93
+threefry4x64 20 0000000000000000 8000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 8000000000000000 0000000000000000 164321657c70819d eaaf8de42198a16e 7eae23927bcbfab8 73a04730feb4851e
+threefry4x64 20 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 0000000000000000 8000000000000000 0000000000000000 97f229a61529e38a 8e319418bcfbb12a 6ba27633af0fa6de 57cbb3e68c3527d6
+threefry4x64 20 0000000000000000 0000000000000000 8000000000000000 0000000000000000 0000000000000000 0000000000000000 8000000000000000 0000000000000000 68bbf3170a0997ed 881860e14d5cf2ed 31b899a4921526aa e677a9c70e92af02
+threefry4x64 20 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 8000000000000000 0000000000000000 e60fa0c35e7b6944 9dff379ef3e2ad34 fabe148a01b71390 73e1d7df2dc9a644
+threefry4x64 20 0000000000000000 0000000000000000 0000000000000000 8000000000000000 0000000000000000 0000000000000000 8000000000000000 0000000000000000 562d75b725acf954 f7f1b0276038ebfc 3c1eacdd68247566 c742c844a8deb5c5
+threefry4x64 20 243f6a8885a308d3 13198a2e03707344 a4093822299f31d0 082efa98ec4e6c89 0000000000000000 0000000000000000 8000000000000000 0000000000000000 4b9990815eeba4e6 2b3ef48aa6419c30 d5b962dd45793f01 c867e6d3d6a9fbce
+threefry4x64 20 0000000000000001 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff e38fadf720fccf69 73760232ff7339ae 7096a387f7bfce8b 09cdf4a8033c6461
+threefry4x64 20 0000000000000000 0000000000000001 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 8fbcb0ccb5a68c09 3c091f05ef3feb5a 880c915948eff90f 6d042824d55cfa79
+threefry4x64 20 0000000000000000 0000000000000000 0000000000000001 0000000000000000 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff f4187df19710e7bc 8176d6775bee5998 b2629a879b5983d3 8250daa72833a195
+threefry4x64 20 0000000000000000 0000000000000000 0000000000000000 0000000000000001 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff f16d33bd22225c93 257dd8242032f571 eb9c45bd059d0fa1 5a7f9b7c55960b1c
+threefry4x64 20 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 2e8361a4aa930a0e b8cbba78f68d1b63 3c0df7648dc4d4f9 3b533a4d2913ba33
+threefry4x64 20 0000000000000000 8000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff c3b2ee2c35624ffe ff045283a1e08c3d b1b3042bb82d6ede 1bf1550286f383a2
+threefry4x64 20 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff f0326d40804c3153 37c27181a460c9ae c0034d039686abdf 3d55f60596ad5837
+threefry4x64 20 0000000000000000 0000000000000000 8000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 0dab0563aa95c953 f38f100b1348d506 c27321a2d99f0a88 94e94b06c6477c62
+threefry4x64 20 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff a87036c367446e12 9f68749a58b47e25 6fc48a19201b0798 952188d35cf69fb0
+threefry4x64 20 0000000000000000 0000000000000000 0000000000000000 8000000000000000 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 36c8bd17d63a9a82 8af6f23bf2d3040c 156eee41f13b2798 244e8221835a7618
+threefry4x64 20 243f6a8885a308d3 13198a2e03707344 a4093822299f31d0 082efa98ec4e6c89 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff a293802a64ec9166 8039fe9d142bf9dc ab193c3d4835196a a650f43736078795
+threefry4x64 20 0000000000000001 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 8000000000000000 a6848ded0ad67dd2 361bc11075f5202e 845a8a315b2978f9 d47cf41ceb9da6e9
+threefry4x64 20 0000000000000000 0000000000000001 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 8000000000000000 b0d56aaa267b5d14 778b7e865a84766b 533e6fe15d3fdee3 09d71e0d017df61f
+threefry4x64 20 0000000000000000 0000000000000000 0000000000000001 0000000000000000 0000000000000000 0000000000000000 0000000000000000 8000000000000000 45fa780c18a49ae1 51be9eec7776ffa5 50f9251d8c94279d e6cd7113274158fe
+threefry4x64 20 0000000000000000 0000000000000000 0000000000000000 0000000000000001 0000000000000000 0000000000000000 0000000000000000 8000000000000000 e6e1d3dd2aacbd00 67e52c14f46d11b5 2946912c9908c136 789dc703ca33c595
+threefry4x64 20 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 8000000000000000 9e858b947929378d 49298d74f00caa5f baf9196410a6257c 3e63a9a8359411c6
+threefry4x64 20 0000000000000000 8000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 8000000000000000 d8ea8f824e58974a 3d23b4c3e1fbee5b c6546469d088fcbd a72cba22c3abf1ec
+threefry4x64 20 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 0000000000000000 0000000000000000 8000000000000000 84e993586057fd3d 5b26f2142a47213b 95bec6cb2ae889ac ea3895b9b7c8a3f8
+threefry4x64 20 0000000000000000 0000000000000000 8000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 8000000000000000 9a089a5f75db3ff3 3d97d5241f6b069e bb731d24954f2716 91213cc1c1f7e527
+threefry4x64 20 0000000000000000 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000000 0000000000000000 8000000000000000 cd2eb1d24a7de2c8 a3b1f18a27af4225 5f9a54357f4af40c bb8e26b5a9efb033
+threefry4x64 20 0000000000000000 0000000000000000 0000000000000000 8000000000000000 0000000000000000 0000000000000000 0000000000000000 8000000000000000 616e99086444a4c3 bd6973f3a79afaa1 c98be82cfb397c4e 01fc06bb62fc3f33
+threefry4x64 20 243f6a8885a308d3 13198a2e03707344 a4093822299f31d0 082efa98ec4e6c89 0000000000000000 0000000000000000 0000000000000000 8000000000000000 763ab713c2a06541 ac19a24b93f5678b 95117e99d0a8b3a9 9d41e61fc315bfe9
+threefry4x32 13 00000001 00000000 00000000 00000000 00000001 00000000 00000000 00000000 bb9799a3 99c96b85 147cb42b 41c4d9f0
+threefry4x32 13 00000000 00000001 00000000 00000000 00000001 00000000 00000000 00000000 07d71da4 d1a2b380 4b1c0744 07071fa3
+threefry4x32 13 00000000 00000000 00000001 00000000 00000001 00000000 00000000 00000000 6f325910 eb4baef9 63dc79fd 9fb4289a
+threefry4x32 13 00000000 00000000 00000000 00000001 00000001 00000000 00000000 00000000 c06c8569 41f8c075 0d9ac8fc ca4cb183
+threefry4x32 13 00000000 ffffffff 00000000 00000000 00000001 00000000 00000000 00000000 46dfc573 32ec2cd4 970d926b 4741150b
+threefry4x32 13 00000000 80000000 00000000 00000000 00000001 00000000 00000000 00000000 3cfb67ac 563ebf09 9e64b7fe a17a6edd
+threefry4x32 13 00000000 00000000 ffffffff 00000000 00000001 00000000 00000000 00000000 6fdcaa29 85eb97b0 641658b6 637597f8
+threefry4x32 13 00000000 00000000 80000000 00000000 00000001 00000000 00000000 00000000 6921a1bd edb37289 2a96f041 feee8d3d
+threefry4x32 13 00000000 00000000 00000000 ffffffff 00000001 00000000 00000000 00000000 46996f57 e449bcc1 8eecf7e2 8c9476b6
+threefry4x32 13 00000000 00000000 00000000 80000000 00000001 00000000 00000000 00000000 64c583dd 541b87f2 a1a74ed0 be222e82
+threefry4x32 13 243f6a88 85a308d3 13198a2e 03707344 00000001 00000000 00000000 00000000 2dd111e3 4bcd84f6 a7bedab5 cfaccded
+threefry4x32 13 a4093822 299f31d0 082efa98 ec4e6c89 00000001 00000000 00000000 00000000 91ad0543 8796f2e3 1f7dea71 5954cf16
+threefry4x32 13 452821e6 38d01377 be5466cf 34e90c6c 00000001 00000000 00000000 00000000 8b838910 ec61f53d 9159be96 00a91b1a
+threefry4x32 13 00000001 00000000 00000000 00000000 00000000 00000001 00000000 00000000 db476b8b 64ca080f 8164731a df2ad744
+threefry4x32 13 00000000 00000001 00000000 00000000 00000000 00000001 00000000 00000000 f2ec5347 87e3be56 ed0d2f4f c549203a
+threefry4x32 13 00000000 00000000 00000001 00000000 00000000 00000001 00000000 00000000 a105cb4d 540fca6f 1912780c 021445c5
+threefry4x32 13 00000000 00000000 00000000 00000001 00000000 00000001 00000000 00000000 d1711880 a6fdb528 57b11ea0 8ee9b71a
+threefry4x32 13 00000000 ffffffff 00000000 00000000 00000000 00000001 00000000 00000000 4d25c9d8 35411722 876597d3 a77c6b82
+threefry4x32 13 00000000 80000000 00000000 00000000 00000000 00000001 00000000 00000000 63cd2323 f5e6e7ec 4c97c974 75e7869f
+threefry4x32 13 00000000 00000000 ffffffff 00000000 00000000 00000001 00000000 00000000 eb05fac0 16e56be7 f2de2606 fda2302b
+threefry4x32 13 00000000 00000000 80000000 00000000 00000000 00000001 00000000 00000000 7513c86c ae260696 bcb5037b 83374447
+threefry4x32 13 00000000 00000000 00000000 ffffffff 00000000 00000001 00000000 00000000 a51b3ee6 b7ae14a5 a62dbd0f 1cd66929
+threefry4x32 13 00000000 00000000 00000000 80000000 00000000 00000001 00000000 00000000 24989ca3 581db664 f62bd4c4 4d4bf09f
+threefry4x32 13 243f6a88 85a308d3 13198a2e 03707344 00000000 00000001 00000000 00000000 6fb81745 d27ca3e0 ceb229f5 a9ea334b
+threefry4x32 13 a4093822 299f31d0 082efa98 ec4e6c89 00000000 00000001 00000000 00000000 a869236e 14bd4ece 83fd7d8a d40cf21c
+threefry4x32 13 452821e6 38d01377 be5466cf 34e90c6c 00000000 00000001 00000000 00000000 c34f3a0e 43b2e4d7 934173c0 f3cdf64a
+threefry4x32 13 00000001 00000000 00000000 00000000 00000000 00000000 00000001 00000000 babf5878 38c2494e 3019c043 1e0b2b9b
+threefry4x32 13 00000000 00000001 00000000 00000000 00000000 00000000 00000001 00000000 5d800e70 7ac570e8 97c4694a d8a3180a
+threefry4x32 13 00000000 00000000 00000001 00000000 00000000 00000000 00000001 00000000 e8c65d99 7c5ca426 0a86c445 7d4d3a21
+threefry4x32 13 00000000 00000000 00000000 00000001 00000000 00000000 00000001 00000000 26d36381 19af15e5 a54676bc 4af5d5eb
+threefry4x32 13 00000000 ffffffff 00000000 00000000 00000000 00000000 00000001 00000000 5a87e689 783f1462 3cedd1ae 2ea11e0a
+threefry4x32 13 00000000 80000000 00000000 00000000 00000000 00000000 00000001 00000000 92ceb56e 1d319cd1 a2b34995 e723ef97
+threefry4x32 13 00000000 00000000 ffffffff 00000000 00000000 00000000 00000001 00000000 f0ba66a4 04f0fd34 f5a697dd aa00c84a
+threefry4x32 13 00000000 00000000 80000000 00000000 00000000 00000000 00000001 00000000 93366e54 253cda1e a4e1b57b 70d26242
+threefry4x32 13 00000000 00000000 00000000 ffffffff 00000000 00000000 00000001 00000000 d972babe b256e807 670bdbbd 74ab6ecd
+threefry4x32 13 00000000 00000000 00000000 80000000 00000000 00000000 00000001 00000000 a205f99f b02fddb1 0336fd8e f281b7dc
+threefry4x32 13 243f6a88 85a308d3 13198a2e 03707344 00000000 00000000 00000001 00000000 0527b8fa e9fdb4d9 08177632 a4c34938
+threefry4x32 13 a4093822 299f31d0 082efa98 ec4e6c89 00000000 00000000 00000001 00000000 28006c21 591fad8a 36cb57c4 04820ec7
+threefry4x32 13 452821e6 38d01377 be5466cf 34e90c6c 00000000 00000000 00000001 00000000 a2538b90 2cbe2c7f 1542fe5f 9772775e
+threefry4x32 13 00000001 00000000 00000000 00000000 00000000 00000000 00000000 00000001 6a51ba3a 33fc7dd8 83ec724b 592255be
+threefry4x32 13 00000000 00000001 00000000 00000000 00000000 00000000 00000000 00000001 3b00082e f3111cc6 67f122b1 a4c02cec
+threefry4x32 13 00000000 00000000 00000001 00000000 00000000 00000000 00000000 00000001 eebb5e2e 5d5a0d75 64526042 bfeb2a2b
+threefry4x32 13 00000000 00000000 00000000 00000001 00000000 00000000 00000000 00000001 cc78dfd4 f03f59d7 24eb369b 7f233bc2
+threefry4x32 13 00000000 ffffffff 00000000 00000000 00000000 00000000 00000000 00000001 8a1de487 dbc78315 02bad926 0d62c434
+threefry4x32 13 00000000 80000000 00000000 00000000 00000000 00000000 00000000 00000001 5b7ec382 20dfb637 5e14485f 4365e731
+threefry4x32 13 00000000 00000000 ffffffff 00000000 00000000 00000000 00000000 00000001 48f54a63 040c8fe7 6f5f60e7 a8e2c422
+threefry4x32 13 00000000 00000000 80000000 00000000 00000000 00000000 00000000 00000001 bfa7d1e0 b2a7a93b a4a0780f 1b11e5e2
+threefry4x32 13 00000000 00000000 00000000 ffffffff 00000000 00000000 00000000 00000001 1d7fbcc4 fcc9efd9 4a40437e cb63413c
+threefry4x32 13 00000000 00000000 00000000 80000000 00000000 00000000 00000000 00000001 730a2e93 0cbfda73 72c9f9fe 936a1a42
+threefry4x32 13 243f6a88 85a308d3 13198a2e 03707344 00000000 00000000 00000000 00000001 c325dccd 4d0d46a3 a0bf87fd 765514a9
+threefry4x32 13 a4093822 299f31d0 082efa98 ec4e6c89 00000000 00000000 00000000 00000001 77eab59a 4aeebf17 5f99bf1a 61de049e
+threefry4x32 13 452821e6 38d01377 be5466cf 34e90c6c 00000000 00000000 00000000 00000001 af627ea8 d88088da c07f790d 4ff5b0ac
+threefry4x32 13 00000001 00000000 00000000 00000000 00000000 ffffffff 00000000 00000000 e0cb88ba 17e181a0 2946aa88 9443cccc
+threefry4x32 13 00000000 00000001 00000000 00000000 00000000 ffffffff 00000000 00000000 b0ea449f 66f501e8 8df43f17 52c4ee1d
+threefry4x32 13 00000000 00000000 00000001 00000000 00000000 ffffffff 00000000 00000000 7889161d 5e28d071 d3f5c7a3 95225ab6
+threefry4x32 13 00000000 00000000 00000000 00000001 00000000 ffffffff 00000000 00000000 880f46d0 28610176 362a2ecb f1a6336b
+threefry4x32 13 00000000 ffffffff 00000000 00000000 00000000 ffffffff 00000000 00000000 d2b3535a d354a28a 36d6521d e0ce90a2
+threefry4x32 13 00000000 80000000 00000000 00000000 00000000 ffffffff 00000000 00000000 5f8f5010 72df59a8 f6979560 6abef914
+threefry4x32 13 00000000 00000000 ffffffff 00000000 00000000 ffffffff 00000000 00000000 835394ae 63d0fa88 4f429ab5 e9b5607a
+threefry4x32 13 00000000 00000000 80000000 00000000 00000000 ffffffff 00000000 00000000 d551fb5f 37913678 4ac2778a befd7153
+threefry4x32 13 00000000 00000000 00000000 ffffffff 00000000 ffffffff 00000000 00000000 497e8b34 d89d8baf 1de18810 674236b2
+threefry4x32 13 00000000 00000000 00000000 80000000 00000000 ffffffff 00000000 00000000 7f592187 57aec906 15d8b63e 6702a7f9
+threefry4x32 13 243f6a88 85a308d3 13198a2e 03707344 00000000 ffffffff 00000000 00000000 93492d6c b08d1b13 356c8f17 49014dbb
+threefry4x32 13 a4093822 299f31d0 082efa98 ec4e6c89 00000000 ffffffff 00000000 00000000 2aba9b17 b0f1815b 5f138050 2e88678e
+threefry4x32 13 452821e6 38d01377 be5466cf 34e90c6c 00000000 ffffffff 00000000 00000000 b0afc429 9054cef2 63f61b5b d2607a3e
+threefry4x32 13 00000001 00000000 00000000 00000000 00000000 80000000 00000000 00000000 b5a298c5 98544b8f 0b290c3b 4fc4fdf3
+threefry4x32 13 00000000 00000001 00000000 00000000 00000000 80000000 00000000 00000000 e2041951 46bb6763 5a36b34f 1f66efaf
+threefry4x32 13 00000000 00000000 00000001 00000000 00000000 80000000 00000000 00000000 89aa48a3 c778ebf3 60c3ac82 dedaed40
+threefry4x32 13 00000000 00000000 00000000 00000001 00000000 80000000 00000000 00000000 1eacd90b c3f0b4e6 23e423ce aafd4b43
+threefry4x32 13 00000000 ffffffff 00000000 00000000 00000000 80000000 00000000 00000000 8a638e3b c227769d bae62226 12630b0f
+threefry4x32 13 00000000 80000000 00000000 00000000 00000000 80000000 00000000 00000000 97724835 82597cc0 49882f15 7c12d92f
+threefry4x32 13 00000000 00000000 ffffffff 00000000 00000000 80000000 00000000 00000000 591bf94a 59fa8964 5dc10c15 dea6b756
+threefry4x32 13 00000000 00000000 80000000 00000000 00000000 80000000 00000000 00000000 541b74ab 1aa9ef7a 59220844 15fa0d90
+threefry4x32 13 00000000 00000000 00000000 ffffffff 00000000 80000000 00000000 00000000 385c7d29 c23b3a6c 0fca8dd0 3f4f3e91
+threefry4x32 13 00000000 00000000 00000000 80000000 00000000 80000000 00000000 00000000 e538346b 44592384 21c220bd 940f1fbb
+threefry4x32 13 243f6a88 85a308d3 13198a2e 03707344 00000000 80000000 00000000 00000000 6a8dccf0 e3103390 ec3122e0 1b0dc865
+threefry4x32 13 a4093822 299f31d0 082efa98 ec4e6c89 00000000 80000000 00000000 00000000 10259fc5 4a51eb0e ed50befc 8c10418c
+threefry4x32 13 452821e6 38d01377 be5466cf 34e90c6c 00000000 80000000 00000000 00000000 4f20b506 d03e080e 5dd8990c e3fafd81
+threefry4x32 13 00000001 00000000 00000000 00000000 00000000 00000000 ffffffff 00000000 20c66986 ce82602a b34b9348 de9cc423
+threefry4x32 13 00000000 00000001 00000000 00000000 00000000 00000000 ffffffff 00000000 0a8f0c1d 82fce677 27c1ac16 57988493
+threefry4x32 13 00000000 00000000 00000001 00000000 00000000 00000000 ffffffff 00000000 7bfcc4a1 45a65bf9 f5aeacd1 a2947299
+threefry4x32 13 00000000 00000000 00000000 00000001 00000000 00000000 ffffffff 00000000 90875e0b 82506f17 b531b1b2 7d2d028c
+threefry4x32 13 00000000 ffffffff 00000000 00000000 00000000 00000000 ffffffff 00000000 18545949 69305ed4 4b3da352 0f8dd522
+threefry4x32 13 00000000 80000000 00000000 00000000 00000000 00000000 ffffffff 00000000 b4d7bb50 ac6f5eba 5d97c45e de2d6956
+threefry4x32 13 00000000 00000000 ffffffff 00000000 00000000 00000000 ffffffff 00000000 617273a9 211ecb6a f327e136 bdd5dacb
+threefry4x32 13 00000000 00000000 80000000 00000000 00000000 00000000 ffffffff 00000000 7a3467b0 f8a27a09 b120bc81 8a9557f5
+threefry4x32 13 00000000 00000000 00000000 ffffffff 00000000 00000000 ffffffff 00000000 6de0b215 7d98a8f1 58cb248f 4f666c7e
+threefry4x32 13 00000000 00000000 00000000 80000000 00000000 00000000 ffffffff 00000000 244e2551 7ab76c56 0cb96ec5 fcabd419
+threefry4x32 13 243f6a88 85a308d3 13198a2e 03707344 00000000 00000000 ffffffff 00000000 934afaf9 56a7c139 6962f013 84ec70a1
+threefry4x32 13 a4093822 299f31d0 082efa98 ec4e6c89 00000000 00000000 ffffffff 00000000 c6a6cd92 d83ee260 8b666f81 94a02e20
+threefry4x32 13 452821e6 38d01377 be5466cf 34e90c6c 00000000 00000000 ffffffff 00000000 638f713e e708f8e2 fff2eb86 31ec2455
+threefry4x32 13 00000001 00000000 00000000 00000000 00000000 00000000 80000000 00000000 c0163b54 8f252db7 c28d798a 6613f48f
+threefry4x32 13 00000000 00000001 00000000 00000000 00000000 00000000 80000000 00000000 ce187c27 a948119f 07227a1b 0c6ead40
+threefry4x32 13 00000000 00000000 00000001 00000000 00000000 00000000 80000000 00000000 5d64e652 a3f06629 387cb0a2 431cbfee
+threefry4x32 13 00000000 00000000 00000000 00000001 00000000 00000000 80000000 00000000 32ec886e fe5884e3 a4a72770 4e126562
+threefry4x32 13 00000000 ffffffff 00000000 00000000 00000000 00000000 80000000 00000000 a4ae85df c1d2f99a 5fe4d68c 9e3f0931
+threefry4x32 13 00000000 80000000 00000000 00000000 00000000 00000000 80000000 00000000 3f93aa6d bfaec1b9 456c1592 d2fb4742
+threefry4x32 13 00000000 00000000 ffffffff 00000000 00000000 00000000 80000000 00000000 6a664c79 50161d2e 4b55d3fa 9137506d
+threefry4x32 13 00000000 00000000 80000000 00000000 00000000 00000000 80000000 00000000 f2192d18 d6e93dc7 f0faded8 1413e98a
+threefry4x32 13 00000000 00000000 00000000 ffffffff 00000000 00000000 80000000 00000000 a4efc3b8 ddfc1a8b 47fa89d3 e28a2d7c
+threefry4x32 13 00000000 00000000 00000000 80000000 00000000 00000000 80000000 00000000 a6307085 fd39c3dd 440c18b7 7338e5a3
+threefry4x32 13 243f6a88 85a308d3 13198a2e 03707344 00000000 00000000 80000000 00000000 50bccbed 79ddec0d 53d7163d 584f8670
+threefry4x32 13 a4093822 299f31d0 082efa98 ec4e6c89 00000000 00000000 80000000 00000000 d3b55c83 6e7b6f42 fb6a086e f8d484c3
+threefry4x32 13 452821e6 38d01377 be5466cf 34e90c6c 00000000 00000000 80000000 00000000 ea8172a9 0f986a3b b392993f 370b8468
+threefry4x32 13 00000001 00000000 00000000 00000000 00000000 00000000 00000000 ffffffff 859aa72f 6bb65ad2 1af7d19a 07b3dfba
+threefry4x32 13 00000000 00000001 00000000 00000000 00000000 00000000 00000000 ffffffff 3b681644 1118ab22 cd72ea4e d032523b
+threefry4x32 13 00000000 00000000 00000001 00000000 00000000 00000000 00000000 ffffffff f7b84f1b 4df726ca c2f490f4 a1c7081a
+threefry4x32 13 00000000 00000000 00000000 00000001 00000000 00000000 00000000 ffffffff ad9946e8 09c1c011 e4bb5cbe a8384ba3
+threefry4x32 13 00000000 ffffffff 00000000 00000000 00000000 00000000 00000000 ffffffff 130ffb6d 587e8e0d 265ad6e6 51acdfb1
+threefry4x32 13 00000000 80000000 00000000 00000000 00000000 00000000 00000000 ffffffff 6f3d6d3b 9e1ceb3c 5de98f47 5dcee187
+threefry4x32 13 00000000 00000000 ffffffff 00000000 00000000 00000000 00000000 ffffffff eeb5e084 76c64fbd aa92e022 bf4c9c68
+threefry4x32 13 00000000 00000000 80000000 00000000 00000000 00000000 00000000 ffffffff b2b71f54 101817ca 88b01673 6c67712d
+threefry4x32 13 00000000 00000000 00000000 ffffffff 00000000 00000000 00000000 ffffffff 1f5a4754 643e6831 b3c094be d28a2a24
+threefry4x32 13 00000000 00000000 00000000 80000000 00000000 00000000 00000000 ffffffff 549a5412 89bdc102 614c9193 a6d813f7
+threefry4x32 13 243f6a88 85a308d3 13198a2e 03707344 00000000 00000000 00000000 ffffffff ffe3fd54 21a20d59 03cf8258 84ac4999
+threefry4x32 13 a4093822 299f31d0 082efa98 ec4e6c89 00000000 00000000 00000000 ffffffff b79cd0cf b515fcc0 a1674946 a1187117
+threefry4x32 13 452821e6 38d01377 be5466cf 34e90c6c 00000000 00000000 00000000 ffffffff b6305e69 b3ccd613 a3266147 4312ec73
+threefry4x32 13 00000001 00000000 00000000 00000000 00000000 00000000 00000000 80000000 7d67e519 55549296 2eb13bfd 81823f68
+threefry4x32 13 00000000 00000001 00000000 00000000 00000000 00000000 00000000 80000000 66dba48c a5eee0bb 18d1599f 1eba839e
+threefry4x32 13 00000000 00000000 00000001 00000000 00000000 00000000 00000000 80000000 d71d63bb 3351afa8 b24560e1 b6355e77
+threefry4x32 13 00000000 00000000 00000000 00000001 00000000 00000000 00000000 80000000 d4f42034 cc3975c3 c9ecc935 658abb6e
+threefry4x32 13 00000000 ffffffff 00000000 00000000 00000000 00000000 00000000 80000000 f9f9b176 5d8314e0 9685ff9a e8dcf31f
+threefry4x32 13 00000000 80000000 00000000 00000000 00000000 00000000 00000000 80000000 75151c94 5f1bb005 f9174036 95460872
+threefry4x32 13 00000000 00000000 ffffffff 00000000 00000000 00000000 00000000 80000000 007d59b5 37178598 35fbd0dc d54535cd
+threefry4x32 13 00000000 00000000 80000000 00000000 00000000 00000000 00000000 80000000 b5f32f71 a670ff75 2bd1eb0c 74138877
+threefry4x32 13 00000000 00000000 00000000 ffffffff 00000000 00000000 00000000 80000000 19319fd2 97eb8752 7c7c5657 a95bcf65
+threefry4x32 13 00000000 00000000 00000000 80000000 00000000 00000000 00000000 80000000 5e75035a 33bf62ee eaf8c0b2 c7461234
+threefry4x32 13 243f6a88 85a308d3 13198a2e 03707344 00000000 00000000 00000000 80000000 91894181 9b4a5a5a 5436d9a4 464b4f16
+threefry4x32 13 a4093822 299f31d0 082efa98 ec4e6c89 00000000 00000000 00000000 80000000 12a30ea8 5998d88f 7efddb98 18855380
+threefry4x32 13 452821e6 38d01377 be5466cf 34e90c6c 00000000 00000000 00000000 80000000 b9ea931a eaa9ebc0 23814855 1ed78d0e
+threefry4x32 20 00000001 00000000 00000000 00000000 00000001 00000000 00000000 00000000 7abf626d 1ab006a8 df122d54 f32aad64
+threefry4x32 20 00000000 00000001 00000000 00000000 00000001 00000000 00000000 00000000 9ca4c2d0 52b79a44 746ff6b9 d2bc40a8
+threefry4x32 20 00000000 00000000 00000001 00000000 00000001 00000000 00000000 00000000 1660946a 5c6cb533 bce451d6 6a8ea7d1
+threefry4x32 20 00000000 00000000 00000000 00000001 00000001 00000000 00000000 00000000 aee9b8af d3974b35 08430dd8 c0144975
+threefry4x32 20 00000000 ffffffff 00000000 00000000 00000001 00000000 00000000 00000000 1d70ba8d 10b08201 d648f656 53725b82
+threefry4x32 20 00000000 80000000 00000000 00000000 00000001 00000000 00000000 00000000 da93366f 0c3172ae e540e7d3 4394643e
+threefry4x32 20 00000000 00000000 ffffffff 00000000 00000001 00000000 00000000 00000000 d63def2f 21dd1e3c f1f869aa 45651495
+threefry4x32 20 00000000 00000000 80000000 00000000 00000001 00000000 00000000 00000000 76d830a5 5626c957 ad7bab47 bce56186
+threefry4x32 20 00000000 00000000 00000000 ffffffff 00000001 00000000 00000000 00000000 929d0fdb 313aba54 6ddae3a7 458ac900
+threefry4x32 20 00000000 00000000 00000000 80000000 00000001 00000000 00000000 00000000 8a33982c 3e714678 8e459239 e69e7871
+threefry4x32 20 243f6a88 85a308d3 13198a2e 03707344 00000001 00000000 00000000 00000000 7771a0cb 14b9d81f 7f6fafa4 1ef38878
+threefry4x32 20 a4093822 299f31d0 082efa98 ec4e6c89 00000001 00000000 00000000 00000000 d2475970 69b39f1c 76a0e58d 6cbc7b00
+threefry4x32 20 452821e6 38d01377 be5466cf 34e90c6c 00000001 00000000 00000000 00000000 44e9188c f22b4558 abe99791 d7050ba1
+threefry4x32 20 00000001 00000000 00000000 00000000 00000000 00000001 00000000 00000000 cd5ca55b 0f511ce1 d034d9d4 4de57515
+threefry4x32 20 00000000 00000001 00000000 00000000 00000000 00000001 00000000 00000000 719ed999 5ee45a0a 98bf92f7 313eb33d
+threefry4x32 20 00000000 00000000 00000001 00000000 00000000 00000001 00000000 00000000 e3b5105e 17ff842b e76c7b45 9c8ec5eb
+threefry4x32 20 00000000 00000000 00000000 00000001 00000000 00000001 00000000 00000000 dbd1f89d 2d266865 223e2436 20da6b99
+threefry4x32 20 00000000 ffffffff 00000000 00000000 00000000 00000001 00000000 00000000 9bd6735a 912dd856 31e700d3 e846fe74
+threefry4x32 20 00000000 80000000 00000000 00000000 00000000 00000001 00000000 00000000 e999d1ec de625a88 2b62184a 7e757487
+threefry4x32 20 00000000 00000000 ffffffff 00000000 00000000 00000001 00000000 00000000 bbef6b52 46ec2e38 fb1ce33a 6f4d08a1
+threefry4x32 20 00000000 00000000 80000000 00000000 00000000 00000001 00000000 00000000 77de5928 2fd26df7 7c138b05 ec40d875
+threefry4x32 20 00000000 00000000 00000000 ffffffff 00000000 00000001 00000000 00000000 68b00fd7 28226ece 30717554 3caad6d9
+threefry4x32 20 00000000 00000000 00000000 80000000 00000000 00000001 00000000 00000000 7f1febcc b36e7136 8dc0b136 e7e907f9
+threefry4x32 20 243f6a88 85a308d3 13198a2e 03707344 00000000 00000001 00000000 00000000 da6b34b7 6f1f3431 a29d7413 a1ee6b27
+threefry4x32 20 a4093822 299f31d0 082efa98 ec4e6c89 00000000 00000001 00000000 00000000 a6b1f881 9dea4786 80989c4c 4d60c817
+threefry4x32 20 452821e6 38d01377 be5466cf 34e90c6c 00000000 00000001 00000000 00000000 48d517ee 57fe23cf 236383d0 f68f54ca
+threefry4x32 20 00000001 00000000 00000000 00000000 00000000 00000000 00000001 00000000 877ec138 5d60ec84 cf496d33 00810905
+threefry4x32 20 00000000 00000001 00000000 00000000 00000000 00000000 00000001 00000000 a32388e9 bb55a8c3 4b6bb74c 2f4db0e7
+threefry4x32 20 00000000 00000000 00000001 00000000 00000000 00000000 00000001 00000000 b36c626f f78b6390 618f2b73 d8f60c3b
+threefry4x32 20 00000000 00000000 00000000 00000001 00000000 00000000 00000001 00000000 d7ed773c 499f3a68 458782e4 d9587c59
+threefry4x32 20 00000000 ffffffff 00000000 00000000 00000000 00000000 00000001 00000000 c03ca044 8b53660e 4da73b98 cf3f5e8b
+threefry4x32 20 00000000 80000000 00000000 00000000 00000000 00000000 00000001 00000000 23d5f689 304886c9 c4dc0f19 04d89ded
+threefry4x32 20 00000000 00000000 ffffffff 00000000 00000000 00000000 00000001 00000000 47efa3ce fa438a0c 7e505603 bf41e2b5
+threefry4x32 20 00000000 00000000 80000000 00000000 00000000 00000000 00000001 00000000 b1fb5a5a 322e31ee bc46eaad 264c7a0a
+threefry4x32 20 00000000 00000000 00000000 ffffffff 00000000 00000000 00000001 00000000 2be25bd7 3ecff089 d667e103 0cc98f4b
+threefry4x32 20 00000000 00000000 00000000 80000000 00000000 00000000 00000001 00000000 dcc09281 25e8fc15 99b73154 8ecb92f4
+threefry4x32 20 243f6a88 85a308d3 13198a2e 03707344 00000000 00000000 00000001 00000000 354060d0 2a7af67b fe20d404 7e3851b5
+threefry4x32 20 a4093822 299f31d0 082efa98 ec4e6c89 00000000 00000000 00000001 00000000 f59114e5 924f6c4c 6e46f9f3 4148c3a4
+threefry4x32 20 452821e6 38d01377 be5466cf 34e90c6c 00000000 00000000 00000001 00000000 59ad2ff1 aaf66838 58f96539 41ac71f6
+threefry4x32 20 00000001 00000000 00000000 00000000 00000000 00000000 00000000 00000001 f9980dbb 6fb50a56 61316640 c5fbc269
+threefry4x32 20 00000000 00000001 00000000 00000000 00000000 00000000 00000000 00000001 29e66b28 0b31a602 813b6463 672b996c
+threefry4x32 20 00000000 00000000 00000001 00000000 00000000 00000000 00000000 00000001 97a75cdf 3e163e27 f762605f 24f1cf0d
+threefry4x32 20 00000000 00000000 00000000 00000001 00000000 00000000 00000000 00000001 11128c97 7cfedcf4 21ac3aeb c57f95a0
+threefry4x32 20 00000000 ffffffff 00000000 00000000 00000000 00000000 00000000 00000001 8871d08b 50a56a70 cf8b5fb1 41af799a
+threefry4x32 20 00000000 80000000 00000000 00000000 00000000 00000000 00000000 00000001 20d1b6dc 2ea43da2 d1d3ce8c e3a2ba78
+threefry4x32 20 00000000 00000000 ffffffff 00000000 00000000 00000000 00000000 00000001 84ce4cc5 9173f458 8f93d413 17f1917e
+threefry4x32 20 00000000 00000000 80000000 00000000 00000000 00000000 00000000 00000001 4f459d2a d6396b52 227fcfff 364fb84b
+threefry4x32 20 00000000 00000000 00000000 ffffffff 00000000 00000000 00000000 00000001 818780ad 84a418bb 89298bb2 6e029f7c
+threefry4x32 20 00000000 00000000 00000000 80000000 00000000 00000000 00000000 00000001 2f38ef82 fddbbda1 b835f37e ceca1194
+threefry4x32 20 243f6a88 85a308d3 13198a2e 03707344 00000000 00000000 00000000 00000001 ca5c1d73 966f4bb6 c39a67b5 700ef44f
+threefry4x32 20 a4093822 299f31d0 082efa98 ec4e6c89 00000000 00000000 00000000 00000001 b2be8a87 e80084dd 567e7c32 b2b567d1
+threefry4x32 20 452821e6 38d01377 be5466cf 34e90c6c 00000000 00000000 00000000 00000001 f9465abf 41dcb1e5 c3dd2934 60cefe14
+threefry4x32 20 00000001 00000000 00000000 00000000 00000000 ffffffff 00000000 00000000 f938ae0b 280a1a60 22588ce3 d2ad79e5
+threefry4x32 20 00000000 00000001 00000000 00000000 00000000 ffffffff 00000000 00000000 f9bb4d06 7bd59688 c26de361 afe0fd6b
+threefry4x32 20 00000000 00000000 00000001 00000000 00000000 ffffffff 00000000 00000000 e23d5d08 38c68a3c ff829bd3 2fc0e91d
+threefry4x32 20 00000000 00000000 00000000 00000001 00000000 ffffffff 00000000 00000000 6decfd6d c52434e1 5aec208d 59501671
+threefry4x32 20 00000000 ffffffff 00000000 00000000 00000000 ffffffff 00000000 00000000 7807880f fb81f5ae 3b8a50f6 b370c421
+threefry4x32 20 00000000 80000000 00000000 00000000 00000000 ffffffff 00000000 00000000 8f6a3d89 508c5cbf 9225f59b 71d1261a
+threefry4x32 20 00000000 00000000 ffffffff 00000000 00000000 ffffffff 00000000 00000000 9724a16b 8b0883c5 1846f2ff d6a10d39
+threefry4x32 20 00000000 00000000 80000000 00000000 00000000 ffffffff 00000000 00000000 54307a6e c60747fb edd0fbc8 0bd6fb57
+threefry4x32 20 00000000 00000000 00000000 ffffffff 00000000 ffffffff 00000000 00000000 05c03d1c 58007f68 ccba4dca 5eb0e23a
+threefry4x32 20 00000000 00000000 00000000 80000000 00000000 ffffffff 00000000 00000000 3b13b3ba 5e085212 d13c41d5 e856459b
+threefry4x32 20 243f6a88 85a308d3 13198a2e 03707344 00000000 ffffffff 00000000 00000000 33e6452a 35fc8e87 a16f03ef 68e38cf7
+threefry4x32 20 a4093822 299f31d0 082efa98 ec4e6c89 00000000 ffffffff 00000000 00000000 d348602b 00d485ba dfa639b3 d60e12cd
+threefry4x32 20 452821e6 38d01377 be5466cf 34e90c6c 00000000 ffffffff 00000000 00000000 02e4dfb4 8142a511 495c5c31 7ae0da50
+threefry4x32 20 00000001 00000000 00000000 00000000 00000000 80000000 00000000 00000000 d37eb236 2ddad9c3 61528ff7 b8ec5256
+threefry4x32 20 00000000 00000001 00000000 00000000 00000000 80000000 00000000 00000000 03ad393e bbc1bf89 dd6e098c 56a3302c
+threefry4x32 20 00000000 00000000 00000001 00000000 00000000 80000000 00000000 00000000 fc5b6ff0 879c918b d6e46000 fb47ab60
+threefry4x32 20 00000000 00000000 00000000 00000001 00000000 80000000 00000000 00000000 17b8b414 0aa2716b a6925cee 44b8be19
+threefry4x32 20 00000000 ffffffff 00000000 00000000 00000000 80000000 00000000 00000000 eec59a8b fd034061 6c249c4f 5271c003
+threefry4x32 20 00000000 80000000 00000000 00000000 00000000 80000000 00000000 00000000 0659aef3 347f8aa1 664a8892 e4183f59
+threefry4x32 20 00000000 00000000 ffffffff 00000000 00000000 80000000 00000000 00000000 0b0366fb 6d6e8025 da9b8e96 000fa93a
+threefry4x32 20 00000000 00000000 80000000 00000000 00000000 80000000 00000000 00000000 1415a6d4 44b1df75 e690b46c aff8c717
+threefry4x32 20 00000000 00000000 00000000 ffffffff 00000000 80000000 00000000 00000000 a7515669 034355b9 527c44b0 cf71b104
+threefry4x32 20 00000000 00000000 00000000 80000000 00000000 80000000 00000000 00000000 8c502590 9ce36ae7 45875b1c fde5ff97
+threefry4x32 20 243f6a88 85a308d3 13198a2e 03707344 00000000 80000000 00000000 00000000 d056e169 da3c6dab 31b3ed9f 70c8b685
+threefry4x32 20 a4093822 299f31d0 082efa98 ec4e6c89 00000000 80000000 00000000 00000000 941eac5f f50a12c3 bed601ff 6024a402
+threefry4x32 20 452821e6 38d01377 be5466cf 34e90c6c 00000000 80000000 00000000 00000000 67139da8 71e6f247 a90ff128 3fe6ccf0
+threefry4x32 20 00000001 00000000 00000000 00000000 00000000 00000000 ffffffff 00000000 b26e46d7 d58dcbea 44489127 2865ac93
+threefry4x32 20 00000000 00000001 00000000 00000000 00000000 00000000 ffffffff 00000000 14ee5b14 66aba2e0 6bd68aae f984f705
+threefry4x32 20 00000000 00000000 00000001 00000000 00000000 00000000 ffffffff 00000000 f49e7e65 dedd4390 4b104723 618625fc
+threefry4x32 20 00000000 00000000 00000000 00000001 00000000 00000000 ffffffff 00000000 577246b9 6d087fea 64b6d323 8e4fa21e
+threefry4x32 20 00000000 ffffffff 00000000 00000000 00000000 00000000 ffffffff 00000000 0c9b68b4 16289051 7b6b1ac6 23e3d806
+threefry4x32 20 00000000 80000000 00000000 00000000 00000000 00000000 ffffffff 00000000 f4c74238 f457f99a 7b7a0621 1d791994
+threefry4x32 20 00000000 00000000 ffffffff 00000000 00000000 00000000 ffffffff 00000000 79a8f615 4c1fb115 2439febc 91ec3ef7
+threefry4x32 20 00000000 00000000 80000000 00000000 00000000 00000000 ffffffff 00000000 505396e0 2aeac4e0 5aef015d a129a598
+threefry4x32 20 00000000 00000000 00000000 ffffffff 00000000 00000000 ffffffff 00000000 82832f91 e2733136 9677e3ff 96b94781
+threefry4x32 20 00000000 00000000 00000000 80000000 00000000 00000000 ffffffff 00000000 3037f522 33b7280b ff7f8973 d6131090
+threefry4x32 20 243f6a88 85a308d3 13198a2e 03707344 00000000 00000000 ffffffff 00000000 d385ce86 2bc39e5a 4ade2764 ba39188a
+threefry4x32 20 a4093822 299f31d0 082efa98 ec4e6c89 00000000 00000000 ffffffff 00000000 fa7c55f8 0ccf6a95 6828c88c b3b7edc8
+threefry4x32 20 452821e6 38d01377 be5466cf 34e90c6c 00000000 00000000 ffffffff 00000000 b0e93230 2a11fb81 75be814c e0be3860
+threefry4x32 20 00000001 00000000 00000000 00000000 00000000 00000000 80000000 00000000 3c62aa08 d99bfc63 72d34e76 781ae48c
+threefry4x32 20 00000000 00000001 00000000 00000000 00000000 00000000 80000000 00000000 f88da646 bc58451d dfb5c3f1 eb596c4c
+threefry4x32 20 00000000 00000000 00000001 00000000 00000000 00000000 80000000 00000000 8b6e05be 4455517d 416026d6 548b3e5d
+threefry4x32 20 00000000 00000000 00000000 00000001 00000000 00000000 80000000 00000000 9f6ab638 70addd3d 105b2dd6 2f87b26d
+threefry4x32 20 00000000 ffffffff 00000000 00000000 00000000 00000000 80000000 00000000 8f11466e 36aae720 31530649 dddbad07
+threefry4x32 20 00000000 80000000 00000000 00000000 00000000 00000000 80000000 00000000 193985e2 c5f3347d f1dc0637 6be021fa
+threefry4x32 20 00000000 00000000 ffffffff 00000000 00000000 00000000 80000000 00000000 5e289a03 80647773 10df1470 e035bce8
+threefry4x32 20 00000000 00000000 80000000 00000000 00000000 00000000 80000000 00000000 c6304224 34d873a7 db3b2b6e 54030b67
+threefry4x32 20 00000000 00000000 00000000 ffffffff 00000000 00000000 80000000 00000000 beaf10ec 8b48cada 668f7b2c e2fd86a7
+threefry4x32 20 00000000 00000000 00000000 80000000 00000000 00000000 80000000 00000000 9fbb252d 2bcb551c cc59a234 156ca0cb
+threefry4x32 20 243f6a88 85a308d3 13198a2e 03707344 00000000 00000000 80000000 00000000 32d9d5c3 b491382e e679cdb9 e6c96f8e
+threefry4x32 20 a4093822 299f31d0 082efa98 ec4e6c89 00000000 00000000 80000000 00000000 e5356b8c e1f3df45 8024b188 d2bf0aab
+threefry4x32 20 452821e6 38d01377 be5466cf 34e90c6c 00000000 00000000 80000000 00000000 6ef2396b ce289257 342f9c90 3aaee904
+threefry4x32 20 00000001 00000000 00000000 00000000 00000000 00000000 00000000 ffffffff abc8ddc7 dbf5379e 3a809978 82f9096c
+threefry4x32 20 00000000 00000001 00000000 00000000 00000000 00000000 00000000 ffffffff 38b0bb32 c8ced8d8 b63b9968 dbf325b8
+threefry4x32 20 00000000 00000000 00000001 00000000 00000000 00000000 00000000 ffffffff 2086ba88 1cb8f743 07ac211a 965f6b64
+threefry4x32 20 00000000 00000000 00000000 00000001 00000000 00000000 00000000 ffffffff 07c6b1d7 4a66beb5 21c093bf 1081e95f
+threefry4x32 20 00000000 ffffffff 00000000 00000000 00000000 00000000 00000000 ffffffff ad660005 4e918661 86f9c5ae a244990e
+threefry4x32 20 00000000 80000000 00000000 00000000 00000000 00000000 00000000 ffffffff 9ebee205 166de65d 48b85c4d 71a4a225
+threefry4x32 20 00000000 00000000 ffffffff 00000000 00000000 00000000 00000000 ffffffff 24fa4e0b 6f4a4f1c 3efc6acf 2f0af4b4
+threefry4x32 20 00000000 00000000 80000000 00000000 00000000 00000000 00000000 ffffffff d781cec1 16e2bca6 959e05cc 2b4dd292
+threefry4x32 20 00000000 00000000 00000000 ffffffff 00000000 00000000 00000000 ffffffff 24aa0e95 a5192356 67a67574 53a84850
+threefry4x32 20 00000000 00000000 00000000 80000000 00000000 00000000 00000000 ffffffff f2016f23 a78565ae 1880c681 3dd669b8
+threefry4x32 20 243f6a88 85a308d3 13198a2e 03707344 00000000 00000000 00000000 ffffffff c533f368 9dc05fec 46387b65 e6df5427
+threefry4x32 20 a4093822 299f31d0 082efa98 ec4e6c89 00000000 00000000 00000000 ffffffff 86dbe6b0 ee36ed73 d2003c4c 85b2f032
+threefry4x32 20 452821e6 38d01377 be5466cf 34e90c6c 00000000 00000000 00000000 ffffffff 8f40ddae 6720f14a 1295037e 2b6fe580
+threefry4x32 20 00000001 00000000 00000000 00000000 00000000 00000000 00000000 80000000 a7ab1fa0 a48016dd 199d9549 9c7d6e97
+threefry4x32 20 00000000 00000001 00000000 00000000 00000000 00000000 00000000 80000000 6140be19 0bb69fbf 41262d16 e577b795
+threefry4x32 20 00000000 00000000 00000001 00000000 00000000 00000000 00000000 80000000 f3eeeb6c f70a689d 96074833 8d2913c3
+threefry4x32 20 00000000 00000000 00000000 00000001 00000000 00000000 00000000 80000000 4d3c8d35 eaae92ef 9d504bb9 ebf6a44f
+threefry4x32 20 00000000 ffffffff 00000000 00000000 00000000 00000000 00000000 80000000 a79d4a27 b64d6bc7 dedd5f31 1d036d32
+threefry4x32 20 00000000 80000000 00000000 00000000 00000000 00000000 00000000 80000000 0f7e61c8 551a5639 601396b7 072ed781
+threefry4x32 20 00000000 00000000 ffffffff 00000000 00000000 00000000 00000000 80000000 e44dfcc4 53432a37 1e3b8ac0 4d398038
+threefry4x32 20 00000000 00000000 80000000 00000000 00000000 00000000 00000000 80000000 47688a8d b01f446f c12e5b49 7f858ea4
+threefry4x32 20 00000000 00000000 00000000 ffffffff 00000000 00000000 00000000 80000000 634c27d7 898b3477 05a72e5a e4319af9
+threefry4x32 20 00000000 00000000 00000000 80000000 00000000 00000000 00000000 80000000 d493dd04 d6964a71 f5fec603 399b5e2f
+threefry4x32 20 243f6a88 85a308d3 13198a2e 03707344 00000000 00000000 00000000 80000000 32c36c0b 33dc130f c0890ca1 b34d5012
+threefry4x32 20 a4093822 299f31d0 082efa98 ec4e6c89 00000000 00000000 00000000 80000000 af2f3e6a c77e8257 001209a2 3d78e3ee
+threefry4x32 20 452821e6 38d01377 be5466cf 34e90c6c 00000000 00000000 00000000 80000000 c089a051 b8cbe6c4 70ade481 414be4a8
+#Only aesni test is the FIPS197 test vector
+aesni4x32 10 33221100 77665544 bbaa9988 ffeeddcc 03020100 07060504 0b0a0908 0f0e0d0c d8e0c469 30047b6a 80b7cdd8 5ac5b470
+ars4x32 7 00000001 00000000 00000000 00000000 00000001 00000000 00000000 00000000 3523162b dc14d20c 79184077 72184193
+ars4x32 7 00000100 00000000 00000000 00000000 00000001 00000000 00000000 00000000 6fb6e62d 68b661a4 6f1280f3 22cdb932
+ars4x32 7 00010000 00000000 00000000 00000000 00000001 00000000 00000000 00000000 55b66ba6 0b73dfc4 ca2010ae ad28d97e
+ars4x32 7 01000000 00000000 00000000 00000000 00000001 00000000 00000000 00000000 af6cb834 72fab497 290540d3 28a63677
+ars4x32 7 00000000 00000001 00000000 00000000 00000001 00000000 00000000 00000000 f928af71 52594c2a e41e8545 f10cae23
+ars4x32 7 00000000 00000100 00000000 00000000 00000001 00000000 00000000 00000000 f9498100 dc442236 92194dd1 83a093c7
+ars4x32 7 00000000 00010000 00000000 00000000 00000001 00000000 00000000 00000000 f87500fe 1adb2f6b 919d5769 a882d0f0
+ars4x32 7 00000000 01000000 00000000 00000000 00000001 00000000 00000000 00000000 c6e27fb8 5dd75c62 84f2a444 11fd91a4
+ars4x32 7 00000000 00000000 00000001 00000000 00000001 00000000 00000000 00000000 b12ef4b4 748f8bd7 9fb1399d d39547a8
+ars4x32 7 00000000 00000000 00000100 00000000 00000001 00000000 00000000 00000000 80a66748 ba2bdf93 8d5fae68 0edc78d5
+ars4x32 7 00000000 00000000 00010000 00000000 00000001 00000000 00000000 00000000 11fb3330 432514e5 0e1a63d2 c3f4b292
+ars4x32 7 00000000 00000000 01000000 00000000 00000001 00000000 00000000 00000000 a7b5bf1b b295ebeb 544f1fdf 947bb346
+ars4x32 7 00000000 00000000 00000000 00000001 00000001 00000000 00000000 00000000 fa8bab94 ef7e7d49 d67f6d8f b030b353
+ars4x32 7 00000000 00000000 00000000 00000100 00000001 00000000 00000000 00000000 4177e35d b5585986 e16e468b 7b051fe8
+ars4x32 7 00000000 00000000 00000000 00010000 00000001 00000000 00000000 00000000 ef4ae251 c01058d0 91844766 73b965e9
+ars4x32 7 00000000 00000000 00000000 01000000 00000001 00000000 00000000 00000000 789dfd47 2f2f3ed2 8f55eba5 15af98bd
+ars4x32 7 0000ff00 00000000 00000000 00000000 00000001 00000000 00000000 00000000 c2cbebe0 4906b074 99d2a4fe 74204972
+ars4x32 7 00008000 00000000 00000000 00000000 00000001 00000000 00000000 00000000 2845e523 51e91cb7 a79b537e 1a5875f1
+ars4x32 7 00ff0000 00000000 00000000 00000000 00000001 00000000 00000000 00000000 022013d3 4b413126 5e2da277 774ce804
+ars4x32 7 00800000 00000000 00000000 00000000 00000001 00000000 00000000 00000000 af7088fb f4e42652 2d5d6163 e79832b3
+ars4x32 7 ff000000 00000000 00000000 00000000 00000001 00000000 00000000 00000000 81fc8a91 7bff9086 03393910 e8c2f256
+ars4x32 7 80000000 00000000 00000000 00000000 00000001 00000000 00000000 00000000 42231b13 ff20707d 5f2376f2 ce8672b7
+ars4x32 7 00000000 000000ff 00000000 00000000 00000001 00000000 00000000 00000000 de5ee9e4 f3f68d60 03aeb145 5ab70d58
+ars4x32 7 00000000 00000080 00000000 00000000 00000001 00000000 00000000 00000000 2815ad0c 34ec29d2 2afb2a63 4d4ded27
+ars4x32 7 00000000 0000ff00 00000000 00000000 00000001 00000000 00000000 00000000 f51e542f cc4cba41 9cd20f31 7b45463a
+ars4x32 7 00000000 00008000 00000000 00000000 00000001 00000000 00000000 00000000 32e737f1 e90ae2d4 c517c727 43dac8c0
+ars4x32 7 00000000 00ff0000 00000000 00000000 00000001 00000000 00000000 00000000 59f476a9 25a68376 12aaa448 4204c7ef
+ars4x32 7 00000000 00800000 00000000 00000000 00000001 00000000 00000000 00000000 109a62da 375da48e e667373f 7d300432
+ars4x32 7 00000000 ff000000 00000000 00000000 00000001 00000000 00000000 00000000 a9e31d93 f36c93a0 9257bd76 53618c92
+ars4x32 7 00000000 80000000 00000000 00000000 00000001 00000000 00000000 00000000 82e49339 8779350e 88dbb182 4b767bc3
+ars4x32 7 00000000 00000000 000000ff 00000000 00000001 00000000 00000000 00000000 1fba16c5 87a56b41 eee975e7 fcd9c427
+ars4x32 7 00000000 00000000 00000080 00000000 00000001 00000000 00000000 00000000 4c4e8cee 26c911ed 82c9c419 7e922f32
+ars4x32 7 00000000 00000000 0000ff00 00000000 00000001 00000000 00000000 00000000 4c6b9e86 8b63621a 0ce69c5a 8e1214a8
+ars4x32 7 00000000 00000000 00008000 00000000 00000001 00000000 00000000 00000000 3345dbf8 a21b6deb 95df8882 2cee5bf6
+ars4x32 7 00000000 00000000 00ff0000 00000000 00000001 00000000 00000000 00000000 a95808a6 9ac50792 4e8f64bb 23481cc2
+ars4x32 7 00000000 00000000 00800000 00000000 00000001 00000000 00000000 00000000 ff154d65 f952e6b8 49fce617 0e5c66b9
+ars4x32 7 00000000 00000000 ff000000 00000000 00000001 00000000 00000000 00000000 7fa55a59 c660b95b 82afe74e 11b90abe
+ars4x32 7 00000000 00000000 80000000 00000000 00000001 00000000 00000000 00000000 8dc1b022 cd9abb84 418a32dc edc93d06
+ars4x32 7 00000000 00000000 00000000 000000ff 00000001 00000000 00000000 00000000 014375b0 28d52a24 7c0dfda2 5fb669eb
+ars4x32 7 00000000 00000000 00000000 00000080 00000001 00000000 00000000 00000000 888951cd b983f2dd 673d28ca 9715cfb2
+ars4x32 7 00000000 00000000 00000000 0000ff00 00000001 00000000 00000000 00000000 407e6c65 cf1aaaaa 00f5e6a5 b842096d
+ars4x32 7 00000000 00000000 00000000 00008000 00000001 00000000 00000000 00000000 3b7ee2df d3bd1c9f c106f806 800057b6
+ars4x32 7 00000000 00000000 00000000 00ff0000 00000001 00000000 00000000 00000000 a72a1c5b 7ddec8b7 58758642 9a3130c2
+ars4x32 7 00000000 00000000 00000000 00800000 00000001 00000000 00000000 00000000 5f9a8a5d ed8fe111 2e184cd9 5ebea31c
+ars4x32 7 00000000 00000000 00000000 ff000000 00000001 00000000 00000000 00000000 de5527e7 7d0b3f49 7dc8235a dc6ed5c9
+ars4x32 7 00000000 00000000 00000000 80000000 00000001 00000000 00000000 00000000 a2154453 e90a0384 0e3816c0 bdb8b8e0
+ars4x32 7 886a3f24 d308a385 2e8a1913 44737003 00000001 00000000 00000000 00000000 bb4006c7 33dbc0db 1ea0a1c9 7f9541e3
+ars4x32 7 223809a4 d0319f29 98fa2e08 896c4eec 00000001 00000000 00000000 00000000 36f0672e 0337ce56 45e7cf25 197db869
+ars4x32 7 e6212845 7713d038 cf6654be 6c0ce934 00000001 00000000 00000000 00000000 bb33ad5e 8825d64e 9f8cbc28 722c7449
+ars4x32 7 00000001 00000000 00000000 00000000 00000100 00000000 00000000 00000000 e2fef76c e69a2546 354f712d cf15f67f
+ars4x32 7 00000100 00000000 00000000 00000000 00000100 00000000 00000000 00000000 34fffcea 8ea015ce eccfaa90 bb401947
+ars4x32 7 00010000 00000000 00000000 00000000 00000100 00000000 00000000 00000000 d727b857 560f384e 4d6f6d00 df267f76
+ars4x32 7 01000000 00000000 00000000 00000000 00000100 00000000 00000000 00000000 a9878fc5 dc39724f 37be857f a90a5d68
+ars4x32 7 00000000 00000001 00000000 00000000 00000100 00000000 00000000 00000000 38041b25 540aee93 8a7dea41 8531fc3c
+ars4x32 7 00000000 00000100 00000000 00000000 00000100 00000000 00000000 00000000 ed3b3cd0 039b7fee 59bfaf4c 2bb3ad73
+ars4x32 7 00000000 00010000 00000000 00000000 00000100 00000000 00000000 00000000 6d00d7e3 5d24e1f6 0c0f476a d7a7b45c
+ars4x32 7 00000000 01000000 00000000 00000000 00000100 00000000 00000000 00000000 bac0b2d2 f0bd7fa6 fdb5bbe1 d64347c3
+ars4x32 7 00000000 00000000 00000001 00000000 00000100 00000000 00000000 00000000 e360493c 31d69a9a 820e0bfa dd9a3dce
+ars4x32 7 00000000 00000000 00000100 00000000 00000100 00000000 00000000 00000000 424c05df 59e03d06 8d2b91b9 a8c6c4fd
+ars4x32 7 00000000 00000000 00010000 00000000 00000100 00000000 00000000 00000000 1a0f53d9 bc1548db 245e6e04 d5bdca89
+ars4x32 7 00000000 00000000 01000000 00000000 00000100 00000000 00000000 00000000 d1e06460 1d1230a9 0db6634b ada192f5
+ars4x32 7 00000000 00000000 00000000 00000001 00000100 00000000 00000000 00000000 cadb6f7f 90f2ff0f fd7e194d 0f20d0e1
+ars4x32 7 00000000 00000000 00000000 00000100 00000100 00000000 00000000 00000000 b23f4afe 1d5b5b1e 188fd756 c1211130
+ars4x32 7 00000000 00000000 00000000 00010000 00000100 00000000 00000000 00000000 cbfe49f4 1f7ead50 111d546f 0cfe779e
+ars4x32 7 00000000 00000000 00000000 01000000 00000100 00000000 00000000 00000000 ec6701cf c96ceaa5 c6ac2bea f8d24538
+ars4x32 7 0000ff00 00000000 00000000 00000000 00000100 00000000 00000000 00000000 d2a5788d 2ac03ddb 4694e11b 19a821ff
+ars4x32 7 00008000 00000000 00000000 00000000 00000100 00000000 00000000 00000000 8c1a80e0 c1d9bca3 33bb5502 3a699ee9
+ars4x32 7 00ff0000 00000000 00000000 00000000 00000100 00000000 00000000 00000000 4fb35bd5 f75ba852 20e4c1ac d89e8e78
+ars4x32 7 00800000 00000000 00000000 00000000 00000100 00000000 00000000 00000000 01de2719 57f13a99 4a865950 83467712
+ars4x32 7 ff000000 00000000 00000000 00000000 00000100 00000000 00000000 00000000 eda124b0 86926832 6b07d1ae 6089e29e
+ars4x32 7 80000000 00000000 00000000 00000000 00000100 00000000 00000000 00000000 3f7a7507 dcd9ce76 776f338f e0de1d10
+ars4x32 7 00000000 000000ff 00000000 00000000 00000100 00000000 00000000 00000000 0045b783 c8882fd9 589f8c68 f1215797
+ars4x32 7 00000000 00000080 00000000 00000000 00000100 00000000 00000000 00000000 aa75b9e2 b3bcea23 ee080acb 80c007c0
+ars4x32 7 00000000 0000ff00 00000000 00000000 00000100 00000000 00000000 00000000 dec4660c 586d36d3 405af16c e6747c3d
+ars4x32 7 00000000 00008000 00000000 00000000 00000100 00000000 00000000 00000000 ad1bc2ec 4e80db1d 555bb146 0adb8978
+ars4x32 7 00000000 00ff0000 00000000 00000000 00000100 00000000 00000000 00000000 b30955b3 506de1ee 517e0ce9 adcb4423
+ars4x32 7 00000000 00800000 00000000 00000000 00000100 00000000 00000000 00000000 fca5abdc 155e1f1a 1294a02d ac338d14
+ars4x32 7 00000000 ff000000 00000000 00000000 00000100 00000000 00000000 00000000 0f354869 9db19735 c62a061c d781a794
+ars4x32 7 00000000 80000000 00000000 00000000 00000100 00000000 00000000 00000000 6aa0ec2d 52169669 52cc849c b04b4e2e
+ars4x32 7 00000000 00000000 000000ff 00000000 00000100 00000000 00000000 00000000 76a8695f e2657f52 66132680 459fac17
+ars4x32 7 00000000 00000000 00000080 00000000 00000100 00000000 00000000 00000000 65b2c50a f0fa659e 2955f763 dd50b7be
+ars4x32 7 00000000 00000000 0000ff00 00000000 00000100 00000000 00000000 00000000 46e35843 9ed05230 93cb262c 82447770
+ars4x32 7 00000000 00000000 00008000 00000000 00000100 00000000 00000000 00000000 c90129e3 17bbb904 93b73b91 54bd4ecb
+ars4x32 7 00000000 00000000 00ff0000 00000000 00000100 00000000 00000000 00000000 f6b8ea4f 56dc57d8 b1da974c 930f4404
+ars4x32 7 00000000 00000000 00800000 00000000 00000100 00000000 00000000 00000000 62f1a1a9 9f4bfe1e b147e06a 89480f80
+ars4x32 7 00000000 00000000 ff000000 00000000 00000100 00000000 00000000 00000000 8ccf46b7 3c96fa79 dbaddd6e 6d4a8f9f
+ars4x32 7 00000000 00000000 80000000 00000000 00000100 00000000 00000000 00000000 9cfd0a12 dbd449d0 0899f1b0 776734aa
+ars4x32 7 00000000 00000000 00000000 000000ff 00000100 00000000 00000000 00000000 164e2a2e 0687b6b0 28ae5171 cf72b434
+ars4x32 7 00000000 00000000 00000000 00000080 00000100 00000000 00000000 00000000 ba0ff3f7 55904f5a f5654604 39ed84bd
+ars4x32 7 00000000 00000000 00000000 0000ff00 00000100 00000000 00000000 00000000 53066b99 83a4d1ed 454b66bd 46c3db2b
+ars4x32 7 00000000 00000000 00000000 00008000 00000100 00000000 00000000 00000000 d932d01f 523fc11c 649026d7 78555d42
+ars4x32 7 00000000 00000000 00000000 00ff0000 00000100 00000000 00000000 00000000 22692731 a3e84efd a62e8563 7d082ea0
+ars4x32 7 00000000 00000000 00000000 00800000 00000100 00000000 00000000 00000000 cc1faa6e d153f41f e49510b5 7414ee11
+ars4x32 7 00000000 00000000 00000000 ff000000 00000100 00000000 00000000 00000000 f75eee60 cfd19dbb 6b2928db a23eaa4d
+ars4x32 7 00000000 00000000 00000000 80000000 00000100 00000000 00000000 00000000 eb212ad6 d1798ddd 1cb1d3a2 4faa492c
+ars4x32 7 886a3f24 d308a385 2e8a1913 44737003 00000100 00000000 00000000 00000000 16f12765 03364a45 2ad9d46e a3e9a74c
+ars4x32 7 223809a4 d0319f29 98fa2e08 896c4eec 00000100 00000000 00000000 00000000 62163ea3 73e12817 e531a348 50c03c1e
+ars4x32 7 e6212845 7713d038 cf6654be 6c0ce934 00000100 00000000 00000000 00000000 5f2bd4b2 d3e5db14 64a054e9 1a7f038c
+ars4x32 7 00000001 00000000 00000000 00000000 00010000 00000000 00000000 00000000 89946751 a8781167 cec08928 26e12d35
+ars4x32 7 00000100 00000000 00000000 00000000 00010000 00000000 00000000 00000000 e8fcd218 527420d0 5bdf9eb9 88275738
+ars4x32 7 00010000 00000000 00000000 00000000 00010000 00000000 00000000 00000000 e5349df5 2bebd533 051d33a9 79089581
+ars4x32 7 01000000 00000000 00000000 00000000 00010000 00000000 00000000 00000000 77745613 fa0843e2 574548a4 4ad71f07
+ars4x32 7 00000000 00000001 00000000 00000000 00010000 00000000 00000000 00000000 759a7b4f e250af00 67feb99b c9bcd5a8
+ars4x32 7 00000000 00000100 00000000 00000000 00010000 00000000 00000000 00000000 f2fa46c5 4bc8e03a 9da5f00b e94f26be
+ars4x32 7 00000000 00010000 00000000 00000000 00010000 00000000 00000000 00000000 b24af7b7 8b39e81b 516497b4 03d45328
+ars4x32 7 00000000 01000000 00000000 00000000 00010000 00000000 00000000 00000000 74518558 34a6b002 6b2295ac 259c675a
+ars4x32 7 00000000 00000000 00000001 00000000 00010000 00000000 00000000 00000000 5a88b52d 6326fe18 c4e87f3e de32b54d
+ars4x32 7 00000000 00000000 00000100 00000000 00010000 00000000 00000000 00000000 88e59a00 51d28a83 f6e4b330 746a5e21
+ars4x32 7 00000000 00000000 00010000 00000000 00010000 00000000 00000000 00000000 1d7a1606 84e4cbbd 1abfa751 44c1af28
+ars4x32 7 00000000 00000000 01000000 00000000 00010000 00000000 00000000 00000000 635b17fa 93d2b246 18dff0d5 44174196
+ars4x32 7 00000000 00000000 00000000 00000001 00010000 00000000 00000000 00000000 9439d321 39b6ed65 f29ad358 5b3ab33b
+ars4x32 7 00000000 00000000 00000000 00000100 00010000 00000000 00000000 00000000 d3b226d0 f17ae0c4 1c08b11d 770fabda
+ars4x32 7 00000000 00000000 00000000 00010000 00010000 00000000 00000000 00000000 510571eb b26a689b ed6354f4 72f4dc67
+ars4x32 7 00000000 00000000 00000000 01000000 00010000 00000000 00000000 00000000 2b6f7eb0 d09fe512 5c4059fa 10b93549
+ars4x32 7 0000ff00 00000000 00000000 00000000 00010000 00000000 00000000 00000000 a01993d5 792f4743 856cc064 b4c1aa0b
+ars4x32 7 00008000 00000000 00000000 00000000 00010000 00000000 00000000 00000000 a9be5bef fb21cd0a e6a36818 7ce9d3cc
+ars4x32 7 00ff0000 00000000 00000000 00000000 00010000 00000000 00000000 00000000 520e92c7 df1e1219 7b1ecbef ae4ecbab
+ars4x32 7 00800000 00000000 00000000 00000000 00010000 00000000 00000000 00000000 78b673a8 4b6699ce 9fbbed20 9e7c251e
+ars4x32 7 ff000000 00000000 00000000 00000000 00010000 00000000 00000000 00000000 e62aee2b 70e15362 48919226 6c8b2ea8
+ars4x32 7 80000000 00000000 00000000 00000000 00010000 00000000 00000000 00000000 e18e5b03 b73ea66a 17fa2367 9bec1912
+ars4x32 7 00000000 000000ff 00000000 00000000 00010000 00000000 00000000 00000000 d9653b53 8e53c7f2 f7e28d83 f382e091
+ars4x32 7 00000000 00000080 00000000 00000000 00010000 00000000 00000000 00000000 b8ab1362 ca09b231 b6e182e4 0898a049
+ars4x32 7 00000000 0000ff00 00000000 00000000 00010000 00000000 00000000 00000000 9100d155 d1f9195a 65e17e27 25335ad9
+ars4x32 7 00000000 00008000 00000000 00000000 00010000 00000000 00000000 00000000 6fdbdcdd fe852f14 2c7ea5e6 fe6ed6a4
+ars4x32 7 00000000 00ff0000 00000000 00000000 00010000 00000000 00000000 00000000 2e003c15 fc696b20 4fa0d3e8 187a9ad0
+ars4x32 7 00000000 00800000 00000000 00000000 00010000 00000000 00000000 00000000 e6a6230d d621826a ceaff40d dab1fd68
+ars4x32 7 00000000 ff000000 00000000 00000000 00010000 00000000 00000000 00000000 23b972dd 6a41102e 3fefaa9f 787d61d2
+ars4x32 7 00000000 80000000 00000000 00000000 00010000 00000000 00000000 00000000 38217de7 996aec37 c2ac8fc7 6a85fe7d
+ars4x32 7 00000000 00000000 000000ff 00000000 00010000 00000000 00000000 00000000 b9110c72 b89bd9e7 af746395 ad3dab5e
+ars4x32 7 00000000 00000000 00000080 00000000 00010000 00000000 00000000 00000000 7b8e959a f6a29350 dd89bcd6 0b2de298
+ars4x32 7 00000000 00000000 0000ff00 00000000 00010000 00000000 00000000 00000000 61017e12 acf42650 9db18422 a6fead93
+ars4x32 7 00000000 00000000 00008000 00000000 00010000 00000000 00000000 00000000 1c770454 668ef738 76e03c43 2c0be368
+ars4x32 7 00000000 00000000 00ff0000 00000000 00010000 00000000 00000000 00000000 8e3473f6 cab98281 79318e54 7bff427e
+ars4x32 7 00000000 00000000 00800000 00000000 00010000 00000000 00000000 00000000 4f76299a e1d27fee f05ea39e 60eed953
+ars4x32 7 00000000 00000000 ff000000 00000000 00010000 00000000 00000000 00000000 80b8e85c 39987169 5689feb9 f6896150
+ars4x32 7 00000000 00000000 80000000 00000000 00010000 00000000 00000000 00000000 28409dad 503d924f 7a86db93 fa9a1b86
+ars4x32 7 00000000 00000000 00000000 000000ff 00010000 00000000 00000000 00000000 81162d5b 17805524 0f746072 56198ae6
+ars4x32 7 00000000 00000000 00000000 00000080 00010000 00000000 00000000 00000000 b02e2741 d0a55125 833710d0 99095698
+ars4x32 7 00000000 00000000 00000000 0000ff00 00010000 00000000 00000000 00000000 1d1a877f 6248d773 42ff4f8d f3318007
+ars4x32 7 00000000 00000000 00000000 00008000 00010000 00000000 00000000 00000000 953eaa01 345cb173 89b1a43d 2a262484
+ars4x32 7 00000000 00000000 00000000 00ff0000 00010000 00000000 00000000 00000000 2f99217b e3265774 f8c7097d 176838e1
+ars4x32 7 00000000 00000000 00000000 00800000 00010000 00000000 00000000 00000000 7b455b7a 8f44de5b 49b4e489 4efecc1f
+ars4x32 7 00000000 00000000 00000000 ff000000 00010000 00000000 00000000 00000000 89d36bdc 7250509e 154947d6 2b24eee7
+ars4x32 7 00000000 00000000 00000000 80000000 00010000 00000000 00000000 00000000 805902c7 5fe8da24 5596a805 919414a5
+ars4x32 7 886a3f24 d308a385 2e8a1913 44737003 00010000 00000000 00000000 00000000 a1f28e94 d9c2bd6e d1aefdb8 06de12b5
+ars4x32 7 223809a4 d0319f29 98fa2e08 896c4eec 00010000 00000000 00000000 00000000 0f57450c 94b448ed 3efb8323 d0002896
+ars4x32 7 e6212845 7713d038 cf6654be 6c0ce934 00010000 00000000 00000000 00000000 73005580 e1245058 41d4db4c 21861651
+ars4x32 7 00000001 00000000 00000000 00000000 01000000 00000000 00000000 00000000 5c4b4fac 4a902da1 49c67894 81affdbc
+ars4x32 7 00000100 00000000 00000000 00000000 01000000 00000000 00000000 00000000 80dffd64 942af8b4 91ce56d0 a1f0b1d8
+ars4x32 7 00010000 00000000 00000000 00000000 01000000 00000000 00000000 00000000 f64d4d05 4aaf07b4 e42433b4 bb9a2dcd
+ars4x32 7 01000000 00000000 00000000 00000000 01000000 00000000 00000000 00000000 00d8b708 3a583109 a0b663ce dc387c79
+ars4x32 7 00000000 00000001 00000000 00000000 01000000 00000000 00000000 00000000 bde8b707 b1d0fc98 2a6e75e9 69b13bc8
+ars4x32 7 00000000 00000100 00000000 00000000 01000000 00000000 00000000 00000000 921cd0c0 20641dd8 4077e8a0 4015c4f3
+ars4x32 7 00000000 00010000 00000000 00000000 01000000 00000000 00000000 00000000 1d992c48 19122a0e 29855702 e7fe63e8
+ars4x32 7 00000000 01000000 00000000 00000000 01000000 00000000 00000000 00000000 d3615b62 a10a3fbf e8c529eb 8ee27361
+ars4x32 7 00000000 00000000 00000001 00000000 01000000 00000000 00000000 00000000 0b120f22 3dc6329e 1ddcb426 7a0dbecb
+ars4x32 7 00000000 00000000 00000100 00000000 01000000 00000000 00000000 00000000 22d34172 9bd694bc 16621499 14971a6f
+ars4x32 7 00000000 00000000 00010000 00000000 01000000 00000000 00000000 00000000 f5239b2f 825cef05 6dc375a1 cb8d3678
+ars4x32 7 00000000 00000000 01000000 00000000 01000000 00000000 00000000 00000000 ebfcdf2c e82a8caf f0358985 82d5e001
+ars4x32 7 00000000 00000000 00000000 00000001 01000000 00000000 00000000 00000000 d6184b2f 521d122b 1b58dbde 2ee393f4
+ars4x32 7 00000000 00000000 00000000 00000100 01000000 00000000 00000000 00000000 e270e869 3f150608 7ffc8753 6c417364
+ars4x32 7 00000000 00000000 00000000 00010000 01000000 00000000 00000000 00000000 057cf2ab 4e817a4e a155ce11 e508ff07
+ars4x32 7 00000000 00000000 00000000 01000000 01000000 00000000 00000000 00000000 af6928f4 77a40536 ee3a8087 4b9ed5a1
+ars4x32 7 0000ff00 00000000 00000000 00000000 01000000 00000000 00000000 00000000 65a7b7d5 f7988414 f7753877 44da2732
+ars4x32 7 00008000 00000000 00000000 00000000 01000000 00000000 00000000 00000000 d32b4207 e3ccc6da a74431ce edc0c367
+ars4x32 7 00ff0000 00000000 00000000 00000000 01000000 00000000 00000000 00000000 15cdd5ad b95621a7 9df98e93 7afc642d
+ars4x32 7 00800000 00000000 00000000 00000000 01000000 00000000 00000000 00000000 f79e3600 278a9ff4 25840b72 ddbe0f3a
+ars4x32 7 ff000000 00000000 00000000 00000000 01000000 00000000 00000000 00000000 6f3a0542 74b95c62 7079dc80 c403d4fd
+ars4x32 7 80000000 00000000 00000000 00000000 01000000 00000000 00000000 00000000 fefe9a3d 77d75f58 07bdbf41 f81a8b77
+ars4x32 7 00000000 000000ff 00000000 00000000 01000000 00000000 00000000 00000000 07af7386 3b4eded0 e11204fe 39a066c6
+ars4x32 7 00000000 00000080 00000000 00000000 01000000 00000000 00000000 00000000 846fda1a c6652537 e644a37a 0d25ac39
+ars4x32 7 00000000 0000ff00 00000000 00000000 01000000 00000000 00000000 00000000 790a495a 8e01d43b 1ba7f6d0 bd42895b
+ars4x32 7 00000000 00008000 00000000 00000000 01000000 00000000 00000000 00000000 fcb0bb8a 81e4607b 0a0b331c 133a6780
+ars4x32 7 00000000 00ff0000 00000000 00000000 01000000 00000000 00000000 00000000 aae2bd69 f2ed7a43 6dafd25c 1fee4b82
+ars4x32 7 00000000 00800000 00000000 00000000 01000000 00000000 00000000 00000000 455f5a2c 876960c9 0e7ca579 08c9afed
+ars4x32 7 00000000 ff000000 00000000 00000000 01000000 00000000 00000000 00000000 59ce76c2 e0a6e62a 3ad76158 ddb9d93e
+ars4x32 7 00000000 80000000 00000000 00000000 01000000 00000000 00000000 00000000 6659a57e 986e656e 3013c3fb 61ebc630
+ars4x32 7 00000000 00000000 000000ff 00000000 01000000 00000000 00000000 00000000 907e763c c6b83a25 ef89a90f 74fdb694
+ars4x32 7 00000000 00000000 00000080 00000000 01000000 00000000 00000000 00000000 fba4b3a6 477cc9c2 bcce80ce b6f101b0
+ars4x32 7 00000000 00000000 0000ff00 00000000 01000000 00000000 00000000 00000000 710adbb1 3b7b935a bfa43ed9 af53d3ee
+ars4x32 7 00000000 00000000 00008000 00000000 01000000 00000000 00000000 00000000 993981f3 10a0761d 18b966d6 db95020b
+ars4x32 7 00000000 00000000 00ff0000 00000000 01000000 00000000 00000000 00000000 23277b85 4775d2a1 389e8a20 6d6e9a32
+ars4x32 7 00000000 00000000 00800000 00000000 01000000 00000000 00000000 00000000 83b8cda3 dddafdcd b241246d f8ef5001
+ars4x32 7 00000000 00000000 ff000000 00000000 01000000 00000000 00000000 00000000 ca3d1252 eb2f2305 882985a7 06dd099b
+ars4x32 7 00000000 00000000 80000000 00000000 01000000 00000000 00000000 00000000 af730151 3ebf4c13 ddb6ac40 a6b9f508
+ars4x32 7 00000000 00000000 00000000 000000ff 01000000 00000000 00000000 00000000 2606cdef e2398e47 1eefffab b8443df5
+ars4x32 7 00000000 00000000 00000000 00000080 01000000 00000000 00000000 00000000 8108c137 2f79064f 9184f6dd 1984b4d2
+ars4x32 7 00000000 00000000 00000000 0000ff00 01000000 00000000 00000000 00000000 dac3d4d8 85e7cf04 22b2b6c0 ca9cdbaa
+ars4x32 7 00000000 00000000 00000000 00008000 01000000 00000000 00000000 00000000 d91f06c5 79dbe78b a6ee5140 f5e3e1d4
+ars4x32 7 00000000 00000000 00000000 00ff0000 01000000 00000000 00000000 00000000 e49c12eb 805810c6 4389010c 438dd318
+ars4x32 7 00000000 00000000 00000000 00800000 01000000 00000000 00000000 00000000 2baf979c 0b234238 7a91dcee 8f2195fe
+ars4x32 7 00000000 00000000 00000000 ff000000 01000000 00000000 00000000 00000000 8c367e4e 9384e1e8 d2d54f83 e24bd666
+ars4x32 7 00000000 00000000 00000000 80000000 01000000 00000000 00000000 00000000 05ec5aed 7b80c18f 6e02ec00 af7d8461
+ars4x32 7 886a3f24 d308a385 2e8a1913 44737003 01000000 00000000 00000000 00000000 6b62230f a3c81ef5 378ab653 23af48f3
+ars4x32 7 223809a4 d0319f29 98fa2e08 896c4eec 01000000 00000000 00000000 00000000 9f28e482 ef3ad602 a7f68742 17bdf9dd
+ars4x32 7 e6212845 7713d038 cf6654be 6c0ce934 01000000 00000000 00000000 00000000 9bcee3c9 47d31087 b3d5d208 281dd93a
+ars4x32 7 00000001 00000000 00000000 00000000 00000000 00000001 00000000 00000000 b98fa0e7 cdd825ac c4a2942b 188df12b
+ars4x32 7 00000100 00000000 00000000 00000000 00000000 00000001 00000000 00000000 e56a671d fa738e98 71ee4418 0900944f
+ars4x32 7 00010000 00000000 00000000 00000000 00000000 00000001 00000000 00000000 582501fc e56c7921 d38ed338 c37e5a4e
+ars4x32 7 01000000 00000000 00000000 00000000 00000000 00000001 00000000 00000000 e4e7782f 675942c8 917bcde1 c3739f28
+ars4x32 7 00000000 00000001 00000000 00000000 00000000 00000001 00000000 00000000 45a75118 f1c9f98e e1cbd902 ffa4f796
+ars4x32 7 00000000 00000100 00000000 00000000 00000000 00000001 00000000 00000000 8e63d1dc ddc2763e eac3cd9d 8b624caf
+ars4x32 7 00000000 00010000 00000000 00000000 00000000 00000001 00000000 00000000 31190524 b3ff427a 2418a4ce aadbcaba
+ars4x32 7 00000000 01000000 00000000 00000000 00000000 00000001 00000000 00000000 0dde1a7a a994604a e66d1ccf ebd37d29
+ars4x32 7 00000000 00000000 00000001 00000000 00000000 00000001 00000000 00000000 12847b3e 6b2b9d08 38d1e36d cb4e5d1c
+ars4x32 7 00000000 00000000 00000100 00000000 00000000 00000001 00000000 00000000 88e7ac98 eb941086 f3556cb4 20964290
+ars4x32 7 00000000 00000000 00010000 00000000 00000000 00000001 00000000 00000000 8febb1a4 bdd9c500 fc798878 1699918b
+ars4x32 7 00000000 00000000 01000000 00000000 00000000 00000001 00000000 00000000 8c6b4bce 3acc1384 5eb2f546 a70d2ab0
+ars4x32 7 00000000 00000000 00000000 00000001 00000000 00000001 00000000 00000000 3e6cf754 72ff7900 42b1882e a259b63d
+ars4x32 7 00000000 00000000 00000000 00000100 00000000 00000001 00000000 00000000 05118b88 d902ce95 87b141fa a95529d9
+ars4x32 7 00000000 00000000 00000000 00010000 00000000 00000001 00000000 00000000 4ffee2f7 2ff88f16 e4fa93e0 2ba2e908
+ars4x32 7 00000000 00000000 00000000 01000000 00000000 00000001 00000000 00000000 0d00fbab 394bd1ab 8372d815 57ce07bd
+ars4x32 7 0000ff00 00000000 00000000 00000000 00000000 00000001 00000000 00000000 c91da1c3 a89eba39 83c66a3e 7f9ccf3d
+ars4x32 7 00008000 00000000 00000000 00000000 00000000 00000001 00000000 00000000 a9aab7d2 48ab0c11 94120bf6 661ed874
+ars4x32 7 00ff0000 00000000 00000000 00000000 00000000 00000001 00000000 00000000 90f76c90 a75c8676 d5932a66 29b2ed5d
+ars4x32 7 00800000 00000000 00000000 00000000 00000000 00000001 00000000 00000000 6e287bb4 8fcb509d 3282420a b2f0acce
+ars4x32 7 ff000000 00000000 00000000 00000000 00000000 00000001 00000000 00000000 7577b019 481c0dd9 45771637 e47d6c74
+ars4x32 7 80000000 00000000 00000000 00000000 00000000 00000001 00000000 00000000 1caa9a2a 3fd49fee 28a8592f f820b17e
+ars4x32 7 00000000 000000ff 00000000 00000000 00000000 00000001 00000000 00000000 bd9d4712 a1bab707 a658a416 fc2cad21
+ars4x32 7 00000000 00000080 00000000 00000000 00000000 00000001 00000000 00000000 5db5aef3 4aacb477 e00321e3 03f2f164
+ars4x32 7 00000000 0000ff00 00000000 00000000 00000000 00000001 00000000 00000000 86c63b0c 1ae77829 f54fc72b 3e65483e
+ars4x32 7 00000000 00008000 00000000 00000000 00000000 00000001 00000000 00000000 b8e6a3aa 3870f807 67e6d3c0 3c786c41
+ars4x32 7 00000000 00ff0000 00000000 00000000 00000000 00000001 00000000 00000000 60723484 3f6acad0 f3150d04 6fe1cef2
+ars4x32 7 00000000 00800000 00000000 00000000 00000000 00000001 00000000 00000000 d0875b42 d178529d b07f05ed 1936bc05
+ars4x32 7 00000000 ff000000 00000000 00000000 00000000 00000001 00000000 00000000 58eac67a 702ce62d b491a9e8 ca546c89
+ars4x32 7 00000000 80000000 00000000 00000000 00000000 00000001 00000000 00000000 a9b8f470 afef5bd3 578b37cf bf2cdc2e
+ars4x32 7 00000000 00000000 000000ff 00000000 00000000 00000001 00000000 00000000 aa38025f e885466b a026d001 3f0376e3
+ars4x32 7 00000000 00000000 00000080 00000000 00000000 00000001 00000000 00000000 540dff9b 94870d7f 6035a801 1d2461d5
+ars4x32 7 00000000 00000000 0000ff00 00000000 00000000 00000001 00000000 00000000 d54a4299 03db719c 03867340 2b8ce970
+ars4x32 7 00000000 00000000 00008000 00000000 00000000 00000001 00000000 00000000 0cf0355e d424d952 85ce5c9b 89ea9557
+ars4x32 7 00000000 00000000 00ff0000 00000000 00000000 00000001 00000000 00000000 fc648dc4 0a8e70d9 37f5dfea faaaf6d4
+ars4x32 7 00000000 00000000 00800000 00000000 00000000 00000001 00000000 00000000 a89ba05f 64d4f5c6 446076c2 c68f0fee
+ars4x32 7 00000000 00000000 ff000000 00000000 00000000 00000001 00000000 00000000 32ebf3c8 b3b5a1c7 422d6927 6e5c3871
+ars4x32 7 00000000 00000000 80000000 00000000 00000000 00000001 00000000 00000000 3d6730bb d4af0df0 7af81d69 87ae990c
+ars4x32 7 00000000 00000000 00000000 000000ff 00000000 00000001 00000000 00000000 102e26cc d8ad45ce d4ddaed3 26f5d03a
+ars4x32 7 00000000 00000000 00000000 00000080 00000000 00000001 00000000 00000000 6ae99574 408d6c8e 5198ef8a 251ce0c0
+ars4x32 7 00000000 00000000 00000000 0000ff00 00000000 00000001 00000000 00000000 9865f8d1 0f1a33c4 16a6f032 4501cb27
+ars4x32 7 00000000 00000000 00000000 00008000 00000000 00000001 00000000 00000000 50c5fd20 0f842254 2573669a 1118408a
+ars4x32 7 00000000 00000000 00000000 00ff0000 00000000 00000001 00000000 00000000 9c85b493 34006dfb f29cb2d2 fe3eeb55
+ars4x32 7 00000000 00000000 00000000 00800000 00000000 00000001 00000000 00000000 31f2f820 a237d610 e79519f0 a3e6773d
+ars4x32 7 00000000 00000000 00000000 ff000000 00000000 00000001 00000000 00000000 9a42597e bc616f75 11873515 0d95b6bf
+ars4x32 7 00000000 00000000 00000000 80000000 00000000 00000001 00000000 00000000 149e81a7 13397722 e15ef1c9 085060f1
+ars4x32 7 886a3f24 d308a385 2e8a1913 44737003 00000000 00000001 00000000 00000000 ec49a376 fc9c0e9f 1dc34445 963c9380
+ars4x32 7 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000001 00000000 00000000 2a100713 0631ced0 42f20c78 d81af2e7
+ars4x32 7 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000001 00000000 00000000 706b9c5e 50067d76 d9d4d6fa 4d44ac9c
+ars4x32 7 00000001 00000000 00000000 00000000 00000000 00000100 00000000 00000000 dfda1d3a 072f4efa a128a5d5 a6fe1d04
+ars4x32 7 00000100 00000000 00000000 00000000 00000000 00000100 00000000 00000000 aefe63cd a94f6047 ef47ae8a 5c6d0fc7
+ars4x32 7 00010000 00000000 00000000 00000000 00000000 00000100 00000000 00000000 a263fbbb 95aa495c a5937e9e 544bfb02
+ars4x32 7 01000000 00000000 00000000 00000000 00000000 00000100 00000000 00000000 4b5755b9 2ca59014 9403b7ff 5c00c781
+ars4x32 7 00000000 00000001 00000000 00000000 00000000 00000100 00000000 00000000 62acbd8b ec95ebd4 35e31abf b290cc33
+ars4x32 7 00000000 00000100 00000000 00000000 00000000 00000100 00000000 00000000 134748e1 b6befa9f 7232fa06 d4764e33
+ars4x32 7 00000000 00010000 00000000 00000000 00000000 00000100 00000000 00000000 6190f931 ee7ee9d3 6ed0f4d1 16c9b244
+ars4x32 7 00000000 01000000 00000000 00000000 00000000 00000100 00000000 00000000 c7f11a27 94dba789 e9dbcbc5 14a9abc6
+ars4x32 7 00000000 00000000 00000001 00000000 00000000 00000100 00000000 00000000 153d00f7 f2129258 20aa50f2 ed9aebae
+ars4x32 7 00000000 00000000 00000100 00000000 00000000 00000100 00000000 00000000 9f7cebbc 2ec7b89e 66001c4c 83cdbb20
+ars4x32 7 00000000 00000000 00010000 00000000 00000000 00000100 00000000 00000000 65155935 919e4c9e 5f34f008 b51f7415
+ars4x32 7 00000000 00000000 01000000 00000000 00000000 00000100 00000000 00000000 be69da4b 58cb9d5e 19d12824 d82c1b08
+ars4x32 7 00000000 00000000 00000000 00000001 00000000 00000100 00000000 00000000 ac76a8a7 fff592ae 7b84a113 daad3a5b
+ars4x32 7 00000000 00000000 00000000 00000100 00000000 00000100 00000000 00000000 b278eb5b 63a440b9 623099ad b87237c8
+ars4x32 7 00000000 00000000 00000000 00010000 00000000 00000100 00000000 00000000 8ab1b9ef 8a631fc5 2dce6925 acaa5c9d
+ars4x32 7 00000000 00000000 00000000 01000000 00000000 00000100 00000000 00000000 2433ea25 2017b332 91aa1b2a 0e49b4a3
+ars4x32 7 0000ff00 00000000 00000000 00000000 00000000 00000100 00000000 00000000 86fd3cb3 f56664c6 e7140277 cf6a9098
+ars4x32 7 00008000 00000000 00000000 00000000 00000000 00000100 00000000 00000000 52efaf03 3b031fa5 eec1ec93 4a377c34
+ars4x32 7 00ff0000 00000000 00000000 00000000 00000000 00000100 00000000 00000000 7fead7cb 22746d85 d921eb48 e7a70ecd
+ars4x32 7 00800000 00000000 00000000 00000000 00000000 00000100 00000000 00000000 3281b39d 696b18bd 8eda997d d5bb089c
+ars4x32 7 ff000000 00000000 00000000 00000000 00000000 00000100 00000000 00000000 adab5d35 ad91fa0d 7acfa6fd 9892d997
+ars4x32 7 80000000 00000000 00000000 00000000 00000000 00000100 00000000 00000000 85ade5e0 2c042865 15890a20 f7c24d33
+ars4x32 7 00000000 000000ff 00000000 00000000 00000000 00000100 00000000 00000000 119163c9 a07d67cd 20f06789 a281ee4d
+ars4x32 7 00000000 00000080 00000000 00000000 00000000 00000100 00000000 00000000 2fb03510 5ed5dca3 b719eb6f 574605c9
+ars4x32 7 00000000 0000ff00 00000000 00000000 00000000 00000100 00000000 00000000 f4f7d2ef 7a524610 a185f709 f21fefd6
+ars4x32 7 00000000 00008000 00000000 00000000 00000000 00000100 00000000 00000000 c5e7439c 2804792a 1235964f 8539a3c7
+ars4x32 7 00000000 00ff0000 00000000 00000000 00000000 00000100 00000000 00000000 5f369f8f 7d9d5302 4f494420 827ed4f2
+ars4x32 7 00000000 00800000 00000000 00000000 00000000 00000100 00000000 00000000 0775ffd7 3b1dea1e b02efaca b4f9719a
+ars4x32 7 00000000 ff000000 00000000 00000000 00000000 00000100 00000000 00000000 426cd4b8 3a1fc698 c19c4020 723a2986
+ars4x32 7 00000000 80000000 00000000 00000000 00000000 00000100 00000000 00000000 ed151868 428ac2da 5531458b 00d2447c
+ars4x32 7 00000000 00000000 000000ff 00000000 00000000 00000100 00000000 00000000 fcb4f454 b536ddfa 3a52e482 71f6646e
+ars4x32 7 00000000 00000000 00000080 00000000 00000000 00000100 00000000 00000000 3997e8de 9b8e8867 6293329b 06827994
+ars4x32 7 00000000 00000000 0000ff00 00000000 00000000 00000100 00000000 00000000 f4991404 73e5e16e f5b17c26 9924f7a2
+ars4x32 7 00000000 00000000 00008000 00000000 00000000 00000100 00000000 00000000 3066aea9 c3fd8937 7994b392 4b2269ac
+ars4x32 7 00000000 00000000 00ff0000 00000000 00000000 00000100 00000000 00000000 c06e303d 65230c26 fcc999c3 928bbecd
+ars4x32 7 00000000 00000000 00800000 00000000 00000000 00000100 00000000 00000000 949c3f78 95a9a17b 353c533c 32f8838a
+ars4x32 7 00000000 00000000 ff000000 00000000 00000000 00000100 00000000 00000000 a037a04d a5d5ef5f 134dce23 1cce86ea
+ars4x32 7 00000000 00000000 80000000 00000000 00000000 00000100 00000000 00000000 73bcea41 a66fe5a3 e92911a5 d81c85f1
+ars4x32 7 00000000 00000000 00000000 000000ff 00000000 00000100 00000000 00000000 13a8abdc 5c45c562 2850859a 38851cc5
+ars4x32 7 00000000 00000000 00000000 00000080 00000000 00000100 00000000 00000000 1cf530b3 c20a3ef5 1dd72902 d8f71715
+ars4x32 7 00000000 00000000 00000000 0000ff00 00000000 00000100 00000000 00000000 20c4d1e9 6aaea5f9 d31be549 32a09e8e
+ars4x32 7 00000000 00000000 00000000 00008000 00000000 00000100 00000000 00000000 642cc569 29ad57a4 9e7e4347 6ad323fd
+ars4x32 7 00000000 00000000 00000000 00ff0000 00000000 00000100 00000000 00000000 cccb582c a8794b89 9e9ee7b4 f64b2875
+ars4x32 7 00000000 00000000 00000000 00800000 00000000 00000100 00000000 00000000 75c085fb 289d50f1 78cb52d7 a5492eac
+ars4x32 7 00000000 00000000 00000000 ff000000 00000000 00000100 00000000 00000000 dc83b67b 6ae5216e 0945dd86 bfe74a90
+ars4x32 7 00000000 00000000 00000000 80000000 00000000 00000100 00000000 00000000 d9b3797d 07d9cede b0d73dd4 a9ab3ba1
+ars4x32 7 886a3f24 d308a385 2e8a1913 44737003 00000000 00000100 00000000 00000000 dd0b9690 1f87f73e b52e0554 f3a8866f
+ars4x32 7 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000100 00000000 00000000 445a7ccb 1d2bd419 6cb33baa 8de67355
+ars4x32 7 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000100 00000000 00000000 8186605a 2a648389 7fa392d4 a0282353
+ars4x32 7 00000001 00000000 00000000 00000000 00000000 00010000 00000000 00000000 cc555e0c 96812f76 c34b8b18 0ab1336f
+ars4x32 7 00000100 00000000 00000000 00000000 00000000 00010000 00000000 00000000 d8e396e2 593932fb c6e40d9f 7422c554
+ars4x32 7 00010000 00000000 00000000 00000000 00000000 00010000 00000000 00000000 c3121431 cb1af462 1c6d3dc8 06806508
+ars4x32 7 01000000 00000000 00000000 00000000 00000000 00010000 00000000 00000000 74a52f42 ab71d0a5 2d9ec16f 6a309675
+ars4x32 7 00000000 00000001 00000000 00000000 00000000 00010000 00000000 00000000 f8e52867 c5154ebe 3e2412d2 1fd6eb47
+ars4x32 7 00000000 00000100 00000000 00000000 00000000 00010000 00000000 00000000 b6d97bb1 6633b0c4 f5b83d5f ef5b7701
+ars4x32 7 00000000 00010000 00000000 00000000 00000000 00010000 00000000 00000000 21987c11 f47b221c 1bd108f9 4a89ea4c
+ars4x32 7 00000000 01000000 00000000 00000000 00000000 00010000 00000000 00000000 fd5b97cd cddf1906 abe0b7a9 32b6f137
+ars4x32 7 00000000 00000000 00000001 00000000 00000000 00010000 00000000 00000000 4651379b c51b8684 b8661b5c eee9c303
+ars4x32 7 00000000 00000000 00000100 00000000 00000000 00010000 00000000 00000000 dbe78ab2 23c7dd58 5f85f73b 37ffe920
+ars4x32 7 00000000 00000000 00010000 00000000 00000000 00010000 00000000 00000000 78afdc44 98924fa1 cb7ee502 198cf8be
+ars4x32 7 00000000 00000000 01000000 00000000 00000000 00010000 00000000 00000000 bb80d75c a4f61d05 371b83b0 f8b925c1
+ars4x32 7 00000000 00000000 00000000 00000001 00000000 00010000 00000000 00000000 8ab4b97a e856ed18 6691e448 e9c947b1
+ars4x32 7 00000000 00000000 00000000 00000100 00000000 00010000 00000000 00000000 8c0ce175 1f94b2a8 64368529 f8c997d9
+ars4x32 7 00000000 00000000 00000000 00010000 00000000 00010000 00000000 00000000 a581635b dcadee87 37d80a10 42e2d6ea
+ars4x32 7 00000000 00000000 00000000 01000000 00000000 00010000 00000000 00000000 f6073156 f3c915f5 872d7248 7428bd38
+ars4x32 7 0000ff00 00000000 00000000 00000000 00000000 00010000 00000000 00000000 5c1adf3b 31a5847f 38f35004 ab0c0e56
+ars4x32 7 00008000 00000000 00000000 00000000 00000000 00010000 00000000 00000000 fd51e724 1b511634 abfc1f02 e08d5826
+ars4x32 7 00ff0000 00000000 00000000 00000000 00000000 00010000 00000000 00000000 221d06a9 b5a1fa43 c87832af 07c56795
+ars4x32 7 00800000 00000000 00000000 00000000 00000000 00010000 00000000 00000000 0d7aa123 b5f4f0e1 10b92a35 4c568a8e
+ars4x32 7 ff000000 00000000 00000000 00000000 00000000 00010000 00000000 00000000 dc53383e 738f609d 6bda6aab 5b9015b3
+ars4x32 7 80000000 00000000 00000000 00000000 00000000 00010000 00000000 00000000 1b01b36b 16dc731f 38af0f58 14549502
+ars4x32 7 00000000 000000ff 00000000 00000000 00000000 00010000 00000000 00000000 aec3f7e9 4513e562 bd0a53a9 a7c19937
+ars4x32 7 00000000 00000080 00000000 00000000 00000000 00010000 00000000 00000000 dce01ffb be0890c6 9acbaeda d40fe96e
+ars4x32 7 00000000 0000ff00 00000000 00000000 00000000 00010000 00000000 00000000 4eceae96 81ed9647 555e7dba 1100b881
+ars4x32 7 00000000 00008000 00000000 00000000 00000000 00010000 00000000 00000000 c75f6525 f06dd94d 7f24c2bc 51c982e0
+ars4x32 7 00000000 00ff0000 00000000 00000000 00000000 00010000 00000000 00000000 b0729ec8 3c6027b6 d1539c93 035cc3e9
+ars4x32 7 00000000 00800000 00000000 00000000 00000000 00010000 00000000 00000000 eaca848d 069cb07a 96bd3060 6d2752e4
+ars4x32 7 00000000 ff000000 00000000 00000000 00000000 00010000 00000000 00000000 7450b9f7 871a1d9a 211b42e5 02d9e3ce
+ars4x32 7 00000000 80000000 00000000 00000000 00000000 00010000 00000000 00000000 a0300cb3 f04fbefe fe6d6fd2 7b1e58b7
+ars4x32 7 00000000 00000000 000000ff 00000000 00000000 00010000 00000000 00000000 360d9abf 3fb3c8bc d919221d 10f57a6a
+ars4x32 7 00000000 00000000 00000080 00000000 00000000 00010000 00000000 00000000 f63c4618 ece252f4 2662a407 84841340
+ars4x32 7 00000000 00000000 0000ff00 00000000 00000000 00010000 00000000 00000000 3e14c92b 4f431782 653d0255 5e48097e
+ars4x32 7 00000000 00000000 00008000 00000000 00000000 00010000 00000000 00000000 eb618ea6 d0e27776 6bd5ec9d 72491aab
+ars4x32 7 00000000 00000000 00ff0000 00000000 00000000 00010000 00000000 00000000 7b42d9a7 073a55fe 5cef8388 5d240e4e
+ars4x32 7 00000000 00000000 00800000 00000000 00000000 00010000 00000000 00000000 39d1c065 85c0acc7 f0101005 93ec0ee2
+ars4x32 7 00000000 00000000 ff000000 00000000 00000000 00010000 00000000 00000000 460bd111 4a7e1dcf e6c05f70 62fde911
+ars4x32 7 00000000 00000000 80000000 00000000 00000000 00010000 00000000 00000000 5758809e ab8bd50d b1542f44 0b7a51b0
+ars4x32 7 00000000 00000000 00000000 000000ff 00000000 00010000 00000000 00000000 2398b55f 28407e67 60f625c8 ab267016
+ars4x32 7 00000000 00000000 00000000 00000080 00000000 00010000 00000000 00000000 910b861a 9ae4f63b 69c20a02 2d60c3f7
+ars4x32 7 00000000 00000000 00000000 0000ff00 00000000 00010000 00000000 00000000 3fcb21a7 16951149 990475c1 99025226
+ars4x32 7 00000000 00000000 00000000 00008000 00000000 00010000 00000000 00000000 d7e919f3 73db70ec 003a8e3b 4c2b67eb
+ars4x32 7 00000000 00000000 00000000 00ff0000 00000000 00010000 00000000 00000000 991f3917 b56c3247 1a5d48ad 01bcbfae
+ars4x32 7 00000000 00000000 00000000 00800000 00000000 00010000 00000000 00000000 613efef9 09710d43 50d71c7c 06c2355d
+ars4x32 7 00000000 00000000 00000000 ff000000 00000000 00010000 00000000 00000000 4313ed8e bd141078 c12d3c6e efa80cf0
+ars4x32 7 00000000 00000000 00000000 80000000 00000000 00010000 00000000 00000000 656a64b2 c9e2588a 6a740d6b f6771cfe
+ars4x32 7 886a3f24 d308a385 2e8a1913 44737003 00000000 00010000 00000000 00000000 01329c6b b18c5d96 17088447 58573d6b
+ars4x32 7 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00010000 00000000 00000000 475e7f2c df5f29d5 71c921aa e71bf175
+ars4x32 7 e6212845 7713d038 cf6654be 6c0ce934 00000000 00010000 00000000 00000000 75311c7e 008c90a3 cd72458f 6eb71f5e
+ars4x32 7 00000001 00000000 00000000 00000000 00000000 01000000 00000000 00000000 f1d28f60 cadf4685 f5a23c51 d908aa34
+ars4x32 7 00000100 00000000 00000000 00000000 00000000 01000000 00000000 00000000 01c8c951 22a359fb 3ff357d4 f2efe9fc
+ars4x32 7 00010000 00000000 00000000 00000000 00000000 01000000 00000000 00000000 cbfb74e9 d32346b5 74a9d8e7 78ad3148
+ars4x32 7 01000000 00000000 00000000 00000000 00000000 01000000 00000000 00000000 9ad5ccf9 1e86645e 060e4b44 806d350e
+ars4x32 7 00000000 00000001 00000000 00000000 00000000 01000000 00000000 00000000 af5c32bc 2f4c1d79 42ea3ba8 7f64cf82
+ars4x32 7 00000000 00000100 00000000 00000000 00000000 01000000 00000000 00000000 b5de7ef6 3b368ca4 797907bb 0e290d60
+ars4x32 7 00000000 00010000 00000000 00000000 00000000 01000000 00000000 00000000 63ff88f8 f2fcda03 ed9521eb 0da73a6f
+ars4x32 7 00000000 01000000 00000000 00000000 00000000 01000000 00000000 00000000 af2004e3 6b8c03c1 ce200f44 15272428
+ars4x32 7 00000000 00000000 00000001 00000000 00000000 01000000 00000000 00000000 f76605b2 f5b358bb 7e29f4de 48e9b229
+ars4x32 7 00000000 00000000 00000100 00000000 00000000 01000000 00000000 00000000 ec4a3974 a873f7aa 58833321 6efcbe17
+ars4x32 7 00000000 00000000 00010000 00000000 00000000 01000000 00000000 00000000 56cdee6f 690fabf1 e9d1f12e 477dad74
+ars4x32 7 00000000 00000000 01000000 00000000 00000000 01000000 00000000 00000000 3d45f975 4219eaaa ed5bd00f 4ee3eeda
+ars4x32 7 00000000 00000000 00000000 00000001 00000000 01000000 00000000 00000000 4ce13170 ccdef41e 82346a8c e6b3d412
+ars4x32 7 00000000 00000000 00000000 00000100 00000000 01000000 00000000 00000000 469c7844 ee82a394 a7a3b23c 8cc4db81
+ars4x32 7 00000000 00000000 00000000 00010000 00000000 01000000 00000000 00000000 0ca9b5fe a5673d62 7c83e3f0 95143ac0
+ars4x32 7 00000000 00000000 00000000 01000000 00000000 01000000 00000000 00000000 efcf3d1a df15cb85 41679ec2 473c724a
+ars4x32 7 0000ff00 00000000 00000000 00000000 00000000 01000000 00000000 00000000 5257892e 0c645c39 ffd595d6 fa3d694e
+ars4x32 7 00008000 00000000 00000000 00000000 00000000 01000000 00000000 00000000 68d8f64a 066631ec f3a9997a a1350d5b
+ars4x32 7 00ff0000 00000000 00000000 00000000 00000000 01000000 00000000 00000000 ca14c369 47ce2364 9cb2196d af6c47ad
+ars4x32 7 00800000 00000000 00000000 00000000 00000000 01000000 00000000 00000000 849eb7ff c5950be4 f1a61f9e 6001f279
+ars4x32 7 ff000000 00000000 00000000 00000000 00000000 01000000 00000000 00000000 cdda7689 01a0fc17 1c8cb79e 663104e6
+ars4x32 7 80000000 00000000 00000000 00000000 00000000 01000000 00000000 00000000 fdc8b354 3974bfb8 9805f0b9 687134ea
+ars4x32 7 00000000 000000ff 00000000 00000000 00000000 01000000 00000000 00000000 80ee7029 e70ddbd3 5910cc44 5f4afd16
+ars4x32 7 00000000 00000080 00000000 00000000 00000000 01000000 00000000 00000000 2af567a0 2d2f3cbf 1aa86411 0f64b041
+ars4x32 7 00000000 0000ff00 00000000 00000000 00000000 01000000 00000000 00000000 1d511c03 26f8fd53 e46cb9ba 770aab45
+ars4x32 7 00000000 00008000 00000000 00000000 00000000 01000000 00000000 00000000 80dc0d67 f54a2826 cbdbd04e 74b4fbc8
+ars4x32 7 00000000 00ff0000 00000000 00000000 00000000 01000000 00000000 00000000 ef3c100a 92fc4374 40b313d2 125f29b5
+ars4x32 7 00000000 00800000 00000000 00000000 00000000 01000000 00000000 00000000 e2488dc6 f410be92 0e5dea44 c0694d36
+ars4x32 7 00000000 ff000000 00000000 00000000 00000000 01000000 00000000 00000000 0a4085bf 797eeeee 6b7a0006 e538592d
+ars4x32 7 00000000 80000000 00000000 00000000 00000000 01000000 00000000 00000000 d63c4b1b d52295d2 87f5a196 d1542c1b
+ars4x32 7 00000000 00000000 000000ff 00000000 00000000 01000000 00000000 00000000 4565e62b 2b06ae38 e41196d8 f9a249b7
+ars4x32 7 00000000 00000000 00000080 00000000 00000000 01000000 00000000 00000000 b4f09a88 759568be ce1dfb0c 948834ad
+ars4x32 7 00000000 00000000 0000ff00 00000000 00000000 01000000 00000000 00000000 da4eb391 01bc628b 38c604a2 07535efe
+ars4x32 7 00000000 00000000 00008000 00000000 00000000 01000000 00000000 00000000 3c4f71c5 54059a07 0d1f9a16 4b1af865
+ars4x32 7 00000000 00000000 00ff0000 00000000 00000000 01000000 00000000 00000000 3fefd40d c260b532 63363e58 6f98c813
+ars4x32 7 00000000 00000000 00800000 00000000 00000000 01000000 00000000 00000000 7d02082c 5f09d506 18c4f684 352ef5e3
+ars4x32 7 00000000 00000000 ff000000 00000000 00000000 01000000 00000000 00000000 bf1187a0 46a976bc bc71e679 4e0e5623
+ars4x32 7 00000000 00000000 80000000 00000000 00000000 01000000 00000000 00000000 ed83edea b6645e3a 16acb791 7d43064f
+ars4x32 7 00000000 00000000 00000000 000000ff 00000000 01000000 00000000 00000000 91556a10 1b40759c 95cdff41 52cb618a
+ars4x32 7 00000000 00000000 00000000 00000080 00000000 01000000 00000000 00000000 fb7e7161 4ab7039f 519333e1 78d7a241
+ars4x32 7 00000000 00000000 00000000 0000ff00 00000000 01000000 00000000 00000000 a2590d06 f8338a72 4705fdd9 9f8db47d
+ars4x32 7 00000000 00000000 00000000 00008000 00000000 01000000 00000000 00000000 c5146907 aba557c4 7ba1b22f 46cb38e0
+ars4x32 7 00000000 00000000 00000000 00ff0000 00000000 01000000 00000000 00000000 510cda71 b0b2f5d7 26ed41b7 014a51fd
+ars4x32 7 00000000 00000000 00000000 00800000 00000000 01000000 00000000 00000000 4a73adf2 4ba83e52 c3ea9859 72be18f3
+ars4x32 7 00000000 00000000 00000000 ff000000 00000000 01000000 00000000 00000000 b9d90390 981871a2 0f7145e8 7a00fa57
+ars4x32 7 00000000 00000000 00000000 80000000 00000000 01000000 00000000 00000000 689c9cc9 293ab8ae 1dfca36b 7c8a9731
+ars4x32 7 886a3f24 d308a385 2e8a1913 44737003 00000000 01000000 00000000 00000000 59978e50 6d29cdb5 8d324ba0 a5dd3e4a
+ars4x32 7 223809a4 d0319f29 98fa2e08 896c4eec 00000000 01000000 00000000 00000000 3948cc5d b01d7d06 ee2cb5c4 a8a14e61
+ars4x32 7 e6212845 7713d038 cf6654be 6c0ce934 00000000 01000000 00000000 00000000 753c4e79 496e5769 8b50732c d23f56d9
+ars4x32 7 00000001 00000000 00000000 00000000 00000000 00000000 00000001 00000000 e55ec276 e473d61f c316132c 954894ea
+ars4x32 7 00000100 00000000 00000000 00000000 00000000 00000000 00000001 00000000 61e296a3 a424ccbd 575b5150 0aec2318
+ars4x32 7 00010000 00000000 00000000 00000000 00000000 00000000 00000001 00000000 5a6b6952 34618ed9 ad0f420a 50060389
+ars4x32 7 01000000 00000000 00000000 00000000 00000000 00000000 00000001 00000000 36e839df 742e6b89 45867c8a 969127fb
+ars4x32 7 00000000 00000001 00000000 00000000 00000000 00000000 00000001 00000000 7a0cad0e 9eacee2a 32bbe64e 799efd9d
+ars4x32 7 00000000 00000100 00000000 00000000 00000000 00000000 00000001 00000000 a06824a8 4fb555db 1241f0e7 304538c0
+ars4x32 7 00000000 00010000 00000000 00000000 00000000 00000000 00000001 00000000 5afd1311 eb272486 71660469 54fb1933
+ars4x32 7 00000000 01000000 00000000 00000000 00000000 00000000 00000001 00000000 934d980f 7d2a488a ce3cd73c 48dfe32b
+ars4x32 7 00000000 00000000 00000001 00000000 00000000 00000000 00000001 00000000 acbb0ca6 57d697a2 5fde660c 606d05e1
+ars4x32 7 00000000 00000000 00000100 00000000 00000000 00000000 00000001 00000000 d0c41463 5b22d41f e82375fd e05576e7
+ars4x32 7 00000000 00000000 00010000 00000000 00000000 00000000 00000001 00000000 d395d125 02665bf0 ba11994f c781ccab
+ars4x32 7 00000000 00000000 01000000 00000000 00000000 00000000 00000001 00000000 96880c59 01df06b8 07e62c46 7904e9e5
+ars4x32 7 00000000 00000000 00000000 00000001 00000000 00000000 00000001 00000000 c8a185e0 e0c7db14 36518c29 fc40bba8
+ars4x32 7 00000000 00000000 00000000 00000100 00000000 00000000 00000001 00000000 c788d4d7 db552421 962dc825 41cefbe8
+ars4x32 7 00000000 00000000 00000000 00010000 00000000 00000000 00000001 00000000 b656d6c7 abe0765e b3501422 cadb748e
+ars4x32 7 00000000 00000000 00000000 01000000 00000000 00000000 00000001 00000000 e34b1ea4 8d64c890 09afc44f b36a4508
+ars4x32 7 0000ff00 00000000 00000000 00000000 00000000 00000000 00000001 00000000 950434ab c13c78d1 46c50ea8 8a41ad52
+ars4x32 7 00008000 00000000 00000000 00000000 00000000 00000000 00000001 00000000 5818cc68 9c066862 d8668af1 14ebb966
+ars4x32 7 00ff0000 00000000 00000000 00000000 00000000 00000000 00000001 00000000 4dbfdf75 73fc433a 5864d4a2 a0e27186
+ars4x32 7 00800000 00000000 00000000 00000000 00000000 00000000 00000001 00000000 9f16f8fa 43943702 cc3f4e1a 581f9570
+ars4x32 7 ff000000 00000000 00000000 00000000 00000000 00000000 00000001 00000000 91f7c720 45712f56 ff004166 3252a1eb
+ars4x32 7 80000000 00000000 00000000 00000000 00000000 00000000 00000001 00000000 84915ec3 6992c44b 71942078 488fb76c
+ars4x32 7 00000000 000000ff 00000000 00000000 00000000 00000000 00000001 00000000 d561a9ed c75c6965 d21c4161 e7d06023
+ars4x32 7 00000000 00000080 00000000 00000000 00000000 00000000 00000001 00000000 3eb2ec86 ed6ec73d 7892f171 1522715b
+ars4x32 7 00000000 0000ff00 00000000 00000000 00000000 00000000 00000001 00000000 53892271 8674ab3b 93e6afca 841cbca2
+ars4x32 7 00000000 00008000 00000000 00000000 00000000 00000000 00000001 00000000 13541920 3a435e24 25f08417 bfade8dc
+ars4x32 7 00000000 00ff0000 00000000 00000000 00000000 00000000 00000001 00000000 d0a1e7a9 7a816e40 b66226ae 62e0a4ee
+ars4x32 7 00000000 00800000 00000000 00000000 00000000 00000000 00000001 00000000 8e3f42e2 2b014896 d86aa526 cd27fbeb
+ars4x32 7 00000000 ff000000 00000000 00000000 00000000 00000000 00000001 00000000 cafdabd9 6dcfa350 f7f8270a 9ae67ded
+ars4x32 7 00000000 80000000 00000000 00000000 00000000 00000000 00000001 00000000 3d0d8f49 51136f93 26192fc1 18520d2f
+ars4x32 7 00000000 00000000 000000ff 00000000 00000000 00000000 00000001 00000000 20b28b79 8a8b37f8 00b104ab 868b2d14
+ars4x32 7 00000000 00000000 00000080 00000000 00000000 00000000 00000001 00000000 31d98a86 9ccebecb 645a8b17 f0bb99eb
+ars4x32 7 00000000 00000000 0000ff00 00000000 00000000 00000000 00000001 00000000 68a48077 83b8ba14 05946de8 24566774
+ars4x32 7 00000000 00000000 00008000 00000000 00000000 00000000 00000001 00000000 d86678f9 354f95b4 eb7a401a ad61c2c6
+ars4x32 7 00000000 00000000 00ff0000 00000000 00000000 00000000 00000001 00000000 8f66d754 a08c81e6 c63c356c 3ba62f17
+ars4x32 7 00000000 00000000 00800000 00000000 00000000 00000000 00000001 00000000 c17d8282 720b8f46 db6e67b1 b4e955cd
+ars4x32 7 00000000 00000000 ff000000 00000000 00000000 00000000 00000001 00000000 9aff812c 45baa6b7 4b0c9c0f ff98f8b1
+ars4x32 7 00000000 00000000 80000000 00000000 00000000 00000000 00000001 00000000 b326c5ad 7a9aa757 00b31db0 601fcdca
+ars4x32 7 00000000 00000000 00000000 000000ff 00000000 00000000 00000001 00000000 91620765 6f729564 29a2f9f2 cfded75c
+ars4x32 7 00000000 00000000 00000000 00000080 00000000 00000000 00000001 00000000 c941d058 5cd997a1 5e9bf194 7b21d5fb
+ars4x32 7 00000000 00000000 00000000 0000ff00 00000000 00000000 00000001 00000000 10e2485a b4e5e1e9 cd4ba01c 2e49dde2
+ars4x32 7 00000000 00000000 00000000 00008000 00000000 00000000 00000001 00000000 1cdbca4c e5e98bc9 72f23ac1 cdb16c1b
+ars4x32 7 00000000 00000000 00000000 00ff0000 00000000 00000000 00000001 00000000 1fb363a1 474f5285 78035b43 d518402e
+ars4x32 7 00000000 00000000 00000000 00800000 00000000 00000000 00000001 00000000 307ba338 840c962b 34cba2bb 8d50d44e
+ars4x32 7 00000000 00000000 00000000 ff000000 00000000 00000000 00000001 00000000 53ca2c77 05f1ed32 94b6cd6f 4d397f26
+ars4x32 7 00000000 00000000 00000000 80000000 00000000 00000000 00000001 00000000 faf425b1 b86d358e d1a20e65 281bbbf8
+ars4x32 7 886a3f24 d308a385 2e8a1913 44737003 00000000 00000000 00000001 00000000 61f619d6 16c90f22 1fec0d94 6257e0be
+ars4x32 7 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000000 00000001 00000000 25142c67 9cfa1771 c5978a54 7400f567
+ars4x32 7 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000000 00000001 00000000 2ee984a7 638ced08 d33ef781 0247374b
+ars4x32 7 00000001 00000000 00000000 00000000 00000000 00000000 00000100 00000000 d1b71a4f 1684424d 9fd4c7dc 9bc4d871
+ars4x32 7 00000100 00000000 00000000 00000000 00000000 00000000 00000100 00000000 9fa9054b 71f78e23 c9b3d997 2ca4eedb
+ars4x32 7 00010000 00000000 00000000 00000000 00000000 00000000 00000100 00000000 3db7ed45 be438491 cd0d6566 ac45f324
+ars4x32 7 01000000 00000000 00000000 00000000 00000000 00000000 00000100 00000000 cc1a364b 3a1cbe65 abe2f8e9 f502c286
+ars4x32 7 00000000 00000001 00000000 00000000 00000000 00000000 00000100 00000000 8feeb62a d5061040 b534de85 3c027ed9
+ars4x32 7 00000000 00000100 00000000 00000000 00000000 00000000 00000100 00000000 9e2e2531 4c9f15d0 c445affc 60730252
+ars4x32 7 00000000 00010000 00000000 00000000 00000000 00000000 00000100 00000000 b7c5670e 138a4b8d 6e42fdd8 5b9daf1f
+ars4x32 7 00000000 01000000 00000000 00000000 00000000 00000000 00000100 00000000 dd1d56da 6eed44fd a7dc085e 152674ca
+ars4x32 7 00000000 00000000 00000001 00000000 00000000 00000000 00000100 00000000 5295cae2 66bb409c 75db79b7 58dd33f3
+ars4x32 7 00000000 00000000 00000100 00000000 00000000 00000000 00000100 00000000 ed9ce0e1 072c7948 03c30fb2 ac016e8b
+ars4x32 7 00000000 00000000 00010000 00000000 00000000 00000000 00000100 00000000 5e2ca009 ca4f2212 44f195a6 565be49a
+ars4x32 7 00000000 00000000 01000000 00000000 00000000 00000000 00000100 00000000 ceb2d3c0 be733e64 bc1f1860 c29c14ad
+ars4x32 7 00000000 00000000 00000000 00000001 00000000 00000000 00000100 00000000 824fa943 31b285c4 263d37ea 2f123fbb
+ars4x32 7 00000000 00000000 00000000 00000100 00000000 00000000 00000100 00000000 a816d1be 20fb3610 72e57473 56e874cd
+ars4x32 7 00000000 00000000 00000000 00010000 00000000 00000000 00000100 00000000 4350d13a 2617f33b d1609d1c 7843b983
+ars4x32 7 00000000 00000000 00000000 01000000 00000000 00000000 00000100 00000000 bf189652 e19db3da b9a9c751 fe69dabd
+ars4x32 7 0000ff00 00000000 00000000 00000000 00000000 00000000 00000100 00000000 aa25fcc5 aa1d1333 04449e1f 8233a5d1
+ars4x32 7 00008000 00000000 00000000 00000000 00000000 00000000 00000100 00000000 b3cd867f 2740b7cb 39cea5c5 c184d63b
+ars4x32 7 00ff0000 00000000 00000000 00000000 00000000 00000000 00000100 00000000 31a10a6f d86903e4 310fda33 90006449
+ars4x32 7 00800000 00000000 00000000 00000000 00000000 00000000 00000100 00000000 a0489810 69a99632 f30a3276 0ebabdb1
+ars4x32 7 ff000000 00000000 00000000 00000000 00000000 00000000 00000100 00000000 0987067b ac2d74b1 c8d0f7f8 651d1ca4
+ars4x32 7 80000000 00000000 00000000 00000000 00000000 00000000 00000100 00000000 a63b4182 ad284ec1 4436f8b9 b98134fd
+ars4x32 7 00000000 000000ff 00000000 00000000 00000000 00000000 00000100 00000000 23bcfa51 0870547e b46b24d5 a34737a6
+ars4x32 7 00000000 00000080 00000000 00000000 00000000 00000000 00000100 00000000 ee786787 118a55f0 43b9771a 20ff54a3
+ars4x32 7 00000000 0000ff00 00000000 00000000 00000000 00000000 00000100 00000000 75412ce0 52dee65c 77791fd6 60943f38
+ars4x32 7 00000000 00008000 00000000 00000000 00000000 00000000 00000100 00000000 8bbe8840 ed24b4df 125e9e9b 5ede5ceb
+ars4x32 7 00000000 00ff0000 00000000 00000000 00000000 00000000 00000100 00000000 956293f5 eb6577e5 aea6424d 050e3306
+ars4x32 7 00000000 00800000 00000000 00000000 00000000 00000000 00000100 00000000 256d2b89 d3f9ad2f 90b82362 018409fd
+ars4x32 7 00000000 ff000000 00000000 00000000 00000000 00000000 00000100 00000000 af745525 fb08c32e 1c134f69 54af5d5b
+ars4x32 7 00000000 80000000 00000000 00000000 00000000 00000000 00000100 00000000 4279efbd cdfc19a2 6b806fe3 c3cdf539
+ars4x32 7 00000000 00000000 000000ff 00000000 00000000 00000000 00000100 00000000 91b1a835 6e6fa9f9 9ad21955 f9881872
+ars4x32 7 00000000 00000000 00000080 00000000 00000000 00000000 00000100 00000000 d3da99a7 2b009b3b 04b727a1 1eaaa447
+ars4x32 7 00000000 00000000 0000ff00 00000000 00000000 00000000 00000100 00000000 33bd4a06 c8968739 e08dad00 45f8363b
+ars4x32 7 00000000 00000000 00008000 00000000 00000000 00000000 00000100 00000000 1c399450 72192248 9dbd2ddf be17d911
+ars4x32 7 00000000 00000000 00ff0000 00000000 00000000 00000000 00000100 00000000 4213e7e2 9eee3bff ca895491 00c7b193
+ars4x32 7 00000000 00000000 00800000 00000000 00000000 00000000 00000100 00000000 b955af87 2c272a9e a500d242 22611535
+ars4x32 7 00000000 00000000 ff000000 00000000 00000000 00000000 00000100 00000000 2e01ebb4 0dcf0ecc 758d642a a7597d3b
+ars4x32 7 00000000 00000000 80000000 00000000 00000000 00000000 00000100 00000000 3c587492 fc291e69 97a3dc0f a71448c5
+ars4x32 7 00000000 00000000 00000000 000000ff 00000000 00000000 00000100 00000000 1faf9fbe b3d940fc c93b02a2 cd4aa238
+ars4x32 7 00000000 00000000 00000000 00000080 00000000 00000000 00000100 00000000 ec9bcc5d 28a32054 4c7d0e4c 47cfc9b1
+ars4x32 7 00000000 00000000 00000000 0000ff00 00000000 00000000 00000100 00000000 e7fd6ed3 406c0111 96dbb609 4ad0168d
+ars4x32 7 00000000 00000000 00000000 00008000 00000000 00000000 00000100 00000000 e6d16efd ee3b3517 0b0af6f6 0fb44f85
+ars4x32 7 00000000 00000000 00000000 00ff0000 00000000 00000000 00000100 00000000 c6081d68 22ff5d78 f406fde2 1c8277de
+ars4x32 7 00000000 00000000 00000000 00800000 00000000 00000000 00000100 00000000 22ccb737 9e4a0d7d 6c6dd7cc 6f9fa8a9
+ars4x32 7 00000000 00000000 00000000 ff000000 00000000 00000000 00000100 00000000 5c4fc443 c4461e64 8d34b2b4 3948c1da
+ars4x32 7 00000000 00000000 00000000 80000000 00000000 00000000 00000100 00000000 fc085908 e4d876e5 e4af7700 6c218c12
+ars4x32 7 886a3f24 d308a385 2e8a1913 44737003 00000000 00000000 00000100 00000000 148d2070 dbe15c71 a8847c49 02efc241
+ars4x32 7 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000000 00000100 00000000 ea492649 be966d5e ae76cfce b1d4d505
+ars4x32 7 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000000 00000100 00000000 2b1e4db8 f7cfdc2d 14b0b987 8f31e992
+ars4x32 7 00000001 00000000 00000000 00000000 00000000 00000000 00010000 00000000 e59bf1d2 cab0f564 3104664f 2620d3a8
+ars4x32 7 00000100 00000000 00000000 00000000 00000000 00000000 00010000 00000000 e13533b7 b2562201 a8eaa55f a750df08
+ars4x32 7 00010000 00000000 00000000 00000000 00000000 00000000 00010000 00000000 6d9b77c1 b4c8d357 2680fa2b 3f24b6eb
+ars4x32 7 01000000 00000000 00000000 00000000 00000000 00000000 00010000 00000000 8b8c2007 29822d48 c5ef677d 1f89c3a7
+ars4x32 7 00000000 00000001 00000000 00000000 00000000 00000000 00010000 00000000 5d2fa112 e2c5d011 df9135ad 763f29cd
+ars4x32 7 00000000 00000100 00000000 00000000 00000000 00000000 00010000 00000000 7b396de9 cf3342ed 91371e20 e5836599
+ars4x32 7 00000000 00010000 00000000 00000000 00000000 00000000 00010000 00000000 18f90e00 e840907d b34d1745 2fa31445
+ars4x32 7 00000000 01000000 00000000 00000000 00000000 00000000 00010000 00000000 5b21ea12 9b81514d 3a44a5d1 1e429945
+ars4x32 7 00000000 00000000 00000001 00000000 00000000 00000000 00010000 00000000 db5924f6 43a09271 4bbd7526 47a0b9c8
+ars4x32 7 00000000 00000000 00000100 00000000 00000000 00000000 00010000 00000000 eeaf24d3 513eabbd 6e27d8de dfba806f
+ars4x32 7 00000000 00000000 00010000 00000000 00000000 00000000 00010000 00000000 60caf69a ce5c0585 ebaca6c9 51b5618f
+ars4x32 7 00000000 00000000 01000000 00000000 00000000 00000000 00010000 00000000 40e5c216 f39c46bb 42124cf5 d29e3a81
+ars4x32 7 00000000 00000000 00000000 00000001 00000000 00000000 00010000 00000000 f57c667d 46dbbbf1 221b419b 086bc672
+ars4x32 7 00000000 00000000 00000000 00000100 00000000 00000000 00010000 00000000 68babf11 f7755abc 1c03ca54 5d4876f6
+ars4x32 7 00000000 00000000 00000000 00010000 00000000 00000000 00010000 00000000 01e33c4c 337f84f1 accdd03a df95085e
+ars4x32 7 00000000 00000000 00000000 01000000 00000000 00000000 00010000 00000000 dcc0f93d 9d21dc4d bb1c0159 6151428f
+ars4x32 7 0000ff00 00000000 00000000 00000000 00000000 00000000 00010000 00000000 d1fed09e 84ec00dd a4f64c71 b958535e
+ars4x32 7 00008000 00000000 00000000 00000000 00000000 00000000 00010000 00000000 3e7982ea 8c9be213 a326f346 4e9711e3
+ars4x32 7 00ff0000 00000000 00000000 00000000 00000000 00000000 00010000 00000000 49e320a2 8526076a 01c83b75 89eca4cf
+ars4x32 7 00800000 00000000 00000000 00000000 00000000 00000000 00010000 00000000 13b6d420 5802874a e8c409d3 5400604b
+ars4x32 7 ff000000 00000000 00000000 00000000 00000000 00000000 00010000 00000000 866c2aae 210efb54 f1dd4928 15276ee1
+ars4x32 7 80000000 00000000 00000000 00000000 00000000 00000000 00010000 00000000 df8334cd 383c4a69 b4530250 7e70f0f0
+ars4x32 7 00000000 000000ff 00000000 00000000 00000000 00000000 00010000 00000000 39a0f8e2 faf0937a cab7a67b 14fa4909
+ars4x32 7 00000000 00000080 00000000 00000000 00000000 00000000 00010000 00000000 3452504e aa51562b 8ed6632a f532ff33
+ars4x32 7 00000000 0000ff00 00000000 00000000 00000000 00000000 00010000 00000000 198b3f09 69a2a1b7 244cb5c3 f5975969
+ars4x32 7 00000000 00008000 00000000 00000000 00000000 00000000 00010000 00000000 a5b028bf eb128cea fa673ddc 6dba3964
+ars4x32 7 00000000 00ff0000 00000000 00000000 00000000 00000000 00010000 00000000 62063941 455d80cb 0a50e480 c0cfc579
+ars4x32 7 00000000 00800000 00000000 00000000 00000000 00000000 00010000 00000000 c4c59ee9 c55bfd45 e9d9d1f8 aed1a219
+ars4x32 7 00000000 ff000000 00000000 00000000 00000000 00000000 00010000 00000000 bc39e53b f43472b1 f3e1a62e 20214463
+ars4x32 7 00000000 80000000 00000000 00000000 00000000 00000000 00010000 00000000 0b9fdddf e49b3226 9b609ebf 94e00cd1
+ars4x32 7 00000000 00000000 000000ff 00000000 00000000 00000000 00010000 00000000 6ef585e1 372feb69 4a300d7a 3b9d9371
+ars4x32 7 00000000 00000000 00000080 00000000 00000000 00000000 00010000 00000000 87cf8e6b 3e5e1e1f feb7c8e4 a2081049
+ars4x32 7 00000000 00000000 0000ff00 00000000 00000000 00000000 00010000 00000000 f9e429b6 69cc141b a7c881d3 e29b35ac
+ars4x32 7 00000000 00000000 00008000 00000000 00000000 00000000 00010000 00000000 d4a1f5c4 401e56b6 9b5490a8 2f833185
+ars4x32 7 00000000 00000000 00ff0000 00000000 00000000 00000000 00010000 00000000 99766356 8ff50157 b3821b37 ec4d7fe1
+ars4x32 7 00000000 00000000 00800000 00000000 00000000 00000000 00010000 00000000 d410c303 bdcc51fe 4fce8db1 c2300086
+ars4x32 7 00000000 00000000 ff000000 00000000 00000000 00000000 00010000 00000000 3c76e5d6 7f97d7b2 87fefb47 aa1e74a3
+ars4x32 7 00000000 00000000 80000000 00000000 00000000 00000000 00010000 00000000 b04160af ccd69849 d997776c 78baca82
+ars4x32 7 00000000 00000000 00000000 000000ff 00000000 00000000 00010000 00000000 2b426a66 b4778997 036bb2b6 73f85000
+ars4x32 7 00000000 00000000 00000000 00000080 00000000 00000000 00010000 00000000 97c725fd 4c263287 6b84df34 87bab7e8
+ars4x32 7 00000000 00000000 00000000 0000ff00 00000000 00000000 00010000 00000000 955705c6 638b9589 bf7079d3 a0812340
+ars4x32 7 00000000 00000000 00000000 00008000 00000000 00000000 00010000 00000000 8062aec7 ad667c4c 531d646c a89419b6
+ars4x32 7 00000000 00000000 00000000 00ff0000 00000000 00000000 00010000 00000000 5f4b9c78 e073fd03 7af2647f e04cadb5
+ars4x32 7 00000000 00000000 00000000 00800000 00000000 00000000 00010000 00000000 21173c0d bcbff324 23e49265 77a987e2
+ars4x32 7 00000000 00000000 00000000 ff000000 00000000 00000000 00010000 00000000 75469838 fd82de60 d25e525f 6fc94eec
+ars4x32 7 00000000 00000000 00000000 80000000 00000000 00000000 00010000 00000000 2901d556 c39f0758 f0f25524 ab9ea7f1
+ars4x32 7 886a3f24 d308a385 2e8a1913 44737003 00000000 00000000 00010000 00000000 0f4f1084 0dbb5150 bf4b4ba1 f1e9a302
+ars4x32 7 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000000 00010000 00000000 a7f09b0b d538d63e 8cd9698e 4de1d5c8
+ars4x32 7 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000000 00010000 00000000 e14850e1 da61655e f8b9fee9 4cca7a22
+ars4x32 7 00000001 00000000 00000000 00000000 00000000 00000000 01000000 00000000 82d8ce21 f80a41c3 e9d7378e a43774de
+ars4x32 7 00000100 00000000 00000000 00000000 00000000 00000000 01000000 00000000 29450fbe c7620b1e 01db607e 496c959e
+ars4x32 7 00010000 00000000 00000000 00000000 00000000 00000000 01000000 00000000 67b63d9e b7aa2865 5b0b2f47 38eca693
+ars4x32 7 01000000 00000000 00000000 00000000 00000000 00000000 01000000 00000000 22e3d97b 88139492 04477566 8fdf0038
+ars4x32 7 00000000 00000001 00000000 00000000 00000000 00000000 01000000 00000000 df57c091 a68d2400 c56ef541 caca2946
+ars4x32 7 00000000 00000100 00000000 00000000 00000000 00000000 01000000 00000000 d2e144ed 44f15ecc 72ad8cf0 18eb77a1
+ars4x32 7 00000000 00010000 00000000 00000000 00000000 00000000 01000000 00000000 597c28af dff928f2 c9881678 39c1b806
+ars4x32 7 00000000 01000000 00000000 00000000 00000000 00000000 01000000 00000000 9448bc5a 0f04a19c 7de7946f e41b327e
+ars4x32 7 00000000 00000000 00000001 00000000 00000000 00000000 01000000 00000000 25e501dc fc98dc25 2a624ae8 3335bc09
+ars4x32 7 00000000 00000000 00000100 00000000 00000000 00000000 01000000 00000000 73ed7ea6 1d84a23a ecea26e4 79d91ca2
+ars4x32 7 00000000 00000000 00010000 00000000 00000000 00000000 01000000 00000000 17c50437 780ab31f 883bf9e7 e4426521
+ars4x32 7 00000000 00000000 01000000 00000000 00000000 00000000 01000000 00000000 5ed86b68 57bcd482 c1963c45 c80403e9
+ars4x32 7 00000000 00000000 00000000 00000001 00000000 00000000 01000000 00000000 e4318c44 bd5a645e ee2a5267 d3f32328
+ars4x32 7 00000000 00000000 00000000 00000100 00000000 00000000 01000000 00000000 9584cdb9 0369c0c6 5db25327 f05fe043
+ars4x32 7 00000000 00000000 00000000 00010000 00000000 00000000 01000000 00000000 0eb27e05 398c1efc e252f9ec 9792108d
+ars4x32 7 00000000 00000000 00000000 01000000 00000000 00000000 01000000 00000000 27d98c16 a999fd3e 0f9aa126 4714fcf5
+ars4x32 7 0000ff00 00000000 00000000 00000000 00000000 00000000 01000000 00000000 18e2ab27 192e782c 228edbcd 1cf25b21
+ars4x32 7 00008000 00000000 00000000 00000000 00000000 00000000 01000000 00000000 b4dfa099 93e47dcd 53622042 1ae269aa
+ars4x32 7 00ff0000 00000000 00000000 00000000 00000000 00000000 01000000 00000000 289bdca4 79f10ec9 223c09b3 be39c40d
+ars4x32 7 00800000 00000000 00000000 00000000 00000000 00000000 01000000 00000000 a5f9354a 74713822 5d699bd5 e61ef52b
+ars4x32 7 ff000000 00000000 00000000 00000000 00000000 00000000 01000000 00000000 155c9b52 7f208dab 99bfd248 967ad519
+ars4x32 7 80000000 00000000 00000000 00000000 00000000 00000000 01000000 00000000 99c71cf2 004e9a5d dbf6813b e03f8f30
+ars4x32 7 00000000 000000ff 00000000 00000000 00000000 00000000 01000000 00000000 fd514803 5b988c05 11b96981 cc9efbf5
+ars4x32 7 00000000 00000080 00000000 00000000 00000000 00000000 01000000 00000000 a2e373f3 fff6af00 aae75bb6 aa810fda
+ars4x32 7 00000000 0000ff00 00000000 00000000 00000000 00000000 01000000 00000000 1b9d9279 33f2e9d4 57b2baac a08aaecd
+ars4x32 7 00000000 00008000 00000000 00000000 00000000 00000000 01000000 00000000 3b7d051d c251092d 0f387d56 c30b2bbd
+ars4x32 7 00000000 00ff0000 00000000 00000000 00000000 00000000 01000000 00000000 f7161117 ef751edb ad5435ad fdcbd02c
+ars4x32 7 00000000 00800000 00000000 00000000 00000000 00000000 01000000 00000000 a53512ef ab201dd5 5ce98a55 6152b179
+ars4x32 7 00000000 ff000000 00000000 00000000 00000000 00000000 01000000 00000000 71491954 fa3dfbaa 4766b8de 18867ab8
+ars4x32 7 00000000 80000000 00000000 00000000 00000000 00000000 01000000 00000000 a90344a6 0d3c789a 30a038cb 6bb037f2
+ars4x32 7 00000000 00000000 000000ff 00000000 00000000 00000000 01000000 00000000 0a27fa46 3b9d3956 4817a0f7 0f35fd04
+ars4x32 7 00000000 00000000 00000080 00000000 00000000 00000000 01000000 00000000 56940c06 a82316da 4ae11ae6 ca14cb80
+ars4x32 7 00000000 00000000 0000ff00 00000000 00000000 00000000 01000000 00000000 ef5356d3 eba75b67 5280c534 333bc371
+ars4x32 7 00000000 00000000 00008000 00000000 00000000 00000000 01000000 00000000 b29f5cb6 60e617b8 f15ab8d2 58a93843
+ars4x32 7 00000000 00000000 00ff0000 00000000 00000000 00000000 01000000 00000000 ee1b4eea 636b83ad 7310d166 3c49ed51
+ars4x32 7 00000000 00000000 00800000 00000000 00000000 00000000 01000000 00000000 cdcf1fa1 ff375a8c 3b20fba8 0553b4ac
+ars4x32 7 00000000 00000000 ff000000 00000000 00000000 00000000 01000000 00000000 534e5a74 6ad414cf 6783dc68 5afdaefc
+ars4x32 7 00000000 00000000 80000000 00000000 00000000 00000000 01000000 00000000 aa5f07f3 8208c9f7 86206e63 0e1dba58
+ars4x32 7 00000000 00000000 00000000 000000ff 00000000 00000000 01000000 00000000 c4b11a37 665a50fa a5f49338 6e8f0568
+ars4x32 7 00000000 00000000 00000000 00000080 00000000 00000000 01000000 00000000 f7f20443 868b09a9 7432511a 88556c5b
+ars4x32 7 00000000 00000000 00000000 0000ff00 00000000 00000000 01000000 00000000 8cf1b0f7 195a07bb e7444fc0 8efa2752
+ars4x32 7 00000000 00000000 00000000 00008000 00000000 00000000 01000000 00000000 d4deb9d3 8a9dcfcc 04f1b075 fb78122f
+ars4x32 7 00000000 00000000 00000000 00ff0000 00000000 00000000 01000000 00000000 8bb5c362 97b1a466 ff73a392 dd0e35ed
+ars4x32 7 00000000 00000000 00000000 00800000 00000000 00000000 01000000 00000000 30099688 0620fd6d 7988d696 194aab84
+ars4x32 7 00000000 00000000 00000000 ff000000 00000000 00000000 01000000 00000000 d381395a 31d23232 e2ce7661 9c07e08f
+ars4x32 7 00000000 00000000 00000000 80000000 00000000 00000000 01000000 00000000 38c43a08 5fe81ebb 3227c6cd e673f899
+ars4x32 7 886a3f24 d308a385 2e8a1913 44737003 00000000 00000000 01000000 00000000 57b9eb17 b16faefb f026d744 770589ec
+ars4x32 7 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000000 01000000 00000000 64ee86b0 b6f88be3 c384e0d6 a98d0044
+ars4x32 7 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000000 01000000 00000000 0943acb4 e8ca93ea c99a6bf0 587bbe35
+ars4x32 7 00000001 00000000 00000000 00000000 00000000 00000000 00000000 00000001 d8cdc0b3 76febda9 f145334c 8ccd989e
+ars4x32 7 00000100 00000000 00000000 00000000 00000000 00000000 00000000 00000001 a4120da0 7e334806 6ccbbae6 f884db86
+ars4x32 7 00010000 00000000 00000000 00000000 00000000 00000000 00000000 00000001 fe3fdf78 7fe5f526 0f9898a0 8553f47a
+ars4x32 7 01000000 00000000 00000000 00000000 00000000 00000000 00000000 00000001 0f5c7ddf e4ff9c6b b7822869 824f7b3c
+ars4x32 7 00000000 00000001 00000000 00000000 00000000 00000000 00000000 00000001 907e8fe5 6ff48574 c613762f 8419cca9
+ars4x32 7 00000000 00000100 00000000 00000000 00000000 00000000 00000000 00000001 7027e389 5b9bdc45 08d90b0a 996e7998
+ars4x32 7 00000000 00010000 00000000 00000000 00000000 00000000 00000000 00000001 904f9f5a b5f4e88d ead29fc0 2b996332
+ars4x32 7 00000000 01000000 00000000 00000000 00000000 00000000 00000000 00000001 80a2b84e 6900e001 c5162475 051606e2
+ars4x32 7 00000000 00000000 00000001 00000000 00000000 00000000 00000000 00000001 6c7a3b27 944d3b5b 052a12c4 1287ca7d
+ars4x32 7 00000000 00000000 00000100 00000000 00000000 00000000 00000000 00000001 7117192f 8e210458 f4f9f6f5 6c4a0318
+ars4x32 7 00000000 00000000 00010000 00000000 00000000 00000000 00000000 00000001 8aeeaf0a 185ac5e3 bcb8fc4a acbfe41b
+ars4x32 7 00000000 00000000 01000000 00000000 00000000 00000000 00000000 00000001 d9c75aea 39894834 bf1d275e d00a123c
+ars4x32 7 00000000 00000000 00000000 00000001 00000000 00000000 00000000 00000001 34d40c7a c5526b8f 0b35e113 bcd830c6
+ars4x32 7 00000000 00000000 00000000 00000100 00000000 00000000 00000000 00000001 b7acb815 feffa06e ea979b88 c0cf38bd
+ars4x32 7 00000000 00000000 00000000 00010000 00000000 00000000 00000000 00000001 6cdeb44a 35bd89c2 2fd88035 fbc9ddd3
+ars4x32 7 00000000 00000000 00000000 01000000 00000000 00000000 00000000 00000001 6c5d7d52 c8b975e9 e8a693ab b4bd1af3
+ars4x32 7 0000ff00 00000000 00000000 00000000 00000000 00000000 00000000 00000001 f8521b4a dbe20169 24340095 4dd3bb60
+ars4x32 7 00008000 00000000 00000000 00000000 00000000 00000000 00000000 00000001 c2d6689b 3b72883f f0fc19d1 6cc655f8
+ars4x32 7 00ff0000 00000000 00000000 00000000 00000000 00000000 00000000 00000001 0949c29c 3880052f 2459c0d3 774f67ac
+ars4x32 7 00800000 00000000 00000000 00000000 00000000 00000000 00000000 00000001 d37727d5 d44885fb 40dec1e3 10be5d27
+ars4x32 7 ff000000 00000000 00000000 00000000 00000000 00000000 00000000 00000001 3ac80642 953d6595 9c2df6a1 2fa227c0
+ars4x32 7 80000000 00000000 00000000 00000000 00000000 00000000 00000000 00000001 e343745c 514c98fb 202c521b 36a272dd
+ars4x32 7 00000000 000000ff 00000000 00000000 00000000 00000000 00000000 00000001 8f31f7db 58d9f1d0 2ba4fff1 dafd441e
+ars4x32 7 00000000 00000080 00000000 00000000 00000000 00000000 00000000 00000001 14093d48 19b54970 3076e546 54df7928
+ars4x32 7 00000000 0000ff00 00000000 00000000 00000000 00000000 00000000 00000001 65a1ec0f 0410478d 0336f294 08685c66
+ars4x32 7 00000000 00008000 00000000 00000000 00000000 00000000 00000000 00000001 adc7dadb 75984ee9 3f99fbec 32abbb5d
+ars4x32 7 00000000 00ff0000 00000000 00000000 00000000 00000000 00000000 00000001 ec4d68bc 8193dd1c 5db4cc7c 53e78f28
+ars4x32 7 00000000 00800000 00000000 00000000 00000000 00000000 00000000 00000001 2747e673 697ba048 fbd55241 f7d03178
+ars4x32 7 00000000 ff000000 00000000 00000000 00000000 00000000 00000000 00000001 1c4c758f 6142a50c 3db5d4c9 7d8964bb
+ars4x32 7 00000000 80000000 00000000 00000000 00000000 00000000 00000000 00000001 490f97b9 fb25b95c cae9be65 ba621248
+ars4x32 7 00000000 00000000 000000ff 00000000 00000000 00000000 00000000 00000001 95a625ff c506be5a 3c3547b4 b50900dc
+ars4x32 7 00000000 00000000 00000080 00000000 00000000 00000000 00000000 00000001 0b47695b 0823c2e9 7e30a51b 61a7bf88
+ars4x32 7 00000000 00000000 0000ff00 00000000 00000000 00000000 00000000 00000001 746993bc 5e841d54 3663cb30 679aa59a
+ars4x32 7 00000000 00000000 00008000 00000000 00000000 00000000 00000000 00000001 26b7e4b3 b52b2568 6ae26a56 7ece4e0a
+ars4x32 7 00000000 00000000 00ff0000 00000000 00000000 00000000 00000000 00000001 81b612d9 b684a761 b460a0d0 dea6923a
+ars4x32 7 00000000 00000000 00800000 00000000 00000000 00000000 00000000 00000001 a15c7e43 8b87221e aa01cea1 897212b9
+ars4x32 7 00000000 00000000 ff000000 00000000 00000000 00000000 00000000 00000001 d87e6534 a914f232 2ba776e3 64de0c83
+ars4x32 7 00000000 00000000 80000000 00000000 00000000 00000000 00000000 00000001 07043336 9ae9d489 f4a25ba8 165fddb8
+ars4x32 7 00000000 00000000 00000000 000000ff 00000000 00000000 00000000 00000001 c3d87d0d 58adc9e4 9e1da7d2 da881245
+ars4x32 7 00000000 00000000 00000000 00000080 00000000 00000000 00000000 00000001 0533180f afe5e50e 779f1051 79221e92
+ars4x32 7 00000000 00000000 00000000 0000ff00 00000000 00000000 00000000 00000001 3dd06f43 0b0d5f83 1302fe7d 3d2552e3
+ars4x32 7 00000000 00000000 00000000 00008000 00000000 00000000 00000000 00000001 725fc967 5021d4c6 ca759daa 0f8a7bbe
+ars4x32 7 00000000 00000000 00000000 00ff0000 00000000 00000000 00000000 00000001 a22aaee8 4ff66429 11f6d35b 9f328c05
+ars4x32 7 00000000 00000000 00000000 00800000 00000000 00000000 00000000 00000001 26131e6e cdac6fde dcdb3556 62e54f7b
+ars4x32 7 00000000 00000000 00000000 ff000000 00000000 00000000 00000000 00000001 c5ae206a 792a3d3c cff179d2 0667b2ec
+ars4x32 7 00000000 00000000 00000000 80000000 00000000 00000000 00000000 00000001 be478a57 82e7d9a0 25d55857 66b8c0ab
+ars4x32 7 886a3f24 d308a385 2e8a1913 44737003 00000000 00000000 00000000 00000001 eb5c58f7 9b42dc31 09174875 447f07e3
+ars4x32 7 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000000 00000000 00000001 e7091d5f ba221fd5 3775e6e7 6f5d17f4
+ars4x32 7 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000000 00000000 00000001 c944f017 ecdc01b1 64613fad 638d30f8
+ars4x32 7 00000001 00000000 00000000 00000000 00000000 00000000 00000000 00000100 7f2f0daa 8250599e d86eaf5b 6bbae2a9
+ars4x32 7 00000100 00000000 00000000 00000000 00000000 00000000 00000000 00000100 e4b5773e de0d22b1 f2ea0982 7b34db92
+ars4x32 7 00010000 00000000 00000000 00000000 00000000 00000000 00000000 00000100 393ae33d 46d1e116 12b3e6dd 59980fac
+ars4x32 7 01000000 00000000 00000000 00000000 00000000 00000000 00000000 00000100 5f412afa fdc6613b d0e935f6 471e5e4b
+ars4x32 7 00000000 00000001 00000000 00000000 00000000 00000000 00000000 00000100 7abeb2bc 122ddec0 6fa03a7a 824166dc
+ars4x32 7 00000000 00000100 00000000 00000000 00000000 00000000 00000000 00000100 1008b496 a85ba459 e7f1b8bd 3da32d88
+ars4x32 7 00000000 00010000 00000000 00000000 00000000 00000000 00000000 00000100 4d1afb12 939b7c02 f44bf246 fe7d2ef8
+ars4x32 7 00000000 01000000 00000000 00000000 00000000 00000000 00000000 00000100 1bb5c98d 60fa9c25 2749d1d9 3c880ed9
+ars4x32 7 00000000 00000000 00000001 00000000 00000000 00000000 00000000 00000100 a419efe3 cec80e6c 3fcc84a9 e56898c6
+ars4x32 7 00000000 00000000 00000100 00000000 00000000 00000000 00000000 00000100 505c2396 befec6b5 325cc0ed d63677a7
+ars4x32 7 00000000 00000000 00010000 00000000 00000000 00000000 00000000 00000100 1a6a4fcd b4fd4d3c 08fd0936 7cb1abb4
+ars4x32 7 00000000 00000000 01000000 00000000 00000000 00000000 00000000 00000100 01e1f7e9 959bfa34 b1ba5ba2 4c4dd6e0
+ars4x32 7 00000000 00000000 00000000 00000001 00000000 00000000 00000000 00000100 e6205d2a 0f119894 bc95a629 7ec8eb32
+ars4x32 7 00000000 00000000 00000000 00000100 00000000 00000000 00000000 00000100 542e3279 b1f2cffe 3eb39960 3680a449
+ars4x32 7 00000000 00000000 00000000 00010000 00000000 00000000 00000000 00000100 25021f11 cda42315 29e10f48 b917f681
+ars4x32 7 00000000 00000000 00000000 01000000 00000000 00000000 00000000 00000100 6b563024 a62a213a 083ef6de 448dcb62
+ars4x32 7 0000ff00 00000000 00000000 00000000 00000000 00000000 00000000 00000100 3dd4ac40 773dd04b 1fa760a1 5ab2d7b4
+ars4x32 7 00008000 00000000 00000000 00000000 00000000 00000000 00000000 00000100 55183ca4 2fae8c07 8a04c8a2 83bfb3b1
+ars4x32 7 00ff0000 00000000 00000000 00000000 00000000 00000000 00000000 00000100 ac1fa9e2 8a376297 6a76f622 66951cc2
+ars4x32 7 00800000 00000000 00000000 00000000 00000000 00000000 00000000 00000100 dcce8912 4bdd1e1a 8177deb0 a2df4df6
+ars4x32 7 ff000000 00000000 00000000 00000000 00000000 00000000 00000000 00000100 7b47aa39 17de883b f0389adb 725a81a2
+ars4x32 7 80000000 00000000 00000000 00000000 00000000 00000000 00000000 00000100 cd5f9e74 661902ef ef2a7524 0782be05
+ars4x32 7 00000000 000000ff 00000000 00000000 00000000 00000000 00000000 00000100 6950909c b0c259d3 9a1b0d2a e940fb31
+ars4x32 7 00000000 00000080 00000000 00000000 00000000 00000000 00000000 00000100 74bd6da0 2506319b fc8113d5 79455bde
+ars4x32 7 00000000 0000ff00 00000000 00000000 00000000 00000000 00000000 00000100 720d34e0 5f60576f 7278b81c d707f0a1
+ars4x32 7 00000000 00008000 00000000 00000000 00000000 00000000 00000000 00000100 ac8137db 28f464a3 98fc9b1b 2a2e70c9
+ars4x32 7 00000000 00ff0000 00000000 00000000 00000000 00000000 00000000 00000100 53d3c9db cb40a3bb d21c9214 4385dc60
+ars4x32 7 00000000 00800000 00000000 00000000 00000000 00000000 00000000 00000100 01ca9fc8 be2d5bc7 58e949a0 b7c03b88
+ars4x32 7 00000000 ff000000 00000000 00000000 00000000 00000000 00000000 00000100 0bd240e0 4fd3dc82 2fad4a10 ab50808e
+ars4x32 7 00000000 80000000 00000000 00000000 00000000 00000000 00000000 00000100 06c9fb2c 7bbc95f4 6f01b025 3ff15e9f
+ars4x32 7 00000000 00000000 000000ff 00000000 00000000 00000000 00000000 00000100 df36eb98 3a8cf76f cf22acb6 5e6bfb60
+ars4x32 7 00000000 00000000 00000080 00000000 00000000 00000000 00000000 00000100 4d620503 ff7ad0ad cba5c94d af9c37e5
+ars4x32 7 00000000 00000000 0000ff00 00000000 00000000 00000000 00000000 00000100 7161b90e cae6104d 5b1257d9 29f82898
+ars4x32 7 00000000 00000000 00008000 00000000 00000000 00000000 00000000 00000100 59d062ab 89e20f13 e6223064 6e7a60ee
+ars4x32 7 00000000 00000000 00ff0000 00000000 00000000 00000000 00000000 00000100 631ad4da b29b6712 052c2160 7d7315ba
+ars4x32 7 00000000 00000000 00800000 00000000 00000000 00000000 00000000 00000100 e920893f f173f4de 7e3a9c64 18cd538d
+ars4x32 7 00000000 00000000 ff000000 00000000 00000000 00000000 00000000 00000100 60303917 64f675bd 98417210 b058a208
+ars4x32 7 00000000 00000000 80000000 00000000 00000000 00000000 00000000 00000100 6464c8b1 8b280c53 18c499fb f27a4e16
+ars4x32 7 00000000 00000000 00000000 000000ff 00000000 00000000 00000000 00000100 f2ab7027 8d25e619 90017a45 2dc913ce
+ars4x32 7 00000000 00000000 00000000 00000080 00000000 00000000 00000000 00000100 23e9d1f4 7e6995a0 c4e606b8 0f1a66bc
+ars4x32 7 00000000 00000000 00000000 0000ff00 00000000 00000000 00000000 00000100 0a095c69 eae0868d f0f38532 f98b752b
+ars4x32 7 00000000 00000000 00000000 00008000 00000000 00000000 00000000 00000100 17fbf313 e6698d5b 0d534c3a c11f77ae
+ars4x32 7 00000000 00000000 00000000 00ff0000 00000000 00000000 00000000 00000100 460be28e 444d9392 7a902b48 84cae4e3
+ars4x32 7 00000000 00000000 00000000 00800000 00000000 00000000 00000000 00000100 610abef3 e7b54875 39a79235 eb13ffb4
+ars4x32 7 00000000 00000000 00000000 ff000000 00000000 00000000 00000000 00000100 c713d0ef 445f03ed bd7ead2d ed950e14
+ars4x32 7 00000000 00000000 00000000 80000000 00000000 00000000 00000000 00000100 e6737c14 2c8dcc7d 3a23f109 67b6a89f
+ars4x32 7 886a3f24 d308a385 2e8a1913 44737003 00000000 00000000 00000000 00000100 67f457c1 557228c2 c8089581 7d01371a
+ars4x32 7 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000000 00000000 00000100 a824da65 0b3dc334 aaba7e18 3d402fbe
+ars4x32 7 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000000 00000000 00000100 22ac2693 92de8f21 02a7797d 8f573dfe
+ars4x32 7 00000001 00000000 00000000 00000000 00000000 00000000 00000000 00010000 16453451 ae1de563 0dee5530 eceed42c
+ars4x32 7 00000100 00000000 00000000 00000000 00000000 00000000 00000000 00010000 46df3956 2d4a949c b59326a3 584723cd
+ars4x32 7 00010000 00000000 00000000 00000000 00000000 00000000 00000000 00010000 f08b09be 0de23177 5098b59b 110784f7
+ars4x32 7 01000000 00000000 00000000 00000000 00000000 00000000 00000000 00010000 485ef1c7 80025f08 b23ee428 27208fe3
+ars4x32 7 00000000 00000001 00000000 00000000 00000000 00000000 00000000 00010000 b158ebb3 8338a0a1 de47abd3 30640723
+ars4x32 7 00000000 00000100 00000000 00000000 00000000 00000000 00000000 00010000 87326517 08099596 4ce7aa41 c4c38ba2
+ars4x32 7 00000000 00010000 00000000 00000000 00000000 00000000 00000000 00010000 46b8aa2a 3777c4be 8415045a 1299fdbe
+ars4x32 7 00000000 01000000 00000000 00000000 00000000 00000000 00000000 00010000 54421b55 8571e355 5c415a26 6cb049b7
+ars4x32 7 00000000 00000000 00000001 00000000 00000000 00000000 00000000 00010000 6f930ec4 a9e9ad53 4251bb83 2e476fa6
+ars4x32 7 00000000 00000000 00000100 00000000 00000000 00000000 00000000 00010000 a7ef447a 524b4fa1 05c908a1 45f9ad22
+ars4x32 7 00000000 00000000 00010000 00000000 00000000 00000000 00000000 00010000 267ec642 b82ac27a 4d84ed96 e0b16f5f
+ars4x32 7 00000000 00000000 01000000 00000000 00000000 00000000 00000000 00010000 ab216213 8d2a7155 bbe7d6b4 9b641b00
+ars4x32 7 00000000 00000000 00000000 00000001 00000000 00000000 00000000 00010000 90b88f45 621a4888 765566df 5e4be449
+ars4x32 7 00000000 00000000 00000000 00000100 00000000 00000000 00000000 00010000 0ec8a630 6e5b9e83 9a75b24c 4f8235b9
+ars4x32 7 00000000 00000000 00000000 00010000 00000000 00000000 00000000 00010000 f4619e3a 02ded40c 9c0340eb 3b7e7721
+ars4x32 7 00000000 00000000 00000000 01000000 00000000 00000000 00000000 00010000 05072ea9 5639f5a6 d23e7418 b1e3ced6
+ars4x32 7 0000ff00 00000000 00000000 00000000 00000000 00000000 00000000 00010000 a33ab035 a790718f 180c5629 6cb17eb0
+ars4x32 7 00008000 00000000 00000000 00000000 00000000 00000000 00000000 00010000 3afaf21d f5f444d4 418d0c92 4d51e6ab
+ars4x32 7 00ff0000 00000000 00000000 00000000 00000000 00000000 00000000 00010000 e38a9623 fc3e8309 4454bf75 244bfb0d
+ars4x32 7 00800000 00000000 00000000 00000000 00000000 00000000 00000000 00010000 29397c94 ee16888b f4cd5d6b 2f559297
+ars4x32 7 ff000000 00000000 00000000 00000000 00000000 00000000 00000000 00010000 afe121a2 836f1bdc 9c684339 599bbaac
+ars4x32 7 80000000 00000000 00000000 00000000 00000000 00000000 00000000 00010000 97b8aabd b1df936a 52f5e128 d56ede53
+ars4x32 7 00000000 000000ff 00000000 00000000 00000000 00000000 00000000 00010000 78942d59 640b16e9 b8cf9e93 6654d236
+ars4x32 7 00000000 00000080 00000000 00000000 00000000 00000000 00000000 00010000 8b1ad3ba 90e87f5b 0d634de7 aaf1ec6d
+ars4x32 7 00000000 0000ff00 00000000 00000000 00000000 00000000 00000000 00010000 b4a35540 8a7bfccb d8ef9e43 6e6f13b1
+ars4x32 7 00000000 00008000 00000000 00000000 00000000 00000000 00000000 00010000 269e3c15 d4beeeb8 ec43a0a2 94e2f460
+ars4x32 7 00000000 00ff0000 00000000 00000000 00000000 00000000 00000000 00010000 b074026a 609dcbb3 e487f3d7 30364b78
+ars4x32 7 00000000 00800000 00000000 00000000 00000000 00000000 00000000 00010000 53e4a4db a3556ea4 576e6986 1b516aa4
+ars4x32 7 00000000 ff000000 00000000 00000000 00000000 00000000 00000000 00010000 dc5e18da ef5264a5 413d6200 1c4fe353
+ars4x32 7 00000000 80000000 00000000 00000000 00000000 00000000 00000000 00010000 bd3bf363 f67e6401 a70a9952 864d4aa5
+ars4x32 7 00000000 00000000 000000ff 00000000 00000000 00000000 00000000 00010000 ca25ca8c d87c52ed 10f3e089 a3f10a38
+ars4x32 7 00000000 00000000 00000080 00000000 00000000 00000000 00000000 00010000 99b35266 3935d44c 45de70ae 5f45642b
+ars4x32 7 00000000 00000000 0000ff00 00000000 00000000 00000000 00000000 00010000 881487ec a7d965b7 9390323e a0f820ec
+ars4x32 7 00000000 00000000 00008000 00000000 00000000 00000000 00000000 00010000 3c407556 c54e9eee 10be61a8 01b3314c
+ars4x32 7 00000000 00000000 00ff0000 00000000 00000000 00000000 00000000 00010000 9bdfd785 cdfacd85 2ad6eaae 08e5e1e0
+ars4x32 7 00000000 00000000 00800000 00000000 00000000 00000000 00000000 00010000 70049988 28ac8eaa 8f88c445 26a6a7ac
+ars4x32 7 00000000 00000000 ff000000 00000000 00000000 00000000 00000000 00010000 b3309df6 9f70fb63 e6bfe14d d9db32c5
+ars4x32 7 00000000 00000000 80000000 00000000 00000000 00000000 00000000 00010000 78c3331f e11483c2 196cd881 8c5cb976
+ars4x32 7 00000000 00000000 00000000 000000ff 00000000 00000000 00000000 00010000 78c1f422 ffb35622 976a0ea2 c47dadf3
+ars4x32 7 00000000 00000000 00000000 00000080 00000000 00000000 00000000 00010000 9a48897c 0d43258e 68143233 a4c42971
+ars4x32 7 00000000 00000000 00000000 0000ff00 00000000 00000000 00000000 00010000 c0c0c9a1 db862add 34cbbc45 0ae92dc3
+ars4x32 7 00000000 00000000 00000000 00008000 00000000 00000000 00000000 00010000 609cb695 a458cf4e 845dea00 770d10fd
+ars4x32 7 00000000 00000000 00000000 00ff0000 00000000 00000000 00000000 00010000 96096fbc 092a6c52 a2863361 6034ae5a
+ars4x32 7 00000000 00000000 00000000 00800000 00000000 00000000 00000000 00010000 59325887 93450bbe a209db71 2ca5aafb
+ars4x32 7 00000000 00000000 00000000 ff000000 00000000 00000000 00000000 00010000 603c3e9c 37da7ac1 46c5ed4c d4b26267
+ars4x32 7 00000000 00000000 00000000 80000000 00000000 00000000 00000000 00010000 417dd2b9 c069d12c 5cd96a21 a5aa30fe
+ars4x32 7 886a3f24 d308a385 2e8a1913 44737003 00000000 00000000 00000000 00010000 d1e6217e c52b09d7 43c3362c daa88559
+ars4x32 7 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000000 00000000 00010000 500d3d50 8334b350 4a350e9d 065f38cd
+ars4x32 7 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000000 00000000 00010000 6cf8999b 6a224467 cef79e60 1f6aa053
+ars4x32 7 00000001 00000000 00000000 00000000 00000000 00000000 00000000 01000000 236973b9 acfa2b20 a57b6a9e 141ff8a6
+ars4x32 7 00000100 00000000 00000000 00000000 00000000 00000000 00000000 01000000 b28f36c5 abf41d7b d5fce5d2 14ed9ac6
+ars4x32 7 00010000 00000000 00000000 00000000 00000000 00000000 00000000 01000000 87c39599 8016094f a95de4ce aa6aa7b8
+ars4x32 7 01000000 00000000 00000000 00000000 00000000 00000000 00000000 01000000 400e9c58 f0d67e0b 9e82d4ce 1309b835
+ars4x32 7 00000000 00000001 00000000 00000000 00000000 00000000 00000000 01000000 80ef9d40 b2e43def 364c02e9 06946104
+ars4x32 7 00000000 00000100 00000000 00000000 00000000 00000000 00000000 01000000 d0c96c3c ddb82b22 5849cf64 76915554
+ars4x32 7 00000000 00010000 00000000 00000000 00000000 00000000 00000000 01000000 974f08cb f1017d85 2a8ff47c 9515ba1f
+ars4x32 7 00000000 01000000 00000000 00000000 00000000 00000000 00000000 01000000 0f6f1b7b 01983102 4f048852 ee49b8c2
+ars4x32 7 00000000 00000000 00000001 00000000 00000000 00000000 00000000 01000000 1657d267 dc22abf5 6144b420 934224a4
+ars4x32 7 00000000 00000000 00000100 00000000 00000000 00000000 00000000 01000000 7ec7d92c cf0f4ed8 e5850d8b dc54d1af
+ars4x32 7 00000000 00000000 00010000 00000000 00000000 00000000 00000000 01000000 44c14233 ffb3c533 199a6672 4d92fefd
+ars4x32 7 00000000 00000000 01000000 00000000 00000000 00000000 00000000 01000000 6f391434 d9838457 4558af73 cde09326
+ars4x32 7 00000000 00000000 00000000 00000001 00000000 00000000 00000000 01000000 749c35fa 013dd6ad c985360b 054b5540
+ars4x32 7 00000000 00000000 00000000 00000100 00000000 00000000 00000000 01000000 0da7d3fb a196f591 87ddccb6 5bacae93
+ars4x32 7 00000000 00000000 00000000 00010000 00000000 00000000 00000000 01000000 0f1b4f3e 7110733b f8515528 ff32033b
+ars4x32 7 00000000 00000000 00000000 01000000 00000000 00000000 00000000 01000000 fb5a5d93 3ed97d61 039e3770 f3d0f902
+ars4x32 7 0000ff00 00000000 00000000 00000000 00000000 00000000 00000000 01000000 681a3e44 8e63ecd0 3abcabec 4d2d5731
+ars4x32 7 00008000 00000000 00000000 00000000 00000000 00000000 00000000 01000000 7f371943 dcfe4c07 49b7b9fb d57162e7
+ars4x32 7 00ff0000 00000000 00000000 00000000 00000000 00000000 00000000 01000000 83976612 a822b1a8 35791be9 a5d50048
+ars4x32 7 00800000 00000000 00000000 00000000 00000000 00000000 00000000 01000000 63f7134a d37c8caa 7f04dd78 8a27a3ec
+ars4x32 7 ff000000 00000000 00000000 00000000 00000000 00000000 00000000 01000000 6d3353b7 77bb4bb3 d7e0c2ff 16005d82
+ars4x32 7 80000000 00000000 00000000 00000000 00000000 00000000 00000000 01000000 3e284f56 e9881391 2e0fd8ea 724a7aee
+ars4x32 7 00000000 000000ff 00000000 00000000 00000000 00000000 00000000 01000000 bd941ac9 ae36480f 7558b610 d6f26b21
+ars4x32 7 00000000 00000080 00000000 00000000 00000000 00000000 00000000 01000000 3314bc79 87b3f03a 481bfaa7 a7b3a2f0
+ars4x32 7 00000000 0000ff00 00000000 00000000 00000000 00000000 00000000 01000000 828a4d0b 88977fc1 d68b9de4 102f59e1
+ars4x32 7 00000000 00008000 00000000 00000000 00000000 00000000 00000000 01000000 989b41df fc836e53 5651aa7a 4e468c77
+ars4x32 7 00000000 00ff0000 00000000 00000000 00000000 00000000 00000000 01000000 0f2ca98d 3217d236 7e6fa595 ed30cbc0
+ars4x32 7 00000000 00800000 00000000 00000000 00000000 00000000 00000000 01000000 95a56154 36c66fdb 2d78e0b1 264d50a4
+ars4x32 7 00000000 ff000000 00000000 00000000 00000000 00000000 00000000 01000000 730568fa 5f468b14 def70363 1347fbb1
+ars4x32 7 00000000 80000000 00000000 00000000 00000000 00000000 00000000 01000000 1e9be78a 288adfe4 acb526aa cf7bfcad
+ars4x32 7 00000000 00000000 000000ff 00000000 00000000 00000000 00000000 01000000 f28e617f 82ecd209 cead3a30 94a421cb
+ars4x32 7 00000000 00000000 00000080 00000000 00000000 00000000 00000000 01000000 275841e9 2b57d809 cde1d166 5fd89bf5
+ars4x32 7 00000000 00000000 0000ff00 00000000 00000000 00000000 00000000 01000000 2445d98d 4e04a79b 13979046 6b7d16ef
+ars4x32 7 00000000 00000000 00008000 00000000 00000000 00000000 00000000 01000000 06632be5 e012e4a6 415e4e48 f0a6810d
+ars4x32 7 00000000 00000000 00ff0000 00000000 00000000 00000000 00000000 01000000 dd19f886 d6931273 ee256f13 b76397aa
+ars4x32 7 00000000 00000000 00800000 00000000 00000000 00000000 00000000 01000000 9ae07c7a ff565271 12f255ea 92b0421c
+ars4x32 7 00000000 00000000 ff000000 00000000 00000000 00000000 00000000 01000000 70b1f0b9 804754b2 e7ce2010 95d34179
+ars4x32 7 00000000 00000000 80000000 00000000 00000000 00000000 00000000 01000000 832a2722 bb70152a 3b712fff 3e86ca27
+ars4x32 7 00000000 00000000 00000000 000000ff 00000000 00000000 00000000 01000000 73235ff4 84cf30f9 70ceb0f4 648df5bb
+ars4x32 7 00000000 00000000 00000000 00000080 00000000 00000000 00000000 01000000 5de658ec 8c032498 30ab870e f87c9df4
+ars4x32 7 00000000 00000000 00000000 0000ff00 00000000 00000000 00000000 01000000 48d8da59 56604227 972bde33 323ff9df
+ars4x32 7 00000000 00000000 00000000 00008000 00000000 00000000 00000000 01000000 035faa21 6bcbf158 25f98491 b0d4fa88
+ars4x32 7 00000000 00000000 00000000 00ff0000 00000000 00000000 00000000 01000000 3f39a50d 739f3ae0 f8c6c4cf 14edf4e2
+ars4x32 7 00000000 00000000 00000000 00800000 00000000 00000000 00000000 01000000 5fb447f4 4e452b6d 471ca52a 490b9927
+ars4x32 7 00000000 00000000 00000000 ff000000 00000000 00000000 00000000 01000000 ef0634c5 6283e5e1 a6fe4817 18509a0a
+ars4x32 7 00000000 00000000 00000000 80000000 00000000 00000000 00000000 01000000 e52f5ce3 b9b1feac 423d4a40 d133d0af
+ars4x32 7 886a3f24 d308a385 2e8a1913 44737003 00000000 00000000 00000000 01000000 f3aa0390 315d0cd6 4519ebd9 fc2f7ce2
+ars4x32 7 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000000 00000000 01000000 488fca1d 2ce48061 5fc5db0d 71c22c4e
+ars4x32 7 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000000 00000000 01000000 3e71fd01 b9a73d45 2efb44bc bc0883ef
+ars4x32 7 00000001 00000000 00000000 00000000 0000ff00 00000000 00000000 00000000 7d13e4db 9a88eb7a 35843f1a 866f65c3
+ars4x32 7 00000100 00000000 00000000 00000000 0000ff00 00000000 00000000 00000000 f076786a 2de44c1d 0a5a871b 43f6e099
+ars4x32 7 00010000 00000000 00000000 00000000 0000ff00 00000000 00000000 00000000 c47cd146 027b1ba4 31ab6a10 7f56ff7a
+ars4x32 7 01000000 00000000 00000000 00000000 0000ff00 00000000 00000000 00000000 e76c9bd9 ec696130 dd0a4218 f9eb265d
+ars4x32 7 00000000 00000001 00000000 00000000 0000ff00 00000000 00000000 00000000 e16d46ca ae9d21bd 1a2902ae 6dc6dafc
+ars4x32 7 00000000 00000100 00000000 00000000 0000ff00 00000000 00000000 00000000 173f2a2e 55ed290e b558c7eb 491c6fa2
+ars4x32 7 00000000 00010000 00000000 00000000 0000ff00 00000000 00000000 00000000 afb78413 0b81cf0c 82f232ff eceb9c23
+ars4x32 7 00000000 01000000 00000000 00000000 0000ff00 00000000 00000000 00000000 388159c2 679fc345 5776c7cf dcc2b909
+ars4x32 7 00000000 00000000 00000001 00000000 0000ff00 00000000 00000000 00000000 a7c5cf36 038f933f e2736b0f 25ece025
+ars4x32 7 00000000 00000000 00000100 00000000 0000ff00 00000000 00000000 00000000 7d760dc7 fba9e143 2c03d992 0deed06d
+ars4x32 7 00000000 00000000 00010000 00000000 0000ff00 00000000 00000000 00000000 52fb540d ed4f5f6f 5979bebf 4d125b76
+ars4x32 7 00000000 00000000 01000000 00000000 0000ff00 00000000 00000000 00000000 ab8062b5 37067fbd 9e374581 83b02c1d
+ars4x32 7 00000000 00000000 00000000 00000001 0000ff00 00000000 00000000 00000000 4294069a 343f7c26 d07baf72 923b8aec
+ars4x32 7 00000000 00000000 00000000 00000100 0000ff00 00000000 00000000 00000000 177f19b6 b7c68ffa de71312e 24ea4f8b
+ars4x32 7 00000000 00000000 00000000 00010000 0000ff00 00000000 00000000 00000000 f09e48eb 3c48bb03 e74e4b45 380059bd
+ars4x32 7 00000000 00000000 00000000 01000000 0000ff00 00000000 00000000 00000000 715c8bc7 cce2cbb0 5967a9ac b62c96e3
+ars4x32 7 0000ff00 00000000 00000000 00000000 0000ff00 00000000 00000000 00000000 35715da2 e9b679af 41d4db67 5a0d04bb
+ars4x32 7 00008000 00000000 00000000 00000000 0000ff00 00000000 00000000 00000000 a06bdcb5 f4847027 3b5847b4 7aaa7469
+ars4x32 7 00ff0000 00000000 00000000 00000000 0000ff00 00000000 00000000 00000000 b7c3b815 a954e0a8 94d0f903 84d221b8
+ars4x32 7 00800000 00000000 00000000 00000000 0000ff00 00000000 00000000 00000000 6f49710d 0161f573 4e6ad7eb b127ea30
+ars4x32 7 ff000000 00000000 00000000 00000000 0000ff00 00000000 00000000 00000000 a16a81ec bb71b3cf b61df0bc cd5a6cf2
+ars4x32 7 80000000 00000000 00000000 00000000 0000ff00 00000000 00000000 00000000 dae31938 f0122e2d 6152c09c 27e2c376
+ars4x32 7 00000000 000000ff 00000000 00000000 0000ff00 00000000 00000000 00000000 61b8aeea 304bd76d 2b9fda47 7d6815d0
+ars4x32 7 00000000 00000080 00000000 00000000 0000ff00 00000000 00000000 00000000 b415b044 950ef84a 019c610d e2be1cb8
+ars4x32 7 00000000 0000ff00 00000000 00000000 0000ff00 00000000 00000000 00000000 79b7e774 54b9d8e8 6906d920 e14e30d7
+ars4x32 7 00000000 00008000 00000000 00000000 0000ff00 00000000 00000000 00000000 54c20799 0d32af30 7e69c810 8ea36de2
+ars4x32 7 00000000 00ff0000 00000000 00000000 0000ff00 00000000 00000000 00000000 d16bfa1e 859584c8 a46d009a e023eece
+ars4x32 7 00000000 00800000 00000000 00000000 0000ff00 00000000 00000000 00000000 4c5910e4 3671ddee 0ca84957 0a604ccc
+ars4x32 7 00000000 ff000000 00000000 00000000 0000ff00 00000000 00000000 00000000 8f4fbe19 f18a46c1 0b430910 4468a0f1
+ars4x32 7 00000000 80000000 00000000 00000000 0000ff00 00000000 00000000 00000000 087f97a4 9a0ba2c1 bf36caea 8587a619
+ars4x32 7 00000000 00000000 000000ff 00000000 0000ff00 00000000 00000000 00000000 7ff7e522 9b292fd3 1b2600d0 2a68ec8f
+ars4x32 7 00000000 00000000 00000080 00000000 0000ff00 00000000 00000000 00000000 2391de60 ac9c9f97 9b45f2c6 3f1fcd2f
+ars4x32 7 00000000 00000000 0000ff00 00000000 0000ff00 00000000 00000000 00000000 d7b54f07 11e5c24f 2b8c3173 ebe64dc4
+ars4x32 7 00000000 00000000 00008000 00000000 0000ff00 00000000 00000000 00000000 2019eb40 e45a0ca7 41967671 9325094e
+ars4x32 7 00000000 00000000 00ff0000 00000000 0000ff00 00000000 00000000 00000000 d377c955 f73724b0 60a4367f 74efbae9
+ars4x32 7 00000000 00000000 00800000 00000000 0000ff00 00000000 00000000 00000000 d06a64ff 3d3fb872 d23cddfe 2cf313f3
+ars4x32 7 00000000 00000000 ff000000 00000000 0000ff00 00000000 00000000 00000000 caa347ec 362e47fa 37db32a2 939f3dd0
+ars4x32 7 00000000 00000000 80000000 00000000 0000ff00 00000000 00000000 00000000 121068a3 a6f6a9bd 6b4436f2 2936fae3
+ars4x32 7 00000000 00000000 00000000 000000ff 0000ff00 00000000 00000000 00000000 5ca7f32b 35843972 38c38c1d 22ccb436
+ars4x32 7 00000000 00000000 00000000 00000080 0000ff00 00000000 00000000 00000000 0d50a165 c7706d44 dfbcb0a0 3dbb9b10
+ars4x32 7 00000000 00000000 00000000 0000ff00 0000ff00 00000000 00000000 00000000 6cbd9d88 25856615 ca9cc5a0 3ee77397
+ars4x32 7 00000000 00000000 00000000 00008000 0000ff00 00000000 00000000 00000000 3a22b46a f51324d1 181b1a2c 7a6d6620
+ars4x32 7 00000000 00000000 00000000 00ff0000 0000ff00 00000000 00000000 00000000 dba434d5 e9f01484 230a2026 c32fbaa6
+ars4x32 7 00000000 00000000 00000000 00800000 0000ff00 00000000 00000000 00000000 555abae9 49b8aa4d 08e2898d 34c05ffa
+ars4x32 7 00000000 00000000 00000000 ff000000 0000ff00 00000000 00000000 00000000 4e588132 9ebf1ea8 eb70abf3 19c1340e
+ars4x32 7 00000000 00000000 00000000 80000000 0000ff00 00000000 00000000 00000000 22547cb5 08984142 8cc08a13 e241ae97
+ars4x32 7 886a3f24 d308a385 2e8a1913 44737003 0000ff00 00000000 00000000 00000000 98b62d23 0b6d0ba8 baab19fd dea5184d
+ars4x32 7 223809a4 d0319f29 98fa2e08 896c4eec 0000ff00 00000000 00000000 00000000 4cfeb8e9 0a7e96d4 0507241f b3e34599
+ars4x32 7 e6212845 7713d038 cf6654be 6c0ce934 0000ff00 00000000 00000000 00000000 42cad440 508e26da 3f6420ce f9dac8a0
+ars4x32 7 00000001 00000000 00000000 00000000 00008000 00000000 00000000 00000000 b4192971 09539fc9 c077cc1f 02dc8280
+ars4x32 7 00000100 00000000 00000000 00000000 00008000 00000000 00000000 00000000 b29da95f 97960ab5 cc0ba6f5 70f68b45
+ars4x32 7 00010000 00000000 00000000 00000000 00008000 00000000 00000000 00000000 4b26eba9 0afec271 1a5862d9 a2fbab60
+ars4x32 7 01000000 00000000 00000000 00000000 00008000 00000000 00000000 00000000 5b96062d 4a538f1b cef0f3f0 fa33f829
+ars4x32 7 00000000 00000001 00000000 00000000 00008000 00000000 00000000 00000000 2df682a5 e9fd97e4 de2fcc61 6ad346b1
+ars4x32 7 00000000 00000100 00000000 00000000 00008000 00000000 00000000 00000000 9ea89c73 7d9a8473 0a98fdc5 cd4eaa4b
+ars4x32 7 00000000 00010000 00000000 00000000 00008000 00000000 00000000 00000000 ce3dd09f 9a94935c d642de44 fe93f557
+ars4x32 7 00000000 01000000 00000000 00000000 00008000 00000000 00000000 00000000 4ca77f0c b785dabb 2b70797f 1b4f7cd0
+ars4x32 7 00000000 00000000 00000001 00000000 00008000 00000000 00000000 00000000 afb7d87e 3e5372ff 3670b934 370b142c
+ars4x32 7 00000000 00000000 00000100 00000000 00008000 00000000 00000000 00000000 eb57ceb5 9e0cab9d 0c6e81d2 80c5d390
+ars4x32 7 00000000 00000000 00010000 00000000 00008000 00000000 00000000 00000000 887ab783 e2dda480 7efa747d 50c3a6f7
+ars4x32 7 00000000 00000000 01000000 00000000 00008000 00000000 00000000 00000000 fd28991d 8cd72c34 3b8d7957 4d82bc0f
+ars4x32 7 00000000 00000000 00000000 00000001 00008000 00000000 00000000 00000000 42cbb732 e812c8ac 4fe033fa 3c57857f
+ars4x32 7 00000000 00000000 00000000 00000100 00008000 00000000 00000000 00000000 3a322695 e9cc71ba 60873d85 0330afa2
+ars4x32 7 00000000 00000000 00000000 00010000 00008000 00000000 00000000 00000000 3af0fdc5 44df990c f3b574be 8ba46baf
+ars4x32 7 00000000 00000000 00000000 01000000 00008000 00000000 00000000 00000000 ad4505c7 e5e3e8bb 5bd7f068 fc0c2205
+ars4x32 7 0000ff00 00000000 00000000 00000000 00008000 00000000 00000000 00000000 10290740 4d49e705 1a76c8ff a7a5aa59
+ars4x32 7 00008000 00000000 00000000 00000000 00008000 00000000 00000000 00000000 c344e818 d6f972c9 718ba48d 243ec4d4
+ars4x32 7 00ff0000 00000000 00000000 00000000 00008000 00000000 00000000 00000000 bc156ad2 142af240 c1a88557 09840973
+ars4x32 7 00800000 00000000 00000000 00000000 00008000 00000000 00000000 00000000 7e1f495d 91e0b733 725991ab 03de3987
+ars4x32 7 ff000000 00000000 00000000 00000000 00008000 00000000 00000000 00000000 149b47c9 cf7fac97 1e060e9a 95a36c31
+ars4x32 7 80000000 00000000 00000000 00000000 00008000 00000000 00000000 00000000 d88726d1 dc6c33c9 26b520f5 1d138faf
+ars4x32 7 00000000 000000ff 00000000 00000000 00008000 00000000 00000000 00000000 44d588d5 1b98e290 8b7dbb9a 01748115
+ars4x32 7 00000000 00000080 00000000 00000000 00008000 00000000 00000000 00000000 a2e345ad c19117e9 b05da489 55cfa170
+ars4x32 7 00000000 0000ff00 00000000 00000000 00008000 00000000 00000000 00000000 81d05528 f132945d 67c683f5 0651c945
+ars4x32 7 00000000 00008000 00000000 00000000 00008000 00000000 00000000 00000000 d029cbaa 6346b68e c879f83d 97f73048
+ars4x32 7 00000000 00ff0000 00000000 00000000 00008000 00000000 00000000 00000000 4e4c11b2 8506d628 2c9c75a3 975d680a
+ars4x32 7 00000000 00800000 00000000 00000000 00008000 00000000 00000000 00000000 313b97cf e3a44a70 fc6187a5 58a034a3
+ars4x32 7 00000000 ff000000 00000000 00000000 00008000 00000000 00000000 00000000 442a0817 afb746b8 194c0eb5 4ef17998
+ars4x32 7 00000000 80000000 00000000 00000000 00008000 00000000 00000000 00000000 f39262b5 f0135a8f 6aa2d31c 528b4b26
+ars4x32 7 00000000 00000000 000000ff 00000000 00008000 00000000 00000000 00000000 27c0e3f3 093c2cf4 71500803 c6f737e4
+ars4x32 7 00000000 00000000 00000080 00000000 00008000 00000000 00000000 00000000 da68c63a d4cd41e4 7b4edead d2484d56
+ars4x32 7 00000000 00000000 0000ff00 00000000 00008000 00000000 00000000 00000000 ff2f78ea 780c5f4f d8300b11 cebe22da
+ars4x32 7 00000000 00000000 00008000 00000000 00008000 00000000 00000000 00000000 c9d4b44f b60f12af a0751b26 89250c61
+ars4x32 7 00000000 00000000 00ff0000 00000000 00008000 00000000 00000000 00000000 95a7f1a5 8e9c86c0 61b88412 ad26e5c2
+ars4x32 7 00000000 00000000 00800000 00000000 00008000 00000000 00000000 00000000 a01a31b5 b0a556f6 94e4352c e0694763
+ars4x32 7 00000000 00000000 ff000000 00000000 00008000 00000000 00000000 00000000 fe8bae26 53f4f2fd f6104dd2 3ae163d3
+ars4x32 7 00000000 00000000 80000000 00000000 00008000 00000000 00000000 00000000 a96d7149 e1c71ace 03c22296 3258065b
+ars4x32 7 00000000 00000000 00000000 000000ff 00008000 00000000 00000000 00000000 0034229f f1f520b0 70852ef1 b5acd951
+ars4x32 7 00000000 00000000 00000000 00000080 00008000 00000000 00000000 00000000 bd37d239 dfa1d7bf ab0bc739 6f10d461
+ars4x32 7 00000000 00000000 00000000 0000ff00 00008000 00000000 00000000 00000000 248444f6 406c6f2d 0708e103 1380c7c3
+ars4x32 7 00000000 00000000 00000000 00008000 00008000 00000000 00000000 00000000 dbeecd59 c32c51e9 f68865af 641ea2e6
+ars4x32 7 00000000 00000000 00000000 00ff0000 00008000 00000000 00000000 00000000 eff2640d 7b4b0ad8 c2c66c11 4394dfc4
+ars4x32 7 00000000 00000000 00000000 00800000 00008000 00000000 00000000 00000000 83c21922 bb3bf8f7 bb57629d fbdfbf90
+ars4x32 7 00000000 00000000 00000000 ff000000 00008000 00000000 00000000 00000000 11222c7d 43bfed9f 3289c92d 0d731aae
+ars4x32 7 00000000 00000000 00000000 80000000 00008000 00000000 00000000 00000000 228c99ac f2677093 86390bb7 dd798774
+ars4x32 7 886a3f24 d308a385 2e8a1913 44737003 00008000 00000000 00000000 00000000 f688f6fc 11df506a ba609007 46a5debe
+ars4x32 7 223809a4 d0319f29 98fa2e08 896c4eec 00008000 00000000 00000000 00000000 aa8cba8f c215007b 3ff3b9c4 b4dd340e
+ars4x32 7 e6212845 7713d038 cf6654be 6c0ce934 00008000 00000000 00000000 00000000 861a9f31 8360b689 8b7d6829 1623096e
+ars4x32 7 00000001 00000000 00000000 00000000 00ff0000 00000000 00000000 00000000 5699ef44 00d103a4 c3eaac9b 45008c49
+ars4x32 7 00000100 00000000 00000000 00000000 00ff0000 00000000 00000000 00000000 b2be89c2 c37ed97e aa49c958 eefdc48c
+ars4x32 7 00010000 00000000 00000000 00000000 00ff0000 00000000 00000000 00000000 c84c1a7b 503fac50 0a0f4268 3432317e
+ars4x32 7 01000000 00000000 00000000 00000000 00ff0000 00000000 00000000 00000000 317cffea 45a03ab6 b84734b4 7491e4a8
+ars4x32 7 00000000 00000001 00000000 00000000 00ff0000 00000000 00000000 00000000 7641fe12 0409fbee 8dc258fa 643a095c
+ars4x32 7 00000000 00000100 00000000 00000000 00ff0000 00000000 00000000 00000000 4144456b 56e421b9 8e0bc871 908da857
+ars4x32 7 00000000 00010000 00000000 00000000 00ff0000 00000000 00000000 00000000 31467a52 9f569421 57af6d93 4ab9aaf1
+ars4x32 7 00000000 01000000 00000000 00000000 00ff0000 00000000 00000000 00000000 a4a81156 d35e565b c0004abc f7f5ad80
+ars4x32 7 00000000 00000000 00000001 00000000 00ff0000 00000000 00000000 00000000 d9a3c778 5a994a33 050a851e 53ff6bb3
+ars4x32 7 00000000 00000000 00000100 00000000 00ff0000 00000000 00000000 00000000 9602db81 4f3e8e31 b8eb8778 8d9ae6e6
+ars4x32 7 00000000 00000000 00010000 00000000 00ff0000 00000000 00000000 00000000 9cc2bebf cd9c9adb 1f5111bf 525c8306
+ars4x32 7 00000000 00000000 01000000 00000000 00ff0000 00000000 00000000 00000000 254233e0 f1600a4a 12cd2ffa 33f64782
+ars4x32 7 00000000 00000000 00000000 00000001 00ff0000 00000000 00000000 00000000 c76b94ff 1506dbfa b6a53b19 6567ec72
+ars4x32 7 00000000 00000000 00000000 00000100 00ff0000 00000000 00000000 00000000 b96d4a8b a94e4988 48e5aa70 7f981078
+ars4x32 7 00000000 00000000 00000000 00010000 00ff0000 00000000 00000000 00000000 7297a8ae 50f40468 7c06ad3f ada1dacb
+ars4x32 7 00000000 00000000 00000000 01000000 00ff0000 00000000 00000000 00000000 5e5c57e0 6b7e504d 29090675 5f3846be
+ars4x32 7 0000ff00 00000000 00000000 00000000 00ff0000 00000000 00000000 00000000 f5203998 7c9f3216 ee22563a 3b71d9e6
+ars4x32 7 00008000 00000000 00000000 00000000 00ff0000 00000000 00000000 00000000 52c6dec8 0610dfdc cabe92af b816df9d
+ars4x32 7 00ff0000 00000000 00000000 00000000 00ff0000 00000000 00000000 00000000 b8cb69c4 7c6cd1b4 fef546e2 a67ba514
+ars4x32 7 00800000 00000000 00000000 00000000 00ff0000 00000000 00000000 00000000 79ced4ff a7a61914 6b548c73 a7f15747
+ars4x32 7 ff000000 00000000 00000000 00000000 00ff0000 00000000 00000000 00000000 a2e949d9 860c3f63 d1105cb4 848d284e
+ars4x32 7 80000000 00000000 00000000 00000000 00ff0000 00000000 00000000 00000000 5bfdfefd 00f7baa4 6952abe6 e67d2254
+ars4x32 7 00000000 000000ff 00000000 00000000 00ff0000 00000000 00000000 00000000 6f489149 449ccf7d 2851c093 342faa21
+ars4x32 7 00000000 00000080 00000000 00000000 00ff0000 00000000 00000000 00000000 8f05251e 3b8e4328 3c01aa05 af222007
+ars4x32 7 00000000 0000ff00 00000000 00000000 00ff0000 00000000 00000000 00000000 2639f421 3d48b670 dfa86214 e6acd2ce
+ars4x32 7 00000000 00008000 00000000 00000000 00ff0000 00000000 00000000 00000000 94c5e071 feec27d5 17ec71d4 be8166af
+ars4x32 7 00000000 00ff0000 00000000 00000000 00ff0000 00000000 00000000 00000000 81bf17b5 15bf09e4 60c94d35 7719711e
+ars4x32 7 00000000 00800000 00000000 00000000 00ff0000 00000000 00000000 00000000 1f623b0b ebfca3f2 b6ca58a7 eeffc059
+ars4x32 7 00000000 ff000000 00000000 00000000 00ff0000 00000000 00000000 00000000 d12de53f 82c9fd72 153a4bf1 97834260
+ars4x32 7 00000000 80000000 00000000 00000000 00ff0000 00000000 00000000 00000000 78be9d31 d05ca12d 978adffa 42c3f165
+ars4x32 7 00000000 00000000 000000ff 00000000 00ff0000 00000000 00000000 00000000 df6516c8 c517f2ac f8189fcb 40268c9f
+ars4x32 7 00000000 00000000 00000080 00000000 00ff0000 00000000 00000000 00000000 06f0db2d b8cf2a5d 6a2fac1f b2b615f3
+ars4x32 7 00000000 00000000 0000ff00 00000000 00ff0000 00000000 00000000 00000000 07e97c9f b59955f1 ce210819 ddc6c117
+ars4x32 7 00000000 00000000 00008000 00000000 00ff0000 00000000 00000000 00000000 266fc505 086d79dd 883c7f19 812c8e58
+ars4x32 7 00000000 00000000 00ff0000 00000000 00ff0000 00000000 00000000 00000000 b2c8ba04 c0fdc64a b4d9a67c b335bd21
+ars4x32 7 00000000 00000000 00800000 00000000 00ff0000 00000000 00000000 00000000 c750fb02 49c6f0df 5e77855c 41bb7162
+ars4x32 7 00000000 00000000 ff000000 00000000 00ff0000 00000000 00000000 00000000 5a23f420 4b39be37 d12b4e70 43748ae8
+ars4x32 7 00000000 00000000 80000000 00000000 00ff0000 00000000 00000000 00000000 34ca991f 61a767bd c351e5b2 05eb14a6
+ars4x32 7 00000000 00000000 00000000 000000ff 00ff0000 00000000 00000000 00000000 b9032c17 622b9d66 a63ab848 cae4026d
+ars4x32 7 00000000 00000000 00000000 00000080 00ff0000 00000000 00000000 00000000 cb0864ff b9e9a0f4 587865a2 8d0e951a
+ars4x32 7 00000000 00000000 00000000 0000ff00 00ff0000 00000000 00000000 00000000 15df81bf 96bd32db 32fbbc39 5b63bcdf
+ars4x32 7 00000000 00000000 00000000 00008000 00ff0000 00000000 00000000 00000000 6437f14b 830fadfc 94314d02 c2511479
+ars4x32 7 00000000 00000000 00000000 00ff0000 00ff0000 00000000 00000000 00000000 48cb4f99 382ec6b3 be457c1d 2beed31f
+ars4x32 7 00000000 00000000 00000000 00800000 00ff0000 00000000 00000000 00000000 907b159b fe077e87 07b00ee8 5a81946f
+ars4x32 7 00000000 00000000 00000000 ff000000 00ff0000 00000000 00000000 00000000 996fcba6 25b49011 c432074f 5f3b26ef
+ars4x32 7 00000000 00000000 00000000 80000000 00ff0000 00000000 00000000 00000000 a91adb51 2af26621 19e0aeff 68d6e694
+ars4x32 7 886a3f24 d308a385 2e8a1913 44737003 00ff0000 00000000 00000000 00000000 3c41f9b1 ad73ddb3 02d857d3 09ff12ea
+ars4x32 7 223809a4 d0319f29 98fa2e08 896c4eec 00ff0000 00000000 00000000 00000000 991e32b5 45aaf05e 64fffcd8 61b258d8
+ars4x32 7 e6212845 7713d038 cf6654be 6c0ce934 00ff0000 00000000 00000000 00000000 081148ce 4da869c0 d06f78cf 42cda6d4
+ars4x32 7 00000001 00000000 00000000 00000000 00800000 00000000 00000000 00000000 a1b4b19d e403839e 16f8b8b6 1652d04b
+ars4x32 7 00000100 00000000 00000000 00000000 00800000 00000000 00000000 00000000 099f42eb 7c93ef4a 7273a8b3 ef9d69b5
+ars4x32 7 00010000 00000000 00000000 00000000 00800000 00000000 00000000 00000000 a76aebe3 7ff94770 dfee2619 05bd0057
+ars4x32 7 01000000 00000000 00000000 00000000 00800000 00000000 00000000 00000000 451fe101 f6a3ef4e 667f63a8 04ce4c83
+ars4x32 7 00000000 00000001 00000000 00000000 00800000 00000000 00000000 00000000 15cf4734 c47aef94 80edc942 f5ca69db
+ars4x32 7 00000000 00000100 00000000 00000000 00800000 00000000 00000000 00000000 e7566892 c6eb88c6 9c918435 0dd838f7
+ars4x32 7 00000000 00010000 00000000 00000000 00800000 00000000 00000000 00000000 469a99d1 8f034fce 3d2030c4 e0ed5d88
+ars4x32 7 00000000 01000000 00000000 00000000 00800000 00000000 00000000 00000000 c2c40a6a c58b2921 a4f6decf 4ae71aac
+ars4x32 7 00000000 00000000 00000001 00000000 00800000 00000000 00000000 00000000 1f70d2ed d32b22f6 9aa6dda6 3fef3838
+ars4x32 7 00000000 00000000 00000100 00000000 00800000 00000000 00000000 00000000 a9916db0 88b578e6 e47542bc 9ce1322f
+ars4x32 7 00000000 00000000 00010000 00000000 00800000 00000000 00000000 00000000 9e6e2d23 bd640359 4ab167df 9e912c62
+ars4x32 7 00000000 00000000 01000000 00000000 00800000 00000000 00000000 00000000 a2eda192 53f1d8b3 f44078fa d08dac13
+ars4x32 7 00000000 00000000 00000000 00000001 00800000 00000000 00000000 00000000 f7fc0eda 98472867 c3d1b83a 94ac445c
+ars4x32 7 00000000 00000000 00000000 00000100 00800000 00000000 00000000 00000000 0afed4d3 7d509436 d83d1e7e 804f751d
+ars4x32 7 00000000 00000000 00000000 00010000 00800000 00000000 00000000 00000000 a256ba8c 38c907b1 75c2a0b3 c53df9d7
+ars4x32 7 00000000 00000000 00000000 01000000 00800000 00000000 00000000 00000000 76c3db9a d7f46201 9fa6778f 543e2247
+ars4x32 7 0000ff00 00000000 00000000 00000000 00800000 00000000 00000000 00000000 1de2029f e8bd542d adf51e19 85712c5d
+ars4x32 7 00008000 00000000 00000000 00000000 00800000 00000000 00000000 00000000 ea2d0d3d 7c789821 6436a2dc 2dcc2884
+ars4x32 7 00ff0000 00000000 00000000 00000000 00800000 00000000 00000000 00000000 5aba4731 34daa9ed a85c4546 d7dbf009
+ars4x32 7 00800000 00000000 00000000 00000000 00800000 00000000 00000000 00000000 86c988bd 0701e39e 73a7d71c 17ab834e
+ars4x32 7 ff000000 00000000 00000000 00000000 00800000 00000000 00000000 00000000 aa465b47 86459dff 49611206 659bf418
+ars4x32 7 80000000 00000000 00000000 00000000 00800000 00000000 00000000 00000000 cf78f7c8 c620145b e06942aa 812e7565
+ars4x32 7 00000000 000000ff 00000000 00000000 00800000 00000000 00000000 00000000 c1ec8b70 da99ba59 d636b3f1 d33f4c01
+ars4x32 7 00000000 00000080 00000000 00000000 00800000 00000000 00000000 00000000 2889f1e5 5202bc42 93ca7570 41bfee0e
+ars4x32 7 00000000 0000ff00 00000000 00000000 00800000 00000000 00000000 00000000 f498fb91 d2aa5281 d0320c53 6e8f9393
+ars4x32 7 00000000 00008000 00000000 00000000 00800000 00000000 00000000 00000000 e0588e3a b2502bdf 0d301f0e d3ae6262
+ars4x32 7 00000000 00ff0000 00000000 00000000 00800000 00000000 00000000 00000000 e6c9f06e cb8f5012 31ccd88d 8082af36
+ars4x32 7 00000000 00800000 00000000 00000000 00800000 00000000 00000000 00000000 fbd461b1 bcf10336 da98061d f9f0eead
+ars4x32 7 00000000 ff000000 00000000 00000000 00800000 00000000 00000000 00000000 8d77a649 48ab6739 f3f6244a bcdb8ea4
+ars4x32 7 00000000 80000000 00000000 00000000 00800000 00000000 00000000 00000000 01d0fd1e 86e6ec23 34fe8312 adac2407
+ars4x32 7 00000000 00000000 000000ff 00000000 00800000 00000000 00000000 00000000 7183f509 0c87a68e 516efffe cd0603a1
+ars4x32 7 00000000 00000000 00000080 00000000 00800000 00000000 00000000 00000000 f90e665a 45f197b8 b01703a5 d9850ca9
+ars4x32 7 00000000 00000000 0000ff00 00000000 00800000 00000000 00000000 00000000 aba1b65b c3dc39c6 f818760c 5fcd9614
+ars4x32 7 00000000 00000000 00008000 00000000 00800000 00000000 00000000 00000000 c931ae0a a9c813a2 7389ce7b 3452f6d9
+ars4x32 7 00000000 00000000 00ff0000 00000000 00800000 00000000 00000000 00000000 5a7dd37f 99af6c84 d32965cc 710b3e37
+ars4x32 7 00000000 00000000 00800000 00000000 00800000 00000000 00000000 00000000 baedac97 b750a9ff 2f620a43 75c8add1
+ars4x32 7 00000000 00000000 ff000000 00000000 00800000 00000000 00000000 00000000 45954d84 67001176 dc64cf9e d0c338d7
+ars4x32 7 00000000 00000000 80000000 00000000 00800000 00000000 00000000 00000000 249dc958 65149828 5151c56e 707367fb
+ars4x32 7 00000000 00000000 00000000 000000ff 00800000 00000000 00000000 00000000 4e5ae7bc e47b30b0 f86b822c e364646c
+ars4x32 7 00000000 00000000 00000000 00000080 00800000 00000000 00000000 00000000 e63765d5 f32674bc 7782ed19 5567a9e5
+ars4x32 7 00000000 00000000 00000000 0000ff00 00800000 00000000 00000000 00000000 3ac6ab25 eebd3be5 ce198c87 190642a6
+ars4x32 7 00000000 00000000 00000000 00008000 00800000 00000000 00000000 00000000 90ca936c 19a11969 95285a8e d6c02163
+ars4x32 7 00000000 00000000 00000000 00ff0000 00800000 00000000 00000000 00000000 b47543c1 fcbb50e4 2b70872f e7925299
+ars4x32 7 00000000 00000000 00000000 00800000 00800000 00000000 00000000 00000000 45024998 0f63a2ab 1073737f b118a227
+ars4x32 7 00000000 00000000 00000000 ff000000 00800000 00000000 00000000 00000000 3c131bc1 dafb56c6 3f891099 ada112bf
+ars4x32 7 00000000 00000000 00000000 80000000 00800000 00000000 00000000 00000000 20510e0e 9282f9f2 36a85fea 60436ef8
+ars4x32 7 886a3f24 d308a385 2e8a1913 44737003 00800000 00000000 00000000 00000000 c8c161d9 a6254725 3a8e0032 b16af124
+ars4x32 7 223809a4 d0319f29 98fa2e08 896c4eec 00800000 00000000 00000000 00000000 fc54d1a3 2bebd8fc 350e3cba a9b3e3b3
+ars4x32 7 e6212845 7713d038 cf6654be 6c0ce934 00800000 00000000 00000000 00000000 725a0795 1f5b8fbf 0dde02a2 ddda103b
+ars4x32 7 00000001 00000000 00000000 00000000 ff000000 00000000 00000000 00000000 f20c1570 d6039a6e be4c0b63 0ceab11b
+ars4x32 7 00000100 00000000 00000000 00000000 ff000000 00000000 00000000 00000000 c58d83f4 c7c11330 92c5c6aa c439b7b9
+ars4x32 7 00010000 00000000 00000000 00000000 ff000000 00000000 00000000 00000000 f6d11f1d 28402208 38be7215 bcf3029f
+ars4x32 7 01000000 00000000 00000000 00000000 ff000000 00000000 00000000 00000000 0d715426 5dc37963 60e36070 f208eb70
+ars4x32 7 00000000 00000001 00000000 00000000 ff000000 00000000 00000000 00000000 02d1fa26 36d9a526 bd86b104 f287cff5
+ars4x32 7 00000000 00000100 00000000 00000000 ff000000 00000000 00000000 00000000 d2661d98 6e9fa52e c4b8b29c 7715a4e6
+ars4x32 7 00000000 00010000 00000000 00000000 ff000000 00000000 00000000 00000000 4ab024ed 9feb8bfb 4ab3a7af d6d46e21
+ars4x32 7 00000000 01000000 00000000 00000000 ff000000 00000000 00000000 00000000 e0ca2ef9 0f8fcc91 a909c0f8 5026f05d
+ars4x32 7 00000000 00000000 00000001 00000000 ff000000 00000000 00000000 00000000 00b618f9 7986feda 5082f579 dccbe02e
+ars4x32 7 00000000 00000000 00000100 00000000 ff000000 00000000 00000000 00000000 91c81394 a3c03bd0 be362e51 14e979c2
+ars4x32 7 00000000 00000000 00010000 00000000 ff000000 00000000 00000000 00000000 afffebcd 5e5ee6c9 5ad415ff 1c816807
+ars4x32 7 00000000 00000000 01000000 00000000 ff000000 00000000 00000000 00000000 6e8b1751 c4ebb487 1a3c413e 8b34880c
+ars4x32 7 00000000 00000000 00000000 00000001 ff000000 00000000 00000000 00000000 531ef1f8 157230dd 44a117e0 d28ebbb2
+ars4x32 7 00000000 00000000 00000000 00000100 ff000000 00000000 00000000 00000000 5117f82c bcb985ff 3cc57c54 1dea7b4c
+ars4x32 7 00000000 00000000 00000000 00010000 ff000000 00000000 00000000 00000000 2ec0689e e031aff0 9c5bbe70 4be2d641
+ars4x32 7 00000000 00000000 00000000 01000000 ff000000 00000000 00000000 00000000 7fdcd715 f074a429 486e4445 f4b48540
+ars4x32 7 0000ff00 00000000 00000000 00000000 ff000000 00000000 00000000 00000000 3f336fa9 7ac9514b fbe022cc 72d67f1c
+ars4x32 7 00008000 00000000 00000000 00000000 ff000000 00000000 00000000 00000000 cb311987 a33b790b 5238e35c 1b22d75d
+ars4x32 7 00ff0000 00000000 00000000 00000000 ff000000 00000000 00000000 00000000 3f33ae27 8073ad94 00e099ba 0890dc6b
+ars4x32 7 00800000 00000000 00000000 00000000 ff000000 00000000 00000000 00000000 316ed3b1 7ebb4320 8d4e502c 19b9a17b
+ars4x32 7 ff000000 00000000 00000000 00000000 ff000000 00000000 00000000 00000000 8a4ef9ba b150b7b8 a89b995d 222654b3
+ars4x32 7 80000000 00000000 00000000 00000000 ff000000 00000000 00000000 00000000 aa6ab8e1 32aaafe2 68cff088 5126a72f
+ars4x32 7 00000000 000000ff 00000000 00000000 ff000000 00000000 00000000 00000000 d9484dd2 d8ed45bf cd934356 98711bc5
+ars4x32 7 00000000 00000080 00000000 00000000 ff000000 00000000 00000000 00000000 b194fc17 7ad19838 104a1190 6ad2e2c6
+ars4x32 7 00000000 0000ff00 00000000 00000000 ff000000 00000000 00000000 00000000 10e03c4f 1d66a55e f4015b51 24b0a6da
+ars4x32 7 00000000 00008000 00000000 00000000 ff000000 00000000 00000000 00000000 5c877863 27e4ae74 c1fe9bdb 30e7387f
+ars4x32 7 00000000 00ff0000 00000000 00000000 ff000000 00000000 00000000 00000000 48d665be 04dd1041 3c536403 c0c50658
+ars4x32 7 00000000 00800000 00000000 00000000 ff000000 00000000 00000000 00000000 316af260 c3e51228 8e2d101c 55283e5f
+ars4x32 7 00000000 ff000000 00000000 00000000 ff000000 00000000 00000000 00000000 b2d3fb05 0e237707 5159f20a c142ef5b
+ars4x32 7 00000000 80000000 00000000 00000000 ff000000 00000000 00000000 00000000 e31079c1 260ea3df aa6faa8b 38845c56
+ars4x32 7 00000000 00000000 000000ff 00000000 ff000000 00000000 00000000 00000000 9acdaf03 0885571d 530cb772 2d658c18
+ars4x32 7 00000000 00000000 00000080 00000000 ff000000 00000000 00000000 00000000 950397cf ddd8b4bb 9018eaa0 e764146d
+ars4x32 7 00000000 00000000 0000ff00 00000000 ff000000 00000000 00000000 00000000 b24e6d97 79f27720 cedc6bcf cebad106
+ars4x32 7 00000000 00000000 00008000 00000000 ff000000 00000000 00000000 00000000 f2e3aedb 07a6ff24 57597231 c1c326ea
+ars4x32 7 00000000 00000000 00ff0000 00000000 ff000000 00000000 00000000 00000000 5006737e ef8f114f 5433839c 8bf6fcec
+ars4x32 7 00000000 00000000 00800000 00000000 ff000000 00000000 00000000 00000000 ce0dcef4 5dce8255 9cfc7a44 92c775f6
+ars4x32 7 00000000 00000000 ff000000 00000000 ff000000 00000000 00000000 00000000 06445467 01eaf5af 7c41372f 306c0418
+ars4x32 7 00000000 00000000 80000000 00000000 ff000000 00000000 00000000 00000000 b24a91ad 5374b993 532c214e 4d62735c
+ars4x32 7 00000000 00000000 00000000 000000ff ff000000 00000000 00000000 00000000 2ad702b7 f298e652 ad45e416 afdf3b45
+ars4x32 7 00000000 00000000 00000000 00000080 ff000000 00000000 00000000 00000000 1fdfac1b 29d91b83 6283fa9a c4bdabc1
+ars4x32 7 00000000 00000000 00000000 0000ff00 ff000000 00000000 00000000 00000000 c38ba415 36e0934a 9e93e7ff 57fb9604
+ars4x32 7 00000000 00000000 00000000 00008000 ff000000 00000000 00000000 00000000 8496cc8f d317b99a 09ed2dd5 0edb985e
+ars4x32 7 00000000 00000000 00000000 00ff0000 ff000000 00000000 00000000 00000000 c1a8e6ba f637f477 7c1be8c5 1635dc1c
+ars4x32 7 00000000 00000000 00000000 00800000 ff000000 00000000 00000000 00000000 5f2e7d91 f1f9cf5a 817e48fe 32ccab0c
+ars4x32 7 00000000 00000000 00000000 ff000000 ff000000 00000000 00000000 00000000 319fdc17 28a1caa6 cc3b75d2 cb8f3b4d
+ars4x32 7 00000000 00000000 00000000 80000000 ff000000 00000000 00000000 00000000 1f4d97b8 422e76b3 dda759c2 a5847931
+ars4x32 7 886a3f24 d308a385 2e8a1913 44737003 ff000000 00000000 00000000 00000000 0ba58ff4 f368a86b fd226d2d 38846c8f
+ars4x32 7 223809a4 d0319f29 98fa2e08 896c4eec ff000000 00000000 00000000 00000000 0559bff4 5d8c2def 9683e6e7 2f3bfae0
+ars4x32 7 e6212845 7713d038 cf6654be 6c0ce934 ff000000 00000000 00000000 00000000 49aa9863 e5956af6 c1963ab1 591271f2
+ars4x32 7 00000001 00000000 00000000 00000000 80000000 00000000 00000000 00000000 87bb5447 bc484c00 3c5b9aeb 1c2b06a0
+ars4x32 7 00000100 00000000 00000000 00000000 80000000 00000000 00000000 00000000 85ff139c 79136de3 a6c097ad a9d93b5e
+ars4x32 7 00010000 00000000 00000000 00000000 80000000 00000000 00000000 00000000 d742d3e8 1cadab91 38352a68 13cdbe8f
+ars4x32 7 01000000 00000000 00000000 00000000 80000000 00000000 00000000 00000000 7baaf6fd ce25c905 cd52dd6d 9b4b8695
+ars4x32 7 00000000 00000001 00000000 00000000 80000000 00000000 00000000 00000000 a372abd2 9170f153 c0f3826a 030d183c
+ars4x32 7 00000000 00000100 00000000 00000000 80000000 00000000 00000000 00000000 ac9b58af eab5f7f1 3067583b 20a88a68
+ars4x32 7 00000000 00010000 00000000 00000000 80000000 00000000 00000000 00000000 1543d6a6 2a11882a b8bd4a66 9d975a6a
+ars4x32 7 00000000 01000000 00000000 00000000 80000000 00000000 00000000 00000000 71143d7c 1ef3ced0 7932bd39 5ea74960
+ars4x32 7 00000000 00000000 00000001 00000000 80000000 00000000 00000000 00000000 78214851 98901970 9c7fb38b 86e20192
+ars4x32 7 00000000 00000000 00000100 00000000 80000000 00000000 00000000 00000000 4516ccf1 a5a3eb0f ea6d2d14 cbe8dc1d
+ars4x32 7 00000000 00000000 00010000 00000000 80000000 00000000 00000000 00000000 b0e28d6c dafe0519 9265f7a2 3a67d98f
+ars4x32 7 00000000 00000000 01000000 00000000 80000000 00000000 00000000 00000000 ca83bf38 b97608b1 f638b1ad 264da873
+ars4x32 7 00000000 00000000 00000000 00000001 80000000 00000000 00000000 00000000 eb299f5a 488ca603 d07f13b6 11f9a950
+ars4x32 7 00000000 00000000 00000000 00000100 80000000 00000000 00000000 00000000 1820cc2d ed40c0c6 9de2f5db a832b40c
+ars4x32 7 00000000 00000000 00000000 00010000 80000000 00000000 00000000 00000000 8c94851e 9015ad5d fa421361 7a8c9a72
+ars4x32 7 00000000 00000000 00000000 01000000 80000000 00000000 00000000 00000000 356b05ae e4868c3f 00d4c8e7 5bb483bd
+ars4x32 7 0000ff00 00000000 00000000 00000000 80000000 00000000 00000000 00000000 87e57c8d a2ebb5da 94ef921b fa8513ce
+ars4x32 7 00008000 00000000 00000000 00000000 80000000 00000000 00000000 00000000 cc5d25dd 0f0c036d d8f1396b 0a42d6b4
+ars4x32 7 00ff0000 00000000 00000000 00000000 80000000 00000000 00000000 00000000 a2459ccc f6ee7d36 ccec35f6 e61df0ad
+ars4x32 7 00800000 00000000 00000000 00000000 80000000 00000000 00000000 00000000 124c12b5 6fdd7c44 d10cd930 50fc3048
+ars4x32 7 ff000000 00000000 00000000 00000000 80000000 00000000 00000000 00000000 09a36724 e1efb60c 7a6af056 16918325
+ars4x32 7 80000000 00000000 00000000 00000000 80000000 00000000 00000000 00000000 241b7c12 dac5702f 035aaf92 367de6b0
+ars4x32 7 00000000 000000ff 00000000 00000000 80000000 00000000 00000000 00000000 d0e87638 680d52f8 ef7d1235 eb854d5f
+ars4x32 7 00000000 00000080 00000000 00000000 80000000 00000000 00000000 00000000 41458389 3648fdb0 f32d3a06 1b374ab6
+ars4x32 7 00000000 0000ff00 00000000 00000000 80000000 00000000 00000000 00000000 89767040 98bd8b53 2a7a25e1 9d330351
+ars4x32 7 00000000 00008000 00000000 00000000 80000000 00000000 00000000 00000000 0495c061 b369bdf6 16e39b8b 2f73c706
+ars4x32 7 00000000 00ff0000 00000000 00000000 80000000 00000000 00000000 00000000 4f44ba25 2fa529fb 7bac72d0 8c5e9791
+ars4x32 7 00000000 00800000 00000000 00000000 80000000 00000000 00000000 00000000 cf05097a 9445e279 6be1bea5 934cc529
+ars4x32 7 00000000 ff000000 00000000 00000000 80000000 00000000 00000000 00000000 b14f83c4 23ea98f2 117f8aa9 6f4e3cff
+ars4x32 7 00000000 80000000 00000000 00000000 80000000 00000000 00000000 00000000 bcefcdbe f7800c28 75a42433 343eb79f
+ars4x32 7 00000000 00000000 000000ff 00000000 80000000 00000000 00000000 00000000 c823637a f2cd8f68 3f74cbdd 72672c7e
+ars4x32 7 00000000 00000000 00000080 00000000 80000000 00000000 00000000 00000000 cdd08685 aa494976 778fdcd3 9ecac13f
+ars4x32 7 00000000 00000000 0000ff00 00000000 80000000 00000000 00000000 00000000 fa778f3c 6258a48a e9264cb5 7b37bca7
+ars4x32 7 00000000 00000000 00008000 00000000 80000000 00000000 00000000 00000000 2d459898 72b4770e c2a0bb2b 3c849ce6
+ars4x32 7 00000000 00000000 00ff0000 00000000 80000000 00000000 00000000 00000000 4cc396bc ced17dc9 f56b05e9 f981fa2a
+ars4x32 7 00000000 00000000 00800000 00000000 80000000 00000000 00000000 00000000 fca7e4cd 675b8891 78cb54e9 32b59df7
+ars4x32 7 00000000 00000000 ff000000 00000000 80000000 00000000 00000000 00000000 2382998d 5c4ed0b3 055d8edf ca6ca6d4
+ars4x32 7 00000000 00000000 80000000 00000000 80000000 00000000 00000000 00000000 afa21a88 d3361143 bda336cd 1bf267e9
+ars4x32 7 00000000 00000000 00000000 000000ff 80000000 00000000 00000000 00000000 b18364a6 17306f04 1b6a8425 6eff1661
+ars4x32 7 00000000 00000000 00000000 00000080 80000000 00000000 00000000 00000000 0e9be5fd 8ca4a6f1 0a8877e6 da88be80
+ars4x32 7 00000000 00000000 00000000 0000ff00 80000000 00000000 00000000 00000000 1b5e3bd8 03430218 f30c0ab5 396c6445
+ars4x32 7 00000000 00000000 00000000 00008000 80000000 00000000 00000000 00000000 782878c3 3e5bf42b cf3105a1 de7112a6
+ars4x32 7 00000000 00000000 00000000 00ff0000 80000000 00000000 00000000 00000000 43bd4d21 40c58ac2 32165652 fbf0adba
+ars4x32 7 00000000 00000000 00000000 00800000 80000000 00000000 00000000 00000000 f0139d5e 9458d4c8 5adb4065 18813af3
+ars4x32 7 00000000 00000000 00000000 ff000000 80000000 00000000 00000000 00000000 28331921 43f86e50 f0b94047 e0654b93
+ars4x32 7 00000000 00000000 00000000 80000000 80000000 00000000 00000000 00000000 5ec61507 95b87190 8213fbdb 1360ab51
+ars4x32 7 886a3f24 d308a385 2e8a1913 44737003 80000000 00000000 00000000 00000000 533f6a37 ba512677 d84dfdd5 5597e5aa
+ars4x32 7 223809a4 d0319f29 98fa2e08 896c4eec 80000000 00000000 00000000 00000000 529c017f 9f86555b 837d649b ff84d080
+ars4x32 7 e6212845 7713d038 cf6654be 6c0ce934 80000000 00000000 00000000 00000000 25283e1d ec64d74a afae1f45 5dad3c19
+ars4x32 7 00000001 00000000 00000000 00000000 00000000 000000ff 00000000 00000000 43c59a8b 7a0a8656 9c5f8e27 4af02ac2
+ars4x32 7 00000100 00000000 00000000 00000000 00000000 000000ff 00000000 00000000 57dc1d90 13124348 47a4d8f5 d64e0304
+ars4x32 7 00010000 00000000 00000000 00000000 00000000 000000ff 00000000 00000000 99ae0ba7 08529cca 397c2875 233f40e4
+ars4x32 7 01000000 00000000 00000000 00000000 00000000 000000ff 00000000 00000000 87ceb2f7 6b345e61 9a2262b5 d69056cc
+ars4x32 7 00000000 00000001 00000000 00000000 00000000 000000ff 00000000 00000000 1d69aed8 3b929058 e9fbe805 18ed39b5
+ars4x32 7 00000000 00000100 00000000 00000000 00000000 000000ff 00000000 00000000 90bfc885 9f4237b2 dfd32f0e b1e2f26a
+ars4x32 7 00000000 00010000 00000000 00000000 00000000 000000ff 00000000 00000000 da68b9cc 33b56472 05f80088 098915f3
+ars4x32 7 00000000 01000000 00000000 00000000 00000000 000000ff 00000000 00000000 55848037 5c14a6e4 10023500 abc72296
+ars4x32 7 00000000 00000000 00000001 00000000 00000000 000000ff 00000000 00000000 e7d77cf9 7140c274 0642cd78 c167426a
+ars4x32 7 00000000 00000000 00000100 00000000 00000000 000000ff 00000000 00000000 1f6f5dc7 6a834368 bc961991 01d51d24
+ars4x32 7 00000000 00000000 00010000 00000000 00000000 000000ff 00000000 00000000 1bb02fcb 029706f2 c4d03153 40cc75eb
+ars4x32 7 00000000 00000000 01000000 00000000 00000000 000000ff 00000000 00000000 be29eb01 7a39d0ea 79092750 0157e93f
+ars4x32 7 00000000 00000000 00000000 00000001 00000000 000000ff 00000000 00000000 78f7259c 6ac835be 3b05318c a379cd46
+ars4x32 7 00000000 00000000 00000000 00000100 00000000 000000ff 00000000 00000000 c914d01b 78603f42 272880d0 63db5558
+ars4x32 7 00000000 00000000 00000000 00010000 00000000 000000ff 00000000 00000000 30fed3a5 d7d0f6ca f8a2b39b 4d1abdbd
+ars4x32 7 00000000 00000000 00000000 01000000 00000000 000000ff 00000000 00000000 6fc859e0 28e9e642 deeabe53 148ec29e
+ars4x32 7 0000ff00 00000000 00000000 00000000 00000000 000000ff 00000000 00000000 2ed44b13 fb6dc843 f6762574 24a4be71
+ars4x32 7 00008000 00000000 00000000 00000000 00000000 000000ff 00000000 00000000 c15b218e 5942aad5 5385c634 0b1a8d79
+ars4x32 7 00ff0000 00000000 00000000 00000000 00000000 000000ff 00000000 00000000 cea1fe5d d64390e8 77fa74f9 739b2908
+ars4x32 7 00800000 00000000 00000000 00000000 00000000 000000ff 00000000 00000000 2d68af44 add72c30 8695fccf 457ff20c
+ars4x32 7 ff000000 00000000 00000000 00000000 00000000 000000ff 00000000 00000000 a6d4ccee 099f5cb7 3def8137 c8b0e054
+ars4x32 7 80000000 00000000 00000000 00000000 00000000 000000ff 00000000 00000000 2262767d 4f132f15 74544c84 849da607
+ars4x32 7 00000000 000000ff 00000000 00000000 00000000 000000ff 00000000 00000000 6ffb7b5e f6433da9 546972b1 b9ba5e91
+ars4x32 7 00000000 00000080 00000000 00000000 00000000 000000ff 00000000 00000000 2f2e366a 8e08a28d 9fd231f5 89e1b414
+ars4x32 7 00000000 0000ff00 00000000 00000000 00000000 000000ff 00000000 00000000 ec4f793f 4a915361 49d4bf4b 008921e9
+ars4x32 7 00000000 00008000 00000000 00000000 00000000 000000ff 00000000 00000000 c16c5ceb 50bfe194 033a05fb 581cece7
+ars4x32 7 00000000 00ff0000 00000000 00000000 00000000 000000ff 00000000 00000000 b62541fa 29374e2b 5fd7db5a b8dc8fa1
+ars4x32 7 00000000 00800000 00000000 00000000 00000000 000000ff 00000000 00000000 f3092fc1 2d34850a ee312b26 b3248d96
+ars4x32 7 00000000 ff000000 00000000 00000000 00000000 000000ff 00000000 00000000 18b536c0 2171ac1c 366bacb9 20307007
+ars4x32 7 00000000 80000000 00000000 00000000 00000000 000000ff 00000000 00000000 e5a3b8fc 7d0ebab7 1773b22b ca5ef8ff
+ars4x32 7 00000000 00000000 000000ff 00000000 00000000 000000ff 00000000 00000000 eb5a6b14 d6f13e39 e5c2898c 884ae98d
+ars4x32 7 00000000 00000000 00000080 00000000 00000000 000000ff 00000000 00000000 63559e27 f649cb3e 8dad6310 214cec8b
+ars4x32 7 00000000 00000000 0000ff00 00000000 00000000 000000ff 00000000 00000000 ed16c428 2f7d0063 1dbe5855 0964c597
+ars4x32 7 00000000 00000000 00008000 00000000 00000000 000000ff 00000000 00000000 9c1c25a2 b51b1513 c2ce46c6 b710743b
+ars4x32 7 00000000 00000000 00ff0000 00000000 00000000 000000ff 00000000 00000000 27e77312 e0090553 981f1b58 e2e53ed4
+ars4x32 7 00000000 00000000 00800000 00000000 00000000 000000ff 00000000 00000000 2aba1abb c3d3fd8e 4db4d2cf a0d8e8fe
+ars4x32 7 00000000 00000000 ff000000 00000000 00000000 000000ff 00000000 00000000 d6eb1511 03b367ec fb02e357 221e1de6
+ars4x32 7 00000000 00000000 80000000 00000000 00000000 000000ff 00000000 00000000 998b7fa0 c330bf3e 4906a0b9 32c00aee
+ars4x32 7 00000000 00000000 00000000 000000ff 00000000 000000ff 00000000 00000000 f95becd0 bdc40f82 23bc843a 953bbb26
+ars4x32 7 00000000 00000000 00000000 00000080 00000000 000000ff 00000000 00000000 f960be5e c44d7241 08b27d55 67690dca
+ars4x32 7 00000000 00000000 00000000 0000ff00 00000000 000000ff 00000000 00000000 ff69bad7 6752a2e6 5222bb9c 30d59d7e
+ars4x32 7 00000000 00000000 00000000 00008000 00000000 000000ff 00000000 00000000 585585c3 b27283cf 4dcd15a3 ce8cd474
+ars4x32 7 00000000 00000000 00000000 00ff0000 00000000 000000ff 00000000 00000000 09d00347 3eb2b33d c167b7a6 3481b589
+ars4x32 7 00000000 00000000 00000000 00800000 00000000 000000ff 00000000 00000000 abb02cd1 a5501d95 f69faffa efae570e
+ars4x32 7 00000000 00000000 00000000 ff000000 00000000 000000ff 00000000 00000000 4ab73886 18a8e008 86c42139 4ffd1164
+ars4x32 7 00000000 00000000 00000000 80000000 00000000 000000ff 00000000 00000000 f77867ae 96b779a2 e350fb3a bc323d55
+ars4x32 7 886a3f24 d308a385 2e8a1913 44737003 00000000 000000ff 00000000 00000000 ad84c758 b85d53fc 270cc9cb 0d11d188
+ars4x32 7 223809a4 d0319f29 98fa2e08 896c4eec 00000000 000000ff 00000000 00000000 1a623015 87f931a8 16b04922 f155907a
+ars4x32 7 e6212845 7713d038 cf6654be 6c0ce934 00000000 000000ff 00000000 00000000 f584e714 00b48848 4a91baa5 3ca12024
+ars4x32 7 00000001 00000000 00000000 00000000 00000000 00000080 00000000 00000000 ae90a49e 0299f75a dba09105 373ea9eb
+ars4x32 7 00000100 00000000 00000000 00000000 00000000 00000080 00000000 00000000 214eed3d 174342ff 75353808 982cff92
+ars4x32 7 00010000 00000000 00000000 00000000 00000000 00000080 00000000 00000000 0f23fa1a 7b4b9c5d e05f47d2 b5ab6abc
+ars4x32 7 01000000 00000000 00000000 00000000 00000000 00000080 00000000 00000000 c5d8ab43 57dccb7e e867925b 7f6262a2
+ars4x32 7 00000000 00000001 00000000 00000000 00000000 00000080 00000000 00000000 374bb137 888b5016 ab7c188d 90208ed9
+ars4x32 7 00000000 00000100 00000000 00000000 00000000 00000080 00000000 00000000 5f9ea30d a10ab20d 6dbd796c ef1aaa67
+ars4x32 7 00000000 00010000 00000000 00000000 00000000 00000080 00000000 00000000 77d47187 2f3cfe06 9379af3f c4ba660f
+ars4x32 7 00000000 01000000 00000000 00000000 00000000 00000080 00000000 00000000 f3b87463 f479102f ba81384d 34102ef8
+ars4x32 7 00000000 00000000 00000001 00000000 00000000 00000080 00000000 00000000 60908525 4aabf57a 93c9cc43 8cad4313
+ars4x32 7 00000000 00000000 00000100 00000000 00000000 00000080 00000000 00000000 3ce1f6e3 dda6d891 e1510c84 8f834bf4
+ars4x32 7 00000000 00000000 00010000 00000000 00000000 00000080 00000000 00000000 985cf038 aa7b16b2 638d34f1 eda67219
+ars4x32 7 00000000 00000000 01000000 00000000 00000000 00000080 00000000 00000000 a545eecc 860e969e 239e2844 0169b9a8
+ars4x32 7 00000000 00000000 00000000 00000001 00000000 00000080 00000000 00000000 cb17174d e653d856 bc2b4908 e8fe058e
+ars4x32 7 00000000 00000000 00000000 00000100 00000000 00000080 00000000 00000000 da37f0c2 dea7695a b2d60e33 5ea535fb
+ars4x32 7 00000000 00000000 00000000 00010000 00000000 00000080 00000000 00000000 ab5150a4 6bda12a2 8f191285 7d7bb7c3
+ars4x32 7 00000000 00000000 00000000 01000000 00000000 00000080 00000000 00000000 37041509 09fbce98 04aa5f64 c4321682
+ars4x32 7 0000ff00 00000000 00000000 00000000 00000000 00000080 00000000 00000000 9c143b49 5f8c06bf 2cdff4f4 221ceef9
+ars4x32 7 00008000 00000000 00000000 00000000 00000000 00000080 00000000 00000000 b7be5da6 fa4c411e c9cd4b45 531ad13e
+ars4x32 7 00ff0000 00000000 00000000 00000000 00000000 00000080 00000000 00000000 6b883640 05246641 2b401ae1 d4d847ed
+ars4x32 7 00800000 00000000 00000000 00000000 00000000 00000080 00000000 00000000 68166451 96c4002c a2bfab07 d56932a7
+ars4x32 7 ff000000 00000000 00000000 00000000 00000000 00000080 00000000 00000000 969ce4d7 2327f0e2 9f062d34 68cb61ac
+ars4x32 7 80000000 00000000 00000000 00000000 00000000 00000080 00000000 00000000 f524b711 5cb24950 b205657f 695b1936
+ars4x32 7 00000000 000000ff 00000000 00000000 00000000 00000080 00000000 00000000 a428a90d ee8be22b ec86cd41 d7ca0544
+ars4x32 7 00000000 00000080 00000000 00000000 00000000 00000080 00000000 00000000 92033e09 70381ddf a67153cf 7f1d3e6a
+ars4x32 7 00000000 0000ff00 00000000 00000000 00000000 00000080 00000000 00000000 776d80b7 92d6738c 0eb0f0f1 6606b60b
+ars4x32 7 00000000 00008000 00000000 00000000 00000000 00000080 00000000 00000000 3437e471 971e2660 9de12fcc 9e719dee
+ars4x32 7 00000000 00ff0000 00000000 00000000 00000000 00000080 00000000 00000000 17d851f4 b6e2cba0 dcf9d96f 6db22640
+ars4x32 7 00000000 00800000 00000000 00000000 00000000 00000080 00000000 00000000 49fba068 efaea7ff 4403e079 eff7e9f8
+ars4x32 7 00000000 ff000000 00000000 00000000 00000000 00000080 00000000 00000000 a9d90c25 137cefe3 2da099c8 8b7c54fe
+ars4x32 7 00000000 80000000 00000000 00000000 00000000 00000080 00000000 00000000 31ecb7fc e98ed901 cc52ca53 522b8aef
+ars4x32 7 00000000 00000000 000000ff 00000000 00000000 00000080 00000000 00000000 67ea36d8 edc81619 75f854de 62620573
+ars4x32 7 00000000 00000000 00000080 00000000 00000000 00000080 00000000 00000000 5f07cdb6 dc8eba08 a2203ab9 ebd2994e
+ars4x32 7 00000000 00000000 0000ff00 00000000 00000000 00000080 00000000 00000000 2f97e7b3 1c024bf0 9460e45c 1eb15ddd
+ars4x32 7 00000000 00000000 00008000 00000000 00000000 00000080 00000000 00000000 f99e3f20 685e32af d12893b7 d18721d8
+ars4x32 7 00000000 00000000 00ff0000 00000000 00000000 00000080 00000000 00000000 59a6b960 e2f7be6d 19708280 ec687494
+ars4x32 7 00000000 00000000 00800000 00000000 00000000 00000080 00000000 00000000 f6bf72b5 35e08dfc 79348d65 0c815c53
+ars4x32 7 00000000 00000000 ff000000 00000000 00000000 00000080 00000000 00000000 47060b19 ade1deb2 8d099901 f0ac9d2d
+ars4x32 7 00000000 00000000 80000000 00000000 00000000 00000080 00000000 00000000 0a867ee5 95ee7cc0 7f2e1cf0 c07dfba7
+ars4x32 7 00000000 00000000 00000000 000000ff 00000000 00000080 00000000 00000000 c6642d40 a7c3b4ed eec824dc 24aee808
+ars4x32 7 00000000 00000000 00000000 00000080 00000000 00000080 00000000 00000000 597ca954 4b3feb03 b167cc9c c8279e80
+ars4x32 7 00000000 00000000 00000000 0000ff00 00000000 00000080 00000000 00000000 593f9abf 9e8e17a6 0242e2e5 f369eeed
+ars4x32 7 00000000 00000000 00000000 00008000 00000000 00000080 00000000 00000000 fab1a164 05491084 8eef7174 75a535d2
+ars4x32 7 00000000 00000000 00000000 00ff0000 00000000 00000080 00000000 00000000 69bcce75 1438b313 66a61a4b 43d63282
+ars4x32 7 00000000 00000000 00000000 00800000 00000000 00000080 00000000 00000000 a4af4199 6f5a71ff 5414096c 85cb08c1
+ars4x32 7 00000000 00000000 00000000 ff000000 00000000 00000080 00000000 00000000 39646b02 29dd0ee6 e83e8167 a6d3146d
+ars4x32 7 00000000 00000000 00000000 80000000 00000000 00000080 00000000 00000000 532476b9 2bbb5430 2f6e0475 0eda4364
+ars4x32 7 886a3f24 d308a385 2e8a1913 44737003 00000000 00000080 00000000 00000000 e5f3aa72 34c9a92c ecef1d1b cf2f08f2
+ars4x32 7 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000080 00000000 00000000 f5deff66 26bdf298 18970803 1b6bedfd
+ars4x32 7 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000080 00000000 00000000 0cc5fc86 ec0fdde9 76d69653 8db392f0
+ars4x32 7 00000001 00000000 00000000 00000000 00000000 0000ff00 00000000 00000000 bf8d3d73 1d510d98 a6a565cb f41beed0
+ars4x32 7 00000100 00000000 00000000 00000000 00000000 0000ff00 00000000 00000000 e6d8c3e2 327dc9c6 a53a0526 a7a2e8c8
+ars4x32 7 00010000 00000000 00000000 00000000 00000000 0000ff00 00000000 00000000 981d0eee 0e53df72 c8c669fa ef118af6
+ars4x32 7 01000000 00000000 00000000 00000000 00000000 0000ff00 00000000 00000000 1ee3785e 8f405a41 6cf2f459 d12f65de
+ars4x32 7 00000000 00000001 00000000 00000000 00000000 0000ff00 00000000 00000000 5689240e 4a9abb71 24f810b9 a00fed86
+ars4x32 7 00000000 00000100 00000000 00000000 00000000 0000ff00 00000000 00000000 18ea4be2 8b2cd08c 56f9bdbe 494e587c
+ars4x32 7 00000000 00010000 00000000 00000000 00000000 0000ff00 00000000 00000000 92e8db17 688254d0 099cfecb 0098b9be
+ars4x32 7 00000000 01000000 00000000 00000000 00000000 0000ff00 00000000 00000000 8d849af3 bf8eb57a e3608fea 0abb0dc5
+ars4x32 7 00000000 00000000 00000001 00000000 00000000 0000ff00 00000000 00000000 f0957217 2d87c5a8 769befb8 0549d014
+ars4x32 7 00000000 00000000 00000100 00000000 00000000 0000ff00 00000000 00000000 501c3db9 1c2634bf 1338febc 662dcdb1
+ars4x32 7 00000000 00000000 00010000 00000000 00000000 0000ff00 00000000 00000000 5208560b 3029b78d 68a6398f 7ddd0893
+ars4x32 7 00000000 00000000 01000000 00000000 00000000 0000ff00 00000000 00000000 5e03fc29 b285b39d 03b9254b 6beccc1a
+ars4x32 7 00000000 00000000 00000000 00000001 00000000 0000ff00 00000000 00000000 dc4ea628 911b21d6 a19c28e2 37bba515
+ars4x32 7 00000000 00000000 00000000 00000100 00000000 0000ff00 00000000 00000000 467cdace 893c5b03 f7c0a63f b5fa6d2f
+ars4x32 7 00000000 00000000 00000000 00010000 00000000 0000ff00 00000000 00000000 f9f1edfc 22a89845 34a86319 15f2be80
+ars4x32 7 00000000 00000000 00000000 01000000 00000000 0000ff00 00000000 00000000 e95326d2 158048c8 8a64a0bf 59be8fe3
+ars4x32 7 0000ff00 00000000 00000000 00000000 00000000 0000ff00 00000000 00000000 ed0f0350 6dd365eb 1bcfa92a 4db75da2
+ars4x32 7 00008000 00000000 00000000 00000000 00000000 0000ff00 00000000 00000000 62ffa2d5 51f141be 09c2b4b8 b598b403
+ars4x32 7 00ff0000 00000000 00000000 00000000 00000000 0000ff00 00000000 00000000 811a7341 0810d368 7a944fba 8c2db187
+ars4x32 7 00800000 00000000 00000000 00000000 00000000 0000ff00 00000000 00000000 5d716d41 86d8ebee d46107c9 e689580a
+ars4x32 7 ff000000 00000000 00000000 00000000 00000000 0000ff00 00000000 00000000 30171295 a98ec36d 2e0be711 4f2d1fe9
+ars4x32 7 80000000 00000000 00000000 00000000 00000000 0000ff00 00000000 00000000 f0015e01 ca15540b 21cb5ab1 ac427fe0
+ars4x32 7 00000000 000000ff 00000000 00000000 00000000 0000ff00 00000000 00000000 b27d8ea4 4571306b 285941ad d099a2fa
+ars4x32 7 00000000 00000080 00000000 00000000 00000000 0000ff00 00000000 00000000 cf80a449 81a472b2 3f02b902 5331a873
+ars4x32 7 00000000 0000ff00 00000000 00000000 00000000 0000ff00 00000000 00000000 8c7134f8 5c101fe0 a856f137 f0b7f9e2
+ars4x32 7 00000000 00008000 00000000 00000000 00000000 0000ff00 00000000 00000000 afb74eb6 8ce42242 283c88fb c996e8f9
+ars4x32 7 00000000 00ff0000 00000000 00000000 00000000 0000ff00 00000000 00000000 de9c09e7 2c4371b2 d68598a3 fd542cd7
+ars4x32 7 00000000 00800000 00000000 00000000 00000000 0000ff00 00000000 00000000 b644c5b6 d9b39c14 df251f04 d100e3a3
+ars4x32 7 00000000 ff000000 00000000 00000000 00000000 0000ff00 00000000 00000000 60227b14 5446b9ec 29d6f141 aabf28ec
+ars4x32 7 00000000 80000000 00000000 00000000 00000000 0000ff00 00000000 00000000 4e5ff116 74319409 a2701bcf c21ac2b8
+ars4x32 7 00000000 00000000 000000ff 00000000 00000000 0000ff00 00000000 00000000 df928d9b f5ee85d1 d2e6fcff 8ff1a089
+ars4x32 7 00000000 00000000 00000080 00000000 00000000 0000ff00 00000000 00000000 655d7684 02a497cf 66472be3 51cb21ae
+ars4x32 7 00000000 00000000 0000ff00 00000000 00000000 0000ff00 00000000 00000000 385c614b cfbb23f4 d8d2e9e1 fc2d347a
+ars4x32 7 00000000 00000000 00008000 00000000 00000000 0000ff00 00000000 00000000 be160be9 d5f9377d 4ab8930d de644129
+ars4x32 7 00000000 00000000 00ff0000 00000000 00000000 0000ff00 00000000 00000000 f71ffc4b 9cab4462 5ea652a8 14c64784
+ars4x32 7 00000000 00000000 00800000 00000000 00000000 0000ff00 00000000 00000000 37283e06 0ed6eb3a b50d87d7 e634ea06
+ars4x32 7 00000000 00000000 ff000000 00000000 00000000 0000ff00 00000000 00000000 4f21b624 e648f329 2d8d00e4 e9b49f04
+ars4x32 7 00000000 00000000 80000000 00000000 00000000 0000ff00 00000000 00000000 e4a3fe71 9b5fae1e 53820c87 1c58ec32
+ars4x32 7 00000000 00000000 00000000 000000ff 00000000 0000ff00 00000000 00000000 c29db687 ff297beb c5d6bec3 cb7ae3cf
+ars4x32 7 00000000 00000000 00000000 00000080 00000000 0000ff00 00000000 00000000 21951dae 003c22e4 83d84db6 1a9de86f
+ars4x32 7 00000000 00000000 00000000 0000ff00 00000000 0000ff00 00000000 00000000 f413a989 165bdbe1 8922a860 6797a8ff
+ars4x32 7 00000000 00000000 00000000 00008000 00000000 0000ff00 00000000 00000000 e59016e4 fb6e32cd 65f00e08 30226a9b
+ars4x32 7 00000000 00000000 00000000 00ff0000 00000000 0000ff00 00000000 00000000 229fd6be 4ee85e56 716cdf41 170ff3ff
+ars4x32 7 00000000 00000000 00000000 00800000 00000000 0000ff00 00000000 00000000 b52fe913 83b547be 82862735 846a4eac
+ars4x32 7 00000000 00000000 00000000 ff000000 00000000 0000ff00 00000000 00000000 196d2d4f 8e9e6910 a5ca966a fe82b956
+ars4x32 7 00000000 00000000 00000000 80000000 00000000 0000ff00 00000000 00000000 36d5b269 f4db697b ec722e8d df2ff182
+ars4x32 7 886a3f24 d308a385 2e8a1913 44737003 00000000 0000ff00 00000000 00000000 5bd99f4a c5252d31 108e2fe8 3f2686a2
+ars4x32 7 223809a4 d0319f29 98fa2e08 896c4eec 00000000 0000ff00 00000000 00000000 39c67c1f 1d0b1143 8f481468 8a074ac7
+ars4x32 7 e6212845 7713d038 cf6654be 6c0ce934 00000000 0000ff00 00000000 00000000 f4159e57 3ab56aa9 c3494b56 be2adf75
+ars4x32 7 00000001 00000000 00000000 00000000 00000000 00008000 00000000 00000000 db9704a9 ef263fce 5db55684 c96084fb
+ars4x32 7 00000100 00000000 00000000 00000000 00000000 00008000 00000000 00000000 dfeb7041 fa1db088 b7bc68f9 33ca18ac
+ars4x32 7 00010000 00000000 00000000 00000000 00000000 00008000 00000000 00000000 31d60d2d 47f43f83 9df1d72f 181de12c
+ars4x32 7 01000000 00000000 00000000 00000000 00000000 00008000 00000000 00000000 f9c6cd53 132035ec 2e18186a 2104f1c9
+ars4x32 7 00000000 00000001 00000000 00000000 00000000 00008000 00000000 00000000 2cc737b6 58815b90 33777112 aeb6800a
+ars4x32 7 00000000 00000100 00000000 00000000 00000000 00008000 00000000 00000000 9d94df0d 2a830476 cf2e099c 8d892ff3
+ars4x32 7 00000000 00010000 00000000 00000000 00000000 00008000 00000000 00000000 748b4a17 5b72ce83 1b3f3e4b 8728a776
+ars4x32 7 00000000 01000000 00000000 00000000 00000000 00008000 00000000 00000000 7d45758d e76bf3fe a7b55753 dcaefaac
+ars4x32 7 00000000 00000000 00000001 00000000 00000000 00008000 00000000 00000000 e66b7711 3e2e1887 b0f76cd2 4f19cd7d
+ars4x32 7 00000000 00000000 00000100 00000000 00000000 00008000 00000000 00000000 749fb548 e9504acc 8f4fcea3 995dd615
+ars4x32 7 00000000 00000000 00010000 00000000 00000000 00008000 00000000 00000000 35945e10 73b8316d 4304cd97 22139e09
+ars4x32 7 00000000 00000000 01000000 00000000 00000000 00008000 00000000 00000000 c0a3584d 8851beab bb5054da 54bde8ef
+ars4x32 7 00000000 00000000 00000000 00000001 00000000 00008000 00000000 00000000 cac47e18 33b1923a 2661cd54 3912c9f6
+ars4x32 7 00000000 00000000 00000000 00000100 00000000 00008000 00000000 00000000 8eea2fca 424213b8 432d7466 eec8205e
+ars4x32 7 00000000 00000000 00000000 00010000 00000000 00008000 00000000 00000000 e14c3c29 4c914482 e4297b22 9b74a9b0
+ars4x32 7 00000000 00000000 00000000 01000000 00000000 00008000 00000000 00000000 09298383 2aacc8c9 68fab5f3 3ac39074
+ars4x32 7 0000ff00 00000000 00000000 00000000 00000000 00008000 00000000 00000000 e6fda281 e47d10f1 913e2eef bc2d749e
+ars4x32 7 00008000 00000000 00000000 00000000 00000000 00008000 00000000 00000000 85bfc2ed f03342c8 33575fab 39908df3
+ars4x32 7 00ff0000 00000000 00000000 00000000 00000000 00008000 00000000 00000000 9ba088f8 8b002507 b53e5ba5 a7f72b49
+ars4x32 7 00800000 00000000 00000000 00000000 00000000 00008000 00000000 00000000 ea1c882b b06e1f48 76e390fe 0da47a30
+ars4x32 7 ff000000 00000000 00000000 00000000 00000000 00008000 00000000 00000000 98a48736 42766b4c 51a4ab61 a91bb5c3
+ars4x32 7 80000000 00000000 00000000 00000000 00000000 00008000 00000000 00000000 4ae41923 243a9d0b bcc8f725 f287d208
+ars4x32 7 00000000 000000ff 00000000 00000000 00000000 00008000 00000000 00000000 2becea93 ace8c413 b7cc8723 a2239118
+ars4x32 7 00000000 00000080 00000000 00000000 00000000 00008000 00000000 00000000 54b29d30 73bc664f 9a9e7718 e88468d8
+ars4x32 7 00000000 0000ff00 00000000 00000000 00000000 00008000 00000000 00000000 e61b52ea 70fb72a5 f697bd49 e7aed424
+ars4x32 7 00000000 00008000 00000000 00000000 00000000 00008000 00000000 00000000 abd7dc9f 87a475f2 a2a09480 e550e8f7
+ars4x32 7 00000000 00ff0000 00000000 00000000 00000000 00008000 00000000 00000000 9b1e02fa f83ae20c 2f622aa8 3219519a
+ars4x32 7 00000000 00800000 00000000 00000000 00000000 00008000 00000000 00000000 14fba53a eb197503 a8df910f 321148c8
+ars4x32 7 00000000 ff000000 00000000 00000000 00000000 00008000 00000000 00000000 1f4105db 1c722e89 cbc6bca0 37dc36db
+ars4x32 7 00000000 80000000 00000000 00000000 00000000 00008000 00000000 00000000 1754bdfb 10ec431e d2b3eaad a00edf7a
+ars4x32 7 00000000 00000000 000000ff 00000000 00000000 00008000 00000000 00000000 f6fe2fd1 a5178952 af6b93b0 0bd11cf2
+ars4x32 7 00000000 00000000 00000080 00000000 00000000 00008000 00000000 00000000 d03063ae dd50c426 1acbb6a0 b0554b47
+ars4x32 7 00000000 00000000 0000ff00 00000000 00000000 00008000 00000000 00000000 2f8b0bf2 429ab5a5 a016a59e d471538a
+ars4x32 7 00000000 00000000 00008000 00000000 00000000 00008000 00000000 00000000 71f7c393 8f48b5e7 299ddc6a 55fcaa6c
+ars4x32 7 00000000 00000000 00ff0000 00000000 00000000 00008000 00000000 00000000 a71b7b5d 578afb73 0e7392db 96b694ce
+ars4x32 7 00000000 00000000 00800000 00000000 00000000 00008000 00000000 00000000 5a441f14 c83ec7d0 753ac769 38073516
+ars4x32 7 00000000 00000000 ff000000 00000000 00000000 00008000 00000000 00000000 e4e6f8dc f53de139 45effab1 dc0996a6
+ars4x32 7 00000000 00000000 80000000 00000000 00000000 00008000 00000000 00000000 50cd0a10 c52757d4 7ff34684 bb68de39
+ars4x32 7 00000000 00000000 00000000 000000ff 00000000 00008000 00000000 00000000 215ef309 6f0de2af b4b85414 7b736785
+ars4x32 7 00000000 00000000 00000000 00000080 00000000 00008000 00000000 00000000 8731b162 bd29d6fa 00f59b48 678bc88d
+ars4x32 7 00000000 00000000 00000000 0000ff00 00000000 00008000 00000000 00000000 c4606bde ddd5ed0c 5c9bc1ff 5ad36111
+ars4x32 7 00000000 00000000 00000000 00008000 00000000 00008000 00000000 00000000 cdee80d2 29fde63c 08b24838 4bdd7d5b
+ars4x32 7 00000000 00000000 00000000 00ff0000 00000000 00008000 00000000 00000000 69f07cb4 3daad6ee 23d91210 dd331958
+ars4x32 7 00000000 00000000 00000000 00800000 00000000 00008000 00000000 00000000 dd083841 75da0960 dfed0370 f375191b
+ars4x32 7 00000000 00000000 00000000 ff000000 00000000 00008000 00000000 00000000 dfe5fc51 5c5afcd7 318a4734 6cac06cb
+ars4x32 7 00000000 00000000 00000000 80000000 00000000 00008000 00000000 00000000 0addcc4e 9a41fb4d b703f735 84e16f6c
+ars4x32 7 886a3f24 d308a385 2e8a1913 44737003 00000000 00008000 00000000 00000000 06cf3877 8a415845 dd99e388 407e5223
+ars4x32 7 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00008000 00000000 00000000 de6ea0e8 e8222e4f 1c21646b b734df48
+ars4x32 7 e6212845 7713d038 cf6654be 6c0ce934 00000000 00008000 00000000 00000000 dd143117 e8d7dca6 e5bed8c0 b263b96d
+ars4x32 7 00000001 00000000 00000000 00000000 00000000 00ff0000 00000000 00000000 22f2e0d8 119db813 ef467231 87adf624
+ars4x32 7 00000100 00000000 00000000 00000000 00000000 00ff0000 00000000 00000000 591be312 848da854 bc940af1 67bc8788
+ars4x32 7 00010000 00000000 00000000 00000000 00000000 00ff0000 00000000 00000000 2590446f 41ed4294 1fabf395 9992d4d0
+ars4x32 7 01000000 00000000 00000000 00000000 00000000 00ff0000 00000000 00000000 cb66370c 08d192e8 bb3e9866 aa7f9e33
+ars4x32 7 00000000 00000001 00000000 00000000 00000000 00ff0000 00000000 00000000 7a9b0472 38d53db3 9583ba65 84d57212
+ars4x32 7 00000000 00000100 00000000 00000000 00000000 00ff0000 00000000 00000000 29280b3e 2d6c8fbd 994dfe1c 593aeaa6
+ars4x32 7 00000000 00010000 00000000 00000000 00000000 00ff0000 00000000 00000000 dd008448 cd16543a 30df7d0f 3039bd79
+ars4x32 7 00000000 01000000 00000000 00000000 00000000 00ff0000 00000000 00000000 9f11a9e6 e603f66f 5a57ee92 93d9af01
+ars4x32 7 00000000 00000000 00000001 00000000 00000000 00ff0000 00000000 00000000 1345a1be 0f8a5c3f d1ea8039 4abbac6d
+ars4x32 7 00000000 00000000 00000100 00000000 00000000 00ff0000 00000000 00000000 94d5bec7 b9b0e28d d20cc7e4 af8f8d86
+ars4x32 7 00000000 00000000 00010000 00000000 00000000 00ff0000 00000000 00000000 0693f3d8 c0b81f20 3788c729 9cea29c9
+ars4x32 7 00000000 00000000 01000000 00000000 00000000 00ff0000 00000000 00000000 53fa683a f547a8ba 302b9e54 0558a385
+ars4x32 7 00000000 00000000 00000000 00000001 00000000 00ff0000 00000000 00000000 d20286b1 15b4c8c5 d23c8659 4710be03
+ars4x32 7 00000000 00000000 00000000 00000100 00000000 00ff0000 00000000 00000000 b6b46794 9185795e edd8901e 40d74d41
+ars4x32 7 00000000 00000000 00000000 00010000 00000000 00ff0000 00000000 00000000 34732fd7 ae767bd9 04cebe75 92815953
+ars4x32 7 00000000 00000000 00000000 01000000 00000000 00ff0000 00000000 00000000 b7326f81 17aaf702 caed628d a909f2a4
+ars4x32 7 0000ff00 00000000 00000000 00000000 00000000 00ff0000 00000000 00000000 7b09863f 3274ceb9 e8ca6436 cd9fa04c
+ars4x32 7 00008000 00000000 00000000 00000000 00000000 00ff0000 00000000 00000000 33044882 ca7f0d85 a60f44fc 5b4891ce
+ars4x32 7 00ff0000 00000000 00000000 00000000 00000000 00ff0000 00000000 00000000 9dc3299a 212f0f0d 88c5f4a4 906b734e
+ars4x32 7 00800000 00000000 00000000 00000000 00000000 00ff0000 00000000 00000000 9556fc2f 7afc82b3 3bc44611 4351e66d
+ars4x32 7 ff000000 00000000 00000000 00000000 00000000 00ff0000 00000000 00000000 dfce62c3 d3c5a2c0 4c1d6737 862d9293
+ars4x32 7 80000000 00000000 00000000 00000000 00000000 00ff0000 00000000 00000000 f4f0b118 144c2c2f 26b39231 ea14c7b9
+ars4x32 7 00000000 000000ff 00000000 00000000 00000000 00ff0000 00000000 00000000 b245315d bcf6c91d 754a7c14 2565e48f
+ars4x32 7 00000000 00000080 00000000 00000000 00000000 00ff0000 00000000 00000000 752203b4 ae13b9a0 e31fec08 eb692cef
+ars4x32 7 00000000 0000ff00 00000000 00000000 00000000 00ff0000 00000000 00000000 09df70d5 40f8d185 48efe5f7 ee1108a0
+ars4x32 7 00000000 00008000 00000000 00000000 00000000 00ff0000 00000000 00000000 136a420c b7181b55 deafcbae 1d5ee1a6
+ars4x32 7 00000000 00ff0000 00000000 00000000 00000000 00ff0000 00000000 00000000 a0d5b02b 733a381c 450b339f 7cff8df1
+ars4x32 7 00000000 00800000 00000000 00000000 00000000 00ff0000 00000000 00000000 c8926a31 a643a5b0 43107ff4 32072bc9
+ars4x32 7 00000000 ff000000 00000000 00000000 00000000 00ff0000 00000000 00000000 a58e8a68 a6b42ff4 258b5e32 60b56a1c
+ars4x32 7 00000000 80000000 00000000 00000000 00000000 00ff0000 00000000 00000000 fcee65a1 f4d681ca 3505111a 9a6acf37
+ars4x32 7 00000000 00000000 000000ff 00000000 00000000 00ff0000 00000000 00000000 b0f43b3b 1c31e2b7 67e8de1c 31a02555
+ars4x32 7 00000000 00000000 00000080 00000000 00000000 00ff0000 00000000 00000000 ecc48ee5 981d2b49 fd7a22b9 ec415eca
+ars4x32 7 00000000 00000000 0000ff00 00000000 00000000 00ff0000 00000000 00000000 4970651e 85676890 def6e22c 4f7cfaec
+ars4x32 7 00000000 00000000 00008000 00000000 00000000 00ff0000 00000000 00000000 5d3c6b96 d38d2378 b276ece6 f5fcafda
+ars4x32 7 00000000 00000000 00ff0000 00000000 00000000 00ff0000 00000000 00000000 9a8d3698 ab0ef629 959e5d2c 56c0b421
+ars4x32 7 00000000 00000000 00800000 00000000 00000000 00ff0000 00000000 00000000 9a344ab0 8f692a72 859b7958 da1b6e56
+ars4x32 7 00000000 00000000 ff000000 00000000 00000000 00ff0000 00000000 00000000 db668406 9292601c 3f17b216 7d4a1edf
+ars4x32 7 00000000 00000000 80000000 00000000 00000000 00ff0000 00000000 00000000 fcbbbf78 df5a0eb5 d3db5451 cfc752a7
+ars4x32 7 00000000 00000000 00000000 000000ff 00000000 00ff0000 00000000 00000000 23810f43 e8b16515 aa4c4b07 c1ba936e
+ars4x32 7 00000000 00000000 00000000 00000080 00000000 00ff0000 00000000 00000000 9577f463 e0444f19 420d39d5 df310656
+ars4x32 7 00000000 00000000 00000000 0000ff00 00000000 00ff0000 00000000 00000000 c87afd4b 878b17e4 058a30a0 80f8c3c8
+ars4x32 7 00000000 00000000 00000000 00008000 00000000 00ff0000 00000000 00000000 865e2af9 48b7f68a 41bd6dfa 342ba0f8
+ars4x32 7 00000000 00000000 00000000 00ff0000 00000000 00ff0000 00000000 00000000 2ea49763 e91477bf aa5d51d1 74e9517d
+ars4x32 7 00000000 00000000 00000000 00800000 00000000 00ff0000 00000000 00000000 d432cdeb d7a03de6 e6da11f1 7acb2a00
+ars4x32 7 00000000 00000000 00000000 ff000000 00000000 00ff0000 00000000 00000000 e6d53827 4fc4e478 71542a8d 1f3bc6a8
+ars4x32 7 00000000 00000000 00000000 80000000 00000000 00ff0000 00000000 00000000 e3847d0b e65bbbb4 5bb78b81 94a1ffa8
+ars4x32 7 886a3f24 d308a385 2e8a1913 44737003 00000000 00ff0000 00000000 00000000 e7d6bcdd 45051fe4 252629fc bf659cc5
+ars4x32 7 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00ff0000 00000000 00000000 41f95399 e7959014 d2b9e413 1f39e87e
+ars4x32 7 e6212845 7713d038 cf6654be 6c0ce934 00000000 00ff0000 00000000 00000000 c2b31aea d398aa7a 3b1031e1 bc68c109
+ars4x32 7 00000001 00000000 00000000 00000000 00000000 00800000 00000000 00000000 a00cec5b ca487f61 359cf73f 70d21378
+ars4x32 7 00000100 00000000 00000000 00000000 00000000 00800000 00000000 00000000 4ec9a531 01d54c62 bf5bb168 3936a9dc
+ars4x32 7 00010000 00000000 00000000 00000000 00000000 00800000 00000000 00000000 88d2d6f8 39b8dfdf 2c4b698c 1777afa9
+ars4x32 7 01000000 00000000 00000000 00000000 00000000 00800000 00000000 00000000 7420b78f 0c252bbd 9c15e937 310f3172
+ars4x32 7 00000000 00000001 00000000 00000000 00000000 00800000 00000000 00000000 1ef12f67 a60fe50b 69094d0d 8bff4098
+ars4x32 7 00000000 00000100 00000000 00000000 00000000 00800000 00000000 00000000 8efc8373 d5525958 00b1ca78 1a00468b
+ars4x32 7 00000000 00010000 00000000 00000000 00000000 00800000 00000000 00000000 4c8af3c6 287a3960 bc819b5c ccd70ef3
+ars4x32 7 00000000 01000000 00000000 00000000 00000000 00800000 00000000 00000000 be01d2cb bcb36836 6d07da5d 7b5f5131
+ars4x32 7 00000000 00000000 00000001 00000000 00000000 00800000 00000000 00000000 f80acd07 8c3fad47 a43a6c1d 69d4c38b
+ars4x32 7 00000000 00000000 00000100 00000000 00000000 00800000 00000000 00000000 0366f28f b42cc3d2 c48f4210 fc323078
+ars4x32 7 00000000 00000000 00010000 00000000 00000000 00800000 00000000 00000000 b939bdc3 f022b43d ad77aeb2 9873ef1e
+ars4x32 7 00000000 00000000 01000000 00000000 00000000 00800000 00000000 00000000 8348845d 3d6f6b77 5d6c5431 f41b1d32
+ars4x32 7 00000000 00000000 00000000 00000001 00000000 00800000 00000000 00000000 1a0d422b a516883d 2c9cbcbd 2e3e99aa
+ars4x32 7 00000000 00000000 00000000 00000100 00000000 00800000 00000000 00000000 d86f62b6 f25abfd6 d3552a3a 66b91402
+ars4x32 7 00000000 00000000 00000000 00010000 00000000 00800000 00000000 00000000 a7ec3af6 70d67a95 b65e8dd4 ea222f76
+ars4x32 7 00000000 00000000 00000000 01000000 00000000 00800000 00000000 00000000 ce5df8a5 01643578 caa889a5 e2705fd6
+ars4x32 7 0000ff00 00000000 00000000 00000000 00000000 00800000 00000000 00000000 3c6ad46b e7e1f139 39fbf5ef 6f1a3aea
+ars4x32 7 00008000 00000000 00000000 00000000 00000000 00800000 00000000 00000000 234f33d3 4fa04e77 411d7035 39268f19
+ars4x32 7 00ff0000 00000000 00000000 00000000 00000000 00800000 00000000 00000000 0b14f1c3 cd9af14d 539e70e4 79825055
+ars4x32 7 00800000 00000000 00000000 00000000 00000000 00800000 00000000 00000000 40e73acc e9b3b945 10196cce f368f24b
+ars4x32 7 ff000000 00000000 00000000 00000000 00000000 00800000 00000000 00000000 836ff74a 9c70652a fea219a9 8b74d93f
+ars4x32 7 80000000 00000000 00000000 00000000 00000000 00800000 00000000 00000000 0a5591da 22b02386 4d28d374 836fa930
+ars4x32 7 00000000 000000ff 00000000 00000000 00000000 00800000 00000000 00000000 e38da49a 17af6e25 348ceb8f ab48a1a1
+ars4x32 7 00000000 00000080 00000000 00000000 00000000 00800000 00000000 00000000 aebfe231 846aeb9c fa9738a5 f6f29436
+ars4x32 7 00000000 0000ff00 00000000 00000000 00000000 00800000 00000000 00000000 347096a3 b95cdaea 860c65c8 6bd32e14
+ars4x32 7 00000000 00008000 00000000 00000000 00000000 00800000 00000000 00000000 b5d23f22 30beb254 e19e5180 0876af03
+ars4x32 7 00000000 00ff0000 00000000 00000000 00000000 00800000 00000000 00000000 7622487e bfcbebc8 d543d53a 32525da0
+ars4x32 7 00000000 00800000 00000000 00000000 00000000 00800000 00000000 00000000 f110591a e77c10d2 131fd7c5 7866db43
+ars4x32 7 00000000 ff000000 00000000 00000000 00000000 00800000 00000000 00000000 30a66ecc ae6b7e48 74bd80d8 76b29af8
+ars4x32 7 00000000 80000000 00000000 00000000 00000000 00800000 00000000 00000000 58d0bb84 6706c78b 45009e22 e2785f61
+ars4x32 7 00000000 00000000 000000ff 00000000 00000000 00800000 00000000 00000000 4c61bfe6 7c955151 e8001ec5 d0e615d8
+ars4x32 7 00000000 00000000 00000080 00000000 00000000 00800000 00000000 00000000 6f3ad05a f461f745 93857d8c f4905c98
+ars4x32 7 00000000 00000000 0000ff00 00000000 00000000 00800000 00000000 00000000 3bd3b603 e4d94cd7 26d0b77f 02c0d7a4
+ars4x32 7 00000000 00000000 00008000 00000000 00000000 00800000 00000000 00000000 d157ff8d 0d02e8e2 684207f3 b9bcf112
+ars4x32 7 00000000 00000000 00ff0000 00000000 00000000 00800000 00000000 00000000 339e5c56 076e7a8f 14c0c415 b969eada
+ars4x32 7 00000000 00000000 00800000 00000000 00000000 00800000 00000000 00000000 37433a96 db919da4 81251cf1 f4e33e0a
+ars4x32 7 00000000 00000000 ff000000 00000000 00000000 00800000 00000000 00000000 f8347f15 c53d6bd6 d45169e6 66d75179
+ars4x32 7 00000000 00000000 80000000 00000000 00000000 00800000 00000000 00000000 df6f61ec c24802e5 9ac4c23b 567b0462
+ars4x32 7 00000000 00000000 00000000 000000ff 00000000 00800000 00000000 00000000 75201044 9748cf2d 2863ce41 abc2f9d6
+ars4x32 7 00000000 00000000 00000000 00000080 00000000 00800000 00000000 00000000 4e472868 2032a8ef 57b542a6 87a7ba77
+ars4x32 7 00000000 00000000 00000000 0000ff00 00000000 00800000 00000000 00000000 11dc900c 177c3c50 ff18eb90 1ae824ac
+ars4x32 7 00000000 00000000 00000000 00008000 00000000 00800000 00000000 00000000 d96eb7d0 2278a9f7 1cc3be75 2c605110
+ars4x32 7 00000000 00000000 00000000 00ff0000 00000000 00800000 00000000 00000000 d807febf f989c784 c403114d 4216b1ee
+ars4x32 7 00000000 00000000 00000000 00800000 00000000 00800000 00000000 00000000 6311b004 c28fb046 5a200f83 bb7d751d
+ars4x32 7 00000000 00000000 00000000 ff000000 00000000 00800000 00000000 00000000 26188d57 412bf765 4600984a b9c9d357
+ars4x32 7 00000000 00000000 00000000 80000000 00000000 00800000 00000000 00000000 844374b9 abff9a5f 96815949 b22f6961
+ars4x32 7 886a3f24 d308a385 2e8a1913 44737003 00000000 00800000 00000000 00000000 ffac52fa 1f7d34f9 a9738dfc 47759b16
+ars4x32 7 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00800000 00000000 00000000 fbcf1b8f 4e82c5d7 124478f1 bf5d6237
+ars4x32 7 e6212845 7713d038 cf6654be 6c0ce934 00000000 00800000 00000000 00000000 d563c78b 35d4deef f9dff8ba fa4c3faa
+ars4x32 7 00000001 00000000 00000000 00000000 00000000 ff000000 00000000 00000000 3fff9d46 5b0693fe a650b70e f7364259
+ars4x32 7 00000100 00000000 00000000 00000000 00000000 ff000000 00000000 00000000 c2fa97cf 135f3c99 5e5827b4 9f23e516
+ars4x32 7 00010000 00000000 00000000 00000000 00000000 ff000000 00000000 00000000 595f9ac4 d3ce4ef5 6e35b798 05625328
+ars4x32 7 01000000 00000000 00000000 00000000 00000000 ff000000 00000000 00000000 440ab580 5e2cb77e 20834e4f 07c5cda9
+ars4x32 7 00000000 00000001 00000000 00000000 00000000 ff000000 00000000 00000000 5cad76b4 2d10781c 88281342 86f4b2ff
+ars4x32 7 00000000 00000100 00000000 00000000 00000000 ff000000 00000000 00000000 0baef30c 35fd70c5 0405f817 7b2ff157
+ars4x32 7 00000000 00010000 00000000 00000000 00000000 ff000000 00000000 00000000 91c7c79a a6c35ec2 c68d26e3 1d67d346
+ars4x32 7 00000000 01000000 00000000 00000000 00000000 ff000000 00000000 00000000 6a06e692 9dc01cf5 643390ba dcf9a4e1
+ars4x32 7 00000000 00000000 00000001 00000000 00000000 ff000000 00000000 00000000 2846ce5d 2d5c5293 69ef3bf5 14eda2ee
+ars4x32 7 00000000 00000000 00000100 00000000 00000000 ff000000 00000000 00000000 073bcfeb c7511a06 e6e172ad 04256d1b
+ars4x32 7 00000000 00000000 00010000 00000000 00000000 ff000000 00000000 00000000 7eedd694 783e76ea a54f18ce 73358e97
+ars4x32 7 00000000 00000000 01000000 00000000 00000000 ff000000 00000000 00000000 ce6d599c a1e8dba1 c792f716 e79f5e37
+ars4x32 7 00000000 00000000 00000000 00000001 00000000 ff000000 00000000 00000000 9492bd38 cba5a7d4 b2f61619 c4d1d9ac
+ars4x32 7 00000000 00000000 00000000 00000100 00000000 ff000000 00000000 00000000 2f993455 e8b24e8a 03463cba 76d284ee
+ars4x32 7 00000000 00000000 00000000 00010000 00000000 ff000000 00000000 00000000 98675030 cdf6a1e1 ae7c3e3e 75852eb4
+ars4x32 7 00000000 00000000 00000000 01000000 00000000 ff000000 00000000 00000000 8b15c94a 9e1e7937 dffda9ac dccd4d48
+ars4x32 7 0000ff00 00000000 00000000 00000000 00000000 ff000000 00000000 00000000 b22116ab 9fe03ef6 c537818f e47727e0
+ars4x32 7 00008000 00000000 00000000 00000000 00000000 ff000000 00000000 00000000 8d56c361 b300372f fb93f6d9 db48a513
+ars4x32 7 00ff0000 00000000 00000000 00000000 00000000 ff000000 00000000 00000000 d5169544 537df03d 51194829 50f20d3f
+ars4x32 7 00800000 00000000 00000000 00000000 00000000 ff000000 00000000 00000000 d262b945 f3d67451 2580e1f1 bd4a686d
+ars4x32 7 ff000000 00000000 00000000 00000000 00000000 ff000000 00000000 00000000 e869c6ed 0a359231 fe48009f f52ec3dc
+ars4x32 7 80000000 00000000 00000000 00000000 00000000 ff000000 00000000 00000000 5e06823f c5938edd 13af24a0 27958c66
+ars4x32 7 00000000 000000ff 00000000 00000000 00000000 ff000000 00000000 00000000 c99e41d0 33024c8d fe9d5339 a63a5f24
+ars4x32 7 00000000 00000080 00000000 00000000 00000000 ff000000 00000000 00000000 3290af6f db2d7d1c bcd8a1a8 3e8bb439
+ars4x32 7 00000000 0000ff00 00000000 00000000 00000000 ff000000 00000000 00000000 129ea6bb 5d08d671 f62ef596 cad420a5
+ars4x32 7 00000000 00008000 00000000 00000000 00000000 ff000000 00000000 00000000 bf9ecf25 dfe7fe89 62867a95 2683b953
+ars4x32 7 00000000 00ff0000 00000000 00000000 00000000 ff000000 00000000 00000000 03bc9cda eaaee763 88c08cdf 7719a09c
+ars4x32 7 00000000 00800000 00000000 00000000 00000000 ff000000 00000000 00000000 ad437fdc 6976af30 f4ec20b6 dfc29017
+ars4x32 7 00000000 ff000000 00000000 00000000 00000000 ff000000 00000000 00000000 eb301301 290c523c 45eee9c5 d64bf7a8
+ars4x32 7 00000000 80000000 00000000 00000000 00000000 ff000000 00000000 00000000 3a342e30 d00ac78f 5b41b3e7 bbb4d824
+ars4x32 7 00000000 00000000 000000ff 00000000 00000000 ff000000 00000000 00000000 9de8ac05 ce583257 b2c5ef4f a57f7c76
+ars4x32 7 00000000 00000000 00000080 00000000 00000000 ff000000 00000000 00000000 0a2ad7b3 b4d4d02f a71b913e 274cc7ad
+ars4x32 7 00000000 00000000 0000ff00 00000000 00000000 ff000000 00000000 00000000 a5d2501c 04dc2b1d e116388c d560e1d9
+ars4x32 7 00000000 00000000 00008000 00000000 00000000 ff000000 00000000 00000000 070a7bb7 d1a2432e bec1284d b10c0250
+ars4x32 7 00000000 00000000 00ff0000 00000000 00000000 ff000000 00000000 00000000 3cbceeed 85a455f6 136cda60 453b735f
+ars4x32 7 00000000 00000000 00800000 00000000 00000000 ff000000 00000000 00000000 0aa40388 0316fcda acbc1c87 bc639a3e
+ars4x32 7 00000000 00000000 ff000000 00000000 00000000 ff000000 00000000 00000000 2a77b2df 5082a5a5 b5527d9f f113ea2e
+ars4x32 7 00000000 00000000 80000000 00000000 00000000 ff000000 00000000 00000000 d052815c 62de4af5 c0d26b42 c4aeb933
+ars4x32 7 00000000 00000000 00000000 000000ff 00000000 ff000000 00000000 00000000 7d751d2d 8dc0e76f 275d7b8b df4aa40a
+ars4x32 7 00000000 00000000 00000000 00000080 00000000 ff000000 00000000 00000000 681d9e43 febf6b94 4b026a8d ee1485e9
+ars4x32 7 00000000 00000000 00000000 0000ff00 00000000 ff000000 00000000 00000000 00041b8f f701647b 5444ac32 d89fb67c
+ars4x32 7 00000000 00000000 00000000 00008000 00000000 ff000000 00000000 00000000 e9858209 2bc56022 16004c89 85bc27b4
+ars4x32 7 00000000 00000000 00000000 00ff0000 00000000 ff000000 00000000 00000000 4158a0f1 f4c90b15 c1cb18d3 63d6cf74
+ars4x32 7 00000000 00000000 00000000 00800000 00000000 ff000000 00000000 00000000 3c663c9d 72ec3fe3 2dbd3c61 13009c67
+ars4x32 7 00000000 00000000 00000000 ff000000 00000000 ff000000 00000000 00000000 c4a83fc3 68898afd 597344cf 21084208
+ars4x32 7 00000000 00000000 00000000 80000000 00000000 ff000000 00000000 00000000 7fab47bb fcd840f2 cda838c4 6ae55be9
+ars4x32 7 886a3f24 d308a385 2e8a1913 44737003 00000000 ff000000 00000000 00000000 a0473fb6 d208106d 8b769b3a 24d4f27b
+ars4x32 7 223809a4 d0319f29 98fa2e08 896c4eec 00000000 ff000000 00000000 00000000 844c06ae f167b931 f701a614 7ec8b726
+ars4x32 7 e6212845 7713d038 cf6654be 6c0ce934 00000000 ff000000 00000000 00000000 37bd10fd 09a717ef 3b52e5fa 4a6937c2
+ars4x32 7 00000001 00000000 00000000 00000000 00000000 80000000 00000000 00000000 5f0ada1b bd050790 dcaf5e38 298a17b8
+ars4x32 7 00000100 00000000 00000000 00000000 00000000 80000000 00000000 00000000 5773f53d c2e1b603 87014c86 e34ec098
+ars4x32 7 00010000 00000000 00000000 00000000 00000000 80000000 00000000 00000000 414196fd 2b2dc69e 78149e7c 45b5f326
+ars4x32 7 01000000 00000000 00000000 00000000 00000000 80000000 00000000 00000000 1f875ed9 ac5906df 12e5f6a7 e233bfd1
+ars4x32 7 00000000 00000001 00000000 00000000 00000000 80000000 00000000 00000000 dcfc2a48 f8ba776a 5c4a2812 8a16d7be
+ars4x32 7 00000000 00000100 00000000 00000000 00000000 80000000 00000000 00000000 2a3576d3 6629f24d 13f14b9e 3d2ca84e
+ars4x32 7 00000000 00010000 00000000 00000000 00000000 80000000 00000000 00000000 3e16e8a7 fc4d8a08 0a01ac1e 1af11bec
+ars4x32 7 00000000 01000000 00000000 00000000 00000000 80000000 00000000 00000000 96593166 0238eabc bbebf20f 0f504522
+ars4x32 7 00000000 00000000 00000001 00000000 00000000 80000000 00000000 00000000 8af3b216 dd7acd2b a3e33e1e 78b046e4
+ars4x32 7 00000000 00000000 00000100 00000000 00000000 80000000 00000000 00000000 9a054567 fff1d369 15556300 cf32fa94
+ars4x32 7 00000000 00000000 00010000 00000000 00000000 80000000 00000000 00000000 f5a60b19 7d5e3da6 84d86206 9e1853e9
+ars4x32 7 00000000 00000000 01000000 00000000 00000000 80000000 00000000 00000000 94c67275 4b58d229 ed89be2b 74d861c9
+ars4x32 7 00000000 00000000 00000000 00000001 00000000 80000000 00000000 00000000 63a9b261 caeb28c8 2ef06ebd f2e5792a
+ars4x32 7 00000000 00000000 00000000 00000100 00000000 80000000 00000000 00000000 38f259c6 82cd5ca0 88012938 1b5e554e
+ars4x32 7 00000000 00000000 00000000 00010000 00000000 80000000 00000000 00000000 f2573b0c 7adc711e 19ce7393 e9f7de3e
+ars4x32 7 00000000 00000000 00000000 01000000 00000000 80000000 00000000 00000000 6b8acec2 ead9cca3 7fa50710 5d15e514
+ars4x32 7 0000ff00 00000000 00000000 00000000 00000000 80000000 00000000 00000000 8c7993f1 e3203144 84cab4b5 72020dbb
+ars4x32 7 00008000 00000000 00000000 00000000 00000000 80000000 00000000 00000000 42d7f77d f086fc2e 3e73a287 c07d7ebc
+ars4x32 7 00ff0000 00000000 00000000 00000000 00000000 80000000 00000000 00000000 6bce9267 5e248dac a2ed0ce5 aef8fd8f
+ars4x32 7 00800000 00000000 00000000 00000000 00000000 80000000 00000000 00000000 4472cb80 f16e7a81 1ae5d21e 5f55c422
+ars4x32 7 ff000000 00000000 00000000 00000000 00000000 80000000 00000000 00000000 aa8c96e7 7081d2fc 29cae09f 98911fa3
+ars4x32 7 80000000 00000000 00000000 00000000 00000000 80000000 00000000 00000000 edff19de 058ba50c 77d23430 a67d3096
+ars4x32 7 00000000 000000ff 00000000 00000000 00000000 80000000 00000000 00000000 249e0ed9 233a0ad4 1eb99295 52e5de17
+ars4x32 7 00000000 00000080 00000000 00000000 00000000 80000000 00000000 00000000 5cbc4013 a507ff7e 19c0ec9a 98a429e1
+ars4x32 7 00000000 0000ff00 00000000 00000000 00000000 80000000 00000000 00000000 b82754b5 f5be7d8e 4ffa8942 52e2a259
+ars4x32 7 00000000 00008000 00000000 00000000 00000000 80000000 00000000 00000000 c1dd067d 61dfed2a 9fa61288 846d0e65
+ars4x32 7 00000000 00ff0000 00000000 00000000 00000000 80000000 00000000 00000000 5eedd38e daf2e6c6 efcbf785 0773d069
+ars4x32 7 00000000 00800000 00000000 00000000 00000000 80000000 00000000 00000000 bebaae38 bf214df2 00b1720c 42177b77
+ars4x32 7 00000000 ff000000 00000000 00000000 00000000 80000000 00000000 00000000 23e1c82a 5d9a8441 4d3274da 8db3ac26
+ars4x32 7 00000000 80000000 00000000 00000000 00000000 80000000 00000000 00000000 1612e16c 8ce98dcd 39b1bd24 45addfa9
+ars4x32 7 00000000 00000000 000000ff 00000000 00000000 80000000 00000000 00000000 370cafef 3f7e2898 73255314 2a49538b
+ars4x32 7 00000000 00000000 00000080 00000000 00000000 80000000 00000000 00000000 2d984e0c 528466c2 a95bee17 d09bc557
+ars4x32 7 00000000 00000000 0000ff00 00000000 00000000 80000000 00000000 00000000 04c3d191 76c5b6f6 15e575df 1579abf0
+ars4x32 7 00000000 00000000 00008000 00000000 00000000 80000000 00000000 00000000 cfb9c656 406d2556 357a2e8c bea5ee32
+ars4x32 7 00000000 00000000 00ff0000 00000000 00000000 80000000 00000000 00000000 18978a0b 3832c66a 2e2d7273 683e77c6
+ars4x32 7 00000000 00000000 00800000 00000000 00000000 80000000 00000000 00000000 1234972a 25fa70fa 4da76fce 53941394
+ars4x32 7 00000000 00000000 ff000000 00000000 00000000 80000000 00000000 00000000 a8f77508 14259e2b 210358b5 98cd4738
+ars4x32 7 00000000 00000000 80000000 00000000 00000000 80000000 00000000 00000000 8976de9d 368c66d2 ba5f8bbf f4881147
+ars4x32 7 00000000 00000000 00000000 000000ff 00000000 80000000 00000000 00000000 aa9648cd d926107f 4ef3fb1c 3e9b4cff
+ars4x32 7 00000000 00000000 00000000 00000080 00000000 80000000 00000000 00000000 7de770ee 7198b212 30e3fb87 1bf1945e
+ars4x32 7 00000000 00000000 00000000 0000ff00 00000000 80000000 00000000 00000000 00e0ac25 c7ceb630 cdd4686d fa763bdf
+ars4x32 7 00000000 00000000 00000000 00008000 00000000 80000000 00000000 00000000 43b3b752 af25c906 b1b4c5f5 a060418e
+ars4x32 7 00000000 00000000 00000000 00ff0000 00000000 80000000 00000000 00000000 198dd040 e1df7ce3 2a02dab1 d3af6e19
+ars4x32 7 00000000 00000000 00000000 00800000 00000000 80000000 00000000 00000000 600c5000 a1452641 eb1394d7 3afe4cb5
+ars4x32 7 00000000 00000000 00000000 ff000000 00000000 80000000 00000000 00000000 00966e72 fd68133c 2fd0ca6e be23b3bd
+ars4x32 7 00000000 00000000 00000000 80000000 00000000 80000000 00000000 00000000 d4a2cb91 1091cb54 cf890039 ddda004f
+ars4x32 7 886a3f24 d308a385 2e8a1913 44737003 00000000 80000000 00000000 00000000 bbc2523d e460d59d 48e1dd0e 60e28a17
+ars4x32 7 223809a4 d0319f29 98fa2e08 896c4eec 00000000 80000000 00000000 00000000 cfcb3264 9ca26dd6 94e27470 4c925066
+ars4x32 7 e6212845 7713d038 cf6654be 6c0ce934 00000000 80000000 00000000 00000000 6735321b 61e112c7 afee373e 46f1395e
+ars4x32 7 00000001 00000000 00000000 00000000 00000000 00000000 000000ff 00000000 dd64a2ff 5104730d c0ae788d a01d6a2b
+ars4x32 7 00000100 00000000 00000000 00000000 00000000 00000000 000000ff 00000000 e70ebc93 76c6aad5 80ad83b3 62d2754f
+ars4x32 7 00010000 00000000 00000000 00000000 00000000 00000000 000000ff 00000000 7a62d1cc de10fa0e 0d8b1e8a 32776f76
+ars4x32 7 01000000 00000000 00000000 00000000 00000000 00000000 000000ff 00000000 055823a1 c06b9761 f9bd3fc2 e878afc5
+ars4x32 7 00000000 00000001 00000000 00000000 00000000 00000000 000000ff 00000000 37cd795c 1ccc8adf a68d762e 553c7112
+ars4x32 7 00000000 00000100 00000000 00000000 00000000 00000000 000000ff 00000000 03b8471b fb53325a 12d2e358 1c5da90d
+ars4x32 7 00000000 00010000 00000000 00000000 00000000 00000000 000000ff 00000000 a78e262c 3b1ba467 3ba757f4 e692d21c
+ars4x32 7 00000000 01000000 00000000 00000000 00000000 00000000 000000ff 00000000 7665303b 4e3555cb 36df84ad 2fb325c6
+ars4x32 7 00000000 00000000 00000001 00000000 00000000 00000000 000000ff 00000000 364b771f 291c0c78 13a1aa88 c494c221
+ars4x32 7 00000000 00000000 00000100 00000000 00000000 00000000 000000ff 00000000 7c36b039 692e4b12 50a2349c 85410d4d
+ars4x32 7 00000000 00000000 00010000 00000000 00000000 00000000 000000ff 00000000 9964202c e48b3418 b31c5ede d22677c6
+ars4x32 7 00000000 00000000 01000000 00000000 00000000 00000000 000000ff 00000000 1883bb94 b1301868 24a80f7e 285b3455
+ars4x32 7 00000000 00000000 00000000 00000001 00000000 00000000 000000ff 00000000 f83701ba 2054306a 41cc63a4 c107d44d
+ars4x32 7 00000000 00000000 00000000 00000100 00000000 00000000 000000ff 00000000 e7ec839f 21a2f540 431d62b9 dc559e31
+ars4x32 7 00000000 00000000 00000000 00010000 00000000 00000000 000000ff 00000000 193c9ee3 710ca9c0 4d2a0071 2bfd6a4e
+ars4x32 7 00000000 00000000 00000000 01000000 00000000 00000000 000000ff 00000000 9481e88c ec053c33 9c4983da 8e71653c
+ars4x32 7 0000ff00 00000000 00000000 00000000 00000000 00000000 000000ff 00000000 35a186ff 53d78ecb 6c2514a6 0bc7ace5
+ars4x32 7 00008000 00000000 00000000 00000000 00000000 00000000 000000ff 00000000 30b292b0 288f14e0 16a3ed41 5e9a1e8c
+ars4x32 7 00ff0000 00000000 00000000 00000000 00000000 00000000 000000ff 00000000 d3b9ae42 53ea5e05 ea37344c 3365d0de
+ars4x32 7 00800000 00000000 00000000 00000000 00000000 00000000 000000ff 00000000 873b4e28 fc4c21d5 970a4cb3 3f02ee17
+ars4x32 7 ff000000 00000000 00000000 00000000 00000000 00000000 000000ff 00000000 431ef8cf 59c8dfd2 f86178a1 847b60cf
+ars4x32 7 80000000 00000000 00000000 00000000 00000000 00000000 000000ff 00000000 60af461e a413f0ba a76cb9d6 1f633554
+ars4x32 7 00000000 000000ff 00000000 00000000 00000000 00000000 000000ff 00000000 803a06af ec3f8653 c212c9e0 1cb31cb2
+ars4x32 7 00000000 00000080 00000000 00000000 00000000 00000000 000000ff 00000000 017e6914 0f535266 0ae93b38 cfe4c9d3
+ars4x32 7 00000000 0000ff00 00000000 00000000 00000000 00000000 000000ff 00000000 b9d94a88 1c64dd00 c747a4dd 171ed6e3
+ars4x32 7 00000000 00008000 00000000 00000000 00000000 00000000 000000ff 00000000 0b5675f7 942da36f 345f5696 0bf565c3
+ars4x32 7 00000000 00ff0000 00000000 00000000 00000000 00000000 000000ff 00000000 c65b64c3 da4f3f6b 2588c0a8 66504ff2
+ars4x32 7 00000000 00800000 00000000 00000000 00000000 00000000 000000ff 00000000 0cbb3a66 77613276 0dc528a1 31a876f3
+ars4x32 7 00000000 ff000000 00000000 00000000 00000000 00000000 000000ff 00000000 a06a59b7 aab0c4b8 ef1aabd3 a33c70b4
+ars4x32 7 00000000 80000000 00000000 00000000 00000000 00000000 000000ff 00000000 b02a5efd 857a0543 d8ef7568 6726adf7
+ars4x32 7 00000000 00000000 000000ff 00000000 00000000 00000000 000000ff 00000000 52fd0dfd 15561258 c6ab328b f9557afc
+ars4x32 7 00000000 00000000 00000080 00000000 00000000 00000000 000000ff 00000000 89c6338c d18771e7 7c12f02d 3d0955b9
+ars4x32 7 00000000 00000000 0000ff00 00000000 00000000 00000000 000000ff 00000000 68dd0297 3442908f 77dfe98b e52ea361
+ars4x32 7 00000000 00000000 00008000 00000000 00000000 00000000 000000ff 00000000 50b1e8eb 9b537afa 147b4051 48d80416
+ars4x32 7 00000000 00000000 00ff0000 00000000 00000000 00000000 000000ff 00000000 f6ff5eb4 30f6b151 630a56dd 5a0b422f
+ars4x32 7 00000000 00000000 00800000 00000000 00000000 00000000 000000ff 00000000 be82fb06 15d2509e 725b861a df97b972
+ars4x32 7 00000000 00000000 ff000000 00000000 00000000 00000000 000000ff 00000000 b6c6a327 885044c7 53b59d61 d8e11374
+ars4x32 7 00000000 00000000 80000000 00000000 00000000 00000000 000000ff 00000000 b19247c4 4e3d2d40 a3dc5fb9 e9a64a87
+ars4x32 7 00000000 00000000 00000000 000000ff 00000000 00000000 000000ff 00000000 f6accc79 61a1a18f c10cde1c 82263b48
+ars4x32 7 00000000 00000000 00000000 00000080 00000000 00000000 000000ff 00000000 e4080bc3 9f03cf41 73813e63 55920cbf
+ars4x32 7 00000000 00000000 00000000 0000ff00 00000000 00000000 000000ff 00000000 953bd9b1 f0adfdbc 8d1e8637 fc3aae24
+ars4x32 7 00000000 00000000 00000000 00008000 00000000 00000000 000000ff 00000000 67aac33a bc41dc9d 9e76a5d3 d05fb0cc
+ars4x32 7 00000000 00000000 00000000 00ff0000 00000000 00000000 000000ff 00000000 9aa1ec74 abeedbf3 b69362c4 8bc7fef0
+ars4x32 7 00000000 00000000 00000000 00800000 00000000 00000000 000000ff 00000000 e2a38fe5 e357ad6e f9428603 1da81cce
+ars4x32 7 00000000 00000000 00000000 ff000000 00000000 00000000 000000ff 00000000 38aa15a5 571ef34a c022ddce 78d900b2
+ars4x32 7 00000000 00000000 00000000 80000000 00000000 00000000 000000ff 00000000 12facc68 09c6ab68 d036ec58 02fb6181
+ars4x32 7 886a3f24 d308a385 2e8a1913 44737003 00000000 00000000 000000ff 00000000 e16cc4ad 54f590c4 e1566ac0 32f9c6a9
+ars4x32 7 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000000 000000ff 00000000 265d4bd1 c1615d4e 09de0cd2 eb487c57
+ars4x32 7 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000000 000000ff 00000000 ee505d84 9d283ee1 779ab900 0827c83e
+ars4x32 7 00000001 00000000 00000000 00000000 00000000 00000000 00000080 00000000 28b2328f 0fa5f615 8316c9ea e541fe16
+ars4x32 7 00000100 00000000 00000000 00000000 00000000 00000000 00000080 00000000 5e0d37b7 d3a150e2 0a8cd83b 43948be9
+ars4x32 7 00010000 00000000 00000000 00000000 00000000 00000000 00000080 00000000 c7241b1e bb6537ef a62023dc 0ab19d6d
+ars4x32 7 01000000 00000000 00000000 00000000 00000000 00000000 00000080 00000000 acdb9793 b6762963 011e1e60 736b471f
+ars4x32 7 00000000 00000001 00000000 00000000 00000000 00000000 00000080 00000000 a04030ca 37035c35 3c83185d 66977ad7
+ars4x32 7 00000000 00000100 00000000 00000000 00000000 00000000 00000080 00000000 f87e3660 29b62f23 1fa911e4 8825ac2d
+ars4x32 7 00000000 00010000 00000000 00000000 00000000 00000000 00000080 00000000 0405098d 5f586df6 4d048c3a 5f6625a3
+ars4x32 7 00000000 01000000 00000000 00000000 00000000 00000000 00000080 00000000 b570ae35 55111919 6cd58d47 ffdf357e
+ars4x32 7 00000000 00000000 00000001 00000000 00000000 00000000 00000080 00000000 e61b9f3d cc504fd1 e55cc705 e1164506
+ars4x32 7 00000000 00000000 00000100 00000000 00000000 00000000 00000080 00000000 d4abecca 32245a7d bf274520 781bf659
+ars4x32 7 00000000 00000000 00010000 00000000 00000000 00000000 00000080 00000000 8cd339b8 f7292101 db49022d 52747449
+ars4x32 7 00000000 00000000 01000000 00000000 00000000 00000000 00000080 00000000 88f0a81a 9ba3290c e738881f e27cec9e
+ars4x32 7 00000000 00000000 00000000 00000001 00000000 00000000 00000080 00000000 b02ee6da f5f9bc83 62de8926 fa7ee983
+ars4x32 7 00000000 00000000 00000000 00000100 00000000 00000000 00000080 00000000 8c983a61 1ae74967 5bd89970 5b8d7c6c
+ars4x32 7 00000000 00000000 00000000 00010000 00000000 00000000 00000080 00000000 2f0b2de6 4f52e7e4 61cbdefe 02fef405
+ars4x32 7 00000000 00000000 00000000 01000000 00000000 00000000 00000080 00000000 7c76e448 a783f64f 0560b403 255a28a1
+ars4x32 7 0000ff00 00000000 00000000 00000000 00000000 00000000 00000080 00000000 f157758b baf4ccb5 2d66ebe5 6c94c55d
+ars4x32 7 00008000 00000000 00000000 00000000 00000000 00000000 00000080 00000000 a1b67bff 447e0b5e 4c3ddd64 072f1022
+ars4x32 7 00ff0000 00000000 00000000 00000000 00000000 00000000 00000080 00000000 4b52c613 834a15d2 4cd2b88b c7810251
+ars4x32 7 00800000 00000000 00000000 00000000 00000000 00000000 00000080 00000000 5a306e0b c7da868e d032dde6 5c06d858
+ars4x32 7 ff000000 00000000 00000000 00000000 00000000 00000000 00000080 00000000 dc5360db ed5d35a2 439064ac fce2a0ec
+ars4x32 7 80000000 00000000 00000000 00000000 00000000 00000000 00000080 00000000 6289382f e74206ba 91690ea6 4a7cd082
+ars4x32 7 00000000 000000ff 00000000 00000000 00000000 00000000 00000080 00000000 890c9ecd 757b4645 0c116ba9 3345c351
+ars4x32 7 00000000 00000080 00000000 00000000 00000000 00000000 00000080 00000000 cc566acc e04aa66a eeddafe9 41e2f7e7
+ars4x32 7 00000000 0000ff00 00000000 00000000 00000000 00000000 00000080 00000000 f4d61444 ba5cbec6 58d7bb95 620ff6f3
+ars4x32 7 00000000 00008000 00000000 00000000 00000000 00000000 00000080 00000000 906a517a 5f65728b 59ea2a88 5c307e01
+ars4x32 7 00000000 00ff0000 00000000 00000000 00000000 00000000 00000080 00000000 e7122e90 7832983a 96c5af52 f5d242ce
+ars4x32 7 00000000 00800000 00000000 00000000 00000000 00000000 00000080 00000000 fbb8d451 7d889eb5 96c8d138 0ffc51e9
+ars4x32 7 00000000 ff000000 00000000 00000000 00000000 00000000 00000080 00000000 dab30e2a dbd9f3e7 6bf73eaf bc3a8d7d
+ars4x32 7 00000000 80000000 00000000 00000000 00000000 00000000 00000080 00000000 bc7d6d85 b69aee83 e8f71720 70d09ae8
+ars4x32 7 00000000 00000000 000000ff 00000000 00000000 00000000 00000080 00000000 5fa55d16 9908c07b e7b4ee98 134617f1
+ars4x32 7 00000000 00000000 00000080 00000000 00000000 00000000 00000080 00000000 eaeb1cb5 1ff6b616 acca2703 75221d78
+ars4x32 7 00000000 00000000 0000ff00 00000000 00000000 00000000 00000080 00000000 6b77d622 8646ca40 6028461c af1903b7
+ars4x32 7 00000000 00000000 00008000 00000000 00000000 00000000 00000080 00000000 03900db2 4aa298bd 10dcbf6e 6fecc45c
+ars4x32 7 00000000 00000000 00ff0000 00000000 00000000 00000000 00000080 00000000 842f5cd6 646ba731 8d066c6f 716cabf6
+ars4x32 7 00000000 00000000 00800000 00000000 00000000 00000000 00000080 00000000 93675dde ccd2485a 52960f2b 66bf4a21
+ars4x32 7 00000000 00000000 ff000000 00000000 00000000 00000000 00000080 00000000 78d8e9c6 862bc175 c09fed18 1256f338
+ars4x32 7 00000000 00000000 80000000 00000000 00000000 00000000 00000080 00000000 77a9b9d1 f964ad82 27f1b1fb bd8a0bd1
+ars4x32 7 00000000 00000000 00000000 000000ff 00000000 00000000 00000080 00000000 cbc664b6 810d4747 ad8aa88f 806fbd63
+ars4x32 7 00000000 00000000 00000000 00000080 00000000 00000000 00000080 00000000 8435f62a 91cfc4d9 0eed6cd9 91cb2208
+ars4x32 7 00000000 00000000 00000000 0000ff00 00000000 00000000 00000080 00000000 8f321c01 5b3edf6e fb7991a3 bd289447
+ars4x32 7 00000000 00000000 00000000 00008000 00000000 00000000 00000080 00000000 eea6f4db 41de03f5 182895c1 b53098a7
+ars4x32 7 00000000 00000000 00000000 00ff0000 00000000 00000000 00000080 00000000 3780b16c 3bd637f8 95636506 6da9be31
+ars4x32 7 00000000 00000000 00000000 00800000 00000000 00000000 00000080 00000000 293a9962 66a0cdff 152b3b0d e29416ec
+ars4x32 7 00000000 00000000 00000000 ff000000 00000000 00000000 00000080 00000000 1e80c35a 26391dc2 1411b393 6d83ef15
+ars4x32 7 00000000 00000000 00000000 80000000 00000000 00000000 00000080 00000000 63ba81ae b5d0f45b 2167d0a7 f6753e70
+ars4x32 7 886a3f24 d308a385 2e8a1913 44737003 00000000 00000000 00000080 00000000 ef14eb2a 8375a2fb 6079b492 a44dc69a
+ars4x32 7 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000000 00000080 00000000 1be30298 84e8d9e2 5cd64037 d7689860
+ars4x32 7 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000000 00000080 00000000 d2d55a42 a400c4d7 12d0cc63 3191768e
+ars4x32 7 00000001 00000000 00000000 00000000 00000000 00000000 0000ff00 00000000 e207ecb3 210b891c 856c8786 d570d667
+ars4x32 7 00000100 00000000 00000000 00000000 00000000 00000000 0000ff00 00000000 473186b1 9247f498 84e2cdb1 0fd6079b
+ars4x32 7 00010000 00000000 00000000 00000000 00000000 00000000 0000ff00 00000000 3ee486a0 e30bc9a7 cae61162 3541295c
+ars4x32 7 01000000 00000000 00000000 00000000 00000000 00000000 0000ff00 00000000 39342ae3 0f79c530 a2b86b64 6874fce4
+ars4x32 7 00000000 00000001 00000000 00000000 00000000 00000000 0000ff00 00000000 17b01843 1999a4d5 38d3003c 8ba22700
+ars4x32 7 00000000 00000100 00000000 00000000 00000000 00000000 0000ff00 00000000 37abbdf5 f6ed2b16 302e3c8d ae41ef09
+ars4x32 7 00000000 00010000 00000000 00000000 00000000 00000000 0000ff00 00000000 598b800c 85d7af3e 4b7c9da2 7be5610f
+ars4x32 7 00000000 01000000 00000000 00000000 00000000 00000000 0000ff00 00000000 1b0aefe6 7060079f 4455577c 9520db4a
+ars4x32 7 00000000 00000000 00000001 00000000 00000000 00000000 0000ff00 00000000 91431f52 816d61a4 7abc1dcb beb68973
+ars4x32 7 00000000 00000000 00000100 00000000 00000000 00000000 0000ff00 00000000 39a6d5f0 3ab9c84e 7bb3aa4f d2439736
+ars4x32 7 00000000 00000000 00010000 00000000 00000000 00000000 0000ff00 00000000 04953ce3 1f590731 8326bcc3 76545701
+ars4x32 7 00000000 00000000 01000000 00000000 00000000 00000000 0000ff00 00000000 eb2aae06 ab7c74cd af2b98b8 938db69f
+ars4x32 7 00000000 00000000 00000000 00000001 00000000 00000000 0000ff00 00000000 3f706478 3fcfe475 43c02841 3da4c11f
+ars4x32 7 00000000 00000000 00000000 00000100 00000000 00000000 0000ff00 00000000 2aa708ea c23d23a2 441b0061 6fd2d232
+ars4x32 7 00000000 00000000 00000000 00010000 00000000 00000000 0000ff00 00000000 5a7d4288 10fe9cfb 328bbb69 24d5d706
+ars4x32 7 00000000 00000000 00000000 01000000 00000000 00000000 0000ff00 00000000 b40c18cc 876c614f dbb42b2a b7ae7994
+ars4x32 7 0000ff00 00000000 00000000 00000000 00000000 00000000 0000ff00 00000000 94b1ba11 1454e234 5078f9ba 253fd486
+ars4x32 7 00008000 00000000 00000000 00000000 00000000 00000000 0000ff00 00000000 1abd0a2c 9890ccbc 99eca8d6 440a1934
+ars4x32 7 00ff0000 00000000 00000000 00000000 00000000 00000000 0000ff00 00000000 d20d70e9 fd4cd32b d5ccd103 8d323b56
+ars4x32 7 00800000 00000000 00000000 00000000 00000000 00000000 0000ff00 00000000 7dbc1d85 8dbadddd c86dcb38 75eb4f48
+ars4x32 7 ff000000 00000000 00000000 00000000 00000000 00000000 0000ff00 00000000 bb652524 cb8eab7d 2da04670 63a33b3e
+ars4x32 7 80000000 00000000 00000000 00000000 00000000 00000000 0000ff00 00000000 689a1ecc 6039e2be 2cd5fd3a 14e563b2
+ars4x32 7 00000000 000000ff 00000000 00000000 00000000 00000000 0000ff00 00000000 b16bea2d 967c4577 0df15037 e4886893
+ars4x32 7 00000000 00000080 00000000 00000000 00000000 00000000 0000ff00 00000000 b496dbe0 9ad71f56 070fc5e7 b120b9a2
+ars4x32 7 00000000 0000ff00 00000000 00000000 00000000 00000000 0000ff00 00000000 e0ce7d99 a52b4a27 e88b11f4 4685a7ca
+ars4x32 7 00000000 00008000 00000000 00000000 00000000 00000000 0000ff00 00000000 b770bfd2 97e22420 5f29089a b4577e2c
+ars4x32 7 00000000 00ff0000 00000000 00000000 00000000 00000000 0000ff00 00000000 39bfa7b3 b92a5943 9ed1915e 48a33f8d
+ars4x32 7 00000000 00800000 00000000 00000000 00000000 00000000 0000ff00 00000000 830af295 4eaa5e63 019f24d7 aec4a78b
+ars4x32 7 00000000 ff000000 00000000 00000000 00000000 00000000 0000ff00 00000000 25137691 347525cd d32fd26d 9305c2ce
+ars4x32 7 00000000 80000000 00000000 00000000 00000000 00000000 0000ff00 00000000 ad2dfac0 2e2c8c4d 7fdb7b6a ca5e0859
+ars4x32 7 00000000 00000000 000000ff 00000000 00000000 00000000 0000ff00 00000000 87ce0724 1b64153f e2ae361f 07572129
+ars4x32 7 00000000 00000000 00000080 00000000 00000000 00000000 0000ff00 00000000 bb8c5b2e 843b2948 208de4e2 cdeab0ad
+ars4x32 7 00000000 00000000 0000ff00 00000000 00000000 00000000 0000ff00 00000000 b944aa9c c45f5a12 f1ca4a9e a0456e0b
+ars4x32 7 00000000 00000000 00008000 00000000 00000000 00000000 0000ff00 00000000 40b417b0 a2a007c2 85f8319d a3756891
+ars4x32 7 00000000 00000000 00ff0000 00000000 00000000 00000000 0000ff00 00000000 f7a5b1a6 06a4b50c 686df503 2c847a65
+ars4x32 7 00000000 00000000 00800000 00000000 00000000 00000000 0000ff00 00000000 9bc2c697 c68ebdda 8632850d 1caa3240
+ars4x32 7 00000000 00000000 ff000000 00000000 00000000 00000000 0000ff00 00000000 6b6426a7 7d75282e 8674bff4 b5375972
+ars4x32 7 00000000 00000000 80000000 00000000 00000000 00000000 0000ff00 00000000 7120e227 60337a2c e5057c45 044f5b94
+ars4x32 7 00000000 00000000 00000000 000000ff 00000000 00000000 0000ff00 00000000 9726bb5f 8047463b 8fe61df7 12ffdf7c
+ars4x32 7 00000000 00000000 00000000 00000080 00000000 00000000 0000ff00 00000000 753e008d 82416d3d f65cddc2 7b6ccd1f
+ars4x32 7 00000000 00000000 00000000 0000ff00 00000000 00000000 0000ff00 00000000 72bf7410 06ab16a1 a7d39ea2 bff4f0b9
+ars4x32 7 00000000 00000000 00000000 00008000 00000000 00000000 0000ff00 00000000 6cc08cf8 f5c5e856 5867ba98 eb67e26a
+ars4x32 7 00000000 00000000 00000000 00ff0000 00000000 00000000 0000ff00 00000000 5da7e2fc fcd7a11c 8d858c12 f65f99e2
+ars4x32 7 00000000 00000000 00000000 00800000 00000000 00000000 0000ff00 00000000 87f146c1 5898085a 37a4f313 6d3018c5
+ars4x32 7 00000000 00000000 00000000 ff000000 00000000 00000000 0000ff00 00000000 8dd15ad3 0c7c3618 83d72028 3884bb9f
+ars4x32 7 00000000 00000000 00000000 80000000 00000000 00000000 0000ff00 00000000 0c5b6d80 06845859 8c5feea9 89d16738
+ars4x32 7 886a3f24 d308a385 2e8a1913 44737003 00000000 00000000 0000ff00 00000000 2df31a0a 729ebc03 67e18942 f9f32def
+ars4x32 7 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000000 0000ff00 00000000 360c4e8a ea0dc3f7 9553d17b e974fec4
+ars4x32 7 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000000 0000ff00 00000000 9a7f1259 37d979c6 ce278c27 96d67bb3
+ars4x32 7 00000001 00000000 00000000 00000000 00000000 00000000 00008000 00000000 ff8b4859 ea64fe49 f4087406 fc4b2f65
+ars4x32 7 00000100 00000000 00000000 00000000 00000000 00000000 00008000 00000000 d378a434 2c15de1d e24a3c41 1aafe6a9
+ars4x32 7 00010000 00000000 00000000 00000000 00000000 00000000 00008000 00000000 e9352493 e2655ea3 916a121e 984ad64f
+ars4x32 7 01000000 00000000 00000000 00000000 00000000 00000000 00008000 00000000 487ee61d 2c252f77 47c1f591 eafcf518
+ars4x32 7 00000000 00000001 00000000 00000000 00000000 00000000 00008000 00000000 5be2f0c5 2f9bc90b 6636fb8a 3c95bb55
+ars4x32 7 00000000 00000100 00000000 00000000 00000000 00000000 00008000 00000000 c852daa3 2dc271d9 5259cd5e 0e1a8cdf
+ars4x32 7 00000000 00010000 00000000 00000000 00000000 00000000 00008000 00000000 36fbd56b 352a20fc eb27648d 8b9ade31
+ars4x32 7 00000000 01000000 00000000 00000000 00000000 00000000 00008000 00000000 2670d668 deeddda4 383006f4 8998f35c
+ars4x32 7 00000000 00000000 00000001 00000000 00000000 00000000 00008000 00000000 04910224 1a5dbc0b 08a0163c ace7a017
+ars4x32 7 00000000 00000000 00000100 00000000 00000000 00000000 00008000 00000000 910c3e65 b3e85fbc cd168602 ddf8e63a
+ars4x32 7 00000000 00000000 00010000 00000000 00000000 00000000 00008000 00000000 a7c3fe43 884bbe51 eb9967f2 cf0c575d
+ars4x32 7 00000000 00000000 01000000 00000000 00000000 00000000 00008000 00000000 692a2238 531c9c29 afa6d025 0dd6445d
+ars4x32 7 00000000 00000000 00000000 00000001 00000000 00000000 00008000 00000000 9f3f5308 0d79dd3b 15e080d5 fd8e4dca
+ars4x32 7 00000000 00000000 00000000 00000100 00000000 00000000 00008000 00000000 b92f2227 df6749aa e3c2767d b0e4e214
+ars4x32 7 00000000 00000000 00000000 00010000 00000000 00000000 00008000 00000000 e19300ae de40a7b3 b0776433 df508342
+ars4x32 7 00000000 00000000 00000000 01000000 00000000 00000000 00008000 00000000 adb4da91 ad928796 8a063cfe cfe98a48
+ars4x32 7 0000ff00 00000000 00000000 00000000 00000000 00000000 00008000 00000000 9a196e77 eec0b6a2 0f09da71 77f0b9a7
+ars4x32 7 00008000 00000000 00000000 00000000 00000000 00000000 00008000 00000000 a1423831 92b09a92 1b59db81 97877bc9
+ars4x32 7 00ff0000 00000000 00000000 00000000 00000000 00000000 00008000 00000000 a9803eb6 c2150f50 f3f4335b 769870b5
+ars4x32 7 00800000 00000000 00000000 00000000 00000000 00000000 00008000 00000000 bc228b32 1c261956 c258d812 d53f8dcd
+ars4x32 7 ff000000 00000000 00000000 00000000 00000000 00000000 00008000 00000000 e4d4d995 66a88f32 16924d5f 131e87a3
+ars4x32 7 80000000 00000000 00000000 00000000 00000000 00000000 00008000 00000000 11f1fc59 0d452e4b 22a34320 d6837e2b
+ars4x32 7 00000000 000000ff 00000000 00000000 00000000 00000000 00008000 00000000 e9a5f770 5ce1166e 2c3a0b84 2ba27e02
+ars4x32 7 00000000 00000080 00000000 00000000 00000000 00000000 00008000 00000000 211f56d5 455fb285 809479ad adc82395
+ars4x32 7 00000000 0000ff00 00000000 00000000 00000000 00000000 00008000 00000000 e1dcd656 8cbe35c9 1b1da938 6cf939e7
+ars4x32 7 00000000 00008000 00000000 00000000 00000000 00000000 00008000 00000000 c96bc0a7 cc55c189 1c33cadf fef12577
+ars4x32 7 00000000 00ff0000 00000000 00000000 00000000 00000000 00008000 00000000 e2c7cee9 284c6c94 f111b06c 7c94f947
+ars4x32 7 00000000 00800000 00000000 00000000 00000000 00000000 00008000 00000000 e6061948 d5068dc4 2ad66b1e 69796b8d
+ars4x32 7 00000000 ff000000 00000000 00000000 00000000 00000000 00008000 00000000 263b16fa d57ae39b c5721991 559c3496
+ars4x32 7 00000000 80000000 00000000 00000000 00000000 00000000 00008000 00000000 424d82a4 2de34feb c9ea8fde 2a795a77
+ars4x32 7 00000000 00000000 000000ff 00000000 00000000 00000000 00008000 00000000 e38c8441 d997461e ec59f5f1 209e8fae
+ars4x32 7 00000000 00000000 00000080 00000000 00000000 00000000 00008000 00000000 78ff893e 731b1680 35c09a8a 2707177c
+ars4x32 7 00000000 00000000 0000ff00 00000000 00000000 00000000 00008000 00000000 8f2c1884 74f32a0f 5a6e8255 f2cd90b5
+ars4x32 7 00000000 00000000 00008000 00000000 00000000 00000000 00008000 00000000 30d1e593 bd0dddce 4c3300c6 bf4cce98
+ars4x32 7 00000000 00000000 00ff0000 00000000 00000000 00000000 00008000 00000000 62d7584f dba38064 c5804177 c1523bc6
+ars4x32 7 00000000 00000000 00800000 00000000 00000000 00000000 00008000 00000000 9a95ba58 a8d89e83 78abc8ad f5e7d2cf
+ars4x32 7 00000000 00000000 ff000000 00000000 00000000 00000000 00008000 00000000 ba70ac88 361c8ab0 22c5c925 ad11aafb
+ars4x32 7 00000000 00000000 80000000 00000000 00000000 00000000 00008000 00000000 2724e7bf 0d5370e4 f73abf99 6f458b64
+ars4x32 7 00000000 00000000 00000000 000000ff 00000000 00000000 00008000 00000000 d6bde385 73f0a1dd f741c189 645bf361
+ars4x32 7 00000000 00000000 00000000 00000080 00000000 00000000 00008000 00000000 b923575c d74cfa76 4cf13d38 89e164be
+ars4x32 7 00000000 00000000 00000000 0000ff00 00000000 00000000 00008000 00000000 2e1b196d 1262def8 c49e9776 212320de
+ars4x32 7 00000000 00000000 00000000 00008000 00000000 00000000 00008000 00000000 459ce8c6 b1cfa83e 432d48f0 e8b5bd63
+ars4x32 7 00000000 00000000 00000000 00ff0000 00000000 00000000 00008000 00000000 e419fbf3 af62d307 f56ce478 b71545c2
+ars4x32 7 00000000 00000000 00000000 00800000 00000000 00000000 00008000 00000000 f388f74d 6b2771e0 b07f3b19 d978d23d
+ars4x32 7 00000000 00000000 00000000 ff000000 00000000 00000000 00008000 00000000 38536d42 0bc4cb6d c6458036 0f9dc83c
+ars4x32 7 00000000 00000000 00000000 80000000 00000000 00000000 00008000 00000000 3349b5d4 35dd0907 fd7807ee 2686b306
+ars4x32 7 886a3f24 d308a385 2e8a1913 44737003 00000000 00000000 00008000 00000000 b21c2bf9 1c4628f1 5a2141d6 38d7c260
+ars4x32 7 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000000 00008000 00000000 f94b8b78 38e02d43 5af1f50c 20479c8f
+ars4x32 7 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000000 00008000 00000000 851cb311 34296508 baade6b5 ec7c625e
+ars4x32 7 00000001 00000000 00000000 00000000 00000000 00000000 00ff0000 00000000 4fa36bed f49b0f68 f68454e1 8f4ffd6b
+ars4x32 7 00000100 00000000 00000000 00000000 00000000 00000000 00ff0000 00000000 0ed25b31 17d37f27 63fa0d94 d9669710
+ars4x32 7 00010000 00000000 00000000 00000000 00000000 00000000 00ff0000 00000000 e358a9f1 f2635fdd 8f93e471 97ddd54f
+ars4x32 7 01000000 00000000 00000000 00000000 00000000 00000000 00ff0000 00000000 9021c525 2f77fcf9 2bb35ce2 99d6c5ea
+ars4x32 7 00000000 00000001 00000000 00000000 00000000 00000000 00ff0000 00000000 6e6685a3 75fba10d 1d2ed31a 813a318a
+ars4x32 7 00000000 00000100 00000000 00000000 00000000 00000000 00ff0000 00000000 1556fb5d 5b90d443 78106e08 69b66c5c
+ars4x32 7 00000000 00010000 00000000 00000000 00000000 00000000 00ff0000 00000000 b601a9a9 fc7333bc 69067f14 4492bee6
+ars4x32 7 00000000 01000000 00000000 00000000 00000000 00000000 00ff0000 00000000 8a3d63e9 03147c09 5c30d175 3222a38f
+ars4x32 7 00000000 00000000 00000001 00000000 00000000 00000000 00ff0000 00000000 216a0bff 6e151caf c631b665 9b6d7527
+ars4x32 7 00000000 00000000 00000100 00000000 00000000 00000000 00ff0000 00000000 45db8411 309a25f2 4eb85913 aa7be9d1
+ars4x32 7 00000000 00000000 00010000 00000000 00000000 00000000 00ff0000 00000000 a3adade5 5f44b75c 453fea47 e259fbc2
+ars4x32 7 00000000 00000000 01000000 00000000 00000000 00000000 00ff0000 00000000 1c87faa1 ed8f4de4 b985e974 d09eff50
+ars4x32 7 00000000 00000000 00000000 00000001 00000000 00000000 00ff0000 00000000 5073b96d 15f38001 705963cd 5cb0103e
+ars4x32 7 00000000 00000000 00000000 00000100 00000000 00000000 00ff0000 00000000 db35c200 3f6b4da2 c9915de2 218ff3bf
+ars4x32 7 00000000 00000000 00000000 00010000 00000000 00000000 00ff0000 00000000 47cd4aab d752d014 f28b860c a1bc04cb
+ars4x32 7 00000000 00000000 00000000 01000000 00000000 00000000 00ff0000 00000000 a285a077 6e47cdc9 98569e8d c677b518
+ars4x32 7 0000ff00 00000000 00000000 00000000 00000000 00000000 00ff0000 00000000 4b9c3596 92c11f50 c97b5915 51e6898a
+ars4x32 7 00008000 00000000 00000000 00000000 00000000 00000000 00ff0000 00000000 00d14d89 38006c1d 7bc5afc9 cfe16969
+ars4x32 7 00ff0000 00000000 00000000 00000000 00000000 00000000 00ff0000 00000000 f207a99e 33e90e8a 48736b6e baf80a74
+ars4x32 7 00800000 00000000 00000000 00000000 00000000 00000000 00ff0000 00000000 9106c865 646d84a4 dcd683ce 4182f6ad
+ars4x32 7 ff000000 00000000 00000000 00000000 00000000 00000000 00ff0000 00000000 19f21514 78c6ed2c ee689dac 9f2df2d9
+ars4x32 7 80000000 00000000 00000000 00000000 00000000 00000000 00ff0000 00000000 8bd79976 ff8adaca 0130d1f7 2b06140b
+ars4x32 7 00000000 000000ff 00000000 00000000 00000000 00000000 00ff0000 00000000 4a70c7e2 356656c9 7c9e7d56 820e892a
+ars4x32 7 00000000 00000080 00000000 00000000 00000000 00000000 00ff0000 00000000 c57855ef 829c70f3 8ce2efb9 f3d34560
+ars4x32 7 00000000 0000ff00 00000000 00000000 00000000 00000000 00ff0000 00000000 06520b39 be42e64d 30377268 5264ee53
+ars4x32 7 00000000 00008000 00000000 00000000 00000000 00000000 00ff0000 00000000 eafc3b62 e9f93279 7ebe1830 515a177d
+ars4x32 7 00000000 00ff0000 00000000 00000000 00000000 00000000 00ff0000 00000000 c9a49b3a 07b4e3a9 418deeef 13559144
+ars4x32 7 00000000 00800000 00000000 00000000 00000000 00000000 00ff0000 00000000 54b4f3ea 7d21dd47 ca6c3c92 ad216979
+ars4x32 7 00000000 ff000000 00000000 00000000 00000000 00000000 00ff0000 00000000 74713ea7 12ad5451 8671dbc1 d57d9d75
+ars4x32 7 00000000 80000000 00000000 00000000 00000000 00000000 00ff0000 00000000 ebe4ecb9 c31eba78 5a6303bc ee4c42ca
+ars4x32 7 00000000 00000000 000000ff 00000000 00000000 00000000 00ff0000 00000000 3dc002f5 52b17469 8298788c 7537b37c
+ars4x32 7 00000000 00000000 00000080 00000000 00000000 00000000 00ff0000 00000000 41b45326 fd956649 46486ae0 86ca0006
+ars4x32 7 00000000 00000000 0000ff00 00000000 00000000 00000000 00ff0000 00000000 2eb13676 7d591e27 e6713fe3 74bf381a
+ars4x32 7 00000000 00000000 00008000 00000000 00000000 00000000 00ff0000 00000000 5c3e62f5 5fa35cd6 e42d2934 8ea2df61
+ars4x32 7 00000000 00000000 00ff0000 00000000 00000000 00000000 00ff0000 00000000 b269cb2b 5ea85bfb 2a8ce1ab fa783c04
+ars4x32 7 00000000 00000000 00800000 00000000 00000000 00000000 00ff0000 00000000 eb6c4f88 4ae25fa7 975f094c bf74c4bd
+ars4x32 7 00000000 00000000 ff000000 00000000 00000000 00000000 00ff0000 00000000 822f96a4 47cb8dcc 5b65d0ee 00592c4c
+ars4x32 7 00000000 00000000 80000000 00000000 00000000 00000000 00ff0000 00000000 9e913667 d144a7c6 b02f5136 7558771c
+ars4x32 7 00000000 00000000 00000000 000000ff 00000000 00000000 00ff0000 00000000 5da84c50 b88e33ef 820698aa f8e5d652
+ars4x32 7 00000000 00000000 00000000 00000080 00000000 00000000 00ff0000 00000000 e04d1713 be1bd333 2cac27c3 7cef40b8
+ars4x32 7 00000000 00000000 00000000 0000ff00 00000000 00000000 00ff0000 00000000 57c02c7f 1940a93d 5f44006e 903339b2
+ars4x32 7 00000000 00000000 00000000 00008000 00000000 00000000 00ff0000 00000000 0060047d 49f3a5a4 a9da83fa 5bd5d855
+ars4x32 7 00000000 00000000 00000000 00ff0000 00000000 00000000 00ff0000 00000000 7c232cfd 483abf9a e0494b22 ce559af9
+ars4x32 7 00000000 00000000 00000000 00800000 00000000 00000000 00ff0000 00000000 e2e3d656 7055d469 67f35dc8 a135cf8a
+ars4x32 7 00000000 00000000 00000000 ff000000 00000000 00000000 00ff0000 00000000 1a50f657 df2bdd5e b594ec19 ffe9269d
+ars4x32 7 00000000 00000000 00000000 80000000 00000000 00000000 00ff0000 00000000 35bc3c82 eec65419 99bc3f75 1645e084
+ars4x32 7 886a3f24 d308a385 2e8a1913 44737003 00000000 00000000 00ff0000 00000000 d055bdad a21ab0fa 6f5c68c8 2871b20e
+ars4x32 7 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000000 00ff0000 00000000 8cdb6d07 0331f252 829f3fdb 5fdb7e77
+ars4x32 7 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000000 00ff0000 00000000 03e0b8f9 aad821bc f95e2a0c 51feb93a
+ars4x32 7 00000001 00000000 00000000 00000000 00000000 00000000 00800000 00000000 e9080079 057151f2 6d995910 750b5673
+ars4x32 7 00000100 00000000 00000000 00000000 00000000 00000000 00800000 00000000 fa63d562 9947e6db c9939d4c 6bc5f1e3
+ars4x32 7 00010000 00000000 00000000 00000000 00000000 00000000 00800000 00000000 8c275b4f 3307529f 0205d226 19fc0965
+ars4x32 7 01000000 00000000 00000000 00000000 00000000 00000000 00800000 00000000 994f4ebd 177adfb5 f0b7ad06 2538baf2
+ars4x32 7 00000000 00000001 00000000 00000000 00000000 00000000 00800000 00000000 a8493f2e 2fe47ed2 75b7ee41 9f2bfb4b
+ars4x32 7 00000000 00000100 00000000 00000000 00000000 00000000 00800000 00000000 7f7dfec1 d7acaae6 5d90e279 40b20fa9
+ars4x32 7 00000000 00010000 00000000 00000000 00000000 00000000 00800000 00000000 e137e761 9e68178d 63d6f810 16c59e33
+ars4x32 7 00000000 01000000 00000000 00000000 00000000 00000000 00800000 00000000 feb6ad7e f650069c ed4fbfcf ec8eaea2
+ars4x32 7 00000000 00000000 00000001 00000000 00000000 00000000 00800000 00000000 a8fdbcba 7cc58b23 7567a9e8 0a431787
+ars4x32 7 00000000 00000000 00000100 00000000 00000000 00000000 00800000 00000000 789c95d2 6fe20176 b35d830d 2e89a3ea
+ars4x32 7 00000000 00000000 00010000 00000000 00000000 00000000 00800000 00000000 9817cdaa 1314c2a3 a7e3e005 91b0e928
+ars4x32 7 00000000 00000000 01000000 00000000 00000000 00000000 00800000 00000000 7b56644e 2f5a731e 0f8bc3c3 955e6def
+ars4x32 7 00000000 00000000 00000000 00000001 00000000 00000000 00800000 00000000 435ec10c f48f1cc9 b4097238 b9e9e8b1
+ars4x32 7 00000000 00000000 00000000 00000100 00000000 00000000 00800000 00000000 b5fa1cd8 39c43e5e cc5812a4 d8ee89a0
+ars4x32 7 00000000 00000000 00000000 00010000 00000000 00000000 00800000 00000000 88ecfd91 bf0c0a69 e8634b97 54642a0f
+ars4x32 7 00000000 00000000 00000000 01000000 00000000 00000000 00800000 00000000 4b36b2e9 1a6251f8 33fbf583 e799e32a
+ars4x32 7 0000ff00 00000000 00000000 00000000 00000000 00000000 00800000 00000000 9e778350 3447036e 9706b42d 5d0a1b8b
+ars4x32 7 00008000 00000000 00000000 00000000 00000000 00000000 00800000 00000000 7d55a72a 3b02f5e1 41e66207 511cb7bb
+ars4x32 7 00ff0000 00000000 00000000 00000000 00000000 00000000 00800000 00000000 21773439 410262a4 193f6dda b884b561
+ars4x32 7 00800000 00000000 00000000 00000000 00000000 00000000 00800000 00000000 21b9839b 52ab6283 7b605860 c52c1a36
+ars4x32 7 ff000000 00000000 00000000 00000000 00000000 00000000 00800000 00000000 2bd6d845 47f8f2bc 16a2963b dcff967d
+ars4x32 7 80000000 00000000 00000000 00000000 00000000 00000000 00800000 00000000 2c1c2d04 805c7d28 01a807b0 7153f583
+ars4x32 7 00000000 000000ff 00000000 00000000 00000000 00000000 00800000 00000000 997db510 302959cf 3bdc36a4 6197c9ba
+ars4x32 7 00000000 00000080 00000000 00000000 00000000 00000000 00800000 00000000 ff7ac844 641ad65c ced417d5 e5bca0f1
+ars4x32 7 00000000 0000ff00 00000000 00000000 00000000 00000000 00800000 00000000 cfc50be7 1440ee7e b43063eb fa79bc51
+ars4x32 7 00000000 00008000 00000000 00000000 00000000 00000000 00800000 00000000 414f54e0 c020b7f6 cd98df4c da58c2c6
+ars4x32 7 00000000 00ff0000 00000000 00000000 00000000 00000000 00800000 00000000 831c6399 5ffbf486 71efd2e8 95b4255f
+ars4x32 7 00000000 00800000 00000000 00000000 00000000 00000000 00800000 00000000 cbaceb29 37bbc31c ef44bdab 90f92671
+ars4x32 7 00000000 ff000000 00000000 00000000 00000000 00000000 00800000 00000000 81bc89d5 e4c3dd2a a4e8b457 98589830
+ars4x32 7 00000000 80000000 00000000 00000000 00000000 00000000 00800000 00000000 78d0a9a0 f167c7d1 dff91d28 3f0c112d
+ars4x32 7 00000000 00000000 000000ff 00000000 00000000 00000000 00800000 00000000 82333e85 8efd25a3 dc58e89f 6be384c6
+ars4x32 7 00000000 00000000 00000080 00000000 00000000 00000000 00800000 00000000 0ddaa164 9cb2b549 c0dc502d 4056fdb6
+ars4x32 7 00000000 00000000 0000ff00 00000000 00000000 00000000 00800000 00000000 60950f43 a4e9d390 431c18ab 06f6edb3
+ars4x32 7 00000000 00000000 00008000 00000000 00000000 00000000 00800000 00000000 8aef14ef a673a0c2 bc64341c 40bbd2e1
+ars4x32 7 00000000 00000000 00ff0000 00000000 00000000 00000000 00800000 00000000 6e2377f3 18a9cdeb 0942dcdd 934a22f6
+ars4x32 7 00000000 00000000 00800000 00000000 00000000 00000000 00800000 00000000 26fefcd8 4a8fd303 737f374b d5553621
+ars4x32 7 00000000 00000000 ff000000 00000000 00000000 00000000 00800000 00000000 86d7b77b cbe8e3b1 572f67d3 f77dee99
+ars4x32 7 00000000 00000000 80000000 00000000 00000000 00000000 00800000 00000000 80ca0691 5c053347 6cd2f69a 92d7f5e1
+ars4x32 7 00000000 00000000 00000000 000000ff 00000000 00000000 00800000 00000000 1c770c46 0ed1ce0c 534e8311 ace6d64a
+ars4x32 7 00000000 00000000 00000000 00000080 00000000 00000000 00800000 00000000 0401673f 236b14e1 b86a8060 511e469e
+ars4x32 7 00000000 00000000 00000000 0000ff00 00000000 00000000 00800000 00000000 684be1c8 2eb410f4 8f053d5f cd4e0351
+ars4x32 7 00000000 00000000 00000000 00008000 00000000 00000000 00800000 00000000 23872d7c 20039fcb 774aff2f 79a117a8
+ars4x32 7 00000000 00000000 00000000 00ff0000 00000000 00000000 00800000 00000000 612edeee 0c9ee409 531c983a bab16142
+ars4x32 7 00000000 00000000 00000000 00800000 00000000 00000000 00800000 00000000 013f14ea 9a9fa775 225cdca9 1e561107
+ars4x32 7 00000000 00000000 00000000 ff000000 00000000 00000000 00800000 00000000 226668a8 29203d71 1f34d9d5 aadd4b71
+ars4x32 7 00000000 00000000 00000000 80000000 00000000 00000000 00800000 00000000 e34b6fcf 51c8285b 60fc7dd5 99067bb1
+ars4x32 7 886a3f24 d308a385 2e8a1913 44737003 00000000 00000000 00800000 00000000 3d7154ab 7f08d6ca 8dcc0b0b e99e6581
+ars4x32 7 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000000 00800000 00000000 aefdaed4 e8ba816a e4d91e8a 85bb1f9c
+ars4x32 7 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000000 00800000 00000000 9ea642bc bead97b7 81029076 b33a7fc5
+ars4x32 7 00000001 00000000 00000000 00000000 00000000 00000000 ff000000 00000000 e594998f b5d5bcd5 7998a540 6d4720f9
+ars4x32 7 00000100 00000000 00000000 00000000 00000000 00000000 ff000000 00000000 e191f528 e9bf876c 2d943b13 c96c6246
+ars4x32 7 00010000 00000000 00000000 00000000 00000000 00000000 ff000000 00000000 43f89e68 8cd82bb8 f47d82ff 70e66707
+ars4x32 7 01000000 00000000 00000000 00000000 00000000 00000000 ff000000 00000000 5139c273 62620c93 3eccc591 06d3bba3
+ars4x32 7 00000000 00000001 00000000 00000000 00000000 00000000 ff000000 00000000 04760d2a f5edbe89 4dd31233 f5a349ad
+ars4x32 7 00000000 00000100 00000000 00000000 00000000 00000000 ff000000 00000000 1c99f4bb b2870b61 740c20e8 b4b3a447
+ars4x32 7 00000000 00010000 00000000 00000000 00000000 00000000 ff000000 00000000 50142161 ca26a966 b631aa10 76202601
+ars4x32 7 00000000 01000000 00000000 00000000 00000000 00000000 ff000000 00000000 a4e5c4fe cbbe1926 55d303f9 1e0ba097
+ars4x32 7 00000000 00000000 00000001 00000000 00000000 00000000 ff000000 00000000 d096cdb9 8198af67 01567021 8f068fea
+ars4x32 7 00000000 00000000 00000100 00000000 00000000 00000000 ff000000 00000000 b7fb1a31 15b6d0e5 57450c2b 8e931a17
+ars4x32 7 00000000 00000000 00010000 00000000 00000000 00000000 ff000000 00000000 26774f55 9c0a6234 3c9dc396 93347de8
+ars4x32 7 00000000 00000000 01000000 00000000 00000000 00000000 ff000000 00000000 1dfb4108 4be6f25d 7c5de5e4 951402bd
+ars4x32 7 00000000 00000000 00000000 00000001 00000000 00000000 ff000000 00000000 6302ed04 6ad5096f 7cf96fee e62789af
+ars4x32 7 00000000 00000000 00000000 00000100 00000000 00000000 ff000000 00000000 ffb2f2ca a2b6c832 1755f26d 3b042f52
+ars4x32 7 00000000 00000000 00000000 00010000 00000000 00000000 ff000000 00000000 d9d4678c 69e519d5 47c61f78 f03ae6df
+ars4x32 7 00000000 00000000 00000000 01000000 00000000 00000000 ff000000 00000000 6b032ecf 64d2139b c8e0058e 520bf9dc
+ars4x32 7 0000ff00 00000000 00000000 00000000 00000000 00000000 ff000000 00000000 59e92d22 7949c4bb e8657fba 7080bd58
+ars4x32 7 00008000 00000000 00000000 00000000 00000000 00000000 ff000000 00000000 842e5047 04709ad9 491fd8cd cd9d36ef
+ars4x32 7 00ff0000 00000000 00000000 00000000 00000000 00000000 ff000000 00000000 33cda626 bca22980 90f9a64f cbc3c4b6
+ars4x32 7 00800000 00000000 00000000 00000000 00000000 00000000 ff000000 00000000 981eb300 a9ed8be1 6c051075 1f4aa89f
+ars4x32 7 ff000000 00000000 00000000 00000000 00000000 00000000 ff000000 00000000 aee436ba 4cb7543b c08d10e3 46af739b
+ars4x32 7 80000000 00000000 00000000 00000000 00000000 00000000 ff000000 00000000 313a8392 fc1b20c8 107a3111 becca7c5
+ars4x32 7 00000000 000000ff 00000000 00000000 00000000 00000000 ff000000 00000000 c61fabad 747a7795 f7be9cf5 a47b0dc7
+ars4x32 7 00000000 00000080 00000000 00000000 00000000 00000000 ff000000 00000000 fa88c065 5041f854 f0f14444 e07fff07
+ars4x32 7 00000000 0000ff00 00000000 00000000 00000000 00000000 ff000000 00000000 1c968df6 052f9a87 1ec2cdd4 0e86ac4a
+ars4x32 7 00000000 00008000 00000000 00000000 00000000 00000000 ff000000 00000000 604bd694 dd191dcc d2b42afd b364fdbe
+ars4x32 7 00000000 00ff0000 00000000 00000000 00000000 00000000 ff000000 00000000 7605676c 44eaae99 f550c105 758d377e
+ars4x32 7 00000000 00800000 00000000 00000000 00000000 00000000 ff000000 00000000 8f824b8a 169359c6 8757dde1 39f8a63b
+ars4x32 7 00000000 ff000000 00000000 00000000 00000000 00000000 ff000000 00000000 260e12ab ef29fa83 25010c47 55fc59f8
+ars4x32 7 00000000 80000000 00000000 00000000 00000000 00000000 ff000000 00000000 1437d144 53fc8556 01fd3e34 9ec7ce17
+ars4x32 7 00000000 00000000 000000ff 00000000 00000000 00000000 ff000000 00000000 f9889861 2885a4c0 90199984 8186c409
+ars4x32 7 00000000 00000000 00000080 00000000 00000000 00000000 ff000000 00000000 d5a5b5c0 4dedbbad c729b38c 6e6b5f5b
+ars4x32 7 00000000 00000000 0000ff00 00000000 00000000 00000000 ff000000 00000000 eab2b472 84d793a5 21469192 b4a1bf6d
+ars4x32 7 00000000 00000000 00008000 00000000 00000000 00000000 ff000000 00000000 b1b2dc57 afd6624d 5f128d86 f89fe2a9
+ars4x32 7 00000000 00000000 00ff0000 00000000 00000000 00000000 ff000000 00000000 dfcb6e5e a0894b3b f85c52fa d29e0bff
+ars4x32 7 00000000 00000000 00800000 00000000 00000000 00000000 ff000000 00000000 1633dc13 10ceced3 613ed8de deb5db90
+ars4x32 7 00000000 00000000 ff000000 00000000 00000000 00000000 ff000000 00000000 f9abe8ab 34ae560f c23b89c5 ffb47ec7
+ars4x32 7 00000000 00000000 80000000 00000000 00000000 00000000 ff000000 00000000 38205c98 e813a1dc c7dfd2cc c7ed1b5a
+ars4x32 7 00000000 00000000 00000000 000000ff 00000000 00000000 ff000000 00000000 a83a5099 81580b72 9418d1a1 427b5bc8
+ars4x32 7 00000000 00000000 00000000 00000080 00000000 00000000 ff000000 00000000 057cd2b9 f1396aed 962fb7e8 007b9417
+ars4x32 7 00000000 00000000 00000000 0000ff00 00000000 00000000 ff000000 00000000 9ead8db7 0be43b46 abbf6f00 64399b80
+ars4x32 7 00000000 00000000 00000000 00008000 00000000 00000000 ff000000 00000000 a5f7a8c1 9c014f32 e84da0c7 528db876
+ars4x32 7 00000000 00000000 00000000 00ff0000 00000000 00000000 ff000000 00000000 2f862e83 ee399416 2fc4b244 219bf33b
+ars4x32 7 00000000 00000000 00000000 00800000 00000000 00000000 ff000000 00000000 7c38fd5e e88c7b0b 00a39564 d127ba08
+ars4x32 7 00000000 00000000 00000000 ff000000 00000000 00000000 ff000000 00000000 9dde56f7 703a51a2 809b288c 13fc1db8
+ars4x32 7 00000000 00000000 00000000 80000000 00000000 00000000 ff000000 00000000 001a54c7 7c415411 7419eadc 30283e4c
+ars4x32 7 886a3f24 d308a385 2e8a1913 44737003 00000000 00000000 ff000000 00000000 3c9224d4 642eaab1 3ca000f2 c837fd1b
+ars4x32 7 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000000 ff000000 00000000 35b24344 d6067df7 c0c48112 05f68f85
+ars4x32 7 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000000 ff000000 00000000 6e492fd4 5de1d3f5 082d2ff3 0c00136a
+ars4x32 7 00000001 00000000 00000000 00000000 00000000 00000000 80000000 00000000 50ee6f9f b145d6ff 04c3488c 77cd209f
+ars4x32 7 00000100 00000000 00000000 00000000 00000000 00000000 80000000 00000000 d91e7c95 8944f3d8 8943fa3a 4d22c6ea
+ars4x32 7 00010000 00000000 00000000 00000000 00000000 00000000 80000000 00000000 2686ee74 f5c74c56 e38f1dbc ded52c9e
+ars4x32 7 01000000 00000000 00000000 00000000 00000000 00000000 80000000 00000000 0567728c ea8d267b 37e6a8ba 5625d260
+ars4x32 7 00000000 00000001 00000000 00000000 00000000 00000000 80000000 00000000 c0ced4da 4bfe2786 e58b4d79 9ea767d6
+ars4x32 7 00000000 00000100 00000000 00000000 00000000 00000000 80000000 00000000 b269706c 863d4f06 ad7e7fe2 88b07128
+ars4x32 7 00000000 00010000 00000000 00000000 00000000 00000000 80000000 00000000 e573ef41 430faffa eade00c4 20f0b1ba
+ars4x32 7 00000000 01000000 00000000 00000000 00000000 00000000 80000000 00000000 7cd777be 5053dd9f 30ef6a67 6b51d8f7
+ars4x32 7 00000000 00000000 00000001 00000000 00000000 00000000 80000000 00000000 ec045802 370393e6 bd882103 588ed4f1
+ars4x32 7 00000000 00000000 00000100 00000000 00000000 00000000 80000000 00000000 9898896b 1b9b3011 cec1c90c b3bff953
+ars4x32 7 00000000 00000000 00010000 00000000 00000000 00000000 80000000 00000000 832d4f7a c2bcc9d3 2c59d87a 8fe2f8ab
+ars4x32 7 00000000 00000000 01000000 00000000 00000000 00000000 80000000 00000000 8a3070a6 896d5802 6b3c1d19 ed1d2810
+ars4x32 7 00000000 00000000 00000000 00000001 00000000 00000000 80000000 00000000 bc69ab5b 32405fbd 5c43ac3c 2371b526
+ars4x32 7 00000000 00000000 00000000 00000100 00000000 00000000 80000000 00000000 71ec9436 4fa0ee91 46b32565 9553dc6c
+ars4x32 7 00000000 00000000 00000000 00010000 00000000 00000000 80000000 00000000 9fbc1872 75a39026 810ad2d0 2c8601a6
+ars4x32 7 00000000 00000000 00000000 01000000 00000000 00000000 80000000 00000000 97cb2996 bf8fd265 82cea626 3347e64b
+ars4x32 7 0000ff00 00000000 00000000 00000000 00000000 00000000 80000000 00000000 4af192d3 a36695a6 a17916fd ab5b1252
+ars4x32 7 00008000 00000000 00000000 00000000 00000000 00000000 80000000 00000000 3e10a586 c183603d 5583b06c 430f5fcd
+ars4x32 7 00ff0000 00000000 00000000 00000000 00000000 00000000 80000000 00000000 05d060a5 85e09077 5489df86 a37daedc
+ars4x32 7 00800000 00000000 00000000 00000000 00000000 00000000 80000000 00000000 9a5142d6 a7d70911 9a87b352 4e1a8f77
+ars4x32 7 ff000000 00000000 00000000 00000000 00000000 00000000 80000000 00000000 7e6a1959 a16d3e5e 3bf24b06 b503c1f8
+ars4x32 7 80000000 00000000 00000000 00000000 00000000 00000000 80000000 00000000 7aba07a8 1ed6fb0d 5f51e882 3495d0e3
+ars4x32 7 00000000 000000ff 00000000 00000000 00000000 00000000 80000000 00000000 0add6979 17a72877 ce5565e8 41a226ff
+ars4x32 7 00000000 00000080 00000000 00000000 00000000 00000000 80000000 00000000 043fe565 b0e380bb a6a88d46 c7219ae4
+ars4x32 7 00000000 0000ff00 00000000 00000000 00000000 00000000 80000000 00000000 6c7c39b8 a33a2a55 e0e820f6 cc322707
+ars4x32 7 00000000 00008000 00000000 00000000 00000000 00000000 80000000 00000000 eecc5f3f 40870c09 cd3ad7c3 4b1604be
+ars4x32 7 00000000 00ff0000 00000000 00000000 00000000 00000000 80000000 00000000 6bc74f4b 6c57bbeb e8cb7079 2d461a71
+ars4x32 7 00000000 00800000 00000000 00000000 00000000 00000000 80000000 00000000 2a846853 f7fca57a 1252cfd2 f4ee435a
+ars4x32 7 00000000 ff000000 00000000 00000000 00000000 00000000 80000000 00000000 af9b5771 27e2c1f0 262d0f5a a11f9c95
+ars4x32 7 00000000 80000000 00000000 00000000 00000000 00000000 80000000 00000000 312670de 6f0f7254 08254bde 3b9bf3bd
+ars4x32 7 00000000 00000000 000000ff 00000000 00000000 00000000 80000000 00000000 91f3c2f1 51a51b64 f8db3bad 84658c4a
+ars4x32 7 00000000 00000000 00000080 00000000 00000000 00000000 80000000 00000000 3622195e 3afeaff4 e68cfc47 7f0e392d
+ars4x32 7 00000000 00000000 0000ff00 00000000 00000000 00000000 80000000 00000000 e404d0de 0dad63df 1d86d0bf 5f84995c
+ars4x32 7 00000000 00000000 00008000 00000000 00000000 00000000 80000000 00000000 1f101c49 a193a793 f59bae29 f4022bb1
+ars4x32 7 00000000 00000000 00ff0000 00000000 00000000 00000000 80000000 00000000 939a5317 65f86e1e a510f31d 89b18ee5
+ars4x32 7 00000000 00000000 00800000 00000000 00000000 00000000 80000000 00000000 cbf83da1 ddd26b7a c2b08e12 2f259f99
+ars4x32 7 00000000 00000000 ff000000 00000000 00000000 00000000 80000000 00000000 bb8a595b c4b6ebc9 c15f8037 ae5ae08c
+ars4x32 7 00000000 00000000 80000000 00000000 00000000 00000000 80000000 00000000 a7a3f1d9 a4e83df6 c164329a 26887914
+ars4x32 7 00000000 00000000 00000000 000000ff 00000000 00000000 80000000 00000000 a43219d2 70e406ee 648a62ff d27bdf0c
+ars4x32 7 00000000 00000000 00000000 00000080 00000000 00000000 80000000 00000000 fcc32a22 78ea12c6 4c617906 99e5c9ef
+ars4x32 7 00000000 00000000 00000000 0000ff00 00000000 00000000 80000000 00000000 0b1f00f6 084d9447 534f7cc0 ee2599c1
+ars4x32 7 00000000 00000000 00000000 00008000 00000000 00000000 80000000 00000000 2278d6c7 7d598017 a5a8495d 082fd290
+ars4x32 7 00000000 00000000 00000000 00ff0000 00000000 00000000 80000000 00000000 03468145 4b44a835 3faca49e 1d1cefff
+ars4x32 7 00000000 00000000 00000000 00800000 00000000 00000000 80000000 00000000 4d2c2ff9 87ba11be fd422373 ebd9ed6e
+ars4x32 7 00000000 00000000 00000000 ff000000 00000000 00000000 80000000 00000000 612aa9c0 f9507178 c7988e66 33be6059
+ars4x32 7 00000000 00000000 00000000 80000000 00000000 00000000 80000000 00000000 ee635721 f0227c18 019f491f f1f72229
+ars4x32 7 886a3f24 d308a385 2e8a1913 44737003 00000000 00000000 80000000 00000000 77c8a6b3 63296dcf c2bc8b57 a12bf8e8
+ars4x32 7 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000000 80000000 00000000 4402a2a9 7dcd34d4 722f7f82 203961ac
+ars4x32 7 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000000 80000000 00000000 40b825de a60b3b62 f4ebf400 0e825cbf
+ars4x32 7 00000001 00000000 00000000 00000000 00000000 00000000 00000000 000000ff ba205fb6 7571108e 39bb44a8 08d8418f
+ars4x32 7 00000100 00000000 00000000 00000000 00000000 00000000 00000000 000000ff 9bd98154 0c5fd6a0 2a17f791 379c7568
+ars4x32 7 00010000 00000000 00000000 00000000 00000000 00000000 00000000 000000ff 21db62f4 126704f7 9e258258 58d5afdd
+ars4x32 7 01000000 00000000 00000000 00000000 00000000 00000000 00000000 000000ff 3ac130a1 94e59f22 1e98e881 70e56970
+ars4x32 7 00000000 00000001 00000000 00000000 00000000 00000000 00000000 000000ff 3fc93b6e 03ce6242 08b7885e 2d82bbaf
+ars4x32 7 00000000 00000100 00000000 00000000 00000000 00000000 00000000 000000ff ac5a404c 9a57bacd 9c8a2152 c1505349
+ars4x32 7 00000000 00010000 00000000 00000000 00000000 00000000 00000000 000000ff cdcd83a2 c711fdbe e51645e5 7e6d046d
+ars4x32 7 00000000 01000000 00000000 00000000 00000000 00000000 00000000 000000ff 4373d67c 358d830c 3fa8027d 757dcfcf
+ars4x32 7 00000000 00000000 00000001 00000000 00000000 00000000 00000000 000000ff 68020c55 7a9d35a0 017e4ddd f9ae6d97
+ars4x32 7 00000000 00000000 00000100 00000000 00000000 00000000 00000000 000000ff 6f360904 5653e7d9 21fd3780 45370e1c
+ars4x32 7 00000000 00000000 00010000 00000000 00000000 00000000 00000000 000000ff 3eab9707 15013d52 aabe0047 d7fb53a6
+ars4x32 7 00000000 00000000 01000000 00000000 00000000 00000000 00000000 000000ff 942aec32 3e14b6f5 fcea7f43 bc089bcc
+ars4x32 7 00000000 00000000 00000000 00000001 00000000 00000000 00000000 000000ff c255d1e3 eb8b8360 1265d817 8469d77a
+ars4x32 7 00000000 00000000 00000000 00000100 00000000 00000000 00000000 000000ff 1ca7f47f 54b6924e ccd09f94 ca3b2c0e
+ars4x32 7 00000000 00000000 00000000 00010000 00000000 00000000 00000000 000000ff 86a52cca a8987a42 bed185ee c8eb8d7a
+ars4x32 7 00000000 00000000 00000000 01000000 00000000 00000000 00000000 000000ff 6200e914 68f0cf97 88381a0d 305d9e6c
+ars4x32 7 0000ff00 00000000 00000000 00000000 00000000 00000000 00000000 000000ff b34e6fd8 fda920d7 eab62664 afc9526a
+ars4x32 7 00008000 00000000 00000000 00000000 00000000 00000000 00000000 000000ff 0d281301 5fe3c5d1 0ca70fe0 642e27d1
+ars4x32 7 00ff0000 00000000 00000000 00000000 00000000 00000000 00000000 000000ff 8b83e9c8 fcf79329 e8136b62 445ee56a
+ars4x32 7 00800000 00000000 00000000 00000000 00000000 00000000 00000000 000000ff dd404bcf db24fc5e ff00b775 dd297bf3
+ars4x32 7 ff000000 00000000 00000000 00000000 00000000 00000000 00000000 000000ff dcca8760 ce686599 fecaac4d 3d6f484e
+ars4x32 7 80000000 00000000 00000000 00000000 00000000 00000000 00000000 000000ff f1e30f8c 242c8379 6b2cbbbe a34dd198
+ars4x32 7 00000000 000000ff 00000000 00000000 00000000 00000000 00000000 000000ff 0cc917eb 0f5fa1ac 12e47540 cd0f31e6
+ars4x32 7 00000000 00000080 00000000 00000000 00000000 00000000 00000000 000000ff d917750a 8e3e533d a980b398 9a701daa
+ars4x32 7 00000000 0000ff00 00000000 00000000 00000000 00000000 00000000 000000ff 0a0abe59 10a96176 2c6f1819 6f955e80
+ars4x32 7 00000000 00008000 00000000 00000000 00000000 00000000 00000000 000000ff fb553ded 772c96f6 c9e98f69 f6215dc7
+ars4x32 7 00000000 00ff0000 00000000 00000000 00000000 00000000 00000000 000000ff 9d279f8c 001a6b16 a9d2b14d 6b312d90
+ars4x32 7 00000000 00800000 00000000 00000000 00000000 00000000 00000000 000000ff 94068fe0 5d3a1770 5a5d122a 2e461232
+ars4x32 7 00000000 ff000000 00000000 00000000 00000000 00000000 00000000 000000ff 699fa8ee 285405cf 0fe6a66f c6afc4d3
+ars4x32 7 00000000 80000000 00000000 00000000 00000000 00000000 00000000 000000ff 6f905c6c ff97a60d 67329e05 c06eef7e
+ars4x32 7 00000000 00000000 000000ff 00000000 00000000 00000000 00000000 000000ff 4d92bc50 44607f7c ce770b42 2b897df0
+ars4x32 7 00000000 00000000 00000080 00000000 00000000 00000000 00000000 000000ff 978f1fbc 9e462394 ef68d931 03fff47c
+ars4x32 7 00000000 00000000 0000ff00 00000000 00000000 00000000 00000000 000000ff 114a0d56 50016f2a 9ffd7388 be9ffa0c
+ars4x32 7 00000000 00000000 00008000 00000000 00000000 00000000 00000000 000000ff 2749f402 a64b9a01 c35cce05 7d891479
+ars4x32 7 00000000 00000000 00ff0000 00000000 00000000 00000000 00000000 000000ff 7d35638a 597e663d 9606347b c5c56adb
+ars4x32 7 00000000 00000000 00800000 00000000 00000000 00000000 00000000 000000ff be8ab74f d910586f 3bb3029b 679bfe1c
+ars4x32 7 00000000 00000000 ff000000 00000000 00000000 00000000 00000000 000000ff e5fd023d 40ba82d5 b74e4200 2b3019af
+ars4x32 7 00000000 00000000 80000000 00000000 00000000 00000000 00000000 000000ff 5cf9b98a 11a7d7f4 59df98d0 7821aae9
+ars4x32 7 00000000 00000000 00000000 000000ff 00000000 00000000 00000000 000000ff 2890decf 9d58b59f f578c4cd d37a5621
+ars4x32 7 00000000 00000000 00000000 00000080 00000000 00000000 00000000 000000ff e5b5d0ec 0bcddc55 e3ce4717 834d42ec
+ars4x32 7 00000000 00000000 00000000 0000ff00 00000000 00000000 00000000 000000ff be40ed1c d3fa06b4 5e129830 006d89f6
+ars4x32 7 00000000 00000000 00000000 00008000 00000000 00000000 00000000 000000ff 987c84ed ed1f21f3 44ffe815 a2408672
+ars4x32 7 00000000 00000000 00000000 00ff0000 00000000 00000000 00000000 000000ff 9ba6d879 10e6e4f8 06ed8aa5 0145877d
+ars4x32 7 00000000 00000000 00000000 00800000 00000000 00000000 00000000 000000ff 8d10aaec e645e3ba 3f04218d 40f8b67d
+ars4x32 7 00000000 00000000 00000000 ff000000 00000000 00000000 00000000 000000ff b0659c9c 0740e25f 2c151c73 eb08059e
+ars4x32 7 00000000 00000000 00000000 80000000 00000000 00000000 00000000 000000ff 2599afaa 47af114f b715953d f14f0d62
+ars4x32 7 886a3f24 d308a385 2e8a1913 44737003 00000000 00000000 00000000 000000ff 09a2917c 81643036 7d18cdaf b286a87c
+ars4x32 7 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000000 00000000 000000ff 5a7e2699 3219d6af 8ffb64e6 20049567
+ars4x32 7 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000000 00000000 000000ff af08af74 e8fbf59c 8a5af092 f94136c8
+ars4x32 7 00000001 00000000 00000000 00000000 00000000 00000000 00000000 00000080 b6c8a390 d1017b49 945a30e4 bbb12e77
+ars4x32 7 00000100 00000000 00000000 00000000 00000000 00000000 00000000 00000080 dbf38ffe 7cffafd6 f46b1b64 2030119e
+ars4x32 7 00010000 00000000 00000000 00000000 00000000 00000000 00000000 00000080 ec40611c 9922b2f1 aba0ca77 68704af0
+ars4x32 7 01000000 00000000 00000000 00000000 00000000 00000000 00000000 00000080 191a0257 5b89af7c b4a0842a 671a25b5
+ars4x32 7 00000000 00000001 00000000 00000000 00000000 00000000 00000000 00000080 0adeb3e8 6bf36c1f 8d34bead a28eb9c1
+ars4x32 7 00000000 00000100 00000000 00000000 00000000 00000000 00000000 00000080 e41a2df7 a59eaf3c a2facbfa b4578cd2
+ars4x32 7 00000000 00010000 00000000 00000000 00000000 00000000 00000000 00000080 8fbc7d6b 62769b02 06fddf59 98fd67ce
+ars4x32 7 00000000 01000000 00000000 00000000 00000000 00000000 00000000 00000080 4c206362 ae612042 30bb1ea0 60367f6e
+ars4x32 7 00000000 00000000 00000001 00000000 00000000 00000000 00000000 00000080 af37d525 13a44d70 3c481d0a 18eec0b2
+ars4x32 7 00000000 00000000 00000100 00000000 00000000 00000000 00000000 00000080 2faea34b 4bac3b7b c17ebace e97fb330
+ars4x32 7 00000000 00000000 00010000 00000000 00000000 00000000 00000000 00000080 369fdfe3 04081de3 fc1adc6d 9ee43625
+ars4x32 7 00000000 00000000 01000000 00000000 00000000 00000000 00000000 00000080 c3e039b3 0e50d67e 02dc6318 cf160f8a
+ars4x32 7 00000000 00000000 00000000 00000001 00000000 00000000 00000000 00000080 63df5831 b78e3874 cf3deccc ac763012
+ars4x32 7 00000000 00000000 00000000 00000100 00000000 00000000 00000000 00000080 87d8f297 8636d3c7 0c81a629 71217d68
+ars4x32 7 00000000 00000000 00000000 00010000 00000000 00000000 00000000 00000080 d01601cc 416a8b81 c03f0d12 04568b8a
+ars4x32 7 00000000 00000000 00000000 01000000 00000000 00000000 00000000 00000080 e126b7db dd192c78 76d98e1e 3e3acb44
+ars4x32 7 0000ff00 00000000 00000000 00000000 00000000 00000000 00000000 00000080 0385df57 5fe0a1f0 f7db7de5 cab598f7
+ars4x32 7 00008000 00000000 00000000 00000000 00000000 00000000 00000000 00000080 ea2cddaf a12525bf 59cc4e5d 46fc7628
+ars4x32 7 00ff0000 00000000 00000000 00000000 00000000 00000000 00000000 00000080 ac8a8993 2627d7da 785a4410 43d6ca35
+ars4x32 7 00800000 00000000 00000000 00000000 00000000 00000000 00000000 00000080 ed74b91e 4cd838ed 8da65f2a f45836af
+ars4x32 7 ff000000 00000000 00000000 00000000 00000000 00000000 00000000 00000080 1220ecfd 9d90e56f 3bdb3e66 a13d3459
+ars4x32 7 80000000 00000000 00000000 00000000 00000000 00000000 00000000 00000080 9ac247b3 c0fbe2ee 29a5ce96 6223e7a6
+ars4x32 7 00000000 000000ff 00000000 00000000 00000000 00000000 00000000 00000080 07f38992 431f289c bf3d0f90 bb31139d
+ars4x32 7 00000000 00000080 00000000 00000000 00000000 00000000 00000000 00000080 3e87e158 4421f5c2 3bd07c3b e078c6ff
+ars4x32 7 00000000 0000ff00 00000000 00000000 00000000 00000000 00000000 00000080 40ff4b3d 972e40f7 a3de98f2 629c220d
+ars4x32 7 00000000 00008000 00000000 00000000 00000000 00000000 00000000 00000080 e049bd76 b882e323 5f203d0c 44406976
+ars4x32 7 00000000 00ff0000 00000000 00000000 00000000 00000000 00000000 00000080 56f35880 8268e2c8 ee9ea2b2 bb013349
+ars4x32 7 00000000 00800000 00000000 00000000 00000000 00000000 00000000 00000080 67381f8b 45d26557 63f30265 07d94652
+ars4x32 7 00000000 ff000000 00000000 00000000 00000000 00000000 00000000 00000080 03dc8465 59a93630 6e37c101 342ba48e
+ars4x32 7 00000000 80000000 00000000 00000000 00000000 00000000 00000000 00000080 4badda42 e5745abd b2a4c569 59932f35
+ars4x32 7 00000000 00000000 000000ff 00000000 00000000 00000000 00000000 00000080 05c369b7 c16d6c0a 00a61636 d6f16971
+ars4x32 7 00000000 00000000 00000080 00000000 00000000 00000000 00000000 00000080 5cfb1283 5456a613 132d7ad7 f5f6fc33
+ars4x32 7 00000000 00000000 0000ff00 00000000 00000000 00000000 00000000 00000080 6d70be70 68f1c773 7aef97a8 cf2afd9f
+ars4x32 7 00000000 00000000 00008000 00000000 00000000 00000000 00000000 00000080 e72b5845 3b1ad9b1 cccb8327 e974936b
+ars4x32 7 00000000 00000000 00ff0000 00000000 00000000 00000000 00000000 00000080 40f06d8d 8daeaf90 a12a9bb5 1ddb0188
+ars4x32 7 00000000 00000000 00800000 00000000 00000000 00000000 00000000 00000080 e6c63d22 b909283f 350817aa 8a241aaa
+ars4x32 7 00000000 00000000 ff000000 00000000 00000000 00000000 00000000 00000080 2b0ff10c 407f999d 0f4a0bd2 6f2aa50a
+ars4x32 7 00000000 00000000 80000000 00000000 00000000 00000000 00000000 00000080 269160c8 4ca320e4 8ac10c3e f61ea009
+ars4x32 7 00000000 00000000 00000000 000000ff 00000000 00000000 00000000 00000080 29cef2f0 ab096ca5 06153c58 b293312b
+ars4x32 7 00000000 00000000 00000000 00000080 00000000 00000000 00000000 00000080 9df9fa8c 48bc1a69 b4e05ade 10626ed7
+ars4x32 7 00000000 00000000 00000000 0000ff00 00000000 00000000 00000000 00000080 3740739f b4c2803f 4c664624 a9556783
+ars4x32 7 00000000 00000000 00000000 00008000 00000000 00000000 00000000 00000080 6c112d9a 0bcabebe 4fc7cb1e 4b24f856
+ars4x32 7 00000000 00000000 00000000 00ff0000 00000000 00000000 00000000 00000080 28a20ce7 0ae113bf 7ef2db5c 3bee6c8e
+ars4x32 7 00000000 00000000 00000000 00800000 00000000 00000000 00000000 00000080 f086532a 016327da e2b39dbc 23c9c84c
+ars4x32 7 00000000 00000000 00000000 ff000000 00000000 00000000 00000000 00000080 df2a6747 c64b2d09 4e76212b b34591f7
+ars4x32 7 00000000 00000000 00000000 80000000 00000000 00000000 00000000 00000080 999f7488 e79031e6 b2121bc1 647ac92d
+ars4x32 7 886a3f24 d308a385 2e8a1913 44737003 00000000 00000000 00000000 00000080 0bcf9f8a d3f78a00 bef7f10a 0aba298c
+ars4x32 7 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000000 00000000 00000080 dd2efffc 78da53fb 29b853c8 7f2df440
+ars4x32 7 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000000 00000000 00000080 7220bc39 b7230651 3e17b7e5 c35375b7
+ars4x32 7 00000001 00000000 00000000 00000000 00000000 00000000 00000000 0000ff00 e6969724 ea77117b f4472835 e1782eb7
+ars4x32 7 00000100 00000000 00000000 00000000 00000000 00000000 00000000 0000ff00 bc137850 6915f2cf fcbc8fa0 a9556b09
+ars4x32 7 00010000 00000000 00000000 00000000 00000000 00000000 00000000 0000ff00 3b768400 b96371bb 1cbcf1fe 9d198b9d
+ars4x32 7 01000000 00000000 00000000 00000000 00000000 00000000 00000000 0000ff00 e4a78c1d 06042e7c a7233197 93970572
+ars4x32 7 00000000 00000001 00000000 00000000 00000000 00000000 00000000 0000ff00 3f5109bb 5103e99d 8cf85d2f 3291b05b
+ars4x32 7 00000000 00000100 00000000 00000000 00000000 00000000 00000000 0000ff00 3360830e 30fe7c80 f7043c06 2f8250da
+ars4x32 7 00000000 00010000 00000000 00000000 00000000 00000000 00000000 0000ff00 d6640367 4d4347de 19a7ec43 53304d04
+ars4x32 7 00000000 01000000 00000000 00000000 00000000 00000000 00000000 0000ff00 a3fa134f 78844f3b c53e40e9 01419be7
+ars4x32 7 00000000 00000000 00000001 00000000 00000000 00000000 00000000 0000ff00 63d3090e 98efe3c0 28db8c72 6e8a6e3d
+ars4x32 7 00000000 00000000 00000100 00000000 00000000 00000000 00000000 0000ff00 4c2b8318 3eb8c5c0 531b38cc 227aed96
+ars4x32 7 00000000 00000000 00010000 00000000 00000000 00000000 00000000 0000ff00 d96a78ed ec8ad8e5 a172bc36 137384d8
+ars4x32 7 00000000 00000000 01000000 00000000 00000000 00000000 00000000 0000ff00 d82dd886 384813c6 e7b1285e f2a0660a
+ars4x32 7 00000000 00000000 00000000 00000001 00000000 00000000 00000000 0000ff00 6a04b8b3 2ff1e2c1 c46517e7 d667347a
+ars4x32 7 00000000 00000000 00000000 00000100 00000000 00000000 00000000 0000ff00 9eb3eb63 4308fef5 d5a79ab6 9ff96e30
+ars4x32 7 00000000 00000000 00000000 00010000 00000000 00000000 00000000 0000ff00 3131e370 625a7960 b954d783 8d5e1ceb
+ars4x32 7 00000000 00000000 00000000 01000000 00000000 00000000 00000000 0000ff00 baceb239 b276bc17 2bfdace4 75108304
+ars4x32 7 0000ff00 00000000 00000000 00000000 00000000 00000000 00000000 0000ff00 60007544 26b8e375 0070ef6d 43f7f0cb
+ars4x32 7 00008000 00000000 00000000 00000000 00000000 00000000 00000000 0000ff00 7be23e1e 5747dc9f 8379d38d 2bab83ee
+ars4x32 7 00ff0000 00000000 00000000 00000000 00000000 00000000 00000000 0000ff00 ee5d036d d2d90edd 34834765 9f53affd
+ars4x32 7 00800000 00000000 00000000 00000000 00000000 00000000 00000000 0000ff00 6b57dc82 37fc10ee feff9c27 85dd9d70
+ars4x32 7 ff000000 00000000 00000000 00000000 00000000 00000000 00000000 0000ff00 d0b60125 12434c5e 3a1cca46 ade79259
+ars4x32 7 80000000 00000000 00000000 00000000 00000000 00000000 00000000 0000ff00 ded42a73 ee5dd93d b36d7933 89ac2906
+ars4x32 7 00000000 000000ff 00000000 00000000 00000000 00000000 00000000 0000ff00 dda978d0 e516497f 14385f40 606063cc
+ars4x32 7 00000000 00000080 00000000 00000000 00000000 00000000 00000000 0000ff00 25ad5b4c 0707cee6 c3c95f35 504c730c
+ars4x32 7 00000000 0000ff00 00000000 00000000 00000000 00000000 00000000 0000ff00 cf90e7c3 e8b160f9 5741b506 094c31c1
+ars4x32 7 00000000 00008000 00000000 00000000 00000000 00000000 00000000 0000ff00 e67e5fa4 949d5d9d 40aea83f b9346f56
+ars4x32 7 00000000 00ff0000 00000000 00000000 00000000 00000000 00000000 0000ff00 d93b9673 e8062095 ec216f51 1831cef6
+ars4x32 7 00000000 00800000 00000000 00000000 00000000 00000000 00000000 0000ff00 635c096f e2e438c0 d1b8d51e 8d7e2503
+ars4x32 7 00000000 ff000000 00000000 00000000 00000000 00000000 00000000 0000ff00 b114c194 5625692d 0bb23f33 7304011d
+ars4x32 7 00000000 80000000 00000000 00000000 00000000 00000000 00000000 0000ff00 fb3747a3 ef52cd47 69d89179 09a108c6
+ars4x32 7 00000000 00000000 000000ff 00000000 00000000 00000000 00000000 0000ff00 e64edb80 829bc7a0 268d1a02 e54c9e71
+ars4x32 7 00000000 00000000 00000080 00000000 00000000 00000000 00000000 0000ff00 f18f31b9 2f5ef9e2 e109bb9a 78555284
+ars4x32 7 00000000 00000000 0000ff00 00000000 00000000 00000000 00000000 0000ff00 7630b865 80dfb883 bfb250a2 3748e0a7
+ars4x32 7 00000000 00000000 00008000 00000000 00000000 00000000 00000000 0000ff00 f44eaf8e 2ece190f 1daa5830 47a38a4c
+ars4x32 7 00000000 00000000 00ff0000 00000000 00000000 00000000 00000000 0000ff00 3223ebb4 bffcb90d 4c12a456 bc506ea4
+ars4x32 7 00000000 00000000 00800000 00000000 00000000 00000000 00000000 0000ff00 1fcd3b82 b9afc082 3aa0e466 7637c0aa
+ars4x32 7 00000000 00000000 ff000000 00000000 00000000 00000000 00000000 0000ff00 cf12ceb9 0bb5cbcc 9da02550 d63999b0
+ars4x32 7 00000000 00000000 80000000 00000000 00000000 00000000 00000000 0000ff00 e1daa0ef 79f0f80f 9c9ecc32 dc20c432
+ars4x32 7 00000000 00000000 00000000 000000ff 00000000 00000000 00000000 0000ff00 ec8858fa 42e6894b d8fe0a5f 8a0a07c9
+ars4x32 7 00000000 00000000 00000000 00000080 00000000 00000000 00000000 0000ff00 49072a40 c08d2519 c6055bc6 92577eda
+ars4x32 7 00000000 00000000 00000000 0000ff00 00000000 00000000 00000000 0000ff00 342325fa d8f20b40 c2c3aac5 65147f0a
+ars4x32 7 00000000 00000000 00000000 00008000 00000000 00000000 00000000 0000ff00 264b735c 0e1b4cf1 11ccbc18 450c7f7c
+ars4x32 7 00000000 00000000 00000000 00ff0000 00000000 00000000 00000000 0000ff00 b9cd79c9 9a7ac672 ed3787f9 806bd94f
+ars4x32 7 00000000 00000000 00000000 00800000 00000000 00000000 00000000 0000ff00 6c35f272 6f1aa932 1f3365b0 b7bd24b7
+ars4x32 7 00000000 00000000 00000000 ff000000 00000000 00000000 00000000 0000ff00 cc68caf4 3a97ae1e 793c3f5c 3322417e
+ars4x32 7 00000000 00000000 00000000 80000000 00000000 00000000 00000000 0000ff00 9b90b178 512785d3 d370ddac eb79ee42
+ars4x32 7 886a3f24 d308a385 2e8a1913 44737003 00000000 00000000 00000000 0000ff00 6efe6875 3010187d ca52b0ef 74716ff0
+ars4x32 7 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000000 00000000 0000ff00 b82755f4 19593fe3 cff17ba6 7dac57d4
+ars4x32 7 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000000 00000000 0000ff00 4209f0a9 cae24b27 5a798a39 b321e924
+ars4x32 7 00000001 00000000 00000000 00000000 00000000 00000000 00000000 00008000 9999d86f d5b04c49 99aa4d6a 5249f1b5
+ars4x32 7 00000100 00000000 00000000 00000000 00000000 00000000 00000000 00008000 3a96ddf4 b8ffbf68 c54fa232 e2fd3c77
+ars4x32 7 00010000 00000000 00000000 00000000 00000000 00000000 00000000 00008000 8c8b3ecf f03e1940 4292f136 50f58c35
+ars4x32 7 01000000 00000000 00000000 00000000 00000000 00000000 00000000 00008000 b577e787 f046cfab b157f5a5 befeb264
+ars4x32 7 00000000 00000001 00000000 00000000 00000000 00000000 00000000 00008000 28173c64 98a8e68a ccfbb49d 3db3e06d
+ars4x32 7 00000000 00000100 00000000 00000000 00000000 00000000 00000000 00008000 ade69c8c 2ba7642c 7b75f40f 6573d916
+ars4x32 7 00000000 00010000 00000000 00000000 00000000 00000000 00000000 00008000 33a8fa63 1b348950 10636d86 c02c1cae
+ars4x32 7 00000000 01000000 00000000 00000000 00000000 00000000 00000000 00008000 95ee84ad c3b4c302 b1fa0d5b 39219c4a
+ars4x32 7 00000000 00000000 00000001 00000000 00000000 00000000 00000000 00008000 9c12f262 05966d6f 6d8e0df8 128090d8
+ars4x32 7 00000000 00000000 00000100 00000000 00000000 00000000 00000000 00008000 1d93efae f470bb64 a078b87f 83aab9dd
+ars4x32 7 00000000 00000000 00010000 00000000 00000000 00000000 00000000 00008000 9b5f3253 8b89bc76 66846275 dc68047e
+ars4x32 7 00000000 00000000 01000000 00000000 00000000 00000000 00000000 00008000 0f086cab 81843faf d23d7fab 7f996bfb
+ars4x32 7 00000000 00000000 00000000 00000001 00000000 00000000 00000000 00008000 192f9388 d7392088 2f521dfa e05def2e
+ars4x32 7 00000000 00000000 00000000 00000100 00000000 00000000 00000000 00008000 c8338a4b c1074f84 c74ea356 bbe7b2d7
+ars4x32 7 00000000 00000000 00000000 00010000 00000000 00000000 00000000 00008000 f3f22a4b 40cb0754 3fec10b0 e978eb1c
+ars4x32 7 00000000 00000000 00000000 01000000 00000000 00000000 00000000 00008000 f07ff368 adebb743 f9e19a5a 4268be87
+ars4x32 7 0000ff00 00000000 00000000 00000000 00000000 00000000 00000000 00008000 bbf5ac6e 06f970cf 80e2593b 4da13148
+ars4x32 7 00008000 00000000 00000000 00000000 00000000 00000000 00000000 00008000 652ba9c3 d7f3d5eb d6c46af1 5992e908
+ars4x32 7 00ff0000 00000000 00000000 00000000 00000000 00000000 00000000 00008000 e513bb9f 4e5eecdf ad9cf572 1d2e049b
+ars4x32 7 00800000 00000000 00000000 00000000 00000000 00000000 00000000 00008000 6f7e7212 aaeda863 d328b6fc 7b6d3808
+ars4x32 7 ff000000 00000000 00000000 00000000 00000000 00000000 00000000 00008000 dbe5393c 8e2034b9 b585639a 56e5aabd
+ars4x32 7 80000000 00000000 00000000 00000000 00000000 00000000 00000000 00008000 1d5bbd63 e15c015f 3fd66f0e e9c21cfa
+ars4x32 7 00000000 000000ff 00000000 00000000 00000000 00000000 00000000 00008000 d037c45a e1a6efd0 f3aa3b71 ba68c5c0
+ars4x32 7 00000000 00000080 00000000 00000000 00000000 00000000 00000000 00008000 1a351deb e6921918 b4a8e59a b2b5c926
+ars4x32 7 00000000 0000ff00 00000000 00000000 00000000 00000000 00000000 00008000 182749dc a3c6ebe5 2442f308 a7839bae
+ars4x32 7 00000000 00008000 00000000 00000000 00000000 00000000 00000000 00008000 ddfbbbd4 7d8da7b4 728edfba d30be2f4
+ars4x32 7 00000000 00ff0000 00000000 00000000 00000000 00000000 00000000 00008000 56558acf 3e41130b e42e7286 4b6a3b50
+ars4x32 7 00000000 00800000 00000000 00000000 00000000 00000000 00000000 00008000 ecb9fcb1 88476795 6f82c630 2118c855
+ars4x32 7 00000000 ff000000 00000000 00000000 00000000 00000000 00000000 00008000 8467b6b3 e419570c b96ebe38 fbc8f905
+ars4x32 7 00000000 80000000 00000000 00000000 00000000 00000000 00000000 00008000 78fe5b75 b3b35322 e4e0ea23 14f78048
+ars4x32 7 00000000 00000000 000000ff 00000000 00000000 00000000 00000000 00008000 1745da18 ceabb445 783908d9 26037384
+ars4x32 7 00000000 00000000 00000080 00000000 00000000 00000000 00000000 00008000 a0296cb7 9c833dc4 1e316b0f 0a7367b7
+ars4x32 7 00000000 00000000 0000ff00 00000000 00000000 00000000 00000000 00008000 8be3cbb9 7613179f 310e0ae0 237ed1ee
+ars4x32 7 00000000 00000000 00008000 00000000 00000000 00000000 00000000 00008000 8d42edbc 75bd79f1 c65cb7cd a4c875c7
+ars4x32 7 00000000 00000000 00ff0000 00000000 00000000 00000000 00000000 00008000 d23528d9 21e9b771 34d464aa c4ff2c8d
+ars4x32 7 00000000 00000000 00800000 00000000 00000000 00000000 00000000 00008000 64aa52e7 71c96867 981477d7 2f5c226d
+ars4x32 7 00000000 00000000 ff000000 00000000 00000000 00000000 00000000 00008000 19dbdbed 6b4bd3ef 3ca21d36 d9cf8641
+ars4x32 7 00000000 00000000 80000000 00000000 00000000 00000000 00000000 00008000 7014fdbd a49ab556 1a53f673 d7103a1d
+ars4x32 7 00000000 00000000 00000000 000000ff 00000000 00000000 00000000 00008000 cee680a7 56b7ba5b 83e4cf54 56880773
+ars4x32 7 00000000 00000000 00000000 00000080 00000000 00000000 00000000 00008000 8fe4e861 b51e152e 77d241a4 c3729436
+ars4x32 7 00000000 00000000 00000000 0000ff00 00000000 00000000 00000000 00008000 dac02c8e 04dc6e8c deedd4e3 79192afe
+ars4x32 7 00000000 00000000 00000000 00008000 00000000 00000000 00000000 00008000 3d700b73 ae21f5a9 199e8baf 26b3d711
+ars4x32 7 00000000 00000000 00000000 00ff0000 00000000 00000000 00000000 00008000 44892f95 bb2d1a02 a567e66f 38ea3760
+ars4x32 7 00000000 00000000 00000000 00800000 00000000 00000000 00000000 00008000 a8b94889 fd901188 54ab283c a0a59643
+ars4x32 7 00000000 00000000 00000000 ff000000 00000000 00000000 00000000 00008000 1d0f1f82 c12db848 0623c816 e001f107
+ars4x32 7 00000000 00000000 00000000 80000000 00000000 00000000 00000000 00008000 9c98f9fc 748f2908 0eaebb20 f2abb869
+ars4x32 7 886a3f24 d308a385 2e8a1913 44737003 00000000 00000000 00000000 00008000 173b5371 63012220 8bc6c1ca 5b052e37
+ars4x32 7 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000000 00000000 00008000 5e7e1980 d4f004e3 74e1dd35 06c63ed3
+ars4x32 7 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000000 00000000 00008000 f8585f35 792755dd f3a1ad8d a0fbb9b5
+ars4x32 7 00000001 00000000 00000000 00000000 00000000 00000000 00000000 00ff0000 aec2d436 8450fa0e bd6c2af2 b2e2ea62
+ars4x32 7 00000100 00000000 00000000 00000000 00000000 00000000 00000000 00ff0000 de1716a9 d31542ec 420d8e5f 96edb01e
+ars4x32 7 00010000 00000000 00000000 00000000 00000000 00000000 00000000 00ff0000 8f8cb7f9 061b2e5b 13b57a41 3531eade
+ars4x32 7 01000000 00000000 00000000 00000000 00000000 00000000 00000000 00ff0000 976ae569 5eea786d 2c14232b ef1b689a
+ars4x32 7 00000000 00000001 00000000 00000000 00000000 00000000 00000000 00ff0000 75477164 f695da43 ba81e870 b89589a5
+ars4x32 7 00000000 00000100 00000000 00000000 00000000 00000000 00000000 00ff0000 e55ac2bb 27f6b140 807d1cf1 e78047d4
+ars4x32 7 00000000 00010000 00000000 00000000 00000000 00000000 00000000 00ff0000 ff50a010 b8120cf6 d64a591b df1e78fd
+ars4x32 7 00000000 01000000 00000000 00000000 00000000 00000000 00000000 00ff0000 438426a3 68fa62fc 86f9be7f 179cd401
+ars4x32 7 00000000 00000000 00000001 00000000 00000000 00000000 00000000 00ff0000 95768488 3cdda66d 04781755 5278e78c
+ars4x32 7 00000000 00000000 00000100 00000000 00000000 00000000 00000000 00ff0000 15f585da 1821534c 700462b2 2ac16577
+ars4x32 7 00000000 00000000 00010000 00000000 00000000 00000000 00000000 00ff0000 d13c83a3 92d5a62d 25493930 1bf3ed6a
+ars4x32 7 00000000 00000000 01000000 00000000 00000000 00000000 00000000 00ff0000 60ea84c1 3fff6f6e eb8d52f3 e792bda5
+ars4x32 7 00000000 00000000 00000000 00000001 00000000 00000000 00000000 00ff0000 e8298a66 060fd8bd 4aa82879 c82de151
+ars4x32 7 00000000 00000000 00000000 00000100 00000000 00000000 00000000 00ff0000 419be76a f046e526 2f7585b1 b1a46c03
+ars4x32 7 00000000 00000000 00000000 00010000 00000000 00000000 00000000 00ff0000 6d0e8d83 d96af6fc b360ff30 1f48847a
+ars4x32 7 00000000 00000000 00000000 01000000 00000000 00000000 00000000 00ff0000 13013969 07b3289f f60b3d21 a100b04a
+ars4x32 7 0000ff00 00000000 00000000 00000000 00000000 00000000 00000000 00ff0000 a5858e1f ce56b291 33486dcd ea078153
+ars4x32 7 00008000 00000000 00000000 00000000 00000000 00000000 00000000 00ff0000 f5d6bbfb e20a1bf1 e9d4c738 16d99eee
+ars4x32 7 00ff0000 00000000 00000000 00000000 00000000 00000000 00000000 00ff0000 47257887 2e330955 890cf6c8 0197d72d
+ars4x32 7 00800000 00000000 00000000 00000000 00000000 00000000 00000000 00ff0000 33afed53 723dba58 cf5c22bc 7774a1bf
+ars4x32 7 ff000000 00000000 00000000 00000000 00000000 00000000 00000000 00ff0000 2cd7020d 53397f2a dad07a2e 937c373e
+ars4x32 7 80000000 00000000 00000000 00000000 00000000 00000000 00000000 00ff0000 995409e1 124fa314 d0e81be9 c3bd5823
+ars4x32 7 00000000 000000ff 00000000 00000000 00000000 00000000 00000000 00ff0000 decaafb5 f2af7017 dffa6d3b 4084547b
+ars4x32 7 00000000 00000080 00000000 00000000 00000000 00000000 00000000 00ff0000 e33806e3 bbce22c4 065a8146 18f3e4fb
+ars4x32 7 00000000 0000ff00 00000000 00000000 00000000 00000000 00000000 00ff0000 5e78c26d 6c474b39 4f7bfaa6 547c5c7d
+ars4x32 7 00000000 00008000 00000000 00000000 00000000 00000000 00000000 00ff0000 775e72f9 ef6aa867 3cece2da d3e20ab4
+ars4x32 7 00000000 00ff0000 00000000 00000000 00000000 00000000 00000000 00ff0000 8f5ced18 67bd1184 3305c9d5 c123547e
+ars4x32 7 00000000 00800000 00000000 00000000 00000000 00000000 00000000 00ff0000 7e905e3f e11324ba 12df2ae1 116e1447
+ars4x32 7 00000000 ff000000 00000000 00000000 00000000 00000000 00000000 00ff0000 8e3de9cc 7db83f52 c8bdbbc3 a8209cb9
+ars4x32 7 00000000 80000000 00000000 00000000 00000000 00000000 00000000 00ff0000 06c95f5a a3442340 ff5d70b9 b0150951
+ars4x32 7 00000000 00000000 000000ff 00000000 00000000 00000000 00000000 00ff0000 fa64ffb8 5f6b7ea5 1a8940b8 c2d7a4e2
+ars4x32 7 00000000 00000000 00000080 00000000 00000000 00000000 00000000 00ff0000 39229535 557d82f9 4d1960af 8345401f
+ars4x32 7 00000000 00000000 0000ff00 00000000 00000000 00000000 00000000 00ff0000 c64c071e e9c00095 96cd2a0a 5377835d
+ars4x32 7 00000000 00000000 00008000 00000000 00000000 00000000 00000000 00ff0000 7bf81b02 3c39163a 084d0685 0caba919
+ars4x32 7 00000000 00000000 00ff0000 00000000 00000000 00000000 00000000 00ff0000 24ae41eb 689c1939 d454c719 5dcd1288
+ars4x32 7 00000000 00000000 00800000 00000000 00000000 00000000 00000000 00ff0000 c0bf8717 ba19ac1d cf744187 32d9e41e
+ars4x32 7 00000000 00000000 ff000000 00000000 00000000 00000000 00000000 00ff0000 c8230f78 eecd9fda 52e5791a dc794523
+ars4x32 7 00000000 00000000 80000000 00000000 00000000 00000000 00000000 00ff0000 6a193c9b a65600c4 2760c467 12ce3b0c
+ars4x32 7 00000000 00000000 00000000 000000ff 00000000 00000000 00000000 00ff0000 7f200e53 7201567c 9d6e2655 5566dc40
+ars4x32 7 00000000 00000000 00000000 00000080 00000000 00000000 00000000 00ff0000 2733749b 1244ae8f b003b6d6 0b6cdab0
+ars4x32 7 00000000 00000000 00000000 0000ff00 00000000 00000000 00000000 00ff0000 30926386 795206f4 b369f320 89fead5b
+ars4x32 7 00000000 00000000 00000000 00008000 00000000 00000000 00000000 00ff0000 a87b350a 95f4026c 91e2de67 2a2e63b9
+ars4x32 7 00000000 00000000 00000000 00ff0000 00000000 00000000 00000000 00ff0000 04b9d323 38328c93 5b618e1f db402a8c
+ars4x32 7 00000000 00000000 00000000 00800000 00000000 00000000 00000000 00ff0000 aa266846 6c7bbf03 803238d6 7261b5dc
+ars4x32 7 00000000 00000000 00000000 ff000000 00000000 00000000 00000000 00ff0000 af9dee32 ad0458bd 3afb0ba4 3e79dcb9
+ars4x32 7 00000000 00000000 00000000 80000000 00000000 00000000 00000000 00ff0000 34486962 3b6b724c 30ad6bb4 e12028a0
+ars4x32 7 886a3f24 d308a385 2e8a1913 44737003 00000000 00000000 00000000 00ff0000 98307f93 b7bd1a71 2cab55d1 d8fa0e74
+ars4x32 7 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000000 00000000 00ff0000 78402005 ed9ef8a7 0cedb596 0e90bc22
+ars4x32 7 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000000 00000000 00ff0000 5744b07b 59adac28 18046647 10c93034
+ars4x32 7 00000001 00000000 00000000 00000000 00000000 00000000 00000000 00800000 913ceb51 38138c27 95ef225e cdb73cba
+ars4x32 7 00000100 00000000 00000000 00000000 00000000 00000000 00000000 00800000 2ffeb8f8 d40b8746 c307909a a28bce5b
+ars4x32 7 00010000 00000000 00000000 00000000 00000000 00000000 00000000 00800000 2fa64be7 0f3875aa f42872e6 2b2dd366
+ars4x32 7 01000000 00000000 00000000 00000000 00000000 00000000 00000000 00800000 86c842dc b9bbae51 41ce8725 beceb6e0
+ars4x32 7 00000000 00000001 00000000 00000000 00000000 00000000 00000000 00800000 9160bbfd 4e416ce0 4f552606 0411554a
+ars4x32 7 00000000 00000100 00000000 00000000 00000000 00000000 00000000 00800000 cae9d9ac e80ffdb8 7a4acb5c 05728b4c
+ars4x32 7 00000000 00010000 00000000 00000000 00000000 00000000 00000000 00800000 cb4e3e01 707b04f9 be3d08e0 1e724878
+ars4x32 7 00000000 01000000 00000000 00000000 00000000 00000000 00000000 00800000 f22dc1d1 61efa99b fe4b35c4 42f1ae9f
+ars4x32 7 00000000 00000000 00000001 00000000 00000000 00000000 00000000 00800000 abb51416 704b9fdf b783c974 6b910362
+ars4x32 7 00000000 00000000 00000100 00000000 00000000 00000000 00000000 00800000 48e985f2 1b2f3015 37e33c25 2d14bcd3
+ars4x32 7 00000000 00000000 00010000 00000000 00000000 00000000 00000000 00800000 6f3f2636 bb6aa8e5 9705f884 2cc11782
+ars4x32 7 00000000 00000000 01000000 00000000 00000000 00000000 00000000 00800000 20167428 7bcad5ca c641e404 bef7d4cc
+ars4x32 7 00000000 00000000 00000000 00000001 00000000 00000000 00000000 00800000 506428c3 04978fc6 9fa8d4be 8e3e570f
+ars4x32 7 00000000 00000000 00000000 00000100 00000000 00000000 00000000 00800000 69aa3611 83eadb80 ac09e387 9c0f5d55
+ars4x32 7 00000000 00000000 00000000 00010000 00000000 00000000 00000000 00800000 88417573 160ef3a0 beac468d aff9718f
+ars4x32 7 00000000 00000000 00000000 01000000 00000000 00000000 00000000 00800000 533037a7 50dc35b5 8e01f7b3 880fce38
+ars4x32 7 0000ff00 00000000 00000000 00000000 00000000 00000000 00000000 00800000 09b2a987 58d6ee83 60700022 0b07a0a9
+ars4x32 7 00008000 00000000 00000000 00000000 00000000 00000000 00000000 00800000 08b995e1 75e4ace8 701c1317 5ff425ec
+ars4x32 7 00ff0000 00000000 00000000 00000000 00000000 00000000 00000000 00800000 b56c5fa5 b400898f 6b18aeaa 467780c0
+ars4x32 7 00800000 00000000 00000000 00000000 00000000 00000000 00000000 00800000 5ac8c476 5bc9f43f a83ab541 a7678e64
+ars4x32 7 ff000000 00000000 00000000 00000000 00000000 00000000 00000000 00800000 4dbfd87a aee8d958 5301ed7a b57af9d2
+ars4x32 7 80000000 00000000 00000000 00000000 00000000 00000000 00000000 00800000 ba7dccc3 49e9b6af 2601ec2d 142d19fe
+ars4x32 7 00000000 000000ff 00000000 00000000 00000000 00000000 00000000 00800000 bbee6bb1 25af1268 8c16dc3d 09d51329
+ars4x32 7 00000000 00000080 00000000 00000000 00000000 00000000 00000000 00800000 258d3743 e578bab3 8dca4b33 e244314e
+ars4x32 7 00000000 0000ff00 00000000 00000000 00000000 00000000 00000000 00800000 e7b2e049 637e1b76 8424dd3f 40777e5a
+ars4x32 7 00000000 00008000 00000000 00000000 00000000 00000000 00000000 00800000 cf407bb7 7fe0bdb6 ad2cfed5 825e04d2
+ars4x32 7 00000000 00ff0000 00000000 00000000 00000000 00000000 00000000 00800000 52d3122b df42f504 9328862a badb6776
+ars4x32 7 00000000 00800000 00000000 00000000 00000000 00000000 00000000 00800000 3a63c38b 600be114 99578e15 3f9f13cf
+ars4x32 7 00000000 ff000000 00000000 00000000 00000000 00000000 00000000 00800000 c47cf038 7f7811b6 6989c8a3 e7f4ed71
+ars4x32 7 00000000 80000000 00000000 00000000 00000000 00000000 00000000 00800000 427542a1 c074fad8 df5cfb21 4a67dad8
+ars4x32 7 00000000 00000000 000000ff 00000000 00000000 00000000 00000000 00800000 8bf976fb 7f6991c1 a5bd7a21 dd41ecaa
+ars4x32 7 00000000 00000000 00000080 00000000 00000000 00000000 00000000 00800000 3826a018 504b9d62 c878c336 b04b85dc
+ars4x32 7 00000000 00000000 0000ff00 00000000 00000000 00000000 00000000 00800000 587f2792 59c7af31 6f2737a6 8e59316a
+ars4x32 7 00000000 00000000 00008000 00000000 00000000 00000000 00000000 00800000 fe0e9d1f 128b13b6 c764d11a a372ad18
+ars4x32 7 00000000 00000000 00ff0000 00000000 00000000 00000000 00000000 00800000 8f30d4a3 b2b93b51 6da9656d b868c978
+ars4x32 7 00000000 00000000 00800000 00000000 00000000 00000000 00000000 00800000 909756ee 327575fe ddfe2647 ae53fc4d
+ars4x32 7 00000000 00000000 ff000000 00000000 00000000 00000000 00000000 00800000 4196cbdc 60c6840c bb6d5444 f259f47c
+ars4x32 7 00000000 00000000 80000000 00000000 00000000 00000000 00000000 00800000 0be279c9 e42ecc5f d35705f9 6f7583c1
+ars4x32 7 00000000 00000000 00000000 000000ff 00000000 00000000 00000000 00800000 17af5e04 02c95c18 3f23a503 a2261d4e
+ars4x32 7 00000000 00000000 00000000 00000080 00000000 00000000 00000000 00800000 bcfb6e46 d1a3d60c ea740e5f 12ea6ed1
+ars4x32 7 00000000 00000000 00000000 0000ff00 00000000 00000000 00000000 00800000 3e4add40 4e9c8224 b2361093 609db035
+ars4x32 7 00000000 00000000 00000000 00008000 00000000 00000000 00000000 00800000 76ae32ae 70456796 4e35906d 444508cd
+ars4x32 7 00000000 00000000 00000000 00ff0000 00000000 00000000 00000000 00800000 433e75df bae525fd cfc16bb1 23956a4c
+ars4x32 7 00000000 00000000 00000000 00800000 00000000 00000000 00000000 00800000 a927b4c0 4b64a202 9af94594 ed59a36b
+ars4x32 7 00000000 00000000 00000000 ff000000 00000000 00000000 00000000 00800000 2e2850c5 105bdac7 3be5093b c3367694
+ars4x32 7 00000000 00000000 00000000 80000000 00000000 00000000 00000000 00800000 326ded18 3901a24b cdd54a03 e440b784
+ars4x32 7 886a3f24 d308a385 2e8a1913 44737003 00000000 00000000 00000000 00800000 133d5d06 256a441d 70bf8e82 6cd6089d
+ars4x32 7 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000000 00000000 00800000 4ef00738 868ce320 3b278f38 de4fc31e
+ars4x32 7 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000000 00000000 00800000 28b894f6 94d29fa6 5bc130a9 6cc758d0
+ars4x32 7 00000001 00000000 00000000 00000000 00000000 00000000 00000000 ff000000 830ede16 2c7aedff 98327fad 25585765
+ars4x32 7 00000100 00000000 00000000 00000000 00000000 00000000 00000000 ff000000 688c673f 4feebbd6 4ee8f6dd cb325a2b
+ars4x32 7 00010000 00000000 00000000 00000000 00000000 00000000 00000000 ff000000 7469633d 1c511f43 a5d7f652 5f992c84
+ars4x32 7 01000000 00000000 00000000 00000000 00000000 00000000 00000000 ff000000 e327b087 6b3a38bb dfb0bbcf 6029a7f1
+ars4x32 7 00000000 00000001 00000000 00000000 00000000 00000000 00000000 ff000000 56327af1 3defa922 9873cc35 0fbb01b0
+ars4x32 7 00000000 00000100 00000000 00000000 00000000 00000000 00000000 ff000000 b302a0b9 28bd9cb8 cd998b9e 390348f7
+ars4x32 7 00000000 00010000 00000000 00000000 00000000 00000000 00000000 ff000000 99bbcabe 849548c5 7fd94f01 6fc3d07a
+ars4x32 7 00000000 01000000 00000000 00000000 00000000 00000000 00000000 ff000000 198149ba 35394361 d8fc6c48 b8d63959
+ars4x32 7 00000000 00000000 00000001 00000000 00000000 00000000 00000000 ff000000 69d7d7c7 c0bc9014 ae8b5fa3 d2a89e74
+ars4x32 7 00000000 00000000 00000100 00000000 00000000 00000000 00000000 ff000000 ea950837 fb738fc6 ef4d55d7 04576d0f
+ars4x32 7 00000000 00000000 00010000 00000000 00000000 00000000 00000000 ff000000 3620f982 3ce8fc43 62b7c574 abb7857e
+ars4x32 7 00000000 00000000 01000000 00000000 00000000 00000000 00000000 ff000000 f01f1083 76afb448 c1c8b156 96e1879e
+ars4x32 7 00000000 00000000 00000000 00000001 00000000 00000000 00000000 ff000000 ec9eacc2 6774f522 841c19a4 1f8dda37
+ars4x32 7 00000000 00000000 00000000 00000100 00000000 00000000 00000000 ff000000 ca15575d 1ab3559d 7b18ae12 27e40e29
+ars4x32 7 00000000 00000000 00000000 00010000 00000000 00000000 00000000 ff000000 dcb6d7c6 03d08b0e 5081cc94 8e249c86
+ars4x32 7 00000000 00000000 00000000 01000000 00000000 00000000 00000000 ff000000 a2560187 8a78fec2 67aa93bf e103de82
+ars4x32 7 0000ff00 00000000 00000000 00000000 00000000 00000000 00000000 ff000000 7e93bdaa 3333d2a9 54275e94 29f2558b
+ars4x32 7 00008000 00000000 00000000 00000000 00000000 00000000 00000000 ff000000 4a80089c b95368bf 90fb6f8b 2d894c41
+ars4x32 7 00ff0000 00000000 00000000 00000000 00000000 00000000 00000000 ff000000 f2d44d68 cdb19f20 9747a357 35505875
+ars4x32 7 00800000 00000000 00000000 00000000 00000000 00000000 00000000 ff000000 0291942e 2cb40254 f3dc55e9 7c7221d2
+ars4x32 7 ff000000 00000000 00000000 00000000 00000000 00000000 00000000 ff000000 3a3c5a30 094dc480 328c313f c4fc6fe2
+ars4x32 7 80000000 00000000 00000000 00000000 00000000 00000000 00000000 ff000000 cb7c77d5 5d0f196b 297a4cd7 b02e3eef
+ars4x32 7 00000000 000000ff 00000000 00000000 00000000 00000000 00000000 ff000000 0af3f33d b4444c6f 484a326f 6951a499
+ars4x32 7 00000000 00000080 00000000 00000000 00000000 00000000 00000000 ff000000 7960fd9a 3a445d2f 03a78647 0cc25aa7
+ars4x32 7 00000000 0000ff00 00000000 00000000 00000000 00000000 00000000 ff000000 2c91b280 c10863bf 4136bce5 31ad2c85
+ars4x32 7 00000000 00008000 00000000 00000000 00000000 00000000 00000000 ff000000 44a43b39 8ec6dec2 7debc7db ce0666ee
+ars4x32 7 00000000 00ff0000 00000000 00000000 00000000 00000000 00000000 ff000000 081925c6 522ccff9 a82cdebd 2f9e8fc5
+ars4x32 7 00000000 00800000 00000000 00000000 00000000 00000000 00000000 ff000000 eaafe2a9 f15dd430 7dc169c8 1466e73c
+ars4x32 7 00000000 ff000000 00000000 00000000 00000000 00000000 00000000 ff000000 182f687e 2d7ee0d8 f4c7111e d4568acb
+ars4x32 7 00000000 80000000 00000000 00000000 00000000 00000000 00000000 ff000000 d8581c85 465a6bde 1f27ff17 18522949
+ars4x32 7 00000000 00000000 000000ff 00000000 00000000 00000000 00000000 ff000000 bc596afa ad59cb47 76aa9deb 205ddf74
+ars4x32 7 00000000 00000000 00000080 00000000 00000000 00000000 00000000 ff000000 f7e07727 150aa4af 0beb9007 cd5095fd
+ars4x32 7 00000000 00000000 0000ff00 00000000 00000000 00000000 00000000 ff000000 9618d496 f2b60e55 52125c7f 81e153f7
+ars4x32 7 00000000 00000000 00008000 00000000 00000000 00000000 00000000 ff000000 9fafbcd8 03328635 6e262747 83fc5f6f
+ars4x32 7 00000000 00000000 00ff0000 00000000 00000000 00000000 00000000 ff000000 762f673f 5b94c0b2 2085a682 02705419
+ars4x32 7 00000000 00000000 00800000 00000000 00000000 00000000 00000000 ff000000 b0179103 8d458989 ff0e5982 49f5be90
+ars4x32 7 00000000 00000000 ff000000 00000000 00000000 00000000 00000000 ff000000 d7625e83 26e36f0a 09cbefbf 44469e3c
+ars4x32 7 00000000 00000000 80000000 00000000 00000000 00000000 00000000 ff000000 4f654e80 74f7ba7b 1d71a482 5d2ef42f
+ars4x32 7 00000000 00000000 00000000 000000ff 00000000 00000000 00000000 ff000000 50a9e302 0a88eded 605407d6 961cf688
+ars4x32 7 00000000 00000000 00000000 00000080 00000000 00000000 00000000 ff000000 0e35fc3f 51317e4f 7ec99c9c 247e15e2
+ars4x32 7 00000000 00000000 00000000 0000ff00 00000000 00000000 00000000 ff000000 b79f2dbe d88d92a4 6bdcd12d 0da84be4
+ars4x32 7 00000000 00000000 00000000 00008000 00000000 00000000 00000000 ff000000 28aaf55a 0d457eaa ca39b6bd 9ae11aca
+ars4x32 7 00000000 00000000 00000000 00ff0000 00000000 00000000 00000000 ff000000 f51f42bb 714a3ba4 ecf49d28 3297feaf
+ars4x32 7 00000000 00000000 00000000 00800000 00000000 00000000 00000000 ff000000 34033ef5 ef1a2178 3dc08498 8742b1f8
+ars4x32 7 00000000 00000000 00000000 ff000000 00000000 00000000 00000000 ff000000 42a38dae 356f9800 ee54d9ce 2c8fe759
+ars4x32 7 00000000 00000000 00000000 80000000 00000000 00000000 00000000 ff000000 8ac74af6 db5395b6 3d51c46d bb448a5d
+ars4x32 7 886a3f24 d308a385 2e8a1913 44737003 00000000 00000000 00000000 ff000000 5fe80073 4be63b93 c8bc6459 3647869c
+ars4x32 7 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000000 00000000 ff000000 b0e3dd9a f2f1c750 7a819dcf b5da4539
+ars4x32 7 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000000 00000000 ff000000 e87ec26e 055af8ee 4554a7db b2ff189c
+ars4x32 7 00000001 00000000 00000000 00000000 00000000 00000000 00000000 80000000 26789d39 0b35b558 d134c70a 05f21058
+ars4x32 7 00000100 00000000 00000000 00000000 00000000 00000000 00000000 80000000 b090f71b 0c24e6cd 14c39853 29eea7a1
+ars4x32 7 00010000 00000000 00000000 00000000 00000000 00000000 00000000 80000000 67957e08 82b4de0c 3817a4a4 a7d9c9e5
+ars4x32 7 01000000 00000000 00000000 00000000 00000000 00000000 00000000 80000000 36475912 2e67e681 9186a568 6d3ab920
+ars4x32 7 00000000 00000001 00000000 00000000 00000000 00000000 00000000 80000000 36641fe7 44561777 df4a4071 774a7979
+ars4x32 7 00000000 00000100 00000000 00000000 00000000 00000000 00000000 80000000 13d7c238 ec3445e5 03bf05d0 efc826e4
+ars4x32 7 00000000 00010000 00000000 00000000 00000000 00000000 00000000 80000000 1856302b 2cfd6cef f3c4c4c2 fd97ea43
+ars4x32 7 00000000 01000000 00000000 00000000 00000000 00000000 00000000 80000000 c82ecfc9 246d99da ee5a939a df4e2ec7
+ars4x32 7 00000000 00000000 00000001 00000000 00000000 00000000 00000000 80000000 b3057d65 5f4857fe 161fd575 eb1af21d
+ars4x32 7 00000000 00000000 00000100 00000000 00000000 00000000 00000000 80000000 493e26c7 ab8a8a12 b2c7522e ee623a12
+ars4x32 7 00000000 00000000 00010000 00000000 00000000 00000000 00000000 80000000 54fb2c88 9b0a6e74 afe9a75c 5ac60579
+ars4x32 7 00000000 00000000 01000000 00000000 00000000 00000000 00000000 80000000 4708dd7f 9772ca07 09d43d7b d657da70
+ars4x32 7 00000000 00000000 00000000 00000001 00000000 00000000 00000000 80000000 1866cb47 ec4a45b5 51415a63 62edcebd
+ars4x32 7 00000000 00000000 00000000 00000100 00000000 00000000 00000000 80000000 f48b91c7 c7f95960 f75596d2 7d66e99c
+ars4x32 7 00000000 00000000 00000000 00010000 00000000 00000000 00000000 80000000 30fd74da 8416b1b8 acfad80a 74183a32
+ars4x32 7 00000000 00000000 00000000 01000000 00000000 00000000 00000000 80000000 60abf0c9 a8f16c38 6aecc856 77585d18
+ars4x32 7 0000ff00 00000000 00000000 00000000 00000000 00000000 00000000 80000000 95ecca0f a586b316 49039c99 db7c3ced
+ars4x32 7 00008000 00000000 00000000 00000000 00000000 00000000 00000000 80000000 69b6c8dd c867ff5c c29fbfd2 bb8abad8
+ars4x32 7 00ff0000 00000000 00000000 00000000 00000000 00000000 00000000 80000000 91bd9101 1ade8c27 dd03d6cf 4a2f609d
+ars4x32 7 00800000 00000000 00000000 00000000 00000000 00000000 00000000 80000000 9fe8eb8d c0f1ad2c ff1b02c2 13e53657
+ars4x32 7 ff000000 00000000 00000000 00000000 00000000 00000000 00000000 80000000 d2737890 1c5bf29a 60c1876b d0e6375f
+ars4x32 7 80000000 00000000 00000000 00000000 00000000 00000000 00000000 80000000 a36d95f2 e1b3836b 16e07380 530e046a
+ars4x32 7 00000000 000000ff 00000000 00000000 00000000 00000000 00000000 80000000 49a80c7f 38e8f470 5297276c 2a15f290
+ars4x32 7 00000000 00000080 00000000 00000000 00000000 00000000 00000000 80000000 129069a4 34691701 1e540326 459225e0
+ars4x32 7 00000000 0000ff00 00000000 00000000 00000000 00000000 00000000 80000000 0aeef630 536d89b1 62698a9b 75935d28
+ars4x32 7 00000000 00008000 00000000 00000000 00000000 00000000 00000000 80000000 ed53e002 2f4dafd2 c699a3ce c518f265
+ars4x32 7 00000000 00ff0000 00000000 00000000 00000000 00000000 00000000 80000000 fe8314d1 430aba3a 903a1b95 383b4771
+ars4x32 7 00000000 00800000 00000000 00000000 00000000 00000000 00000000 80000000 32ef00e3 a8288238 7925c333 09305962
+ars4x32 7 00000000 ff000000 00000000 00000000 00000000 00000000 00000000 80000000 faa6902d d4e9436b 117ef210 cc580c65
+ars4x32 7 00000000 80000000 00000000 00000000 00000000 00000000 00000000 80000000 da277aa7 b9bcc78d 7682a753 7f111edb
+ars4x32 7 00000000 00000000 000000ff 00000000 00000000 00000000 00000000 80000000 cf776645 b25583c1 6afc73ed 563c5124
+ars4x32 7 00000000 00000000 00000080 00000000 00000000 00000000 00000000 80000000 8e5c34e2 4b8ae101 e9f7f828 e3f5ca55
+ars4x32 7 00000000 00000000 0000ff00 00000000 00000000 00000000 00000000 80000000 2419a489 22144205 48ae6a07 6e461b03
+ars4x32 7 00000000 00000000 00008000 00000000 00000000 00000000 00000000 80000000 26896192 7988e1c2 c9517654 68253c81
+ars4x32 7 00000000 00000000 00ff0000 00000000 00000000 00000000 00000000 80000000 757d6cfb f7030e88 9248f577 32a75662
+ars4x32 7 00000000 00000000 00800000 00000000 00000000 00000000 00000000 80000000 36fd2e12 e975bc10 3078eace be3302dd
+ars4x32 7 00000000 00000000 ff000000 00000000 00000000 00000000 00000000 80000000 c14e818d 97df0638 c264b1de 5d478b0e
+ars4x32 7 00000000 00000000 80000000 00000000 00000000 00000000 00000000 80000000 e3ba2b28 9db21117 896fa5d6 a803d2b9
+ars4x32 7 00000000 00000000 00000000 000000ff 00000000 00000000 00000000 80000000 a569e149 bc4c5eab 2452fc82 01d2e698
+ars4x32 7 00000000 00000000 00000000 00000080 00000000 00000000 00000000 80000000 b407f105 4e2bf500 52e0672a bfb546db
+ars4x32 7 00000000 00000000 00000000 0000ff00 00000000 00000000 00000000 80000000 d69cde49 60f9ec60 bb175073 cf0d97e7
+ars4x32 7 00000000 00000000 00000000 00008000 00000000 00000000 00000000 80000000 fe0a7ffe f6d1bcf2 b98768d8 7e94a046
+ars4x32 7 00000000 00000000 00000000 00ff0000 00000000 00000000 00000000 80000000 a3432cf6 10539085 0f7d7a9b e14c6dee
+ars4x32 7 00000000 00000000 00000000 00800000 00000000 00000000 00000000 80000000 baee3cbe 194d47c1 7dc26b0f a063a426
+ars4x32 7 00000000 00000000 00000000 ff000000 00000000 00000000 00000000 80000000 8e864bfc a7c4c727 4c946170 af4dd13d
+ars4x32 7 00000000 00000000 00000000 80000000 00000000 00000000 00000000 80000000 b6c08c48 52962db9 88508917 4dd4aaff
+ars4x32 7 886a3f24 d308a385 2e8a1913 44737003 00000000 00000000 00000000 80000000 31e3f0cc 92d1e3cc a2fdaa6c 902c741b
+ars4x32 7 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000000 00000000 80000000 378edc3f 0de9ca93 eabe8ab2 8b2f1d2e
+ars4x32 7 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000000 00000000 80000000 394a7bc3 4d049c56 b0e3d5a5 dcb070b5
+ars4x32 10 00000001 00000000 00000000 00000000 00000001 00000000 00000000 00000000 3789b2f9 cf3e7bfc 51bafd66 e5c2f16c
+ars4x32 10 00000100 00000000 00000000 00000000 00000001 00000000 00000000 00000000 419e7cee 1634c377 ac441b35 b5fdad47
+ars4x32 10 00010000 00000000 00000000 00000000 00000001 00000000 00000000 00000000 8f5a5777 3966ef14 a179a3a6 68bd181a
+ars4x32 10 01000000 00000000 00000000 00000000 00000001 00000000 00000000 00000000 598460c9 f5a72152 18876ff0 6499a688
+ars4x32 10 00000000 00000001 00000000 00000000 00000001 00000000 00000000 00000000 1e482dbb 2a7d29e4 abd679be 27f0d406
+ars4x32 10 00000000 00000100 00000000 00000000 00000001 00000000 00000000 00000000 4e2cb77d 76586ea3 20b8a841 abe1ae74
+ars4x32 10 00000000 00010000 00000000 00000000 00000001 00000000 00000000 00000000 9dbd160e bea9c9bc 2b30c629 a7563f10
+ars4x32 10 00000000 01000000 00000000 00000000 00000001 00000000 00000000 00000000 dc7e94c1 a7c5a4d0 1132a44c 095cb974
+ars4x32 10 00000000 00000000 00000001 00000000 00000001 00000000 00000000 00000000 dbdbc6af 3ea7b4f4 219b4da7 47161831
+ars4x32 10 00000000 00000000 00000100 00000000 00000001 00000000 00000000 00000000 f3a905df df16c950 92e4d08e 0ccaa78f
+ars4x32 10 00000000 00000000 00010000 00000000 00000001 00000000 00000000 00000000 d948e4cc 4f6e190c 0d73a820 c492e4ea
+ars4x32 10 00000000 00000000 01000000 00000000 00000001 00000000 00000000 00000000 28adb021 4ba7a2c6 e2e147bd 41f1d499
+ars4x32 10 00000000 00000000 00000000 00000001 00000001 00000000 00000000 00000000 4febfa99 150b2760 42b439ab 644be146
+ars4x32 10 00000000 00000000 00000000 00000100 00000001 00000000 00000000 00000000 5d4ec2f9 0b058beb 06ee5c54 40d84bfd
+ars4x32 10 00000000 00000000 00000000 00010000 00000001 00000000 00000000 00000000 62b8f839 5efa5122 91dcbecc d338fda6
+ars4x32 10 00000000 00000000 00000000 01000000 00000001 00000000 00000000 00000000 992fcee9 92f851d3 686e3c09 2f99ac38
+ars4x32 10 0000ff00 00000000 00000000 00000000 00000001 00000000 00000000 00000000 dd3052a2 e18f6d4d a56acffb 7e788c8a
+ars4x32 10 00008000 00000000 00000000 00000000 00000001 00000000 00000000 00000000 f53537d6 a25397f4 894699bf 69fcc395
+ars4x32 10 00ff0000 00000000 00000000 00000000 00000001 00000000 00000000 00000000 d7a2c9fc e5cc90ea 5309405a 8513cb0a
+ars4x32 10 00800000 00000000 00000000 00000000 00000001 00000000 00000000 00000000 f588d19d e91f4772 8b088d79 79c222e8
+ars4x32 10 ff000000 00000000 00000000 00000000 00000001 00000000 00000000 00000000 23fa982b 4d2f59e5 7c4259d5 efa0c6bc
+ars4x32 10 80000000 00000000 00000000 00000000 00000001 00000000 00000000 00000000 f98c4b1f 68cc558d ae0b81ea 01f64bf8
+ars4x32 10 00000000 000000ff 00000000 00000000 00000001 00000000 00000000 00000000 31816f80 faaccbe9 7cf8f6ad b150f7e0
+ars4x32 10 00000000 00000080 00000000 00000000 00000001 00000000 00000000 00000000 cfb3111e d9c0e672 b199fc26 7d00477b
+ars4x32 10 00000000 0000ff00 00000000 00000000 00000001 00000000 00000000 00000000 8fd7f747 1d1829ac 0768c9b2 15461738
+ars4x32 10 00000000 00008000 00000000 00000000 00000001 00000000 00000000 00000000 7bf0f87d f7574711 f2060d65 2d4648ca
+ars4x32 10 00000000 00ff0000 00000000 00000000 00000001 00000000 00000000 00000000 a25a23a4 59e31c12 43b7712f 3b4db0b7
+ars4x32 10 00000000 00800000 00000000 00000000 00000001 00000000 00000000 00000000 9bb76c81 13279319 da45e911 e7acf8ac
+ars4x32 10 00000000 ff000000 00000000 00000000 00000001 00000000 00000000 00000000 45c6e2e7 1c1064b5 8cc499c0 60a32751
+ars4x32 10 00000000 80000000 00000000 00000000 00000001 00000000 00000000 00000000 ea1329f0 b4e46d1c 800e51a9 7abe2fb6
+ars4x32 10 00000000 00000000 000000ff 00000000 00000001 00000000 00000000 00000000 5385535f 75fd78fe 7627488b ae1cd2ec
+ars4x32 10 00000000 00000000 00000080 00000000 00000001 00000000 00000000 00000000 59637a22 8c35edc1 f80a44e4 a3c7aea9
+ars4x32 10 00000000 00000000 0000ff00 00000000 00000001 00000000 00000000 00000000 77755dc9 106066b3 694b91f8 e3ea193d
+ars4x32 10 00000000 00000000 00008000 00000000 00000001 00000000 00000000 00000000 f05f3386 1cab5701 8937931b c617bcd1
+ars4x32 10 00000000 00000000 00ff0000 00000000 00000001 00000000 00000000 00000000 ea05d264 8cbe6a05 f64e9f3e 39d51fca
+ars4x32 10 00000000 00000000 00800000 00000000 00000001 00000000 00000000 00000000 1db2d166 c8b21f45 897084ea 35c3bf03
+ars4x32 10 00000000 00000000 ff000000 00000000 00000001 00000000 00000000 00000000 f2b2c107 5e0a0c79 f4ccd6ee f28b47e3
+ars4x32 10 00000000 00000000 80000000 00000000 00000001 00000000 00000000 00000000 01ac4859 eb71b2ce 40dfc98a e4217138
+ars4x32 10 00000000 00000000 00000000 000000ff 00000001 00000000 00000000 00000000 0d1001e5 f20e6f86 196988ab a0bda0b9
+ars4x32 10 00000000 00000000 00000000 00000080 00000001 00000000 00000000 00000000 e1fc3ada a9cfe2d6 072e60e8 08110681
+ars4x32 10 00000000 00000000 00000000 0000ff00 00000001 00000000 00000000 00000000 db24279e 2d1845bf 385a2256 3da77f6b
+ars4x32 10 00000000 00000000 00000000 00008000 00000001 00000000 00000000 00000000 234f6deb 9200575b 61cfb986 055d4a4d
+ars4x32 10 00000000 00000000 00000000 00ff0000 00000001 00000000 00000000 00000000 7af7d320 10013dd4 3c765651 1d6fcf32
+ars4x32 10 00000000 00000000 00000000 00800000 00000001 00000000 00000000 00000000 635342f1 e8f843da 42926271 bc0f9c38
+ars4x32 10 00000000 00000000 00000000 ff000000 00000001 00000000 00000000 00000000 4ef05c09 5d6f2a07 2dbe6c53 40aa3a76
+ars4x32 10 00000000 00000000 00000000 80000000 00000001 00000000 00000000 00000000 618f6832 57cc23f0 e06b3858 7b8cc711
+ars4x32 10 886a3f24 d308a385 2e8a1913 44737003 00000001 00000000 00000000 00000000 21d40a5c 21e528aa a1a359eb 9c02b159
+ars4x32 10 223809a4 d0319f29 98fa2e08 896c4eec 00000001 00000000 00000000 00000000 42e0f6c1 5a350cc7 ca3d7163 bab442a1
+ars4x32 10 e6212845 7713d038 cf6654be 6c0ce934 00000001 00000000 00000000 00000000 417063dd 05895c8c aa1ad0f2 8a7e2516
+ars4x32 10 00000001 00000000 00000000 00000000 00000100 00000000 00000000 00000000 72a0ac1f 480fae16 3ee35313 d59218d1
+ars4x32 10 00000100 00000000 00000000 00000000 00000100 00000000 00000000 00000000 909a04f3 dee070ac 5d34d9f6 0057f628
+ars4x32 10 00010000 00000000 00000000 00000000 00000100 00000000 00000000 00000000 9a214df4 a4449843 b5ad1ada edaa299d
+ars4x32 10 01000000 00000000 00000000 00000000 00000100 00000000 00000000 00000000 4846ef73 06c41885 6741882b 4d09e74a
+ars4x32 10 00000000 00000001 00000000 00000000 00000100 00000000 00000000 00000000 71d41253 9e730f5b 9705647d e25d4f88
+ars4x32 10 00000000 00000100 00000000 00000000 00000100 00000000 00000000 00000000 5adf8f61 784b1b6f 7c95509d afbfe97d
+ars4x32 10 00000000 00010000 00000000 00000000 00000100 00000000 00000000 00000000 994f3797 8bfeb14d 2c321c99 e88b5b0b
+ars4x32 10 00000000 01000000 00000000 00000000 00000100 00000000 00000000 00000000 3ce918ed 6302e8eb 4ffcbf54 4bd82ec6
+ars4x32 10 00000000 00000000 00000001 00000000 00000100 00000000 00000000 00000000 3d5fe3f7 ab107c15 6dcc7326 2824fb0d
+ars4x32 10 00000000 00000000 00000100 00000000 00000100 00000000 00000000 00000000 765b3288 51c9afcb a4c5741e 5bbeb453
+ars4x32 10 00000000 00000000 00010000 00000000 00000100 00000000 00000000 00000000 cec5baf1 93d7d9fc 3096a8e9 e277db63
+ars4x32 10 00000000 00000000 01000000 00000000 00000100 00000000 00000000 00000000 73d2fbb8 f299bef8 f4dc31cd f0338bd6
+ars4x32 10 00000000 00000000 00000000 00000001 00000100 00000000 00000000 00000000 0b8824b9 96d0f8fd 4d0fc3f9 d35cbe7b
+ars4x32 10 00000000 00000000 00000000 00000100 00000100 00000000 00000000 00000000 62f0abf0 a89ca8c1 05c82cc9 3cb5c328
+ars4x32 10 00000000 00000000 00000000 00010000 00000100 00000000 00000000 00000000 085e56bd 1d91f6ea 3c29fec0 1f703b97
+ars4x32 10 00000000 00000000 00000000 01000000 00000100 00000000 00000000 00000000 3a2f8790 5fba0608 f9992841 3de27411
+ars4x32 10 0000ff00 00000000 00000000 00000000 00000100 00000000 00000000 00000000 ed032a22 05db0314 e8b6fa9e 1cd7d7dd
+ars4x32 10 00008000 00000000 00000000 00000000 00000100 00000000 00000000 00000000 2b4c41b1 f5d7550b 96494e63 9dee9b50
+ars4x32 10 00ff0000 00000000 00000000 00000000 00000100 00000000 00000000 00000000 7f046111 ef2b88be d7e01af1 c8540447
+ars4x32 10 00800000 00000000 00000000 00000000 00000100 00000000 00000000 00000000 8904c8b5 1bff107c 89de1122 f078fe9e
+ars4x32 10 ff000000 00000000 00000000 00000000 00000100 00000000 00000000 00000000 91d45dec fe7a07dd 003e5ca6 98b2f680
+ars4x32 10 80000000 00000000 00000000 00000000 00000100 00000000 00000000 00000000 66e6c7c0 3d668856 bd6208df dd6c0b04
+ars4x32 10 00000000 000000ff 00000000 00000000 00000100 00000000 00000000 00000000 12165f49 5bb73eab ebe55978 d391b601
+ars4x32 10 00000000 00000080 00000000 00000000 00000100 00000000 00000000 00000000 9096afe3 8c271d02 02d21b32 20c3a8b9
+ars4x32 10 00000000 0000ff00 00000000 00000000 00000100 00000000 00000000 00000000 2b13a66e b47a554a ceb1047e 1fa90048
+ars4x32 10 00000000 00008000 00000000 00000000 00000100 00000000 00000000 00000000 f056db2d deaaa7ce 829d9400 8457dad7
+ars4x32 10 00000000 00ff0000 00000000 00000000 00000100 00000000 00000000 00000000 c2ec8828 0987967a ea4e82f9 da6cb8eb
+ars4x32 10 00000000 00800000 00000000 00000000 00000100 00000000 00000000 00000000 c4a587d7 4eae030f 71af5aa7 17470690
+ars4x32 10 00000000 ff000000 00000000 00000000 00000100 00000000 00000000 00000000 b37dcd16 221b0d99 9c3ee696 b5a768eb
+ars4x32 10 00000000 80000000 00000000 00000000 00000100 00000000 00000000 00000000 e3528871 e932bab8 3b5575fa 640afb7b
+ars4x32 10 00000000 00000000 000000ff 00000000 00000100 00000000 00000000 00000000 14377abb 63c257a7 271e195c b3c779fa
+ars4x32 10 00000000 00000000 00000080 00000000 00000100 00000000 00000000 00000000 4a8b3b3c 2f2d8018 95f0f21d 70cc5020
+ars4x32 10 00000000 00000000 0000ff00 00000000 00000100 00000000 00000000 00000000 ef4d408f c66ddec4 cf3e8e5b 2e4d80a6
+ars4x32 10 00000000 00000000 00008000 00000000 00000100 00000000 00000000 00000000 195c0040 e612419d 6870bb86 037c5e1c
+ars4x32 10 00000000 00000000 00ff0000 00000000 00000100 00000000 00000000 00000000 716308b0 8845c05a bfec797f 178fccb3
+ars4x32 10 00000000 00000000 00800000 00000000 00000100 00000000 00000000 00000000 0144107c b2391277 2a953a84 17b80885
+ars4x32 10 00000000 00000000 ff000000 00000000 00000100 00000000 00000000 00000000 d6c2189d 2f394669 b780f227 1d7f1b9f
+ars4x32 10 00000000 00000000 80000000 00000000 00000100 00000000 00000000 00000000 0c53c3e4 bfeb3488 560ac071 9076c1ed
+ars4x32 10 00000000 00000000 00000000 000000ff 00000100 00000000 00000000 00000000 06cd9d79 8725dc30 e8620e96 832b78b2
+ars4x32 10 00000000 00000000 00000000 00000080 00000100 00000000 00000000 00000000 590a48df c970e88e 215eff00 5f65a014
+ars4x32 10 00000000 00000000 00000000 0000ff00 00000100 00000000 00000000 00000000 b6be10a4 54e96084 f7b1c020 5667a715
+ars4x32 10 00000000 00000000 00000000 00008000 00000100 00000000 00000000 00000000 0158f44f 096ba2ba b7ccce1a 1ee18eb7
+ars4x32 10 00000000 00000000 00000000 00ff0000 00000100 00000000 00000000 00000000 e2aeff6c 3c9f9df9 75d95894 96e56309
+ars4x32 10 00000000 00000000 00000000 00800000 00000100 00000000 00000000 00000000 e43683f9 6d48b586 89822f15 c24ab59e
+ars4x32 10 00000000 00000000 00000000 ff000000 00000100 00000000 00000000 00000000 91535e7f 89114f9f c173e3a4 b0ac992a
+ars4x32 10 00000000 00000000 00000000 80000000 00000100 00000000 00000000 00000000 99af942b fe15e28d 0eb06c81 62509724
+ars4x32 10 886a3f24 d308a385 2e8a1913 44737003 00000100 00000000 00000000 00000000 5b594541 b7fab0dc 89f9ca5d ea0db0de
+ars4x32 10 223809a4 d0319f29 98fa2e08 896c4eec 00000100 00000000 00000000 00000000 a3703024 38b84df2 a4686a4c c2a647f5
+ars4x32 10 e6212845 7713d038 cf6654be 6c0ce934 00000100 00000000 00000000 00000000 ff22a6fe 66be6769 aec16d23 905b0622
+ars4x32 10 00000001 00000000 00000000 00000000 00010000 00000000 00000000 00000000 fd1af696 5378a483 2a7902de d90db43e
+ars4x32 10 00000100 00000000 00000000 00000000 00010000 00000000 00000000 00000000 5b8189ee d7af776f 58b70db1 8b21950f
+ars4x32 10 00010000 00000000 00000000 00000000 00010000 00000000 00000000 00000000 aae746c3 335eb675 a093d5d7 4437e425
+ars4x32 10 01000000 00000000 00000000 00000000 00010000 00000000 00000000 00000000 4183ba0e 2c7f021a 9b5e19be 961ef6b9
+ars4x32 10 00000000 00000001 00000000 00000000 00010000 00000000 00000000 00000000 8cfaf2cd 9679da95 f58b3663 13dece23
+ars4x32 10 00000000 00000100 00000000 00000000 00010000 00000000 00000000 00000000 a4c5273c 93f1e56e 00c1b09e 8fe9f0a3
+ars4x32 10 00000000 00010000 00000000 00000000 00010000 00000000 00000000 00000000 de7add1b 7b602b8b 6f51d466 d5b704f7
+ars4x32 10 00000000 01000000 00000000 00000000 00010000 00000000 00000000 00000000 3b0ac4d1 1604d0e9 c2efbeb8 49234e1d
+ars4x32 10 00000000 00000000 00000001 00000000 00010000 00000000 00000000 00000000 0b137f97 68b33f23 94c15a81 b9b0eb77
+ars4x32 10 00000000 00000000 00000100 00000000 00010000 00000000 00000000 00000000 dca890a0 a82d10a7 0c548dd9 935541dd
+ars4x32 10 00000000 00000000 00010000 00000000 00010000 00000000 00000000 00000000 bb299133 967b5068 c3c080cd afb20355
+ars4x32 10 00000000 00000000 01000000 00000000 00010000 00000000 00000000 00000000 05b8865b 2b4bbba1 a0769fd0 68eefc0f
+ars4x32 10 00000000 00000000 00000000 00000001 00010000 00000000 00000000 00000000 f69dfef6 3b4bead5 5fceac0f 73b6cb5d
+ars4x32 10 00000000 00000000 00000000 00000100 00010000 00000000 00000000 00000000 71b4613f c0f36665 75746911 75fc8724
+ars4x32 10 00000000 00000000 00000000 00010000 00010000 00000000 00000000 00000000 87bce4ef 0763cd7e ac659500 dcd4abe5
+ars4x32 10 00000000 00000000 00000000 01000000 00010000 00000000 00000000 00000000 1334dcee a9e3a84b f5541b4b fa03c8c3
+ars4x32 10 0000ff00 00000000 00000000 00000000 00010000 00000000 00000000 00000000 b00ef56f 052800d1 f563e286 e3e0c3c6
+ars4x32 10 00008000 00000000 00000000 00000000 00010000 00000000 00000000 00000000 06fd42be d01bd239 8dfc2b89 178357cc
+ars4x32 10 00ff0000 00000000 00000000 00000000 00010000 00000000 00000000 00000000 1d3e451b 1dd7fad8 a9147b03 7ee20538
+ars4x32 10 00800000 00000000 00000000 00000000 00010000 00000000 00000000 00000000 555d8ec6 0764fbde 5649615a d700e43e
+ars4x32 10 ff000000 00000000 00000000 00000000 00010000 00000000 00000000 00000000 11eb0368 f5f67768 35bfa350 f3f0ff8f
+ars4x32 10 80000000 00000000 00000000 00000000 00010000 00000000 00000000 00000000 5ed1e7d1 6180fd1a 4e755be0 dcda0759
+ars4x32 10 00000000 000000ff 00000000 00000000 00010000 00000000 00000000 00000000 20ea794e 29e33a57 8ab149b6 f867e36f
+ars4x32 10 00000000 00000080 00000000 00000000 00010000 00000000 00000000 00000000 7c091aab e38ab356 5d488601 89edc670
+ars4x32 10 00000000 0000ff00 00000000 00000000 00010000 00000000 00000000 00000000 8174879e b33931a4 5d0c5717 ae86c09c
+ars4x32 10 00000000 00008000 00000000 00000000 00010000 00000000 00000000 00000000 d741a12a 69239d5d ccbab809 b88e680d
+ars4x32 10 00000000 00ff0000 00000000 00000000 00010000 00000000 00000000 00000000 0a718384 2ad5217d a98b5369 b917ff13
+ars4x32 10 00000000 00800000 00000000 00000000 00010000 00000000 00000000 00000000 0b7dc6ba 15709a53 f9ba3787 b14a4762
+ars4x32 10 00000000 ff000000 00000000 00000000 00010000 00000000 00000000 00000000 ed61078d 146e50da c907e4ce 504676b4
+ars4x32 10 00000000 80000000 00000000 00000000 00010000 00000000 00000000 00000000 21b4604c fd5740e3 9c4e16de 5c97f02b
+ars4x32 10 00000000 00000000 000000ff 00000000 00010000 00000000 00000000 00000000 4618e0bd 7723923b fff48883 488b574c
+ars4x32 10 00000000 00000000 00000080 00000000 00010000 00000000 00000000 00000000 830e64af 8a583bd0 877e69b3 2889afd3
+ars4x32 10 00000000 00000000 0000ff00 00000000 00010000 00000000 00000000 00000000 c9982b20 703c4841 8d27bbdc 658c69e7
+ars4x32 10 00000000 00000000 00008000 00000000 00010000 00000000 00000000 00000000 e65236c6 43d9f184 44306648 ab1234d7
+ars4x32 10 00000000 00000000 00ff0000 00000000 00010000 00000000 00000000 00000000 ee67b8e8 64d2128b 85a2de0e 93a9aff6
+ars4x32 10 00000000 00000000 00800000 00000000 00010000 00000000 00000000 00000000 66d264e4 a46aa477 4c735fb0 9d59c142
+ars4x32 10 00000000 00000000 ff000000 00000000 00010000 00000000 00000000 00000000 8e17378f 267db9e2 d12a015f 18fbe34f
+ars4x32 10 00000000 00000000 80000000 00000000 00010000 00000000 00000000 00000000 f3439b2c fadad898 25014f01 5099d9f5
+ars4x32 10 00000000 00000000 00000000 000000ff 00010000 00000000 00000000 00000000 3eeebe70 bc9a61d9 afbcdae9 4f87accf
+ars4x32 10 00000000 00000000 00000000 00000080 00010000 00000000 00000000 00000000 60b54112 73002122 cc8949b3 e5821081
+ars4x32 10 00000000 00000000 00000000 0000ff00 00010000 00000000 00000000 00000000 70852928 211bab69 86b713dc 2234fddb
+ars4x32 10 00000000 00000000 00000000 00008000 00010000 00000000 00000000 00000000 97992054 2e7cf8a6 f7cbcd18 585e18bd
+ars4x32 10 00000000 00000000 00000000 00ff0000 00010000 00000000 00000000 00000000 511b8cf0 f5bdc929 dd620ff5 a3f29b63
+ars4x32 10 00000000 00000000 00000000 00800000 00010000 00000000 00000000 00000000 552608b7 49a1b891 96658c98 b8655fe2
+ars4x32 10 00000000 00000000 00000000 ff000000 00010000 00000000 00000000 00000000 ef7d4bf4 e9f48f98 b56a03ec f4a406c0
+ars4x32 10 00000000 00000000 00000000 80000000 00010000 00000000 00000000 00000000 4eda0692 f78cdc59 a8df1cc3 54192d76
+ars4x32 10 886a3f24 d308a385 2e8a1913 44737003 00010000 00000000 00000000 00000000 5550ef69 36bc1242 5bc4d226 57dfc1fd
+ars4x32 10 223809a4 d0319f29 98fa2e08 896c4eec 00010000 00000000 00000000 00000000 9eea7478 7181135b 9c46c00e 14ab98cb
+ars4x32 10 e6212845 7713d038 cf6654be 6c0ce934 00010000 00000000 00000000 00000000 0e83e4e0 2c1a2165 03e84f54 bad9495a
+ars4x32 10 00000001 00000000 00000000 00000000 01000000 00000000 00000000 00000000 fc860b1c 81fd3b9b e00affc5 371e9791
+ars4x32 10 00000100 00000000 00000000 00000000 01000000 00000000 00000000 00000000 7c48a581 57f33193 c825dd82 ced9cd59
+ars4x32 10 00010000 00000000 00000000 00000000 01000000 00000000 00000000 00000000 ab3fbb2a f0c5af6c e0c8032e c7625f7c
+ars4x32 10 01000000 00000000 00000000 00000000 01000000 00000000 00000000 00000000 93af7909 9477151a 257f9650 75d45378
+ars4x32 10 00000000 00000001 00000000 00000000 01000000 00000000 00000000 00000000 de139644 12373518 10a91988 b46ff4c9
+ars4x32 10 00000000 00000100 00000000 00000000 01000000 00000000 00000000 00000000 15d90584 72abfec9 e90d0b25 087a54aa
+ars4x32 10 00000000 00010000 00000000 00000000 01000000 00000000 00000000 00000000 f454dd05 18db0405 ba4da74e 135e6dd7
+ars4x32 10 00000000 01000000 00000000 00000000 01000000 00000000 00000000 00000000 57223ac0 691401c5 04289c5f 1fd99b47
+ars4x32 10 00000000 00000000 00000001 00000000 01000000 00000000 00000000 00000000 4d01c327 7eb0aae9 f8dbc2d1 4449f6da
+ars4x32 10 00000000 00000000 00000100 00000000 01000000 00000000 00000000 00000000 8802025e 2335325c 10681d07 485fa32d
+ars4x32 10 00000000 00000000 00010000 00000000 01000000 00000000 00000000 00000000 91fdb751 1e470175 13154e9b bd7a980c
+ars4x32 10 00000000 00000000 01000000 00000000 01000000 00000000 00000000 00000000 90de49e9 71233994 8524b5d9 9e02d455
+ars4x32 10 00000000 00000000 00000000 00000001 01000000 00000000 00000000 00000000 ad2d1804 acee0a47 bab650ea d4e5cb98
+ars4x32 10 00000000 00000000 00000000 00000100 01000000 00000000 00000000 00000000 f046e106 b280a9f6 af60ab90 3d102592
+ars4x32 10 00000000 00000000 00000000 00010000 01000000 00000000 00000000 00000000 437e3d76 6a0864c1 244daddf 6a018f67
+ars4x32 10 00000000 00000000 00000000 01000000 01000000 00000000 00000000 00000000 fc995c91 5eeb4755 2ed9f981 f4c15509
+ars4x32 10 0000ff00 00000000 00000000 00000000 01000000 00000000 00000000 00000000 3b59c5d2 70ba805d b0ea3ebd 0e369797
+ars4x32 10 00008000 00000000 00000000 00000000 01000000 00000000 00000000 00000000 80c308fc 49264772 811ea2e6 0332d35f
+ars4x32 10 00ff0000 00000000 00000000 00000000 01000000 00000000 00000000 00000000 b59962e6 31218d76 eb1dc97e 09d71d31
+ars4x32 10 00800000 00000000 00000000 00000000 01000000 00000000 00000000 00000000 94049e5b 21f2ad69 aaeea03b 2dbe9379
+ars4x32 10 ff000000 00000000 00000000 00000000 01000000 00000000 00000000 00000000 86b06282 ddc76d90 47b21c7a 6d426bb8
+ars4x32 10 80000000 00000000 00000000 00000000 01000000 00000000 00000000 00000000 80f4e2bd f5b8d606 563e0268 5c79dee5
+ars4x32 10 00000000 000000ff 00000000 00000000 01000000 00000000 00000000 00000000 1701491b 144d5be1 7a2abfa6 1539d924
+ars4x32 10 00000000 00000080 00000000 00000000 01000000 00000000 00000000 00000000 2df222cd 1e1d897a a8338527 0d932cbb
+ars4x32 10 00000000 0000ff00 00000000 00000000 01000000 00000000 00000000 00000000 158de244 1384539d 0820155b b97fbfde
+ars4x32 10 00000000 00008000 00000000 00000000 01000000 00000000 00000000 00000000 472c8495 a2ffa86e 0f8f0023 02725dcd
+ars4x32 10 00000000 00ff0000 00000000 00000000 01000000 00000000 00000000 00000000 41498fde da77bceb dad8421f 6c03848b
+ars4x32 10 00000000 00800000 00000000 00000000 01000000 00000000 00000000 00000000 6485b186 a59cc5d2 d235ca5a ddb2a88a
+ars4x32 10 00000000 ff000000 00000000 00000000 01000000 00000000 00000000 00000000 51a11ce0 4ee3b8d6 3eedc6c5 42fc8b28
+ars4x32 10 00000000 80000000 00000000 00000000 01000000 00000000 00000000 00000000 4091fc6c 65000c0c 1236a673 c3d26d7e
+ars4x32 10 00000000 00000000 000000ff 00000000 01000000 00000000 00000000 00000000 498db7a3 386ecc4f 1b39a73e 61a74aa6
+ars4x32 10 00000000 00000000 00000080 00000000 01000000 00000000 00000000 00000000 4faf0b29 8aab2130 81b0d347 a1c0701e
+ars4x32 10 00000000 00000000 0000ff00 00000000 01000000 00000000 00000000 00000000 da0b6dd1 d5ecde42 99cd9db1 410c63b6
+ars4x32 10 00000000 00000000 00008000 00000000 01000000 00000000 00000000 00000000 11873158 9c5af954 4afd1c56 ef1a5b58
+ars4x32 10 00000000 00000000 00ff0000 00000000 01000000 00000000 00000000 00000000 2577dc2d c937bf7e 70db2e79 12fec747
+ars4x32 10 00000000 00000000 00800000 00000000 01000000 00000000 00000000 00000000 84125aa3 95cd880f 84b3a5ae 5bc903d5
+ars4x32 10 00000000 00000000 ff000000 00000000 01000000 00000000 00000000 00000000 491bff18 a58abc16 980f071b 3efc1a0f
+ars4x32 10 00000000 00000000 80000000 00000000 01000000 00000000 00000000 00000000 3bf95ff6 e2331d1e 1d7120f5 909ef332
+ars4x32 10 00000000 00000000 00000000 000000ff 01000000 00000000 00000000 00000000 cbf60703 aefcd779 c448583e fd7e1d9f
+ars4x32 10 00000000 00000000 00000000 00000080 01000000 00000000 00000000 00000000 694d10a6 83259031 7eac1d10 876c6404
+ars4x32 10 00000000 00000000 00000000 0000ff00 01000000 00000000 00000000 00000000 d3d427ec 67a13a84 5bdcb359 37356889
+ars4x32 10 00000000 00000000 00000000 00008000 01000000 00000000 00000000 00000000 2790c7e3 3b276547 4e807221 811fc030
+ars4x32 10 00000000 00000000 00000000 00ff0000 01000000 00000000 00000000 00000000 e9b889b3 07dc1d5c 69d3481f 088a62a3
+ars4x32 10 00000000 00000000 00000000 00800000 01000000 00000000 00000000 00000000 3b19c924 8eb03fee 7729ea7d 208a494f
+ars4x32 10 00000000 00000000 00000000 ff000000 01000000 00000000 00000000 00000000 838374fa ce7514da 84b027c5 bb34b237
+ars4x32 10 00000000 00000000 00000000 80000000 01000000 00000000 00000000 00000000 81617bdf 3cbce010 39410cbd 8f866b7e
+ars4x32 10 886a3f24 d308a385 2e8a1913 44737003 01000000 00000000 00000000 00000000 beb5befb 81de37f7 9d71d7f3 1355920a
+ars4x32 10 223809a4 d0319f29 98fa2e08 896c4eec 01000000 00000000 00000000 00000000 95d1beab 03d40658 8a3c77c8 c7ff1269
+ars4x32 10 e6212845 7713d038 cf6654be 6c0ce934 01000000 00000000 00000000 00000000 b7fde77f 17befdd0 62cdc28e df0fc922
+ars4x32 10 00000001 00000000 00000000 00000000 00000000 00000001 00000000 00000000 bfd4f3d1 ecc3187a cdff4528 1718ed47
+ars4x32 10 00000100 00000000 00000000 00000000 00000000 00000001 00000000 00000000 40ce4318 f222abd1 d504fc5c 2bcfb432
+ars4x32 10 00010000 00000000 00000000 00000000 00000000 00000001 00000000 00000000 acb1f467 2e1e7d92 8ae54caa 4c40966d
+ars4x32 10 01000000 00000000 00000000 00000000 00000000 00000001 00000000 00000000 31f42074 9b42fec4 6904b2e6 a0394425
+ars4x32 10 00000000 00000001 00000000 00000000 00000000 00000001 00000000 00000000 97bf20ea 01410ccd 903cbe64 9a01639a
+ars4x32 10 00000000 00000100 00000000 00000000 00000000 00000001 00000000 00000000 7eabeb65 5838f760 b6d5acb7 9946e5f3
+ars4x32 10 00000000 00010000 00000000 00000000 00000000 00000001 00000000 00000000 9293178d 1488e417 92b6b94c 6bee2ed3
+ars4x32 10 00000000 01000000 00000000 00000000 00000000 00000001 00000000 00000000 e1e6e986 ff6a5697 6990f8e7 2ff09e37
+ars4x32 10 00000000 00000000 00000001 00000000 00000000 00000001 00000000 00000000 30641bb8 95408420 559d692f 9da284a8
+ars4x32 10 00000000 00000000 00000100 00000000 00000000 00000001 00000000 00000000 d367be4f 153ce862 ec4caf3e b541f0c9
+ars4x32 10 00000000 00000000 00010000 00000000 00000000 00000001 00000000 00000000 3e38cb33 a34ca8b2 a5ce5b8f c3698852
+ars4x32 10 00000000 00000000 01000000 00000000 00000000 00000001 00000000 00000000 459a9382 dcfb0e97 b448d680 ad54f2e0
+ars4x32 10 00000000 00000000 00000000 00000001 00000000 00000001 00000000 00000000 d8b662a7 fdcf5fc6 8362b5d1 c49d7fdd
+ars4x32 10 00000000 00000000 00000000 00000100 00000000 00000001 00000000 00000000 631d0b89 aa692571 3b6fbd45 23b148ec
+ars4x32 10 00000000 00000000 00000000 00010000 00000000 00000001 00000000 00000000 2d239410 b738d860 03a139fd 83c2e20f
+ars4x32 10 00000000 00000000 00000000 01000000 00000000 00000001 00000000 00000000 78f4cc47 8e254e87 423e3555 bdd03738
+ars4x32 10 0000ff00 00000000 00000000 00000000 00000000 00000001 00000000 00000000 96100ad9 afb67343 a017ef86 e81ff838
+ars4x32 10 00008000 00000000 00000000 00000000 00000000 00000001 00000000 00000000 a31342cd be973fc0 cd421b80 4ce07c86
+ars4x32 10 00ff0000 00000000 00000000 00000000 00000000 00000001 00000000 00000000 75040d45 c26cc386 1a72b4d8 168c7cc7
+ars4x32 10 00800000 00000000 00000000 00000000 00000000 00000001 00000000 00000000 7b391fd8 721c3746 5b681c84 1ed54b5c
+ars4x32 10 ff000000 00000000 00000000 00000000 00000000 00000001 00000000 00000000 2710673e 74feb97b 5da20bcf dd664a98
+ars4x32 10 80000000 00000000 00000000 00000000 00000000 00000001 00000000 00000000 5b29f83b 1cc13a86 c33cea1f 078f80e9
+ars4x32 10 00000000 000000ff 00000000 00000000 00000000 00000001 00000000 00000000 646f76d2 bcd60477 b114f75a 675d0eaf
+ars4x32 10 00000000 00000080 00000000 00000000 00000000 00000001 00000000 00000000 7e7fcfa1 5447f6c0 45acb805 ce1e029d
+ars4x32 10 00000000 0000ff00 00000000 00000000 00000000 00000001 00000000 00000000 f6c0cdd6 c00123bc dbdd876a 809954db
+ars4x32 10 00000000 00008000 00000000 00000000 00000000 00000001 00000000 00000000 1444a4c7 114a1082 ab0826e8 41b7ceff
+ars4x32 10 00000000 00ff0000 00000000 00000000 00000000 00000001 00000000 00000000 da769fd5 5dab338d d2651bf4 8ff5e181
+ars4x32 10 00000000 00800000 00000000 00000000 00000000 00000001 00000000 00000000 5f49458b f30e7822 37318817 431d9788
+ars4x32 10 00000000 ff000000 00000000 00000000 00000000 00000001 00000000 00000000 cd545d32 91fdfca3 ee1bc378 d5de49e3
+ars4x32 10 00000000 80000000 00000000 00000000 00000000 00000001 00000000 00000000 e2daef77 fdca4c2e af7e0fbe c4f92ca0
+ars4x32 10 00000000 00000000 000000ff 00000000 00000000 00000001 00000000 00000000 3c35a24d 054f1076 5608cdfe e0daab21
+ars4x32 10 00000000 00000000 00000080 00000000 00000000 00000001 00000000 00000000 2e7757ad 966ab208 d833608e bf8d94eb
+ars4x32 10 00000000 00000000 0000ff00 00000000 00000000 00000001 00000000 00000000 00efc870 541575d6 00596efa 9735d2d0
+ars4x32 10 00000000 00000000 00008000 00000000 00000000 00000001 00000000 00000000 c4de9e0a cd3b7939 19c2ca34 91cc6caa
+ars4x32 10 00000000 00000000 00ff0000 00000000 00000000 00000001 00000000 00000000 ad5c7145 608b2764 2688d22a 4ce0fbf8
+ars4x32 10 00000000 00000000 00800000 00000000 00000000 00000001 00000000 00000000 f41ba454 80441dfc 3405e53b d794fd33
+ars4x32 10 00000000 00000000 ff000000 00000000 00000000 00000001 00000000 00000000 60be9130 b451879b 19922d8f 1f9a4fd3
+ars4x32 10 00000000 00000000 80000000 00000000 00000000 00000001 00000000 00000000 67800d7c 07db99ce 6ffbcfc7 755321a4
+ars4x32 10 00000000 00000000 00000000 000000ff 00000000 00000001 00000000 00000000 13894f1d 2488f85d e904b6f0 3840c79f
+ars4x32 10 00000000 00000000 00000000 00000080 00000000 00000001 00000000 00000000 58f7922b aa6ce608 d93bd8d8 3ca9f6ea
+ars4x32 10 00000000 00000000 00000000 0000ff00 00000000 00000001 00000000 00000000 528acc48 9aa02e61 5521500e 18555b6c
+ars4x32 10 00000000 00000000 00000000 00008000 00000000 00000001 00000000 00000000 508109ec 559b7023 64e3e562 2df69fba
+ars4x32 10 00000000 00000000 00000000 00ff0000 00000000 00000001 00000000 00000000 18b56a1a 417812b1 263c7be3 b37183c1
+ars4x32 10 00000000 00000000 00000000 00800000 00000000 00000001 00000000 00000000 c0d51b22 2fbc6c94 57bc4bd6 68cf5022
+ars4x32 10 00000000 00000000 00000000 ff000000 00000000 00000001 00000000 00000000 2e7460db 9fa33fee 41d322bd f82953c5
+ars4x32 10 00000000 00000000 00000000 80000000 00000000 00000001 00000000 00000000 6477708d b6ed7061 fb9047db 8a42e3cf
+ars4x32 10 886a3f24 d308a385 2e8a1913 44737003 00000000 00000001 00000000 00000000 41e2795a f4c16966 19d92cf2 2ca279a9
+ars4x32 10 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000001 00000000 00000000 58b993db 5576ccd3 74d2aba9 ccc12df4
+ars4x32 10 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000001 00000000 00000000 aaf7fc35 5f3edfb9 6ccd2e41 23239042
+ars4x32 10 00000001 00000000 00000000 00000000 00000000 00000100 00000000 00000000 060e57e2 5b2951fc f1a12bba 6ee00755
+ars4x32 10 00000100 00000000 00000000 00000000 00000000 00000100 00000000 00000000 74c867ed a4d7421a 9096722a dbfe336b
+ars4x32 10 00010000 00000000 00000000 00000000 00000000 00000100 00000000 00000000 c22c998a c1cc03e1 9321470c 1a917550
+ars4x32 10 01000000 00000000 00000000 00000000 00000000 00000100 00000000 00000000 b3399733 41a29fc2 f853ab4f a5335c76
+ars4x32 10 00000000 00000001 00000000 00000000 00000000 00000100 00000000 00000000 4748503e 0cac3731 08b43c28 978e8899
+ars4x32 10 00000000 00000100 00000000 00000000 00000000 00000100 00000000 00000000 06ed60de fddd401d 42481e9f 75b1a5a3
+ars4x32 10 00000000 00010000 00000000 00000000 00000000 00000100 00000000 00000000 6721c6c7 d20d3ebe f3fe66b5 ff71a033
+ars4x32 10 00000000 01000000 00000000 00000000 00000000 00000100 00000000 00000000 95ba8f60 67834224 a72d0de8 15cbdfa7
+ars4x32 10 00000000 00000000 00000001 00000000 00000000 00000100 00000000 00000000 2fddcba6 995c62e9 2958150d b9f739df
+ars4x32 10 00000000 00000000 00000100 00000000 00000000 00000100 00000000 00000000 3a2813c1 7a71f3a9 a556f619 21cba117
+ars4x32 10 00000000 00000000 00010000 00000000 00000000 00000100 00000000 00000000 ba1c117b 81b89f93 201c9b0b 111e7fc3
+ars4x32 10 00000000 00000000 01000000 00000000 00000000 00000100 00000000 00000000 e7bf6a5a 03c8d18b f1b9a08d 63a58137
+ars4x32 10 00000000 00000000 00000000 00000001 00000000 00000100 00000000 00000000 eacd39d2 c0b6a1f1 94322d0b c6c343aa
+ars4x32 10 00000000 00000000 00000000 00000100 00000000 00000100 00000000 00000000 dbaf44de edfe1d58 36275f08 3986269e
+ars4x32 10 00000000 00000000 00000000 00010000 00000000 00000100 00000000 00000000 a57d1092 2f544c57 13bc0871 fa43d886
+ars4x32 10 00000000 00000000 00000000 01000000 00000000 00000100 00000000 00000000 5a9a6ce7 650a3536 9f6e6f49 3891361d
+ars4x32 10 0000ff00 00000000 00000000 00000000 00000000 00000100 00000000 00000000 1d628619 73d8a773 18f02dbf e8ff2d8b
+ars4x32 10 00008000 00000000 00000000 00000000 00000000 00000100 00000000 00000000 10bbe054 e899a607 e6f6c151 4fa59102
+ars4x32 10 00ff0000 00000000 00000000 00000000 00000000 00000100 00000000 00000000 00d3c748 0412c157 030d7094 bbb9b671
+ars4x32 10 00800000 00000000 00000000 00000000 00000000 00000100 00000000 00000000 b1f4fb4e cf597a37 bc42d357 77fef051
+ars4x32 10 ff000000 00000000 00000000 00000000 00000000 00000100 00000000 00000000 bcdbfc69 2d2f450e 2f48a872 0e5a2aad
+ars4x32 10 80000000 00000000 00000000 00000000 00000000 00000100 00000000 00000000 9a195442 9cf3a70b fb778338 be621807
+ars4x32 10 00000000 000000ff 00000000 00000000 00000000 00000100 00000000 00000000 8f746c68 0f34e2cb a9bbad63 fcb9ed3e
+ars4x32 10 00000000 00000080 00000000 00000000 00000000 00000100 00000000 00000000 e209361f b9d770d0 f0401031 14471c8c
+ars4x32 10 00000000 0000ff00 00000000 00000000 00000000 00000100 00000000 00000000 14587472 aee079a7 9d248e9b 84bf98d5
+ars4x32 10 00000000 00008000 00000000 00000000 00000000 00000100 00000000 00000000 5617cd7e cf121cb3 a7fea455 602172fe
+ars4x32 10 00000000 00ff0000 00000000 00000000 00000000 00000100 00000000 00000000 ebcf671f 5c5b7c31 c23126a7 8a213279
+ars4x32 10 00000000 00800000 00000000 00000000 00000000 00000100 00000000 00000000 a2c9274b 0df40531 0e1fb929 12c747d4
+ars4x32 10 00000000 ff000000 00000000 00000000 00000000 00000100 00000000 00000000 08671a9f 3c455428 b10ed0ff a03c7578
+ars4x32 10 00000000 80000000 00000000 00000000 00000000 00000100 00000000 00000000 ab400477 e772d792 c852367e b3be7c96
+ars4x32 10 00000000 00000000 000000ff 00000000 00000000 00000100 00000000 00000000 8ad68f38 00412fbe 5d7b18be e168bac7
+ars4x32 10 00000000 00000000 00000080 00000000 00000000 00000100 00000000 00000000 74c7af57 08dc5f8b 3ab9cd75 cdd2b74a
+ars4x32 10 00000000 00000000 0000ff00 00000000 00000000 00000100 00000000 00000000 992ce9ed 8d739ea1 21aba89a 4f4001d3
+ars4x32 10 00000000 00000000 00008000 00000000 00000000 00000100 00000000 00000000 13ad16b2 bd562f32 a42a41ef 736d72b2
+ars4x32 10 00000000 00000000 00ff0000 00000000 00000000 00000100 00000000 00000000 cb573a84 0f0ddb71 1f5a43f1 e874ea9e
+ars4x32 10 00000000 00000000 00800000 00000000 00000000 00000100 00000000 00000000 aefac238 c2550422 e7c52da2 1e296fb1
+ars4x32 10 00000000 00000000 ff000000 00000000 00000000 00000100 00000000 00000000 31ee3d43 ca3deb61 fb236218 36ce79e0
+ars4x32 10 00000000 00000000 80000000 00000000 00000000 00000100 00000000 00000000 0173e654 5938583b 134210ce faaf72cf
+ars4x32 10 00000000 00000000 00000000 000000ff 00000000 00000100 00000000 00000000 71d627bf d946907f a0632309 b1e5cf47
+ars4x32 10 00000000 00000000 00000000 00000080 00000000 00000100 00000000 00000000 2b7a2f55 1b843650 566c98b8 5b792892
+ars4x32 10 00000000 00000000 00000000 0000ff00 00000000 00000100 00000000 00000000 6449f4cb d91cc504 8e90409e 15ced0ce
+ars4x32 10 00000000 00000000 00000000 00008000 00000000 00000100 00000000 00000000 8174d8b0 c0ee31ef 972940b1 403d1f21
+ars4x32 10 00000000 00000000 00000000 00ff0000 00000000 00000100 00000000 00000000 80f58285 8bb0a5e2 78664e39 5222725a
+ars4x32 10 00000000 00000000 00000000 00800000 00000000 00000100 00000000 00000000 a6e5122d 86a514fc 699eaf15 3a32b327
+ars4x32 10 00000000 00000000 00000000 ff000000 00000000 00000100 00000000 00000000 168f76ba 20b994ee 62f80250 d965092b
+ars4x32 10 00000000 00000000 00000000 80000000 00000000 00000100 00000000 00000000 6c332825 becccb7e 8a044408 38e14a79
+ars4x32 10 886a3f24 d308a385 2e8a1913 44737003 00000000 00000100 00000000 00000000 62e41263 47de94d7 3bef0ab5 99b7c6c3
+ars4x32 10 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000100 00000000 00000000 df68edfe f42fbd44 552f75c1 449bff8d
+ars4x32 10 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000100 00000000 00000000 32409ac9 d4afe040 3d4166b7 b5ba0843
+ars4x32 10 00000001 00000000 00000000 00000000 00000000 00010000 00000000 00000000 79744520 ab471dee 2229ee76 142f29a5
+ars4x32 10 00000100 00000000 00000000 00000000 00000000 00010000 00000000 00000000 da1f0f64 3ac98f1a dfcfdc39 91c5493c
+ars4x32 10 00010000 00000000 00000000 00000000 00000000 00010000 00000000 00000000 8063c637 8143b753 efbb9cc6 a4779ea0
+ars4x32 10 01000000 00000000 00000000 00000000 00000000 00010000 00000000 00000000 41c71d46 39e540b0 b1edeb98 3f40c392
+ars4x32 10 00000000 00000001 00000000 00000000 00000000 00010000 00000000 00000000 e3010a49 beecef10 19fed042 d6d65129
+ars4x32 10 00000000 00000100 00000000 00000000 00000000 00010000 00000000 00000000 c61ae084 122f9d86 417c0ab6 64f63ddd
+ars4x32 10 00000000 00010000 00000000 00000000 00000000 00010000 00000000 00000000 088ac5bb 0cd34875 75552299 b46d2df9
+ars4x32 10 00000000 01000000 00000000 00000000 00000000 00010000 00000000 00000000 472a81ed a0f827b8 ea577e51 efee88e1
+ars4x32 10 00000000 00000000 00000001 00000000 00000000 00010000 00000000 00000000 245b80d4 511c60bc fda74051 4cc6874c
+ars4x32 10 00000000 00000000 00000100 00000000 00000000 00010000 00000000 00000000 1a874d01 b1fa2411 8a79844a 609e11d0
+ars4x32 10 00000000 00000000 00010000 00000000 00000000 00010000 00000000 00000000 5b0e23d8 94ded59e 4f0280e4 4de98d46
+ars4x32 10 00000000 00000000 01000000 00000000 00000000 00010000 00000000 00000000 b396a7e4 adc70056 ce376050 7028adb3
+ars4x32 10 00000000 00000000 00000000 00000001 00000000 00010000 00000000 00000000 6e21e594 7a62bd3e 4abb9ed4 838dc27c
+ars4x32 10 00000000 00000000 00000000 00000100 00000000 00010000 00000000 00000000 88974616 cf4faf02 ee9f97d4 b7f44dfa
+ars4x32 10 00000000 00000000 00000000 00010000 00000000 00010000 00000000 00000000 6e263cf1 791e4a77 69213927 51eb46d0
+ars4x32 10 00000000 00000000 00000000 01000000 00000000 00010000 00000000 00000000 17a1f6b9 450efddb 5f369ea1 e259d647
+ars4x32 10 0000ff00 00000000 00000000 00000000 00000000 00010000 00000000 00000000 db2b30fd 1eb49923 6e46d2ad b41ea3e2
+ars4x32 10 00008000 00000000 00000000 00000000 00000000 00010000 00000000 00000000 cdf245ec 1eafa5af c8d72b40 1e7e33b0
+ars4x32 10 00ff0000 00000000 00000000 00000000 00000000 00010000 00000000 00000000 112ea2b5 eeb733dd d9190cf1 d6fca246
+ars4x32 10 00800000 00000000 00000000 00000000 00000000 00010000 00000000 00000000 156db0b5 afdb177e 882309da b3acd61c
+ars4x32 10 ff000000 00000000 00000000 00000000 00000000 00010000 00000000 00000000 666d782b 0c479c66 b149ccd0 b822c6a8
+ars4x32 10 80000000 00000000 00000000 00000000 00000000 00010000 00000000 00000000 3c3871b8 ec24e8f0 24949528 302f11c0
+ars4x32 10 00000000 000000ff 00000000 00000000 00000000 00010000 00000000 00000000 b94bb344 533ec7fc 2ee3a059 f15953bf
+ars4x32 10 00000000 00000080 00000000 00000000 00000000 00010000 00000000 00000000 9bcf62ce 52c7fad3 1df2cfaa ba441314
+ars4x32 10 00000000 0000ff00 00000000 00000000 00000000 00010000 00000000 00000000 3d86e62b 0b798100 18f85c0b c758eaff
+ars4x32 10 00000000 00008000 00000000 00000000 00000000 00010000 00000000 00000000 503004e7 ef0fbb14 098e9cdc ce9eb330
+ars4x32 10 00000000 00ff0000 00000000 00000000 00000000 00010000 00000000 00000000 a5ca0432 f1b38bb4 5b9a8918 ff286165
+ars4x32 10 00000000 00800000 00000000 00000000 00000000 00010000 00000000 00000000 c1c96fee 935518f6 67986b63 f2c8a5cd
+ars4x32 10 00000000 ff000000 00000000 00000000 00000000 00010000 00000000 00000000 8fe8428e ddfaf73c 563ef193 090dc8db
+ars4x32 10 00000000 80000000 00000000 00000000 00000000 00010000 00000000 00000000 6398312c dfd17c95 c85f20d3 f618c47b
+ars4x32 10 00000000 00000000 000000ff 00000000 00000000 00010000 00000000 00000000 333d8f64 3fb516e2 bb91bd0e a031b72e
+ars4x32 10 00000000 00000000 00000080 00000000 00000000 00010000 00000000 00000000 15d89365 a663b6ee 20f86c41 24e71dbc
+ars4x32 10 00000000 00000000 0000ff00 00000000 00000000 00010000 00000000 00000000 6865715a 19a35bfd fcbbeafa 44b787e4
+ars4x32 10 00000000 00000000 00008000 00000000 00000000 00010000 00000000 00000000 5ae0faf9 8779d15d 524734e3 a7f0cf34
+ars4x32 10 00000000 00000000 00ff0000 00000000 00000000 00010000 00000000 00000000 ee108acb 4d5a248c 52045add 2ddf877d
+ars4x32 10 00000000 00000000 00800000 00000000 00000000 00010000 00000000 00000000 6b99345b 5e99a8a3 f396433e a9d49c98
+ars4x32 10 00000000 00000000 ff000000 00000000 00000000 00010000 00000000 00000000 059bfcc1 c7584fbd 3f1e4a70 ac3957ed
+ars4x32 10 00000000 00000000 80000000 00000000 00000000 00010000 00000000 00000000 b6d51c0e cfcf17ae cf3b9440 00fc2908
+ars4x32 10 00000000 00000000 00000000 000000ff 00000000 00010000 00000000 00000000 6c728ec5 f8f32e4b 4b35172a f8f8395c
+ars4x32 10 00000000 00000000 00000000 00000080 00000000 00010000 00000000 00000000 28dbd11e b5748583 934b929e a6700643
+ars4x32 10 00000000 00000000 00000000 0000ff00 00000000 00010000 00000000 00000000 811ceff5 2eea3339 e548ef68 15c50b0f
+ars4x32 10 00000000 00000000 00000000 00008000 00000000 00010000 00000000 00000000 e2883bbc 74ea0e81 fb1756e3 943d29b0
+ars4x32 10 00000000 00000000 00000000 00ff0000 00000000 00010000 00000000 00000000 5f3863d1 4a71611b b2c055a2 79e7fa19
+ars4x32 10 00000000 00000000 00000000 00800000 00000000 00010000 00000000 00000000 69c24de1 6e892c47 e493bf8c 2899cc43
+ars4x32 10 00000000 00000000 00000000 ff000000 00000000 00010000 00000000 00000000 cbd7176f 72a9ab45 93c16a50 f3fe8bc6
+ars4x32 10 00000000 00000000 00000000 80000000 00000000 00010000 00000000 00000000 d75a6592 be01362b 7976f7d3 0adbb2a8
+ars4x32 10 886a3f24 d308a385 2e8a1913 44737003 00000000 00010000 00000000 00000000 3ddaafe2 6fe742c5 354f8a52 d6d29e5a
+ars4x32 10 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00010000 00000000 00000000 ef6fb762 4cd0001d 16c68b0b 2dbb0aba
+ars4x32 10 e6212845 7713d038 cf6654be 6c0ce934 00000000 00010000 00000000 00000000 7995d3ed d1ff5dd4 a66c5408 b7b57f46
+ars4x32 10 00000001 00000000 00000000 00000000 00000000 01000000 00000000 00000000 3fb0f209 ec46902b b0cb92f0 71cd4dc8
+ars4x32 10 00000100 00000000 00000000 00000000 00000000 01000000 00000000 00000000 e37240c3 940ecd2c 8a8b8880 825c2d60
+ars4x32 10 00010000 00000000 00000000 00000000 00000000 01000000 00000000 00000000 874b17f1 25ddfd8e dbb86906 c239527e
+ars4x32 10 01000000 00000000 00000000 00000000 00000000 01000000 00000000 00000000 b4216b45 8d5efd6c d0b0cf3c afc15920
+ars4x32 10 00000000 00000001 00000000 00000000 00000000 01000000 00000000 00000000 1c0a1a33 0c58d79a 1dc31f0a 3f3e48ad
+ars4x32 10 00000000 00000100 00000000 00000000 00000000 01000000 00000000 00000000 f1131a69 c1ada617 09b19130 bb3a2dd6
+ars4x32 10 00000000 00010000 00000000 00000000 00000000 01000000 00000000 00000000 d7c2737f f4e4cd53 8d555496 bc8588cb
+ars4x32 10 00000000 01000000 00000000 00000000 00000000 01000000 00000000 00000000 54e46015 02c0955b 570df0fa 5a4ee4ce
+ars4x32 10 00000000 00000000 00000001 00000000 00000000 01000000 00000000 00000000 330d20b0 becff70f 69e6b919 edfa2357
+ars4x32 10 00000000 00000000 00000100 00000000 00000000 01000000 00000000 00000000 9c521989 4b461e45 c1728d66 47a5c9e3
+ars4x32 10 00000000 00000000 00010000 00000000 00000000 01000000 00000000 00000000 98930d07 5b30e46c 86d53a54 dc47bd07
+ars4x32 10 00000000 00000000 01000000 00000000 00000000 01000000 00000000 00000000 4ba983e8 06bbbcd3 30d0c62e 3de153b5
+ars4x32 10 00000000 00000000 00000000 00000001 00000000 01000000 00000000 00000000 e9ee0e5a 4a518bec 48d97ffb 1a051110
+ars4x32 10 00000000 00000000 00000000 00000100 00000000 01000000 00000000 00000000 7382e3ed a18970ab 114f2724 94722940
+ars4x32 10 00000000 00000000 00000000 00010000 00000000 01000000 00000000 00000000 459b82b3 1ebb9005 5b8b6b37 dddc4c1d
+ars4x32 10 00000000 00000000 00000000 01000000 00000000 01000000 00000000 00000000 9f5a2184 e3010010 8b75e977 6f9e0698
+ars4x32 10 0000ff00 00000000 00000000 00000000 00000000 01000000 00000000 00000000 77c4a50c b3d073e7 c3e061e7 56118fe4
+ars4x32 10 00008000 00000000 00000000 00000000 00000000 01000000 00000000 00000000 d9d8eb8e e2370636 2d916219 39ad2085
+ars4x32 10 00ff0000 00000000 00000000 00000000 00000000 01000000 00000000 00000000 28e28abe 3972d404 31eb3d2f 0324d171
+ars4x32 10 00800000 00000000 00000000 00000000 00000000 01000000 00000000 00000000 1ee43af3 02e8fb9e 9b94a6b8 213cbc8d
+ars4x32 10 ff000000 00000000 00000000 00000000 00000000 01000000 00000000 00000000 96ba9165 84971203 2a5af6d7 cfbe4757
+ars4x32 10 80000000 00000000 00000000 00000000 00000000 01000000 00000000 00000000 f3b43fb3 7c208a83 a33d5ddd 2206abdd
+ars4x32 10 00000000 000000ff 00000000 00000000 00000000 01000000 00000000 00000000 a8621d78 c3bdef73 40fa56d4 9d5df72d
+ars4x32 10 00000000 00000080 00000000 00000000 00000000 01000000 00000000 00000000 53117285 512402a4 002f894c 1fca6b16
+ars4x32 10 00000000 0000ff00 00000000 00000000 00000000 01000000 00000000 00000000 c6e4be24 808dc4d1 4d0485fd c0445b33
+ars4x32 10 00000000 00008000 00000000 00000000 00000000 01000000 00000000 00000000 8b9639ad 06d9825d 2bccd907 7a288325
+ars4x32 10 00000000 00ff0000 00000000 00000000 00000000 01000000 00000000 00000000 94772093 aa59262d 2fdf153e 74b4dcb3
+ars4x32 10 00000000 00800000 00000000 00000000 00000000 01000000 00000000 00000000 1b8cff46 9cefb067 69df31d3 1b739b43
+ars4x32 10 00000000 ff000000 00000000 00000000 00000000 01000000 00000000 00000000 0ee5bd64 1e83b18a a1e22225 868c1831
+ars4x32 10 00000000 80000000 00000000 00000000 00000000 01000000 00000000 00000000 1e9e60bd 813b3fd1 231f614a 84d597df
+ars4x32 10 00000000 00000000 000000ff 00000000 00000000 01000000 00000000 00000000 5efca986 7c4e56df de86fd5e 88bb87b7
+ars4x32 10 00000000 00000000 00000080 00000000 00000000 01000000 00000000 00000000 dd4e54e7 a25f2f2e a3010ebd c8f3fa61
+ars4x32 10 00000000 00000000 0000ff00 00000000 00000000 01000000 00000000 00000000 8bce1a3d 8f055227 cde20b9e 282de09d
+ars4x32 10 00000000 00000000 00008000 00000000 00000000 01000000 00000000 00000000 65b19137 c0aeb93a 38989860 fd7987a5
+ars4x32 10 00000000 00000000 00ff0000 00000000 00000000 01000000 00000000 00000000 0698b753 8b1a360a 47ed543f 723f8714
+ars4x32 10 00000000 00000000 00800000 00000000 00000000 01000000 00000000 00000000 f252603c 25733ab7 1890301e d99576c1
+ars4x32 10 00000000 00000000 ff000000 00000000 00000000 01000000 00000000 00000000 94234fe0 d5978da9 b557b299 8281fc07
+ars4x32 10 00000000 00000000 80000000 00000000 00000000 01000000 00000000 00000000 f03e782d b654780b 9ed5614d 9a050adf
+ars4x32 10 00000000 00000000 00000000 000000ff 00000000 01000000 00000000 00000000 7f5fa570 0e293e10 1f9fda22 e843efe2
+ars4x32 10 00000000 00000000 00000000 00000080 00000000 01000000 00000000 00000000 bd3027f3 fb400d64 9bc46c03 f2d69986
+ars4x32 10 00000000 00000000 00000000 0000ff00 00000000 01000000 00000000 00000000 3b283179 c530d618 121e3991 b0151d60
+ars4x32 10 00000000 00000000 00000000 00008000 00000000 01000000 00000000 00000000 bad9bfb6 8e6d58d2 ec9ca2db 53d305b0
+ars4x32 10 00000000 00000000 00000000 00ff0000 00000000 01000000 00000000 00000000 40b89c8f 06ec7b3a db7e2330 2e6924ff
+ars4x32 10 00000000 00000000 00000000 00800000 00000000 01000000 00000000 00000000 b2f5b121 47028501 2e42db1f beabfc13
+ars4x32 10 00000000 00000000 00000000 ff000000 00000000 01000000 00000000 00000000 23130470 729b594a 8d436499 592b860f
+ars4x32 10 00000000 00000000 00000000 80000000 00000000 01000000 00000000 00000000 d644c6c2 079ade86 ea18abff 1599ac31
+ars4x32 10 886a3f24 d308a385 2e8a1913 44737003 00000000 01000000 00000000 00000000 eec33e51 af4070e6 70867f49 f2c76cb5
+ars4x32 10 223809a4 d0319f29 98fa2e08 896c4eec 00000000 01000000 00000000 00000000 8a5612a0 59d12ee9 81d1e679 64880e10
+ars4x32 10 e6212845 7713d038 cf6654be 6c0ce934 00000000 01000000 00000000 00000000 fa481e8a 4aee6a4a 3743c22b 43c29a06
+ars4x32 10 00000001 00000000 00000000 00000000 00000000 00000000 00000001 00000000 3b6da218 dead2919 1881c9f1 1fbae2fa
+ars4x32 10 00000100 00000000 00000000 00000000 00000000 00000000 00000001 00000000 cca52c27 2c7f5e1e 018a877b 0427fcf3
+ars4x32 10 00010000 00000000 00000000 00000000 00000000 00000000 00000001 00000000 bfbd5600 484665db e30ba803 029ac957
+ars4x32 10 01000000 00000000 00000000 00000000 00000000 00000000 00000001 00000000 0207c89e e2faa9a2 9c6f6b7f bf644286
+ars4x32 10 00000000 00000001 00000000 00000000 00000000 00000000 00000001 00000000 28a535e4 1e633eab 9e99accd 39dfbac7
+ars4x32 10 00000000 00000100 00000000 00000000 00000000 00000000 00000001 00000000 3a3da075 f7b97e3c 92ddd583 a9c0515a
+ars4x32 10 00000000 00010000 00000000 00000000 00000000 00000000 00000001 00000000 ea044d54 72acc464 9f564e5a 8e803cf6
+ars4x32 10 00000000 01000000 00000000 00000000 00000000 00000000 00000001 00000000 30b877dc 27cbee0e e157547a b50a3229
+ars4x32 10 00000000 00000000 00000001 00000000 00000000 00000000 00000001 00000000 03fadd0d f684cc55 c93a2bc6 3157a8aa
+ars4x32 10 00000000 00000000 00000100 00000000 00000000 00000000 00000001 00000000 9cd1c3dc 9cbf9642 5bba5f7e cc57560e
+ars4x32 10 00000000 00000000 00010000 00000000 00000000 00000000 00000001 00000000 5d45da73 ad72f4e5 217d6f04 e01018e8
+ars4x32 10 00000000 00000000 01000000 00000000 00000000 00000000 00000001 00000000 4f79a630 681862d0 9187a7a9 d2b6228b
+ars4x32 10 00000000 00000000 00000000 00000001 00000000 00000000 00000001 00000000 3f22ac01 326f4bdc dc59699a 31131031
+ars4x32 10 00000000 00000000 00000000 00000100 00000000 00000000 00000001 00000000 ca569cca 4a1234cc 011ef9e9 3acc0871
+ars4x32 10 00000000 00000000 00000000 00010000 00000000 00000000 00000001 00000000 35c2e79a 6d82a846 cfdb03ea 7cc737ec
+ars4x32 10 00000000 00000000 00000000 01000000 00000000 00000000 00000001 00000000 1607d796 6414bb50 f1d68168 415d0fe5
+ars4x32 10 0000ff00 00000000 00000000 00000000 00000000 00000000 00000001 00000000 b758a508 9a19d3d0 05cf6c00 aa56a110
+ars4x32 10 00008000 00000000 00000000 00000000 00000000 00000000 00000001 00000000 b318b4fa 9b487e27 6d78ccce b35d9944
+ars4x32 10 00ff0000 00000000 00000000 00000000 00000000 00000000 00000001 00000000 1a1c53b4 97410980 0fd3f17f 54e1b36d
+ars4x32 10 00800000 00000000 00000000 00000000 00000000 00000000 00000001 00000000 b352246e b53e32d1 fe17691a ce07debf
+ars4x32 10 ff000000 00000000 00000000 00000000 00000000 00000000 00000001 00000000 c012668a 91d42293 f0fa88db c46400b2
+ars4x32 10 80000000 00000000 00000000 00000000 00000000 00000000 00000001 00000000 520ca484 208436e1 2dd1d264 60baa37c
+ars4x32 10 00000000 000000ff 00000000 00000000 00000000 00000000 00000001 00000000 b60d427f 7f740c3a 8a42180a aa2435a5
+ars4x32 10 00000000 00000080 00000000 00000000 00000000 00000000 00000001 00000000 dccf627e f30e00ff 41aadaac 96b44f6d
+ars4x32 10 00000000 0000ff00 00000000 00000000 00000000 00000000 00000001 00000000 c9062243 f61fa301 4eae59e9 4bc9ca87
+ars4x32 10 00000000 00008000 00000000 00000000 00000000 00000000 00000001 00000000 589e53a9 e7a18b34 7f81eec5 448cde5a
+ars4x32 10 00000000 00ff0000 00000000 00000000 00000000 00000000 00000001 00000000 d3b52fa5 0bec4e82 db777641 d6d7ce1c
+ars4x32 10 00000000 00800000 00000000 00000000 00000000 00000000 00000001 00000000 646d0325 9a95656e 1f5bbc36 4f5c8d31
+ars4x32 10 00000000 ff000000 00000000 00000000 00000000 00000000 00000001 00000000 40e7ff1f 8db8807e 24e406c1 e7ffefe3
+ars4x32 10 00000000 80000000 00000000 00000000 00000000 00000000 00000001 00000000 7ab87d4c 22524953 f697bfd1 4a8fa5af
+ars4x32 10 00000000 00000000 000000ff 00000000 00000000 00000000 00000001 00000000 fb9990c5 17a82d5a ed61000e 1760b52c
+ars4x32 10 00000000 00000000 00000080 00000000 00000000 00000000 00000001 00000000 f0ab6fe4 ac81a8f8 d132ef2f 8562665e
+ars4x32 10 00000000 00000000 0000ff00 00000000 00000000 00000000 00000001 00000000 b14d9cb4 23e10b75 539a5993 54950f3f
+ars4x32 10 00000000 00000000 00008000 00000000 00000000 00000000 00000001 00000000 61f18fa8 10c72855 07238252 b84b8f85
+ars4x32 10 00000000 00000000 00ff0000 00000000 00000000 00000000 00000001 00000000 82295fb2 0113d8ae d125425d e218b87a
+ars4x32 10 00000000 00000000 00800000 00000000 00000000 00000000 00000001 00000000 74015001 8238716d 5bb7e8c8 82652e1e
+ars4x32 10 00000000 00000000 ff000000 00000000 00000000 00000000 00000001 00000000 b8fdcccc 79f12e50 8b5d2ca9 ae37ed3c
+ars4x32 10 00000000 00000000 80000000 00000000 00000000 00000000 00000001 00000000 f70d72cd 119d6244 f89d5ece de4ec4d4
+ars4x32 10 00000000 00000000 00000000 000000ff 00000000 00000000 00000001 00000000 47d26478 35548a5c 1f723bfa bbe42052
+ars4x32 10 00000000 00000000 00000000 00000080 00000000 00000000 00000001 00000000 123f01cb 59bb0542 edb94675 f8a2f093
+ars4x32 10 00000000 00000000 00000000 0000ff00 00000000 00000000 00000001 00000000 ae428db7 25a40404 9516b2af 2bbd3270
+ars4x32 10 00000000 00000000 00000000 00008000 00000000 00000000 00000001 00000000 830c6a08 968ea4da a9f6b36d a8756cfa
+ars4x32 10 00000000 00000000 00000000 00ff0000 00000000 00000000 00000001 00000000 31329a5a 3b79a414 73ce6f09 e056e02d
+ars4x32 10 00000000 00000000 00000000 00800000 00000000 00000000 00000001 00000000 04005865 5280e42d f93f8264 ea076ef7
+ars4x32 10 00000000 00000000 00000000 ff000000 00000000 00000000 00000001 00000000 335323f0 7e5a4c67 07d28bde 6ab5457b
+ars4x32 10 00000000 00000000 00000000 80000000 00000000 00000000 00000001 00000000 31032630 af692c8b 6c4a0149 a9182b0d
+ars4x32 10 886a3f24 d308a385 2e8a1913 44737003 00000000 00000000 00000001 00000000 dba9a18f 4a8ba058 d88ade5c 09d1295f
+ars4x32 10 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000000 00000001 00000000 5179b9c0 cb326d0d b21c57aa 5cfd9320
+ars4x32 10 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000000 00000001 00000000 afe0e8b8 b51af1bc 09ccefba c5a5d5cb
+ars4x32 10 00000001 00000000 00000000 00000000 00000000 00000000 00000100 00000000 3a24e38a f2f479cb b01944b4 787db0cc
+ars4x32 10 00000100 00000000 00000000 00000000 00000000 00000000 00000100 00000000 ee3e1719 6df3d396 94aad58c 945d2a6a
+ars4x32 10 00010000 00000000 00000000 00000000 00000000 00000000 00000100 00000000 3636c4c0 f4de3eef abcd21b9 0fc39679
+ars4x32 10 01000000 00000000 00000000 00000000 00000000 00000000 00000100 00000000 4e290cbc 1187add7 050a4bee cd74796b
+ars4x32 10 00000000 00000001 00000000 00000000 00000000 00000000 00000100 00000000 310595d6 b0243ff4 0def94bb 489bcf09
+ars4x32 10 00000000 00000100 00000000 00000000 00000000 00000000 00000100 00000000 678986ee 95bc7c78 b62a2ef8 662a739d
+ars4x32 10 00000000 00010000 00000000 00000000 00000000 00000000 00000100 00000000 ee7ce9f3 c25c4244 2d3282d8 28a82909
+ars4x32 10 00000000 01000000 00000000 00000000 00000000 00000000 00000100 00000000 88b21a07 e239b7e0 b70453e5 bee35270
+ars4x32 10 00000000 00000000 00000001 00000000 00000000 00000000 00000100 00000000 ccb2bc2c 4720b4f4 8bd1a65a 5c069920
+ars4x32 10 00000000 00000000 00000100 00000000 00000000 00000000 00000100 00000000 7e2b8c2d d3f271cb e01e7725 e649c3f1
+ars4x32 10 00000000 00000000 00010000 00000000 00000000 00000000 00000100 00000000 dc4dc527 54543e6a d496bb0c bf332ffa
+ars4x32 10 00000000 00000000 01000000 00000000 00000000 00000000 00000100 00000000 4df06a29 7f665420 e75be145 0521f902
+ars4x32 10 00000000 00000000 00000000 00000001 00000000 00000000 00000100 00000000 6757fcd1 a4d214f0 ff160e06 2fbe68b9
+ars4x32 10 00000000 00000000 00000000 00000100 00000000 00000000 00000100 00000000 03c65f5d b129a136 7869bc83 7b9ae516
+ars4x32 10 00000000 00000000 00000000 00010000 00000000 00000000 00000100 00000000 712861d8 0dcd1b4a 08eef989 ae83de10
+ars4x32 10 00000000 00000000 00000000 01000000 00000000 00000000 00000100 00000000 d412f16e 4993bb53 5d4c46d7 83b47181
+ars4x32 10 0000ff00 00000000 00000000 00000000 00000000 00000000 00000100 00000000 4e06f6c5 6de2ef2a b6140d2f d5853b30
+ars4x32 10 00008000 00000000 00000000 00000000 00000000 00000000 00000100 00000000 ba20ecdb ac4192ef ecd7050c 9e65a71e
+ars4x32 10 00ff0000 00000000 00000000 00000000 00000000 00000000 00000100 00000000 5e9b4604 d42b487a cf95b31e 7ca7993b
+ars4x32 10 00800000 00000000 00000000 00000000 00000000 00000000 00000100 00000000 e83d44c2 e99d926f 479e4132 57dd525f
+ars4x32 10 ff000000 00000000 00000000 00000000 00000000 00000000 00000100 00000000 3ea2c8b5 e5987dd5 1894f0d7 6e9dc53f
+ars4x32 10 80000000 00000000 00000000 00000000 00000000 00000000 00000100 00000000 6c3dbb24 a4f93856 4c82b52a 488b9165
+ars4x32 10 00000000 000000ff 00000000 00000000 00000000 00000000 00000100 00000000 f8cb9348 bb0266c5 2cd842c5 26fc8c00
+ars4x32 10 00000000 00000080 00000000 00000000 00000000 00000000 00000100 00000000 7349ff5a c319fd45 dcda0575 3f21b3d2
+ars4x32 10 00000000 0000ff00 00000000 00000000 00000000 00000000 00000100 00000000 c00f7b2f ceaf4cdb 4ac4dc31 154c19dc
+ars4x32 10 00000000 00008000 00000000 00000000 00000000 00000000 00000100 00000000 7e74e110 1935a117 3ff50bce 94bbb144
+ars4x32 10 00000000 00ff0000 00000000 00000000 00000000 00000000 00000100 00000000 144413d2 2246c38e 02930b9a b0baad7c
+ars4x32 10 00000000 00800000 00000000 00000000 00000000 00000000 00000100 00000000 0315cd39 d7aa8fed a7ca8633 f1332f6a
+ars4x32 10 00000000 ff000000 00000000 00000000 00000000 00000000 00000100 00000000 267ae963 2a5a1091 d6fa66a4 e1931070
+ars4x32 10 00000000 80000000 00000000 00000000 00000000 00000000 00000100 00000000 8dbae2ba bf505e53 cb081eb9 38f78513
+ars4x32 10 00000000 00000000 000000ff 00000000 00000000 00000000 00000100 00000000 646723f1 c59588de 35d64138 62f4f638
+ars4x32 10 00000000 00000000 00000080 00000000 00000000 00000000 00000100 00000000 d3ec5c77 41ac4ab9 f538ff0c b6fc0eea
+ars4x32 10 00000000 00000000 0000ff00 00000000 00000000 00000000 00000100 00000000 fa73e170 7f2eb263 1311bef6 4baf3de2
+ars4x32 10 00000000 00000000 00008000 00000000 00000000 00000000 00000100 00000000 24558d77 342b0b22 05e2209d a685912d
+ars4x32 10 00000000 00000000 00ff0000 00000000 00000000 00000000 00000100 00000000 6ffc1906 0b216795 cdb94b1f 5ad9f467
+ars4x32 10 00000000 00000000 00800000 00000000 00000000 00000000 00000100 00000000 971e896a 17cb24c0 947a56a9 673672b2
+ars4x32 10 00000000 00000000 ff000000 00000000 00000000 00000000 00000100 00000000 df0d5551 976050f4 4c71d944 5e915fb7
+ars4x32 10 00000000 00000000 80000000 00000000 00000000 00000000 00000100 00000000 2ff7a1b6 38c8dc6d 310a11a5 d31099c9
+ars4x32 10 00000000 00000000 00000000 000000ff 00000000 00000000 00000100 00000000 1afc0f34 d31c7a6d b8c9b481 c3df3411
+ars4x32 10 00000000 00000000 00000000 00000080 00000000 00000000 00000100 00000000 55e651a4 8f8c6480 a88be763 ee484349
+ars4x32 10 00000000 00000000 00000000 0000ff00 00000000 00000000 00000100 00000000 4841234e d38e02c2 7085b9af 5ae19921
+ars4x32 10 00000000 00000000 00000000 00008000 00000000 00000000 00000100 00000000 82a0524f 909836f1 2b37c0fd e8bb5a68
+ars4x32 10 00000000 00000000 00000000 00ff0000 00000000 00000000 00000100 00000000 5f601944 728c210c eec42500 8208d1ff
+ars4x32 10 00000000 00000000 00000000 00800000 00000000 00000000 00000100 00000000 cab60741 2c79f40f 48b6b6ee b05773ba
+ars4x32 10 00000000 00000000 00000000 ff000000 00000000 00000000 00000100 00000000 54f9db96 5da83c71 53e98128 5e1f3fed
+ars4x32 10 00000000 00000000 00000000 80000000 00000000 00000000 00000100 00000000 ede0c269 db58068f 1dad8f7e 31365754
+ars4x32 10 886a3f24 d308a385 2e8a1913 44737003 00000000 00000000 00000100 00000000 cccc3855 3b7250a3 c1ba834f 0f1971c2
+ars4x32 10 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000000 00000100 00000000 c0ecdb97 0bb47b83 78428cac 5508e403
+ars4x32 10 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000000 00000100 00000000 9d0e088c 51aad17d b2e90098 c5701d31
+ars4x32 10 00000001 00000000 00000000 00000000 00000000 00000000 00010000 00000000 6d379196 f5a0e8b6 82ed605a 4261efd5
+ars4x32 10 00000100 00000000 00000000 00000000 00000000 00000000 00010000 00000000 470d64b7 4fb9e376 240377ba e087143a
+ars4x32 10 00010000 00000000 00000000 00000000 00000000 00000000 00010000 00000000 ed397e2a 62613728 8f945e67 bab73e70
+ars4x32 10 01000000 00000000 00000000 00000000 00000000 00000000 00010000 00000000 a0db8ab4 f81debf2 017d3c84 fd2b0967
+ars4x32 10 00000000 00000001 00000000 00000000 00000000 00000000 00010000 00000000 66344dc6 c5ed1455 1a6e0173 ecad0ae4
+ars4x32 10 00000000 00000100 00000000 00000000 00000000 00000000 00010000 00000000 2a0c8828 f3cf3ef6 e7c4f214 984a8b30
+ars4x32 10 00000000 00010000 00000000 00000000 00000000 00000000 00010000 00000000 138ca5fe 39f5acd0 f952cf2b 28f7b5b3
+ars4x32 10 00000000 01000000 00000000 00000000 00000000 00000000 00010000 00000000 e9206a90 413f58d9 1f13a5af 7bae6ce0
+ars4x32 10 00000000 00000000 00000001 00000000 00000000 00000000 00010000 00000000 f0cf39bb 3eb8befd a4fdd272 b270a992
+ars4x32 10 00000000 00000000 00000100 00000000 00000000 00000000 00010000 00000000 c67dd272 0f43e863 7b5a9044 5768b0af
+ars4x32 10 00000000 00000000 00010000 00000000 00000000 00000000 00010000 00000000 24b7ed0d 93483b55 807d858d 506f9e86
+ars4x32 10 00000000 00000000 01000000 00000000 00000000 00000000 00010000 00000000 2449ac5b fca945e7 af6736ec 1409d8b6
+ars4x32 10 00000000 00000000 00000000 00000001 00000000 00000000 00010000 00000000 e2808a62 d941c835 af8733f8 84cefd17
+ars4x32 10 00000000 00000000 00000000 00000100 00000000 00000000 00010000 00000000 38147605 70c6708f 98367389 125db73a
+ars4x32 10 00000000 00000000 00000000 00010000 00000000 00000000 00010000 00000000 6cc7b369 35124f77 d0f5b3f6 239298aa
+ars4x32 10 00000000 00000000 00000000 01000000 00000000 00000000 00010000 00000000 6649f539 a3603a3d 6e90e8d2 b060b7ed
+ars4x32 10 0000ff00 00000000 00000000 00000000 00000000 00000000 00010000 00000000 9f0d4dd5 466f7ab9 a2cb72ed 3b0eb515
+ars4x32 10 00008000 00000000 00000000 00000000 00000000 00000000 00010000 00000000 958bb39e 7b50f52f b19b5604 46fe8648
+ars4x32 10 00ff0000 00000000 00000000 00000000 00000000 00000000 00010000 00000000 f6f717d6 d7cae96e f805f6ae 03456c6c
+ars4x32 10 00800000 00000000 00000000 00000000 00000000 00000000 00010000 00000000 2aaea638 580972d2 54f9eac4 2af2139a
+ars4x32 10 ff000000 00000000 00000000 00000000 00000000 00000000 00010000 00000000 a45aad7b fe11c4db 71e5b90f 21d6bcaa
+ars4x32 10 80000000 00000000 00000000 00000000 00000000 00000000 00010000 00000000 30ebaa3b 08bae465 3b7f886e a65f14ab
+ars4x32 10 00000000 000000ff 00000000 00000000 00000000 00000000 00010000 00000000 b43540ef 6648506d e7b43f88 702e2168
+ars4x32 10 00000000 00000080 00000000 00000000 00000000 00000000 00010000 00000000 cd83b53f f1eabcd6 11e4cdd2 ecae04ab
+ars4x32 10 00000000 0000ff00 00000000 00000000 00000000 00000000 00010000 00000000 8109ccb1 b1e93308 98b6adb9 b4fd5869
+ars4x32 10 00000000 00008000 00000000 00000000 00000000 00000000 00010000 00000000 54a7f662 f010414a 66b9168a 316e7c96
+ars4x32 10 00000000 00ff0000 00000000 00000000 00000000 00000000 00010000 00000000 c6121cb3 46b010ee 66a7523a 4c78f6a3
+ars4x32 10 00000000 00800000 00000000 00000000 00000000 00000000 00010000 00000000 88b864a6 27410eee 232e3a98 01529469
+ars4x32 10 00000000 ff000000 00000000 00000000 00000000 00000000 00010000 00000000 91990f1f 26e916bf a13c7f8e 83bbc2d2
+ars4x32 10 00000000 80000000 00000000 00000000 00000000 00000000 00010000 00000000 82eae346 c786e1d6 2be9a5ab 6abab178
+ars4x32 10 00000000 00000000 000000ff 00000000 00000000 00000000 00010000 00000000 27cad9ef 39773de2 3187675d 700415eb
+ars4x32 10 00000000 00000000 00000080 00000000 00000000 00000000 00010000 00000000 8f115fb6 63fd3e7f 187eeca7 06825f02
+ars4x32 10 00000000 00000000 0000ff00 00000000 00000000 00000000 00010000 00000000 a167ba02 88faed26 5cfcddcc cf18ff60
+ars4x32 10 00000000 00000000 00008000 00000000 00000000 00000000 00010000 00000000 9a885cba de3c28e5 d37a61cd b573951f
+ars4x32 10 00000000 00000000 00ff0000 00000000 00000000 00000000 00010000 00000000 29b9480e 49de968c bbf6cf9c a18bc0c9
+ars4x32 10 00000000 00000000 00800000 00000000 00000000 00000000 00010000 00000000 06f5efa7 a2eecffd c2721b15 a1b2fba7
+ars4x32 10 00000000 00000000 ff000000 00000000 00000000 00000000 00010000 00000000 b6fd0d49 b5b677c8 85b4864d 90788bf5
+ars4x32 10 00000000 00000000 80000000 00000000 00000000 00000000 00010000 00000000 59628edd e69f3ba4 ab0a4400 2a11e765
+ars4x32 10 00000000 00000000 00000000 000000ff 00000000 00000000 00010000 00000000 c0ac8e76 288f5e66 97c3672e 8da77970
+ars4x32 10 00000000 00000000 00000000 00000080 00000000 00000000 00010000 00000000 b71d89a8 93b990e4 6a991646 71b48b74
+ars4x32 10 00000000 00000000 00000000 0000ff00 00000000 00000000 00010000 00000000 a46b95c1 1ae1bd2c 17dcb860 498671df
+ars4x32 10 00000000 00000000 00000000 00008000 00000000 00000000 00010000 00000000 1dae7ea4 12a1e229 acd13702 55c3fffa
+ars4x32 10 00000000 00000000 00000000 00ff0000 00000000 00000000 00010000 00000000 110dc0cc 43fb4477 abd9226c 17c2f80b
+ars4x32 10 00000000 00000000 00000000 00800000 00000000 00000000 00010000 00000000 206e4bd1 ff42717b a725faf8 20fd1253
+ars4x32 10 00000000 00000000 00000000 ff000000 00000000 00000000 00010000 00000000 1a43112d add402ad abbf9688 6cd0ea86
+ars4x32 10 00000000 00000000 00000000 80000000 00000000 00000000 00010000 00000000 80f6754c a5ddaa17 ec763fe2 79c7da96
+ars4x32 10 886a3f24 d308a385 2e8a1913 44737003 00000000 00000000 00010000 00000000 4cfa0a0b 2b01063a f2de8183 9b73a748
+ars4x32 10 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000000 00010000 00000000 a816a6ec b5c31283 09630670 68823347
+ars4x32 10 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000000 00010000 00000000 4304806c 678427b0 590e73ee f01ef425
+ars4x32 10 00000001 00000000 00000000 00000000 00000000 00000000 01000000 00000000 f0ec9081 17439473 d35e62c7 565376dc
+ars4x32 10 00000100 00000000 00000000 00000000 00000000 00000000 01000000 00000000 29dff89a 5925e07c 1c9a36a9 1ff67d0c
+ars4x32 10 00010000 00000000 00000000 00000000 00000000 00000000 01000000 00000000 e327a201 72601fcb fa492724 594c8bde
+ars4x32 10 01000000 00000000 00000000 00000000 00000000 00000000 01000000 00000000 baab607a 46eeee26 f120ff0b de8aab05
+ars4x32 10 00000000 00000001 00000000 00000000 00000000 00000000 01000000 00000000 9df160a2 fea97302 6f09ee94 7af3592a
+ars4x32 10 00000000 00000100 00000000 00000000 00000000 00000000 01000000 00000000 f5e604aa 7b2b9b77 7be6665c 55f86568
+ars4x32 10 00000000 00010000 00000000 00000000 00000000 00000000 01000000 00000000 21d42295 e98eba48 3da4566b 63de1a1d
+ars4x32 10 00000000 01000000 00000000 00000000 00000000 00000000 01000000 00000000 81e31326 07dfeaef f9a3b35f 55b42e2a
+ars4x32 10 00000000 00000000 00000001 00000000 00000000 00000000 01000000 00000000 fe571b0a 2f3b0f85 3ae46c13 c147a031
+ars4x32 10 00000000 00000000 00000100 00000000 00000000 00000000 01000000 00000000 ad2055b9 fe4693eb 0cd23900 75c1cf16
+ars4x32 10 00000000 00000000 00010000 00000000 00000000 00000000 01000000 00000000 407a6ae1 aed41913 cc785e96 733d9574
+ars4x32 10 00000000 00000000 01000000 00000000 00000000 00000000 01000000 00000000 14790664 c31bd6c8 1006e243 6b8ba00c
+ars4x32 10 00000000 00000000 00000000 00000001 00000000 00000000 01000000 00000000 16341bb4 33f7c92a 7da857a4 54fa72d0
+ars4x32 10 00000000 00000000 00000000 00000100 00000000 00000000 01000000 00000000 b023abd5 4be29d0b c2ec8c44 4759f825
+ars4x32 10 00000000 00000000 00000000 00010000 00000000 00000000 01000000 00000000 ba7e678e 879b2090 20003b19 28ffbfbc
+ars4x32 10 00000000 00000000 00000000 01000000 00000000 00000000 01000000 00000000 9d613b98 e88c8bc9 f6cffe07 3ba558fa
+ars4x32 10 0000ff00 00000000 00000000 00000000 00000000 00000000 01000000 00000000 b17d2fb7 41de2a63 69f8477e b842b6c0
+ars4x32 10 00008000 00000000 00000000 00000000 00000000 00000000 01000000 00000000 d7c8c34d 72a728f5 90176d9d 12a20872
+ars4x32 10 00ff0000 00000000 00000000 00000000 00000000 00000000 01000000 00000000 060fceb2 dd0ae253 b5b055d3 80d3c814
+ars4x32 10 00800000 00000000 00000000 00000000 00000000 00000000 01000000 00000000 574dc142 6911237f 42f24703 dc367a60
+ars4x32 10 ff000000 00000000 00000000 00000000 00000000 00000000 01000000 00000000 58e90605 f7d04d30 09706766 e3c7dae1
+ars4x32 10 80000000 00000000 00000000 00000000 00000000 00000000 01000000 00000000 5f2fa382 8fc9965c 6101e8d0 1b0cb812
+ars4x32 10 00000000 000000ff 00000000 00000000 00000000 00000000 01000000 00000000 6f2c17f1 0ccabeb3 9b76af24 961159d3
+ars4x32 10 00000000 00000080 00000000 00000000 00000000 00000000 01000000 00000000 cd298400 24e18e72 d1e4806e ff4e590e
+ars4x32 10 00000000 0000ff00 00000000 00000000 00000000 00000000 01000000 00000000 07521109 ad6a1cc0 bb975e41 b95a35c7
+ars4x32 10 00000000 00008000 00000000 00000000 00000000 00000000 01000000 00000000 b70c2a80 671f5b84 680bbd42 f60c6c35
+ars4x32 10 00000000 00ff0000 00000000 00000000 00000000 00000000 01000000 00000000 4e338c5c 805e6304 8198670c 96775bcb
+ars4x32 10 00000000 00800000 00000000 00000000 00000000 00000000 01000000 00000000 f8ee10dc ceee3c76 85a48d75 fd91006d
+ars4x32 10 00000000 ff000000 00000000 00000000 00000000 00000000 01000000 00000000 57efb78c 4cb625e3 f92f2ec0 cd0e568b
+ars4x32 10 00000000 80000000 00000000 00000000 00000000 00000000 01000000 00000000 a491e191 3dda3454 1d1d7da2 b46f0381
+ars4x32 10 00000000 00000000 000000ff 00000000 00000000 00000000 01000000 00000000 3b9a15f6 9513a474 826060f1 fe2e12fe
+ars4x32 10 00000000 00000000 00000080 00000000 00000000 00000000 01000000 00000000 fce1af10 3ef65f2c 76c708ce a70a9d0b
+ars4x32 10 00000000 00000000 0000ff00 00000000 00000000 00000000 01000000 00000000 817cdaa6 05420d43 adf89b3b 6d876924
+ars4x32 10 00000000 00000000 00008000 00000000 00000000 00000000 01000000 00000000 2108e0ce be053b4b bee203c0 d3a3e45c
+ars4x32 10 00000000 00000000 00ff0000 00000000 00000000 00000000 01000000 00000000 164aa195 5b3c52da 4bc45866 a3c09427
+ars4x32 10 00000000 00000000 00800000 00000000 00000000 00000000 01000000 00000000 f0616dec ffce2c48 8ad61e07 bac6f5d8
+ars4x32 10 00000000 00000000 ff000000 00000000 00000000 00000000 01000000 00000000 e037c667 9caa836b b94643ed 4f29d7c2
+ars4x32 10 00000000 00000000 80000000 00000000 00000000 00000000 01000000 00000000 0cdcf979 9e0bbeb1 f1792602 9374d54a
+ars4x32 10 00000000 00000000 00000000 000000ff 00000000 00000000 01000000 00000000 97af39cc a96de874 54dcb078 f467d206
+ars4x32 10 00000000 00000000 00000000 00000080 00000000 00000000 01000000 00000000 dd6dc39b a93139a5 d333e43e 67716f60
+ars4x32 10 00000000 00000000 00000000 0000ff00 00000000 00000000 01000000 00000000 ae4636c5 1405a129 2b8668a6 d73d09d6
+ars4x32 10 00000000 00000000 00000000 00008000 00000000 00000000 01000000 00000000 636af1ce 6ee69d0f 15f452ee 3569ec72
+ars4x32 10 00000000 00000000 00000000 00ff0000 00000000 00000000 01000000 00000000 23906744 658f7afd 76d77c00 08a22245
+ars4x32 10 00000000 00000000 00000000 00800000 00000000 00000000 01000000 00000000 87f45225 6e2a65a8 f81a9808 03291042
+ars4x32 10 00000000 00000000 00000000 ff000000 00000000 00000000 01000000 00000000 67b56823 1c6edf37 cac0ce94 fc5b9375
+ars4x32 10 00000000 00000000 00000000 80000000 00000000 00000000 01000000 00000000 a9faac65 baeffe98 c47c0b67 6efd4c3d
+ars4x32 10 886a3f24 d308a385 2e8a1913 44737003 00000000 00000000 01000000 00000000 6d980bc2 6b28966d cc0edc5e 56029663
+ars4x32 10 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000000 01000000 00000000 c676b55f 8ad7487b 63bc0c7f 1379c4b5
+ars4x32 10 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000000 01000000 00000000 c63e4e34 dda2ae11 6a4eea59 e2d735e4
+ars4x32 10 00000001 00000000 00000000 00000000 00000000 00000000 00000000 00000001 e030af51 f0c406ad cd31da3f 12daeb18
+ars4x32 10 00000100 00000000 00000000 00000000 00000000 00000000 00000000 00000001 d647af79 a5e0b9f7 d945e5a4 161fc4c8
+ars4x32 10 00010000 00000000 00000000 00000000 00000000 00000000 00000000 00000001 c6e78b9f 08760454 98f27570 17813501
+ars4x32 10 01000000 00000000 00000000 00000000 00000000 00000000 00000000 00000001 ba496ee9 da990d16 7612ca4c 3eae2911
+ars4x32 10 00000000 00000001 00000000 00000000 00000000 00000000 00000000 00000001 b5a0fbb3 a9766f8c 7af52349 4f04e26a
+ars4x32 10 00000000 00000100 00000000 00000000 00000000 00000000 00000000 00000001 aa093e55 b226f0a9 53afa070 569ab229
+ars4x32 10 00000000 00010000 00000000 00000000 00000000 00000000 00000000 00000001 4f47704d efa380e9 b5edad71 38aad304
+ars4x32 10 00000000 01000000 00000000 00000000 00000000 00000000 00000000 00000001 9e9853a0 082ef8bc 716329cb ddf155e8
+ars4x32 10 00000000 00000000 00000001 00000000 00000000 00000000 00000000 00000001 63461ac2 938b887a 56773d65 31df7347
+ars4x32 10 00000000 00000000 00000100 00000000 00000000 00000000 00000000 00000001 c1e6ce95 97e64ad4 bd0b383a 8ebf32f9
+ars4x32 10 00000000 00000000 00010000 00000000 00000000 00000000 00000000 00000001 5aca53c2 27e87b5a 97050794 c6d1ab5a
+ars4x32 10 00000000 00000000 01000000 00000000 00000000 00000000 00000000 00000001 a6e6df68 a16f4e57 ffad3462 51065696
+ars4x32 10 00000000 00000000 00000000 00000001 00000000 00000000 00000000 00000001 73845df4 e3f11542 363666c3 39e10bb6
+ars4x32 10 00000000 00000000 00000000 00000100 00000000 00000000 00000000 00000001 64a87348 7ec4d910 9e75213b 5914d9f9
+ars4x32 10 00000000 00000000 00000000 00010000 00000000 00000000 00000000 00000001 e4d6993c 77305999 46a765f5 ea1fbb4d
+ars4x32 10 00000000 00000000 00000000 01000000 00000000 00000000 00000000 00000001 068a65eb 6aea3a8c 343c1a47 f7560cf1
+ars4x32 10 0000ff00 00000000 00000000 00000000 00000000 00000000 00000000 00000001 ef3a2fc1 32b12ecd 31f46080 4856d695
+ars4x32 10 00008000 00000000 00000000 00000000 00000000 00000000 00000000 00000001 9e24d97a 238869ca 35a667a9 cac75660
+ars4x32 10 00ff0000 00000000 00000000 00000000 00000000 00000000 00000000 00000001 d078505b c444a93d 3c1d4687 fd299c5b
+ars4x32 10 00800000 00000000 00000000 00000000 00000000 00000000 00000000 00000001 455a18e0 8b25ee8a 9eb52d70 0a2406f6
+ars4x32 10 ff000000 00000000 00000000 00000000 00000000 00000000 00000000 00000001 e42be7a5 10e8344b 8a841e2a 76866124
+ars4x32 10 80000000 00000000 00000000 00000000 00000000 00000000 00000000 00000001 40dd0d34 a1083f9b 54e94679 f24cb157
+ars4x32 10 00000000 000000ff 00000000 00000000 00000000 00000000 00000000 00000001 f76ee81e 3f8e191c 7ace5e54 686c78a9
+ars4x32 10 00000000 00000080 00000000 00000000 00000000 00000000 00000000 00000001 7b0e0ea5 626bb09b a3084fed 1e1ea262
+ars4x32 10 00000000 0000ff00 00000000 00000000 00000000 00000000 00000000 00000001 6c35e2e4 4b116ac4 7c76ccce 6bb9a4a7
+ars4x32 10 00000000 00008000 00000000 00000000 00000000 00000000 00000000 00000001 9f4d1018 414a8cf5 6baee5d1 f7c0f074
+ars4x32 10 00000000 00ff0000 00000000 00000000 00000000 00000000 00000000 00000001 e663febc 5aff1931 fba5f61c 11210a8b
+ars4x32 10 00000000 00800000 00000000 00000000 00000000 00000000 00000000 00000001 1dda1386 c427a4f4 da7de3be ca6d898e
+ars4x32 10 00000000 ff000000 00000000 00000000 00000000 00000000 00000000 00000001 e5136b72 9c9a2b25 e6212dd9 11b59216
+ars4x32 10 00000000 80000000 00000000 00000000 00000000 00000000 00000000 00000001 b5f6c242 16eee9c4 5d9f2224 3ee53567
+ars4x32 10 00000000 00000000 000000ff 00000000 00000000 00000000 00000000 00000001 998d7220 94aab55c 675ec4d4 751d8763
+ars4x32 10 00000000 00000000 00000080 00000000 00000000 00000000 00000000 00000001 3065eb46 14dd6ecc 56227cda 656756d6
+ars4x32 10 00000000 00000000 0000ff00 00000000 00000000 00000000 00000000 00000001 c8e3c4e8 d5a754f1 ce7a3b8c 145d41a5
+ars4x32 10 00000000 00000000 00008000 00000000 00000000 00000000 00000000 00000001 bc8ee1a1 1efad7f8 cca32205 f25ecce9
+ars4x32 10 00000000 00000000 00ff0000 00000000 00000000 00000000 00000000 00000001 999d4322 09f63cba 401bf5f5 dfa94671
+ars4x32 10 00000000 00000000 00800000 00000000 00000000 00000000 00000000 00000001 2bcdfd5d 9cc3f21e f2e4ffa4 de8da739
+ars4x32 10 00000000 00000000 ff000000 00000000 00000000 00000000 00000000 00000001 ae20c6a7 1f6a5d18 a46ca51e 536b01fa
+ars4x32 10 00000000 00000000 80000000 00000000 00000000 00000000 00000000 00000001 0d6e2690 54582cd4 a409c539 8d61509c
+ars4x32 10 00000000 00000000 00000000 000000ff 00000000 00000000 00000000 00000001 0b56a479 ac382ffd 8ff545ad 38bf0503
+ars4x32 10 00000000 00000000 00000000 00000080 00000000 00000000 00000000 00000001 976ac401 af2a5de7 4bc9f677 d4aef946
+ars4x32 10 00000000 00000000 00000000 0000ff00 00000000 00000000 00000000 00000001 12e13444 50ac2a67 ca356633 e03b7d2f
+ars4x32 10 00000000 00000000 00000000 00008000 00000000 00000000 00000000 00000001 5e649cc6 ef0f17a5 94798230 08e834c1
+ars4x32 10 00000000 00000000 00000000 00ff0000 00000000 00000000 00000000 00000001 66a13df1 5a5dcbd0 0508d339 bc651029
+ars4x32 10 00000000 00000000 00000000 00800000 00000000 00000000 00000000 00000001 14bb05b6 6b7fa5a4 1055f28f 77cc28f2
+ars4x32 10 00000000 00000000 00000000 ff000000 00000000 00000000 00000000 00000001 69db4f0a 2f946efd a984980b b9faa3ac
+ars4x32 10 00000000 00000000 00000000 80000000 00000000 00000000 00000000 00000001 d62eb4ff 35cfdc17 cd4a1c41 14d50043
+ars4x32 10 886a3f24 d308a385 2e8a1913 44737003 00000000 00000000 00000000 00000001 ef824629 1cba14e7 49ed4950 ffb38246
+ars4x32 10 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000000 00000000 00000001 a34ee7af 7f2fd010 664fda60 38af05b1
+ars4x32 10 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000000 00000000 00000001 1d54c792 869cb843 fbd24ccd ad3de6b3
+ars4x32 10 00000001 00000000 00000000 00000000 00000000 00000000 00000000 00000100 f1df58a4 1ed53375 7bb78ef4 4e11dbab
+ars4x32 10 00000100 00000000 00000000 00000000 00000000 00000000 00000000 00000100 e6ee2dee 3b5880ed 942efd6f 91f43b8f
+ars4x32 10 00010000 00000000 00000000 00000000 00000000 00000000 00000000 00000100 7c21e72b a288390d f96c436d 0d20b4e0
+ars4x32 10 01000000 00000000 00000000 00000000 00000000 00000000 00000000 00000100 807067d5 212fec9b 88c0801b 5a85aff9
+ars4x32 10 00000000 00000001 00000000 00000000 00000000 00000000 00000000 00000100 1b0be5cb 29d0b95d 372985b6 48e76f44
+ars4x32 10 00000000 00000100 00000000 00000000 00000000 00000000 00000000 00000100 93c509e1 e718172c 7f883cb2 c21639ce
+ars4x32 10 00000000 00010000 00000000 00000000 00000000 00000000 00000000 00000100 06cfde2e fa591c7f cd70f744 7757851b
+ars4x32 10 00000000 01000000 00000000 00000000 00000000 00000000 00000000 00000100 1864201c 9f652d37 09547c97 4d881d90
+ars4x32 10 00000000 00000000 00000001 00000000 00000000 00000000 00000000 00000100 7fbb915f 552c9bb0 3c7a3c8b ce644482
+ars4x32 10 00000000 00000000 00000100 00000000 00000000 00000000 00000000 00000100 ed0e5f89 9e74bab0 97043f39 7f18a3f2
+ars4x32 10 00000000 00000000 00010000 00000000 00000000 00000000 00000000 00000100 65258d2d ab2d98a6 242de7be 0e5a2536
+ars4x32 10 00000000 00000000 01000000 00000000 00000000 00000000 00000000 00000100 792c4707 16b18391 e007d7f4 c4cbeb22
+ars4x32 10 00000000 00000000 00000000 00000001 00000000 00000000 00000000 00000100 02c8ef7e a739a692 2421e133 69219eed
+ars4x32 10 00000000 00000000 00000000 00000100 00000000 00000000 00000000 00000100 6e3cc3e1 25db43ec 96727f77 21ed7496
+ars4x32 10 00000000 00000000 00000000 00010000 00000000 00000000 00000000 00000100 747d8e1e 932a1db3 a88a3850 f4da36b5
+ars4x32 10 00000000 00000000 00000000 01000000 00000000 00000000 00000000 00000100 628b9a9e 258e5f68 65ee127b 5303581e
+ars4x32 10 0000ff00 00000000 00000000 00000000 00000000 00000000 00000000 00000100 b67af349 02f4b3e4 6e4f30ce 61bfc6f4
+ars4x32 10 00008000 00000000 00000000 00000000 00000000 00000000 00000000 00000100 f791fead 0377ddf6 bdc314ba f0671471
+ars4x32 10 00ff0000 00000000 00000000 00000000 00000000 00000000 00000000 00000100 637910a8 bbdcc060 a1c08936 7a710668
+ars4x32 10 00800000 00000000 00000000 00000000 00000000 00000000 00000000 00000100 dcae14d3 6776e33d 7766d0ce 408f15fa
+ars4x32 10 ff000000 00000000 00000000 00000000 00000000 00000000 00000000 00000100 c93ba8e6 7435c567 845dc071 d02ca702
+ars4x32 10 80000000 00000000 00000000 00000000 00000000 00000000 00000000 00000100 fa54a9fa 8e7465b9 77d395ce c43bd5a4
+ars4x32 10 00000000 000000ff 00000000 00000000 00000000 00000000 00000000 00000100 79523499 349f6079 c3461163 179aec9f
+ars4x32 10 00000000 00000080 00000000 00000000 00000000 00000000 00000000 00000100 95d8e848 6aa64376 9d703e91 fab6988a
+ars4x32 10 00000000 0000ff00 00000000 00000000 00000000 00000000 00000000 00000100 c53dd017 99b3e749 3ef4f8d8 7d752c89
+ars4x32 10 00000000 00008000 00000000 00000000 00000000 00000000 00000000 00000100 43ab57e1 4789da5f 87033eb8 e7ad3a50
+ars4x32 10 00000000 00ff0000 00000000 00000000 00000000 00000000 00000000 00000100 faedf924 7a650192 147d4b09 9ac01939
+ars4x32 10 00000000 00800000 00000000 00000000 00000000 00000000 00000000 00000100 e2042db4 dca05c16 827d333c 9251e5da
+ars4x32 10 00000000 ff000000 00000000 00000000 00000000 00000000 00000000 00000100 d1603183 18130362 9d2c9608 818ac71e
+ars4x32 10 00000000 80000000 00000000 00000000 00000000 00000000 00000000 00000100 33147cbe e7b079be fc1189f5 5887bb9d
+ars4x32 10 00000000 00000000 000000ff 00000000 00000000 00000000 00000000 00000100 29b1e630 8f1af85b d903d2ed 1a082d77
+ars4x32 10 00000000 00000000 00000080 00000000 00000000 00000000 00000000 00000100 c6b5525a 81d234f0 48a17017 8351d3b5
+ars4x32 10 00000000 00000000 0000ff00 00000000 00000000 00000000 00000000 00000100 b8187e65 b2cb6954 e3c23052 69f5b5b4
+ars4x32 10 00000000 00000000 00008000 00000000 00000000 00000000 00000000 00000100 2e87227e 7dfabedb f2933574 e7b37365
+ars4x32 10 00000000 00000000 00ff0000 00000000 00000000 00000000 00000000 00000100 e3486e92 1fc15025 16d75fe1 547641e7
+ars4x32 10 00000000 00000000 00800000 00000000 00000000 00000000 00000000 00000100 f8d61ae3 62f626ae 92910a34 bffbc7cc
+ars4x32 10 00000000 00000000 ff000000 00000000 00000000 00000000 00000000 00000100 5d335465 e2b59668 6f89fa9f d4e30427
+ars4x32 10 00000000 00000000 80000000 00000000 00000000 00000000 00000000 00000100 52320fe3 28ba865c 883302fc 476e34d7
+ars4x32 10 00000000 00000000 00000000 000000ff 00000000 00000000 00000000 00000100 228b94db 37aa6dc2 da959a01 7d123017
+ars4x32 10 00000000 00000000 00000000 00000080 00000000 00000000 00000000 00000100 5b4eee21 8252a042 21b5ed99 e08dbf9c
+ars4x32 10 00000000 00000000 00000000 0000ff00 00000000 00000000 00000000 00000100 38050743 c31e8259 983e032e 713cf089
+ars4x32 10 00000000 00000000 00000000 00008000 00000000 00000000 00000000 00000100 94beb06e 10012caf 03832d81 51bd03a3
+ars4x32 10 00000000 00000000 00000000 00ff0000 00000000 00000000 00000000 00000100 d98e9d5e 0c316ae4 a8670426 8d941618
+ars4x32 10 00000000 00000000 00000000 00800000 00000000 00000000 00000000 00000100 66e4d621 a3795a49 ac79c7d4 b3011d67
+ars4x32 10 00000000 00000000 00000000 ff000000 00000000 00000000 00000000 00000100 b6c8fb40 c1da803d 08588e78 ae5fcfad
+ars4x32 10 00000000 00000000 00000000 80000000 00000000 00000000 00000000 00000100 8ae97e4b 1f8b6a28 0f7b192c b7ae7931
+ars4x32 10 886a3f24 d308a385 2e8a1913 44737003 00000000 00000000 00000000 00000100 683e01ea 87f5779a aef054a4 8e33cb06
+ars4x32 10 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000000 00000000 00000100 0dfab3ca a7ba9e3f 9c954ad6 6b613c27
+ars4x32 10 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000000 00000000 00000100 6c5aea28 7690beb2 4c79a7b5 760f532a
+ars4x32 10 00000001 00000000 00000000 00000000 00000000 00000000 00000000 00010000 a9b35b10 a375ea94 9808b6c1 e50acdf9
+ars4x32 10 00000100 00000000 00000000 00000000 00000000 00000000 00000000 00010000 d97b580a 1d94d0f0 7d7c8d8a 438197d1
+ars4x32 10 00010000 00000000 00000000 00000000 00000000 00000000 00000000 00010000 9a9c2bc3 2e00bd2f 68f86d66 fda84482
+ars4x32 10 01000000 00000000 00000000 00000000 00000000 00000000 00000000 00010000 1c0e722c d39ac81c 32fce64e 2c076b46
+ars4x32 10 00000000 00000001 00000000 00000000 00000000 00000000 00000000 00010000 fb05a984 a71de6a4 009f985b 6d29c01a
+ars4x32 10 00000000 00000100 00000000 00000000 00000000 00000000 00000000 00010000 a4696ee0 5c0abe77 77ab1ca0 de73318b
+ars4x32 10 00000000 00010000 00000000 00000000 00000000 00000000 00000000 00010000 514becd2 01d352ed 31b84f0f 5d2e8628
+ars4x32 10 00000000 01000000 00000000 00000000 00000000 00000000 00000000 00010000 4b514f06 7566afa1 c6c71798 e0d25cda
+ars4x32 10 00000000 00000000 00000001 00000000 00000000 00000000 00000000 00010000 186f64bd 87b56de6 aba3c4bc 4d812602
+ars4x32 10 00000000 00000000 00000100 00000000 00000000 00000000 00000000 00010000 44119056 89cbd5be d7e979ab c2d59c40
+ars4x32 10 00000000 00000000 00010000 00000000 00000000 00000000 00000000 00010000 316066d3 9e963405 f0c6436d 941c5dc4
+ars4x32 10 00000000 00000000 01000000 00000000 00000000 00000000 00000000 00010000 6c79b3f9 0a16685c b27b9a10 85170546
+ars4x32 10 00000000 00000000 00000000 00000001 00000000 00000000 00000000 00010000 8e2a93a1 aab9e1dd b6b102a4 4c18cbc6
+ars4x32 10 00000000 00000000 00000000 00000100 00000000 00000000 00000000 00010000 782a17be 532c720d 2e96d480 285a912a
+ars4x32 10 00000000 00000000 00000000 00010000 00000000 00000000 00000000 00010000 89ca671f a89507f3 2eb97463 c1a49f17
+ars4x32 10 00000000 00000000 00000000 01000000 00000000 00000000 00000000 00010000 17ec9935 79683783 a11238fb 4c608198
+ars4x32 10 0000ff00 00000000 00000000 00000000 00000000 00000000 00000000 00010000 52de9adf 1fa60534 58b426b4 8609be54
+ars4x32 10 00008000 00000000 00000000 00000000 00000000 00000000 00000000 00010000 ee86cc4b 116cc1dc e7e039bf 47088901
+ars4x32 10 00ff0000 00000000 00000000 00000000 00000000 00000000 00000000 00010000 7fabcc11 9cb66a47 5fb49fab 5fc996a7
+ars4x32 10 00800000 00000000 00000000 00000000 00000000 00000000 00000000 00010000 caa700a6 0325b0d7 a7cb3251 6e979ea8
+ars4x32 10 ff000000 00000000 00000000 00000000 00000000 00000000 00000000 00010000 56317ad6 505ed872 57947af4 aac1b4fa
+ars4x32 10 80000000 00000000 00000000 00000000 00000000 00000000 00000000 00010000 46e441bc 37cf2022 d17d4e60 486c4b33
+ars4x32 10 00000000 000000ff 00000000 00000000 00000000 00000000 00000000 00010000 2faee6c2 7fd2e177 c9f9c395 281f73ee
+ars4x32 10 00000000 00000080 00000000 00000000 00000000 00000000 00000000 00010000 7e5e29a7 c156a39e 30e3276b 250a765d
+ars4x32 10 00000000 0000ff00 00000000 00000000 00000000 00000000 00000000 00010000 426b7127 b2aab7c7 a3e000e3 0e222cd3
+ars4x32 10 00000000 00008000 00000000 00000000 00000000 00000000 00000000 00010000 5a46397c 3dcbe508 db679125 8af9502f
+ars4x32 10 00000000 00ff0000 00000000 00000000 00000000 00000000 00000000 00010000 e177c2d6 e6882c0b 7fe501d5 1955b56d
+ars4x32 10 00000000 00800000 00000000 00000000 00000000 00000000 00000000 00010000 c40d3950 8dff35f0 ca567139 f0b23503
+ars4x32 10 00000000 ff000000 00000000 00000000 00000000 00000000 00000000 00010000 b8b7824f 583c476a 9d7a73ea f640b07f
+ars4x32 10 00000000 80000000 00000000 00000000 00000000 00000000 00000000 00010000 dbe1caa4 9c7508b7 19b89657 6975a0b1
+ars4x32 10 00000000 00000000 000000ff 00000000 00000000 00000000 00000000 00010000 b9894675 fc9dbef6 8b9f01e3 35b679f8
+ars4x32 10 00000000 00000000 00000080 00000000 00000000 00000000 00000000 00010000 c04646d9 ff304cee 2563d09e c70b493c
+ars4x32 10 00000000 00000000 0000ff00 00000000 00000000 00000000 00000000 00010000 0c9b3b1f 378faf60 53a737c3 8f7d0f98
+ars4x32 10 00000000 00000000 00008000 00000000 00000000 00000000 00000000 00010000 afd60479 e8d33be6 3c5d1a86 37683214
+ars4x32 10 00000000 00000000 00ff0000 00000000 00000000 00000000 00000000 00010000 9f88f7c7 31ad8d98 007e7d53 647f473b
+ars4x32 10 00000000 00000000 00800000 00000000 00000000 00000000 00000000 00010000 70b61e10 af6eaf82 5ea450af b4165ed2
+ars4x32 10 00000000 00000000 ff000000 00000000 00000000 00000000 00000000 00010000 d38acb23 16435559 3c751c68 d0268fa8
+ars4x32 10 00000000 00000000 80000000 00000000 00000000 00000000 00000000 00010000 0d8f8b91 c6cbc3e8 82d1ae4b e4da5cc4
+ars4x32 10 00000000 00000000 00000000 000000ff 00000000 00000000 00000000 00010000 bf6c742e a95e65c9 ce7dc48e ff90ffc8
+ars4x32 10 00000000 00000000 00000000 00000080 00000000 00000000 00000000 00010000 d91f6594 9c18a30c 445657a6 7066d6bf
+ars4x32 10 00000000 00000000 00000000 0000ff00 00000000 00000000 00000000 00010000 b9817a19 15cf8179 e39085d4 f31e8cf5
+ars4x32 10 00000000 00000000 00000000 00008000 00000000 00000000 00000000 00010000 60f6a78b 38c4d698 b09432f1 3cea4a6e
+ars4x32 10 00000000 00000000 00000000 00ff0000 00000000 00000000 00000000 00010000 1cd61bb4 49c0cb69 f1d31578 16fc57df
+ars4x32 10 00000000 00000000 00000000 00800000 00000000 00000000 00000000 00010000 377e16e6 442c4847 da18f00c 0beed65c
+ars4x32 10 00000000 00000000 00000000 ff000000 00000000 00000000 00000000 00010000 24a1351d d340c934 0d24242b 8c777c1c
+ars4x32 10 00000000 00000000 00000000 80000000 00000000 00000000 00000000 00010000 b1521cc5 83135c99 97176e37 c90058e5
+ars4x32 10 886a3f24 d308a385 2e8a1913 44737003 00000000 00000000 00000000 00010000 672ae628 5567ee43 e1836c02 2e4c17eb
+ars4x32 10 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000000 00000000 00010000 6b9c636d acb17505 985e650b 5e7f69ae
+ars4x32 10 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000000 00000000 00010000 25e22335 13360180 3230dd73 63916012
+ars4x32 10 00000001 00000000 00000000 00000000 00000000 00000000 00000000 01000000 247f0514 bf305a96 52a1a2a3 e57040fd
+ars4x32 10 00000100 00000000 00000000 00000000 00000000 00000000 00000000 01000000 998b05e4 d36d64aa c626aeaf f2753c2c
+ars4x32 10 00010000 00000000 00000000 00000000 00000000 00000000 00000000 01000000 cfcf8e8d 09c75787 71eb8a35 4ca0901c
+ars4x32 10 01000000 00000000 00000000 00000000 00000000 00000000 00000000 01000000 9fe0465a 29a6fa34 b863a0b8 248d9b96
+ars4x32 10 00000000 00000001 00000000 00000000 00000000 00000000 00000000 01000000 8a389ee3 1a46f0fa 79591b16 965cf03d
+ars4x32 10 00000000 00000100 00000000 00000000 00000000 00000000 00000000 01000000 d8afe7dc 8f28277b ab017f0f e657d755
+ars4x32 10 00000000 00010000 00000000 00000000 00000000 00000000 00000000 01000000 c0c9741f d01806cc cc3a9052 1b735f2e
+ars4x32 10 00000000 01000000 00000000 00000000 00000000 00000000 00000000 01000000 cafb62e7 0bcab19b 830ea094 ceaa9892
+ars4x32 10 00000000 00000000 00000001 00000000 00000000 00000000 00000000 01000000 ab9dfe3b 91d056cc 802cc19a b0b86070
+ars4x32 10 00000000 00000000 00000100 00000000 00000000 00000000 00000000 01000000 1cea55b5 0de9fb2f 22ae0d0f da5d677c
+ars4x32 10 00000000 00000000 00010000 00000000 00000000 00000000 00000000 01000000 6d12c1fd 88aa8db1 15feaaff 34881817
+ars4x32 10 00000000 00000000 01000000 00000000 00000000 00000000 00000000 01000000 5ddba2e1 61a25b12 78f177c2 545a617c
+ars4x32 10 00000000 00000000 00000000 00000001 00000000 00000000 00000000 01000000 06fae575 4f5fd1a2 46823be1 9daa0f27
+ars4x32 10 00000000 00000000 00000000 00000100 00000000 00000000 00000000 01000000 c5ecca74 0c27e77b 5f8d6f60 1954e0e8
+ars4x32 10 00000000 00000000 00000000 00010000 00000000 00000000 00000000 01000000 00df0908 fd4f181c a59ca029 3b64c3d5
+ars4x32 10 00000000 00000000 00000000 01000000 00000000 00000000 00000000 01000000 fbba385e 31fadaba 7cb9fb23 d890b40a
+ars4x32 10 0000ff00 00000000 00000000 00000000 00000000 00000000 00000000 01000000 51c44a4a d23387f2 6a4868ec 143e6914
+ars4x32 10 00008000 00000000 00000000 00000000 00000000 00000000 00000000 01000000 73c9215a 067421dc a47ba7df ed17441c
+ars4x32 10 00ff0000 00000000 00000000 00000000 00000000 00000000 00000000 01000000 05223e30 99614b1f 824558a0 77def08f
+ars4x32 10 00800000 00000000 00000000 00000000 00000000 00000000 00000000 01000000 ff8ffbdf dbf27d95 656aa8de 20c486f3
+ars4x32 10 ff000000 00000000 00000000 00000000 00000000 00000000 00000000 01000000 20f060fa 5a681df4 8a74aa57 0d312560
+ars4x32 10 80000000 00000000 00000000 00000000 00000000 00000000 00000000 01000000 c4cc387a f116d76d c73534c7 721c66fb
+ars4x32 10 00000000 000000ff 00000000 00000000 00000000 00000000 00000000 01000000 1062de7a 87531b12 0e4268ee 105fdc0c
+ars4x32 10 00000000 00000080 00000000 00000000 00000000 00000000 00000000 01000000 6f28d09d a8f2e77b 3dd54948 728f0b06
+ars4x32 10 00000000 0000ff00 00000000 00000000 00000000 00000000 00000000 01000000 03768c53 0e08e96f bb9532f7 c81f7a6e
+ars4x32 10 00000000 00008000 00000000 00000000 00000000 00000000 00000000 01000000 232b442e 1ecc54b5 47fd72c5 660c1ed0
+ars4x32 10 00000000 00ff0000 00000000 00000000 00000000 00000000 00000000 01000000 37bf7ae2 aae1c68d 6107992e 279634c8
+ars4x32 10 00000000 00800000 00000000 00000000 00000000 00000000 00000000 01000000 d79665d2 0f079047 379ce9c3 f25e6799
+ars4x32 10 00000000 ff000000 00000000 00000000 00000000 00000000 00000000 01000000 b84df59b a7682678 3d61af8b 84eebdbd
+ars4x32 10 00000000 80000000 00000000 00000000 00000000 00000000 00000000 01000000 f9c59ee0 b4be9850 4bb861f3 e67d08d1
+ars4x32 10 00000000 00000000 000000ff 00000000 00000000 00000000 00000000 01000000 9c521252 d6a8c73c e379f086 f89ab41a
+ars4x32 10 00000000 00000000 00000080 00000000 00000000 00000000 00000000 01000000 b7b31df0 accc7692 f4fbaa8d 64fd8874
+ars4x32 10 00000000 00000000 0000ff00 00000000 00000000 00000000 00000000 01000000 9a717564 a0cb7cdc 438b7552 b91b7820
+ars4x32 10 00000000 00000000 00008000 00000000 00000000 00000000 00000000 01000000 918c06f2 75f0076d ce870444 c5d9860d
+ars4x32 10 00000000 00000000 00ff0000 00000000 00000000 00000000 00000000 01000000 f88f9930 afb8ce53 f1a97c5a 25d31efe
+ars4x32 10 00000000 00000000 00800000 00000000 00000000 00000000 00000000 01000000 8fd66e4c ffd160cf 2cc93b1d 2dce4692
+ars4x32 10 00000000 00000000 ff000000 00000000 00000000 00000000 00000000 01000000 5524dcaf 40762d39 d69e3b7b baba1676
+ars4x32 10 00000000 00000000 80000000 00000000 00000000 00000000 00000000 01000000 7a7c7737 6057b9fe 7a76e3c8 b574f8fb
+ars4x32 10 00000000 00000000 00000000 000000ff 00000000 00000000 00000000 01000000 954ba403 6ba1c264 b6aed22d ee859bc4
+ars4x32 10 00000000 00000000 00000000 00000080 00000000 00000000 00000000 01000000 14f8612e 3726a4ec c611176d ed092f61
+ars4x32 10 00000000 00000000 00000000 0000ff00 00000000 00000000 00000000 01000000 e632d378 c397c684 d32f3508 a394057b
+ars4x32 10 00000000 00000000 00000000 00008000 00000000 00000000 00000000 01000000 55a364eb 570a271b b75dda1c 0e45b60d
+ars4x32 10 00000000 00000000 00000000 00ff0000 00000000 00000000 00000000 01000000 c6d6b2ce e913f457 60d4c582 7441c07a
+ars4x32 10 00000000 00000000 00000000 00800000 00000000 00000000 00000000 01000000 57ee42ec 960b74ca 972ea934 8654c107
+ars4x32 10 00000000 00000000 00000000 ff000000 00000000 00000000 00000000 01000000 6a795ce7 a720649b 1296b189 d4e4697f
+ars4x32 10 00000000 00000000 00000000 80000000 00000000 00000000 00000000 01000000 703f3bd8 138b897b ede3087f 43fa7a1b
+ars4x32 10 886a3f24 d308a385 2e8a1913 44737003 00000000 00000000 00000000 01000000 879c7e5a 7b9cf65f 447c0371 08a9687b
+ars4x32 10 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000000 00000000 01000000 79702e82 a0689d80 3e967f90 b48255d3
+ars4x32 10 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000000 00000000 01000000 4e9a3827 89deff2a 7578177a b2856db2
+ars4x32 10 00000001 00000000 00000000 00000000 0000ff00 00000000 00000000 00000000 fcae6333 bd01b7df b770e892 9cb16292
+ars4x32 10 00000100 00000000 00000000 00000000 0000ff00 00000000 00000000 00000000 e5087d42 c37b8481 e34a0bf2 ffc5218b
+ars4x32 10 00010000 00000000 00000000 00000000 0000ff00 00000000 00000000 00000000 a5b4b75e 76b71d55 3ce3f901 7cb7c270
+ars4x32 10 01000000 00000000 00000000 00000000 0000ff00 00000000 00000000 00000000 b8572a88 3ea486ca a4297626 8aa5f727
+ars4x32 10 00000000 00000001 00000000 00000000 0000ff00 00000000 00000000 00000000 25004d41 354bfbd5 cb0d6d2a ce2866fe
+ars4x32 10 00000000 00000100 00000000 00000000 0000ff00 00000000 00000000 00000000 ce1f43dc 9476d233 173e2431 1bf36ea2
+ars4x32 10 00000000 00010000 00000000 00000000 0000ff00 00000000 00000000 00000000 94216c8e 9b501d69 1b832695 c13ab5f9
+ars4x32 10 00000000 01000000 00000000 00000000 0000ff00 00000000 00000000 00000000 6a5c2f12 060bf87e 5a077a17 ae024bc6
+ars4x32 10 00000000 00000000 00000001 00000000 0000ff00 00000000 00000000 00000000 94252aa8 0444a04d dfac6fd6 977b6c1a
+ars4x32 10 00000000 00000000 00000100 00000000 0000ff00 00000000 00000000 00000000 9506aa8c 6ee40879 138836aa 509ac569
+ars4x32 10 00000000 00000000 00010000 00000000 0000ff00 00000000 00000000 00000000 536fbd48 217a89ec c2476fc1 b649b851
+ars4x32 10 00000000 00000000 01000000 00000000 0000ff00 00000000 00000000 00000000 2bc4b6af 3b94ba32 67bdea20 ec9488d7
+ars4x32 10 00000000 00000000 00000000 00000001 0000ff00 00000000 00000000 00000000 23753cdb 5909cafa 72e4a6b1 03f47730
+ars4x32 10 00000000 00000000 00000000 00000100 0000ff00 00000000 00000000 00000000 990ddfe7 152ed393 eb0d9f13 2e4ea32a
+ars4x32 10 00000000 00000000 00000000 00010000 0000ff00 00000000 00000000 00000000 e016741b 3783a4c4 bce1590f f08190de
+ars4x32 10 00000000 00000000 00000000 01000000 0000ff00 00000000 00000000 00000000 c8c35ede 248aa584 5a0f85c9 00b3fd5b
+ars4x32 10 0000ff00 00000000 00000000 00000000 0000ff00 00000000 00000000 00000000 0d087d6b 615667d8 51c24c95 048f31a8
+ars4x32 10 00008000 00000000 00000000 00000000 0000ff00 00000000 00000000 00000000 8594974a 10c70d1f 5ff39e10 74e7b83b
+ars4x32 10 00ff0000 00000000 00000000 00000000 0000ff00 00000000 00000000 00000000 340e3607 f971005f e562dcac a8a8958d
+ars4x32 10 00800000 00000000 00000000 00000000 0000ff00 00000000 00000000 00000000 044ac5c0 b36dbf67 56089195 c3e407cf
+ars4x32 10 ff000000 00000000 00000000 00000000 0000ff00 00000000 00000000 00000000 56567ace 4d5b1686 a544562d 3cc18ba8
+ars4x32 10 80000000 00000000 00000000 00000000 0000ff00 00000000 00000000 00000000 3ca2b293 a5d66ea0 31831459 926ea2fa
+ars4x32 10 00000000 000000ff 00000000 00000000 0000ff00 00000000 00000000 00000000 0fcd4b44 1577f2bb 8d4ee07d bc8d9195
+ars4x32 10 00000000 00000080 00000000 00000000 0000ff00 00000000 00000000 00000000 941d2950 d634b468 69c05b83 e09a08ba
+ars4x32 10 00000000 0000ff00 00000000 00000000 0000ff00 00000000 00000000 00000000 45dd8a83 d1a6fcf6 f366a1cd dc96484f
+ars4x32 10 00000000 00008000 00000000 00000000 0000ff00 00000000 00000000 00000000 e840f688 55b214ad d57918bb cc7161d0
+ars4x32 10 00000000 00ff0000 00000000 00000000 0000ff00 00000000 00000000 00000000 dffddb1d 119bcb50 3312aa05 647a03de
+ars4x32 10 00000000 00800000 00000000 00000000 0000ff00 00000000 00000000 00000000 f6b1de15 8fffc880 78fde489 c28e8cb6
+ars4x32 10 00000000 ff000000 00000000 00000000 0000ff00 00000000 00000000 00000000 a9140b47 b30e6b6d 409d0abe eb61b360
+ars4x32 10 00000000 80000000 00000000 00000000 0000ff00 00000000 00000000 00000000 f886b0ab 70e2290f 5eeda35a 1b3e2f9e
+ars4x32 10 00000000 00000000 000000ff 00000000 0000ff00 00000000 00000000 00000000 d9f03545 5211f8b3 2a76c051 97266bf0
+ars4x32 10 00000000 00000000 00000080 00000000 0000ff00 00000000 00000000 00000000 9bbe9abe db095dd8 1b808527 9f28fee9
+ars4x32 10 00000000 00000000 0000ff00 00000000 0000ff00 00000000 00000000 00000000 7857bb35 9aa27628 ba02455a 81ef8e54
+ars4x32 10 00000000 00000000 00008000 00000000 0000ff00 00000000 00000000 00000000 99d67194 60448862 83329032 3f23d5dc
+ars4x32 10 00000000 00000000 00ff0000 00000000 0000ff00 00000000 00000000 00000000 901bc81a 26ee2082 290f81f2 578edbf2
+ars4x32 10 00000000 00000000 00800000 00000000 0000ff00 00000000 00000000 00000000 a0a3f116 1511d5f8 b1e6eb53 258c6f33
+ars4x32 10 00000000 00000000 ff000000 00000000 0000ff00 00000000 00000000 00000000 a814f115 a68a1479 6f615e1e da260fc3
+ars4x32 10 00000000 00000000 80000000 00000000 0000ff00 00000000 00000000 00000000 2d4f25cc da7dc5a2 12b4d343 6d004435
+ars4x32 10 00000000 00000000 00000000 000000ff 0000ff00 00000000 00000000 00000000 d6cd5c8e 70a36b18 a224f39a 74d7d2c6
+ars4x32 10 00000000 00000000 00000000 00000080 0000ff00 00000000 00000000 00000000 18dc79b1 736119d4 a52be882 78e23f3d
+ars4x32 10 00000000 00000000 00000000 0000ff00 0000ff00 00000000 00000000 00000000 042ba503 6d4bc33d 530de6b6 46c83dbc
+ars4x32 10 00000000 00000000 00000000 00008000 0000ff00 00000000 00000000 00000000 ac2bcf2e 6d1831d7 e748da2a 66618176
+ars4x32 10 00000000 00000000 00000000 00ff0000 0000ff00 00000000 00000000 00000000 b8177d4a 8f058469 d2d72992 7c56821a
+ars4x32 10 00000000 00000000 00000000 00800000 0000ff00 00000000 00000000 00000000 cc92440a 08a79c7c b6203a24 8e81c8fa
+ars4x32 10 00000000 00000000 00000000 ff000000 0000ff00 00000000 00000000 00000000 60891aaf d01bf76a 166dd985 4a59c676
+ars4x32 10 00000000 00000000 00000000 80000000 0000ff00 00000000 00000000 00000000 3b8dc262 9a3c487a b9f621ae 532cce23
+ars4x32 10 886a3f24 d308a385 2e8a1913 44737003 0000ff00 00000000 00000000 00000000 a588c9fb 84c80f49 85617392 f28ffb9e
+ars4x32 10 223809a4 d0319f29 98fa2e08 896c4eec 0000ff00 00000000 00000000 00000000 1d9391f8 d9c48b01 2015ae55 66beca09
+ars4x32 10 e6212845 7713d038 cf6654be 6c0ce934 0000ff00 00000000 00000000 00000000 33721436 1ddc703e 7d53720c 06616c78
+ars4x32 10 00000001 00000000 00000000 00000000 00008000 00000000 00000000 00000000 2c1fb260 4b9d3357 b5e32c52 e4d4a547
+ars4x32 10 00000100 00000000 00000000 00000000 00008000 00000000 00000000 00000000 86f801b8 5661adcd f033c12a bdecffd1
+ars4x32 10 00010000 00000000 00000000 00000000 00008000 00000000 00000000 00000000 828a289c 779a00a0 0a4fca07 f55832eb
+ars4x32 10 01000000 00000000 00000000 00000000 00008000 00000000 00000000 00000000 a8158b87 8b117489 a0163d43 4bde76fb
+ars4x32 10 00000000 00000001 00000000 00000000 00008000 00000000 00000000 00000000 b649633d 8edf2b2e 224d0043 b110e51c
+ars4x32 10 00000000 00000100 00000000 00000000 00008000 00000000 00000000 00000000 1a2b5294 a32ca0ed ebaad815 51e9bdf6
+ars4x32 10 00000000 00010000 00000000 00000000 00008000 00000000 00000000 00000000 5e641b42 f4e3e74c 83c74cd5 a807a6b1
+ars4x32 10 00000000 01000000 00000000 00000000 00008000 00000000 00000000 00000000 580fc53f 36b7fec4 855dab97 60157c73
+ars4x32 10 00000000 00000000 00000001 00000000 00008000 00000000 00000000 00000000 70233efb 1fba478b 8bfd17d5 2ba33d17
+ars4x32 10 00000000 00000000 00000100 00000000 00008000 00000000 00000000 00000000 289fff80 c6c4462a 50aa8868 fb07aacd
+ars4x32 10 00000000 00000000 00010000 00000000 00008000 00000000 00000000 00000000 f95b9940 6de46d1d 090a417b eb7b9b22
+ars4x32 10 00000000 00000000 01000000 00000000 00008000 00000000 00000000 00000000 8693b12b 5605ca40 3639dbb6 773154ea
+ars4x32 10 00000000 00000000 00000000 00000001 00008000 00000000 00000000 00000000 b4f37059 b7c5e71a 976e0084 ce535b06
+ars4x32 10 00000000 00000000 00000000 00000100 00008000 00000000 00000000 00000000 67089a5f 0f7499d4 ba3e5df8 65b5d616
+ars4x32 10 00000000 00000000 00000000 00010000 00008000 00000000 00000000 00000000 3030083c 44c4fc9c de89336a 56c3d028
+ars4x32 10 00000000 00000000 00000000 01000000 00008000 00000000 00000000 00000000 98e4d84d 0aa677ed 7eef5d57 8ec60064
+ars4x32 10 0000ff00 00000000 00000000 00000000 00008000 00000000 00000000 00000000 ead6b0d8 15c4a87c 9fd307c5 c59222ba
+ars4x32 10 00008000 00000000 00000000 00000000 00008000 00000000 00000000 00000000 40067896 8c980481 dd9b28cc 1fe0a1d7
+ars4x32 10 00ff0000 00000000 00000000 00000000 00008000 00000000 00000000 00000000 a7530620 85baf1ab f8554105 3f28debf
+ars4x32 10 00800000 00000000 00000000 00000000 00008000 00000000 00000000 00000000 c3e96d56 3528f63e 69745e92 093df66a
+ars4x32 10 ff000000 00000000 00000000 00000000 00008000 00000000 00000000 00000000 0a7b4073 2d90e83d 5c6403ce 9138f700
+ars4x32 10 80000000 00000000 00000000 00000000 00008000 00000000 00000000 00000000 48cda39c cf436caa 256ce979 42e2007e
+ars4x32 10 00000000 000000ff 00000000 00000000 00008000 00000000 00000000 00000000 28c02311 f61730f1 f777e987 6633e363
+ars4x32 10 00000000 00000080 00000000 00000000 00008000 00000000 00000000 00000000 36c60b34 95849f47 be3eadd5 15621908
+ars4x32 10 00000000 0000ff00 00000000 00000000 00008000 00000000 00000000 00000000 ad9c0e68 d937938e d51ff077 d9248807
+ars4x32 10 00000000 00008000 00000000 00000000 00008000 00000000 00000000 00000000 8ed38874 e59f5903 4637afa1 9385dc8f
+ars4x32 10 00000000 00ff0000 00000000 00000000 00008000 00000000 00000000 00000000 c6329fb2 c441156d 431cd7e6 acbf16dc
+ars4x32 10 00000000 00800000 00000000 00000000 00008000 00000000 00000000 00000000 7ac3e4e4 fb235550 28eef786 5973a922
+ars4x32 10 00000000 ff000000 00000000 00000000 00008000 00000000 00000000 00000000 1bf649d1 22e1d20f 909dac92 a0841b86
+ars4x32 10 00000000 80000000 00000000 00000000 00008000 00000000 00000000 00000000 038df3cf a92f5ed0 d9d9b196 7e30dc75
+ars4x32 10 00000000 00000000 000000ff 00000000 00008000 00000000 00000000 00000000 ae62b3e4 8f7fd299 3e8a3331 dfbf97cf
+ars4x32 10 00000000 00000000 00000080 00000000 00008000 00000000 00000000 00000000 6e8b36ac 00312a90 0627f1b4 830909ec
+ars4x32 10 00000000 00000000 0000ff00 00000000 00008000 00000000 00000000 00000000 d5f57993 ba3427b2 494662f7 1540d20c
+ars4x32 10 00000000 00000000 00008000 00000000 00008000 00000000 00000000 00000000 77336a3b 29db5f6e 14c3529f 2fe84106
+ars4x32 10 00000000 00000000 00ff0000 00000000 00008000 00000000 00000000 00000000 69f5c5d1 74e9e964 b34f84ea 33c005f7
+ars4x32 10 00000000 00000000 00800000 00000000 00008000 00000000 00000000 00000000 4169325f a27e38d6 a840fdab f6e263c4
+ars4x32 10 00000000 00000000 ff000000 00000000 00008000 00000000 00000000 00000000 6ba6529c 060468f4 f75739df d14b414a
+ars4x32 10 00000000 00000000 80000000 00000000 00008000 00000000 00000000 00000000 f9e1dbfa 4629392b 40c440ae b150dc10
+ars4x32 10 00000000 00000000 00000000 000000ff 00008000 00000000 00000000 00000000 c3bfd4e5 49f163df 982dc34d 3ea45d73
+ars4x32 10 00000000 00000000 00000000 00000080 00008000 00000000 00000000 00000000 0b1d46a4 0dc87e22 51b31851 e67a0640
+ars4x32 10 00000000 00000000 00000000 0000ff00 00008000 00000000 00000000 00000000 b3947949 cda68ed4 5b41245a fec3cc4d
+ars4x32 10 00000000 00000000 00000000 00008000 00008000 00000000 00000000 00000000 f0b14a4d 9d6bc368 41291f18 c7732ebb
+ars4x32 10 00000000 00000000 00000000 00ff0000 00008000 00000000 00000000 00000000 5d14a04a 5fd91a6c 24f2daa6 9e5bee56
+ars4x32 10 00000000 00000000 00000000 00800000 00008000 00000000 00000000 00000000 e1da803f f714cd82 86c69275 fa85929a
+ars4x32 10 00000000 00000000 00000000 ff000000 00008000 00000000 00000000 00000000 24e1c392 e0687318 b80eda4b 4d779c7a
+ars4x32 10 00000000 00000000 00000000 80000000 00008000 00000000 00000000 00000000 229b4480 a8d51c8f aea527fd 2061cf50
+ars4x32 10 886a3f24 d308a385 2e8a1913 44737003 00008000 00000000 00000000 00000000 1541fd48 266479ea d562ddaf b046946a
+ars4x32 10 223809a4 d0319f29 98fa2e08 896c4eec 00008000 00000000 00000000 00000000 51e6885b d82e4842 6bc6f3ef 84348129
+ars4x32 10 e6212845 7713d038 cf6654be 6c0ce934 00008000 00000000 00000000 00000000 5069213d c381cd8d 6636cc72 f4661fd7
+ars4x32 10 00000001 00000000 00000000 00000000 00ff0000 00000000 00000000 00000000 e88443ad 68c1e6a7 1bcf3aec 1dd200a7
+ars4x32 10 00000100 00000000 00000000 00000000 00ff0000 00000000 00000000 00000000 cae83bfa 673e52f0 678d80ac 703c57b3
+ars4x32 10 00010000 00000000 00000000 00000000 00ff0000 00000000 00000000 00000000 93656c91 ebe4c141 94d82984 dbe7b4c1
+ars4x32 10 01000000 00000000 00000000 00000000 00ff0000 00000000 00000000 00000000 46ce0ab3 e697a69b de54a604 18a05322
+ars4x32 10 00000000 00000001 00000000 00000000 00ff0000 00000000 00000000 00000000 7b659b84 7ac2102a 0ef11f37 fb9226a2
+ars4x32 10 00000000 00000100 00000000 00000000 00ff0000 00000000 00000000 00000000 cdba9d6e a28a10f0 bd9118b9 fbcc0c7b
+ars4x32 10 00000000 00010000 00000000 00000000 00ff0000 00000000 00000000 00000000 933021e6 11537841 93256204 e191ed2c
+ars4x32 10 00000000 01000000 00000000 00000000 00ff0000 00000000 00000000 00000000 0fb34cf4 a9f8bfc8 32abc499 66ba599c
+ars4x32 10 00000000 00000000 00000001 00000000 00ff0000 00000000 00000000 00000000 c3b56dd9 1150aa54 9f5fad4f 996e43d9
+ars4x32 10 00000000 00000000 00000100 00000000 00ff0000 00000000 00000000 00000000 76c3605b e31e707c 34408c3e 1c06c78e
+ars4x32 10 00000000 00000000 00010000 00000000 00ff0000 00000000 00000000 00000000 233e3c15 fae95405 f3cb0fd7 4906d997
+ars4x32 10 00000000 00000000 01000000 00000000 00ff0000 00000000 00000000 00000000 704b0da7 f6b4e9f5 ac79ea80 5d2b16d4
+ars4x32 10 00000000 00000000 00000000 00000001 00ff0000 00000000 00000000 00000000 52e9c5c4 bdea19d5 f9f4130b 82c74a8b
+ars4x32 10 00000000 00000000 00000000 00000100 00ff0000 00000000 00000000 00000000 28250c8e 091815d9 f9440858 ba50a1bb
+ars4x32 10 00000000 00000000 00000000 00010000 00ff0000 00000000 00000000 00000000 00aa3398 1593c82b 01f90307 4da20b88
+ars4x32 10 00000000 00000000 00000000 01000000 00ff0000 00000000 00000000 00000000 14d27e46 c6e0deee 6246a1ab 544ae3c5
+ars4x32 10 0000ff00 00000000 00000000 00000000 00ff0000 00000000 00000000 00000000 38ad9717 fbede586 a6fb65ed df1c9f5b
+ars4x32 10 00008000 00000000 00000000 00000000 00ff0000 00000000 00000000 00000000 9b6c7482 25032317 b78aa504 5045caf2
+ars4x32 10 00ff0000 00000000 00000000 00000000 00ff0000 00000000 00000000 00000000 7252d59d f4f4d769 b9149134 3d4684c9
+ars4x32 10 00800000 00000000 00000000 00000000 00ff0000 00000000 00000000 00000000 873abe0e 5201f3f1 30cdb3cc 8e715ac2
+ars4x32 10 ff000000 00000000 00000000 00000000 00ff0000 00000000 00000000 00000000 0cd9f4b7 5e3f61b3 c2bbe84a ed11a097
+ars4x32 10 80000000 00000000 00000000 00000000 00ff0000 00000000 00000000 00000000 9168e4e8 a189d9cc 4a788569 d53b415a
+ars4x32 10 00000000 000000ff 00000000 00000000 00ff0000 00000000 00000000 00000000 9f99a1d1 b9f6076b 05a627e8 b064124d
+ars4x32 10 00000000 00000080 00000000 00000000 00ff0000 00000000 00000000 00000000 b5891ac7 98593d8a 5f966b3c 466c6ae3
+ars4x32 10 00000000 0000ff00 00000000 00000000 00ff0000 00000000 00000000 00000000 7f8d8a7a 037a7275 cbb4f9bf a61e2b9c
+ars4x32 10 00000000 00008000 00000000 00000000 00ff0000 00000000 00000000 00000000 b3b7b20d 2d87fe1d b98016a3 ae8e4ce1
+ars4x32 10 00000000 00ff0000 00000000 00000000 00ff0000 00000000 00000000 00000000 534bd7f1 72934711 4171cfcb 81ddaad3
+ars4x32 10 00000000 00800000 00000000 00000000 00ff0000 00000000 00000000 00000000 42d534bd bcae68e8 dea7289e 1ccc31d3
+ars4x32 10 00000000 ff000000 00000000 00000000 00ff0000 00000000 00000000 00000000 c51854f1 ef3fb610 aab3ddc8 06cd29a6
+ars4x32 10 00000000 80000000 00000000 00000000 00ff0000 00000000 00000000 00000000 a6f81ddd f812ed3f 0b14cb66 2d74d5af
+ars4x32 10 00000000 00000000 000000ff 00000000 00ff0000 00000000 00000000 00000000 02b9e693 e2daeb40 38c3c0d1 b6e1b678
+ars4x32 10 00000000 00000000 00000080 00000000 00ff0000 00000000 00000000 00000000 619299f7 5d418257 05a4b287 7d64ec86
+ars4x32 10 00000000 00000000 0000ff00 00000000 00ff0000 00000000 00000000 00000000 54abe441 1e0ca52c 9697d390 ec49403c
+ars4x32 10 00000000 00000000 00008000 00000000 00ff0000 00000000 00000000 00000000 45f4cd80 081e315a 7642ae2a 759b45c1
+ars4x32 10 00000000 00000000 00ff0000 00000000 00ff0000 00000000 00000000 00000000 12aa95e9 ce20986d 7736572f 632973d1
+ars4x32 10 00000000 00000000 00800000 00000000 00ff0000 00000000 00000000 00000000 0c51b3d6 bfd21432 720ef22f a8eb9b11
+ars4x32 10 00000000 00000000 ff000000 00000000 00ff0000 00000000 00000000 00000000 e5d77df0 cc30d6f1 90a45f1a e82f6893
+ars4x32 10 00000000 00000000 80000000 00000000 00ff0000 00000000 00000000 00000000 6ad6d549 22c09b7e 11252c9e 952d6aff
+ars4x32 10 00000000 00000000 00000000 000000ff 00ff0000 00000000 00000000 00000000 ee477839 37c32d1a 48552f71 b890ec4b
+ars4x32 10 00000000 00000000 00000000 00000080 00ff0000 00000000 00000000 00000000 4f7f8639 5db444c4 ef8f4605 f1556a83
+ars4x32 10 00000000 00000000 00000000 0000ff00 00ff0000 00000000 00000000 00000000 b7661dc6 4d43a593 549d1cfe cfc04369
+ars4x32 10 00000000 00000000 00000000 00008000 00ff0000 00000000 00000000 00000000 de625f52 02b261c4 effc7c7b 91cb13e7
+ars4x32 10 00000000 00000000 00000000 00ff0000 00ff0000 00000000 00000000 00000000 a1c7b8bd 6d64b2f8 d1298c96 e130ab7b
+ars4x32 10 00000000 00000000 00000000 00800000 00ff0000 00000000 00000000 00000000 662f82fa 1800add6 f8312469 4736a74f
+ars4x32 10 00000000 00000000 00000000 ff000000 00ff0000 00000000 00000000 00000000 5911e758 97dae4b4 6af2b7bf 150f6d1b
+ars4x32 10 00000000 00000000 00000000 80000000 00ff0000 00000000 00000000 00000000 3488d858 3e2bbad6 40c64989 bab1e0e5
+ars4x32 10 886a3f24 d308a385 2e8a1913 44737003 00ff0000 00000000 00000000 00000000 dbe2cf83 80c2228c 2c1e363d e5d927c0
+ars4x32 10 223809a4 d0319f29 98fa2e08 896c4eec 00ff0000 00000000 00000000 00000000 847c9587 c42cd2d6 451f9848 6c289780
+ars4x32 10 e6212845 7713d038 cf6654be 6c0ce934 00ff0000 00000000 00000000 00000000 9efd8b55 0a5d400e 3a07864b db6eed91
+ars4x32 10 00000001 00000000 00000000 00000000 00800000 00000000 00000000 00000000 db5ef4e1 e16048d4 78b14d68 33a970c7
+ars4x32 10 00000100 00000000 00000000 00000000 00800000 00000000 00000000 00000000 1b61f324 2fa9127a daf45f23 2281de23
+ars4x32 10 00010000 00000000 00000000 00000000 00800000 00000000 00000000 00000000 e527ad88 66072a45 cb92483c 5bca41c9
+ars4x32 10 01000000 00000000 00000000 00000000 00800000 00000000 00000000 00000000 0df61f3f b1b08c54 c7570612 1103be2c
+ars4x32 10 00000000 00000001 00000000 00000000 00800000 00000000 00000000 00000000 e4ec6165 605e55f8 44fff6e8 b971033f
+ars4x32 10 00000000 00000100 00000000 00000000 00800000 00000000 00000000 00000000 c2569c0f 04a96b58 b4eac11f 6f477e54
+ars4x32 10 00000000 00010000 00000000 00000000 00800000 00000000 00000000 00000000 9867ce58 13167afc 3259d630 73b5cb83
+ars4x32 10 00000000 01000000 00000000 00000000 00800000 00000000 00000000 00000000 06ba859e b8d588e4 ea7f3b8e 3b1d1b79
+ars4x32 10 00000000 00000000 00000001 00000000 00800000 00000000 00000000 00000000 c04d021b 3518ba1e 3f729c0a 2cb2d2f2
+ars4x32 10 00000000 00000000 00000100 00000000 00800000 00000000 00000000 00000000 830e7ae7 eadc30a7 4d9812dc 6b43aa06
+ars4x32 10 00000000 00000000 00010000 00000000 00800000 00000000 00000000 00000000 b08691da 09b5e267 73cbee0d 57194cef
+ars4x32 10 00000000 00000000 01000000 00000000 00800000 00000000 00000000 00000000 e03fbf4a eaaf4354 a5f21afc 0b24275a
+ars4x32 10 00000000 00000000 00000000 00000001 00800000 00000000 00000000 00000000 4085411e 55ddeccd 11721c28 61944ef3
+ars4x32 10 00000000 00000000 00000000 00000100 00800000 00000000 00000000 00000000 31d2bb4c db351c79 ed94d0e6 b06757ac
+ars4x32 10 00000000 00000000 00000000 00010000 00800000 00000000 00000000 00000000 b948086e 5a94b824 1dab6a09 7ab43abb
+ars4x32 10 00000000 00000000 00000000 01000000 00800000 00000000 00000000 00000000 c2d6fbef 6f1ad683 6e50b436 8f6e0473
+ars4x32 10 0000ff00 00000000 00000000 00000000 00800000 00000000 00000000 00000000 7c0ff76b c44db90a c7495841 3d14b195
+ars4x32 10 00008000 00000000 00000000 00000000 00800000 00000000 00000000 00000000 646271c9 b5f201f1 6a854d67 50292d43
+ars4x32 10 00ff0000 00000000 00000000 00000000 00800000 00000000 00000000 00000000 d45d3917 70ffcfb0 2ff6010e 9af9b891
+ars4x32 10 00800000 00000000 00000000 00000000 00800000 00000000 00000000 00000000 cf7aac1c 76b5a514 fcfcbe40 2bbc5b50
+ars4x32 10 ff000000 00000000 00000000 00000000 00800000 00000000 00000000 00000000 fca66d94 0f4feb3f e0ab1b45 536472a3
+ars4x32 10 80000000 00000000 00000000 00000000 00800000 00000000 00000000 00000000 2090d2e1 fe76252c 0a3241d7 1898c552
+ars4x32 10 00000000 000000ff 00000000 00000000 00800000 00000000 00000000 00000000 8f1a05f3 eb0d950f 5e10ac82 d7d98359
+ars4x32 10 00000000 00000080 00000000 00000000 00800000 00000000 00000000 00000000 e9c204bf bb484da9 7025ed88 c41eb824
+ars4x32 10 00000000 0000ff00 00000000 00000000 00800000 00000000 00000000 00000000 e3f0c873 0632085c fc75c879 88318a3d
+ars4x32 10 00000000 00008000 00000000 00000000 00800000 00000000 00000000 00000000 bcfed823 8ee4cee9 78d39ab7 f915b651
+ars4x32 10 00000000 00ff0000 00000000 00000000 00800000 00000000 00000000 00000000 95f99dbd 2abddccb 6ac36720 2ac62033
+ars4x32 10 00000000 00800000 00000000 00000000 00800000 00000000 00000000 00000000 f46eca4a 488c1f4d fce17f35 0e29f371
+ars4x32 10 00000000 ff000000 00000000 00000000 00800000 00000000 00000000 00000000 ed90442c 193ae115 c99d70af 9dbae328
+ars4x32 10 00000000 80000000 00000000 00000000 00800000 00000000 00000000 00000000 004e80fe 9b3a9cf4 1ace505d aec4050b
+ars4x32 10 00000000 00000000 000000ff 00000000 00800000 00000000 00000000 00000000 859f6028 433d3b58 85f84904 609079a2
+ars4x32 10 00000000 00000000 00000080 00000000 00800000 00000000 00000000 00000000 37ab8b47 fd603f7d b3f51703 1df6faee
+ars4x32 10 00000000 00000000 0000ff00 00000000 00800000 00000000 00000000 00000000 d12ca292 4e8eafd6 7720d20b afe3dc6d
+ars4x32 10 00000000 00000000 00008000 00000000 00800000 00000000 00000000 00000000 3958d33c 251761e9 2a2508e8 3ad41a75
+ars4x32 10 00000000 00000000 00ff0000 00000000 00800000 00000000 00000000 00000000 63b226bc 9f57beb8 0a08b6d2 deb4184f
+ars4x32 10 00000000 00000000 00800000 00000000 00800000 00000000 00000000 00000000 f1762304 babb3dad 9e68f4d9 ede3754a
+ars4x32 10 00000000 00000000 ff000000 00000000 00800000 00000000 00000000 00000000 459d968c 6566e40b 42960e14 d220224b
+ars4x32 10 00000000 00000000 80000000 00000000 00800000 00000000 00000000 00000000 bc82e8db 4745f1f7 834f9f5f 423b69b5
+ars4x32 10 00000000 00000000 00000000 000000ff 00800000 00000000 00000000 00000000 d4ac8f96 1e5ce164 202b2891 c1f1cb85
+ars4x32 10 00000000 00000000 00000000 00000080 00800000 00000000 00000000 00000000 555a3182 851f8f14 840f6e67 ff50f9bd
+ars4x32 10 00000000 00000000 00000000 0000ff00 00800000 00000000 00000000 00000000 c81cd8cf 39a0b6d9 707fb56c 14e285e5
+ars4x32 10 00000000 00000000 00000000 00008000 00800000 00000000 00000000 00000000 703f8143 6a9d4f17 1ce6b2d1 8a5a82ae
+ars4x32 10 00000000 00000000 00000000 00ff0000 00800000 00000000 00000000 00000000 bd3214ef 868380c4 90c06b8a 67ce86ef
+ars4x32 10 00000000 00000000 00000000 00800000 00800000 00000000 00000000 00000000 b49e71ab 6320e3ef 54ed49fd fe98e25e
+ars4x32 10 00000000 00000000 00000000 ff000000 00800000 00000000 00000000 00000000 ab7c9f9a 309cd4ef 72c641eb 8aaf2ef4
+ars4x32 10 00000000 00000000 00000000 80000000 00800000 00000000 00000000 00000000 97cc0d1a 620b1043 84c6dfe1 931f395e
+ars4x32 10 886a3f24 d308a385 2e8a1913 44737003 00800000 00000000 00000000 00000000 b7ca7f47 66e13159 047c8bec a45d8db0
+ars4x32 10 223809a4 d0319f29 98fa2e08 896c4eec 00800000 00000000 00000000 00000000 67e23eb6 be4231c7 3fa98062 fe04bd78
+ars4x32 10 e6212845 7713d038 cf6654be 6c0ce934 00800000 00000000 00000000 00000000 5fa8976f f69a3512 1774b3f4 80395e73
+ars4x32 10 00000001 00000000 00000000 00000000 ff000000 00000000 00000000 00000000 f7d2aa28 e640a1ec c2d8b754 41848c0e
+ars4x32 10 00000100 00000000 00000000 00000000 ff000000 00000000 00000000 00000000 410b55c1 7bf60178 37d78113 db9f0b23
+ars4x32 10 00010000 00000000 00000000 00000000 ff000000 00000000 00000000 00000000 69feb9d9 7ddb8fee 793d78d1 cd2aeb75
+ars4x32 10 01000000 00000000 00000000 00000000 ff000000 00000000 00000000 00000000 3b6e6059 c910b0f8 7a39c697 41336a36
+ars4x32 10 00000000 00000001 00000000 00000000 ff000000 00000000 00000000 00000000 fd1b6a45 cb542c48 02229b0d 290a52ba
+ars4x32 10 00000000 00000100 00000000 00000000 ff000000 00000000 00000000 00000000 c3d2e857 0441fd33 973d189f 0f2e74cd
+ars4x32 10 00000000 00010000 00000000 00000000 ff000000 00000000 00000000 00000000 409d2af9 5b3bf6c6 67242f7d 0a4ac554
+ars4x32 10 00000000 01000000 00000000 00000000 ff000000 00000000 00000000 00000000 ce3e9c59 6f490eef af582f73 466d8fc3
+ars4x32 10 00000000 00000000 00000001 00000000 ff000000 00000000 00000000 00000000 c63a6987 171d2147 0a028b8a 9357d8da
+ars4x32 10 00000000 00000000 00000100 00000000 ff000000 00000000 00000000 00000000 457d09fb ad6adc96 cf7e989a 18de088a
+ars4x32 10 00000000 00000000 00010000 00000000 ff000000 00000000 00000000 00000000 ca559ca2 a52c8634 b9f259f0 eb45d905
+ars4x32 10 00000000 00000000 01000000 00000000 ff000000 00000000 00000000 00000000 6d9c800b 96db29c0 68997d47 85629ce3
+ars4x32 10 00000000 00000000 00000000 00000001 ff000000 00000000 00000000 00000000 385760c0 d16f0faa 23cb7b10 5b7684fa
+ars4x32 10 00000000 00000000 00000000 00000100 ff000000 00000000 00000000 00000000 030f70d6 a2276f19 aa0303a5 9fff9373
+ars4x32 10 00000000 00000000 00000000 00010000 ff000000 00000000 00000000 00000000 a32dd276 66689272 7c93a697 5535e13e
+ars4x32 10 00000000 00000000 00000000 01000000 ff000000 00000000 00000000 00000000 4c882120 42e1caa4 77d94eaa 40fb7d85
+ars4x32 10 0000ff00 00000000 00000000 00000000 ff000000 00000000 00000000 00000000 68af87e5 736298dc ffd70c1e cd7fdc20
+ars4x32 10 00008000 00000000 00000000 00000000 ff000000 00000000 00000000 00000000 06877113 0f14e185 97f9e55a b4eaa91f
+ars4x32 10 00ff0000 00000000 00000000 00000000 ff000000 00000000 00000000 00000000 b7a90a79 29557e2e 2859cc17 a9342fcb
+ars4x32 10 00800000 00000000 00000000 00000000 ff000000 00000000 00000000 00000000 124f8d4f 9db2acdf ca0bbb11 3d23283a
+ars4x32 10 ff000000 00000000 00000000 00000000 ff000000 00000000 00000000 00000000 5df2a345 ca3497ca 637ff8f2 42ce8160
+ars4x32 10 80000000 00000000 00000000 00000000 ff000000 00000000 00000000 00000000 4c9688b5 de560a88 153c9b25 6de2906c
+ars4x32 10 00000000 000000ff 00000000 00000000 ff000000 00000000 00000000 00000000 a4894ec2 b445b0d1 5ce41862 80de31ec
+ars4x32 10 00000000 00000080 00000000 00000000 ff000000 00000000 00000000 00000000 7ce5a59c 61f94b72 6cbf8c5d 5ab5b2bd
+ars4x32 10 00000000 0000ff00 00000000 00000000 ff000000 00000000 00000000 00000000 4ebc3279 09240e4b a07646df 005db721
+ars4x32 10 00000000 00008000 00000000 00000000 ff000000 00000000 00000000 00000000 387cd8ae ec75b073 76f47ec8 fcd3bde8
+ars4x32 10 00000000 00ff0000 00000000 00000000 ff000000 00000000 00000000 00000000 042a366e 12677620 bb39008c 14397c4a
+ars4x32 10 00000000 00800000 00000000 00000000 ff000000 00000000 00000000 00000000 b5da689c 879191e2 57b3b2dc cceba406
+ars4x32 10 00000000 ff000000 00000000 00000000 ff000000 00000000 00000000 00000000 93d66392 592f6cc4 95102dad f11423e0
+ars4x32 10 00000000 80000000 00000000 00000000 ff000000 00000000 00000000 00000000 efdb58c1 669ba5f2 63e548f7 4fd85d31
+ars4x32 10 00000000 00000000 000000ff 00000000 ff000000 00000000 00000000 00000000 c55a255a 6bb3527f 36f5bd81 b732a889
+ars4x32 10 00000000 00000000 00000080 00000000 ff000000 00000000 00000000 00000000 9642acba 516b0c77 6616d37a 38363d9b
+ars4x32 10 00000000 00000000 0000ff00 00000000 ff000000 00000000 00000000 00000000 fec0b5c5 e1eb7b36 d67dbc8d ed6b2fcc
+ars4x32 10 00000000 00000000 00008000 00000000 ff000000 00000000 00000000 00000000 ceaafa67 bb785bf6 db255932 f5fce949
+ars4x32 10 00000000 00000000 00ff0000 00000000 ff000000 00000000 00000000 00000000 81ca13cf 1c5aa438 5fbf0aeb f8ea76de
+ars4x32 10 00000000 00000000 00800000 00000000 ff000000 00000000 00000000 00000000 ba833116 fe7eaaa0 3fe9eff9 0de94178
+ars4x32 10 00000000 00000000 ff000000 00000000 ff000000 00000000 00000000 00000000 4e586f11 1e4a7a42 111fae69 d48e5612
+ars4x32 10 00000000 00000000 80000000 00000000 ff000000 00000000 00000000 00000000 44c18d42 65604a51 a44b5072 8641ca7a
+ars4x32 10 00000000 00000000 00000000 000000ff ff000000 00000000 00000000 00000000 ce91dd77 a6a45786 ea5cf870 a8de2c9f
+ars4x32 10 00000000 00000000 00000000 00000080 ff000000 00000000 00000000 00000000 f05bd698 29284180 78c6f669 1b5cf6e5
+ars4x32 10 00000000 00000000 00000000 0000ff00 ff000000 00000000 00000000 00000000 13a510c1 7ec43c0a 51e6456c 2fb6d9b8
+ars4x32 10 00000000 00000000 00000000 00008000 ff000000 00000000 00000000 00000000 34b3f6ad e44fda40 74d440b8 cb8b80d0
+ars4x32 10 00000000 00000000 00000000 00ff0000 ff000000 00000000 00000000 00000000 16bfac7f ba4437e0 c8aa863a 6bc8b15f
+ars4x32 10 00000000 00000000 00000000 00800000 ff000000 00000000 00000000 00000000 4da07234 8f72fe3d a4c2e8dc 94bdd3ac
+ars4x32 10 00000000 00000000 00000000 ff000000 ff000000 00000000 00000000 00000000 f468dfc1 6e0f1e95 26798846 5154122e
+ars4x32 10 00000000 00000000 00000000 80000000 ff000000 00000000 00000000 00000000 5fe2c6c1 af61ba83 457a3f73 a14a3fad
+ars4x32 10 886a3f24 d308a385 2e8a1913 44737003 ff000000 00000000 00000000 00000000 b68c8a72 adb26d11 56ac3f0b 0ff6bd07
+ars4x32 10 223809a4 d0319f29 98fa2e08 896c4eec ff000000 00000000 00000000 00000000 7791be90 afae34fe 929d2b8e b154905a
+ars4x32 10 e6212845 7713d038 cf6654be 6c0ce934 ff000000 00000000 00000000 00000000 d9c97667 c152434b dc1464bd e178171a
+ars4x32 10 00000001 00000000 00000000 00000000 80000000 00000000 00000000 00000000 97ff5cd8 4861db8c 56b30095 393ea1b2
+ars4x32 10 00000100 00000000 00000000 00000000 80000000 00000000 00000000 00000000 d79f27d2 8c0b82f2 032b61a7 325736af
+ars4x32 10 00010000 00000000 00000000 00000000 80000000 00000000 00000000 00000000 6d8a2815 12c7ae92 c104fdf1 cffe9065
+ars4x32 10 01000000 00000000 00000000 00000000 80000000 00000000 00000000 00000000 4a2e289e 6022c434 a9d05f0f b6164120
+ars4x32 10 00000000 00000001 00000000 00000000 80000000 00000000 00000000 00000000 a242a3c1 2d12adde 35c2700c 381ac0cb
+ars4x32 10 00000000 00000100 00000000 00000000 80000000 00000000 00000000 00000000 e0570553 5f8edf6c a744ed01 9b38eefd
+ars4x32 10 00000000 00010000 00000000 00000000 80000000 00000000 00000000 00000000 c278a1e4 30fdb3e6 87758dc9 407e25fc
+ars4x32 10 00000000 01000000 00000000 00000000 80000000 00000000 00000000 00000000 780d148b 118fcdea b603d27f 02207e40
+ars4x32 10 00000000 00000000 00000001 00000000 80000000 00000000 00000000 00000000 a2bda148 cc53600a 1726339f 72104df8
+ars4x32 10 00000000 00000000 00000100 00000000 80000000 00000000 00000000 00000000 0729f5bd cd715d46 76d7deb7 319cffb6
+ars4x32 10 00000000 00000000 00010000 00000000 80000000 00000000 00000000 00000000 8accf3dc 9cf6976f 95f4991a 366a0b57
+ars4x32 10 00000000 00000000 01000000 00000000 80000000 00000000 00000000 00000000 d9f99c22 aba10b6f 409410a4 46579319
+ars4x32 10 00000000 00000000 00000000 00000001 80000000 00000000 00000000 00000000 909887b1 6f7554d8 37e260c5 daa0f112
+ars4x32 10 00000000 00000000 00000000 00000100 80000000 00000000 00000000 00000000 f74bd90d 935d6769 0251c6dc 8c756b12
+ars4x32 10 00000000 00000000 00000000 00010000 80000000 00000000 00000000 00000000 36c4bb4a 068834b6 8658e86e e63b17c5
+ars4x32 10 00000000 00000000 00000000 01000000 80000000 00000000 00000000 00000000 fff5db04 c71a6e74 6fef623c 8cbd1065
+ars4x32 10 0000ff00 00000000 00000000 00000000 80000000 00000000 00000000 00000000 5494ff8e b037ba29 79cc7007 586b197a
+ars4x32 10 00008000 00000000 00000000 00000000 80000000 00000000 00000000 00000000 00ec0fcb 778eb20e aab8faf1 e35ac3cf
+ars4x32 10 00ff0000 00000000 00000000 00000000 80000000 00000000 00000000 00000000 a917f1ed 8159329a de9788bf 97e4bbe8
+ars4x32 10 00800000 00000000 00000000 00000000 80000000 00000000 00000000 00000000 25906cb3 7d803d3f 4ba100f5 e89d9852
+ars4x32 10 ff000000 00000000 00000000 00000000 80000000 00000000 00000000 00000000 d82188ad 229109e3 b4981afa 5ab8891d
+ars4x32 10 80000000 00000000 00000000 00000000 80000000 00000000 00000000 00000000 adbdf443 3fb1ffa4 1fa26427 d492932f
+ars4x32 10 00000000 000000ff 00000000 00000000 80000000 00000000 00000000 00000000 e8fa0690 193087aa f5ed6379 c99b78ba
+ars4x32 10 00000000 00000080 00000000 00000000 80000000 00000000 00000000 00000000 c967dfa9 e083aa64 ead2c7b7 d9ea26b1
+ars4x32 10 00000000 0000ff00 00000000 00000000 80000000 00000000 00000000 00000000 5dcf7365 5afcb957 df110c18 cbbeb426
+ars4x32 10 00000000 00008000 00000000 00000000 80000000 00000000 00000000 00000000 d5e940e2 434e3b1e 2f128f6f 5451dfc3
+ars4x32 10 00000000 00ff0000 00000000 00000000 80000000 00000000 00000000 00000000 f1794662 b301ae7d a2f464e6 997dd9f6
+ars4x32 10 00000000 00800000 00000000 00000000 80000000 00000000 00000000 00000000 c3aef88e f1d5ac85 d42a0f21 7cb0f3c9
+ars4x32 10 00000000 ff000000 00000000 00000000 80000000 00000000 00000000 00000000 92c61834 8ea5053f 102d04af 61223c6b
+ars4x32 10 00000000 80000000 00000000 00000000 80000000 00000000 00000000 00000000 89182370 ca6696b6 cd760b2c e0a3a674
+ars4x32 10 00000000 00000000 000000ff 00000000 80000000 00000000 00000000 00000000 da2c51c8 364eaf31 254fe3c1 ac396019
+ars4x32 10 00000000 00000000 00000080 00000000 80000000 00000000 00000000 00000000 a07f2985 6feb731a af6bbb05 aee2e670
+ars4x32 10 00000000 00000000 0000ff00 00000000 80000000 00000000 00000000 00000000 0ed8bd0b d0b7bd3c 516bad61 c187b5d2
+ars4x32 10 00000000 00000000 00008000 00000000 80000000 00000000 00000000 00000000 e2fdfa30 5630a1f2 2d4cba2f a04055ef
+ars4x32 10 00000000 00000000 00ff0000 00000000 80000000 00000000 00000000 00000000 fa4f81be 84a8f047 770751fe 6a4c9e83
+ars4x32 10 00000000 00000000 00800000 00000000 80000000 00000000 00000000 00000000 879c5ee9 c172703d fbbdcac4 03a9c0e3
+ars4x32 10 00000000 00000000 ff000000 00000000 80000000 00000000 00000000 00000000 6ae3fe71 5adb4c66 79a32ba4 f4be6b5e
+ars4x32 10 00000000 00000000 80000000 00000000 80000000 00000000 00000000 00000000 f40b0b8e eba53eb5 d8c08069 e2927be8
+ars4x32 10 00000000 00000000 00000000 000000ff 80000000 00000000 00000000 00000000 53d9cee3 cece393c ed6574f2 ebe560ef
+ars4x32 10 00000000 00000000 00000000 00000080 80000000 00000000 00000000 00000000 f78c13c7 8c0b88e3 c3173a73 929c7e82
+ars4x32 10 00000000 00000000 00000000 0000ff00 80000000 00000000 00000000 00000000 ec276a98 a5c64f44 ad7dfa39 47bc1a2d
+ars4x32 10 00000000 00000000 00000000 00008000 80000000 00000000 00000000 00000000 cc98cd21 2513088c 1ff85f6d 9dddd2af
+ars4x32 10 00000000 00000000 00000000 00ff0000 80000000 00000000 00000000 00000000 1b445988 88b28e58 1f32ac9f d878b6b6
+ars4x32 10 00000000 00000000 00000000 00800000 80000000 00000000 00000000 00000000 906819f6 9f13ac1c 776dee54 23b41c34
+ars4x32 10 00000000 00000000 00000000 ff000000 80000000 00000000 00000000 00000000 57489a6c 3a733797 a402c7c6 f7072556
+ars4x32 10 00000000 00000000 00000000 80000000 80000000 00000000 00000000 00000000 a978be96 d415dec9 0c39bc27 3042b2f9
+ars4x32 10 886a3f24 d308a385 2e8a1913 44737003 80000000 00000000 00000000 00000000 4760415d 0a8eb41e e617271e ce05bbb2
+ars4x32 10 223809a4 d0319f29 98fa2e08 896c4eec 80000000 00000000 00000000 00000000 a1ae2eab 1339f173 ed81008d b1f714e0
+ars4x32 10 e6212845 7713d038 cf6654be 6c0ce934 80000000 00000000 00000000 00000000 18c45445 15a58d99 fdb3876d eb1f5c04
+ars4x32 10 00000001 00000000 00000000 00000000 00000000 000000ff 00000000 00000000 1fa1e630 4d2f894e 6ba89d45 96dc9df0
+ars4x32 10 00000100 00000000 00000000 00000000 00000000 000000ff 00000000 00000000 1516864d 4eb88d23 b222d70e 6fb68e8b
+ars4x32 10 00010000 00000000 00000000 00000000 00000000 000000ff 00000000 00000000 5ce4a88a 23da0556 daac7f67 ed800fd1
+ars4x32 10 01000000 00000000 00000000 00000000 00000000 000000ff 00000000 00000000 828cc9d2 fb57de07 e8de59fb 2f90cec1
+ars4x32 10 00000000 00000001 00000000 00000000 00000000 000000ff 00000000 00000000 77b148c1 ed3007c2 0651b6d7 b722ec45
+ars4x32 10 00000000 00000100 00000000 00000000 00000000 000000ff 00000000 00000000 b6c6c579 e5d1451f 640dd587 fa5ae330
+ars4x32 10 00000000 00010000 00000000 00000000 00000000 000000ff 00000000 00000000 5a28db11 36678ef2 930bbcf1 23cd2392
+ars4x32 10 00000000 01000000 00000000 00000000 00000000 000000ff 00000000 00000000 59760264 41199d8c efbdd3c5 966525d3
+ars4x32 10 00000000 00000000 00000001 00000000 00000000 000000ff 00000000 00000000 a2077d7d 8ae1cee9 14205b74 90e49ed9
+ars4x32 10 00000000 00000000 00000100 00000000 00000000 000000ff 00000000 00000000 a34202b9 02f0238b 48f1f511 f4b9ae4e
+ars4x32 10 00000000 00000000 00010000 00000000 00000000 000000ff 00000000 00000000 b8c1c0ea 3330fb90 f9947b9c a4a72574
+ars4x32 10 00000000 00000000 01000000 00000000 00000000 000000ff 00000000 00000000 e1f71d06 65fbb183 99769e9c eac7f1e4
+ars4x32 10 00000000 00000000 00000000 00000001 00000000 000000ff 00000000 00000000 c16e3334 d796c741 eb5bb0dd 8a879ac3
+ars4x32 10 00000000 00000000 00000000 00000100 00000000 000000ff 00000000 00000000 f53b562d 1dfbd78f d3d968db fc5401be
+ars4x32 10 00000000 00000000 00000000 00010000 00000000 000000ff 00000000 00000000 b441bfb3 540c411d e0bc213c db49576d
+ars4x32 10 00000000 00000000 00000000 01000000 00000000 000000ff 00000000 00000000 a768eabd d0a8a1d9 8d9f363f 4ddf49ff
+ars4x32 10 0000ff00 00000000 00000000 00000000 00000000 000000ff 00000000 00000000 2b692d50 cddf4bd2 6930bca7 0e0d70fc
+ars4x32 10 00008000 00000000 00000000 00000000 00000000 000000ff 00000000 00000000 b33c77e3 14c35ce1 52c76d19 7f569a77
+ars4x32 10 00ff0000 00000000 00000000 00000000 00000000 000000ff 00000000 00000000 e68e0fa7 8d78692c 613fd85d b6e15efd
+ars4x32 10 00800000 00000000 00000000 00000000 00000000 000000ff 00000000 00000000 abbe0880 b1cd7217 7d55ce46 797a0862
+ars4x32 10 ff000000 00000000 00000000 00000000 00000000 000000ff 00000000 00000000 dae5f10d 4ec8e1fc 3f268cf4 8c2c2ad4
+ars4x32 10 80000000 00000000 00000000 00000000 00000000 000000ff 00000000 00000000 84686cd0 a7ae82ec ff25ac79 f1dc3088
+ars4x32 10 00000000 000000ff 00000000 00000000 00000000 000000ff 00000000 00000000 b93e4064 9a91e466 07e0e82b b1117cde
+ars4x32 10 00000000 00000080 00000000 00000000 00000000 000000ff 00000000 00000000 10db4555 815d4eb3 5d25295e f2a4f297
+ars4x32 10 00000000 0000ff00 00000000 00000000 00000000 000000ff 00000000 00000000 703414c0 cc52320c b66fcfe8 7ccf471f
+ars4x32 10 00000000 00008000 00000000 00000000 00000000 000000ff 00000000 00000000 a6a4b22b 0957d232 ebcafef3 476f5f82
+ars4x32 10 00000000 00ff0000 00000000 00000000 00000000 000000ff 00000000 00000000 3e79b79a 29b72295 0aac8aab 1df135ca
+ars4x32 10 00000000 00800000 00000000 00000000 00000000 000000ff 00000000 00000000 6c25c4a2 ded9637d b0062115 6f168a11
+ars4x32 10 00000000 ff000000 00000000 00000000 00000000 000000ff 00000000 00000000 c0268b28 4baf1fd9 75522421 c70141be
+ars4x32 10 00000000 80000000 00000000 00000000 00000000 000000ff 00000000 00000000 2b0db51a e6e972fa c3db0c71 cf011a1b
+ars4x32 10 00000000 00000000 000000ff 00000000 00000000 000000ff 00000000 00000000 526dcc62 57cc3103 5325c82d 8d0d2443
+ars4x32 10 00000000 00000000 00000080 00000000 00000000 000000ff 00000000 00000000 4d40d69f 70795c84 43806a1a 026f7148
+ars4x32 10 00000000 00000000 0000ff00 00000000 00000000 000000ff 00000000 00000000 fc9ec47e 9da0186c 690fbed9 e779d32d
+ars4x32 10 00000000 00000000 00008000 00000000 00000000 000000ff 00000000 00000000 adc1e763 48657940 f821733b 94466063
+ars4x32 10 00000000 00000000 00ff0000 00000000 00000000 000000ff 00000000 00000000 88313a3b 434321fd 704c3a37 1de3ff37
+ars4x32 10 00000000 00000000 00800000 00000000 00000000 000000ff 00000000 00000000 f8bb1fee 069fbde8 aea1be43 7bdfc1ea
+ars4x32 10 00000000 00000000 ff000000 00000000 00000000 000000ff 00000000 00000000 fcf27c4c 51054364 a2e8947c 4fe3d72d
+ars4x32 10 00000000 00000000 80000000 00000000 00000000 000000ff 00000000 00000000 d0f8f28a f8816738 3c514ce7 6c34bb66
+ars4x32 10 00000000 00000000 00000000 000000ff 00000000 000000ff 00000000 00000000 fd2c89e4 f10f1080 a4ae9678 a4d6d514
+ars4x32 10 00000000 00000000 00000000 00000080 00000000 000000ff 00000000 00000000 b9947f21 66735588 8fb143dc e7cc086c
+ars4x32 10 00000000 00000000 00000000 0000ff00 00000000 000000ff 00000000 00000000 bc57f7b9 fbdd225d 327ce0ad fa0057f8
+ars4x32 10 00000000 00000000 00000000 00008000 00000000 000000ff 00000000 00000000 d330aa24 d9b8c90c f33a9aea dcce91d0
+ars4x32 10 00000000 00000000 00000000 00ff0000 00000000 000000ff 00000000 00000000 cce8a8bd e6d58698 ff2ef9ed 45c0ec86
+ars4x32 10 00000000 00000000 00000000 00800000 00000000 000000ff 00000000 00000000 1c2a1a5c a03f2a9a 90488834 d9d22878
+ars4x32 10 00000000 00000000 00000000 ff000000 00000000 000000ff 00000000 00000000 f50918b0 1abc837e 63f787ca 4c3d21b0
+ars4x32 10 00000000 00000000 00000000 80000000 00000000 000000ff 00000000 00000000 d3b48412 00431173 fc381c89 92f0d299
+ars4x32 10 886a3f24 d308a385 2e8a1913 44737003 00000000 000000ff 00000000 00000000 59e6ed04 e72dee88 43a0c869 f80b6f82
+ars4x32 10 223809a4 d0319f29 98fa2e08 896c4eec 00000000 000000ff 00000000 00000000 8ba8b541 1e8abc5e 2fb4912b 4d0f6dc1
+ars4x32 10 e6212845 7713d038 cf6654be 6c0ce934 00000000 000000ff 00000000 00000000 8b10b9c9 b977f852 d9bd28bf 12d77e54
+ars4x32 10 00000001 00000000 00000000 00000000 00000000 00000080 00000000 00000000 110d6be7 a16da48b a3f265d0 b0569d26
+ars4x32 10 00000100 00000000 00000000 00000000 00000000 00000080 00000000 00000000 52ca46a7 a18bb1f4 20ea22e7 128f8393
+ars4x32 10 00010000 00000000 00000000 00000000 00000000 00000080 00000000 00000000 8c87ef25 27cba360 f0a8fc01 40c75256
+ars4x32 10 01000000 00000000 00000000 00000000 00000000 00000080 00000000 00000000 5a5b8507 eb4ffb4b 398550d2 48ddd688
+ars4x32 10 00000000 00000001 00000000 00000000 00000000 00000080 00000000 00000000 b33cee09 c18b0735 b1498f38 d5398d27
+ars4x32 10 00000000 00000100 00000000 00000000 00000000 00000080 00000000 00000000 a17c32c1 8c2671c0 b2015ac4 209eabe2
+ars4x32 10 00000000 00010000 00000000 00000000 00000000 00000080 00000000 00000000 688f798b 46fbe8bf 9dee92d7 054dffbd
+ars4x32 10 00000000 01000000 00000000 00000000 00000000 00000080 00000000 00000000 bb8c5b61 041a0b85 c4560614 8c04ec9d
+ars4x32 10 00000000 00000000 00000001 00000000 00000000 00000080 00000000 00000000 213669a9 29989053 7223d88d 000e3388
+ars4x32 10 00000000 00000000 00000100 00000000 00000000 00000080 00000000 00000000 6832e31a 2bb5aa98 94ec72d5 84dabefe
+ars4x32 10 00000000 00000000 00010000 00000000 00000000 00000080 00000000 00000000 aa365f18 72a90916 7b72d26a 94d8b664
+ars4x32 10 00000000 00000000 01000000 00000000 00000000 00000080 00000000 00000000 ad54e76b 62d5fa01 c1d1575d 0b65f816
+ars4x32 10 00000000 00000000 00000000 00000001 00000000 00000080 00000000 00000000 c233074c f26bc2e3 848a0d7f 50133fbb
+ars4x32 10 00000000 00000000 00000000 00000100 00000000 00000080 00000000 00000000 70ebbaf0 4f6e7229 782f099f 2b72b631
+ars4x32 10 00000000 00000000 00000000 00010000 00000000 00000080 00000000 00000000 33a62ae4 7c6eac1e b920fb8a 74f74c1d
+ars4x32 10 00000000 00000000 00000000 01000000 00000000 00000080 00000000 00000000 af0a5b7d 43519cd0 ea3cda2f f740241e
+ars4x32 10 0000ff00 00000000 00000000 00000000 00000000 00000080 00000000 00000000 e47439e6 ba0ebd9a ec544e8f 10895388
+ars4x32 10 00008000 00000000 00000000 00000000 00000000 00000080 00000000 00000000 33f4223d 998b9cee 918cbcd8 bdc679c9
+ars4x32 10 00ff0000 00000000 00000000 00000000 00000000 00000080 00000000 00000000 8e93e529 ae3eec51 464b8779 bf89010e
+ars4x32 10 00800000 00000000 00000000 00000000 00000000 00000080 00000000 00000000 0abcea55 2b8b74d1 eec1f021 3446b5a7
+ars4x32 10 ff000000 00000000 00000000 00000000 00000000 00000080 00000000 00000000 e774b3db e0d8f2cb 684b504b 8ba60f5f
+ars4x32 10 80000000 00000000 00000000 00000000 00000000 00000080 00000000 00000000 3b05baca afc7aaa9 9b3892d1 9abe1d26
+ars4x32 10 00000000 000000ff 00000000 00000000 00000000 00000080 00000000 00000000 2f6c73a2 972ed4cc 41d15bbf bc036df0
+ars4x32 10 00000000 00000080 00000000 00000000 00000000 00000080 00000000 00000000 3f401a57 c43fd94c d3e0d78e 7994b848
+ars4x32 10 00000000 0000ff00 00000000 00000000 00000000 00000080 00000000 00000000 1bbc1c53 2bb7665a 338c238d ff975267
+ars4x32 10 00000000 00008000 00000000 00000000 00000000 00000080 00000000 00000000 2cdd6893 02156110 1c814ecf 6ec3f330
+ars4x32 10 00000000 00ff0000 00000000 00000000 00000000 00000080 00000000 00000000 4ce62ccd 7f6a5d2e da2c1c9b 1ce2b248
+ars4x32 10 00000000 00800000 00000000 00000000 00000000 00000080 00000000 00000000 220c8cad a5af436f 64e11e9f 391581d9
+ars4x32 10 00000000 ff000000 00000000 00000000 00000000 00000080 00000000 00000000 48b5dabf df94481a 6ed3bcf6 34ad0952
+ars4x32 10 00000000 80000000 00000000 00000000 00000000 00000080 00000000 00000000 9f17100b 3f5315e4 793b6995 11cc7178
+ars4x32 10 00000000 00000000 000000ff 00000000 00000000 00000080 00000000 00000000 2e6da599 a33aa282 a52c8fe8 82d587cc
+ars4x32 10 00000000 00000000 00000080 00000000 00000000 00000080 00000000 00000000 961099d8 a3e1ea0f d1c06f29 3576caf6
+ars4x32 10 00000000 00000000 0000ff00 00000000 00000000 00000080 00000000 00000000 f3f8264a 0f8812fd 72cec900 4d46f983
+ars4x32 10 00000000 00000000 00008000 00000000 00000000 00000080 00000000 00000000 150b661c d645dc30 58cee969 ffc65955
+ars4x32 10 00000000 00000000 00ff0000 00000000 00000000 00000080 00000000 00000000 497d867a 04f9bdc0 01fdb685 b54bff6f
+ars4x32 10 00000000 00000000 00800000 00000000 00000000 00000080 00000000 00000000 7c2e189a 58781269 a87399db 364b24ee
+ars4x32 10 00000000 00000000 ff000000 00000000 00000000 00000080 00000000 00000000 7ec65f86 adc1d28f bb957d72 d9e41689
+ars4x32 10 00000000 00000000 80000000 00000000 00000000 00000080 00000000 00000000 87448d14 3b1715c9 586b3fe5 61b33657
+ars4x32 10 00000000 00000000 00000000 000000ff 00000000 00000080 00000000 00000000 3ca3750f 41213709 b4a9c050 a2802c9d
+ars4x32 10 00000000 00000000 00000000 00000080 00000000 00000080 00000000 00000000 3e7d1880 846ca7a8 5b4d718b ec3c4b4e
+ars4x32 10 00000000 00000000 00000000 0000ff00 00000000 00000080 00000000 00000000 aa65a024 a1f6e3e1 1e50300b 81b2fe34
+ars4x32 10 00000000 00000000 00000000 00008000 00000000 00000080 00000000 00000000 6ea04ddf 68274c2d 00e8fe18 1e72c32a
+ars4x32 10 00000000 00000000 00000000 00ff0000 00000000 00000080 00000000 00000000 091763e9 95c787c6 795f2454 7cde8a2b
+ars4x32 10 00000000 00000000 00000000 00800000 00000000 00000080 00000000 00000000 f7eeae5f 4741b188 fce905e1 135baaa7
+ars4x32 10 00000000 00000000 00000000 ff000000 00000000 00000080 00000000 00000000 b1f3bfc9 6cb39ec6 a3c738ea a04985eb
+ars4x32 10 00000000 00000000 00000000 80000000 00000000 00000080 00000000 00000000 590a08dd 916022c4 adc06097 48303077
+ars4x32 10 886a3f24 d308a385 2e8a1913 44737003 00000000 00000080 00000000 00000000 64e7b5b9 33179a7e 4ca06cc0 5d956f58
+ars4x32 10 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000080 00000000 00000000 dd4830eb 1314366c 600a1334 b68aa44f
+ars4x32 10 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000080 00000000 00000000 a99d55a9 7cf8940a a70f0281 d233a206
+ars4x32 10 00000001 00000000 00000000 00000000 00000000 0000ff00 00000000 00000000 2dc6c14a 01f7b3e4 e269700c 8039a0fe
+ars4x32 10 00000100 00000000 00000000 00000000 00000000 0000ff00 00000000 00000000 cf32bd13 c75e8c63 337a5b1c 8b874719
+ars4x32 10 00010000 00000000 00000000 00000000 00000000 0000ff00 00000000 00000000 bd30d45c 846cf3e2 0f784607 5180e999
+ars4x32 10 01000000 00000000 00000000 00000000 00000000 0000ff00 00000000 00000000 24c4748b 5ff9410b 1638e715 317f5646
+ars4x32 10 00000000 00000001 00000000 00000000 00000000 0000ff00 00000000 00000000 fa857c4e f695a8fa ba5a3fa2 f6231137
+ars4x32 10 00000000 00000100 00000000 00000000 00000000 0000ff00 00000000 00000000 e9ffd90d 50b3ab34 f829bd63 9df6a93d
+ars4x32 10 00000000 00010000 00000000 00000000 00000000 0000ff00 00000000 00000000 fda8b1ac 2efbcda8 9f4d4ed0 f39d01c2
+ars4x32 10 00000000 01000000 00000000 00000000 00000000 0000ff00 00000000 00000000 3f4e231d 9e776fa6 32c5e943 06362122
+ars4x32 10 00000000 00000000 00000001 00000000 00000000 0000ff00 00000000 00000000 bb71ca48 14cf1dd1 84cc6c3d 0a99871f
+ars4x32 10 00000000 00000000 00000100 00000000 00000000 0000ff00 00000000 00000000 cfb0ef9a a2df536a b732ae38 1823beab
+ars4x32 10 00000000 00000000 00010000 00000000 00000000 0000ff00 00000000 00000000 e2e28037 172a132b 6e060aa8 2fc0c9e3
+ars4x32 10 00000000 00000000 01000000 00000000 00000000 0000ff00 00000000 00000000 f0981cf0 88e1084e 4c41f8c0 74505114
+ars4x32 10 00000000 00000000 00000000 00000001 00000000 0000ff00 00000000 00000000 9b618c4c d158e039 45ddb8c4 4b0fdf24
+ars4x32 10 00000000 00000000 00000000 00000100 00000000 0000ff00 00000000 00000000 52ac216a 053b9443 2b9c9b4a a5fb6faa
+ars4x32 10 00000000 00000000 00000000 00010000 00000000 0000ff00 00000000 00000000 bee39c93 93b0301a 8910637e 23c3611c
+ars4x32 10 00000000 00000000 00000000 01000000 00000000 0000ff00 00000000 00000000 650c2e58 7fd8bcf2 b846d4cb 5c5c5896
+ars4x32 10 0000ff00 00000000 00000000 00000000 00000000 0000ff00 00000000 00000000 27f00b01 e912ea67 025dbccf 216e777f
+ars4x32 10 00008000 00000000 00000000 00000000 00000000 0000ff00 00000000 00000000 95188c09 e7abd1db f318be66 d1165daf
+ars4x32 10 00ff0000 00000000 00000000 00000000 00000000 0000ff00 00000000 00000000 faa73165 0abe4f13 ec553c37 448f1e74
+ars4x32 10 00800000 00000000 00000000 00000000 00000000 0000ff00 00000000 00000000 d32c5d3b 0af1158c 2bc4a9f8 ee58b025
+ars4x32 10 ff000000 00000000 00000000 00000000 00000000 0000ff00 00000000 00000000 482b2f4f 77e2bd55 29e72d52 a7d60f91
+ars4x32 10 80000000 00000000 00000000 00000000 00000000 0000ff00 00000000 00000000 fa179af1 9a4fb273 da522d39 f1dc01a7
+ars4x32 10 00000000 000000ff 00000000 00000000 00000000 0000ff00 00000000 00000000 a3fed363 4fc44ec9 a06b8195 38126587
+ars4x32 10 00000000 00000080 00000000 00000000 00000000 0000ff00 00000000 00000000 01cf1c5d a676e82d bfcba095 5b90a259
+ars4x32 10 00000000 0000ff00 00000000 00000000 00000000 0000ff00 00000000 00000000 aeb20d4c ea634ae9 1b8be6b3 6df7b85d
+ars4x32 10 00000000 00008000 00000000 00000000 00000000 0000ff00 00000000 00000000 afa063b7 8902017c dd482f4e 59a11ca9
+ars4x32 10 00000000 00ff0000 00000000 00000000 00000000 0000ff00 00000000 00000000 96f72228 034dacbf 8bee6910 b56b2d20
+ars4x32 10 00000000 00800000 00000000 00000000 00000000 0000ff00 00000000 00000000 80c2cc73 1f725523 61f67069 17059dfd
+ars4x32 10 00000000 ff000000 00000000 00000000 00000000 0000ff00 00000000 00000000 8a19cd22 d8e8238c a1159618 cf0e9fe9
+ars4x32 10 00000000 80000000 00000000 00000000 00000000 0000ff00 00000000 00000000 a0be8a6c 1290d8e5 ccba2020 258bd01f
+ars4x32 10 00000000 00000000 000000ff 00000000 00000000 0000ff00 00000000 00000000 c28cf28c 6d2d75ae b6aec62d b6fa4e89
+ars4x32 10 00000000 00000000 00000080 00000000 00000000 0000ff00 00000000 00000000 d065ba13 013ae0ff e9c4c8c8 c52e46cf
+ars4x32 10 00000000 00000000 0000ff00 00000000 00000000 0000ff00 00000000 00000000 be88f8ac b839f2f3 f3af303c 63895958
+ars4x32 10 00000000 00000000 00008000 00000000 00000000 0000ff00 00000000 00000000 4fd07277 958637fc 6a3b8e1d a3b8dcb2
+ars4x32 10 00000000 00000000 00ff0000 00000000 00000000 0000ff00 00000000 00000000 6a829f35 7fb7d017 371bb7ff 4adfa760
+ars4x32 10 00000000 00000000 00800000 00000000 00000000 0000ff00 00000000 00000000 67018fc1 0e251c19 6223f775 1eb72c0e
+ars4x32 10 00000000 00000000 ff000000 00000000 00000000 0000ff00 00000000 00000000 d460bcde da2c1ea7 4e6158f8 0dcca4a8
+ars4x32 10 00000000 00000000 80000000 00000000 00000000 0000ff00 00000000 00000000 4a97d4c6 ce1fad90 29297407 ad396e77
+ars4x32 10 00000000 00000000 00000000 000000ff 00000000 0000ff00 00000000 00000000 d4f4091c a3c2580f 8e58289a 0075b40e
+ars4x32 10 00000000 00000000 00000000 00000080 00000000 0000ff00 00000000 00000000 234a4361 27a4a0b9 af6ccd19 28133313
+ars4x32 10 00000000 00000000 00000000 0000ff00 00000000 0000ff00 00000000 00000000 eba3fbea c112d76a 4d32c5e6 9a8e9651
+ars4x32 10 00000000 00000000 00000000 00008000 00000000 0000ff00 00000000 00000000 45e5faa9 c2277e0a a73963b9 8a75f7e8
+ars4x32 10 00000000 00000000 00000000 00ff0000 00000000 0000ff00 00000000 00000000 1bab678d 9901717a 60d037ec aeddc874
+ars4x32 10 00000000 00000000 00000000 00800000 00000000 0000ff00 00000000 00000000 fa19c967 6830b351 347d854e c4b9f813
+ars4x32 10 00000000 00000000 00000000 ff000000 00000000 0000ff00 00000000 00000000 7ba2449d 32520ac1 d9d16688 0add41f0
+ars4x32 10 00000000 00000000 00000000 80000000 00000000 0000ff00 00000000 00000000 a33f8984 e8d72811 711888e1 f5fbe028
+ars4x32 10 886a3f24 d308a385 2e8a1913 44737003 00000000 0000ff00 00000000 00000000 cb545f23 5ca091cc 08a6a333 4a2921e1
+ars4x32 10 223809a4 d0319f29 98fa2e08 896c4eec 00000000 0000ff00 00000000 00000000 2307f427 f289a5c6 396b854e c89338d7
+ars4x32 10 e6212845 7713d038 cf6654be 6c0ce934 00000000 0000ff00 00000000 00000000 aaf76d9a 28743c55 708931a0 b700e2cb
+ars4x32 10 00000001 00000000 00000000 00000000 00000000 00008000 00000000 00000000 11b2c798 52af64ac 5e86f95a add1345d
+ars4x32 10 00000100 00000000 00000000 00000000 00000000 00008000 00000000 00000000 89ef1d94 7516434d 8b76d4f5 51bb21d9
+ars4x32 10 00010000 00000000 00000000 00000000 00000000 00008000 00000000 00000000 b8344e5d 861a5367 85e0d288 d52a6203
+ars4x32 10 01000000 00000000 00000000 00000000 00000000 00008000 00000000 00000000 1e234bac 544cb733 74336b9a 34b1db37
+ars4x32 10 00000000 00000001 00000000 00000000 00000000 00008000 00000000 00000000 c0babd76 90c70187 1688183d 457dba82
+ars4x32 10 00000000 00000100 00000000 00000000 00000000 00008000 00000000 00000000 b58786b8 09807b2f c6886e95 d9fffcf5
+ars4x32 10 00000000 00010000 00000000 00000000 00000000 00008000 00000000 00000000 fdb0253b 138d16ba 4e9fef71 99813f71
+ars4x32 10 00000000 01000000 00000000 00000000 00000000 00008000 00000000 00000000 c39a5f5a 90c42202 e41ce57e 25d838f5
+ars4x32 10 00000000 00000000 00000001 00000000 00000000 00008000 00000000 00000000 bf7138c2 2db613f3 979e46d2 15b04dbe
+ars4x32 10 00000000 00000000 00000100 00000000 00000000 00008000 00000000 00000000 37dbe9ae fb1acad6 6d44734c 3169b3f7
+ars4x32 10 00000000 00000000 00010000 00000000 00000000 00008000 00000000 00000000 efb0b715 8ea1b1d7 30607b3a 6cbfa6e6
+ars4x32 10 00000000 00000000 01000000 00000000 00000000 00008000 00000000 00000000 b9943661 5b9b8b69 09758f3f 53b808e7
+ars4x32 10 00000000 00000000 00000000 00000001 00000000 00008000 00000000 00000000 f3770661 9d9b9d0c 5484af6b aa8d4ae6
+ars4x32 10 00000000 00000000 00000000 00000100 00000000 00008000 00000000 00000000 10aeb57b bed162e9 61e1ec21 875c02ba
+ars4x32 10 00000000 00000000 00000000 00010000 00000000 00008000 00000000 00000000 7eb11039 8be0d22b 973f2195 339f4e7d
+ars4x32 10 00000000 00000000 00000000 01000000 00000000 00008000 00000000 00000000 bf9e158c f594dea2 163f71b5 cf4625ab
+ars4x32 10 0000ff00 00000000 00000000 00000000 00000000 00008000 00000000 00000000 c5c9e699 44b05450 220e2be6 b3fbafaa
+ars4x32 10 00008000 00000000 00000000 00000000 00000000 00008000 00000000 00000000 7a702519 770065c5 7da1ac78 42975dfc
+ars4x32 10 00ff0000 00000000 00000000 00000000 00000000 00008000 00000000 00000000 e45e79b9 c1d70b6b e58d50da e25b8a3a
+ars4x32 10 00800000 00000000 00000000 00000000 00000000 00008000 00000000 00000000 bb8017f6 c2dcd9ca 438b0414 da0afe0e
+ars4x32 10 ff000000 00000000 00000000 00000000 00000000 00008000 00000000 00000000 001d26fb e5cd3e68 2eb855d5 cede37aa
+ars4x32 10 80000000 00000000 00000000 00000000 00000000 00008000 00000000 00000000 26caf5a6 c643f329 e8607db7 d9c43796
+ars4x32 10 00000000 000000ff 00000000 00000000 00000000 00008000 00000000 00000000 4f70d0bb cb90e2e1 deae178a a69ff4ca
+ars4x32 10 00000000 00000080 00000000 00000000 00000000 00008000 00000000 00000000 04e23895 30380ec2 ecc92d37 e56ff7ff
+ars4x32 10 00000000 0000ff00 00000000 00000000 00000000 00008000 00000000 00000000 384cd0f8 f6fb584d 34653a8a 233ccfbd
+ars4x32 10 00000000 00008000 00000000 00000000 00000000 00008000 00000000 00000000 0b8bf352 9216ef4f 671c47f0 40d679ed
+ars4x32 10 00000000 00ff0000 00000000 00000000 00000000 00008000 00000000 00000000 384b01f1 cf053f61 0ee822fc d0eb61a0
+ars4x32 10 00000000 00800000 00000000 00000000 00000000 00008000 00000000 00000000 a73319dd d1dca02f 849e2935 362de084
+ars4x32 10 00000000 ff000000 00000000 00000000 00000000 00008000 00000000 00000000 126fe0b7 14eccfee 3dd0d096 0cc3db10
+ars4x32 10 00000000 80000000 00000000 00000000 00000000 00008000 00000000 00000000 c19242ba 0ff36b65 5bdd3942 75c188a2
+ars4x32 10 00000000 00000000 000000ff 00000000 00000000 00008000 00000000 00000000 62024504 6cd94d16 bd1dba48 21bda41b
+ars4x32 10 00000000 00000000 00000080 00000000 00000000 00008000 00000000 00000000 f3833739 6d37801f 73b528bb fcb1ddc9
+ars4x32 10 00000000 00000000 0000ff00 00000000 00000000 00008000 00000000 00000000 90f44c11 9b3cd3e3 4df59a4c f8fbe502
+ars4x32 10 00000000 00000000 00008000 00000000 00000000 00008000 00000000 00000000 db6477d1 e733e1ed b8aab516 5cc31604
+ars4x32 10 00000000 00000000 00ff0000 00000000 00000000 00008000 00000000 00000000 903253e6 055dc1c5 eaea3cc4 7a424462
+ars4x32 10 00000000 00000000 00800000 00000000 00000000 00008000 00000000 00000000 547f2be9 3242aee5 b9a90db3 9a29a381
+ars4x32 10 00000000 00000000 ff000000 00000000 00000000 00008000 00000000 00000000 daef34c4 45aed485 41ca2065 db079e0c
+ars4x32 10 00000000 00000000 80000000 00000000 00000000 00008000 00000000 00000000 4e1631d6 5c7b4cf3 73a62ac9 741a6062
+ars4x32 10 00000000 00000000 00000000 000000ff 00000000 00008000 00000000 00000000 13bb6593 dcba39fe 373f2594 4fdadf7e
+ars4x32 10 00000000 00000000 00000000 00000080 00000000 00008000 00000000 00000000 e2aa5355 6565f485 e856d8b6 1d7adba8
+ars4x32 10 00000000 00000000 00000000 0000ff00 00000000 00008000 00000000 00000000 093b963e 4f1add3c 1901fe1b 368971d9
+ars4x32 10 00000000 00000000 00000000 00008000 00000000 00008000 00000000 00000000 04214948 1dfe8a9e 840c1e7d d34065ba
+ars4x32 10 00000000 00000000 00000000 00ff0000 00000000 00008000 00000000 00000000 d587f9f9 16e41aba 3081e5ae 3f13668d
+ars4x32 10 00000000 00000000 00000000 00800000 00000000 00008000 00000000 00000000 d359dc0d 04af3b91 af74a3ed 87abd08a
+ars4x32 10 00000000 00000000 00000000 ff000000 00000000 00008000 00000000 00000000 183c4d47 496bda9c 2733d10b cea402e3
+ars4x32 10 00000000 00000000 00000000 80000000 00000000 00008000 00000000 00000000 314c5626 49d1dee8 5d50e64f fda22ca1
+ars4x32 10 886a3f24 d308a385 2e8a1913 44737003 00000000 00008000 00000000 00000000 d407159d ad5b77e9 6c1f5f7c 35e4de8e
+ars4x32 10 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00008000 00000000 00000000 699f5f9d 9fa89518 c13cdb55 4d965dc1
+ars4x32 10 e6212845 7713d038 cf6654be 6c0ce934 00000000 00008000 00000000 00000000 7b10eb91 66941760 e17ccee9 0cb270ca
+ars4x32 10 00000001 00000000 00000000 00000000 00000000 00ff0000 00000000 00000000 8b271a26 3cded4fd cb377902 7f99f502
+ars4x32 10 00000100 00000000 00000000 00000000 00000000 00ff0000 00000000 00000000 792d2c87 5be9b0d5 f50624e0 620eddef
+ars4x32 10 00010000 00000000 00000000 00000000 00000000 00ff0000 00000000 00000000 cb87c293 5ef3b0ac 4a0b069a fa524a9c
+ars4x32 10 01000000 00000000 00000000 00000000 00000000 00ff0000 00000000 00000000 73af0176 f2d557b5 f6cb2d33 0910883d
+ars4x32 10 00000000 00000001 00000000 00000000 00000000 00ff0000 00000000 00000000 a95baffc 8692d41d 45e878b2 5a37e6ec
+ars4x32 10 00000000 00000100 00000000 00000000 00000000 00ff0000 00000000 00000000 58ad47c0 9ea46109 aa939c1d f1070142
+ars4x32 10 00000000 00010000 00000000 00000000 00000000 00ff0000 00000000 00000000 fe9eec24 d63ae788 42cb27a1 2a4809ac
+ars4x32 10 00000000 01000000 00000000 00000000 00000000 00ff0000 00000000 00000000 e1d90779 d0cf9e8e 2d18a333 93524d17
+ars4x32 10 00000000 00000000 00000001 00000000 00000000 00ff0000 00000000 00000000 b0d45209 bb6959ea 981747e1 43f39533
+ars4x32 10 00000000 00000000 00000100 00000000 00000000 00ff0000 00000000 00000000 54ed87ce 97c97497 2ab91c56 c619b886
+ars4x32 10 00000000 00000000 00010000 00000000 00000000 00ff0000 00000000 00000000 d03ca0a5 1e7da6e8 e6f15ee7 f595e3e9
+ars4x32 10 00000000 00000000 01000000 00000000 00000000 00ff0000 00000000 00000000 a69eddec a62433ad 00a9b200 f12e415f
+ars4x32 10 00000000 00000000 00000000 00000001 00000000 00ff0000 00000000 00000000 f41434d3 322159d1 f6877d95 8c5beada
+ars4x32 10 00000000 00000000 00000000 00000100 00000000 00ff0000 00000000 00000000 499f4f32 9fc76c64 bea7af15 11fb6c62
+ars4x32 10 00000000 00000000 00000000 00010000 00000000 00ff0000 00000000 00000000 d7602848 995411e1 ff54159c 4d1f597f
+ars4x32 10 00000000 00000000 00000000 01000000 00000000 00ff0000 00000000 00000000 4fcb1a1a 68d49cb9 0b816bf9 8ab2995a
+ars4x32 10 0000ff00 00000000 00000000 00000000 00000000 00ff0000 00000000 00000000 92b3435b 68231e7f 34d0496d 835a905e
+ars4x32 10 00008000 00000000 00000000 00000000 00000000 00ff0000 00000000 00000000 6e257524 3131909f 14c26282 f39bb71c
+ars4x32 10 00ff0000 00000000 00000000 00000000 00000000 00ff0000 00000000 00000000 e2ea1171 5bce8a8d 9dc3143a 7f73794b
+ars4x32 10 00800000 00000000 00000000 00000000 00000000 00ff0000 00000000 00000000 3bc194f4 7f08a721 90d50d8c 8c4d558d
+ars4x32 10 ff000000 00000000 00000000 00000000 00000000 00ff0000 00000000 00000000 4274cbd9 5f814654 d63ae4b6 991a1bb2
+ars4x32 10 80000000 00000000 00000000 00000000 00000000 00ff0000 00000000 00000000 73f15782 8ee7bbd4 b2698492 3d28ce62
+ars4x32 10 00000000 000000ff 00000000 00000000 00000000 00ff0000 00000000 00000000 60ee2bc1 df5d201b cb3f1ce6 01174504
+ars4x32 10 00000000 00000080 00000000 00000000 00000000 00ff0000 00000000 00000000 de375b32 20f72567 d341c3bc 96fb7b71
+ars4x32 10 00000000 0000ff00 00000000 00000000 00000000 00ff0000 00000000 00000000 2b9f1dc7 28521207 662164d9 814fb941
+ars4x32 10 00000000 00008000 00000000 00000000 00000000 00ff0000 00000000 00000000 9a46ea69 93255817 9462f4ca a1e7a299
+ars4x32 10 00000000 00ff0000 00000000 00000000 00000000 00ff0000 00000000 00000000 aca5f032 54df27d4 90e4397f a25907b4
+ars4x32 10 00000000 00800000 00000000 00000000 00000000 00ff0000 00000000 00000000 437b6f99 61aa8c4d 53d08872 1f945ba7
+ars4x32 10 00000000 ff000000 00000000 00000000 00000000 00ff0000 00000000 00000000 9fff0f99 1e866f3e 4bb9588b 65e8a528
+ars4x32 10 00000000 80000000 00000000 00000000 00000000 00ff0000 00000000 00000000 1f4c2477 506b421f 76562a09 4b19fb3f
+ars4x32 10 00000000 00000000 000000ff 00000000 00000000 00ff0000 00000000 00000000 4d7d6752 85f4d2e6 5ea98a87 a9932a8b
+ars4x32 10 00000000 00000000 00000080 00000000 00000000 00ff0000 00000000 00000000 a1e478bc 62bbb1c1 f31f526a f707e9d8
+ars4x32 10 00000000 00000000 0000ff00 00000000 00000000 00ff0000 00000000 00000000 a2e8713b 9fd9843c 35f213da 69535ab7
+ars4x32 10 00000000 00000000 00008000 00000000 00000000 00ff0000 00000000 00000000 f6e3e374 c4182263 185a28ec 3fb22ed7
+ars4x32 10 00000000 00000000 00ff0000 00000000 00000000 00ff0000 00000000 00000000 1ab188cc 3c24b734 8b7fdfa6 34651748
+ars4x32 10 00000000 00000000 00800000 00000000 00000000 00ff0000 00000000 00000000 b73485bb f616a467 b941b4f8 ba301c08
+ars4x32 10 00000000 00000000 ff000000 00000000 00000000 00ff0000 00000000 00000000 5fc90eb0 38749554 9ad52075 be7e9fd3
+ars4x32 10 00000000 00000000 80000000 00000000 00000000 00ff0000 00000000 00000000 6e82d5f4 44b9bfb9 68d69727 0f1af38f
+ars4x32 10 00000000 00000000 00000000 000000ff 00000000 00ff0000 00000000 00000000 26a5309e 92459c89 13e8246a 8a1debce
+ars4x32 10 00000000 00000000 00000000 00000080 00000000 00ff0000 00000000 00000000 9f30a96d 8fb8d407 bd1ae374 fc6a2e7c
+ars4x32 10 00000000 00000000 00000000 0000ff00 00000000 00ff0000 00000000 00000000 8d886bcb 2dfd8d6d b9821758 dc461d09
+ars4x32 10 00000000 00000000 00000000 00008000 00000000 00ff0000 00000000 00000000 f695ecbc 86558726 aea04b27 47007ed8
+ars4x32 10 00000000 00000000 00000000 00ff0000 00000000 00ff0000 00000000 00000000 b95435b3 ea82ec28 8c211929 10117636
+ars4x32 10 00000000 00000000 00000000 00800000 00000000 00ff0000 00000000 00000000 537efb9f b4bb37d9 11b135be 59cb6b94
+ars4x32 10 00000000 00000000 00000000 ff000000 00000000 00ff0000 00000000 00000000 f13bf67e a9633301 bfe65b6f 3ecb9167
+ars4x32 10 00000000 00000000 00000000 80000000 00000000 00ff0000 00000000 00000000 6b0a6693 db1fc14f fb49596d 7dbc3ca4
+ars4x32 10 886a3f24 d308a385 2e8a1913 44737003 00000000 00ff0000 00000000 00000000 b99ff4bb 8b706e5b 33e937b1 c89eb4f3
+ars4x32 10 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00ff0000 00000000 00000000 0c5f68b3 e13e35d2 97b3e761 1d05ec2c
+ars4x32 10 e6212845 7713d038 cf6654be 6c0ce934 00000000 00ff0000 00000000 00000000 fa437e41 baa6d495 31e4651b 065a40bc
+ars4x32 10 00000001 00000000 00000000 00000000 00000000 00800000 00000000 00000000 a9614f77 e878adfc d1644771 bb7e1f0f
+ars4x32 10 00000100 00000000 00000000 00000000 00000000 00800000 00000000 00000000 51c98f25 4dfb61b1 72070d1b 2b4bce7b
+ars4x32 10 00010000 00000000 00000000 00000000 00000000 00800000 00000000 00000000 a6dcee11 fd2c4c13 35b3c08e a74ee6f3
+ars4x32 10 01000000 00000000 00000000 00000000 00000000 00800000 00000000 00000000 ea476d7f af214625 ad771422 28c1ba87
+ars4x32 10 00000000 00000001 00000000 00000000 00000000 00800000 00000000 00000000 d844d6cc a557cf23 3df42836 978a7ef0
+ars4x32 10 00000000 00000100 00000000 00000000 00000000 00800000 00000000 00000000 c2a296d8 9b211cd1 02e4c488 2d2f36fd
+ars4x32 10 00000000 00010000 00000000 00000000 00000000 00800000 00000000 00000000 8ac56a48 dc10e356 42515a3f 7a8c383f
+ars4x32 10 00000000 01000000 00000000 00000000 00000000 00800000 00000000 00000000 d8a88471 4823d9b8 3cde01cc 54187f20
+ars4x32 10 00000000 00000000 00000001 00000000 00000000 00800000 00000000 00000000 77dde11a 0f88c85f eb5e4013 051f7868
+ars4x32 10 00000000 00000000 00000100 00000000 00000000 00800000 00000000 00000000 65798694 72d38e68 bbc713fd cb3c43dd
+ars4x32 10 00000000 00000000 00010000 00000000 00000000 00800000 00000000 00000000 86b0f28e 68bafab0 fdac32b9 83f28341
+ars4x32 10 00000000 00000000 01000000 00000000 00000000 00800000 00000000 00000000 3af3ac1e a60e19c1 91532c03 482276ae
+ars4x32 10 00000000 00000000 00000000 00000001 00000000 00800000 00000000 00000000 f3a77866 84a6ac92 50873f5b bea502e7
+ars4x32 10 00000000 00000000 00000000 00000100 00000000 00800000 00000000 00000000 c3ff6aca b19189cd 41e7fd41 1f8019ab
+ars4x32 10 00000000 00000000 00000000 00010000 00000000 00800000 00000000 00000000 84cf9d48 8d6a83a1 3f3b1cb0 68da841b
+ars4x32 10 00000000 00000000 00000000 01000000 00000000 00800000 00000000 00000000 06042f2c b5c52213 9b0f3804 ba68d96d
+ars4x32 10 0000ff00 00000000 00000000 00000000 00000000 00800000 00000000 00000000 c864f8e8 9f323c3d ccb036d2 1fc4944f
+ars4x32 10 00008000 00000000 00000000 00000000 00000000 00800000 00000000 00000000 7127d03b b6cf6400 87b36419 24dd6bbe
+ars4x32 10 00ff0000 00000000 00000000 00000000 00000000 00800000 00000000 00000000 c75b4203 ff4b9dbc 411a33e7 6657b609
+ars4x32 10 00800000 00000000 00000000 00000000 00000000 00800000 00000000 00000000 72f5ea73 c633bba0 da9d45fb d8118c29
+ars4x32 10 ff000000 00000000 00000000 00000000 00000000 00800000 00000000 00000000 40bac872 417af0e8 18491dda d6c616f5
+ars4x32 10 80000000 00000000 00000000 00000000 00000000 00800000 00000000 00000000 c919dc63 1328fdc9 21353f9c 5cdf89e6
+ars4x32 10 00000000 000000ff 00000000 00000000 00000000 00800000 00000000 00000000 c1fabb73 39e038ac 98726be3 88ffb110
+ars4x32 10 00000000 00000080 00000000 00000000 00000000 00800000 00000000 00000000 4fe2ea59 757d88c1 fd1bd554 291f1d12
+ars4x32 10 00000000 0000ff00 00000000 00000000 00000000 00800000 00000000 00000000 6625392c bd116176 393d082e 1c65e979
+ars4x32 10 00000000 00008000 00000000 00000000 00000000 00800000 00000000 00000000 de7824ee 41930dbf 0297daf7 b5b44e94
+ars4x32 10 00000000 00ff0000 00000000 00000000 00000000 00800000 00000000 00000000 6d8582de efb21c49 06bdf0cf 1ef8ed63
+ars4x32 10 00000000 00800000 00000000 00000000 00000000 00800000 00000000 00000000 95e325a9 c9452803 1b92d70a 36290e55
+ars4x32 10 00000000 ff000000 00000000 00000000 00000000 00800000 00000000 00000000 b40e1c7f 51359e8a c545965c 4f94d4bb
+ars4x32 10 00000000 80000000 00000000 00000000 00000000 00800000 00000000 00000000 0d156b55 447f4959 0f62f99e 87c94668
+ars4x32 10 00000000 00000000 000000ff 00000000 00000000 00800000 00000000 00000000 7031d465 15587368 4c2efc4b 7e9a28fd
+ars4x32 10 00000000 00000000 00000080 00000000 00000000 00800000 00000000 00000000 ebfe358d 0d8cf82a ac6b7fef 3f690b9c
+ars4x32 10 00000000 00000000 0000ff00 00000000 00000000 00800000 00000000 00000000 951be3d0 919ee902 0ab9ed0f 32308e60
+ars4x32 10 00000000 00000000 00008000 00000000 00000000 00800000 00000000 00000000 0bbe6a6f 56b38c2a 36a4517d d19eb168
+ars4x32 10 00000000 00000000 00ff0000 00000000 00000000 00800000 00000000 00000000 76b0a5b9 166ef9de 3c20e1c9 f32192b0
+ars4x32 10 00000000 00000000 00800000 00000000 00000000 00800000 00000000 00000000 84f90e94 ba62b185 b8a9b3a8 e2ad2df7
+ars4x32 10 00000000 00000000 ff000000 00000000 00000000 00800000 00000000 00000000 0ca1105d 39d85068 f21fd86d e1b17585
+ars4x32 10 00000000 00000000 80000000 00000000 00000000 00800000 00000000 00000000 0a0398e8 de216909 5afb1040 b39b650f
+ars4x32 10 00000000 00000000 00000000 000000ff 00000000 00800000 00000000 00000000 e3a13c42 d7980183 c885a470 385b36f1
+ars4x32 10 00000000 00000000 00000000 00000080 00000000 00800000 00000000 00000000 f7bc487f ab0e715f af9319bc abd0bc9e
+ars4x32 10 00000000 00000000 00000000 0000ff00 00000000 00800000 00000000 00000000 7917a5e2 3a2c501e e65446be 39701909
+ars4x32 10 00000000 00000000 00000000 00008000 00000000 00800000 00000000 00000000 082ca32d 5f7316a6 724c27f8 14a1186a
+ars4x32 10 00000000 00000000 00000000 00ff0000 00000000 00800000 00000000 00000000 67f5ae30 4e872d21 3b7ee342 2678784d
+ars4x32 10 00000000 00000000 00000000 00800000 00000000 00800000 00000000 00000000 facba4fa ca4ab7ec 5404231f 490e3bac
+ars4x32 10 00000000 00000000 00000000 ff000000 00000000 00800000 00000000 00000000 d49a718f 8017f588 d2493f0c b711a6d6
+ars4x32 10 00000000 00000000 00000000 80000000 00000000 00800000 00000000 00000000 3720a7ab bab9748e 9716bb16 81c698b5
+ars4x32 10 886a3f24 d308a385 2e8a1913 44737003 00000000 00800000 00000000 00000000 ab3cabe1 89b3bb6a 688f9d93 04122cca
+ars4x32 10 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00800000 00000000 00000000 e673f8a9 1a1349ea 1bce935c 129c5a05
+ars4x32 10 e6212845 7713d038 cf6654be 6c0ce934 00000000 00800000 00000000 00000000 3218b830 3acfac5b 8e1f2094 cdafe481
+ars4x32 10 00000001 00000000 00000000 00000000 00000000 ff000000 00000000 00000000 a0f9adc0 50a0a405 0792e60b d250490e
+ars4x32 10 00000100 00000000 00000000 00000000 00000000 ff000000 00000000 00000000 710201b7 f4fad272 4a0f4d05 13bfce15
+ars4x32 10 00010000 00000000 00000000 00000000 00000000 ff000000 00000000 00000000 ba8fe932 b074d0a1 5a22c96a f5177348
+ars4x32 10 01000000 00000000 00000000 00000000 00000000 ff000000 00000000 00000000 80aa7b57 ebb4e0ec ed281947 7e20fbae
+ars4x32 10 00000000 00000001 00000000 00000000 00000000 ff000000 00000000 00000000 24c99b1f 28c1fefd 9b09c683 268f3683
+ars4x32 10 00000000 00000100 00000000 00000000 00000000 ff000000 00000000 00000000 2937c5fb 75f9242d c218d7b0 e21da5c3
+ars4x32 10 00000000 00010000 00000000 00000000 00000000 ff000000 00000000 00000000 5d9cdbde ffd2ed18 7a29659d 0a8490c1
+ars4x32 10 00000000 01000000 00000000 00000000 00000000 ff000000 00000000 00000000 83a9ccf6 e3e5f3eb 92d33f24 f29d26a9
+ars4x32 10 00000000 00000000 00000001 00000000 00000000 ff000000 00000000 00000000 b9502d2a 9b7e2edb cb7007a3 e3e1bf84
+ars4x32 10 00000000 00000000 00000100 00000000 00000000 ff000000 00000000 00000000 a7ce23fb a1da063b ccbc80c9 f204b7b8
+ars4x32 10 00000000 00000000 00010000 00000000 00000000 ff000000 00000000 00000000 f44fb029 f88edbe5 767663ae 76159c73
+ars4x32 10 00000000 00000000 01000000 00000000 00000000 ff000000 00000000 00000000 88b1e3c5 ac6bf6d4 9b8ede00 1d50be01
+ars4x32 10 00000000 00000000 00000000 00000001 00000000 ff000000 00000000 00000000 a06872b0 2115765f 71e5f5b0 06c72b76
+ars4x32 10 00000000 00000000 00000000 00000100 00000000 ff000000 00000000 00000000 fb5d18df 8769ff31 e1e17123 72d6d1b7
+ars4x32 10 00000000 00000000 00000000 00010000 00000000 ff000000 00000000 00000000 3932a248 c79313a9 1cc7dff0 d35e3f26
+ars4x32 10 00000000 00000000 00000000 01000000 00000000 ff000000 00000000 00000000 87d2e8e9 994264a9 2c55677c 198990a8
+ars4x32 10 0000ff00 00000000 00000000 00000000 00000000 ff000000 00000000 00000000 53f0b4bf 13c9f83c 640030e8 6096a3ef
+ars4x32 10 00008000 00000000 00000000 00000000 00000000 ff000000 00000000 00000000 69349340 084b9ee1 1847b60a ecf1129b
+ars4x32 10 00ff0000 00000000 00000000 00000000 00000000 ff000000 00000000 00000000 5a979080 ac599f32 82e9f866 dfea36fe
+ars4x32 10 00800000 00000000 00000000 00000000 00000000 ff000000 00000000 00000000 fe136d46 a8948301 8e29eb3e 4ca702df
+ars4x32 10 ff000000 00000000 00000000 00000000 00000000 ff000000 00000000 00000000 fa1eea01 a4d4f372 a2a6abeb e056b959
+ars4x32 10 80000000 00000000 00000000 00000000 00000000 ff000000 00000000 00000000 1c5f9175 40fe7227 a1cc702a 03716ea4
+ars4x32 10 00000000 000000ff 00000000 00000000 00000000 ff000000 00000000 00000000 682d8534 5ba4cd55 b3598b72 debffe0a
+ars4x32 10 00000000 00000080 00000000 00000000 00000000 ff000000 00000000 00000000 e807a95c eb8bf49c 7081ada2 76fa7315
+ars4x32 10 00000000 0000ff00 00000000 00000000 00000000 ff000000 00000000 00000000 a03a73e9 15f9785f 8f2f449a d9951353
+ars4x32 10 00000000 00008000 00000000 00000000 00000000 ff000000 00000000 00000000 9a68b1db a743b0e5 4bd12457 facc0d2a
+ars4x32 10 00000000 00ff0000 00000000 00000000 00000000 ff000000 00000000 00000000 5e491c36 7b79cc5e 030fb10f fd830c30
+ars4x32 10 00000000 00800000 00000000 00000000 00000000 ff000000 00000000 00000000 3a4897b0 dd519314 4770822f 00b8d259
+ars4x32 10 00000000 ff000000 00000000 00000000 00000000 ff000000 00000000 00000000 b675f977 2e1ab2e3 7d185337 d4dc0d49
+ars4x32 10 00000000 80000000 00000000 00000000 00000000 ff000000 00000000 00000000 2e36a555 c3c707e5 ffc6d799 f24d4311
+ars4x32 10 00000000 00000000 000000ff 00000000 00000000 ff000000 00000000 00000000 609b8e18 b6d3fd60 86d71136 bbeae13a
+ars4x32 10 00000000 00000000 00000080 00000000 00000000 ff000000 00000000 00000000 fac5b1be 656786cb 58a1c095 6a46aa21
+ars4x32 10 00000000 00000000 0000ff00 00000000 00000000 ff000000 00000000 00000000 d646323b af4b3751 9bb77dba ef0ca0fb
+ars4x32 10 00000000 00000000 00008000 00000000 00000000 ff000000 00000000 00000000 b9b127ad 2d4dfe40 5aa49be3 ff1b6897
+ars4x32 10 00000000 00000000 00ff0000 00000000 00000000 ff000000 00000000 00000000 45661465 1cf012c0 9497666a 6173081c
+ars4x32 10 00000000 00000000 00800000 00000000 00000000 ff000000 00000000 00000000 9d20cc22 9814ce73 83510e87 b16f59c6
+ars4x32 10 00000000 00000000 ff000000 00000000 00000000 ff000000 00000000 00000000 2959ebf8 44c6d75e 5c7bf4ba bc1ff850
+ars4x32 10 00000000 00000000 80000000 00000000 00000000 ff000000 00000000 00000000 f6192614 5bdc0dfd 9a5f5825 caa993ed
+ars4x32 10 00000000 00000000 00000000 000000ff 00000000 ff000000 00000000 00000000 0aa7844c a3aab8b1 2278de65 22b828ab
+ars4x32 10 00000000 00000000 00000000 00000080 00000000 ff000000 00000000 00000000 7c17e752 b8419c18 fcb21d8e 1ebbb101
+ars4x32 10 00000000 00000000 00000000 0000ff00 00000000 ff000000 00000000 00000000 b1d26e4d dc7af8fe 7895d10f c4eede45
+ars4x32 10 00000000 00000000 00000000 00008000 00000000 ff000000 00000000 00000000 c1410777 2d3248f8 269c2836 2e7cd461
+ars4x32 10 00000000 00000000 00000000 00ff0000 00000000 ff000000 00000000 00000000 5c861f6e 6c4386b1 5f03c53c 377e35fc
+ars4x32 10 00000000 00000000 00000000 00800000 00000000 ff000000 00000000 00000000 d36721d4 9ef3c8d7 311f374e 0048acf5
+ars4x32 10 00000000 00000000 00000000 ff000000 00000000 ff000000 00000000 00000000 04060dcc b0eff4b7 1d1357d8 d953f14f
+ars4x32 10 00000000 00000000 00000000 80000000 00000000 ff000000 00000000 00000000 3da29869 87c1cba7 0a83b037 c2bc2f74
+ars4x32 10 886a3f24 d308a385 2e8a1913 44737003 00000000 ff000000 00000000 00000000 cd2ce71d 484fc862 51f2b487 7d8fb164
+ars4x32 10 223809a4 d0319f29 98fa2e08 896c4eec 00000000 ff000000 00000000 00000000 a8b834d7 97503406 ed40d6b6 a131a359
+ars4x32 10 e6212845 7713d038 cf6654be 6c0ce934 00000000 ff000000 00000000 00000000 a5bd4941 390f6b85 5450dc68 c053a7a1
+ars4x32 10 00000001 00000000 00000000 00000000 00000000 80000000 00000000 00000000 35490912 57d0e7d9 ca875369 3cfd04f0
+ars4x32 10 00000100 00000000 00000000 00000000 00000000 80000000 00000000 00000000 f0bda856 42764679 19fbda68 8172da2f
+ars4x32 10 00010000 00000000 00000000 00000000 00000000 80000000 00000000 00000000 31f324d9 96d79123 5252fdcb f32ecd0e
+ars4x32 10 01000000 00000000 00000000 00000000 00000000 80000000 00000000 00000000 22905cd3 18dd2f62 0e30a1cf 41ede49e
+ars4x32 10 00000000 00000001 00000000 00000000 00000000 80000000 00000000 00000000 942d9e5c 4d5d4e1a 8efa50d7 57f2b95a
+ars4x32 10 00000000 00000100 00000000 00000000 00000000 80000000 00000000 00000000 2ff68685 317f6334 769179f1 769f811e
+ars4x32 10 00000000 00010000 00000000 00000000 00000000 80000000 00000000 00000000 cda3bc71 f45c0efe cf9c8392 f6c63745
+ars4x32 10 00000000 01000000 00000000 00000000 00000000 80000000 00000000 00000000 74cd0365 ef908ab9 cc4d4637 1db9ebd2
+ars4x32 10 00000000 00000000 00000001 00000000 00000000 80000000 00000000 00000000 cd891f47 607c8990 d9b38f3b 44e7cea5
+ars4x32 10 00000000 00000000 00000100 00000000 00000000 80000000 00000000 00000000 4e9ce7a4 88224aa0 699f58de b44e5acf
+ars4x32 10 00000000 00000000 00010000 00000000 00000000 80000000 00000000 00000000 28661024 afadeba7 d0f8222e 81218a10
+ars4x32 10 00000000 00000000 01000000 00000000 00000000 80000000 00000000 00000000 659799ca bafffae3 a6473f39 4dffdcc2
+ars4x32 10 00000000 00000000 00000000 00000001 00000000 80000000 00000000 00000000 8d352b3e e95d257e 2b3add91 4614e45f
+ars4x32 10 00000000 00000000 00000000 00000100 00000000 80000000 00000000 00000000 49ad8464 0aa772a7 52a8ea18 c8eac568
+ars4x32 10 00000000 00000000 00000000 00010000 00000000 80000000 00000000 00000000 f778e9ec d9e60399 e7db0012 8ecc888e
+ars4x32 10 00000000 00000000 00000000 01000000 00000000 80000000 00000000 00000000 f2303c41 733bbc2b fcd5d8e4 73dac3aa
+ars4x32 10 0000ff00 00000000 00000000 00000000 00000000 80000000 00000000 00000000 bf8290cf 4f386e9d 98e26227 4b71c30b
+ars4x32 10 00008000 00000000 00000000 00000000 00000000 80000000 00000000 00000000 99b92605 b5b8407d ce9a264a efc77316
+ars4x32 10 00ff0000 00000000 00000000 00000000 00000000 80000000 00000000 00000000 cea8f1d7 b6bf885b 02fa6423 0cc90195
+ars4x32 10 00800000 00000000 00000000 00000000 00000000 80000000 00000000 00000000 d1d0debb 1e26cda5 234e1eb6 9f053dd5
+ars4x32 10 ff000000 00000000 00000000 00000000 00000000 80000000 00000000 00000000 4ac84af4 9e2bcf7b c92400c7 425abf64
+ars4x32 10 80000000 00000000 00000000 00000000 00000000 80000000 00000000 00000000 63f4d549 0b5b9f93 4f1dcd5a 17d2efe7
+ars4x32 10 00000000 000000ff 00000000 00000000 00000000 80000000 00000000 00000000 55cf4ef9 5cd578ea fd9aeeb8 22aeb44f
+ars4x32 10 00000000 00000080 00000000 00000000 00000000 80000000 00000000 00000000 a369eb36 0ce5a066 359b0d2f 7394e4ce
+ars4x32 10 00000000 0000ff00 00000000 00000000 00000000 80000000 00000000 00000000 8d9ccef5 64949cd7 ff5bdc17 799f01a8
+ars4x32 10 00000000 00008000 00000000 00000000 00000000 80000000 00000000 00000000 0851a190 2f6c3516 06d9b4ad d16e22fa
+ars4x32 10 00000000 00ff0000 00000000 00000000 00000000 80000000 00000000 00000000 5d2bc951 5ef057fe ef7adfd1 3e1020ae
+ars4x32 10 00000000 00800000 00000000 00000000 00000000 80000000 00000000 00000000 a9191c15 4e461234 1f53bfb2 1017eed9
+ars4x32 10 00000000 ff000000 00000000 00000000 00000000 80000000 00000000 00000000 29eb1d58 906ebd03 3884c6a5 a653e529
+ars4x32 10 00000000 80000000 00000000 00000000 00000000 80000000 00000000 00000000 fc52f6ac e2be16cf 1a91efd2 8f2c9ef4
+ars4x32 10 00000000 00000000 000000ff 00000000 00000000 80000000 00000000 00000000 a19f9e8f e02661b2 87f70d0a 270420c8
+ars4x32 10 00000000 00000000 00000080 00000000 00000000 80000000 00000000 00000000 50f7f407 0a83c5d1 ea15a99e de1fc8f2
+ars4x32 10 00000000 00000000 0000ff00 00000000 00000000 80000000 00000000 00000000 abae9972 c9b62db1 d5a35a15 78bf031c
+ars4x32 10 00000000 00000000 00008000 00000000 00000000 80000000 00000000 00000000 ae290b57 22620c16 8c4e3380 8f98f719
+ars4x32 10 00000000 00000000 00ff0000 00000000 00000000 80000000 00000000 00000000 f53616a7 898e1293 5f8a4e1e 6557c24c
+ars4x32 10 00000000 00000000 00800000 00000000 00000000 80000000 00000000 00000000 7203fec5 a32613dc b91c159b ffad3ccb
+ars4x32 10 00000000 00000000 ff000000 00000000 00000000 80000000 00000000 00000000 f108b0e0 3984cf10 0c2759ed a3a43c0d
+ars4x32 10 00000000 00000000 80000000 00000000 00000000 80000000 00000000 00000000 5c6810ea d797869a 6ec81def 9bbc3fbf
+ars4x32 10 00000000 00000000 00000000 000000ff 00000000 80000000 00000000 00000000 8ce8b903 2356b275 84691e6e 8d2efe08
+ars4x32 10 00000000 00000000 00000000 00000080 00000000 80000000 00000000 00000000 26c9b894 ced52c49 b1f1b094 e156101e
+ars4x32 10 00000000 00000000 00000000 0000ff00 00000000 80000000 00000000 00000000 105c7c88 609d2997 81304651 8338a0ca
+ars4x32 10 00000000 00000000 00000000 00008000 00000000 80000000 00000000 00000000 2b093dd5 fca6899f 6b275645 45d06e83
+ars4x32 10 00000000 00000000 00000000 00ff0000 00000000 80000000 00000000 00000000 c7199cdb 1342290b dcb9eb77 1dc71da7
+ars4x32 10 00000000 00000000 00000000 00800000 00000000 80000000 00000000 00000000 7b1b1236 2ce34af7 e02ef933 ea984440
+ars4x32 10 00000000 00000000 00000000 ff000000 00000000 80000000 00000000 00000000 6cb3b476 d12819f6 959504d0 ccc2f276
+ars4x32 10 00000000 00000000 00000000 80000000 00000000 80000000 00000000 00000000 3edff8c0 a6187c02 4a1d2177 cb169a0d
+ars4x32 10 886a3f24 d308a385 2e8a1913 44737003 00000000 80000000 00000000 00000000 f382422b 3d3dc13c 6d45a473 af756ca8
+ars4x32 10 223809a4 d0319f29 98fa2e08 896c4eec 00000000 80000000 00000000 00000000 31d99cd0 d6b7e2d9 1ebcea94 e1a748f7
+ars4x32 10 e6212845 7713d038 cf6654be 6c0ce934 00000000 80000000 00000000 00000000 a4e64916 cd15299d 5e26d12b 48de37f0
+ars4x32 10 00000001 00000000 00000000 00000000 00000000 00000000 000000ff 00000000 9f5d80d4 794a5486 29019ab6 472dc4b2
+ars4x32 10 00000100 00000000 00000000 00000000 00000000 00000000 000000ff 00000000 4ea72aa2 24ace57c 65343fe2 6141fd36
+ars4x32 10 00010000 00000000 00000000 00000000 00000000 00000000 000000ff 00000000 9f2ff8a9 7c05765c 452bc993 56084006
+ars4x32 10 01000000 00000000 00000000 00000000 00000000 00000000 000000ff 00000000 45aaeca8 27b057aa 2dc113b2 3702518c
+ars4x32 10 00000000 00000001 00000000 00000000 00000000 00000000 000000ff 00000000 66e88052 7dc51f2e 9c389d67 1183e665
+ars4x32 10 00000000 00000100 00000000 00000000 00000000 00000000 000000ff 00000000 be2afa22 a59d5538 b472a507 29dfae20
+ars4x32 10 00000000 00010000 00000000 00000000 00000000 00000000 000000ff 00000000 a8e52eb3 142aa6f6 15539351 b2712232
+ars4x32 10 00000000 01000000 00000000 00000000 00000000 00000000 000000ff 00000000 c06bec00 a6ceb148 e5f5fa07 63d33156
+ars4x32 10 00000000 00000000 00000001 00000000 00000000 00000000 000000ff 00000000 9ce5471a 1b3a598e 147d0066 d43b3db6
+ars4x32 10 00000000 00000000 00000100 00000000 00000000 00000000 000000ff 00000000 ddda7a40 55624a27 ff7f26a6 e9d75f26
+ars4x32 10 00000000 00000000 00010000 00000000 00000000 00000000 000000ff 00000000 c436bd96 912fa0a4 60c27280 1cdcfda9
+ars4x32 10 00000000 00000000 01000000 00000000 00000000 00000000 000000ff 00000000 c04e5b29 51991d05 ada54c6a cc68206a
+ars4x32 10 00000000 00000000 00000000 00000001 00000000 00000000 000000ff 00000000 978b5998 d111a2be 502869aa 05f16b73
+ars4x32 10 00000000 00000000 00000000 00000100 00000000 00000000 000000ff 00000000 0de53a91 0aa5a806 085092d5 1105944d
+ars4x32 10 00000000 00000000 00000000 00010000 00000000 00000000 000000ff 00000000 09cb6199 f40eb188 1c0b8c0e b6185e6f
+ars4x32 10 00000000 00000000 00000000 01000000 00000000 00000000 000000ff 00000000 8bb1801f 28cbb5eb 942bb8ed 712f8a30
+ars4x32 10 0000ff00 00000000 00000000 00000000 00000000 00000000 000000ff 00000000 d5860ee1 1fffabfc 739c6d0f 652fe6f2
+ars4x32 10 00008000 00000000 00000000 00000000 00000000 00000000 000000ff 00000000 74fb0c2b 8f24decd e948fd90 5230ee0d
+ars4x32 10 00ff0000 00000000 00000000 00000000 00000000 00000000 000000ff 00000000 3df7bada 01abdad5 56eeea05 45442205
+ars4x32 10 00800000 00000000 00000000 00000000 00000000 00000000 000000ff 00000000 d4674c3f c89c765b 82857074 32763d4d
+ars4x32 10 ff000000 00000000 00000000 00000000 00000000 00000000 000000ff 00000000 219a795f bf1f73ca 80a4661f 7b03cea8
+ars4x32 10 80000000 00000000 00000000 00000000 00000000 00000000 000000ff 00000000 07f88686 9cbf736a 90fa5537 bdc78d0f
+ars4x32 10 00000000 000000ff 00000000 00000000 00000000 00000000 000000ff 00000000 31c48afb 47e6fdc1 bfab3797 9911a653
+ars4x32 10 00000000 00000080 00000000 00000000 00000000 00000000 000000ff 00000000 bd931b49 d549608e 341743d5 d33a2785
+ars4x32 10 00000000 0000ff00 00000000 00000000 00000000 00000000 000000ff 00000000 71e6c352 95ffd8d4 087423a2 57d38421
+ars4x32 10 00000000 00008000 00000000 00000000 00000000 00000000 000000ff 00000000 6a889c62 4cc200b8 443378a4 024a49a6
+ars4x32 10 00000000 00ff0000 00000000 00000000 00000000 00000000 000000ff 00000000 15854a4e 399eab8c fa1bddf2 31bb7730
+ars4x32 10 00000000 00800000 00000000 00000000 00000000 00000000 000000ff 00000000 deec5aca a4e0cd6f ca050a65 d8e94063
+ars4x32 10 00000000 ff000000 00000000 00000000 00000000 00000000 000000ff 00000000 3bb81a8d 57466caf 04414319 0e2b8c4a
+ars4x32 10 00000000 80000000 00000000 00000000 00000000 00000000 000000ff 00000000 ed59a3a3 d755a575 589bee5d 5cb05c14
+ars4x32 10 00000000 00000000 000000ff 00000000 00000000 00000000 000000ff 00000000 4597e89c 63d67111 e9b252a1 9a190af6
+ars4x32 10 00000000 00000000 00000080 00000000 00000000 00000000 000000ff 00000000 f8eb267a 0e8e0dc1 c8366e23 758f6f30
+ars4x32 10 00000000 00000000 0000ff00 00000000 00000000 00000000 000000ff 00000000 991dc2fc a2782037 3f421cf7 c6b03740
+ars4x32 10 00000000 00000000 00008000 00000000 00000000 00000000 000000ff 00000000 a226fe9c ad602184 9140c643 4129ca3d
+ars4x32 10 00000000 00000000 00ff0000 00000000 00000000 00000000 000000ff 00000000 1bdeb639 53b985ee c0bcb078 b892c4e2
+ars4x32 10 00000000 00000000 00800000 00000000 00000000 00000000 000000ff 00000000 172511c8 c2a169b2 fb123cef 32417c29
+ars4x32 10 00000000 00000000 ff000000 00000000 00000000 00000000 000000ff 00000000 8efe1d11 d5be5fa6 be816827 904558d6
+ars4x32 10 00000000 00000000 80000000 00000000 00000000 00000000 000000ff 00000000 5889a990 36b0fcb6 26ad5e11 8f3bbf66
+ars4x32 10 00000000 00000000 00000000 000000ff 00000000 00000000 000000ff 00000000 349e8c58 73a53b65 29d1ed42 4616e7a4
+ars4x32 10 00000000 00000000 00000000 00000080 00000000 00000000 000000ff 00000000 a2aaf3eb 9347b26a 1917022d de2dffee
+ars4x32 10 00000000 00000000 00000000 0000ff00 00000000 00000000 000000ff 00000000 8c757a87 587c4cf9 1b5c1bf9 0c3616c5
+ars4x32 10 00000000 00000000 00000000 00008000 00000000 00000000 000000ff 00000000 6760e16f 93b03b74 a7de3a80 8fa93309
+ars4x32 10 00000000 00000000 00000000 00ff0000 00000000 00000000 000000ff 00000000 ff278b74 d430f96e de8e472f 0ab8a7d0
+ars4x32 10 00000000 00000000 00000000 00800000 00000000 00000000 000000ff 00000000 e8e4f94a 345f8d70 a38fd32a 5c726aea
+ars4x32 10 00000000 00000000 00000000 ff000000 00000000 00000000 000000ff 00000000 c2a23dd0 7011b1e2 332c7423 b35056ee
+ars4x32 10 00000000 00000000 00000000 80000000 00000000 00000000 000000ff 00000000 251b5804 ba885efb 577759f8 543e0e84
+ars4x32 10 886a3f24 d308a385 2e8a1913 44737003 00000000 00000000 000000ff 00000000 7fd4d23b 15b8edfc fee03fe5 a12f94a2
+ars4x32 10 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000000 000000ff 00000000 1049d92e 7b4b996e 99541c8d 087efad4
+ars4x32 10 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000000 000000ff 00000000 9d0ded71 e435dccb 164901af 34fc1baf
+ars4x32 10 00000001 00000000 00000000 00000000 00000000 00000000 00000080 00000000 78edb96a 6908c8de 14f55ef2 9f0fae04
+ars4x32 10 00000100 00000000 00000000 00000000 00000000 00000000 00000080 00000000 de37fe97 cf28bbb9 b661da5b 2a13c7ee
+ars4x32 10 00010000 00000000 00000000 00000000 00000000 00000000 00000080 00000000 6e861f75 1c7655a4 daa779f7 1021c8ff
+ars4x32 10 01000000 00000000 00000000 00000000 00000000 00000000 00000080 00000000 44313b42 a77b3f2a 2fe551e6 0540dfd3
+ars4x32 10 00000000 00000001 00000000 00000000 00000000 00000000 00000080 00000000 03dd5293 61edd733 c5ed88da a6cab8b2
+ars4x32 10 00000000 00000100 00000000 00000000 00000000 00000000 00000080 00000000 ed06f5a9 5568a8cc cc6cc793 3ed98f1f
+ars4x32 10 00000000 00010000 00000000 00000000 00000000 00000000 00000080 00000000 24b74d8a b47dc602 eb1c91a6 9f4ed8e6
+ars4x32 10 00000000 01000000 00000000 00000000 00000000 00000000 00000080 00000000 7d802fde a6e88144 599f7e11 8a4d5f68
+ars4x32 10 00000000 00000000 00000001 00000000 00000000 00000000 00000080 00000000 32a71211 59b38cc0 b4f2b31a b2136232
+ars4x32 10 00000000 00000000 00000100 00000000 00000000 00000000 00000080 00000000 ced9a35f 763e924f 69fd7268 33d411de
+ars4x32 10 00000000 00000000 00010000 00000000 00000000 00000000 00000080 00000000 8e5b8b9f 94f47d85 57251d28 f0b25ce9
+ars4x32 10 00000000 00000000 01000000 00000000 00000000 00000000 00000080 00000000 97591c5d 87e8713d 3cc50903 d1e27c7a
+ars4x32 10 00000000 00000000 00000000 00000001 00000000 00000000 00000080 00000000 3f7b1e5e 2aba4203 5a55d1ff ab7ed0fc
+ars4x32 10 00000000 00000000 00000000 00000100 00000000 00000000 00000080 00000000 5d0fcbcd 06665fed 3757cff9 d810791a
+ars4x32 10 00000000 00000000 00000000 00010000 00000000 00000000 00000080 00000000 728af58d 5781eff8 8864c0f9 3b75ee85
+ars4x32 10 00000000 00000000 00000000 01000000 00000000 00000000 00000080 00000000 967523e3 f9c4a057 c35a6daa 6151a76a
+ars4x32 10 0000ff00 00000000 00000000 00000000 00000000 00000000 00000080 00000000 1933314b ee335886 0ed15ef6 5e42982a
+ars4x32 10 00008000 00000000 00000000 00000000 00000000 00000000 00000080 00000000 decd3a83 4501177d 54b8c3ab c59dd6e3
+ars4x32 10 00ff0000 00000000 00000000 00000000 00000000 00000000 00000080 00000000 5b445f94 312e247b 2ab3cd23 fd412c8b
+ars4x32 10 00800000 00000000 00000000 00000000 00000000 00000000 00000080 00000000 010df58d 380f8c53 0cfc4871 e3cd6daa
+ars4x32 10 ff000000 00000000 00000000 00000000 00000000 00000000 00000080 00000000 699b519e 09f8e4c8 266de62a 9f7f6722
+ars4x32 10 80000000 00000000 00000000 00000000 00000000 00000000 00000080 00000000 9286df5b 4acb9c6a 6796ae21 66c4b0f9
+ars4x32 10 00000000 000000ff 00000000 00000000 00000000 00000000 00000080 00000000 257bb931 15374ecc 84e3bc37 00b3a497
+ars4x32 10 00000000 00000080 00000000 00000000 00000000 00000000 00000080 00000000 34212381 2c5363ee 2576da5e e6cc37a2
+ars4x32 10 00000000 0000ff00 00000000 00000000 00000000 00000000 00000080 00000000 3433f8db 4cb05ac7 f0607702 38136951
+ars4x32 10 00000000 00008000 00000000 00000000 00000000 00000000 00000080 00000000 635503bf a1954b79 2cf926f5 980ca587
+ars4x32 10 00000000 00ff0000 00000000 00000000 00000000 00000000 00000080 00000000 d39d7534 afcc457b 098e9a43 4a456000
+ars4x32 10 00000000 00800000 00000000 00000000 00000000 00000000 00000080 00000000 4519de79 96f80024 24d07cbd 4c0b7795
+ars4x32 10 00000000 ff000000 00000000 00000000 00000000 00000000 00000080 00000000 d29296cd 6dc750a2 fd383b84 64755f9c
+ars4x32 10 00000000 80000000 00000000 00000000 00000000 00000000 00000080 00000000 49c5803d 9fcf9542 6c79ea07 49261f84
+ars4x32 10 00000000 00000000 000000ff 00000000 00000000 00000000 00000080 00000000 e273b4b5 6b136ebe 533957ea 77e304bb
+ars4x32 10 00000000 00000000 00000080 00000000 00000000 00000000 00000080 00000000 1c44d927 538b6c83 e363d0cf 00a77f62
+ars4x32 10 00000000 00000000 0000ff00 00000000 00000000 00000000 00000080 00000000 b61ee82d e2655b38 3db27ab2 cd94f34e
+ars4x32 10 00000000 00000000 00008000 00000000 00000000 00000000 00000080 00000000 eda4f5e2 47d08f95 8bfc833c cdbd697a
+ars4x32 10 00000000 00000000 00ff0000 00000000 00000000 00000000 00000080 00000000 f5d9cdc2 4f91c004 27391e7d 199b276e
+ars4x32 10 00000000 00000000 00800000 00000000 00000000 00000000 00000080 00000000 d23978f4 ab233254 f611ca0b 7fbc8460
+ars4x32 10 00000000 00000000 ff000000 00000000 00000000 00000000 00000080 00000000 2bc6f4ac 6d6b8451 19b58a65 c84fb4c9
+ars4x32 10 00000000 00000000 80000000 00000000 00000000 00000000 00000080 00000000 8a84549b c251bb70 e7cfff88 5f71c7d0
+ars4x32 10 00000000 00000000 00000000 000000ff 00000000 00000000 00000080 00000000 08b2e46c dbfe2c11 8b6ea6da 3aa1fbfd
+ars4x32 10 00000000 00000000 00000000 00000080 00000000 00000000 00000080 00000000 75f8eee7 418fb421 e6d0d4a0 c638e3b3
+ars4x32 10 00000000 00000000 00000000 0000ff00 00000000 00000000 00000080 00000000 b892d231 e09b1b98 a8285831 74b2ed09
+ars4x32 10 00000000 00000000 00000000 00008000 00000000 00000000 00000080 00000000 2cbdeaa2 c85de50d d999dbac ba322240
+ars4x32 10 00000000 00000000 00000000 00ff0000 00000000 00000000 00000080 00000000 9066074a d3f2b6eb bf997c56 6e2fc3e1
+ars4x32 10 00000000 00000000 00000000 00800000 00000000 00000000 00000080 00000000 c1dab9a7 02680c69 69bc280a ef506afe
+ars4x32 10 00000000 00000000 00000000 ff000000 00000000 00000000 00000080 00000000 6b4503ea 3dd88f9a a64e9edf 54e5101f
+ars4x32 10 00000000 00000000 00000000 80000000 00000000 00000000 00000080 00000000 e2e930df bc0f222b ced19097 52071260
+ars4x32 10 886a3f24 d308a385 2e8a1913 44737003 00000000 00000000 00000080 00000000 b4e5e606 35b7286f 950de5c6 c2f1a652
+ars4x32 10 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000000 00000080 00000000 dc194b8a 448447bc c7374ed0 9980536e
+ars4x32 10 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000000 00000080 00000000 aa838c05 e22ba715 6918cc5c dc292da8
+ars4x32 10 00000001 00000000 00000000 00000000 00000000 00000000 0000ff00 00000000 4f895e3e 72b5a8f9 41c531be 63caf21f
+ars4x32 10 00000100 00000000 00000000 00000000 00000000 00000000 0000ff00 00000000 e1814add 46b78185 5a794602 c5cbb81f
+ars4x32 10 00010000 00000000 00000000 00000000 00000000 00000000 0000ff00 00000000 b2c797be f07a5e58 4aaeb2d5 34d77337
+ars4x32 10 01000000 00000000 00000000 00000000 00000000 00000000 0000ff00 00000000 79a0ffd9 48780199 0705054e 49350ed4
+ars4x32 10 00000000 00000001 00000000 00000000 00000000 00000000 0000ff00 00000000 ea92d127 fc1a95df 273c0510 b61e10e8
+ars4x32 10 00000000 00000100 00000000 00000000 00000000 00000000 0000ff00 00000000 465c4daa 7959cac3 580b5939 5cade546
+ars4x32 10 00000000 00010000 00000000 00000000 00000000 00000000 0000ff00 00000000 40d94049 f73cb9ac 745cffa6 59f76ec5
+ars4x32 10 00000000 01000000 00000000 00000000 00000000 00000000 0000ff00 00000000 cf703f5b cd3f4549 97b731f1 a76acffc
+ars4x32 10 00000000 00000000 00000001 00000000 00000000 00000000 0000ff00 00000000 601682a7 ff3352a6 f51767ca 67c505cb
+ars4x32 10 00000000 00000000 00000100 00000000 00000000 00000000 0000ff00 00000000 064a4fd5 acf56790 fc2f77c6 542e7a7b
+ars4x32 10 00000000 00000000 00010000 00000000 00000000 00000000 0000ff00 00000000 07dd2141 a9e2457c debae6fc ddd06c68
+ars4x32 10 00000000 00000000 01000000 00000000 00000000 00000000 0000ff00 00000000 5a7b064d c5639457 f259c9bf c8070244
+ars4x32 10 00000000 00000000 00000000 00000001 00000000 00000000 0000ff00 00000000 d197cd70 1ef3538c db127a4b a3a1bb87
+ars4x32 10 00000000 00000000 00000000 00000100 00000000 00000000 0000ff00 00000000 4b404fd6 ad1b745e 6a8c294b 5df0c9d4
+ars4x32 10 00000000 00000000 00000000 00010000 00000000 00000000 0000ff00 00000000 9578bf95 49e2728e 56c2e4ae 3ae95323
+ars4x32 10 00000000 00000000 00000000 01000000 00000000 00000000 0000ff00 00000000 45839f9c c7f0e13d f1a64680 3aeac951
+ars4x32 10 0000ff00 00000000 00000000 00000000 00000000 00000000 0000ff00 00000000 be685e6a 35d02b3f 65b1fab0 1a9b817c
+ars4x32 10 00008000 00000000 00000000 00000000 00000000 00000000 0000ff00 00000000 8b23624f c777cdc2 17ba7e26 91e2d3ab
+ars4x32 10 00ff0000 00000000 00000000 00000000 00000000 00000000 0000ff00 00000000 7475aab9 7f315b43 bc2b96c3 00242add
+ars4x32 10 00800000 00000000 00000000 00000000 00000000 00000000 0000ff00 00000000 109a90ca 965c5269 7430bab4 a3889c75
+ars4x32 10 ff000000 00000000 00000000 00000000 00000000 00000000 0000ff00 00000000 fe582027 bef70e59 8a9b2847 5c0df86c
+ars4x32 10 80000000 00000000 00000000 00000000 00000000 00000000 0000ff00 00000000 3e3f8f0f 1734ab81 33f4d2ea 300b3b8b
+ars4x32 10 00000000 000000ff 00000000 00000000 00000000 00000000 0000ff00 00000000 ff63a226 41021a29 82485198 8c15a717
+ars4x32 10 00000000 00000080 00000000 00000000 00000000 00000000 0000ff00 00000000 e27a093e c263725a de05cc61 86e501c0
+ars4x32 10 00000000 0000ff00 00000000 00000000 00000000 00000000 0000ff00 00000000 b06ada3e 32f43fc1 f617a8d4 05404006
+ars4x32 10 00000000 00008000 00000000 00000000 00000000 00000000 0000ff00 00000000 98361f5a c454edae c9d73afa e3eef15b
+ars4x32 10 00000000 00ff0000 00000000 00000000 00000000 00000000 0000ff00 00000000 43f847d0 0c32ef55 6b7d8ca5 b2e06275
+ars4x32 10 00000000 00800000 00000000 00000000 00000000 00000000 0000ff00 00000000 59daf278 4e717bc6 bac4cd52 19ad0428
+ars4x32 10 00000000 ff000000 00000000 00000000 00000000 00000000 0000ff00 00000000 515a9cd5 6a818e6d ca4261cc e40fa439
+ars4x32 10 00000000 80000000 00000000 00000000 00000000 00000000 0000ff00 00000000 9c190df3 635b6902 e957b24e 6df51f6e
+ars4x32 10 00000000 00000000 000000ff 00000000 00000000 00000000 0000ff00 00000000 afb4979c 19bf132f 235e7a66 379823d2
+ars4x32 10 00000000 00000000 00000080 00000000 00000000 00000000 0000ff00 00000000 fab801f4 7d8403c4 213946e6 bf26cfa1
+ars4x32 10 00000000 00000000 0000ff00 00000000 00000000 00000000 0000ff00 00000000 2bff30c5 dc2724dd 276b8f10 293035ae
+ars4x32 10 00000000 00000000 00008000 00000000 00000000 00000000 0000ff00 00000000 bd535fc6 d0996f9d 0b279e9a 198ca5ac
+ars4x32 10 00000000 00000000 00ff0000 00000000 00000000 00000000 0000ff00 00000000 082570f6 f137eed9 82f8e840 a5190121
+ars4x32 10 00000000 00000000 00800000 00000000 00000000 00000000 0000ff00 00000000 ea45c747 936587e8 2f8ad187 95ea35d0
+ars4x32 10 00000000 00000000 ff000000 00000000 00000000 00000000 0000ff00 00000000 1bd18a60 b0d73ea8 e1966b10 2eac853b
+ars4x32 10 00000000 00000000 80000000 00000000 00000000 00000000 0000ff00 00000000 5236a302 62972607 e3c01714 0b62be49
+ars4x32 10 00000000 00000000 00000000 000000ff 00000000 00000000 0000ff00 00000000 efb10eeb acd85f80 99fba3e7 47b3c363
+ars4x32 10 00000000 00000000 00000000 00000080 00000000 00000000 0000ff00 00000000 41722b57 d4ac5a7a acd93feb 753133f3
+ars4x32 10 00000000 00000000 00000000 0000ff00 00000000 00000000 0000ff00 00000000 11d3138c c2a57d61 aa7af870 055f2d4e
+ars4x32 10 00000000 00000000 00000000 00008000 00000000 00000000 0000ff00 00000000 2b9fb6aa f71d55a2 f2792824 edb7f27f
+ars4x32 10 00000000 00000000 00000000 00ff0000 00000000 00000000 0000ff00 00000000 d4778713 5e30a88a 062e6325 be4add84
+ars4x32 10 00000000 00000000 00000000 00800000 00000000 00000000 0000ff00 00000000 b5a55af2 1be5b52b 12f81646 0e07d277
+ars4x32 10 00000000 00000000 00000000 ff000000 00000000 00000000 0000ff00 00000000 45a08cc5 57c9c115 f8e385c0 a36320f8
+ars4x32 10 00000000 00000000 00000000 80000000 00000000 00000000 0000ff00 00000000 612339f4 86580243 459c100b 850bd33d
+ars4x32 10 886a3f24 d308a385 2e8a1913 44737003 00000000 00000000 0000ff00 00000000 39bd7725 10cbed46 51577369 8acdda6c
+ars4x32 10 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000000 0000ff00 00000000 c5650896 57b105b1 dc6cceb4 73d682b0
+ars4x32 10 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000000 0000ff00 00000000 6f5b19b1 da5bbfef b31787b4 e1b68bc1
+ars4x32 10 00000001 00000000 00000000 00000000 00000000 00000000 00008000 00000000 24d1487f 158e76bd 8f4625e2 1e4540ed
+ars4x32 10 00000100 00000000 00000000 00000000 00000000 00000000 00008000 00000000 fdc7999b 7bf57a2f 01436def 8b61b237
+ars4x32 10 00010000 00000000 00000000 00000000 00000000 00000000 00008000 00000000 686e0027 1feb6da1 c12824a4 7c2b0f28
+ars4x32 10 01000000 00000000 00000000 00000000 00000000 00000000 00008000 00000000 33836406 9f2ab550 562389cc 95d88501
+ars4x32 10 00000000 00000001 00000000 00000000 00000000 00000000 00008000 00000000 6cfc5fce 5c5bb94e b6ecef73 69459223
+ars4x32 10 00000000 00000100 00000000 00000000 00000000 00000000 00008000 00000000 3421e4bb 62cff9de 6aadbe7f 5402a3e1
+ars4x32 10 00000000 00010000 00000000 00000000 00000000 00000000 00008000 00000000 6c9c37e8 700b2ff4 8814305d fafff619
+ars4x32 10 00000000 01000000 00000000 00000000 00000000 00000000 00008000 00000000 c9a01dff c0d0754d c7746621 10487b7c
+ars4x32 10 00000000 00000000 00000001 00000000 00000000 00000000 00008000 00000000 261f4c1a 558a7d91 69228368 ca5bb4e3
+ars4x32 10 00000000 00000000 00000100 00000000 00000000 00000000 00008000 00000000 41535347 2881b818 bae2d203 472f8fe7
+ars4x32 10 00000000 00000000 00010000 00000000 00000000 00000000 00008000 00000000 7eb52b1a 195c1451 be6a546d c97ab66a
+ars4x32 10 00000000 00000000 01000000 00000000 00000000 00000000 00008000 00000000 7d3f7f8c 6de137ff d4250a82 2ced4b04
+ars4x32 10 00000000 00000000 00000000 00000001 00000000 00000000 00008000 00000000 01d2065f a5e190c7 b6966627 9f26e06c
+ars4x32 10 00000000 00000000 00000000 00000100 00000000 00000000 00008000 00000000 64fa9a54 d9e965d1 eb21155c e55453cf
+ars4x32 10 00000000 00000000 00000000 00010000 00000000 00000000 00008000 00000000 cd61bd9d 992e6f20 722cb30e 8d88b06d
+ars4x32 10 00000000 00000000 00000000 01000000 00000000 00000000 00008000 00000000 b6d727bd ff9b0a17 cda0c38a 3cc5d2cb
+ars4x32 10 0000ff00 00000000 00000000 00000000 00000000 00000000 00008000 00000000 7c6a0872 3e6f25d4 92970934 dcabecfc
+ars4x32 10 00008000 00000000 00000000 00000000 00000000 00000000 00008000 00000000 5e22281e 0b94307d e9db296b 2cf95249
+ars4x32 10 00ff0000 00000000 00000000 00000000 00000000 00000000 00008000 00000000 011bac44 666d7197 a5e1c544 c75e1c6d
+ars4x32 10 00800000 00000000 00000000 00000000 00000000 00000000 00008000 00000000 abbe39f4 52d30bab 991053f6 4b4ed4cf
+ars4x32 10 ff000000 00000000 00000000 00000000 00000000 00000000 00008000 00000000 f3e85902 a7c0dbb2 bd9d9c94 6b3042fb
+ars4x32 10 80000000 00000000 00000000 00000000 00000000 00000000 00008000 00000000 a723461e 951ecf6d ab3f8dc8 4c05d117
+ars4x32 10 00000000 000000ff 00000000 00000000 00000000 00000000 00008000 00000000 ee5355b5 32725efa 61b14b48 e353a242
+ars4x32 10 00000000 00000080 00000000 00000000 00000000 00000000 00008000 00000000 11f078cc 605038a9 68376309 10032ad2
+ars4x32 10 00000000 0000ff00 00000000 00000000 00000000 00000000 00008000 00000000 0900e5ff 0f45e7e0 d8fd1655 5a726ff7
+ars4x32 10 00000000 00008000 00000000 00000000 00000000 00000000 00008000 00000000 2aaa22f3 ab0c292e ecbf2fa5 bbe1420c
+ars4x32 10 00000000 00ff0000 00000000 00000000 00000000 00000000 00008000 00000000 0ce0d376 233941c7 e7362e05 2d05628d
+ars4x32 10 00000000 00800000 00000000 00000000 00000000 00000000 00008000 00000000 3e176017 54200793 d514e4e8 3eb412a7
+ars4x32 10 00000000 ff000000 00000000 00000000 00000000 00000000 00008000 00000000 48f2869b 3845ef22 5e1901ea 4a859734
+ars4x32 10 00000000 80000000 00000000 00000000 00000000 00000000 00008000 00000000 b7418462 d1f9ac07 3c055a85 8e0f3ea1
+ars4x32 10 00000000 00000000 000000ff 00000000 00000000 00000000 00008000 00000000 e8d41de4 a8874978 46a24e6c 62ca3cfc
+ars4x32 10 00000000 00000000 00000080 00000000 00000000 00000000 00008000 00000000 1532c522 6ddf05a4 c2066e0d 4bcd4299
+ars4x32 10 00000000 00000000 0000ff00 00000000 00000000 00000000 00008000 00000000 85e164d1 abc06722 d1d9c63f d7c77859
+ars4x32 10 00000000 00000000 00008000 00000000 00000000 00000000 00008000 00000000 1a82806a 5a3f2a6b f64ab142 8f9dcbfe
+ars4x32 10 00000000 00000000 00ff0000 00000000 00000000 00000000 00008000 00000000 3b79de87 7c00eab3 f24513c2 3dd85d75
+ars4x32 10 00000000 00000000 00800000 00000000 00000000 00000000 00008000 00000000 4ba6fbb8 6103aaa6 9b5bd1ab 82501d69
+ars4x32 10 00000000 00000000 ff000000 00000000 00000000 00000000 00008000 00000000 f5753d5b b7ba337b cb34b53a d8ab23ed
+ars4x32 10 00000000 00000000 80000000 00000000 00000000 00000000 00008000 00000000 f8c29746 c96595dd 2a7e4df6 c4f15e03
+ars4x32 10 00000000 00000000 00000000 000000ff 00000000 00000000 00008000 00000000 5e5bf243 43201ef2 b2b56cdf 2606e3c1
+ars4x32 10 00000000 00000000 00000000 00000080 00000000 00000000 00008000 00000000 5b7b8240 9c0dbf33 3cd7526b d88092c4
+ars4x32 10 00000000 00000000 00000000 0000ff00 00000000 00000000 00008000 00000000 5cd72157 3bf89f8d 4308c0af acdd1a5f
+ars4x32 10 00000000 00000000 00000000 00008000 00000000 00000000 00008000 00000000 d2c67dca 081c3b2b 3971d46f 1aa33642
+ars4x32 10 00000000 00000000 00000000 00ff0000 00000000 00000000 00008000 00000000 b37023cb 70133c8f 50dcbba4 b0ec5a98
+ars4x32 10 00000000 00000000 00000000 00800000 00000000 00000000 00008000 00000000 66d1ab9e c8000dc4 6bf78454 f5967ab4
+ars4x32 10 00000000 00000000 00000000 ff000000 00000000 00000000 00008000 00000000 8cdee45a 0a564a1c 247a57b6 7d76dd5c
+ars4x32 10 00000000 00000000 00000000 80000000 00000000 00000000 00008000 00000000 9d950cfc 48245225 e2f6ce41 e18bbb3d
+ars4x32 10 886a3f24 d308a385 2e8a1913 44737003 00000000 00000000 00008000 00000000 8726cb58 4b596fcc d85ccd2d ea5c1b86
+ars4x32 10 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000000 00008000 00000000 b5bbbd24 af621eff eb71ad90 3963eda2
+ars4x32 10 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000000 00008000 00000000 7e8c5d35 b01f4357 1d4da01a 349d9308
+ars4x32 10 00000001 00000000 00000000 00000000 00000000 00000000 00ff0000 00000000 150100c1 8d8bf7c0 1c7d1deb ea2ff94f
+ars4x32 10 00000100 00000000 00000000 00000000 00000000 00000000 00ff0000 00000000 994d5250 c83dc66c e341426f bb32bccb
+ars4x32 10 00010000 00000000 00000000 00000000 00000000 00000000 00ff0000 00000000 8ac076c6 b28157c7 823ddb74 5d555ba4
+ars4x32 10 01000000 00000000 00000000 00000000 00000000 00000000 00ff0000 00000000 912496a3 26ef9bae afd546a9 6ad2f1f1
+ars4x32 10 00000000 00000001 00000000 00000000 00000000 00000000 00ff0000 00000000 17bfc356 ba77656f 0f46d315 8fc83394
+ars4x32 10 00000000 00000100 00000000 00000000 00000000 00000000 00ff0000 00000000 30ca7dd6 e2b05be4 c3d7d1be d450f616
+ars4x32 10 00000000 00010000 00000000 00000000 00000000 00000000 00ff0000 00000000 5857a46b 9ccfbe40 2b669fa2 9abc43b5
+ars4x32 10 00000000 01000000 00000000 00000000 00000000 00000000 00ff0000 00000000 d062d457 d657a39e 23313e22 00fe8983
+ars4x32 10 00000000 00000000 00000001 00000000 00000000 00000000 00ff0000 00000000 6a2a8e8c fa721dd3 5569b7a8 7047dffc
+ars4x32 10 00000000 00000000 00000100 00000000 00000000 00000000 00ff0000 00000000 8a8ed781 7cf1b536 87ec6941 c4e4c20f
+ars4x32 10 00000000 00000000 00010000 00000000 00000000 00000000 00ff0000 00000000 4d954fc9 836102fa fb3944b2 d1b5a7e9
+ars4x32 10 00000000 00000000 01000000 00000000 00000000 00000000 00ff0000 00000000 79a5718b b154c479 a77f8db1 adb57436
+ars4x32 10 00000000 00000000 00000000 00000001 00000000 00000000 00ff0000 00000000 43642543 c3937039 9f582b56 19f7d08b
+ars4x32 10 00000000 00000000 00000000 00000100 00000000 00000000 00ff0000 00000000 675c5fbe f10a35e8 f11bcf82 d576b00e
+ars4x32 10 00000000 00000000 00000000 00010000 00000000 00000000 00ff0000 00000000 049552f7 68df840f 7cb4f5f2 6d19b3a0
+ars4x32 10 00000000 00000000 00000000 01000000 00000000 00000000 00ff0000 00000000 831c604c 0e4000c8 4bc6c406 6962eaea
+ars4x32 10 0000ff00 00000000 00000000 00000000 00000000 00000000 00ff0000 00000000 d0f5ceb6 19226e67 265c3f6e 50007b66
+ars4x32 10 00008000 00000000 00000000 00000000 00000000 00000000 00ff0000 00000000 c519f53c f413fac7 436b8242 f48c31b2
+ars4x32 10 00ff0000 00000000 00000000 00000000 00000000 00000000 00ff0000 00000000 d4b94661 5822fc35 7d5f5827 88fbc576
+ars4x32 10 00800000 00000000 00000000 00000000 00000000 00000000 00ff0000 00000000 39661f90 f3148a86 85deba9a 6a320b8b
+ars4x32 10 ff000000 00000000 00000000 00000000 00000000 00000000 00ff0000 00000000 8f57ce6e f6391458 ecc348bf bb6f94e1
+ars4x32 10 80000000 00000000 00000000 00000000 00000000 00000000 00ff0000 00000000 76cb2978 8e67c88d 950a1a6a a62e2213
+ars4x32 10 00000000 000000ff 00000000 00000000 00000000 00000000 00ff0000 00000000 1ae699eb 3cbca167 39775a0e 146b9cc6
+ars4x32 10 00000000 00000080 00000000 00000000 00000000 00000000 00ff0000 00000000 a98821cc 51579bf1 e844a285 39fa3044
+ars4x32 10 00000000 0000ff00 00000000 00000000 00000000 00000000 00ff0000 00000000 4be5b753 8f56938b 3d6cc3da 86ecba90
+ars4x32 10 00000000 00008000 00000000 00000000 00000000 00000000 00ff0000 00000000 198172c3 800e20da be07ee33 a8560a99
+ars4x32 10 00000000 00ff0000 00000000 00000000 00000000 00000000 00ff0000 00000000 ff2b7003 d5983fe4 1309cf3c 74333dd4
+ars4x32 10 00000000 00800000 00000000 00000000 00000000 00000000 00ff0000 00000000 771bf320 5a91a69a 25e85234 6b44483d
+ars4x32 10 00000000 ff000000 00000000 00000000 00000000 00000000 00ff0000 00000000 cad80ab5 243a85d6 746d94c3 14288f35
+ars4x32 10 00000000 80000000 00000000 00000000 00000000 00000000 00ff0000 00000000 af6409e0 7b2e97e1 61dc66cc daf91138
+ars4x32 10 00000000 00000000 000000ff 00000000 00000000 00000000 00ff0000 00000000 72f34dba 42ea306f ab2dbb1c f89d0e52
+ars4x32 10 00000000 00000000 00000080 00000000 00000000 00000000 00ff0000 00000000 de0425e6 b0711cbe a1f06647 1d22420d
+ars4x32 10 00000000 00000000 0000ff00 00000000 00000000 00000000 00ff0000 00000000 2c4547fb 290dc51b f05b6832 367d1247
+ars4x32 10 00000000 00000000 00008000 00000000 00000000 00000000 00ff0000 00000000 8c9ba4ff 28b80719 bae6c186 2961fbb2
+ars4x32 10 00000000 00000000 00ff0000 00000000 00000000 00000000 00ff0000 00000000 f4d1a124 8dd06f6e b60ad992 a75bb575
+ars4x32 10 00000000 00000000 00800000 00000000 00000000 00000000 00ff0000 00000000 1d264180 0d82de2f f7ad28d1 6de99d88
+ars4x32 10 00000000 00000000 ff000000 00000000 00000000 00000000 00ff0000 00000000 e8d546e4 f436aa12 d9ea6b9b 1e8293d8
+ars4x32 10 00000000 00000000 80000000 00000000 00000000 00000000 00ff0000 00000000 c68b533b 0c2f5dca ee1f618f dac2795c
+ars4x32 10 00000000 00000000 00000000 000000ff 00000000 00000000 00ff0000 00000000 b0231ad0 d9f78969 e9a7f2fa 57a7d045
+ars4x32 10 00000000 00000000 00000000 00000080 00000000 00000000 00ff0000 00000000 66222670 31459874 e598e3a8 1a4bde92
+ars4x32 10 00000000 00000000 00000000 0000ff00 00000000 00000000 00ff0000 00000000 b6d2196d db3851bd 516ae69b 06225b81
+ars4x32 10 00000000 00000000 00000000 00008000 00000000 00000000 00ff0000 00000000 bdc0eebb bfa3e06f 92d8d0ae bd8cf1c3
+ars4x32 10 00000000 00000000 00000000 00ff0000 00000000 00000000 00ff0000 00000000 62aa92f2 f195369f 42e7ce55 30d5680a
+ars4x32 10 00000000 00000000 00000000 00800000 00000000 00000000 00ff0000 00000000 bd9e04a8 227be90d 097430ac 878fd8a8
+ars4x32 10 00000000 00000000 00000000 ff000000 00000000 00000000 00ff0000 00000000 40930095 69a60863 56535b7c 1db91864
+ars4x32 10 00000000 00000000 00000000 80000000 00000000 00000000 00ff0000 00000000 3fe5270e 13485418 5b672b74 4a4d1bce
+ars4x32 10 886a3f24 d308a385 2e8a1913 44737003 00000000 00000000 00ff0000 00000000 ac577578 1f84fd44 033a5861 779c8365
+ars4x32 10 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000000 00ff0000 00000000 a8a3b667 0c5cbf5b caccc1bd 734b447b
+ars4x32 10 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000000 00ff0000 00000000 e5d8935f 0661e012 1b98bb8d a2055553
+ars4x32 10 00000001 00000000 00000000 00000000 00000000 00000000 00800000 00000000 68e72e13 266b1949 abca7cd0 d1d4a3cd
+ars4x32 10 00000100 00000000 00000000 00000000 00000000 00000000 00800000 00000000 705dbcb8 95696c45 d61cf801 3c1b2b7e
+ars4x32 10 00010000 00000000 00000000 00000000 00000000 00000000 00800000 00000000 0ab694e0 2a73e296 0075cb87 e3e64788
+ars4x32 10 01000000 00000000 00000000 00000000 00000000 00000000 00800000 00000000 c8c39af7 2c85aa23 7658b885 0a9b9ceb
+ars4x32 10 00000000 00000001 00000000 00000000 00000000 00000000 00800000 00000000 adae304e c04bff5e dc073076 326c6db4
+ars4x32 10 00000000 00000100 00000000 00000000 00000000 00000000 00800000 00000000 9f18f947 2e6324bb 63a1cbf3 70b3c520
+ars4x32 10 00000000 00010000 00000000 00000000 00000000 00000000 00800000 00000000 85f625f9 42888c8a 3ba60d3a 4b775425
+ars4x32 10 00000000 01000000 00000000 00000000 00000000 00000000 00800000 00000000 f1ff4973 f55b9ef0 92ece024 a4eecd95
+ars4x32 10 00000000 00000000 00000001 00000000 00000000 00000000 00800000 00000000 66193413 cb44934e 0286e084 30f50630
+ars4x32 10 00000000 00000000 00000100 00000000 00000000 00000000 00800000 00000000 4a3c0db1 e14e905d 19af9847 74a6bab5
+ars4x32 10 00000000 00000000 00010000 00000000 00000000 00000000 00800000 00000000 360c0993 a7e6d53c 6545bd83 3d1e73a3
+ars4x32 10 00000000 00000000 01000000 00000000 00000000 00000000 00800000 00000000 562cf033 253dcff5 4a402904 fa8abff9
+ars4x32 10 00000000 00000000 00000000 00000001 00000000 00000000 00800000 00000000 436a432f 11dbdb14 05e49a83 9993339e
+ars4x32 10 00000000 00000000 00000000 00000100 00000000 00000000 00800000 00000000 58d08506 40633f84 56a1a0f8 660b48aa
+ars4x32 10 00000000 00000000 00000000 00010000 00000000 00000000 00800000 00000000 02c240f0 8d2fc6dd 5a8c1a84 aab3284f
+ars4x32 10 00000000 00000000 00000000 01000000 00000000 00000000 00800000 00000000 2864f59a 6edf90a5 ce976842 915798b4
+ars4x32 10 0000ff00 00000000 00000000 00000000 00000000 00000000 00800000 00000000 825a70ce 7c5cd2df 26b9286b 7e663990
+ars4x32 10 00008000 00000000 00000000 00000000 00000000 00000000 00800000 00000000 d2582afe 7ce7356c 61af9992 76e40957
+ars4x32 10 00ff0000 00000000 00000000 00000000 00000000 00000000 00800000 00000000 cabcada6 6adfef01 8d0f0341 3e913f9d
+ars4x32 10 00800000 00000000 00000000 00000000 00000000 00000000 00800000 00000000 a5980f69 9d59ac3a 1948d421 7b5f876c
+ars4x32 10 ff000000 00000000 00000000 00000000 00000000 00000000 00800000 00000000 22263e0b 847009f1 534a770e d3bee5ee
+ars4x32 10 80000000 00000000 00000000 00000000 00000000 00000000 00800000 00000000 6cb180d5 1a7fe928 c78f1ad4 2a5f82b2
+ars4x32 10 00000000 000000ff 00000000 00000000 00000000 00000000 00800000 00000000 901f9239 d8682cf2 9f1aef9d de8af58c
+ars4x32 10 00000000 00000080 00000000 00000000 00000000 00000000 00800000 00000000 a2068588 a97aa456 a42ed8a0 431234e4
+ars4x32 10 00000000 0000ff00 00000000 00000000 00000000 00000000 00800000 00000000 3b1d0a13 0049dcf1 60b9cdbb 9beedcb5
+ars4x32 10 00000000 00008000 00000000 00000000 00000000 00000000 00800000 00000000 18a1aba6 4403bbca 967481e5 7e6554e1
+ars4x32 10 00000000 00ff0000 00000000 00000000 00000000 00000000 00800000 00000000 482ceb52 af4d0143 55c736db aebb6425
+ars4x32 10 00000000 00800000 00000000 00000000 00000000 00000000 00800000 00000000 f6cf72fb 4d6640d9 35a977f1 7096cc36
+ars4x32 10 00000000 ff000000 00000000 00000000 00000000 00000000 00800000 00000000 d21cb48e 36311bae 3221e8d1 4ba5719f
+ars4x32 10 00000000 80000000 00000000 00000000 00000000 00000000 00800000 00000000 13086d02 660d0a2d e0962f43 b0fa1d6e
+ars4x32 10 00000000 00000000 000000ff 00000000 00000000 00000000 00800000 00000000 f04d666c 30ff59f4 7502022c 3cfc80a4
+ars4x32 10 00000000 00000000 00000080 00000000 00000000 00000000 00800000 00000000 d5114c63 b5d76336 b8b67146 02867d09
+ars4x32 10 00000000 00000000 0000ff00 00000000 00000000 00000000 00800000 00000000 953c28e4 4ae01f34 8ed0dc6e 7789cb86
+ars4x32 10 00000000 00000000 00008000 00000000 00000000 00000000 00800000 00000000 1be4f6a6 f44a275b 1d943bf8 c0a290f1
+ars4x32 10 00000000 00000000 00ff0000 00000000 00000000 00000000 00800000 00000000 dd31a5da 05be7bd6 a167d78e 7d08f34c
+ars4x32 10 00000000 00000000 00800000 00000000 00000000 00000000 00800000 00000000 d5dcf493 3b152044 3d432a8f 775976d2
+ars4x32 10 00000000 00000000 ff000000 00000000 00000000 00000000 00800000 00000000 80e0584e a682ae00 0fcc317d 405dd7b8
+ars4x32 10 00000000 00000000 80000000 00000000 00000000 00000000 00800000 00000000 b328592e 23fdb9a2 cc0a0b5a c9e4691c
+ars4x32 10 00000000 00000000 00000000 000000ff 00000000 00000000 00800000 00000000 472a4c24 b385afbd 4dfd4a54 c97f647a
+ars4x32 10 00000000 00000000 00000000 00000080 00000000 00000000 00800000 00000000 f94146fb 0d22e6f0 56ecd3a4 208e570e
+ars4x32 10 00000000 00000000 00000000 0000ff00 00000000 00000000 00800000 00000000 5b6370ef 423622fc be86d2ba 442a8110
+ars4x32 10 00000000 00000000 00000000 00008000 00000000 00000000 00800000 00000000 3f27be64 7d2df841 441029aa 8a19787e
+ars4x32 10 00000000 00000000 00000000 00ff0000 00000000 00000000 00800000 00000000 1151638b 08a6c2ca 14f24afa 0e840c78
+ars4x32 10 00000000 00000000 00000000 00800000 00000000 00000000 00800000 00000000 8112fcc5 e7bae10f 737e7764 05a503e4
+ars4x32 10 00000000 00000000 00000000 ff000000 00000000 00000000 00800000 00000000 37694239 bdd5f12f c3534fd0 42a4a9c2
+ars4x32 10 00000000 00000000 00000000 80000000 00000000 00000000 00800000 00000000 15288d81 c5011e00 64e4df7d c6fe95d1
+ars4x32 10 886a3f24 d308a385 2e8a1913 44737003 00000000 00000000 00800000 00000000 3244478c 4ffda7c7 530422c7 833a4081
+ars4x32 10 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000000 00800000 00000000 1f6b2595 f19ea03d 12612526 3e202d62
+ars4x32 10 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000000 00800000 00000000 6bec8130 ae19560b 5c138b96 3fcb10a4
+ars4x32 10 00000001 00000000 00000000 00000000 00000000 00000000 ff000000 00000000 58efaae8 908f42d9 e4a5adeb 800f20f0
+ars4x32 10 00000100 00000000 00000000 00000000 00000000 00000000 ff000000 00000000 1b5bd8ef 4c71ab0a 4361587e e736be48
+ars4x32 10 00010000 00000000 00000000 00000000 00000000 00000000 ff000000 00000000 e7fa3d88 ed05f2ad a1f51a03 8019547e
+ars4x32 10 01000000 00000000 00000000 00000000 00000000 00000000 ff000000 00000000 a84250a7 481c99b6 ad206e2d f7cfc759
+ars4x32 10 00000000 00000001 00000000 00000000 00000000 00000000 ff000000 00000000 83828d08 1ed9dd9b 8370a4da 87770b65
+ars4x32 10 00000000 00000100 00000000 00000000 00000000 00000000 ff000000 00000000 70bc4d50 e5d389ce 0d1ed6bf 5cb66f96
+ars4x32 10 00000000 00010000 00000000 00000000 00000000 00000000 ff000000 00000000 d011df96 62a24fd2 862bdb89 51673aff
+ars4x32 10 00000000 01000000 00000000 00000000 00000000 00000000 ff000000 00000000 b5951541 117d9964 7bbc4552 d46c6108
+ars4x32 10 00000000 00000000 00000001 00000000 00000000 00000000 ff000000 00000000 895d27ea dc118488 14108089 c64316d5
+ars4x32 10 00000000 00000000 00000100 00000000 00000000 00000000 ff000000 00000000 77515b74 8ea060d8 aeb9258e 29210aff
+ars4x32 10 00000000 00000000 00010000 00000000 00000000 00000000 ff000000 00000000 98894204 5953a99d 98611732 cc2a318a
+ars4x32 10 00000000 00000000 01000000 00000000 00000000 00000000 ff000000 00000000 4015a871 701ca798 3e27d956 1ad8e87d
+ars4x32 10 00000000 00000000 00000000 00000001 00000000 00000000 ff000000 00000000 20823b8c 3c0e0feb b35a9f82 811604a4
+ars4x32 10 00000000 00000000 00000000 00000100 00000000 00000000 ff000000 00000000 15144119 2ce37c74 7e392f1a 9e35c7cb
+ars4x32 10 00000000 00000000 00000000 00010000 00000000 00000000 ff000000 00000000 bb159130 24c7e73e 0829a1e6 dd30133b
+ars4x32 10 00000000 00000000 00000000 01000000 00000000 00000000 ff000000 00000000 fca4d0ca f03c677f 70ba8d66 a1adfb79
+ars4x32 10 0000ff00 00000000 00000000 00000000 00000000 00000000 ff000000 00000000 f0a7207b 5f3d4137 65cde2ab 886b68a4
+ars4x32 10 00008000 00000000 00000000 00000000 00000000 00000000 ff000000 00000000 687ed791 369f293a 1d55e60b 2b9402fa
+ars4x32 10 00ff0000 00000000 00000000 00000000 00000000 00000000 ff000000 00000000 02044399 a8ee0e4b 4df92ff7 84f2d2e0
+ars4x32 10 00800000 00000000 00000000 00000000 00000000 00000000 ff000000 00000000 ba9ba0b4 6d8a660a 38361200 3a68ba1b
+ars4x32 10 ff000000 00000000 00000000 00000000 00000000 00000000 ff000000 00000000 411ff0c5 6c9435a8 75df0544 d8aab3a1
+ars4x32 10 80000000 00000000 00000000 00000000 00000000 00000000 ff000000 00000000 819b4329 41031a9c d55552cd da3cd070
+ars4x32 10 00000000 000000ff 00000000 00000000 00000000 00000000 ff000000 00000000 3b3b48b5 8ef2dd6a eff89bd0 ca2f9b84
+ars4x32 10 00000000 00000080 00000000 00000000 00000000 00000000 ff000000 00000000 e2dbbab9 f08aee93 b7f69de6 3d049a17
+ars4x32 10 00000000 0000ff00 00000000 00000000 00000000 00000000 ff000000 00000000 5017bc10 55fad779 44fa7a36 0118e600
+ars4x32 10 00000000 00008000 00000000 00000000 00000000 00000000 ff000000 00000000 fcb470e5 66cf1e2c cd667359 ab002923
+ars4x32 10 00000000 00ff0000 00000000 00000000 00000000 00000000 ff000000 00000000 5a3bcb0d 7171d784 87adcf0f 48815634
+ars4x32 10 00000000 00800000 00000000 00000000 00000000 00000000 ff000000 00000000 581967fb 3a31f5eb 56eb2845 0c4664fb
+ars4x32 10 00000000 ff000000 00000000 00000000 00000000 00000000 ff000000 00000000 bcb2b6db 5bb1b54c 8aeec711 3de3aaed
+ars4x32 10 00000000 80000000 00000000 00000000 00000000 00000000 ff000000 00000000 82f23d44 c05a76ae fd053b09 4811f26c
+ars4x32 10 00000000 00000000 000000ff 00000000 00000000 00000000 ff000000 00000000 60e4c1b3 a9cbe94b 5a1bf944 af1cc907
+ars4x32 10 00000000 00000000 00000080 00000000 00000000 00000000 ff000000 00000000 579e0bed 17c5f429 5d523ca2 083c228e
+ars4x32 10 00000000 00000000 0000ff00 00000000 00000000 00000000 ff000000 00000000 4d08ca02 f93a8353 d942c66f 14e89ccf
+ars4x32 10 00000000 00000000 00008000 00000000 00000000 00000000 ff000000 00000000 c437ef90 b3e6c4f8 5c96cd27 c9eb6193
+ars4x32 10 00000000 00000000 00ff0000 00000000 00000000 00000000 ff000000 00000000 97e2cfff 7fb4a4d8 711f5d3a 30ddd82c
+ars4x32 10 00000000 00000000 00800000 00000000 00000000 00000000 ff000000 00000000 2a7de2c3 9b2b4963 b35c6f87 5c6224a5
+ars4x32 10 00000000 00000000 ff000000 00000000 00000000 00000000 ff000000 00000000 fbafd6b1 0a2cde19 ffc1b1db fb4475e9
+ars4x32 10 00000000 00000000 80000000 00000000 00000000 00000000 ff000000 00000000 a209fecb 74698947 efe93434 9247b5ee
+ars4x32 10 00000000 00000000 00000000 000000ff 00000000 00000000 ff000000 00000000 9c680acb 3a32a953 be5c11a4 7c443198
+ars4x32 10 00000000 00000000 00000000 00000080 00000000 00000000 ff000000 00000000 6d2fe0c4 2cd7c774 a1108e79 30e00da1
+ars4x32 10 00000000 00000000 00000000 0000ff00 00000000 00000000 ff000000 00000000 a7bf2fb6 d8745ced 3689002d dd18f2d4
+ars4x32 10 00000000 00000000 00000000 00008000 00000000 00000000 ff000000 00000000 d96b2959 c77aae07 6eb557df 804209f0
+ars4x32 10 00000000 00000000 00000000 00ff0000 00000000 00000000 ff000000 00000000 fe919ceb 31d0dc56 e872a4a1 eba61bf8
+ars4x32 10 00000000 00000000 00000000 00800000 00000000 00000000 ff000000 00000000 25d41591 6eeb72bf 5a9b8eed d69fafbe
+ars4x32 10 00000000 00000000 00000000 ff000000 00000000 00000000 ff000000 00000000 14fe134c c16f5762 9fbe3991 3fd1124d
+ars4x32 10 00000000 00000000 00000000 80000000 00000000 00000000 ff000000 00000000 db8829be c1f8712e da644ea2 27a8390c
+ars4x32 10 886a3f24 d308a385 2e8a1913 44737003 00000000 00000000 ff000000 00000000 80d8415d 43b257fb 31703e65 24616f8a
+ars4x32 10 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000000 ff000000 00000000 057dc2d7 5ae3fa5a f95a7de3 f9808716
+ars4x32 10 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000000 ff000000 00000000 88e51669 eadba2c2 09cf3da5 d5f0465c
+ars4x32 10 00000001 00000000 00000000 00000000 00000000 00000000 80000000 00000000 83d8298c cf50434e 604c644b 085b2b3a
+ars4x32 10 00000100 00000000 00000000 00000000 00000000 00000000 80000000 00000000 c31c0ee3 a3e4013f 929d7a3a 251cef6b
+ars4x32 10 00010000 00000000 00000000 00000000 00000000 00000000 80000000 00000000 b2958cdc adf2ca56 298655aa 38dfb0bd
+ars4x32 10 01000000 00000000 00000000 00000000 00000000 00000000 80000000 00000000 8b666be5 6691a603 becb6f7c 4e518093
+ars4x32 10 00000000 00000001 00000000 00000000 00000000 00000000 80000000 00000000 a28133df c529f5e6 cd5f91f9 7d10f299
+ars4x32 10 00000000 00000100 00000000 00000000 00000000 00000000 80000000 00000000 ab9f6d47 eacf9e26 4d2f0c18 a35abd5c
+ars4x32 10 00000000 00010000 00000000 00000000 00000000 00000000 80000000 00000000 abb330b6 de59b743 50f267d1 aad6a67a
+ars4x32 10 00000000 01000000 00000000 00000000 00000000 00000000 80000000 00000000 fb1d5547 79fbc7c9 4e8d3ab8 8250e91c
+ars4x32 10 00000000 00000000 00000001 00000000 00000000 00000000 80000000 00000000 7d0a1025 4c3269bf bb67303f 1443062e
+ars4x32 10 00000000 00000000 00000100 00000000 00000000 00000000 80000000 00000000 c3772324 636a13a2 818cc7da 8e61b8aa
+ars4x32 10 00000000 00000000 00010000 00000000 00000000 00000000 80000000 00000000 0fac38e2 b1f0c476 e266440c f91503a1
+ars4x32 10 00000000 00000000 01000000 00000000 00000000 00000000 80000000 00000000 9547f705 ad06ba30 85e1496f 17ebf7f5
+ars4x32 10 00000000 00000000 00000000 00000001 00000000 00000000 80000000 00000000 26f2e248 bb626483 6cc9da1e 3935acb5
+ars4x32 10 00000000 00000000 00000000 00000100 00000000 00000000 80000000 00000000 6193ea72 dd9179f9 11d5fb2b b3f582f5
+ars4x32 10 00000000 00000000 00000000 00010000 00000000 00000000 80000000 00000000 daa78425 2b6a189a f60338b6 1b561a4f
+ars4x32 10 00000000 00000000 00000000 01000000 00000000 00000000 80000000 00000000 83642eba a4210779 c8e5bedc b835e990
+ars4x32 10 0000ff00 00000000 00000000 00000000 00000000 00000000 80000000 00000000 20989bb9 ced2018e b11a2efb a2c28fe8
+ars4x32 10 00008000 00000000 00000000 00000000 00000000 00000000 80000000 00000000 fbe11e8e 51f48068 2efe8e0c 3ead3383
+ars4x32 10 00ff0000 00000000 00000000 00000000 00000000 00000000 80000000 00000000 2312ca53 57298d29 b524128a 78103575
+ars4x32 10 00800000 00000000 00000000 00000000 00000000 00000000 80000000 00000000 9ce0f6ba 2bef00f8 36c91af0 170c8f5f
+ars4x32 10 ff000000 00000000 00000000 00000000 00000000 00000000 80000000 00000000 92167ad7 7e9e298f f8a3b57c 37f5d192
+ars4x32 10 80000000 00000000 00000000 00000000 00000000 00000000 80000000 00000000 65b750a7 2cf2e7d2 180b35f8 8b26a303
+ars4x32 10 00000000 000000ff 00000000 00000000 00000000 00000000 80000000 00000000 0b38e8b0 5a2c26ae 7e18dc14 ca613f02
+ars4x32 10 00000000 00000080 00000000 00000000 00000000 00000000 80000000 00000000 36c55fa7 649d1c12 f0a73818 660ea1de
+ars4x32 10 00000000 0000ff00 00000000 00000000 00000000 00000000 80000000 00000000 336a6fb3 99c55a04 9c57b111 09cd84fd
+ars4x32 10 00000000 00008000 00000000 00000000 00000000 00000000 80000000 00000000 927aa646 be0db63e 45794f89 d4712587
+ars4x32 10 00000000 00ff0000 00000000 00000000 00000000 00000000 80000000 00000000 85488bc3 6cad29d3 d25bb760 94f43c28
+ars4x32 10 00000000 00800000 00000000 00000000 00000000 00000000 80000000 00000000 3fc3414f d6d0b06b 4c01b8e3 30e2e6de
+ars4x32 10 00000000 ff000000 00000000 00000000 00000000 00000000 80000000 00000000 cdc351e1 db319290 6211914b e9ce9b56
+ars4x32 10 00000000 80000000 00000000 00000000 00000000 00000000 80000000 00000000 12235426 f00d95e3 0350c5b6 f0660a18
+ars4x32 10 00000000 00000000 000000ff 00000000 00000000 00000000 80000000 00000000 907152eb 78604841 c96f8ea5 7031759b
+ars4x32 10 00000000 00000000 00000080 00000000 00000000 00000000 80000000 00000000 6c0eb5d6 9772bd42 6dccfed2 53db859c
+ars4x32 10 00000000 00000000 0000ff00 00000000 00000000 00000000 80000000 00000000 6e69e34c 29510fff 3fe90368 87329159
+ars4x32 10 00000000 00000000 00008000 00000000 00000000 00000000 80000000 00000000 e327d823 6b2d3ecd 544a284b 79686d75
+ars4x32 10 00000000 00000000 00ff0000 00000000 00000000 00000000 80000000 00000000 9ba8cef6 e7f80e0c 4136bed0 12362d9a
+ars4x32 10 00000000 00000000 00800000 00000000 00000000 00000000 80000000 00000000 c0eed7ce 6eaf676a 66cf3cd4 20ee1258
+ars4x32 10 00000000 00000000 ff000000 00000000 00000000 00000000 80000000 00000000 e2a102ed 1306dfbd 18088d73 2ad203b3
+ars4x32 10 00000000 00000000 80000000 00000000 00000000 00000000 80000000 00000000 1f530db1 45344f8c e782dbd5 1a9e476f
+ars4x32 10 00000000 00000000 00000000 000000ff 00000000 00000000 80000000 00000000 4088a06b 4986fe43 0a37c474 99853bc9
+ars4x32 10 00000000 00000000 00000000 00000080 00000000 00000000 80000000 00000000 4a0bfe2d 6d38c858 71d3170e 871c4c6b
+ars4x32 10 00000000 00000000 00000000 0000ff00 00000000 00000000 80000000 00000000 a44728cf 99964d4e 6c11ef52 f261d9b1
+ars4x32 10 00000000 00000000 00000000 00008000 00000000 00000000 80000000 00000000 b7be56a8 29b7eb27 d0713407 1c015d45
+ars4x32 10 00000000 00000000 00000000 00ff0000 00000000 00000000 80000000 00000000 720f816b fc240128 6cf925c1 718ab1cd
+ars4x32 10 00000000 00000000 00000000 00800000 00000000 00000000 80000000 00000000 8d9b5126 ca07da70 04d57bbe 1bdc146f
+ars4x32 10 00000000 00000000 00000000 ff000000 00000000 00000000 80000000 00000000 f209882a cb81e957 d97f320f 03635b68
+ars4x32 10 00000000 00000000 00000000 80000000 00000000 00000000 80000000 00000000 63b7f67b 35533d6a acff5c1d e3c9e3d9
+ars4x32 10 886a3f24 d308a385 2e8a1913 44737003 00000000 00000000 80000000 00000000 7a532752 8f6680af 0db9bfab 0d33bcaa
+ars4x32 10 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000000 80000000 00000000 595aeda6 b34e1b64 0c119a13 00834623
+ars4x32 10 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000000 80000000 00000000 cad2076a 85890ca8 c59dac90 549d1fce
+ars4x32 10 00000001 00000000 00000000 00000000 00000000 00000000 00000000 000000ff 33ffd0ef 0c0babaa 08eb61d8 976b28d3
+ars4x32 10 00000100 00000000 00000000 00000000 00000000 00000000 00000000 000000ff f7e104ab be0b3491 2397b283 b5a861b3
+ars4x32 10 00010000 00000000 00000000 00000000 00000000 00000000 00000000 000000ff 21816f54 5725716b 202fad3e 26c0da69
+ars4x32 10 01000000 00000000 00000000 00000000 00000000 00000000 00000000 000000ff a95bdf5a b791e42f dba8f277 cdaff870
+ars4x32 10 00000000 00000001 00000000 00000000 00000000 00000000 00000000 000000ff 74c668e6 295aa836 671e0057 809aac97
+ars4x32 10 00000000 00000100 00000000 00000000 00000000 00000000 00000000 000000ff 6c80bd64 1cf9a282 e07ae71a b7659073
+ars4x32 10 00000000 00010000 00000000 00000000 00000000 00000000 00000000 000000ff 99c28353 d7142627 6298578b c78e1cb5
+ars4x32 10 00000000 01000000 00000000 00000000 00000000 00000000 00000000 000000ff 4d150fd5 c4c7937e f8eaf05c 47c5de1f
+ars4x32 10 00000000 00000000 00000001 00000000 00000000 00000000 00000000 000000ff bef0c095 25d06762 ea140336 4033cc83
+ars4x32 10 00000000 00000000 00000100 00000000 00000000 00000000 00000000 000000ff 9ab8f614 5f5f8717 53a45bb0 b961b14b
+ars4x32 10 00000000 00000000 00010000 00000000 00000000 00000000 00000000 000000ff b9cc0441 c291dc7b 125608d4 a5e48b9a
+ars4x32 10 00000000 00000000 01000000 00000000 00000000 00000000 00000000 000000ff b20b345f b53497d8 98d069af fdc6ff85
+ars4x32 10 00000000 00000000 00000000 00000001 00000000 00000000 00000000 000000ff 6f4126ba d37262eb 948fc600 e0ad87db
+ars4x32 10 00000000 00000000 00000000 00000100 00000000 00000000 00000000 000000ff ee0a121c e2605764 b4441611 2f6213f9
+ars4x32 10 00000000 00000000 00000000 00010000 00000000 00000000 00000000 000000ff 3ecf3a05 fa6c6c61 e595463f 1dccb524
+ars4x32 10 00000000 00000000 00000000 01000000 00000000 00000000 00000000 000000ff 639dbb7f 92f573e3 fcbf4d49 d9b8a651
+ars4x32 10 0000ff00 00000000 00000000 00000000 00000000 00000000 00000000 000000ff edb11662 f32ccdb4 59b654a0 b4c156d2
+ars4x32 10 00008000 00000000 00000000 00000000 00000000 00000000 00000000 000000ff aab94b97 e10e41b8 caf908ba 26000a72
+ars4x32 10 00ff0000 00000000 00000000 00000000 00000000 00000000 00000000 000000ff 9e14dc32 072a4e95 907bafb9 1d7c7e56
+ars4x32 10 00800000 00000000 00000000 00000000 00000000 00000000 00000000 000000ff 8c8f6c05 2dd2144f 7b4b1890 2d33cd21
+ars4x32 10 ff000000 00000000 00000000 00000000 00000000 00000000 00000000 000000ff 2d70ad73 d2936e08 023a5229 27024f69
+ars4x32 10 80000000 00000000 00000000 00000000 00000000 00000000 00000000 000000ff d198566a 956e9f11 aff6033c b7a1e0d9
+ars4x32 10 00000000 000000ff 00000000 00000000 00000000 00000000 00000000 000000ff 8396e64c f66b5c04 2b3c5067 4984eca2
+ars4x32 10 00000000 00000080 00000000 00000000 00000000 00000000 00000000 000000ff 27a41963 ab27c91b 651acdf0 54996ecc
+ars4x32 10 00000000 0000ff00 00000000 00000000 00000000 00000000 00000000 000000ff 81109c08 9da13963 e6ce44b5 8ebc1ec0
+ars4x32 10 00000000 00008000 00000000 00000000 00000000 00000000 00000000 000000ff 893684a4 c76671cb 5ff2b138 26f596fc
+ars4x32 10 00000000 00ff0000 00000000 00000000 00000000 00000000 00000000 000000ff f270746c 8a659b14 2597b05b b41b8ac6
+ars4x32 10 00000000 00800000 00000000 00000000 00000000 00000000 00000000 000000ff 6fc87a80 b9b202a6 14861218 39aa8048
+ars4x32 10 00000000 ff000000 00000000 00000000 00000000 00000000 00000000 000000ff a3692a84 fd8f8dfa ce1ff290 16f88d25
+ars4x32 10 00000000 80000000 00000000 00000000 00000000 00000000 00000000 000000ff fbb888a1 4e8b803c 6cc94bef ddbef818
+ars4x32 10 00000000 00000000 000000ff 00000000 00000000 00000000 00000000 000000ff c7c4c6a9 c1bf2778 279d1ba1 7960de94
+ars4x32 10 00000000 00000000 00000080 00000000 00000000 00000000 00000000 000000ff 695878ca 94719854 9dd8d82d 99c457d5
+ars4x32 10 00000000 00000000 0000ff00 00000000 00000000 00000000 00000000 000000ff 41445324 58ecb758 96f36169 90bad6e1
+ars4x32 10 00000000 00000000 00008000 00000000 00000000 00000000 00000000 000000ff 260ffa79 d230efab a95ced9a afd4b25c
+ars4x32 10 00000000 00000000 00ff0000 00000000 00000000 00000000 00000000 000000ff 8fdb4fdc de0ca0da 72e24082 764ee577
+ars4x32 10 00000000 00000000 00800000 00000000 00000000 00000000 00000000 000000ff a59adf40 317e08bb 1099c6b6 aa74f87d
+ars4x32 10 00000000 00000000 ff000000 00000000 00000000 00000000 00000000 000000ff 36f8f5dc 512092ae c300df3a 45d4ddab
+ars4x32 10 00000000 00000000 80000000 00000000 00000000 00000000 00000000 000000ff 662321c2 2dc580ec f8c30280 ab2e2d6b
+ars4x32 10 00000000 00000000 00000000 000000ff 00000000 00000000 00000000 000000ff 198bc760 6fd7ee4e 8d5a18fc 49c316be
+ars4x32 10 00000000 00000000 00000000 00000080 00000000 00000000 00000000 000000ff a713a3f0 00daaee4 e3e8d3ec 7a7d7056
+ars4x32 10 00000000 00000000 00000000 0000ff00 00000000 00000000 00000000 000000ff d3633eb7 892b2455 19b1b392 569daedf
+ars4x32 10 00000000 00000000 00000000 00008000 00000000 00000000 00000000 000000ff 7694f06f ffca196c 92b6fcd1 ec177846
+ars4x32 10 00000000 00000000 00000000 00ff0000 00000000 00000000 00000000 000000ff 1c0e34f5 4eee2d80 65980ae9 732c4be2
+ars4x32 10 00000000 00000000 00000000 00800000 00000000 00000000 00000000 000000ff 6c83d21b e14ac358 0d1c78c2 78668cfa
+ars4x32 10 00000000 00000000 00000000 ff000000 00000000 00000000 00000000 000000ff c7b701c2 d2c32a77 fb9f7760 4f5157db
+ars4x32 10 00000000 00000000 00000000 80000000 00000000 00000000 00000000 000000ff 0454b442 2c74a5e4 945a81ac 7f9c1f7b
+ars4x32 10 886a3f24 d308a385 2e8a1913 44737003 00000000 00000000 00000000 000000ff cfdf7117 5c542fd4 92d2a507 81b674aa
+ars4x32 10 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000000 00000000 000000ff 19e70495 cfd13d17 35586663 1249a4ee
+ars4x32 10 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000000 00000000 000000ff df69d37a 0c16d3a1 6b06175c 5c346c58
+ars4x32 10 00000001 00000000 00000000 00000000 00000000 00000000 00000000 00000080 441f8846 7805ddde 01d6501c 66965a55
+ars4x32 10 00000100 00000000 00000000 00000000 00000000 00000000 00000000 00000080 a4ea924d 9333f022 4c005326 811ad481
+ars4x32 10 00010000 00000000 00000000 00000000 00000000 00000000 00000000 00000080 1fff4f86 30488a15 3473582f 24afed44
+ars4x32 10 01000000 00000000 00000000 00000000 00000000 00000000 00000000 00000080 5b178f62 eccaa1aa 4dacef8b e120ecf3
+ars4x32 10 00000000 00000001 00000000 00000000 00000000 00000000 00000000 00000080 888cabaa e962affe d6b811e0 da8998cf
+ars4x32 10 00000000 00000100 00000000 00000000 00000000 00000000 00000000 00000080 01f6e1fa bcfe755b 59f405cb d3b9595d
+ars4x32 10 00000000 00010000 00000000 00000000 00000000 00000000 00000000 00000080 a92c805a 07f594c6 82b56f52 fd277e6c
+ars4x32 10 00000000 01000000 00000000 00000000 00000000 00000000 00000000 00000080 2814dfbf ef7a2f15 a63f540e 951ffd5f
+ars4x32 10 00000000 00000000 00000001 00000000 00000000 00000000 00000000 00000080 916a6b19 5c6539d6 2e042e51 f1067340
+ars4x32 10 00000000 00000000 00000100 00000000 00000000 00000000 00000000 00000080 61bf8f15 b1655376 2e585680 1910fb8d
+ars4x32 10 00000000 00000000 00010000 00000000 00000000 00000000 00000000 00000080 d823be54 c018af09 c83c8aa4 1acb9df7
+ars4x32 10 00000000 00000000 01000000 00000000 00000000 00000000 00000000 00000080 e475a6ec c5af66b1 9728aa88 3f22ffb6
+ars4x32 10 00000000 00000000 00000000 00000001 00000000 00000000 00000000 00000080 0d9f50c5 63a94f4b a5c20fb8 eac1b9c8
+ars4x32 10 00000000 00000000 00000000 00000100 00000000 00000000 00000000 00000080 6668bdc0 ac5a23df 080bc7fa bfdf8622
+ars4x32 10 00000000 00000000 00000000 00010000 00000000 00000000 00000000 00000080 d19d9045 2e79a915 94922bdd 1259c766
+ars4x32 10 00000000 00000000 00000000 01000000 00000000 00000000 00000000 00000080 bceba0f0 68947c27 0161f941 7de2146a
+ars4x32 10 0000ff00 00000000 00000000 00000000 00000000 00000000 00000000 00000080 efc230aa 41961f4d 12330650 a5b27be1
+ars4x32 10 00008000 00000000 00000000 00000000 00000000 00000000 00000000 00000080 438dc33d 39b01218 a0330845 93780676
+ars4x32 10 00ff0000 00000000 00000000 00000000 00000000 00000000 00000000 00000080 38e5e94b 259b59dd f0f5f46a fdb2ea7f
+ars4x32 10 00800000 00000000 00000000 00000000 00000000 00000000 00000000 00000080 e8cef36d 2b604c05 43b6c2a9 26d94cc6
+ars4x32 10 ff000000 00000000 00000000 00000000 00000000 00000000 00000000 00000080 106647b8 cfd28eb1 fd243ed7 89279207
+ars4x32 10 80000000 00000000 00000000 00000000 00000000 00000000 00000000 00000080 cfd7caf8 aa1dc211 f9ceba3f 09b3dde3
+ars4x32 10 00000000 000000ff 00000000 00000000 00000000 00000000 00000000 00000080 b80ba363 35897d3d bd0b0ae1 4a29e020
+ars4x32 10 00000000 00000080 00000000 00000000 00000000 00000000 00000000 00000080 454c62b8 04123d8b 53456512 a9c6eafa
+ars4x32 10 00000000 0000ff00 00000000 00000000 00000000 00000000 00000000 00000080 0d875fd4 3799d4b3 1ef0689a 19775936
+ars4x32 10 00000000 00008000 00000000 00000000 00000000 00000000 00000000 00000080 32793f33 3690320d fc0d04b9 45949259
+ars4x32 10 00000000 00ff0000 00000000 00000000 00000000 00000000 00000000 00000080 bb3e2980 a0b65de2 15bb7894 1c1624d5
+ars4x32 10 00000000 00800000 00000000 00000000 00000000 00000000 00000000 00000080 ee3efec8 3f12e6d5 3856536f 27d8042e
+ars4x32 10 00000000 ff000000 00000000 00000000 00000000 00000000 00000000 00000080 f951b734 5532181d c7e1f51c 3fa0c656
+ars4x32 10 00000000 80000000 00000000 00000000 00000000 00000000 00000000 00000080 0ca4b22f f7dbf66f a5920bf6 b23cf0b5
+ars4x32 10 00000000 00000000 000000ff 00000000 00000000 00000000 00000000 00000080 65e54190 2e8a5593 d8a9213e d5dfc748
+ars4x32 10 00000000 00000000 00000080 00000000 00000000 00000000 00000000 00000080 bee6b5b8 43957076 a6a35191 e559fdbb
+ars4x32 10 00000000 00000000 0000ff00 00000000 00000000 00000000 00000000 00000080 8012169a 0778bf27 46b2b0bd cbab0500
+ars4x32 10 00000000 00000000 00008000 00000000 00000000 00000000 00000000 00000080 9367dea7 e05cf125 dd1e32e1 3b33f515
+ars4x32 10 00000000 00000000 00ff0000 00000000 00000000 00000000 00000000 00000080 dd095a3b b2e80097 1541b57e 963aa5a9
+ars4x32 10 00000000 00000000 00800000 00000000 00000000 00000000 00000000 00000080 d6ec3e16 94364668 5237e175 c07a4ae7
+ars4x32 10 00000000 00000000 ff000000 00000000 00000000 00000000 00000000 00000080 c6479866 eda003f0 c72af0cf 8996bd8d
+ars4x32 10 00000000 00000000 80000000 00000000 00000000 00000000 00000000 00000080 fd76301e d114c666 eaabe38e a2ee1acf
+ars4x32 10 00000000 00000000 00000000 000000ff 00000000 00000000 00000000 00000080 cde36b1a 4bd149c4 49b4af8c bf6ad382
+ars4x32 10 00000000 00000000 00000000 00000080 00000000 00000000 00000000 00000080 e18c881c 7236049b 86ab2a17 7741d079
+ars4x32 10 00000000 00000000 00000000 0000ff00 00000000 00000000 00000000 00000080 a2b1485b 2d362f5d 70e37119 9dfe9263
+ars4x32 10 00000000 00000000 00000000 00008000 00000000 00000000 00000000 00000080 36ac4fcd 0f724248 457ec24f 7e7b9a01
+ars4x32 10 00000000 00000000 00000000 00ff0000 00000000 00000000 00000000 00000080 8a320fae a0ee0eb8 bee52539 d49ca440
+ars4x32 10 00000000 00000000 00000000 00800000 00000000 00000000 00000000 00000080 288480d9 073d5371 23cdb186 7061f0b1
+ars4x32 10 00000000 00000000 00000000 ff000000 00000000 00000000 00000000 00000080 04676afe 9bea090f aa0cf401 25ce78af
+ars4x32 10 00000000 00000000 00000000 80000000 00000000 00000000 00000000 00000080 373bddf2 dc759e42 06e04841 d7933fff
+ars4x32 10 886a3f24 d308a385 2e8a1913 44737003 00000000 00000000 00000000 00000080 0e2f4a16 f57c7ca6 fb4e4e01 bb68b93c
+ars4x32 10 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000000 00000000 00000080 9b3bf539 5e0f2816 95f0b29c b4388b10
+ars4x32 10 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000000 00000000 00000080 36cbd4d4 53867fd4 c5414655 f86902e6
+ars4x32 10 00000001 00000000 00000000 00000000 00000000 00000000 00000000 0000ff00 2980bb5e 3c4ff48b cad6d110 93e28c48
+ars4x32 10 00000100 00000000 00000000 00000000 00000000 00000000 00000000 0000ff00 312e0c21 66863de4 38c7d0c3 0ff3214a
+ars4x32 10 00010000 00000000 00000000 00000000 00000000 00000000 00000000 0000ff00 95b94d16 e22e1a1f 9aa4d3a0 b054e524
+ars4x32 10 01000000 00000000 00000000 00000000 00000000 00000000 00000000 0000ff00 b28a787b bc920c57 3c391390 281e9428
+ars4x32 10 00000000 00000001 00000000 00000000 00000000 00000000 00000000 0000ff00 214588d9 9e5ecced a8fb6fba be9e731b
+ars4x32 10 00000000 00000100 00000000 00000000 00000000 00000000 00000000 0000ff00 eff22c55 84357d81 d153dcd8 bf81cca7
+ars4x32 10 00000000 00010000 00000000 00000000 00000000 00000000 00000000 0000ff00 61c77b2a 98dc4d28 01635a07 616bac16
+ars4x32 10 00000000 01000000 00000000 00000000 00000000 00000000 00000000 0000ff00 5d487e87 4fad2564 633ac064 9ffb8ccf
+ars4x32 10 00000000 00000000 00000001 00000000 00000000 00000000 00000000 0000ff00 a716fa17 d0fdb0e1 0332c62c ae3de920
+ars4x32 10 00000000 00000000 00000100 00000000 00000000 00000000 00000000 0000ff00 34eab877 9414be2a cb17472f f1559987
+ars4x32 10 00000000 00000000 00010000 00000000 00000000 00000000 00000000 0000ff00 46ec8cb1 8ed57197 e14dab1d 71fd3de5
+ars4x32 10 00000000 00000000 01000000 00000000 00000000 00000000 00000000 0000ff00 de09d251 890dbcbe 91552c2f 0969f34e
+ars4x32 10 00000000 00000000 00000000 00000001 00000000 00000000 00000000 0000ff00 c632f05c 217c5375 71edcdba 1f903697
+ars4x32 10 00000000 00000000 00000000 00000100 00000000 00000000 00000000 0000ff00 ad5f4d61 275baa40 837a4ba9 f9bc3b63
+ars4x32 10 00000000 00000000 00000000 00010000 00000000 00000000 00000000 0000ff00 7f9b6db4 cbdb9890 a4e63f50 dbcacc9d
+ars4x32 10 00000000 00000000 00000000 01000000 00000000 00000000 00000000 0000ff00 2a0094a1 23e30b4a 04bb601e bbd3cd3e
+ars4x32 10 0000ff00 00000000 00000000 00000000 00000000 00000000 00000000 0000ff00 f5724c8a 5056e5dc de3df5cd 8b0f7208
+ars4x32 10 00008000 00000000 00000000 00000000 00000000 00000000 00000000 0000ff00 3f47da17 060bf755 978efcee dc6ec630
+ars4x32 10 00ff0000 00000000 00000000 00000000 00000000 00000000 00000000 0000ff00 b166b082 d5fc1935 412a33cc 7fe5bdeb
+ars4x32 10 00800000 00000000 00000000 00000000 00000000 00000000 00000000 0000ff00 ec675656 0518c33b 5724d6d9 2a989266
+ars4x32 10 ff000000 00000000 00000000 00000000 00000000 00000000 00000000 0000ff00 0df3c708 be07f0ea 8736897c 46654b90
+ars4x32 10 80000000 00000000 00000000 00000000 00000000 00000000 00000000 0000ff00 4cdb44f2 4eb10192 85ed84e8 6fed9533
+ars4x32 10 00000000 000000ff 00000000 00000000 00000000 00000000 00000000 0000ff00 5b6ab4a6 8322cd4f 0256450b 250c608f
+ars4x32 10 00000000 00000080 00000000 00000000 00000000 00000000 00000000 0000ff00 f82a8df0 17a68ce6 57e4a9d3 3dd1575f
+ars4x32 10 00000000 0000ff00 00000000 00000000 00000000 00000000 00000000 0000ff00 1cc8256a 95df59dc 63098fae 7866ccc8
+ars4x32 10 00000000 00008000 00000000 00000000 00000000 00000000 00000000 0000ff00 e865b08e 7ddd6871 e3c02bef cd1893f4
+ars4x32 10 00000000 00ff0000 00000000 00000000 00000000 00000000 00000000 0000ff00 2b384e63 a9d3e4d6 ee7258cd e31778f1
+ars4x32 10 00000000 00800000 00000000 00000000 00000000 00000000 00000000 0000ff00 5db3377c e4475048 d82ad1c0 b0ccc4c6
+ars4x32 10 00000000 ff000000 00000000 00000000 00000000 00000000 00000000 0000ff00 25330c24 3fe84857 7a1a5f33 975eaa32
+ars4x32 10 00000000 80000000 00000000 00000000 00000000 00000000 00000000 0000ff00 f4db2e62 af485e1d 4f03d243 c668ad02
+ars4x32 10 00000000 00000000 000000ff 00000000 00000000 00000000 00000000 0000ff00 7ac0fcd2 81cea5e7 a9c50d20 cc6f3d71
+ars4x32 10 00000000 00000000 00000080 00000000 00000000 00000000 00000000 0000ff00 08e5ad77 fcd190c5 ee22854d bb3dbdaa
+ars4x32 10 00000000 00000000 0000ff00 00000000 00000000 00000000 00000000 0000ff00 1cf237e1 ed803394 31ad06dd b9d3def7
+ars4x32 10 00000000 00000000 00008000 00000000 00000000 00000000 00000000 0000ff00 63b7d290 da9032c0 9fa386bf 170e735f
+ars4x32 10 00000000 00000000 00ff0000 00000000 00000000 00000000 00000000 0000ff00 0c9db5ca d9b700e0 9633e409 32e90ccf
+ars4x32 10 00000000 00000000 00800000 00000000 00000000 00000000 00000000 0000ff00 a3596eb4 03a8793a d2046a69 f524015a
+ars4x32 10 00000000 00000000 ff000000 00000000 00000000 00000000 00000000 0000ff00 ce9c088d cac32294 1dcea918 70c68754
+ars4x32 10 00000000 00000000 80000000 00000000 00000000 00000000 00000000 0000ff00 30bf1275 033f5ce0 e5a937cc b8a92a63
+ars4x32 10 00000000 00000000 00000000 000000ff 00000000 00000000 00000000 0000ff00 00f4eadb 2c7de0ff 8cbddde5 100e5989
+ars4x32 10 00000000 00000000 00000000 00000080 00000000 00000000 00000000 0000ff00 07731ecf 8b9e331a 703f296e fec62773
+ars4x32 10 00000000 00000000 00000000 0000ff00 00000000 00000000 00000000 0000ff00 5a5857fe 540171a0 46420351 21377428
+ars4x32 10 00000000 00000000 00000000 00008000 00000000 00000000 00000000 0000ff00 bd1fb099 803e090a 6eae74e5 a6306414
+ars4x32 10 00000000 00000000 00000000 00ff0000 00000000 00000000 00000000 0000ff00 679a91e1 130b9bb9 c4149fe9 3cd42b79
+ars4x32 10 00000000 00000000 00000000 00800000 00000000 00000000 00000000 0000ff00 aa99531d cb58591d 5b8311c6 73dc851d
+ars4x32 10 00000000 00000000 00000000 ff000000 00000000 00000000 00000000 0000ff00 e468fa6d 537601a5 0736eb73 00cdfaf6
+ars4x32 10 00000000 00000000 00000000 80000000 00000000 00000000 00000000 0000ff00 5fea58d2 ffbe434a 6e460b2c f0da2415
+ars4x32 10 886a3f24 d308a385 2e8a1913 44737003 00000000 00000000 00000000 0000ff00 5d9c00e5 0a20546d 438080b5 ac7259a5
+ars4x32 10 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000000 00000000 0000ff00 ed43dcf1 29c33a47 8dc88e14 99a62820
+ars4x32 10 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000000 00000000 0000ff00 c2d4e578 cd384c4d 320ac18d 60eefb71
+ars4x32 10 00000001 00000000 00000000 00000000 00000000 00000000 00000000 00008000 dc5b2a9a 0afef152 4cc6ce2b e496280e
+ars4x32 10 00000100 00000000 00000000 00000000 00000000 00000000 00000000 00008000 ce2452c9 d8746b9c 5fa4b592 676c01f6
+ars4x32 10 00010000 00000000 00000000 00000000 00000000 00000000 00000000 00008000 b2e83580 93092e6f 832452f0 9b71e0ec
+ars4x32 10 01000000 00000000 00000000 00000000 00000000 00000000 00000000 00008000 359a248d e0717f2f 966b85aa 1c3edbae
+ars4x32 10 00000000 00000001 00000000 00000000 00000000 00000000 00000000 00008000 c1498c85 1c5caa7d 927cfa28 c06b49ca
+ars4x32 10 00000000 00000100 00000000 00000000 00000000 00000000 00000000 00008000 bb49de96 49b1c65a 9f592b56 4b9e518a
+ars4x32 10 00000000 00010000 00000000 00000000 00000000 00000000 00000000 00008000 1818ca8d 5f7d9737 1c27d3b0 78dc7efa
+ars4x32 10 00000000 01000000 00000000 00000000 00000000 00000000 00000000 00008000 8e697715 f204f264 3ddbef0f b4d6acf4
+ars4x32 10 00000000 00000000 00000001 00000000 00000000 00000000 00000000 00008000 33792d55 6f3b4039 107ca94d faeb84ad
+ars4x32 10 00000000 00000000 00000100 00000000 00000000 00000000 00000000 00008000 8a1365ce a5573d6b 0d3dca48 70c61ecd
+ars4x32 10 00000000 00000000 00010000 00000000 00000000 00000000 00000000 00008000 3f92ba86 82d9540d 8ccf984e 6af3e6b3
+ars4x32 10 00000000 00000000 01000000 00000000 00000000 00000000 00000000 00008000 257fb510 2f8721de 4fd1b056 3b60363e
+ars4x32 10 00000000 00000000 00000000 00000001 00000000 00000000 00000000 00008000 bb700f86 7bdb19b3 9e11db4a 9beea8a4
+ars4x32 10 00000000 00000000 00000000 00000100 00000000 00000000 00000000 00008000 7ca7cb18 cdb73ae0 b3f297f1 aa17ae2f
+ars4x32 10 00000000 00000000 00000000 00010000 00000000 00000000 00000000 00008000 af439f17 1f7c8397 11fbac69 44eb3140
+ars4x32 10 00000000 00000000 00000000 01000000 00000000 00000000 00000000 00008000 3057672f 5d1f5c34 0f169cc5 a5e63f71
+ars4x32 10 0000ff00 00000000 00000000 00000000 00000000 00000000 00000000 00008000 56544e93 500aece7 58e47d5e f1a52735
+ars4x32 10 00008000 00000000 00000000 00000000 00000000 00000000 00000000 00008000 96b33f5d a134b4bc 91a8ebe8 7b23e4f0
+ars4x32 10 00ff0000 00000000 00000000 00000000 00000000 00000000 00000000 00008000 58c3c3ea 00fe987a cafbc39d d9c48178
+ars4x32 10 00800000 00000000 00000000 00000000 00000000 00000000 00000000 00008000 e420e4dd 6f693315 ac6f48be 9ef6d10c
+ars4x32 10 ff000000 00000000 00000000 00000000 00000000 00000000 00000000 00008000 86df5e20 f9559125 215f0b08 f5d3929e
+ars4x32 10 80000000 00000000 00000000 00000000 00000000 00000000 00000000 00008000 bb31badd c2618da6 d23fb278 b4bd3d10
+ars4x32 10 00000000 000000ff 00000000 00000000 00000000 00000000 00000000 00008000 8bac757b 5a3083a8 069c44d6 9174a0d0
+ars4x32 10 00000000 00000080 00000000 00000000 00000000 00000000 00000000 00008000 fe734946 d39c1fba 7f1ff519 15307785
+ars4x32 10 00000000 0000ff00 00000000 00000000 00000000 00000000 00000000 00008000 8a37c599 ec59f39b 44998ae3 0d5a394f
+ars4x32 10 00000000 00008000 00000000 00000000 00000000 00000000 00000000 00008000 4efca554 eb7e76b7 cd2d9623 36f0afe2
+ars4x32 10 00000000 00ff0000 00000000 00000000 00000000 00000000 00000000 00008000 8333d78e 5737cb50 1a0885ac c203ece1
+ars4x32 10 00000000 00800000 00000000 00000000 00000000 00000000 00000000 00008000 fc690244 15cf363a 503e643d 69a79d4d
+ars4x32 10 00000000 ff000000 00000000 00000000 00000000 00000000 00000000 00008000 31b20472 166c52bc 5b63968a 47133bce
+ars4x32 10 00000000 80000000 00000000 00000000 00000000 00000000 00000000 00008000 cd8574d8 1b115532 65daa911 706930fb
+ars4x32 10 00000000 00000000 000000ff 00000000 00000000 00000000 00000000 00008000 09ab4d96 2da926c6 e65bd1bd e1880ac9
+ars4x32 10 00000000 00000000 00000080 00000000 00000000 00000000 00000000 00008000 6dcb3eed 584a0e60 96dd3d0f 16fcef9b
+ars4x32 10 00000000 00000000 0000ff00 00000000 00000000 00000000 00000000 00008000 e3b63fa1 394cfae6 31d34bef ea6c7ba0
+ars4x32 10 00000000 00000000 00008000 00000000 00000000 00000000 00000000 00008000 51cb0477 5d484017 9e5a14ab e071ad23
+ars4x32 10 00000000 00000000 00ff0000 00000000 00000000 00000000 00000000 00008000 e7245aaf 0cd8556a 94525c59 cc84d991
+ars4x32 10 00000000 00000000 00800000 00000000 00000000 00000000 00000000 00008000 8561b8e7 af8a34ce f8be98d5 a68da87d
+ars4x32 10 00000000 00000000 ff000000 00000000 00000000 00000000 00000000 00008000 df20f930 275651ce a922c02b 4600bae3
+ars4x32 10 00000000 00000000 80000000 00000000 00000000 00000000 00000000 00008000 c067bc44 05061760 bf3b3abb 5f40267d
+ars4x32 10 00000000 00000000 00000000 000000ff 00000000 00000000 00000000 00008000 414f2d26 020e128c 4baea3f5 8bf858bf
+ars4x32 10 00000000 00000000 00000000 00000080 00000000 00000000 00000000 00008000 68c2b324 825c48dd 9a314db8 d03c0fbc
+ars4x32 10 00000000 00000000 00000000 0000ff00 00000000 00000000 00000000 00008000 81fc8b30 4c30c6f9 8c1303e7 1ce78a18
+ars4x32 10 00000000 00000000 00000000 00008000 00000000 00000000 00000000 00008000 31b85719 f187d654 09b1e0f6 b24a59aa
+ars4x32 10 00000000 00000000 00000000 00ff0000 00000000 00000000 00000000 00008000 ce669498 81c6a9b3 b7decc86 0568f8a7
+ars4x32 10 00000000 00000000 00000000 00800000 00000000 00000000 00000000 00008000 24293624 33cf83ee c99ade5a 4f6dbc01
+ars4x32 10 00000000 00000000 00000000 ff000000 00000000 00000000 00000000 00008000 699467f0 602914f1 73dba5fd 6e518a1a
+ars4x32 10 00000000 00000000 00000000 80000000 00000000 00000000 00000000 00008000 6e06bb5b 94088181 b8d7177c 8817e9c1
+ars4x32 10 886a3f24 d308a385 2e8a1913 44737003 00000000 00000000 00000000 00008000 2042d92e 54aa35dd 35ce06ee 5d805f84
+ars4x32 10 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000000 00000000 00008000 ef8a0eb8 d41d547f 0b2f495d 97f37acd
+ars4x32 10 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000000 00000000 00008000 3933029f d9cf9fe5 59ce01da d11c35c8
+ars4x32 10 00000001 00000000 00000000 00000000 00000000 00000000 00000000 00ff0000 f3f46196 d11cae53 af61b8ee b22e6b3b
+ars4x32 10 00000100 00000000 00000000 00000000 00000000 00000000 00000000 00ff0000 6f3d9f29 76c3e022 e3727918 d589dc6d
+ars4x32 10 00010000 00000000 00000000 00000000 00000000 00000000 00000000 00ff0000 6b0e18a2 5ac5b5df 25fb5583 e3bf3c7c
+ars4x32 10 01000000 00000000 00000000 00000000 00000000 00000000 00000000 00ff0000 5b4c73fe 0b3f41ed 9ac98d5c baa8d82e
+ars4x32 10 00000000 00000001 00000000 00000000 00000000 00000000 00000000 00ff0000 a7049b58 deb285fc fc21d230 5f1c6147
+ars4x32 10 00000000 00000100 00000000 00000000 00000000 00000000 00000000 00ff0000 bfac55f9 02b0f828 807285e5 0376257a
+ars4x32 10 00000000 00010000 00000000 00000000 00000000 00000000 00000000 00ff0000 6c736849 eec20a20 77b2b107 55fa1de7
+ars4x32 10 00000000 01000000 00000000 00000000 00000000 00000000 00000000 00ff0000 d27272c1 85c6ff05 8567961f 74443e44
+ars4x32 10 00000000 00000000 00000001 00000000 00000000 00000000 00000000 00ff0000 da91acd2 71d9a6be 033ac1c4 12f26984
+ars4x32 10 00000000 00000000 00000100 00000000 00000000 00000000 00000000 00ff0000 626813a9 ce47f3d6 96d92c2d fa083734
+ars4x32 10 00000000 00000000 00010000 00000000 00000000 00000000 00000000 00ff0000 6225c1f8 1d45b19f 5176e440 b3ca458e
+ars4x32 10 00000000 00000000 01000000 00000000 00000000 00000000 00000000 00ff0000 5460ea28 b640c053 77469753 bee6cff7
+ars4x32 10 00000000 00000000 00000000 00000001 00000000 00000000 00000000 00ff0000 d2c422dd 3010efc5 b202f5d0 be05c6dd
+ars4x32 10 00000000 00000000 00000000 00000100 00000000 00000000 00000000 00ff0000 be9431a7 0911a5a4 bd2abe83 612f8586
+ars4x32 10 00000000 00000000 00000000 00010000 00000000 00000000 00000000 00ff0000 fb686a25 4ff2114c deb1c3b9 854ee3db
+ars4x32 10 00000000 00000000 00000000 01000000 00000000 00000000 00000000 00ff0000 61791f3a eda4ed85 0fef769c 8cb219ab
+ars4x32 10 0000ff00 00000000 00000000 00000000 00000000 00000000 00000000 00ff0000 662d6593 0dd2a51f 3df30975 881ae692
+ars4x32 10 00008000 00000000 00000000 00000000 00000000 00000000 00000000 00ff0000 b572dd2f b403b910 ddade016 68524bf8
+ars4x32 10 00ff0000 00000000 00000000 00000000 00000000 00000000 00000000 00ff0000 02df66b2 6844e2d4 c6a601ad 678e8471
+ars4x32 10 00800000 00000000 00000000 00000000 00000000 00000000 00000000 00ff0000 965e9a17 6141df53 2472c9e7 a2e94bb7
+ars4x32 10 ff000000 00000000 00000000 00000000 00000000 00000000 00000000 00ff0000 f7cfcaac f631f03d 78328e33 6c26b793
+ars4x32 10 80000000 00000000 00000000 00000000 00000000 00000000 00000000 00ff0000 93788181 6d25b373 cead0033 6ff7a44e
+ars4x32 10 00000000 000000ff 00000000 00000000 00000000 00000000 00000000 00ff0000 ae37fdd7 fdc156be 92955610 b13722b1
+ars4x32 10 00000000 00000080 00000000 00000000 00000000 00000000 00000000 00ff0000 4fce4684 22a96286 952f4e4b 974e97b3
+ars4x32 10 00000000 0000ff00 00000000 00000000 00000000 00000000 00000000 00ff0000 c6b16976 fd2c1fd0 b86c0899 d95ed223
+ars4x32 10 00000000 00008000 00000000 00000000 00000000 00000000 00000000 00ff0000 65129760 4c61b126 df0dd04d 8322c305
+ars4x32 10 00000000 00ff0000 00000000 00000000 00000000 00000000 00000000 00ff0000 04764b97 84f92827 1d8e42ab 162444fe
+ars4x32 10 00000000 00800000 00000000 00000000 00000000 00000000 00000000 00ff0000 8d08195b 8c7198d2 31d048ae df36c78e
+ars4x32 10 00000000 ff000000 00000000 00000000 00000000 00000000 00000000 00ff0000 7935ec55 74893e0a a38f531e e93402af
+ars4x32 10 00000000 80000000 00000000 00000000 00000000 00000000 00000000 00ff0000 c699a874 35cc0a22 acfd92ad 15dc044d
+ars4x32 10 00000000 00000000 000000ff 00000000 00000000 00000000 00000000 00ff0000 36fdddcc c9359a1d c2ac1dda 0db7e34f
+ars4x32 10 00000000 00000000 00000080 00000000 00000000 00000000 00000000 00ff0000 0e96dfbd 0f307501 8e70f586 dcf688d7
+ars4x32 10 00000000 00000000 0000ff00 00000000 00000000 00000000 00000000 00ff0000 8c821ea2 8f488d76 4f271e49 74890070
+ars4x32 10 00000000 00000000 00008000 00000000 00000000 00000000 00000000 00ff0000 d7c029b3 94aaf818 dbfa13c3 b7d8435c
+ars4x32 10 00000000 00000000 00ff0000 00000000 00000000 00000000 00000000 00ff0000 851d7dfc b9cb6acb cc3bda81 056f06ea
+ars4x32 10 00000000 00000000 00800000 00000000 00000000 00000000 00000000 00ff0000 86837cdc d5bba7d9 938abbda e8ab258d
+ars4x32 10 00000000 00000000 ff000000 00000000 00000000 00000000 00000000 00ff0000 ef8a2b6d 2bd164f7 ee06fc74 203fc944
+ars4x32 10 00000000 00000000 80000000 00000000 00000000 00000000 00000000 00ff0000 6f19f017 3b4ef67c 7be9a3c8 f858e684
+ars4x32 10 00000000 00000000 00000000 000000ff 00000000 00000000 00000000 00ff0000 f50a6906 d1d32a39 dc3756c6 c36cadad
+ars4x32 10 00000000 00000000 00000000 00000080 00000000 00000000 00000000 00ff0000 0842f1d8 db7fffdc def8c50c 6693b706
+ars4x32 10 00000000 00000000 00000000 0000ff00 00000000 00000000 00000000 00ff0000 bdf4fcbd 8bc60f49 55d3d3f5 bc6333cc
+ars4x32 10 00000000 00000000 00000000 00008000 00000000 00000000 00000000 00ff0000 7105df6e f5ffee84 b5137ddf 6aef0f35
+ars4x32 10 00000000 00000000 00000000 00ff0000 00000000 00000000 00000000 00ff0000 c1f4a96d cadeb327 221fba3b c64dc031
+ars4x32 10 00000000 00000000 00000000 00800000 00000000 00000000 00000000 00ff0000 442c7b1b 65ce7736 338602d5 5cabab3f
+ars4x32 10 00000000 00000000 00000000 ff000000 00000000 00000000 00000000 00ff0000 be3e7800 996bba5f 58e5821e 4e4924e3
+ars4x32 10 00000000 00000000 00000000 80000000 00000000 00000000 00000000 00ff0000 7d1317c5 2d1e0b31 2bd4b871 a4cf6b92
+ars4x32 10 886a3f24 d308a385 2e8a1913 44737003 00000000 00000000 00000000 00ff0000 53c36f2d 8d53f6ef 53113e46 04a659e0
+ars4x32 10 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000000 00000000 00ff0000 3c543e7c 261edcd4 726dfbf3 c8d99a69
+ars4x32 10 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000000 00000000 00ff0000 ea418a97 139c31e5 ac9b19ba aa538a8e
+ars4x32 10 00000001 00000000 00000000 00000000 00000000 00000000 00000000 00800000 42046aaf b91498a5 6a259a16 b3eb3a2e
+ars4x32 10 00000100 00000000 00000000 00000000 00000000 00000000 00000000 00800000 fd625108 b17ba275 97886513 21ad40a9
+ars4x32 10 00010000 00000000 00000000 00000000 00000000 00000000 00000000 00800000 aafef5bb 62b249f9 8b0aa44f 45e468f8
+ars4x32 10 01000000 00000000 00000000 00000000 00000000 00000000 00000000 00800000 ec330007 44aa0288 25be9228 d5f8e13f
+ars4x32 10 00000000 00000001 00000000 00000000 00000000 00000000 00000000 00800000 673aceb7 7ca9ae9f d83907e6 7e9256bc
+ars4x32 10 00000000 00000100 00000000 00000000 00000000 00000000 00000000 00800000 5676e018 edcf0a72 bea8a741 f795cda6
+ars4x32 10 00000000 00010000 00000000 00000000 00000000 00000000 00000000 00800000 6d5d7593 d401b974 6a0f1bba ed12286c
+ars4x32 10 00000000 01000000 00000000 00000000 00000000 00000000 00000000 00800000 0ae1d756 b94312b5 5675a578 5b4a46c4
+ars4x32 10 00000000 00000000 00000001 00000000 00000000 00000000 00000000 00800000 1bd24cc0 e8080a9d 0ecbb72b f3a76d57
+ars4x32 10 00000000 00000000 00000100 00000000 00000000 00000000 00000000 00800000 3966784c 7dc969a3 44eb558b 8961e6dd
+ars4x32 10 00000000 00000000 00010000 00000000 00000000 00000000 00000000 00800000 73b4879c eace0901 4cc1cafb 8553c489
+ars4x32 10 00000000 00000000 01000000 00000000 00000000 00000000 00000000 00800000 e80a74ba 362da2ef ef2d5659 e533ba90
+ars4x32 10 00000000 00000000 00000000 00000001 00000000 00000000 00000000 00800000 5e55ee55 3f4e0282 031ca33c 21b48f8e
+ars4x32 10 00000000 00000000 00000000 00000100 00000000 00000000 00000000 00800000 93f70128 e5821be3 50409b66 0897ccad
+ars4x32 10 00000000 00000000 00000000 00010000 00000000 00000000 00000000 00800000 bd19830e a5960c21 7fd3aa66 147d3108
+ars4x32 10 00000000 00000000 00000000 01000000 00000000 00000000 00000000 00800000 91808867 737d2300 62bfc781 9de2d107
+ars4x32 10 0000ff00 00000000 00000000 00000000 00000000 00000000 00000000 00800000 3771eb8b c3b77eed e250ecf5 5c5eb4fd
+ars4x32 10 00008000 00000000 00000000 00000000 00000000 00000000 00000000 00800000 f09b7b64 56f85b75 f6bf2b80 9b0cc239
+ars4x32 10 00ff0000 00000000 00000000 00000000 00000000 00000000 00000000 00800000 93139c5c 96ccedb3 8b7391ff d0119d20
+ars4x32 10 00800000 00000000 00000000 00000000 00000000 00000000 00000000 00800000 a59252d0 3c860eaf b7ad1fc4 f978a8d1
+ars4x32 10 ff000000 00000000 00000000 00000000 00000000 00000000 00000000 00800000 159c5ad0 8d3752f2 5e4e902d c0e4e886
+ars4x32 10 80000000 00000000 00000000 00000000 00000000 00000000 00000000 00800000 8aa631f8 069ae5ab 0008b3f9 60404759
+ars4x32 10 00000000 000000ff 00000000 00000000 00000000 00000000 00000000 00800000 a34f31cb 506b2397 89f24851 e15455d3
+ars4x32 10 00000000 00000080 00000000 00000000 00000000 00000000 00000000 00800000 aa3133ac 1e2abffd ba03d968 7fd7861c
+ars4x32 10 00000000 0000ff00 00000000 00000000 00000000 00000000 00000000 00800000 19d0a84f f97c0cec b2524039 aaffe800
+ars4x32 10 00000000 00008000 00000000 00000000 00000000 00000000 00000000 00800000 c2ea9b6d 27c10f71 a6896dfd 2050fcac
+ars4x32 10 00000000 00ff0000 00000000 00000000 00000000 00000000 00000000 00800000 ec8aa5b3 cb97a73e 7aaf19c1 035d9258
+ars4x32 10 00000000 00800000 00000000 00000000 00000000 00000000 00000000 00800000 50da963d 0e7a7178 5953710a b025b96f
+ars4x32 10 00000000 ff000000 00000000 00000000 00000000 00000000 00000000 00800000 b4b91bc5 628a3b09 8187bf2c d218b973
+ars4x32 10 00000000 80000000 00000000 00000000 00000000 00000000 00000000 00800000 e701a2de fe5f816a 76ae8ffa f5e8a4d7
+ars4x32 10 00000000 00000000 000000ff 00000000 00000000 00000000 00000000 00800000 c851d186 92d4ae9d 8ebd58d4 beb32d60
+ars4x32 10 00000000 00000000 00000080 00000000 00000000 00000000 00000000 00800000 44b837e3 8f5d1220 465dce59 4beb067f
+ars4x32 10 00000000 00000000 0000ff00 00000000 00000000 00000000 00000000 00800000 312dfdd7 dc15914d d3365f15 bae1edcb
+ars4x32 10 00000000 00000000 00008000 00000000 00000000 00000000 00000000 00800000 ae8c17d8 1a855cba 066ecafc abd9a392
+ars4x32 10 00000000 00000000 00ff0000 00000000 00000000 00000000 00000000 00800000 35caf6a0 b779a7e5 963fd0f5 530f640c
+ars4x32 10 00000000 00000000 00800000 00000000 00000000 00000000 00000000 00800000 44ec39e9 1b7bc783 34a68e2a 216e372c
+ars4x32 10 00000000 00000000 ff000000 00000000 00000000 00000000 00000000 00800000 b92eb27e e15ccf20 df0da553 3d94e19b
+ars4x32 10 00000000 00000000 80000000 00000000 00000000 00000000 00000000 00800000 e9f64c3a fe517c12 13b493f4 606fbfbb
+ars4x32 10 00000000 00000000 00000000 000000ff 00000000 00000000 00000000 00800000 d4ae37ff b9d776d0 7dd5d17b 1c692adc
+ars4x32 10 00000000 00000000 00000000 00000080 00000000 00000000 00000000 00800000 18d6c6fc 95ca9ec2 efbb03cd 45efbadf
+ars4x32 10 00000000 00000000 00000000 0000ff00 00000000 00000000 00000000 00800000 5cdc4bd5 ad3f779d 2e66cd6e 3d02b112
+ars4x32 10 00000000 00000000 00000000 00008000 00000000 00000000 00000000 00800000 02baadd8 220a382f 810b2330 81b9b93c
+ars4x32 10 00000000 00000000 00000000 00ff0000 00000000 00000000 00000000 00800000 37e2e70a ee2871ac 2a5a8ac9 cc44e32b
+ars4x32 10 00000000 00000000 00000000 00800000 00000000 00000000 00000000 00800000 3eceab21 6056d03c 8c05d55e e088c124
+ars4x32 10 00000000 00000000 00000000 ff000000 00000000 00000000 00000000 00800000 4fc8c7bc 3d1c046d 275bc435 81346eab
+ars4x32 10 00000000 00000000 00000000 80000000 00000000 00000000 00000000 00800000 6659edac 26290dd5 0a3e3455 b31a2be3
+ars4x32 10 886a3f24 d308a385 2e8a1913 44737003 00000000 00000000 00000000 00800000 e6c0191d 261dcebc d41bbe82 8e6e9730
+ars4x32 10 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000000 00000000 00800000 197b4a3b ef928010 96e75bd3 a2d1e856
+ars4x32 10 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000000 00000000 00800000 e7b8e74d 038826eb 03a47ad1 4ac33455
+ars4x32 10 00000001 00000000 00000000 00000000 00000000 00000000 00000000 ff000000 27b00d10 76eeb5fe 30fea418 02742412
+ars4x32 10 00000100 00000000 00000000 00000000 00000000 00000000 00000000 ff000000 fd72843d 364facaf 6f610ab5 a3b54a17
+ars4x32 10 00010000 00000000 00000000 00000000 00000000 00000000 00000000 ff000000 77e3bb3f 612cad81 f7568471 a28cf424
+ars4x32 10 01000000 00000000 00000000 00000000 00000000 00000000 00000000 ff000000 c516b0a8 c9b2ac37 8386050b 7ab691ff
+ars4x32 10 00000000 00000001 00000000 00000000 00000000 00000000 00000000 ff000000 35c207f6 29adeb17 53c324da 2ee41036
+ars4x32 10 00000000 00000100 00000000 00000000 00000000 00000000 00000000 ff000000 64d4c6f5 51a9f791 99290f8e 5dadfe9f
+ars4x32 10 00000000 00010000 00000000 00000000 00000000 00000000 00000000 ff000000 06395df1 78ef47c2 3611e5d3 c858d573
+ars4x32 10 00000000 01000000 00000000 00000000 00000000 00000000 00000000 ff000000 2db4b9d2 48766956 84e31755 75eff4b7
+ars4x32 10 00000000 00000000 00000001 00000000 00000000 00000000 00000000 ff000000 f7a2dafc 4227e584 db7eb815 fc23888e
+ars4x32 10 00000000 00000000 00000100 00000000 00000000 00000000 00000000 ff000000 8241b04f 294be7c6 77da5fbc 1d297fe7
+ars4x32 10 00000000 00000000 00010000 00000000 00000000 00000000 00000000 ff000000 9f195b14 d92996f6 ccf2d097 282d3d82
+ars4x32 10 00000000 00000000 01000000 00000000 00000000 00000000 00000000 ff000000 8c03f471 c325a44e af4cf54d 818945ac
+ars4x32 10 00000000 00000000 00000000 00000001 00000000 00000000 00000000 ff000000 538b8502 3da680b4 4ba5207a ff17a65e
+ars4x32 10 00000000 00000000 00000000 00000100 00000000 00000000 00000000 ff000000 0bbf6ebf 277560b4 ebcbc2eb 62cf1bd2
+ars4x32 10 00000000 00000000 00000000 00010000 00000000 00000000 00000000 ff000000 00e77ac0 277dc0dc 2323de1e c4d15453
+ars4x32 10 00000000 00000000 00000000 01000000 00000000 00000000 00000000 ff000000 e679e1e6 78b4356b d50ac033 7ba1b8ef
+ars4x32 10 0000ff00 00000000 00000000 00000000 00000000 00000000 00000000 ff000000 76d2f408 b92d7e94 15ef11ff fc6057c4
+ars4x32 10 00008000 00000000 00000000 00000000 00000000 00000000 00000000 ff000000 c69cb78e 69407a3c 4fe5a98a b278c6b9
+ars4x32 10 00ff0000 00000000 00000000 00000000 00000000 00000000 00000000 ff000000 4952fdd0 05239ddb b842ce7d f3707c1f
+ars4x32 10 00800000 00000000 00000000 00000000 00000000 00000000 00000000 ff000000 e93dbade d6ad32cd 0cedc6e8 dbe27d0d
+ars4x32 10 ff000000 00000000 00000000 00000000 00000000 00000000 00000000 ff000000 d418902a e8718bef 411592de 89d0b3f6
+ars4x32 10 80000000 00000000 00000000 00000000 00000000 00000000 00000000 ff000000 f0c0139a 4cecb0b3 3dd22f10 82a32996
+ars4x32 10 00000000 000000ff 00000000 00000000 00000000 00000000 00000000 ff000000 6879fd3b dcd3090c cd76e918 9763aa16
+ars4x32 10 00000000 00000080 00000000 00000000 00000000 00000000 00000000 ff000000 006ca0cb 05501fdb 5b52dd6d 659411d8
+ars4x32 10 00000000 0000ff00 00000000 00000000 00000000 00000000 00000000 ff000000 0148bb9c dd798f1a 510eb47b 20046ca7
+ars4x32 10 00000000 00008000 00000000 00000000 00000000 00000000 00000000 ff000000 b8bd5381 14cda4be 07e491e2 36e08dc9
+ars4x32 10 00000000 00ff0000 00000000 00000000 00000000 00000000 00000000 ff000000 882d166f f0c359dc b21dc4a4 053a5ee3
+ars4x32 10 00000000 00800000 00000000 00000000 00000000 00000000 00000000 ff000000 301a4295 e655143d 6dd028ad fedda3ac
+ars4x32 10 00000000 ff000000 00000000 00000000 00000000 00000000 00000000 ff000000 688a4524 7aaabc09 25b5a1b5 08088fa9
+ars4x32 10 00000000 80000000 00000000 00000000 00000000 00000000 00000000 ff000000 c17b1d49 cc5607a9 21ee2dfe 95a99bff
+ars4x32 10 00000000 00000000 000000ff 00000000 00000000 00000000 00000000 ff000000 2aced990 38892fc6 49e2b4c6 3a52a56f
+ars4x32 10 00000000 00000000 00000080 00000000 00000000 00000000 00000000 ff000000 0fa8f694 e50536aa 8b05a5ea 30391e50
+ars4x32 10 00000000 00000000 0000ff00 00000000 00000000 00000000 00000000 ff000000 ede36e48 e2d7501d 0fbdb070 d7611f60
+ars4x32 10 00000000 00000000 00008000 00000000 00000000 00000000 00000000 ff000000 ed6e7836 13d33ce8 2ec70ea2 4b7458e3
+ars4x32 10 00000000 00000000 00ff0000 00000000 00000000 00000000 00000000 ff000000 6180aae3 f456e639 31a87e11 c85999b0
+ars4x32 10 00000000 00000000 00800000 00000000 00000000 00000000 00000000 ff000000 b0f72296 b437656f 0c6c13af 42269ae3
+ars4x32 10 00000000 00000000 ff000000 00000000 00000000 00000000 00000000 ff000000 8992f96a 38f12202 b145b3e0 4b22b7df
+ars4x32 10 00000000 00000000 80000000 00000000 00000000 00000000 00000000 ff000000 e3266f68 75e172c8 4e627e57 2f18974e
+ars4x32 10 00000000 00000000 00000000 000000ff 00000000 00000000 00000000 ff000000 43f0eb04 f210d529 0a8bf0ce 38681023
+ars4x32 10 00000000 00000000 00000000 00000080 00000000 00000000 00000000 ff000000 8bc32dfc 73fda05d 6150a6a3 55f1806c
+ars4x32 10 00000000 00000000 00000000 0000ff00 00000000 00000000 00000000 ff000000 cc8357d2 581e8348 460a644c 509d3ec2
+ars4x32 10 00000000 00000000 00000000 00008000 00000000 00000000 00000000 ff000000 3e3698b8 c03b8b6f 1fca337d e8290c22
+ars4x32 10 00000000 00000000 00000000 00ff0000 00000000 00000000 00000000 ff000000 cf661d8e f1adc07c c6751ffb 2b670e1e
+ars4x32 10 00000000 00000000 00000000 00800000 00000000 00000000 00000000 ff000000 8b05dbd5 3cb2ff22 fdd8ce3b f863a7e6
+ars4x32 10 00000000 00000000 00000000 ff000000 00000000 00000000 00000000 ff000000 8cb4ba53 7ed4b1f4 75c5c0b3 2df76a1a
+ars4x32 10 00000000 00000000 00000000 80000000 00000000 00000000 00000000 ff000000 3eef466a 0224052f acd47be6 9aba9889
+ars4x32 10 886a3f24 d308a385 2e8a1913 44737003 00000000 00000000 00000000 ff000000 73fb0705 020ccd4e 85f36527 d8c79692
+ars4x32 10 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000000 00000000 ff000000 2c3fe25f 3a57e7ee bc1827bd 6b3d18b0
+ars4x32 10 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000000 00000000 ff000000 8bbcd0b2 6ee1140a 73e65601 21fb1ba7
+ars4x32 10 00000001 00000000 00000000 00000000 00000000 00000000 00000000 80000000 fb029bde c66dcda0 d5e37e9e b16153f4
+ars4x32 10 00000100 00000000 00000000 00000000 00000000 00000000 00000000 80000000 c8628b14 65dd32ad 9df2d576 84590ee0
+ars4x32 10 00010000 00000000 00000000 00000000 00000000 00000000 00000000 80000000 56abd8fd 08eb9fbe c7c0e3ef 7ebe6a02
+ars4x32 10 01000000 00000000 00000000 00000000 00000000 00000000 00000000 80000000 86d7ca0a 10293363 a91e2acf 41cb60cd
+ars4x32 10 00000000 00000001 00000000 00000000 00000000 00000000 00000000 80000000 2cbc07ec 78f6ebc0 e178d485 e1bd2a79
+ars4x32 10 00000000 00000100 00000000 00000000 00000000 00000000 00000000 80000000 fc0dd527 5525a559 b82ec796 3fce8b27
+ars4x32 10 00000000 00010000 00000000 00000000 00000000 00000000 00000000 80000000 35f94c49 dcec4494 b32b5591 607c35ae
+ars4x32 10 00000000 01000000 00000000 00000000 00000000 00000000 00000000 80000000 223ecea6 9c6b82b9 8cda2ead fbdb3669
+ars4x32 10 00000000 00000000 00000001 00000000 00000000 00000000 00000000 80000000 60302545 19be4945 ed1f61af 47ed7642
+ars4x32 10 00000000 00000000 00000100 00000000 00000000 00000000 00000000 80000000 1e3c6ed3 1a6d28f8 e927216b 6983fe5f
+ars4x32 10 00000000 00000000 00010000 00000000 00000000 00000000 00000000 80000000 64ec8748 bc735a79 154db177 98d6e304
+ars4x32 10 00000000 00000000 01000000 00000000 00000000 00000000 00000000 80000000 eb8dbaaa c8d657ba 157635c4 cd8027b1
+ars4x32 10 00000000 00000000 00000000 00000001 00000000 00000000 00000000 80000000 006d78b1 3240f565 1591df9a 3920f3a9
+ars4x32 10 00000000 00000000 00000000 00000100 00000000 00000000 00000000 80000000 e63ae4b3 f4a20e6a b06cb99c ab9ebae3
+ars4x32 10 00000000 00000000 00000000 00010000 00000000 00000000 00000000 80000000 0d0a1f5f 8b52c922 b655a04d 154509fb
+ars4x32 10 00000000 00000000 00000000 01000000 00000000 00000000 00000000 80000000 4f955239 57ea76d1 2ed261e8 6665c61f
+ars4x32 10 0000ff00 00000000 00000000 00000000 00000000 00000000 00000000 80000000 167a4885 bdd9d560 44901710 a1db3fef
+ars4x32 10 00008000 00000000 00000000 00000000 00000000 00000000 00000000 80000000 01303e4d cc35c236 602a988b 67b25d16
+ars4x32 10 00ff0000 00000000 00000000 00000000 00000000 00000000 00000000 80000000 d59d1ae1 201cf528 ca644f98 c863c919
+ars4x32 10 00800000 00000000 00000000 00000000 00000000 00000000 00000000 80000000 a64ddf44 b9181f8f 08467b4c 0bddb7e5
+ars4x32 10 ff000000 00000000 00000000 00000000 00000000 00000000 00000000 80000000 1803efc8 007c2e15 25833640 8e7345c3
+ars4x32 10 80000000 00000000 00000000 00000000 00000000 00000000 00000000 80000000 5a9b7d60 6ea2901e 78003e60 8942fbf4
+ars4x32 10 00000000 000000ff 00000000 00000000 00000000 00000000 00000000 80000000 29d3113a 43eaba4a 2758c58e 8fff4986
+ars4x32 10 00000000 00000080 00000000 00000000 00000000 00000000 00000000 80000000 c403cb6c b87ce89f ddc5a406 eb5c0ea4
+ars4x32 10 00000000 0000ff00 00000000 00000000 00000000 00000000 00000000 80000000 e7c4b1fa b544220c f4049712 84c85034
+ars4x32 10 00000000 00008000 00000000 00000000 00000000 00000000 00000000 80000000 dea49ca5 785d289e f24509fb 37a561d4
+ars4x32 10 00000000 00ff0000 00000000 00000000 00000000 00000000 00000000 80000000 39a9c229 b37e81f3 25136a6b 31f8df5d
+ars4x32 10 00000000 00800000 00000000 00000000 00000000 00000000 00000000 80000000 c6a48363 d638f93c 0f7e20a0 2aa2107f
+ars4x32 10 00000000 ff000000 00000000 00000000 00000000 00000000 00000000 80000000 6e32daa1 77487aa8 981c7542 45c89ac2
+ars4x32 10 00000000 80000000 00000000 00000000 00000000 00000000 00000000 80000000 24b7ff04 54a379cd 54105878 5e699328
+ars4x32 10 00000000 00000000 000000ff 00000000 00000000 00000000 00000000 80000000 4a217568 5ab95f01 c470dd0e cc312296
+ars4x32 10 00000000 00000000 00000080 00000000 00000000 00000000 00000000 80000000 59f4e457 b3b2944d 2db60de7 5d6596c5
+ars4x32 10 00000000 00000000 0000ff00 00000000 00000000 00000000 00000000 80000000 6291ff37 e4ec1241 2c6b7ea5 070f2af3
+ars4x32 10 00000000 00000000 00008000 00000000 00000000 00000000 00000000 80000000 c52c541e 96b8b03e 29020434 07b8b52e
+ars4x32 10 00000000 00000000 00ff0000 00000000 00000000 00000000 00000000 80000000 1d9ca290 d22df559 677b4219 211115fd
+ars4x32 10 00000000 00000000 00800000 00000000 00000000 00000000 00000000 80000000 8b22d574 a1cffe3d 9c70e4c4 4d39249d
+ars4x32 10 00000000 00000000 ff000000 00000000 00000000 00000000 00000000 80000000 198c7bbb c5fc8419 46ddb6b8 f63f407b
+ars4x32 10 00000000 00000000 80000000 00000000 00000000 00000000 00000000 80000000 f07ea702 360cb148 72e5e1fa e903112e
+ars4x32 10 00000000 00000000 00000000 000000ff 00000000 00000000 00000000 80000000 b117d222 cb3f5001 c5eb6c25 7440f4e5
+ars4x32 10 00000000 00000000 00000000 00000080 00000000 00000000 00000000 80000000 f062efce 07b8dae5 6e487b3c ee17a039
+ars4x32 10 00000000 00000000 00000000 0000ff00 00000000 00000000 00000000 80000000 93345860 df9ce586 7c8b5ff3 1028ea8a
+ars4x32 10 00000000 00000000 00000000 00008000 00000000 00000000 00000000 80000000 f7ae5400 234e6d34 aa1e51c0 cdf51bd4
+ars4x32 10 00000000 00000000 00000000 00ff0000 00000000 00000000 00000000 80000000 df755c0e 4842b68b a3d26d09 b1e5d506
+ars4x32 10 00000000 00000000 00000000 00800000 00000000 00000000 00000000 80000000 dc546bee be2edfda 2887d5b6 39e817e9
+ars4x32 10 00000000 00000000 00000000 ff000000 00000000 00000000 00000000 80000000 e9375d82 8c142da5 cdf4bffe 421e1845
+ars4x32 10 00000000 00000000 00000000 80000000 00000000 00000000 00000000 80000000 a0e70327 7caee527 6a428c61 3c4f3840
+ars4x32 10 886a3f24 d308a385 2e8a1913 44737003 00000000 00000000 00000000 80000000 b80e41ea 4a1fa670 348659dd ee801943
+ars4x32 10 223809a4 d0319f29 98fa2e08 896c4eec 00000000 00000000 00000000 80000000 020ddcdd 4a5fbd4f 03373d33 9415f871
+ars4x32 10 e6212845 7713d038 cf6654be 6c0ce934 00000000 00000000 00000000 80000000 d45af446 218fe8d8 47653a38 a1d863e2
diff --git a/tests/rngNxW.h b/tests/rngNxW.h
@@ -0,0 +1,48 @@
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+ notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions, and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+RNGNxW_TPL(philox, 2, 32)
+RNGNxW_TPL(philox, 4, 32)
+RNGNxW_TPL(threefry, 2, 32)
+RNGNxW_TPL(threefry, 4, 32)
+#if R123_USE_64BIT
+#if R123_USE_PHILOX_64BIT
+RNGNxW_TPL(philox, 2, 64)
+RNGNxW_TPL(philox, 4, 64)
+#endif
+RNGNxW_TPL(threefry, 2, 64)
+RNGNxW_TPL(threefry, 4, 64)
+#endif
+#if R123_USE_AES_NI
+RNGNxW_TPL(ars, 4, 32)
+RNGNxW_TPL(aesni, 4, 32)
+#endif
diff --git a/tests/time_boxmuller.cpp b/tests/time_boxmuller.cpp
@@ -0,0 +1,142 @@
+// Test for boxmuller.h on CPU
+#include <Random123/philox.h>
+#include <Random123/threefry.h>
+#include <Random123/boxmuller.hpp>
+#include "util.h" // for timer()
+
+#if __GNUC__>=7
+#pragma GCC diagnostic ignored "-Wimplicit-fallthrough"
+#endif
+
+typedef r123::Philox4x32 CBRNGF;
+#if R123_USE_64BIT
+typedef r123::Threefry2x64 CBRNGD;
+#endif
+
+const char *progname = "time_boxmuller";
+
+// Each call to boxmuller() returns a pair of values in the .x and .y
+// members, which we add up into sum just to avoid being optimized away.
+template <typename CBRNG, typename F, typename F2>
+F timedloop(typename CBRNG::ukey_type k, size_t Ntry){
+ F sum = 0.f;
+ typename CBRNG::ctr_type ctr = {{}};
+ const size_t csize = sizeof(ctr)/sizeof(ctr[0]);
+ CBRNG rng;
+
+ for(size_t i=0; i<Ntry; i+=csize){
+ ctr.incr();
+ typename CBRNG::ctr_type u = rng(ctr, k);
+ F2 f2;
+ switch(csize) {
+ case 8: f2 = r123::boxmuller(u[6], u[7]); sum += f2.x + f2.y;
+ f2 = r123::boxmuller(u[4], u[5]); sum += f2.x + f2.y;
+ case 4: f2 = r123::boxmuller(u[2], u[3]); sum += f2.x + f2.y;
+ case 2: f2 = r123::boxmuller(u[0], u[1]); sum += f2.x + f2.y;
+ break;
+ default:
+ R123_ASSERT(0);
+ }
+ }
+ return sum;
+}
+
+template <typename CBRNG, typename F2>
+void dumploop(FILE *fp, typename CBRNG::ukey_type k, size_t Ntry){
+ typename CBRNG::ctr_type ctr = {{}};
+ const size_t csize = sizeof(ctr)/sizeof(ctr[0]);
+ CBRNG rng;
+
+ for(size_t i=0; i<Ntry; i+=csize){
+ ctr.incr();
+ typename CBRNG::ctr_type u = rng(ctr, k);
+ F2 f2;
+ switch(csize) {
+ case 8: f2 = r123::boxmuller(u[6], u[7]); fprintf(fp, "%g\n%g\n", f2.x, f2.y);
+ f2 = r123::boxmuller(u[4], u[5]); fprintf(fp, "%g\n%g\n", f2.x, f2.y);
+ case 4: f2 = r123::boxmuller(u[2], u[3]); fprintf(fp, "%g\n%g\n", f2.x, f2.y);
+ case 2: f2 = r123::boxmuller(u[0], u[1]); fprintf(fp, "%g\n%g\n", f2.x, f2.y); break;
+ default:
+ R123_ASSERT(0);
+ }
+ }
+}
+
+#define NREPEAT 20
+
+template <typename CBRNG, typename F, typename F2>
+void timedcall(const char *tname, typename CBRNG::ukey_type k, size_t Ntry, char *out_fname) {
+ double cur_time, dt;
+ F sums[NREPEAT];
+ int i;
+ FILE *fp;
+ char *fname;
+ if (out_fname) {
+ fname = (char *) malloc(strlen(out_fname) + strlen(tname) + 2);
+ CHECKNOTZERO(fname);
+ sprintf(fname, "%s-%s", out_fname, tname);
+ fp = fopen(fname, "w");
+ CHECKNOTZERO(fp);
+ } else {
+ fname = NULL;
+ fp = NULL;
+ }
+ (void) timer(&cur_time);
+ /*
+ * we call timedloop NREPEAT times so that it is easy to keep
+ * Ntry the same for boxmuller.cu and boxmuller.cpp, so sum[0]
+ * can be checked.
+ */
+ for (i = 0; i < NREPEAT; i++) {
+ k.v[sizeof(k)/sizeof(k.v[0])-1] = i;
+ if (fp)
+ dumploop<CBRNG, F2>(fp, k, Ntry);
+ else
+ sums[i] = timedloop<CBRNG, F, F2>(k, Ntry);
+ }
+ dt = timer(&cur_time);
+ if (fp) {
+ printf("%s %lu written to %s in %g sec: %gM/sec\n", tname, (unsigned long)(Ntry*NREPEAT), fname, dt, Ntry*NREPEAT*1.e-6/dt);
+ fclose(fp);
+ free(fname);
+ } else {
+ printf("%s %lu in %g sec: %gM/sec, sum = %g\n", tname, (unsigned long)(Ntry*NREPEAT), dt, Ntry*NREPEAT*1.e-6/dt, sums[0]);
+ for (i = 1; i < NREPEAT; i++) {
+ printf(" %g", sums[i]);
+ }
+ printf("\n");
+ }
+}
+
+const size_t DEF_N = 200000;
+
+int main(int argc, char **argv){
+ CBRNGF::ukey_type keyf = {{}};
+#if R123_USE_64BIT
+ CBRNGD::ukey_type keyd = {{}};
+#endif
+ size_t Ntry = DEF_N;
+ char *dumpfname;
+
+ dumpfname = getenv("BOXMULLER_DUMPFILE");
+ if(argc>1) {
+ if (argv[1][0] == '-') {
+ fprintf(stderr, "Usage: %s [iterations_per_thread [key0 [key1]]]\n", argv[0]);
+ exit(1);
+ }
+ Ntry = atol(argv[1]);
+ }
+ for (int i = 0; i < (int)(sizeof(keyf)/sizeof(keyf[0])-1) && 2+i < argc; i++) {
+ keyf.v[i] = atol(argv[2+i]);
+ }
+ timedcall<CBRNGF,float,r123::float2>("float", keyf, Ntry, dumpfname);
+
+#if R123_USE_64BIT
+ for (int i = 0; i < (int)(sizeof(keyd)/sizeof(keyd[0])-1) && 2+i < argc; i++) {
+ keyd.v[i] = atol(argv[2+i]);
+ }
+ timedcall<CBRNGD,double,r123::double2>("double", keyd, Ntry, dumpfname);
+#endif
+ return 0;
+}
+
diff --git a/tests/time_boxmuller_cuda.cu b/tests/time_boxmuller_cuda.cu
@@ -0,0 +1,181 @@
+// Test for boxmuller.h on CUDA
+#include <Random123/philox.h>
+#include <Random123/threefry.h>
+#include "util.h" // for timer()
+#include "util_cuda.h" // for cuda_init, CHECKCALL
+#include <Random123/boxmuller.hpp>
+
+typedef r123::Philox4x32 CBRNGF;
+typedef r123::Threefry2x64 CBRNGD;
+int debug = 0;
+const char *progname = "time_boxmuller_cuda";
+
+// Sometimes warnings are A LOT more trouble than they're worth.
+// if we just write u[6], we get warnings
+// so we write u[(csize>n)?6:0].
+#define UGLY(n) (csize>n)?n:0
+
+// The timedloop kernel sums N randoms per thread for timing and
+// records that sum in out[tid] (mainly to ensure that
+// the random generation process does not get optimized away)
+template <typename CBRNG, typename F, typename F2>
+__global__ void timedloop(F *out, typename CBRNG::ukey_type k, size_t N){
+ unsigned tid = blockDim.x * blockIdx.x + threadIdx.x;
+ const size_t klast = sizeof(k)/sizeof(k[0]) - 1;
+ R123_ASSERT(k[klast] == 0); // uses last element of key to
+ k[klast] = tid; // ensure unique key per thread
+ F sum = 0.f;
+ typename CBRNG::ctr_type ctr = {};
+ const size_t csize = sizeof(ctr)/sizeof(ctr[0]);
+ CBRNG rng;
+
+ for(size_t i=0; i<N; i+=csize){
+ ctr.incr();
+ typename CBRNG::ctr_type u = rng(ctr, k);
+ F2 f2;
+ // Using a loop instead of the Duff device here costs 10%,
+ // at least in CUDA4.2 circa Jan 2013 on a Tesla C2050!
+ switch(csize) {
+ case 8: f2 = r123::boxmuller(u[UGLY(6)], u[UGLY(7)]); sum += f2.x + f2.y;
+ f2 = r123::boxmuller(u[UGLY(4)], u[UGLY(5)]); sum += f2.x + f2.y;
+ case 4: f2 = r123::boxmuller(u[UGLY(2)], u[UGLY(3)]); sum += f2.x + f2.y;
+ case 2: f2 = r123::boxmuller(u[0], u[1]); sum += f2.x + f2.y;
+ break;
+ default:
+ R123_ASSERT(0);
+ }
+ }
+ out[tid] = sum;
+}
+
+// The dumploop kernel records all the normal randoms individually in out,
+// so it produces N randoms per thread. Each thread records
+// its randoms in tid, NTHREADS+tid, NTHREAD*2+tid, ..., NTHREADS*(N-1)+tid
+// which hopefully results in nicely coalesced writes from each warp.
+template <typename CBRNG, typename F, typename F2>
+__global__ void dumploop(F *out, typename CBRNG::ukey_type k, size_t N){
+ unsigned tid = blockDim.x * blockIdx.x + threadIdx.x;
+ const size_t klast = sizeof(k)/sizeof(k[0]) - 1;
+ R123_ASSERT(k[klast] == 0); // uses last element of key to
+ k[klast] = tid; // ensure unique key per thread
+ typename CBRNG::ctr_type ctr = {};
+ const size_t csize = sizeof(ctr)/sizeof(ctr[0]);
+ CBRNG rng;
+
+ for(size_t i=0; i<N;){
+ ctr.incr();
+ typename CBRNG::ctr_type u = rng(ctr, k);
+ F2 f2;
+ // Using a loop instead of the Duff device here costs 10%,
+ // at least in CUDA4.2 circa Jan 2013 on a Tesla C2050!
+ switch(csize) {
+ case 8: f2 = r123::boxmuller(u[UGLY(6)], u[UGLY(7)]);
+ out[blockDim.x*gridDim.x*i + tid] = f2.x;
+ i++;
+ out[blockDim.x*gridDim.x*i + tid] = f2.y;
+ i++;
+ f2 = r123::boxmuller(u[UGLY(4)], u[UGLY(5)]);
+ out[blockDim.x*gridDim.x*i + tid] = f2.x;
+ i++;
+ out[blockDim.x*gridDim.x*i + tid] = f2.y;
+ i++;
+ case 4: f2 = r123::boxmuller(u[UGLY(2)], u[UGLY(3)]);
+#undef UGLY
+ out[blockDim.x*gridDim.x*i + tid] = f2.x;
+ i++;
+ out[blockDim.x*gridDim.x*i + tid] = f2.y;
+ i++;
+ case 2: f2 = r123::boxmuller(u[0], u[1]);
+ out[blockDim.x*gridDim.x*i + tid] = f2.x;
+ i++;
+ out[blockDim.x*gridDim.x*i + tid] = f2.y;
+ i++;
+ break;
+ default:
+ asm("trap;");
+ }
+ }
+}
+
+template <typename CBRNG, typename F, typename F2>
+void timedcall(const char *tname, const char *out_fname, CUDAInfo *infop, typename CBRNG::ukey_type k, size_t N) {
+ double cur_time, dt;
+ const int nthreads = infop->blocks_per_grid*infop->threads_per_block;
+ const size_t nrand = out_fname ? N * nthreads : nthreads;
+ const size_t out_size = nrand*sizeof(F);
+ F *d_out, *h_out = (F *) malloc(out_size);
+ CHECKNOTZERO(h_out);
+ CHECKCALL(cudaMalloc(&d_out, out_size));
+ (void) timer(&cur_time);
+ if (out_fname)
+ dumploop<CBRNG,F,F2> <<<infop->blocks_per_grid, infop->threads_per_block>>> (d_out, k, N);
+ else
+ timedloop<CBRNG,F,F2> <<<infop->blocks_per_grid, infop->threads_per_block>>> (d_out, k, N);
+ CHECKCALL(cudaDeviceSynchronize());
+ CHECKCALL(cudaMemcpy(h_out, d_out, out_size, cudaMemcpyDeviceToHost));
+ dt = timer(&cur_time);
+ printf("%s %zd in %g sec: %gM/sec\n", tname, N*nthreads, dt, N*nthreads*1.e-6/dt);
+ if (out_fname) {
+ char *fname = (char *) malloc(strlen(out_fname) + strlen(tname) + 2);
+ CHECKNOTZERO(fname);
+ sprintf(fname, "%s-%s", out_fname, tname);
+ FILE *fp = fopen(fname, "w");
+ CHECKNOTZERO(fp);
+ for (size_t i = 0; i < nrand; i++){
+ fprintf(fp, "%g\n", h_out[i]);
+ }
+ fclose(fp);
+ free(fname);
+ } else {
+ int nwoops = 0;
+ printf("%s h_out[0] = %g\n", tname, h_out[0]);
+ for (size_t i = 0; i < nrand; i++){
+ if(h_out[i] == 0.f){
+ if(nwoops++<10)
+ printf("Woops %s h_out[%zd] = %g\n", tname, i, h_out[i]);
+
+ }
+ }
+ if(nwoops>10){
+ printf("Woops %s %d times\n", tname, nwoops);
+ }
+ }
+ CHECKCALL(cudaFree(d_out));
+ free(h_out);
+}
+
+const size_t DEF_N = 200000;
+
+int main(int argc, char **argv){
+ CBRNGF::ukey_type keyf = {};
+ CBRNGD::ukey_type keyd = {};
+ size_t Ntry = DEF_N;
+ char *cp = getenv("R123_DEBUG");
+ if (cp)
+ debug = atoi(cp);
+ if ((cp = getenv("BOXMULLER_DUMPFILE")) != NULL) {
+ Ntry = 8;
+ } else {
+ Ntry = DEF_N;
+ }
+ if(argc>1) {
+ if (argv[1][0] == '-') {
+ fprintf(stderr, "Usage: %s [iterations_per_thread [key0 [key1]]]\n", argv[0]);
+ exit(1);
+ }
+ Ntry = atol(argv[1]);
+ }
+ // XXX cannot use keyf.size in host code, only in device code
+ for (int i = 0; i < (int)(sizeof(keyf)/sizeof(keyf[0])-1) && 2+i < argc; i++) {
+ keyf.v[i] = atol(argv[2+i]);
+ }
+ for (int i = 0; i < (int)(sizeof(keyd)/sizeof(keyd[0])-1) && 2+i < argc; i++) {
+ keyd.v[i] = atol(argv[2+i]);
+ }
+ CUDAInfo *infop = cuda_init(NULL);
+ timedcall<CBRNGF,float,r123::float2>("float", cp, infop, keyf, Ntry);
+ timedcall<CBRNGD,double,r123::double2>("double",cp, infop, keyd, Ntry);
+ cuda_done(infop);
+ return 0;
+}
+
diff --git a/tests/time_cuda.cu b/tests/time_cuda.cu
@@ -0,0 +1,175 @@
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+ notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions, and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ * CUDA test and timing harness for Random123 RNGs. Uses macros
+ * and util_expandtpl.h to "templatize" over all the different
+ * permutations of RNGs and NxW and R.
+ */
+
+#include "util_cuda.h"
+
+#include "Random123/philox.h"
+#include "Random123/threefry.h"
+
+#include "time_misc.h"
+#include "util_print.h"
+
+#define KERNEL __global__
+#define get_global_id(i) (blockDim.x * blockIdx.x + threadIdx.x)
+#include "time_random123.h"
+
+#define TEST_TPL(NAME, N, W, R) \
+void NAME##N##x##W##_##R(NAME##N##x##W##_ctr_t ctr, NAME##N##x##W##_ukey_t ukey, NAME##N##x##W##_ctr_t kactr, unsigned count, CUDAInfo *tp) \
+{ \
+ const char *kernelname = PREFIX #NAME #N "x" #W "_" #R; \
+ NAME##N##x##W##_ctr_t *hC, *dC; \
+ int n, niterations = numtrials; /* we make niterations + 2 (warmup, overhead) calls to the kernel */ \
+ double cur_time; \
+ size_t i; \
+ const size_t nworkitems = tp->blocks_per_grid * tp->threads_per_block; \
+ const size_t szC = nworkitems*sizeof(hC[0]); \
+ \
+ /* allocate vector of counters in device memory, initialize to zero */ \
+ CHECKCALL(cudaMalloc(&dC, szC)); \
+ CHECKCALL(cudaMemset((void *)dC, 0, szC)); \
+ /* allocate and initialize vector of counters in host memory */ \
+ CHECKNOTZERO(hC = (NAME##N##x##W##_ctr_t *)malloc(szC)); \
+ for (i = 0; i < nworkitems; i++) { \
+ size_t xi; \
+ for (xi = 0; xi < N; xi++) { \
+ hC[i].v[xi] = 0; \
+ } \
+ } \
+ unsigned kcount = 0; \
+ double basetime = 0., dt = 0., mindt = 0.; \
+ for (n = -2; n < niterations; n++) { \
+ if (n == -2) { \
+ if (count == 0) { \
+ /* try to set a good guess for count */ \
+ count = (unsigned)(tp->cycles ? tp->cycles * 1e-8 : 10000); \
+ dprintf(("starting with count = %u\n", count)); \
+ } \
+ kcount = count; \
+ } else if (n == -1) { \
+ /* use first iteration time to calibrate count to get approximately sec_per_trial */ \
+ if (count > 1) { \
+ count = (unsigned)(count * sec_per_trial / dt); \
+ dprintf(("scaled count = %u\n", count)); \
+ } \
+ /* second iteration is to calculate overhead after warmup */ \
+ kcount = 1; \
+ } else if (n == 0) { \
+ int xj; \
+ /* Check that we got the expected value */ \
+ for (xj = 0; xj < N; xj++) { \
+ if (kactr.v[xj] != hC[0].v[xj]) { \
+ printf("%s mismatch: xj = %d, expected\n", kernelname, xj); \
+ printline_##NAME##N##x##W##_##R(ukey, ctr, &kactr, 1); \
+ printf(" but got\n"); \
+ printline_##NAME##N##x##W##_##R(ukey, ctr, hC, 1); \
+ if(!debug) exit(1); \
+ else break; \
+ } else { \
+ dprintf(("%s matched word %d\n", kernelname, xj)); \
+ } \
+ } \
+ basetime = dt; \
+ if (debug||verbose) { \
+ dprintf(("%s %.3f secs for %lu workitems test on device %d (%s)\n", \
+ kernelname, basetime, (unsigned long) nworkitems, \
+ tp->devnum, tp->dev.name)); \
+ printline_##NAME##N##x##W##_##R(ukey, ctr, hC, (verbose < 2) ? 1 : nworkitems); \
+ } \
+ kcount = count + 1; \
+ } \
+ dprintf(("launch %s\n", kernelname)); \
+ (void)timer(&cur_time); \
+ test_##NAME##N##x##W##_##R<<<tp->blocks_per_grid, tp->threads_per_block>>>(kcount, ctr, ukey, dC); \
+ dprintf(("synchronize\n")); \
+ CHECKCALL(cudaDeviceSynchronize()); \
+ dprintf(("copy results back from device to host\n")); \
+ CHECKCALL(cudaMemcpy(hC, dC, szC, cudaMemcpyDeviceToHost)); \
+ dt = timer(&cur_time); \
+ dprintf(("iteration %d took %.3f secs\n", n, dt)); \
+ ALLZEROS(hC, nworkitems, N); \
+ if (n == 0 || dt < mindt) mindt = dt; \
+ } \
+ if (count > 1) { \
+ double tpB = (mindt - basetime) / ( (kcount - 1.) * nworkitems * (N * W / 8.) ); \
+ printf("%-17s %#5.3g cpB, %#5.3g GB/s on dev %d %u B granularity (best %u in %.3f s - %.6f s)\n", \
+ kernelname + sizeof(PREFIX) - 1, \
+ tpB * tp->cycles , 1e-9/tpB, \
+ tp->devnum, (unsigned)(N*W/8), kcount, mindt, basetime ); \
+ fflush(stdout); \
+ } \
+ /* free host and device memory */ \
+ free(hC); \
+ CHECKCALL(cudaFree(dC)); \
+}
+
+#include "util_expandtpl.h"
+
+int main(int argc, char **argv)
+{
+ char *cp;
+ unsigned count = 0;
+ CUDAInfo *infop;
+ int keyctroffset = 0;
+
+ progname = argv[0];
+ if (argc > 3|| (argv[1] && argv[1][0] == '-')) {
+ fprintf(stderr, "Usage: %s [COUNT [DEVICESTRING]]\n", progname);
+ exit(1);
+ }
+ if (argc > 1)
+ count = atoi(argv[1]);
+ if ((cp = getenv("TIME_CUDA_VERBOSE")) != NULL) {
+ verbose = atoi(cp);
+ }
+ if ((cp = getenv("TIME_CUDA_DEBUG")) != NULL) {
+ debug = atoi(cp);
+ }
+ if ((cp = getenv("TIME_CUDA_OFFSET")) != NULL) {
+ keyctroffset = atoi(cp);
+ }
+ if ((cp = getenv("TIME_CUDA_NUMTRIALS")) != NULL) {
+ numtrials = atoi(cp);
+ }
+ if ((cp = getenv("TIME_CUDA_SEC_PER_TRIAL")) != NULL) {
+ sec_per_trial = atof(cp);
+ }
+ infop = cuda_init(argc > 2 ? argv[2] : NULL);
+ /* define macro to initialize and call the kernels */
+# include "time_initkeyctr.h"
+ cuda_done(infop);
+ return 0;
+}
diff --git a/tests/time_initkeyctr.h b/tests/time_initkeyctr.h
@@ -0,0 +1,123 @@
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+ notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions, and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+#ifndef TIME_INITKEYCTR_H__
+#define TIME_INITKEYCTR_H__ 1
+
+/*
+ * EXAMPLE_KEY* and EXAMPLE_CTR* values are just arbitrary numbers
+ * with some bits set, they have no special importance, they do
+ * not even have to be different. If they are changed, then the
+ * good_* values further below will need to be updated to match.
+ */
+
+#define EXAMPLE_KEY0 0xdeadbeefU
+#define EXAMPLE_KEY1 0x12345678U
+#define EXAMPLE_KEY2 0xc0debad1U
+#define EXAMPLE_KEY3 0x31415926U
+
+#define EXAMPLE_CTR0 0x00000000U
+#define EXAMPLE_CTR1 0x10000000U
+#define EXAMPLE_CTR2 0x20000000U
+#define EXAMPLE_CTR3 0x30000000U
+
+/*
+ * The magic hex numbers below are just known good values that
+ * result from the arbitrary EXAMPLE* inputs above. We check that
+ * we got these results at the end of timing tests to ensure that
+ * we didn't accidentally let a compiler optimize away some loop.
+ */
+#if R123_USE_PHILOX_64BIT
+static philox2x64_ctr_t good_philox2x64_6 = {{R123_64BIT(0xdd40cdb81af968d2),R123_64BIT(0x0cb57d6d5f7b68dc)}};
+static philox2x64_ctr_t good_philox2x64_10 = {{R123_64BIT(0x539e5b3d18faf5da),R123_64BIT(0x838ca1328d07d3ba)}};
+static philox4x64_ctr_t good_philox4x64_7 = {{R123_64BIT(0xcf492074862957a2),R123_64BIT(0x7057627260938584),R123_64BIT(0x676e23214a14901d),R123_64BIT(0xefa2c5df3848e3fe)}};
+static philox4x64_ctr_t good_philox4x64_10 = {{R123_64BIT(0x1b64f56b381a5a89),R123_64BIT(0x940a282a8add45e1),R123_64BIT(0x53c936376ac7d5df),R123_64BIT(0x6147e87ec9bd9caa)}};
+#endif
+static philox4x32_ctr_t good_philox4x32_7 = {{0x40ba6a95,0x799e6a43,0x7dcabe10,0xa7a81636}};
+static philox4x32_ctr_t good_philox4x32_10 = {{0xf16d828e,0xa1c5962d,0xacac820c,0x58113d7a}};
+static threefry4x32_ctr_t good_threefry4x32_12 = {{0xe461db1c,0xfdfa62a7,0x0b10cd2a,0xa3679758}};
+static threefry4x32_ctr_t good_threefry4x32_20 = {{0xf82cf576,0x162ca116,0x3afefe23,0x54cc64ac}};
+#if R123_USE_64BIT
+static threefry2x64_ctr_t good_threefry2x64_13 = {{R123_64BIT(0xdf0f096c179ad798),R123_64BIT(0x077862fbaa1a0d11)}};
+static threefry2x64_ctr_t good_threefry2x64_20 = {{R123_64BIT(0xb91153d59815d50e),R123_64BIT(0xdb0dd45e5b0eab81)}};
+static threefry4x64_ctr_t good_threefry4x64_12 = {{R123_64BIT(0x416d1802da0a4a0f),R123_64BIT(0xabd4d80749306281),R123_64BIT(0x62c6b120b542bff0),R123_64BIT(0xefb28dc80c6fc36c)}};
+static threefry4x64_ctr_t good_threefry4x64_20 = {{R123_64BIT(0xad8f0b8c18ed5187),R123_64BIT(0xd80146a6961e1880),R123_64BIT(0x7fce9d950d8acbc4),R123_64BIT(0x782948d5203519f1)}};
+static threefry4x64_ctr_t good_threefry4x64_72 = {{R123_64BIT(0x73ff3f7a0b878f68),R123_64BIT(0x6668f6bbaba83f31),R123_64BIT(0x088eb85d40fbdb56),R123_64BIT(0xd1f39136adc96552)}};
+#endif
+
+#if R123_USE_AES_NI
+static ars4x32_ctr_t good_ars4x32_5 = {{0x279f6b0b, 0xd0b1edf6, 0x6044b433, 0x66c06817}};
+static ars4x32_ctr_t good_ars4x32_7 = {{0xa9cd8055, 0x80272a47, 0x4b7ab914, 0x5351d78e}};
+static aesni4x32_ctr_t good_aesni4x32_10 = {{0x1e68c9fd, 0x347b0858, 0x503d8d91, 0x9e73460a}};
+#endif
+
+/*
+ * template code initializes a ukey and counter to known values
+ * with a known offset and calls a Random123 test function with
+ * that ukey, ctr and a count and closure. keyctroffset is
+ * a variable initialized from runtime environment (e.g. argv, argc,
+ * getenv(), etc) to avoid compile-time optimization
+ * caused by constants, so we get worst-case numbers. Users may,
+ * of course, benefit from compile-time optimization if they
+ * have some constants for key or ctr values.
+ *
+ */
+#define TEST_TPL(NAME, N, W, R) \
+if ((strncmp(#NAME, "aes", 3) == 0 || strncmp(#NAME, "ars", 3) == 0) && !haveAESNI()) { \
+ printf("AESNI not available on this hardware\n"); \
+} else { \
+ NAME##N##x##W##_ukey_t ukey={{0}}; \
+ NAME##N##x##W##_ctr_t ctr={{0}}; \
+ size_t xi; \
+ for (xi = 0; xi < sizeof(ukey)/sizeof(ukey.v[0]); xi++) { \
+ switch (xi) { \
+ case 0: ukey.v[xi] = EXAMPLE_KEY0+keyctroffset; break; \
+ case 1: ukey.v[xi] = EXAMPLE_KEY1+keyctroffset; break; \
+ case 2: ukey.v[xi] = EXAMPLE_KEY2+keyctroffset; break; \
+ case 3: ukey.v[xi] = EXAMPLE_KEY3+keyctroffset; break; \
+ } \
+ } \
+ for (xi = 0; xi < N; xi++) { \
+ switch (xi) { \
+ case 0: ctr.v[xi] = EXAMPLE_CTR0+keyctroffset; break; \
+ case 1: ctr.v[xi] = EXAMPLE_CTR1+keyctroffset; break; \
+ case 2: ctr.v[xi] = EXAMPLE_CTR2+keyctroffset; break; \
+ case 3: ctr.v[xi] = EXAMPLE_CTR3+keyctroffset; break; \
+ } \
+ } \
+ NAME##N##x##W##_##R(ctr, ukey, good_##NAME##N##x##W##_##R, count, infop); \
+}
+
+#include "util_expandtpl.h"
+
+#endif /* TIME_INITKEYCTR_H__ */
+
+
diff --git a/tests/time_misc.h b/tests/time_misc.h
@@ -0,0 +1,44 @@
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+ notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions, and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+#ifndef TIME_MISC_H__
+#define TIME_MISC_H__ 1
+/* Miscellaneous common definitions for time_*.c */
+
+const char *progname;
+int verbose = 0;
+int debug = 0;
+int numtrials = 5;
+double sec_per_trial = 0.2;
+
+#define PREFIX "test_"
+
+#endif /* TIME_MISC_H__ */
diff --git a/tests/time_opencl.c b/tests/time_opencl.c
@@ -0,0 +1,200 @@
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+ notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions, and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ * OpenCL test and timing harness for Random123 RNGs. Uses macros
+ * and util_expandtpl.h to "templatize" over all the different
+ * permutations of RNGs and NxW and R.
+ */
+
+#define R123_USE_AES_NI 0 /* never use this for OpenCL */
+
+#include "util_opencl.h"
+
+#include "Random123/philox.h"
+#include "Random123/threefry.h"
+
+#include "time_misc.h"
+#include "util_print.h"
+
+#define TEST_TPL(NAME, N, W, R) \
+void NAME##N##x##W##_##R(NAME##N##x##W##_ctr_t ctr, NAME##N##x##W##_ukey_t ukey, NAME##N##x##W##_ctr_t kactr, unsigned count, UCLInfo *tp) \
+{ \
+ const char *kernelname = PREFIX #NAME #N "x" #W "_" #R; \
+ NAME##N##x##W##_ctr_t *hC; \
+ int n, niterations = numtrials; /* we make niterations + 2 (warmup, overhead) calls to the kernel */ \
+ int narg; \
+ double cur_time; \
+ size_t i; \
+ cl_int err; \
+ cl_mem dC; \
+ cl_kernel kern; \
+ \
+ /* create handle to kernel in program */ \
+ dprintf(("%s kernel\n", kernelname)); \
+ CHECKERR(kern = clCreateKernel(tp->prog, kernelname, &err)); \
+ const size_t nworkitems = tp->wgsize * tp->cores; \
+ const size_t szC = nworkitems*sizeof(hC[0]); \
+ /* allocate and initialize vector of counters in host memory */ \
+ CHECKNOTZERO(hC = (NAME##N##x##W##_ctr_t *) malloc(szC)); \
+ for (i = 0; i < nworkitems; i++) { \
+ int xi; \
+ for (xi = 0; xi < N; xi++) \
+ hC[i].v[xi] = 0; \
+ } \
+ /* allocate vector of counters in device memory, initialize from current host memory */ \
+ CHECKERR(dC = clCreateBuffer(tp->ctx, CL_MEM_READ_WRITE | CL_MEM_COPY_HOST_PTR, szC, hC, &err)); \
+ cl_uint kcount = 0; \
+ double basetime = 0., dt = 0., mindt = 0.; \
+ /* first two iterations are for warmup & baseline */ \
+ for (n = -2; n < niterations; n++) { \
+ if (n == -2) { \
+ if (count == 0) { \
+ /* try to set a good guess for count */ \
+ count = (unsigned)(tp->cycles ? tp->cycles * 1e-8 : 10000); \
+ dprintf(("starting with count = %u\n", count)); \
+ } \
+ kcount = count; \
+ } else if (n == -1) { \
+ /* use first iteration time to calibrate count to get approximately sec_per_trial */ \
+ if (count > 1) { \
+ count = (unsigned)(count * sec_per_trial / dt); \
+ dprintf(("scaled count = %u\n", count)); \
+ } \
+ /* second iteration is to calculate overhead after warmup */ \
+ kcount = 1; \
+ } else if (n == 0) { \
+ int xj; \
+ /* Check that we got the expected value */ \
+ for (xj = 0; xj < N; xj++) { \
+ if (kactr.v[xj] != hC[0].v[xj]) { \
+ printf("%s mismatch: xj = %d, expected\n", kernelname, xj); \
+ printline_##NAME##N##x##W##_##R(ukey, ctr, &kactr, 1); \
+ printf(" but got\n"); \
+ printline_##NAME##N##x##W##_##R(ukey, ctr, hC, 1); \
+ if(!debug) exit(1); \
+ else break; \
+ } else { \
+ dprintf(("%s matched word %d\n", kernelname, xj)); \
+ } \
+ } \
+ basetime = dt; \
+ if (debug||verbose) { \
+ dprintf(("%s %.3f secs for %lu workitems test on device %s\n", \
+ kernelname, basetime, (unsigned long) nworkitems, \
+ tp->devname)); \
+ printline_##NAME##N##x##W##_##R(ukey, ctr, hC, (verbose < 2) ? 1 : nworkitems); \
+ } \
+ kcount = count + 1; \
+ } \
+ (void)timer(&cur_time); \
+ dprintf(("setup arguments to kernel function %s\n", kernelname)); \
+ narg = 0; \
+ CHECK(clSetKernelArg(kern, narg, sizeof(kcount), (void *)&kcount)); \
+ narg++; \
+ CHECK(clSetKernelArg(kern, narg, sizeof(ctr), (void *)&ctr)); \
+ narg++; \
+ CHECK(clSetKernelArg(kern, narg, sizeof(ukey), (void *)&ukey)); \
+ narg++; \
+ CHECK(clSetKernelArg(kern, narg, sizeof(cl_mem), (void *)&dC)); \
+ dprintf(("queue kernel for execution on device %s\n", tp->devname)); \
+ CHECK(clEnqueueNDRangeKernel(tp->cmdq, kern, 1, 0, &nworkitems, &tp->wgsize, 0, 0, 0)); \
+ CHECK(clFlush(tp->cmdq)); \
+ dprintf(("copy results from device memory to host memory\n")); \
+ CHECK(clEnqueueReadBuffer(tp->cmdq, dC, CL_FALSE, 0, szC, hC, 0, 0, 0)); \
+ CHECK(clFlush(tp->cmdq)); \
+ dprintf(("synchronize\n")); \
+ CHECK(clFinish(tp->cmdq)); \
+ dt = timer(&cur_time); \
+ dprintf(("iteration %d took %.3f secs\n", n, dt)); \
+ ALLZEROS(hC, nworkitems, N); \
+ if (n == 0 || dt < mindt) mindt = dt; \
+ } \
+ if (count > 1) { \
+ double tpB = (mindt - basetime) / ( (count - 1.) * nworkitems * (N * W / 8.) ); \
+ printf("%-17s %#5.3g cpB, %#5.3g GB/s %u B granularity (best %u in %.3f s - %.6f s)\n", \
+ kernelname + sizeof(PREFIX) - 1, \
+ tpB * tp->cycles , 1e-9/tpB, \
+ (unsigned)(N*W/8), count, mindt, basetime ); \
+ fflush(stdout); \
+ } \
+ /* free host and device memory */ \
+ free(hC); \
+ CHECK(clReleaseMemObject(dC)); \
+ /* free the kernel */ \
+ CHECK(clReleaseKernel(kern)); \
+}
+
+#include "util_expandtpl.h"
+
+/* Include the preprocessed source code, stashed in a literal string */
+const char *opencl_src =
+#include "time_opencl_kernel.i"
+ ;
+
+int main(int argc, char **argv)
+{
+ const char *cp;
+ unsigned count = 0;
+ UCLInfo *infop;
+ int keyctroffset = 0;
+
+ progname = argv[0];
+ if (argc > 3|| (argv[1] && argv[1][0] == '-')) {
+ fprintf(stderr, "Usage: %s [COUNT [DEVICESTRING]]\n", progname);
+ exit(1);
+ }
+ if (argc > 1)
+ count = atoi(argv[1]);
+ if ((cp = getenv("TIME_OPENCL_VERBOSE")) != NULL) {
+ verbose = atoi(cp);
+ }
+ if ((cp = getenv("TIME_OPENCL_DEBUG")) != NULL) {
+ debug = atoi(cp);
+ }
+ if ((cp = getenv("TIME_OPENCL_OFFSET")) != NULL) {
+ keyctroffset = atoi(cp);
+ }
+ if ((cp = getenv("TIME_OPENCL_NUMTRIALS")) != NULL) {
+ numtrials = atoi(cp);
+ }
+ if ((cp = getenv("TIME_OPENCL_SEC_PER_TRIAL")) != NULL) {
+ sec_per_trial = atof(cp);
+ }
+ if ((cp = getenv("TIME_OPENCL_BUILD_OPTIONS")) == NULL) {
+ cp = "";
+ }
+ infop = opencl_init(argc > 2 ? argv[2] : NULL, opencl_src, cp);
+ /* define macro to initialize and call the kernels */
+# include "time_initkeyctr.h"
+ opencl_done(infop);
+ return 0;
+}
diff --git a/tests/time_opencl_kernel.ocl b/tests/time_opencl_kernel.ocl
@@ -0,0 +1,35 @@
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+ notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions, and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+#ifndef __OPENCL_VERSION__
+#define __OPENCL_VERSION__ 1
+#endif
+#include "time_random123.h"
diff --git a/tests/time_random123.h b/tests/time_random123.h
@@ -0,0 +1,119 @@
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+ notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions, and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+#ifndef TIME_RANDOM123_H__
+#define TIME_RANDOM123_H__ 1
+
+/*
+ * This file contains the performance timing kernels for Random123
+ * RNGs and a few conventional PRNGs, which have been hacked into
+ * this framework. This code should NOT be considered as an
+ * example of using PRNGs. A few macros try to keep it
+ * cross-platform across C (serial or threads), CUDA and OpenCL.
+ * The TEST_TPL + include util_expandtpl trick is used to
+ * template-generate kernels for all the different RNGs across
+ * NxW.
+ */
+
+#include <Random123/philox.h>
+#include <Random123/threefry.h>
+
+#if defined(__OPENCL_VERSION__)
+#define KERNEL __kernel
+#define MEMTYPE __global
+#define xprintf(x)
+#elif defined(__CUDA_ARCH__)
+#define xprintf(x)
+#else
+#define xprintf(x) printf x
+#endif
+
+#ifndef KERNEL
+#define KERNEL
+#endif
+
+#ifndef MEMTYPE
+#define MEMTYPE
+#endif
+
+/* LOOK_AT forces the compiler to actually produce the code that
+ computes the elements of A. Without it, optimizing compilers can
+ elide some or all of the computation of A (i.e., the RNG we're
+ trying to get timings for). There are many ways to do this. A
+ perhaps more natural way would be to keep a running sum of all the
+ results so far, but we found that gcc 4.5 and 4.6 could unroll that
+ code into a fully SSE-ized loop, which appears to be
+ unrepresentative of the kinds of optimizations that are possible in
+ practice. I.e., we could not find any "real" use of the output of
+ the RNG that permitted SSE-ization of the RNG. */
+#define LOOK_AT(A, I, N) do{ \
+ if (N==4) if(R123_BUILTIN_EXPECT(!(A.v[N>2?3:0]^A.v[N>2?2:0]^A.v[N>1?1:0]^A.v[0]), 0)) ++I; \
+ if (N==2) if(R123_BUILTIN_EXPECT(!(A.v[N>1?1:0]^A.v[0]), 0)) ++I; \
+ if (N==1) if(R123_BUILTIN_EXPECT(!(A.v[0]), 0)) ++I; \
+ }while(0)
+
+
+/* Macro that will expand later into all the Random123 PRNGs for NxW_R */
+/* XXX AMDAPPSDK 2.4 seemed unhappy with the first arg being uint, but
+ was ok when it was changed to uint64_t. It's now back to unsigned
+ because that seems more correct and generic. Nobody's using 2.4
+ any more, are they? Note that this macro is expanded into CPU,
+ CUDA and OpenCL "kernels", so it has to be generic. */
+#define TEST_TPL(NAME, N, W, R) \
+KERNEL void test_##NAME##N##x##W##_##R(unsigned n, NAME##N##x##W##_ctr_t ctrinit, NAME##N##x##W##_ukey_t uk, MEMTYPE NAME##N##x##W##_ctr_t *ctr) \
+{ \
+ unsigned tid = get_global_id(0); \
+ unsigned i; \
+ NAME##N##x##W##_ctr_t c, v={{0}}; \
+ NAME##N##x##W##_key_t k=NAME##N##x##W##keyinit(uk); \
+ c = ctrinit; \
+ if( R == NAME##N##x##W##_rounds ){ \
+ for (i = 0; i < n; ++i) { \
+ v = NAME##N##x##W(c, k); \
+ LOOK_AT(v, i, N); \
+ c.v[0]++; \
+ } \
+ }else { \
+ for (i = 0; i < n; ++i) { \
+ v = NAME##N##x##W##_R(R, c, k); \
+ /*xprintf(("1: %s k[0] %lx c[0] %lx v[0] %lx\n", #NAME #N "x" #W "_" #R, (unsigned long) k.v[0], (unsigned long) c.v[0], (unsigned long) v.v[0]));*/ \
+ /*if (c.v[0] == 0) printline_##NAME##N##x##W##_##R(k, c, &v, 1);*/ \
+ LOOK_AT(v, i, N); \
+ c.v[0]++; \
+ } \
+ } \
+ ctr[tid] = v; \
+}
+
+/* Now expand TEST_TPL for all the relevant RNGs */
+#include "util_expandtpl.h"
+
+#endif /* TIME_RANDOM123_H__ */
diff --git a/tests/time_serial.c b/tests/time_serial.c
@@ -0,0 +1,162 @@
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+ notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions, and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ * Single-core CPU test and timing harness for Random123 RNGs.
+ * Uses macros and util_expandtpl.h to "templatize" over all the
+ * different permutations of RNGs and NxW and R.
+ */
+#include "util.h"
+
+#include "Random123/philox.h"
+#include "Random123/threefry.h"
+#include "Random123/ars.h"
+#include "Random123/aes.h"
+
+#include "time_misc.h"
+#include "util_print.h"
+
+#include "util.h"
+#define KERNEL R123_STATIC_INLINE
+#define get_global_id(i) (i)
+#include "time_random123.h"
+
+static double cpu_hz = -1.;
+
+#define TEST_TPL(NAME, N, W, R) \
+void NAME##N##x##W##_##R(NAME##N##x##W##_ctr_t ctr, NAME##N##x##W##_ukey_t ukey, NAME##N##x##W##_ctr_t kactr, unsigned count, void* unused) \
+{ \
+ const char *kernelname = #NAME #N "x" #W "_" #R; \
+ double cur_time; \
+ int n, niterations = numtrials; /* we make niterations + 2 (warmup, overhead) calls to the kernel */ \
+ unsigned kcount = 0; \
+ double basetime = 0., dt = 0., mindt = 0.; \
+ NAME##N##x##W##_ctr_t C, *hC = &C; \
+ (void)unused; /* suppress warning */ \
+ \
+ for (n = -2; n < niterations; n++) { \
+ if (n == -2) { \
+ if (count == 0) { \
+ /* try to set a good guess for count */ \
+ count = 1000000; \
+ dprintf(("starting with count = %u\n", count)); \
+ } \
+ kcount = count; \
+ } else if (n == -1) { \
+ /* use first iteration time to calibrate count to get approximately sec_per_trial */ \
+ if (count > 1) { \
+ count = (unsigned)(count * sec_per_trial / dt); \
+ dprintf(("scaled count = %u\n", count)); \
+ } \
+ /* second iteration is to calculate overhead after warmup */ \
+ kcount = 1; \
+ } else if (n == 0) { \
+ int xj; \
+ /* Check that we got the expected value */ \
+ for (xj = 0; xj < N; xj++) { \
+ if (kactr.v[xj] != hC[0].v[xj]) { \
+ printf("%s mismatch: xj = %d, expected\n", kernelname, xj); \
+ printline_##NAME##N##x##W##_##R(ukey, ctr, &kactr, 1); \
+ printf(" but got\n"); \
+ printline_##NAME##N##x##W##_##R(ukey, ctr, hC, 1); \
+ if(!debug) exit(1); \
+ else break; \
+ } else { \
+ dprintf(("%s matched word %d\n", kernelname, xj)); \
+ } \
+ } \
+ basetime = dt; \
+ if (debug||verbose) { \
+ dprintf(("%s %.3f secs\n", kernelname, basetime)); \
+ printline_##NAME##N##x##W##_##R(ukey, ctr, hC, 1); \
+ } \
+ kcount = count + 1; \
+ } \
+ /* calling timer *before* dprintf avoids an ARMv7 gcc 4.8.3 -O3 compiler bug! */ \
+ (void)timer(&cur_time); \
+ dprintf(("call function %s\n", kernelname)); \
+ test_##NAME##N##x##W##_##R(kcount, ctr, ukey, hC); \
+ dt = timer(&cur_time); \
+ dprintf(("iteration %d took %.3f secs\n", n, dt)); \
+ ALLZEROS(hC, 1, N); \
+ if (n == 0 || dt < mindt) mindt = dt; \
+ } \
+ if (count > 1) { \
+ double tpB = (mindt - basetime) / ( (kcount - 1.) * (N * W / 8.) ); \
+ if(cpu_hz > 0.) \
+ printf("%-17s %#5.3g cpB %#5.3g GB/s %u B granularity (best %u in %.3f s - %.6f s)\n", \
+ kernelname, tpB*cpu_hz, 1e-9/tpB, \
+ (unsigned)(N*W/8), kcount, mindt, basetime ); \
+ else \
+ printf("%-17s %#5.3g GB/s %u B granularity (best %u in %.3f s - %.6f s)\n", \
+ kernelname, 1e-9/tpB, \
+ (unsigned)(N*W/8), kcount, mindt, basetime ); \
+ fflush(stdout); \
+ } \
+}
+
+#include "util_expandtpl.h"
+
+int main(int argc, char **argv)
+{
+ char *cp;
+ unsigned count = 0;
+ int keyctroffset = 0;
+ void* infop = NULL;
+
+ progname = argv[0];
+ if (argc > 3|| (argv[1] && argv[1][0] == '-')) {
+ fprintf(stderr, "Usage: %s [COUNT]]\n", progname);
+ exit(1);
+ }
+ if (argc > 1)
+ count = atoi(argv[1]);
+ if ((cp = getenv("TIME_SERIAL_CPU_GHZ")) != NULL) {
+ cpu_hz = 1.e9 * atof(cp);
+ }
+ if ((cp = getenv("TIME_SERIAL_VERBOSE")) != NULL) {
+ verbose = atoi(cp);
+ }
+ if ((cp = getenv("TIME_SERIAL_DEBUG")) != NULL) {
+ debug = atoi(cp);
+ }
+ if ((cp = getenv("TIME_SERIAL_OFFSET")) != NULL) {
+ keyctroffset = atoi(cp);
+ }
+ if ((cp = getenv("TIME_SERIAL_NUMTRIALS")) != NULL) {
+ numtrials = atoi(cp);
+ }
+ if ((cp = getenv("TIME_SERIAL_SEC_PER_TRIAL")) != NULL) {
+ sec_per_trial = atof(cp);
+ }
+# include "time_initkeyctr.h"
+ return 0;
+}
diff --git a/tests/time_thread.c b/tests/time_thread.c
@@ -0,0 +1,242 @@
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+ notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions, and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ * Pthreads test and timing harness for Random123 RNGs.
+ * Uses macros and util_expandtpl.h to "templatize" over all the
+ * different permutations of RNGs and NxW and R.
+ */
+
+#include "util.h"
+#include <sys/stat.h>
+
+#include "Random123/philox.h"
+#include "Random123/threefry.h"
+#include "Random123/ars.h"
+#include "Random123/aes.h"
+
+#include "time_misc.h"
+#include "util_print.h"
+#include "util.h"
+#include <pthread.h>
+
+/*
+ * Main thread initializes thread_info[i].started to zero, .tid to its own
+ * pthread_self() as a placeholder.
+ * Child #i sets thread_info[i].tid to pthread_self() and then
+ * sets .started. Only child #i ever writes to thread_info[i], and
+ * does so only once. So searching through thread_info is race-free
+ * for get_global_id, since it only ever looking for its own pthread_self
+ * anyway. The write to started needs to be atomic.
+ * This is all so that we can use the same kernel as OpenCL/CUDA.
+ * Note that parent keeps its own copy of thread ids returned
+ * by pthread_create in tids[] to avoid any races with thread_info.
+ */
+typedef struct {
+ int started; /* started == 1 means tid contains pthread_self() of thread */
+ pthread_t tid;
+} ThreadInfo;
+static volatile ThreadInfo *thread_info; /* thread_id state, one per thread */ \
+static int thread_count = 12;
+
+/* Linear search should be fast enough for small thread count... */
+R123_STATIC_INLINE int get_global_id(int x)
+{
+ int i;
+ pthread_t me = pthread_self();
+ (void)x; /* why is this an arg? */
+ for (i = 0; i < thread_count; i++) {
+ if (thread_info[i].started && pthread_equal(me, thread_info[i].tid))
+ return i;
+ }
+ fprintf(stderr, "could not find thread %lu\n", (unsigned long) me);
+ pthread_exit(NULL);
+}
+
+#define KERNEL R123_STATIC_INLINE
+#include "time_random123.h"
+
+#define TEST_TPL(NAME, N, W, R) \
+typedef struct { \
+ unsigned kcount; \
+ NAME##N##x##W##_ukey_t ukey; \
+ NAME##N##x##W##_ctr_t ctr; \
+ NAME##N##x##W##_ctr_t *octrs; \
+} ThreadData_##NAME##N##x##W##_##R; \
+\
+typedef struct { \
+ ThreadData_##NAME##N##x##W##_##R *tp; \
+ volatile ThreadInfo *tip; \
+} ThreadArg_##NAME##N##x##W##_##R; \
+\
+/* thread_run is launched in a new thread by pthread_create */ \
+void *thread_run_##NAME##N##x##W##_##R(void *p) \
+{ \
+ ThreadArg_##NAME##N##x##W##_##R *ta = p; \
+ ThreadData_##NAME##N##x##W##_##R *tp = ta->tp; \
+ volatile ThreadInfo *tip = ta->tip; \
+ /* store our thread id for use by get_global_info */ \
+ tip->tid = pthread_self(); \
+ tip->started = 1; \
+ test_##NAME##N##x##W##_##R(tp->kcount, tp->ctr, tp->ukey, tp->octrs); \
+ return tp; \
+}\
+void NAME##N##x##W##_##R(NAME##N##x##W##_ctr_t ctr, NAME##N##x##W##_ukey_t ukey, NAME##N##x##W##_ctr_t kactr, unsigned count, void* unused) \
+{ \
+ const char *kernelname = #NAME #N "x" #W "_" #R; \
+ double cur_time; \
+ int i, n, niterations = numtrials; /* we make niterations + 2 (warmup, overhead) calls to the kernel */ \
+ double basetime = 0., dt = 0., mindt = 0.; \
+ ThreadData_##NAME##N##x##W##_##R td; /* same for all threads */ \
+ ThreadArg_##NAME##N##x##W##_##R *tap; /* args for thread_run, 1 per thread */ \
+ pthread_t me = pthread_self(); /* parent thread id */ \
+ pthread_t *tids; /* array of child thread ids */ \
+ void *vp; /* return from join */ \
+ (void)unused; /* suppress warning */ \
+ CHECKNOTZERO(thread_info = (ThreadInfo *) malloc(sizeof(thread_info[0])*thread_count)); \
+ CHECKNOTZERO(tap = (ThreadArg_##NAME##N##x##W##_##R *) malloc(sizeof(tap[0])*thread_count)); \
+ CHECKNOTZERO(tids = (pthread_t *) malloc(sizeof(tids[0])*thread_count)); \
+ for (i = 0; i < thread_count; i++) { \
+ thread_info[i].started = 0; \
+ thread_info[i].tid = me; \
+ tap[i].tip = &thread_info[i]; \
+ tap[i].tp = &td; \
+ } \
+ CHECKNOTZERO(td.octrs = (NAME##N##x##W##_ctr_t *) malloc(sizeof(td.octrs[0])*thread_count)); \
+ td.ukey = ukey; \
+ td.ctr = ctr; \
+ td.kcount = 0; \
+ for (n = -2; n < niterations; n++) { \
+ if (n == -2) { \
+ if (count == 0) { \
+ /* try to set a good guess for count */ \
+ count = 1000000; \
+ dprintf(("starting with count = %u\n", count)); \
+ } \
+ td.kcount = count; \
+ } else if (n == -1) { \
+ /* use first iteration time to calibrate count to get approximately sec_per_trial */ \
+ if (count > 1) { \
+ count = (unsigned)(count * sec_per_trial / dt); \
+ dprintf(("scaled count = %u\n", count)); \
+ } \
+ /* second iteration is to calculate overhead after warmup */ \
+ td.kcount = 1; \
+ } else if (n == 0) { \
+ int xj; \
+ /* Check that we got the expected value */ \
+ for (xj = 0; xj < N; xj++) { \
+ if (kactr.v[xj] != td.octrs[0].v[xj]) { \
+ printf("%s mismatch: xj = %d, expected\n", kernelname, xj); \
+ printline_##NAME##N##x##W##_##R(ukey, ctr, &kactr, 1); \
+ printf(" but got\n"); \
+ printline_##NAME##N##x##W##_##R(ukey, ctr, td.octrs, 1); \
+ if(!debug) exit(1); \
+ else break; \
+ } else { \
+ dprintf(("%s matched word %d\n", kernelname, xj)); \
+ } \
+ } \
+ basetime = dt; \
+ if (verbose) { \
+ dprintf(("%s %.3f secs\n", kernelname, basetime)); \
+ printline_##NAME##N##x##W##_##R(ukey, ctr, td.octrs, thread_count); \
+ } \
+ td.kcount = count + 1; \
+ } \
+ dprintf(("call function %s\n", kernelname)); \
+ (void)timer(&cur_time); \
+ for (i = 0; i < thread_count; i++) { \
+ CHECKZERO(pthread_create(&tids[i], NULL, thread_run_##NAME##N##x##W##_##R, &tap[i])); \
+ dprintf(("thread %d started\n", i)); \
+ } \
+ for (i = 0; i < thread_count; i++) { \
+ CHECKZERO(pthread_join(tids[i], &vp)); \
+ dprintf(("thread %d done\n", i)); \
+ } \
+ dt = timer(&cur_time); \
+ dprintf(("iteration %d took %.3f secs\n", n, dt)); \
+ ALLZEROS(td.octrs, thread_count, N); \
+ if (n == 0 || dt < mindt) mindt = dt; \
+ } \
+ if (count > 1) { \
+ double tpB = (mindt - basetime) / ( (td.kcount - 1.) * thread_count * (N * W / 8.) ); \
+ printf("%-17s %#5.3g GB/s %u B granularity (best %u in %.3f s - %.6f s)\n", \
+ kernelname, 1e-9/tpB, \
+ (unsigned)(N*W/8), td.kcount, mindt, basetime ); \
+ fflush(stdout); \
+ } \
+ free((void *) thread_info); \
+ thread_info = NULL; \
+ free(td.octrs); \
+ free(tap); \
+ free(tids); \
+}
+
+#include "util_expandtpl.h"
+
+int main(int argc, char **argv)
+{
+ char *cp;
+ unsigned count = 0;
+ int keyctroffset = 0;
+ void *infop = NULL;
+
+ progname = argv[0];
+ if (argc > 3|| (argv[1] && argv[1][0] == '-')) {
+ fprintf(stderr, "Usage: %s [COUNT]\n", progname);
+ exit(1);
+ }
+ if (argc > 1)
+ count = atoi(argv[1]);
+ if ((cp = getenv("TIME_THREAD_NTHREADS")) != NULL) {
+ thread_count = atoi(cp);
+ }
+ printf("Running with %d threads. Try 'env TIME_THREAD_NTHREADS=N %s' to change it\n", thread_count, argv[0]);
+
+ if ((cp = getenv("TIME_THREAD_VERBOSE")) != NULL) {
+ verbose = atoi(cp);
+ }
+ if ((cp = getenv("TIME_THREAD_DEBUG")) != NULL) {
+ debug = atoi(cp);
+ }
+ if ((cp = getenv("TIME_THREAD_OFFSET")) != NULL) {
+ keyctroffset = atoi(cp);
+ }
+ if ((cp = getenv("TIME_THREAD_NUMTRIALS")) != NULL) {
+ numtrials = atoi(cp);
+ }
+ if ((cp = getenv("TIME_THREAD_SEC_PER_TRIAL")) != NULL) {
+ sec_per_trial = atof(cp);
+ }
+# include "time_initkeyctr.h"
+ return 0;
+}
diff --git a/tests/timers.cpp b/tests/timers.cpp
@@ -0,0 +1,249 @@
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+ notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions, and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+#include "util.h"
+
+#include <Random123/philox.h>
+#include <Random123/threefry.h>
+#include <Random123/aes.h>
+#include <Random123/ars.h>
+#include <cstdio>
+#include <cmath>
+#include <string>
+#include <iostream>
+#include <sstream>
+#include <cstring>
+#if R123_USE_X86INTRIN_H
+#include <x86intrin.h>
+#endif
+#include "util_demangle.hpp"
+#include "util.h"
+
+using namespace r123;
+
+const char *progname;
+int debug = 0;
+double cpu_hz = -1.0;
+
+using namespace std;
+
+namespace{
+ template <typename B> void timer();
+} // namespace <anon>
+
+int main(int argc, char **argv){
+ progname = argv[0];
+
+ const char *envp;
+ if( (envp = getenv("TIMERS_CPU_GHZ"))){
+ cpu_hz = 1.e9 * atof(envp);
+ }
+#if R123_USE_AES_NI
+ if( argc == 1 || strcmp(argv[1], "ARS")==0 ){
+ if(haveAESNI()){
+ timer<ARS1xm128i_R<5> >();
+ timer<ARS4x32_R<5> >();
+ timer<ARS1xm128i_R<7> >();
+ timer<ARS4x32_R<7> >();
+ timer<ARS1xm128i_R<10> >();
+ timer<AESNI1xm128i >();
+ }else{
+ cout << "Skipping Bijections that use AES-NI instructions that are not available on this platform\n";
+ }
+ }
+#else
+ cout << "This binary is not compiled with AES-NI support. Skipping the ARS bijections\n";
+#endif // R123_USE_AES_NI
+
+ if( argc == 1 || strcmp(argv[1], "AES")==0 ){
+#if R123_USE_AES_OPENSSL
+ cout << "\n";
+ timer<AESOpenSSL16x8>();
+#endif
+ }
+
+ if( argc == 1 || strcmp(argv[1], "Threefry4x32")==0 ) {
+ cout << "\n";
+ timer<Threefry4x32_R<12> >();
+ timer<Threefry4x32_R<20> >();
+ timer<Threefry4x32 >();
+ }
+
+#if R123_USE_64BIT
+ if( argc == 1 || strcmp(argv[1], "Threefry2x64")==0 ){
+ cout << "\n";
+ timer<Threefry2x64_R<13> >();
+ timer<Threefry2x64_R<20> >();
+ timer<Threefry2x64 >();
+ }
+
+ if( argc == 1 || strcmp(argv[1], "Threefry4x64")==0 ){
+ cout << "\n";
+ timer<Threefry4x64_R<12> >();
+ timer<Threefry4x64_R<20> >();
+ timer<Threefry4x64 >();
+ timer<Threefry4x64_R<72> >();
+ }
+#else
+ cout << "\n64bit types not implemented. Skipping Threefry-Nx64 bijections\n";
+#endif
+
+#if R123_USE_PHILOX_64BIT
+ if( argc == 1 || strcmp(argv[1], "Philox2x64") == 0 ){
+ cout << "\n";
+ timer<Philox2x64_R<6> >();
+ timer<Philox2x64_R<10> >();
+ }
+
+ if( argc == 1 || strcmp(argv[1], "Philox4x64") == 0 ){
+ cout << "\n";
+ timer<Philox4x64_R<7> >();
+ timer<Philox4x64_R<10> >();
+ }
+#else
+ cout << "\n64x64->128bit multiplication is not implmented. Skipping Philox-Nx64 bijections\n";
+#endif
+
+ if( argc == 1 || strcmp(argv[1], "Philox4x32") == 0 ){
+ cout << "\n";
+ timer<Philox4x32_R<7> >();
+ timer<Philox4x32_R<10> >();
+ }
+
+ return 0;
+}
+
+
+namespace{
+
+// To prevent the compiler from noticing that the result of the
+// bijection is never used and eliding the entire calculation, we
+// accumulate the output of millions of calls to the bijection. All
+// the ctr_types are sufficiently container-like that we can just
+// loop over the contents, doing += on each value_type
+template <typename CtrType>
+CtrType& operator+=(CtrType& lhs, CtrType rhs){
+ typename CtrType::const_iterator rp = rhs.cbegin();
+ for(typename CtrType::iterator lp=lhs.begin(); lp!=lhs.end(); ++lp)
+ *lp ^= *rp++;
+ return lhs;
+}
+
+// We've accumulated it, but we still have to use it. A non-zero
+// test serves the purpose:
+template <typename CtrType>
+bool nz(const CtrType v){
+ for(typename CtrType::const_iterator vp=v.cbegin(); vp!=v.cend(); ++vp)
+ if( *vp ) return true;
+ return false;
+}
+
+#if R123_USE_AES_NI
+// The "obvious" solution for ctr_types whose value_type doesn't
+// have += defined (e.g., m128i) would be to overload += on the
+// value_type. But we can't do that in gcc because m128i is typedefed
+// to a fancy compiler-specific builtin type, and you can only overload
+// += on classes and enums. So instead we specialize += on the
+// array instead of on the value_type:
+template<>
+r123array1xm128i& operator+=(r123array1xm128i& lhs, r123array1xm128i rhs){
+ typedef r123array1xm128i CtrType;
+ CtrType::const_iterator rp = rhs.cbegin();
+ for(CtrType::iterator lp=lhs.begin(); lp!=lhs.end(); ++lp)
+ lp->m = _mm_xor_si128(*lp, *rp++);
+ return lhs;
+}
+#endif
+
+template <typename B>
+void timer(){
+ typedef typename B::ctr_type ctr_type;
+ ctr_type sum = {{}};
+ uint_fast64_t N = 1000000; // First try only a few thousand...
+ B b;
+ int bytes_per_call = sizeof(ctr_type);
+ cout << demangle(b) << ": gran: " << bytes_per_call;
+
+ ctr_type c0 = {{}};
+ const char *envp;
+ if((envp = getenv("TIMERS_COUNTER"))){
+ std::istringstream iss((std::string(envp)));
+ iss >> c0;
+ }
+
+ typename B::ukey_type uk = {{}};
+ if( (envp = getenv("TIMERS_KEY"))){
+ std::istringstream iss((std::string(envp)));
+ iss >> uk;
+ }
+ typename B::key_type k(uk);
+
+ ctr_type c = c0;
+ double clk;
+ ::timer(&clk);
+ for(uint_fast64_t i=0; i<N; ++i){
+ c.incr();
+ sum += b(c, k);
+ }
+ double dur = ::timer(&clk);
+
+ double bestrate = 0.;
+ double bestdur = 0.;
+ uint_fast64_t bestN = 0;
+ for(size_t t=0; t<5; ++t){
+ ctr_type c = c0;
+ N = (uint_fast64_t)(N*(0.1/dur));
+ ::timer(&clk);
+ for(uint_fast64_t i=0; i<N; ++i){
+ c.incr();
+ sum += b(c, k);
+ }
+ dur = ::timer(&clk);
+ double rate = N*bytes_per_call/dur;
+ if( rate > bestrate ){
+ bestrate = rate;
+ bestN = N;
+ bestdur = dur;
+ }
+ }
+ cout << " (best of 5) " << bestN << " bijections in " << bestdur << " sec. rate: " << bestrate*1.e-9 << "GB/s";
+ if( cpu_hz > 0. )
+ cout << " cpB: " << cpu_hz/bestrate;
+ cout << endl;
+
+ if(!nz(sum))
+ cout << "Don't let the compiler optimize it all away... sum==0. That's a surprise!\n";
+}
+
+} // namespace <anonymous>
+
+
diff --git a/tests/ut_Engine.cpp b/tests/ut_Engine.cpp
@@ -0,0 +1,246 @@
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+ notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions, and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+// TODO - really do a thorough and complete set of tests.
+
+#ifdef _MSC_FULL_VER
+// Engines have multiple copy constructors, quite legal C++, disable MSVC complaint
+#pragma warning (disable : 4521)
+#endif
+
+#include <Random123/philox.h>
+#include <Random123/aes.h>
+#include <Random123/threefry.h>
+#include <Random123/ars.h>
+#include <Random123/conventional/Engine.hpp>
+#include <Random123/ReinterpretCtr.hpp>
+#if R123_USE_CXX11_RANDOM
+#include <random>
+#endif
+#include <cassert>
+#include <iostream>
+#include <sstream>
+#include "util_demangle.hpp"
+
+using namespace std;
+using namespace r123;
+
+template <typename EType>
+typename EType::result_type kat1000(){
+ // A zero return says that no KAT is known. This makes
+ // sense for the ReniterpretCtr-based engines which are
+ // expected to produce endian-specific results, so we
+ // don't have known answers for them.
+ return 0;
+}
+
+#if R123_USE_64BIT
+#if R123_USE_PHILOX_64BIT
+template <> uint64_t kat1000<Engine<Philox2x64 > >(){ return R123_64BIT(10575809911605703474); }
+#endif
+template <> uint64_t kat1000<Engine<Threefry2x64 > >(){ return R123_64BIT(17578122881062615727); }
+#endif
+template <> uint32_t kat1000<Engine<Philox4x32 > >(){ return 1721865298; }
+template <> uint32_t kat1000<Engine<Threefry4x32 > >(){ return 874101813; }
+#if R123_USE_AES_OPENSSL
+template <> uint8_t kat1000<Engine<AESOpenSSL16x8> >(){ return 0237; }
+#endif
+
+#define ASSERTEQ(A, B) assert(A==B); assert(A()==B()); assert(A()==B()); assert(A()==B())
+
+struct DummySeedSeq{
+ template <typename ITER>
+ void generate(ITER b, ITER e){
+ std::fill(b, e, 1);
+ }
+};
+
+template <typename EType>
+void doit(){
+ EType e;
+ cout << "doit<" << demangle(e) << ">";
+ typedef typename EType::cbrng_type BType;
+ typedef typename EType::result_type rtype;
+ typedef typename BType::ctr_type ctype;
+ typedef typename BType::key_type ktype;
+
+ DummySeedSeq dummyss;
+ EType ess(dummyss);
+ assert(ess != e);
+
+ rtype r1 = e();
+ rtype r2 = e(); assert( r1 != r2 );
+ rtype r3 = e(); assert( r3 != r2 && r3 != r1 );
+
+ // We've elsewhere confirmed that the underlying bijections actually "work",
+ // e.g., that they pass the Known Answer Test for some set of test vectors.
+ // Here, we simply check that the output of the Engine corresponds, in the expected
+ // way to the output of the underlying bijection.
+
+ // Check that the first few values out of the engine correspond
+ // to output from the underlying bijection.
+ BType b;
+ ctype c1 = {{}};
+ ktype k = e.getkey();
+ e.seed();
+ for(int i=0; i<100; ++i){
+ c1[0]++;
+ ctype rb = b(c1, k);
+ for(typename ctype::reverse_iterator p=rb.rbegin(); p!=rb.rend(); ++p){
+ rtype re = e();
+ assert( *p == re );
+ }
+ }
+
+ // Check that discard work as expected, i.e., we can keep two
+ // engines "in sync" by discarding from one and stepping the other.
+ EType e2;
+ assert(e2 != e);
+ e2.discard(100*c1.size());
+ ASSERTEQ(e2, e);
+
+ for(int disc=1; disc<50; ++disc){
+ e.discard(disc);
+ assert( e != e2 );
+ for(int j=0; j<disc; ++j) e2();
+ ASSERTEQ(e2, e);
+ }
+
+ // Check that saving and restoring state and the copy constructor
+ // works as expected.
+ ostringstream oss;
+ oss << e2;
+ string s2 = oss.str();
+ int fiftyfive = 55;
+#if R123_USE_CXX11_TYPE_TRAITS
+ // With CXX11, the library has type_traits to prevent
+ // undesirable type resolution against the templated SeedSeq constructor
+ EType e3(fiftyfive);
+#else
+ // Without CXX11, we have to be careful to pass in
+ // a bona fide rtype, and not just something that will promote
+ // to an rtype, if we want the rtype constructor.
+ EType e3((rtype(fiftyfive)));
+#endif
+ EType esave(e);
+ assert(e3 != e2);
+ {
+ istringstream iss(s2);
+ iss >> e3;
+ }
+ ASSERTEQ(e3, e2);
+ assert(e3 != esave );
+ {
+ istringstream iss(s2);
+ iss >> e3;
+ }
+ ASSERTEQ(e3, esave);
+
+ // Check that the constructor-from-rvalue works.
+ EType e4((rtype)99);
+ EType e5;
+ assert(e4 != e5);
+ assert(e4 != e3);
+ e5.seed((rtype)99);
+ ASSERTEQ(e4, e5);
+
+#if R123_USE_STD_RANDOM
+ // Check that we can use an EType with a std::distribution.
+ // Obviously, this requires <random>
+ uniform_int_distribution<int> dieroller(1, 6);
+ vector<int> hist(7);
+ int NROLL = 10000;
+ for(int i=0; i<NROLL; ++i){
+ int roll = dieroller(e5);
+ hist[roll]++;
+ }
+ double chisq = 0.;
+ double expected = NROLL/6.;
+ double var = NROLL*5./36.;
+ for(int pips=1; pips<=6; ++pips){
+ double delta = hist[pips] - expected;
+ chisq += delta*delta/var;
+ }
+ // The critical value of chisq with 6 degrees of freedom
+ // for P=0.01 is 16.81. For P=0.05, it is 12.59
+ const double chicrit = 12.59;
+ if( chisq > chicrit ){
+ printf("std::uniform_int_distribution doesn't look random. Chisq = %g. Does this look like the result of a fair set of dice rolls to you?\n", chisq);
+ for(int pips=1; pips<=6; ++pips){
+ printf("%d pips %d times\n", pips, hist[pips]);
+ }
+ abort(); // a bit harsh, no? It might just be a rare event at the 5% level...
+ }
+#endif
+
+ // Finally do a kat test.
+ EType ekat;
+ ekat.discard(1000);
+ typename EType::result_type r = ekat();
+ typename EType::result_type knownanswer = kat1000<EType>();
+ if( knownanswer != 0 && r != knownanswer )
+ cerr << "KAT mismatch. The 1000th random from " << demangle(ekat) << " is " << r << " it should be " << knownanswer << "\n";
+ assert( knownanswer==0 || r == knownanswer );
+ cout << " OK" << endl;
+}
+
+int main(int, char **){
+#if R123_USE_PHILOX_64BIT
+ doit<Engine<Philox2x64 > >();
+ doit<Engine<ReinterpretCtr<r123array4x32, Philox2x64 > > >();
+#endif
+ doit<Engine<Philox4x32 > >();
+ doit<Engine<Threefry4x32 > >();
+#if R123_USE_64BIT
+ doit<Engine<ReinterpretCtr<r123array4x32, Threefry2x64 > > >();
+ doit<Engine<Threefry2x64 > >();
+ doit<Engine<ReinterpretCtr<r123array2x64, Threefry4x32 > > >();
+#endif
+
+#if R123_USE_AES_NI
+ if( haveAESNI() ){
+ doit<Engine<ARS4x32> >();
+#if R123_USE_64BIT
+ doit<Engine<ReinterpretCtr<r123array2x64, ARS4x32> > >();
+#endif
+ doit<Engine<AESNI4x32> >();
+ }else{
+ cout << "AES is compiled into the binary, but is not available on this hardware\n";
+ }
+#endif
+#if R123_USE_AES_OPENSSL
+ doit<Engine<AESOpenSSL16x8> >();
+#endif
+
+ cout << "ut_Engine: all OK" << endl;
+ return 0;
+}
+
diff --git a/tests/ut_M128.cpp b/tests/ut_M128.cpp
@@ -0,0 +1,151 @@
+/*
+Copyright 2010-2016, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+ notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions, and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+#include <Random123/features/compilerfeatures.h>
+#if !R123_USE_SSE
+#include <stdio.h>
+int main(){ printf("No SSE. Nothing to check\n"); return 0; }
+#else
+
+#include <Random123/features/sse.h>
+#include <sstream>
+
+int main(int, char **){
+ r123m128i uninitialized;
+ __m128i zm = _mm_setzero_si128();
+#if R123_USE_CXX1X_UNRESTRICTED_UNIONS
+ r123m128i zM(zm);
+#else
+ r123m128i zM; zM.m = zm;
+#endif
+ uninitialized.m = _mm_setzero_si128();
+
+ // operator bool (or maybe void*)
+ assert(!uninitialized);
+ assert(!zM);
+
+ // operator=(__m128i)
+ // conversion to __m128i
+ __m128i one = _mm_set_epi32(0, 0, 0, 1);
+ __m128i two = _mm_set_epi32(0, 0, 0, 2);
+ r123m128i One, Two;
+ One = one;
+ Two = two;
+ assert(!!One);
+ assert(!!Two);
+ r123m128i AnotherOne;
+ AnotherOne = one;
+
+ assert( AnotherOne == One );
+ assert( Two != One );
+ __m128i m = One;
+ AnotherOne = m;
+ assert( AnotherOne == One );
+
+ // operator++ (prefix)
+ ++One;
+ assert( One == Two );
+ assert( One != AnotherOne );
+
+ // operator+=(R123_ULONG_LONG)
+ // operator==(R123_ULONG_LONG, r123m128i)
+ R123_ULONG_LONG ull = 2;
+ AnotherOne += 1;
+ for(int i=0; i<1000; ++i){
+ AnotherOne += i;
+ ull += i;
+ for(int j=0; j<i; ++j){
+ assert(One != AnotherOne);
+ ++One;
+ }
+ assert(One == AnotherOne);
+ assert(ull == AnotherOne);
+ }
+
+ // Do some additions that require carrying.
+ // Check the identity behavior of the streams
+ // as well
+#if R123_USE_64BIT
+ for(uint64_t i=0; i<1000; ++i){
+ uint64_t fff = (~((uint64_t)0)) - i;
+ AnotherOne += fff;
+ ull += fff; // will overflow
+ One += fff/2;
+ One += fff - fff/2;
+ assert(AnotherOne == One);
+ assert( !(ull == One) );
+ std::stringstream ss;
+ r123m128i YetAnother;
+ ss << AnotherOne;
+ ss >> YetAnother;
+
+ assert( YetAnother == AnotherOne );
+ }
+#endif
+
+ // Sep 2011 - clang in the fink build of llvm-2.9.1 on MacOS 10.5.8
+ // fails to catch anything, and hence fails this test. I suspect
+ // a problem with the packaging/installation rather than a bug
+ // in llvm. However, if it shows up in other contexts, some
+ // kind of #ifndef might be appropriate. N.B. There's a similar
+ // exception test in ut_carray.cpp
+ bool caught;
+ caught = false;
+ try{
+ (void)(One < AnotherOne);
+ }catch(std::runtime_error& ){ caught = true; }
+ assert(caught);
+
+ caught = false;
+ try{
+ (void)(One <= AnotherOne);
+ }catch(std::runtime_error& ){ caught = true; }
+ assert(caught);
+
+ caught = false;
+ try{
+ (void)(One > AnotherOne);
+ }catch(std::runtime_error& ){ caught = true; }
+ assert(caught);
+
+ caught = false;
+ try{
+ (void)(One >= AnotherOne);
+ }catch(std::runtime_error& ){ caught = true; }
+ assert(caught);
+
+ // assemble_from_u32<r123m128i>
+
+ std::cout << "ut_M128: OK\n";
+ return 0;
+}
+
+#endif
diff --git a/tests/ut_ReinterpretCtr.cpp b/tests/ut_ReinterpretCtr.cpp
@@ -0,0 +1,51 @@
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+ notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions, and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+#include <Random123/ReinterpretCtr.hpp>
+#include <Random123/threefry.h>
+#include <iostream>
+#include "util_demangle.hpp"
+
+using namespace r123;
+int main(int, char **){
+ r123array4x32 c = {{}};
+ r123array4x32 r;
+
+#if R123_USE_64BIT
+ ReinterpretCtr<r123array4x32, Threefry2x64> p;
+ Threefry2x64::key_type kp = {{}};
+ r = p(c, kp);
+ std::cout << demangle(p) << ": " << r << "\n";
+#else
+ std::cout << "Can't test ReinterpretCtr with R123_USE_64BIT = 0\n";
+#endif
+ return 0;
+}
diff --git a/tests/ut_aes.cpp b/tests/ut_aes.cpp
@@ -0,0 +1,106 @@
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+ notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions, and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+// Check our AES implementation against the example in FIPS-197
+
+#include <Random123/aes.h>
+#include <Random123/ReinterpretCtr.hpp>
+#if R123_USE_AES_OPENSSL
+#include <openssl/aes.h>
+#endif
+#include <string>
+#include <cstdio>
+#include <iostream>
+#include <cstring>
+#include <cassert>
+
+using namespace std;
+using namespace r123;
+
+#if !R123_USE_SSE
+int main(int, char **){
+ std::cout << "No SSE support. This test is not compiled\n";
+ return 0;
+}
+#else
+
+#include "util_m128.h"
+
+int main(int, char **){
+ r123array1xm128i IN, K;
+
+ K.v[0].m = m128i_from_charbuf("0001020304050607 08090a0b0c0d0e0f");
+ IN.v[0].m = m128i_from_charbuf("0011223344556677 8899aabbccddeeff");
+ // From FIPS-197, this is the official "right answer"
+ r123array1xm128i right_answer;
+ right_answer[0] = m128i_from_charbuf("69c4 e0d8 6a7b 0430 d8cd b780 70b4 c55a");
+ (void)right_answer; /* don't complain about an unused variable if neither NI nor OPENSSL are enabled. */
+#if R123_USE_AES_NI
+ if( haveAESNI() ){
+ AESNI1xm128i::key_type xk(K);
+ AESNI1xm128i bx;
+ AESNI1xm128i::ctr_type x = bx(IN, xk);
+
+ assert( x==right_answer );
+ cout << "IN: " << m128i_to_string(IN[0]) << "\n";
+ cout << "K : " << m128i_to_string(K[0]) << "\n";
+ cout << "AES:" << m128i_to_string(x[0]) << "\n";
+ cout << "Hooray! AESNI1xm128i(IN, K) matches the published test vector!\n";
+ }else{
+ cout << "The AES-NI instructions are not available on this hardware. Skipping AES-NI tests\n";
+ }
+#else
+ cout << "The AES-NI Bijections are not compiled into this binary. Skipping AES-NI tests\n";
+#endif
+
+ // And let's do it with AESOpenSSL. But since AESOpenSSL has its own
+ // format for keys and counters we make a union for the key types and
+ // use ReinterpretCtr to wrap a union around the counter types.
+#if R123_USE_AES_OPENSSL
+#if R123_USE_AES_NI
+ typedef AESNI1xm128i::ctr_type nictype;
+#else
+ typedef r123array1xm128i nictype;
+#endif
+ AESOpenSSL16x8::ukey_type ouk;
+ _mm_storeu_si128((__m128i*)&ouk.v[0], K.v[0].m);
+ AESOpenSSL16x8::key_type okey(ouk);
+ ReinterpretCtr<nictype, AESOpenSSL16x8> osslb;
+ assert( osslb(IN, okey) == right_answer );
+ cout << "Hooray! AESOpenSSL16x8(IN, K) matches the published test vector!\n";
+#else
+ cout << "The OpenSSL AES implementation is not linked with this binary. Skipping the AESOpenSSL16x8\n";
+#endif // R123_USE_AES_OPENSSL
+
+ return 0;
+}
+
+#endif
diff --git a/tests/ut_ars.c b/tests/ut_ars.c
@@ -0,0 +1,82 @@
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+ notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions, and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+#include <Random123/ars.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#if !R123_USE_SSE
+int main(int argc, char **argv){
+ (void)argc; (void)argv; /* unused */
+ printf("No SSE support. This test is not compiled\n");
+ return 0;
+}
+#else
+#include "util_m128.h"
+
+int
+main(int argc, char **argv)
+{
+#if R123_USE_AES_NI
+ struct r123array1xm128i c, k, ret;
+ char m128str[M128_STR_SIZE], *kat;
+
+ if (haveAESNI()) {
+ c.v[0].m = m128i_from_charbuf("01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00");
+ k.v[0].m = m128i_from_charbuf("01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00");
+ ret = ars1xm128i_R(7, c, k);
+ kat = "2b1623350cd214dc 7740187993411872";
+ if (strcmp(m128i_to_charbuf(ret.v[0].m, m128str), kat) != 0) {
+ fprintf(stderr, "%s: error, expected %s, got %s\n", argv[0], kat, m128str);
+ exit(1);
+ }
+ printf("%s: OK, got %s\n", argv[0], kat);
+ c.v[0].m = m128i_from_charbuf("00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00");
+ k.v[0].m = m128i_from_charbuf("01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00");
+ ret = ars1xm128i_R(7, c, k);
+ kat = "2de6b66fa461b668 f380126f32b9cd22";
+ if (strcmp(m128i_to_charbuf(ret.v[0].m, m128str), kat) != 0) {
+ fprintf(stderr, "%s: error, expected %s, got %s\n", argv[0], kat, m128str);
+ exit(1);
+ }
+ printf("%s: OK, got %s\n", argv[0], kat);
+ } else {
+ printf("%s: no AES-NI on this machine\n", argv[0]);
+ }
+#else
+ printf("%s: no AES-NI compiled into this program\n", argv[0]);
+#endif
+ (void)argc; (void)argv; /* unused */
+ return 0;
+}
+
+#endif
diff --git a/tests/ut_carray.cpp b/tests/ut_carray.cpp
@@ -0,0 +1,319 @@
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+ notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions, and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+#include <Random123/array.h>
+#include <iostream>
+#include <typeinfo>
+#include <sstream>
+#include <limits>
+#include <assert.h>
+#include <vector>
+#include "util_demangle.hpp"
+
+using namespace std;
+
+template<typename T>
+inline static T zero(){ return 0; }
+
+template<typename T>
+inline static T fff(){ return ~T(0); }
+
+template<typename T>
+inline R123_ULONG_LONG ull(const T& t){ return static_cast<R123_ULONG_LONG>(t); }
+
+template <typename T>
+inline uint32_t get32(const T& t, size_t n){
+ return t>>(n*32);
+}
+
+#if R123_USE_SSE
+template<>
+inline r123m128i zero<r123m128i>(){ r123m128i M; M.m=_mm_setzero_si128(); return M;}
+
+template<>
+inline r123m128i fff<r123m128i>(){ r123m128i M; M.m=_mm_set_epi32(~0, ~0, ~0, ~0); return M;}
+
+template<>
+inline R123_ULONG_LONG ull<r123m128i>(const r123m128i& t){
+ return _mm_extract_lo64(t.m);
+}
+
+template <>
+inline uint32_t get32<r123m128i>(const r123m128i& t, size_t n){
+ switch(n){
+ case 3: return _mm_cvtsi128_si32(_mm_srli_si128(t.m, 12));
+ case 2: return _mm_cvtsi128_si32(_mm_srli_si128(t.m, 8));
+ case 1: return _mm_cvtsi128_si32(_mm_srli_si128(t.m, 4));
+ }
+ return _mm_cvtsi128_si32(t.m);
+}
+#endif
+
+struct dummySeedSeq{
+ typedef uint32_t result_type;
+ template <typename ITER>
+ void generate(ITER b, ITER e){
+ uint32_t v = 0xdeadbeef;
+ for(; b!=e; ++b){
+ *b = v;
+ v += 0xbaddecaf;
+ }
+ }
+};
+
+template <typename AType>
+void doit(size_t N, size_t W){
+ AType uninitialized;
+ typedef AType atype;
+ typedef typename atype::value_type vtype;
+ typedef typename atype::iterator itype;
+
+ assert( R123_W(AType) == W );
+
+ cout << "doit<" << demangle(uninitialized) << ">";
+ // size
+ assert(uninitialized.size() == N);
+
+ // width
+ assert(sizeof(vtype)*8 == W);
+ // data
+ assert(uninitialized.data() == &uninitialized.v[0]);
+
+ // front
+ assert(&uninitialized.front() == uninitialized.data());
+
+ // back
+ assert(&uninitialized.back() == uninitialized.data()+(N-1));
+
+ // The ut_carray Random123 unit test uses an empty initializer list to
+ // construct instances of different r123 arrays, in a test that's
+ // templated on array type. This works fine for all of the r123 array
+ // types except r123array1xm128i---i.e., an "array" consisting of a single
+ // __m128i value. GCC defines __m128i as a single long long,
+ //
+ // typedef long long __m128i __attribute__ ((__vector_size__ (16),
+ // __may_alias__));
+ //
+ // while Intel defines it as a union,
+ //
+ // typedef union _MMINTRIN_TYPE(16) __m128i {
+ // #if !defined(_MSC_VER)
+ // /*
+ // * To support GNU compatible intialization with initializers list,
+ // * make first union member to be of int64 type.
+ // */
+ // __int64 m128i_gcc_compatibility[2];
+ // #endif
+ // /*
+ // * Although we do not recommend using these directly, they are here
+ // * for better MS compatibility.
+ // */
+ // __int8 m128i_i8[16];
+ // __int16 m128i_i16[8];
+ // __int32 m128i_i32[4];
+ // __int64 m128i_i64[2];
+ // unsigned __int8 m128i_u8[16];
+ // unsigned __int16 m128i_u16[8];
+ // unsigned __int32 m128i_u32[4];
+ // unsigned __int64 m128i_u64[2];
+ //
+ // /*
+ // * This is what we used to have here alone.
+ // * Leave for backward compatibility.
+ // */
+ // char c[16];
+ // } __m128i;
+ //
+ // but PGI defines __m128i as a struct,
+ //
+ // typedef struct {
+ // private: long long m128i_i64[2];
+ // } __attribute__((aligned(16))) __m128i;
+ //
+ // which can't be initialized with initializer lists before C++11.
+
+ // constructor with initializer. [], at
+#ifndef __PGI
+ AType z = {{}};
+#else
+ AType z;
+ z.fill(zero<vtype>());
+#endif
+ for(unsigned i=0; i<N; ++i){
+ assert(!z[i]);
+ assert(!z.at(i));
+ uninitialized[i] = z[i];
+ uninitialized[i] += (i+1);
+ }
+
+ // Copy-assignment
+ atype iota = uninitialized;
+
+ // begin/end
+ for(itype p=iota.begin(); p!=iota.end(); ++p){
+ assert((int)ull(*p) == 1+ (p-iota.begin()));
+ }
+ // cbegin/cend
+ for(typename atype::const_iterator p=iota.cbegin(); p!=iota.cend(); ++p){
+ assert((int)ull(*p) == 1+ (p-iota.cbegin()));
+ }
+
+ // rbegin/rend
+ for(typename atype::reverse_iterator p=iota.rbegin(); p!=iota.rend(); ++p){
+ assert((int)ull(*p) == iota.rend()-p);
+ }
+
+ // crbegin/crend
+ for(typename atype::const_reverse_iterator p=iota.crbegin(); p!=iota.crend(); ++p){
+ assert((int)ull(*p) == iota.crend()-p);
+ }
+
+ // == and !=
+ assert(iota == uninitialized);
+ assert(!(iota != uninitialized));
+
+ for(size_t i=0; i<N; ++i){
+ atype notequal = iota;
+ ++notequal[i];
+ assert(notequal != iota);
+ assert(!(notequal == iota));
+ }
+
+ // Sep 2011 - clang in the fink build of llvm-2.9.1 on MacOS 10.5.8
+ // fails to catch anything, and hence fails this test. I suspect
+ // a problem with the packaging/installation rather than a bug
+ // in llvm. However, if it shows up in other contexts, some
+ // kind of #ifndef might be appropriate. N.B. There's another
+ // exception test below and one in ut_M128.cpp
+ // check that at throws
+ bool caught = false;
+ try{
+ iota.at(N);
+ }catch(std::out_of_range&){
+ caught = true;
+ }
+ assert(caught);
+
+ // fill
+ vtype one = zero<vtype>();
+ ++one;
+ atype aone;
+ aone.fill(one);
+ for(size_t i=0; i<N; ++i){
+ assert(aone[i] == one);
+ }
+
+ // swap
+ aone.swap(z);
+ for(size_t i=0; i<N; ++i){
+ assert(aone[i] == zero<vtype>());
+ assert(z[i] == one);
+ }
+
+ // seed
+ dummySeedSeq seedseq;
+ aone = atype::seed(seedseq);
+ vector<uint32_t> v32( N*((W+31)/32) );
+ seedseq.generate(v32.begin(), v32.end());
+ size_t jj=0;
+ uint32_t mask = 0xffffffff;
+ if( W < 32 )
+ mask >>= (32-W);
+ for(size_t i=0; i<N; ++i){
+ for(size_t j=0; j<W; j+=32){
+ uint32_t aj = get32(aone[i], j/32);
+ assert( aj == (mask&v32.at(jj)) );
+ jj++;
+ }
+ }
+
+ // incr
+
+#ifndef __PGI
+ atype a = {{}};
+#else
+ atype a;
+ a.fill(zero<vtype>());
+#endif
+ a.incr();
+ a.incr();
+ a.incr();
+ a.incr();
+ assert( ull(a[0]) == 4u );
+ assert( N<2 || ull(a[1]) == 0u );
+
+ a.incr(0xbadcafe);
+ assert( ull(a[0]) == (mask&(4u+0xbadcafe)) );
+
+ // Set the zero'th entry to fff and then increment
+ a[0] = fff<vtype>();
+ a.incr();
+ assert( a[0] == zero<vtype>() );
+ assert( N<2 || ull(a[1]) == (W>8?1u:0xcc));
+
+ a.incr();
+ assert( ull(a[0]) == 1u );
+ assert( N<2 || ull(a[1]) == (W>8?1u:0xcc) );
+
+ R123_ULONG_LONG ulfff = ull(fff<vtype>());
+
+ a.incr(ulfff);
+ a.incr(ulfff - 5u);
+ a.incr(2);
+ a.incr(2);
+ a.incr(2);
+ a.incr(2);
+
+ // operator<< and operator>>
+
+ std::stringstream ss;
+ ss << a;
+ AType b;
+ ss >> b;
+ assert(a == b);
+ cout << " OK\n";
+}
+
+
+int main(int, char **){
+#if R123_USE_SSE
+ doit<r123array1xm128i>(1, 128);
+#endif
+ doit<r123array2x32>(2, 32);
+ doit<r123array4x32>(4, 32);
+#if R123_USE_64BIT
+ doit<r123array2x64>(2, 64);
+ doit<r123array4x64>(4, 64);
+#endif
+ doit<r123array16x8>(16, 8);
+ return 0;
+}
+
diff --git a/tests/ut_features.cpp b/tests/ut_features.cpp
@@ -0,0 +1,469 @@
+/*
+Copyright 2010-2016, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+ notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions, and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+// This "unit test" is basically a test of the completeness
+// of compilerfeatures.hpp. Each of the pp-symbols in compilerfeatures.hpp
+// is supposed to have a definition. We check them all, and
+// in some cases, emit some appropriate code to check that
+// they reflect reality.
+#include <assert.h>
+#include <Random123/features/compilerfeatures.h>
+#include <iostream>
+
+struct Outputter{
+ Outputter(const char *name, int value){
+ std::cout << name << " " << value << std::endl;
+ }
+};
+
+// Many symbols rely on the pp-convention of
+// expanding undefined values in arithmetic expressions to 0.
+// Thus, we can't do something terse like:
+// #define Out(Sym) Outputter outputter##Sym(#Sym, Sym)
+// Instead, we have to force the preprocessor to evaluate
+// the symbol.
+// #if Sym
+// Otrue(Sym)
+// #else
+// Ofalse(Sym)
+// #endif
+#define Otrue(Sym) Outputter outputter##Sym(#Sym, true)
+#define Ofalse(Sym) Outputter outputter##Sym(#Sym, false)
+
+#ifndef R123_USE_X86INTRIN_H
+#error "No R123_USE_X86INTRIN_H"
+#endif
+#if R123_USE_X86INTRIN_H
+#include <x86intrin.h>
+Otrue(R123_USE_X86INTRIN_H);
+#else
+Ofalse(R123_USE_X86INTRIN_H);
+#endif
+
+#ifndef R123_USE_IA32INTRIN_H
+#error "No R123_USE_IA32INTRIN_H"
+#endif
+#if R123_USE_IA32INTRIN_H
+Otrue(R123_USE_IA32INTRIN_H);
+#include <ia32intrin.h>
+#else
+Ofalse(R123_USE_IA32INTRIN_H);
+#endif
+
+#ifndef R123_USE_XMMINTRIN_H
+#error "No R123_USE_XMMINTRIN_H"
+#endif
+#if R123_USE_XMMINTRIN_H
+#include <xmmintrin.h>
+Otrue(R123_USE_XMMINTRIN_H);
+#else
+Ofalse(R123_USE_XMMINTRIN_H);
+#endif
+
+#ifndef R123_USE_EMMINTRIN_H
+#error "No R123_USE_EMMINTRIN_H"
+#endif
+#if R123_USE_EMMINTRIN_H
+#include <emmintrin.h>
+Otrue(R123_USE_EMMINTRIN_H);
+#else
+Ofalse(R123_USE_EMMINTRIN_H);
+#endif
+
+#ifndef R123_USE_SMMINTRIN_H
+#error "No R123_USE_SMMINTRIN_H"
+#endif
+#if R123_USE_SMMINTRIN_H
+Otrue(R123_USE_SMMINTRIN_H);
+#include <smmintrin.h>
+#else
+Ofalse(R123_USE_SMMINTRIN_H);
+#endif
+
+#ifndef R123_USE_WMMINTRIN_H
+#error "No R123_USE_WMMINTRIN_H"
+#endif
+#if R123_USE_WMMINTRIN_H
+Otrue(R123_USE_WMMINTRIN_H);
+#include <wmmintrin.h>
+#else
+Ofalse(R123_USE_WMMINTRIN_H);
+#endif
+
+#ifndef R123_USE_INTRIN_H
+#error "No R123_USE_INTRIN_H"
+#endif
+#if R123_USE_INTRIN_H
+Otrue(R123_USE_INTRIN_H);
+#include <intrin.h>
+#else
+Ofalse(R123_USE_INTRIN_H);
+#endif
+
+#ifndef R123_USE_SSE
+#error "No R123_USE_SSE"
+#endif
+#if R123_USE_SSE
+Otrue(R123_USE_SSE);
+#include <Random123/features/sse.h>
+__m128i mm;
+#else
+Ofalse(R123_USE_SSE);
+#endif
+
+#ifndef R123_CUDA_DEVICE
+#error "No R123_CUDA_DEVICE"
+#endif
+R123_CUDA_DEVICE void cuda_device_func(){}
+
+// C++11 features
+#ifndef R123_USE_CXX11_UNRESTRICTED_UNIONS
+#error "No R123_USE_CXX11_UNRESTRICTED_UNIONS"
+#endif
+#if R123_USE_CXX11_UNRESTRICTED_UNIONS
+Otrue(R123_USE_CXX11_UNRESTRICTED_UNIONS);
+struct defaulted_ctor{
+ int i;
+ defaulted_ctor()=default;
+ defaulted_ctor(const defaulted_ctor& d) : i(d.i){}
+};
+union unrestricted{
+ int i;
+ defaulted_ctor dc;
+};
+#else
+Ofalse(R123_USE_CXX11_UNRESTRICTED_UNIONS);
+#endif
+
+#ifndef R123_USE_CXX11_STATIC_ASSERT
+#error "No R123_USE_CXX11_STATIC_ASSERT"
+#endif
+#if R123_USE_CXX11_STATIC_ASSERT
+Otrue(R123_USE_CXX11_STATIC_ASSERT);
+static_assert(true, "this shouldn't be a problem");
+#else
+Ofalse(R123_USE_CXX11_STATIC_ASSERT);
+#endif
+
+#ifndef R123_USE_CXX11_CONSTEXPR
+#error "No R123_USE_CXX11_CONSTEXPR"
+#endif
+#if R123_USE_CXX11_CONSTEXPR
+Otrue(R123_USE_CXX11_CONSTEXPR);
+constexpr int zero() {return 0;}
+#else
+Ofalse(R123_USE_CXX11_CONSTEXPR);
+#endif
+
+#ifndef R123_USE_CXX11_EXPLICIT_CONVERSIONS
+#error "No R123_USE_CXX11_EXPLICIT_CONVERSIONS"
+#endif
+#if R123_USE_CXX11_EXPLICIT_CONVERSIONS
+Otrue(R123_USE_CXX11_EXPLICIT_CONVERSIONS);
+struct explicit_converter{
+ explicit operator bool() const {return true;}
+};
+#else
+Ofalse(R123_USE_CXX11_EXPLICIT_CONVERSIONS);
+#endif
+
+#ifndef R123_USE_CXX11_RANDOM
+#error "No R123_USE_CXX11_RANDOM"
+#endif
+#if R123_USE_CXX11_RANDOM
+Otrue(R123_USE_CXX11_RANDOM);
+#include <random>
+#else
+Ofalse(R123_USE_CXX11_RANDOM);
+#endif
+
+#ifndef R123_USE_CXX11_TYPE_TRAITS
+#error "No R123_USE_CXX11_TYPE_TRAITS"
+#endif
+#if R123_USE_CXX11_TYPE_TRAITS
+Otrue(R123_USE_CXX11_TYPE_TRAITS);
+#include <type_traits>
+#else
+Ofalse(R123_USE_CXX11_TYPE_TRAITS);
+#endif
+
+#ifndef R123_USE_CXX11_LONG_LONG
+#error "No R123_USE_CXX11_LONG_LONG"
+#endif
+#if R123_USE_CXX11_LONG_LONG
+Otrue(R123_USE_CXX11_LONG_LONG);
+unsigned long long ull;
+#else
+Ofalse(R123_USE_CXX11_LONG_LONG);
+#endif
+
+#ifndef R123_USE_CXX11_STD_ARRAY
+#error "No R123_USE_CXX11_STD_ARRAY"
+#endif
+#if R123_USE_CXX11_STD_ARRAY
+Otrue(R123_USE_CXX11_STD_ARRAY);
+#include <array>
+std::array<int, 4> sai4;
+#else
+Ofalse(R123_USE_CXX11_STD_ARRAY);
+#endif
+
+#ifndef R123_FORCE_INLINE
+#error "No R123_FORCE_INLINE"
+#endif
+inline R123_FORCE_INLINE(int forcibly_inlined(int i));
+inline int forcibly_inlined(int i){ return i+1;}
+
+#ifndef R123_USE_AES_NI
+#error "No R123_USE_AES_NI"
+#endif
+#if R123_USE_AES_NI
+Otrue(R123_USE_AES_NI);
+__m128i aes(__m128i in){
+ if( haveAESNI() )
+ return _mm_aesenc_si128(in, in);
+ else
+ return _mm_setzero_si128();
+}
+#else
+Ofalse(R123_USE_AES_NI);
+#endif
+
+#ifndef R123_USE_SSE4_2
+#error "No R123_USE_SSE4_2"
+#endif
+#if R123_USE_SSE4_2
+Otrue(R123_USE_SSE4_2);
+__m128i sse42(__m128i in){
+ return _mm_cmpgt_epi64(in, in);
+}
+#else
+Ofalse(R123_USE_SSE4_2);
+#endif
+
+#ifndef R123_USE_SSE4_1
+#error "No R123_USE_SSE4_1"
+#endif
+#if R123_USE_SSE4_1
+Otrue(R123_USE_SSE4_1);
+int sse41(__m128i in){
+ return _mm_testz_si128(in, in);
+}
+#else
+Ofalse(R123_USE_SSE4_1);
+#endif
+
+#ifndef R123_USE_AES_OPENSSL
+#error "No R123_USE_AES_OPENSSL"
+#endif
+#if R123_USE_AES_OPENSSL
+Otrue(R123_USE_AES_OPENSSL);
+#include <openssl/aes.h>
+#else
+Ofalse(R123_USE_AES_OPENSSL);
+#endif
+
+#ifndef R123_USE_GNU_UINT128
+#error "No R123_USE_GNU_UINT128"
+#endif
+#if R123_USE_GNU_UINT128
+Otrue(R123_USE_GNU_UINT128);
+__uint128_t u128;
+#else
+Ofalse(R123_USE_GNU_UINT128);
+#endif
+
+#ifndef R123_USE_ASM_GNU
+#error "No R123_USE_ASM_GNU"
+#endif
+#if R123_USE_ASM_GNU
+Otrue(R123_USE_ASM_GNU);
+#if defined(__x86_64__) || defined(__i386__)
+int use_gnu_asm(){
+ unsigned int eax, ebx, ecx, edx;
+ __asm__ __volatile__ ("cpuid": "=a" (eax), "=b" (ebx), "=c" (ecx), "=d" (edx) :
+ "a" (1));
+ return (ecx>>25) & 1;
+}
+#else
+int use_gnu_asm(){ return 0; }
+#endif
+#else
+Ofalse(R123_USE_ASM_GNU);
+#endif
+
+#ifndef R123_USE_CPUID_MSVC
+#error "No R123_USE_CPUID_MSVC"
+#endif
+#if R123_USE_CPUID_MSVC
+Otrue(R123_USE_CPUID_MSVC);
+int chkcpuid(){
+ int CPUInfo[4];
+ __cpuid(CPUInfo, 1);
+ return CPUInfo[2]&(1<<25);
+}
+#else
+Ofalse(R123_USE_CPUID_MSVC);
+#endif
+
+#ifndef R123_USE_MULHILO32_ASM
+#error "No R123_USE_MULHILO32_ASM"
+#endif
+#if R123_USE_MULHILO32_ASM
+Otrue(R123_USE_MULHILO32_ASM);
+#else
+Ofalse(R123_USE_MULHILO32_ASM);
+#endif
+
+#ifndef R123_USE_MULHILO64_ASM
+#error "No R123_USE_MULHILO64_ASM"
+#endif
+#if R123_USE_MULHILO64_ASM
+Otrue(R123_USE_MULHILO64_ASM);
+#else
+Ofalse(R123_USE_MULHILO64_ASM);
+#endif
+
+#ifndef R123_USE_MULHILO64_MSVC_INTRIN
+#error "No R123_USE_MULHILO_MSVC_INTRIN"
+#endif
+#if R123_USE_MULHILO64_MSVC_INTRIN
+Otrue(R123_USE_MULHILO64_MSVC_INTRIN);
+#include <cstdint>
+void msvc64mul(){
+ uint64_t a=1000000000000000000;
+ uint64_t b=a;
+ uint64_t h, l;
+ l = _umul128(a, b, &h);
+ assert( l == a*b);
+ assert( h == 54210108624275221ULL );
+}
+#else
+Ofalse(R123_USE_MULHILO64_MSVC_INTRIN);
+#endif
+
+#ifndef R123_USE_MULHILO64_CUDA_INTRIN
+#error "No R123_USE_MULHILO64_CUDA_INTRIN"
+#endif
+#if R123_USE_MULHILO64_CUDA_INTRIN
+Otrue(R123_USE_MULHILO64_CUDA_INTRIN);
+#else
+Ofalse(R123_USE_MULHILO64_CUDA_INTRIN);
+#endif
+
+#ifndef R123_USE_MULHILO64_OPENCL_INTRIN
+#error "No R123_USE_MULHILO64_OPENCL_INTRIN"
+#endif
+#if R123_USE_MULHILO64_OPENCL_INTRIN
+Otrue(R123_USE_MULHILO64_OPENCL_INTRIN);
+#else
+Ofalse(R123_USE_MULHILO64_OPENCL_INTRIN);
+#endif
+
+#ifndef R123_USE_MULHILO64_MULHI_INTRIN
+#error "No R123_USE_MULHILO64_MULHI_INTRIN"
+#endif
+#if R123_USE_MULHILO64_MULHI_INTRIN
+Otrue(R123_USE_MULHILO64_MULHI_INTRIN);
+static int test_mulhilo64_intrin(){
+ uint64_t a = R123_64BIT(0x1234567887654321);
+ uint64_t b = R123_64BIT(0x8765432112345678);
+ uint64_t c = R123_MULHILO64_MULHI_INTRIN(a, b);
+ assert( c == R123_64BIT(0x09A0CD05B99FE92E) );
+ return c == R123_64BIT(0x09A0CD05B99FE92E);
+}
+int mulhilo64_intrin_ok = test_mulhilo64_intrin();
+#else
+Ofalse(R123_USE_MULHILO64_MULHI_INTRIN);
+#endif
+
+#ifndef R123_USE_MULHILO32_MULHI_INTRIN
+#error "No R123_USE_MULHILO32_MULHI_INTRIN"
+#endif
+#if R123_USE_MULHILO32_MULHI_INTRIN
+Otrue(R123_USE_MULHILO32_MULHI_INTRIN);
+static int test_mulhilo32_intrin(){
+ uint64_t a32 = 0x12345678;
+ uint64_t b32 = 0x87654321;
+ uint64_t c32 = R123_MULHILO32_MULHI_INTRIN(a32, b32);
+ assert( c32 == 0x09A0CD05 );
+ return c32 == 0x09A0CD05;
+}
+int mulhilo32_intrin_ok = test_mulhilo32_intrin();
+#else
+Ofalse(R123_USE_MULHILO32_MULHI_INTRIN);
+#endif
+
+#ifndef R123_USE_MULHILO64_C99
+#error "No R123_USE_MULHILO64_C99"
+#endif
+#if R123_USE_MULHILO64_C99
+Otrue(R123_USE_MULHILO64_C99);
+#else
+Ofalse(R123_USE_MULHILO64_C99);
+#endif
+
+#ifndef R123_64BIT
+#error "No R123_64BIT"
+#else
+void xx() {
+ uint64_t a = R123_64BIT(0x1234567890abcdef);
+ assert ( (a >> 60) == 0x1 );
+}
+#endif
+
+#ifndef R123_USE_PHILOX_64BIT
+#error "No R123_USE_PHILOX_64BIT"
+#endif
+#if R123_USE_PHILOX_64BIT
+Otrue(R123_USE_PHILOX_64BIT);
+#else
+Ofalse(R123_USE_PHILOX_64BIT);
+#endif
+
+#ifndef R123_ASSERT
+#error "No R123_ASSERT"
+#else
+void chkassert(){
+ R123_ASSERT(1);
+}
+#endif
+
+#ifndef R123_STATIC_ASSERT
+#error "No R123_STATIC_ASSERT"
+#else
+R123_STATIC_ASSERT(1, "looks true to me");
+void chkstaticassert(){
+ R123_STATIC_ASSERT(1, "it's ok inside a function too");
+}
+#endif
+
+int main(int , char **){return 0;}
diff --git a/tests/ut_gsl.c b/tests/ut_gsl.c
@@ -0,0 +1,112 @@
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+ notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions, and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+#include <gsl/gsl_randist.h>
+#include <stdio.h>
+#include "Random123/philox.h"
+#include "Random123/threefry.h"
+#include "Random123/conventional/gsl_cbrng.h"
+#include <assert.h>
+
+/* Exercise the GSL_CBRNG macro */
+
+GSL_CBRNG(cbrng, threefry4x64); /* creates gsl_rng_cbrng */
+
+int main(int argc, char **argv){
+ int i;
+ gsl_rng *r;
+ gsl_rng *rcopy;
+ unsigned long save, x;
+ unsigned long saved[5];
+ double sum = 0.;
+ (void)argc; (void)argv; /* unused */
+
+ r = gsl_rng_alloc(gsl_rng_cbrng);
+ assert (gsl_rng_min(r) == 0);
+ assert (gsl_rng_max(r) == 0xffffffffUL); // Not necessarily ~0UL
+ assert (gsl_rng_size(r) > 0);
+
+ printf("%s\nulongs from %s in initial state\n", argv[0], gsl_rng_name(r));
+ for (i = 0; i < 5; i++) {
+ x = gsl_rng_get(r);
+ saved[i] = x;
+ printf("%d: 0x%lx\n", i, x);
+ assert(x != 0);
+ }
+ printf("uniforms from %s\n", gsl_rng_name(r));
+ for (i = 0; i < 5; i++) {
+ double z = gsl_rng_uniform(r);
+ sum += z;
+ printf("%d: %.4g\n", i, z);
+ }
+ assert( sum < 0.9*5 && sum > 0.1*5 && (long)"sum must be reasonably close to 0.5*number of trials");
+ save = gsl_rng_get(r);
+
+ gsl_rng_set(r, 0xdeadbeef); /* set a non-zero seed */
+ printf("ulongs from %s after seed\n", gsl_rng_name(r));
+ for (i = 0; i < 5; i++) {
+ x = gsl_rng_get(r);
+ printf("%d: 0x%lx\n", i, x);
+ assert(x != 0);
+ }
+ /* make a copy of the total state */
+ rcopy = gsl_rng_alloc(gsl_rng_cbrng);
+ gsl_rng_memcpy(rcopy, r);
+ printf("uniforms from %s\n", gsl_rng_name(r));
+ sum = 0.;
+ for (i = 0; i < 5; i++) {
+ double x = gsl_rng_uniform(r);
+ double y = gsl_rng_uniform(rcopy);
+ printf("%d: %.4g\n", i, x);
+ sum += x;
+ assert(x == y);
+ }
+ assert(gsl_rng_get(r) != save);
+ assert( sum < 0.9*5 && sum > 0.1*5 && (long)"sum must be reasonably close to 0.5*number of trials");
+
+ /* gsl_rng_set(*, 0) is supposed to recover the default seed */
+ gsl_rng_set(r, 0);
+ printf("ulongs from %s after restore to initial\n", gsl_rng_name(r));
+ for (i = 0; i < 5; i++) {
+ x = gsl_rng_get(r);
+ assert( x == saved[i] );
+ printf("%d: 0x%lx\n", i, x);
+ assert(x != 0);
+ }
+ printf("uniforms from %s\n", gsl_rng_name(r));
+ for (i = 0; i < 5; i++) {
+ printf("%d: %.4g\n", i, gsl_rng_uniform(r));
+ }
+ assert(gsl_rng_get(r) == save);
+
+ gsl_rng_free (r);
+ return 0;
+}
diff --git a/tests/ut_ua.cpp b/tests/ut_ua.cpp
@@ -0,0 +1,63 @@
+/*
+Copyright 2013, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+ notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions, and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+#if __cplusplus<201103L
+#include <iostream>
+int main(int, char**){
+ std::cout << "ua.hpp requires C++11. No tests performed\n";
+ return 0;
+}
+#else
+
+#include <Random123/array.h>
+#include <Random123/threefry.h>
+#include <Random123/uniform.hpp>
+
+using namespace r123;
+int main(int, char **){
+ Threefry4x32 rng;
+ Threefry4x32::ctr_type c = {{1, 2, 3, 4}};
+ Threefry4x32::ukey_type uk = {{5, 6, 7, 8}};
+ Threefry4x32::key_type k = uk;
+ auto a = u01all<float>(rng(c, k)); // returns std::array<float,4>
+ for(auto e : a){
+ std::cout << e << "\n";
+ }
+ c.incr();
+ auto b = u01all<double>(rng(c, k));
+ for(auto e : b){
+ std::cout << e << "\n";
+ }
+
+ return 0;
+}
+#endif
diff --git a/tests/ut_uniform.cpp b/tests/ut_uniform.cpp
@@ -0,0 +1,173 @@
+/*
+Copyright 2013, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+ notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions, and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+ /* ut_uniform.cpp: unit test for uniform.hpp.
+
+ This is a "sanity test" of u01, uneg11 and u01fixedpt. We confirm
+ that a histogram of few thousand calls to each of the functions
+ matches a reference histogram. This verifies that the results are
+ generally sane i.e., they fall within the expected range, and that
+ they are close to a correct distribution. It is *not* a foolproof
+ test of correctness, but it should catch portability issues
+ like errors in r123::make_signed or r123::make_unsigned
+ or r123::maxTvalue or misunderstandings about std::numeric_limits.
+
+ There is a "known answer test" for uniform.hpp in ut_uniform_IEEEkat.cpp,
+ but it is only expected to work on machines with strict IEEE arithmetic
+ and no high-precicision intermediates. See its own comments for
+ more details.
+ */
+
+#include <Random123/uniform.hpp>
+#include <Random123/threefry.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <map>
+#include <string>
+#include <sstream>
+
+using namespace r123;
+
+template <typename T>
+typename r123::make_unsigned<T>::type U(T x){ return x; }
+
+template <typename T>
+typename r123::make_signed<T>::type S(T x){ return x; }
+
+#define Chk(u, Rng, Ftype) do{ \
+ chk<Ftype, Rng>(#u, #Rng, #Ftype, &u<Ftype, Rng::ctr_type::value_type>); \
+ }while(0)
+
+std::map<std::string, std::string> refmap;
+
+void RefHist(const char* k, const char *v){
+ refmap[std::string(k)] = std::string(v);
+}
+
+void fillrefhist(){
+#include "ut_uniform_reference.hpp"
+}
+
+bool checking = true;
+int nfail = 0;
+
+template<typename Ftype, typename RNG, typename Utype>
+void chk(const std::string& fname, const std::string& rngname, const std::string& ftypename, Utype f){
+ std::string key = fname + " " + rngname + " " + ftypename;
+ RNG rng;
+ typedef typename RNG::ukey_type ukey_type;
+ typedef typename RNG::ctr_type ctr_type;
+ typedef typename RNG::key_type key_type;
+
+ ctr_type c = {{}};
+ ukey_type uk = {{}};
+ key_type k = uk;
+ // 26 bins - 13 greater than 0 and 13 less. Why 13? Because a
+ // prime number seems less likely to tickle the rounding-related
+ // corner cases, which is aruably both good and bad.
+ const int NBINS=26;
+
+ int hist[NBINS] = {};
+ for(int i=0; i<1000; ++i){
+ c = c.incr();
+ ctr_type r = rng(c, k);
+ for(int j=0; j<ctr_type::static_size; ++j){
+ Ftype u = f(r[j]);
+ //printf("%s %llx, %.17g\n", key.c_str(), (long long)r[j], (double)u);
+ R123_ASSERT( u >= -1.);
+ R123_ASSERT( u <= 1.);
+ int idx = (int) ((u + Ftype(1.))*Ftype(NBINS/2));
+ hist[idx]++;
+ }
+ }
+ std::ostringstream oss;
+ for(int i=0; i<NBINS; ++i){
+ oss << " " << hist[i];
+ }
+ if(checking){
+ if( oss.str() != refmap[key] ){
+ printf("MISMATCH: %s:\n\tcomputed histogram=%s\n\treference histogram=%s\n",
+ key.c_str(),
+ oss.str().c_str(),
+ refmap[key].c_str());
+ nfail++;
+ }
+ }else{
+ printf("RefHist(\"%s\", \"%s\");\n", key.c_str(), oss.str().c_str());
+ }
+}
+
+int main(int argc, char **argv){
+ checking = (argc==1);
+ fillrefhist();
+
+ // 18 tests: 3 functions (u01, uneg11, u01fixedpt)
+ // x 2 input sizes (32 bit or 64 bit)
+ // x 3 output sizes (float, double, long double)
+ Chk(u01, Threefry4x32, float);
+ Chk(u01, Threefry4x32, double);
+ Chk(u01, Threefry4x32, long double);
+
+#if R123_USE_64BIT
+ Chk(u01, Threefry4x64, float);
+ Chk(u01, Threefry4x64, double);
+ Chk(u01, Threefry4x64, long double);
+#endif
+
+ Chk(uneg11, Threefry4x32, float);
+ Chk(uneg11, Threefry4x32, double);
+ Chk(uneg11, Threefry4x32, long double);
+
+#if R123_USE_64BIT
+ Chk(uneg11, Threefry4x64, float);
+ Chk(uneg11, Threefry4x64, double);
+ Chk(uneg11, Threefry4x64, long double);
+#endif
+
+ Chk(u01fixedpt, Threefry4x32, float);
+ Chk(u01fixedpt, Threefry4x32, double);
+ Chk(u01fixedpt, Threefry4x32, long double);
+
+#if R123_USE_64BIT
+ Chk(u01fixedpt, Threefry4x64, float);
+ Chk(u01fixedpt, Threefry4x64, double);
+ Chk(u01fixedpt, Threefry4x64, long double);
+#endif
+
+ if(nfail){
+ printf("// %s: FAILED %d Known-Answer-Tests failed\n", argv[0], nfail);
+ }else if(checking){
+ printf("%s: SUCCESS\n", argv[0]);
+ }
+
+ return !!nfail;
+}
diff --git a/tests/ut_uniform_IEEEkat.cpp b/tests/ut_uniform_IEEEkat.cpp
@@ -0,0 +1,293 @@
+/*
+Copyright 2013, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+ notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions, and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+ /* ut_uniform_IEEEkat.cpp - a "Known Answer Test" for uniform.hpp
+
+ This code tests that the compilation environment reproduces
+ exactly the behavior of u01, uneg11 and u01fixedpt on an x86-64
+ system with strict IEEE arithmetic. It is likely to fail on
+ systems that use 80-bit internal registers (e.g., 32-bit x86), and
+ systems that are smart enough to fuse floating point multiply and
+ add into a single, rounded-only-once instruction (e.g., PowerPC,
+ Fermi, newer ARMs, Haswell, Itanium, etc.). Failures in these
+ cases are *not* necessarily problematic. */
+
+#include <Random123/uniform.hpp>
+#include <stdio.h>
+#include <stdlib.h>
+#include <map>
+#include <string>
+
+using namespace r123;
+
+std::map<std::string, long double> katmap;
+
+// Don't inline this. It's called thousands of times in fill_katmap
+// and blows out the optimizer in older versions of clang and open64
+// if it's inlined.
+void insert(const char *s, long double v){
+ katmap[std::string(s)] = v;
+}
+
+void fill_katmap(){
+#include "ut_uniform_IEEEkatvectors.hpp"
+#if 0 // helpful for debug,
+ for(std::map<std::string, long double>::iterator p=katmap.begin(); p!=katmap.end(); ++p){
+ fprintf(stderr, "%s -> %La\n", p->first.c_str(), p->second);
+ }
+#endif
+}
+
+template <typename T>
+typename r123::make_unsigned<T>::type U(T x){ return x; }
+
+template <typename T>
+typename r123::make_signed<T>::type S(T x){ return x; }
+
+bool checking = true;
+int nfail = 0;
+int nuntested = 0;
+int notfound = 0;
+
+#define DO1(T, expr, astr) DoOne<T>(#expr, astr, expr)
+
+#define DO(i, astr) do{ \
+ ChkSignInvariance(#i, i); \
+ if(std::numeric_limits<float>::digits == 24){ \
+ DO1(float, u01<float>(i), astr); \
+ DO1(float, uneg11<float>(i), astr); \
+ DO1(float, u01fixedpt<float>(i), astr); \
+ }else{ \
+ printf("UNTESTED: %s: float does not have a 24 bit mantissa\n", #i); \
+ nuntested++; \
+ } \
+ if(std::numeric_limits<double>::digits == 53){ \
+ DO1(double, u01<double>(i), astr); \
+ DO1(double, uneg11<double>(i), astr); \
+ DO1(double, u01fixedpt<double>(i), astr); \
+ }else{ \
+ printf("UNTESTED: %s: double does not have a 53 bit mantissa\n", #i); \
+ nuntested++; \
+ } \
+ if(std::numeric_limits<long double>::digits == 64){ \
+ DO1(long double, u01<long double>(i), astr); \
+ DO1(long double, uneg11<long double>(i), astr); \
+ DO1(long double, u01fixedpt<long double>(i), astr); \
+ }else{ \
+ printf("UNTESTED: %s: long double does not have a 64 bit mantissa\n", #i); \
+ nuntested++; \
+ } \
+ } while(0)
+
+// u01, uneg11 and u01fixedpt should all depend on the bits, but not the
+// signedness of their argument. The templated functions S(i) and U(i)
+// return their argument cast to an approprite signed and unsigned type.
+// ChkSignInvariance verifies that.
+template <typename IType>
+void ChkSignInvariance(const std::string& s, IType i){
+ if( u01<float>(S(i)) != u01<float>(U(i)) ){
+ printf("INVARIANT FAILURE: u01<float>(Signed(x)) != u01<float>(Unsigned(x)) x=%s\n", s.c_str());
+ nfail++;
+ }
+ if( uneg11<float>(S(i)) != uneg11<float>(U(i)) ){
+ printf("INVARIANT FAILURE: uneg11<float>(Signed(x)) != uneg11<float>(Unsigned(x)) x=%s\n", s.c_str());
+ nfail++;
+ }
+ if( u01fixedpt<float>(S(i)) != u01fixedpt<float>(U(i)) ){
+ printf("INVARIANT FAILURE: u01<float>(Signed(x)) != u01<float>(Unsigned(x)) x=%s\n", s.c_str());
+ nfail++;
+ }
+
+ if( u01<double>(S(i)) != u01<double>(U(i)) ){
+ printf("INVARIANT FAILURE: u01<double>(Signed(x)) != u01<double>(Unsigned(x)) x=%s\n", s.c_str());
+ nfail++;
+ }
+ if( uneg11<double>(S(i)) != uneg11<double>(U(i)) ){
+ printf("INVARIANT FAILURE: uneg11<double>(Signed(x)) != uneg11<double>(Unsigned(x)) x=%s\n", s.c_str());
+ nfail++;
+ }
+ if( u01fixedpt<double>(S(i)) != u01fixedpt<double>(U(i)) ){
+ printf("INVARIANT FAILURE: u01<double>(Signed(x)) != u01<double>(Unsigned(x)) x=%s\n", s.c_str());
+ nfail++;
+ }
+
+ if( u01<long double>(S(i)) != u01<long double>(U(i)) ){
+ printf("INVARIANT FAILURE: u01<long double>(Signed(x)) != u01<long double>(Unsigned(x)) x=%s\n", s.c_str());
+ nfail++;
+ }
+ if( uneg11<long double>(S(i)) != uneg11<long double>(U(i)) ){
+ printf("INVARIANT FAILURE: uneg11<long double>(Signed(x)) != uneg11<long double>(Unsigned(x)) x=%s\n", s.c_str());
+ nfail++;
+ }
+ if( u01fixedpt<long double>(S(i)) != u01fixedpt<long double>(U(i)) ){
+ printf("INVARIANT FAILURE: u01<long double>(Signed(x)) != u01<long double>(Unsigned(x)) x=%s\n", s.c_str());
+ nfail++;
+ }
+}
+
+template <typename T>
+void DoOne(const std::string s, const char* astr, volatile T x){
+ std::string ss = s + " a=" + astr;
+ volatile long double ldx = x;
+ if(checking){
+ if( katmap.find(ss) == katmap.end() ){
+ printf("NOT FOUND: katmap[%s]\n", ss.c_str());
+ notfound++;
+ }else{
+ if(ldx!=katmap[ss]){
+ printf("MISMATCH: %s: computed=%.21Lg reference=%.21Lg\n", ss.c_str(), ldx, katmap[ss]);
+ nfail++;
+ }
+ }
+ }else{
+ printf("insert(\"%s\", %#.21LgL);\n", ss.c_str(), ldx);
+ }
+}
+
+void DO3264(int a){
+ const uint32_t maxu32 = std::numeric_limits<uint32_t>::max();
+ const uint64_t maxu64 = std::numeric_limits<uint64_t>::max();
+ const uint32_t minu32 = std::numeric_limits<uint32_t>::min();
+ const uint64_t minu64 = std::numeric_limits<uint64_t>::min();
+
+ const int32_t maxi32 = std::numeric_limits<int32_t>::max();
+ const int64_t maxi64 = std::numeric_limits<int64_t>::max();
+ const int32_t mini32 = std::numeric_limits<int32_t>::min();
+ const int64_t mini64 = std::numeric_limits<int64_t>::min();
+
+ char astr[32];
+ sprintf(astr, "%d", a);
+
+ DO( minu32 + uint32_t(a), astr );
+ DO( minu64 + uint64_t(a), astr );
+ DO( mini32 + int32_t(a), astr );
+ DO( mini64 + int64_t(a), astr );
+
+ DO( maxu32 - uint32_t(a), astr );
+ DO( maxu64 - uint64_t(a), astr );
+ DO( maxi32 - int32_t(a), astr );
+ DO( maxi64 - int64_t(a), astr );
+}
+
+int main(int argc, char **argv){
+ if(argc>1){
+ checking = false;
+ printf("/* This file was created by '%s %s' on a reference\n"
+ " platform, and is #included in the recompilation of %s\n"
+ " on a target platform. When %s is run with no arguments\n"
+ " on the target platform, it asserts that the values computed\n"
+ " on the target platform match the reference values recorded here.\n"
+ " These reference values were computed on an x86_64 using 32-bit,\n"
+ " 64-bit and 80-bit IEEE arithmetic for float, double and long double\n"
+ " respectively. Other platforms with different representations of\n"
+ " floating point values or different conventions for how intermediates\n"
+ " are stored and rounded will almost certainly fail these tests\n"
+ " even though their results might be perfectly valid.\n"
+ "*/\n", argv[0], argv[1], argv[0], argv[0]);
+ }
+ fill_katmap();
+
+
+ DO3264(0);
+ DO3264(1);
+ DO3264(2);
+ DO3264(3);
+ DO3264(4);
+ DO3264(5);
+
+ DO3264(63);
+ DO3264(64);
+ DO3264(65);
+
+ DO3264(127);
+ DO3264(128);
+ DO3264(129);
+
+ DO3264(191);
+ DO3264(192);
+ DO3264(193);
+
+ DO3264(255);
+ DO3264(256);
+ DO3264(257);
+
+ DO3264(319);
+ DO3264(320);
+ DO3264(321);
+
+ DO3264(382);
+ DO3264(383);
+ DO3264(384);
+
+ DO3264(639);
+ DO3264(640);
+ DO3264(641);
+
+ DO3264(1023);
+ DO3264(1024);
+ DO3264(1025);
+
+ DO3264(3070);
+ DO3264(3071);
+ DO3264(3072);
+
+ DO3264(5119);
+ DO3264(5120);
+ DO3264(5121);
+
+ if(notfound){
+ printf("// %s: WARNING: %d tests were not checked because reference values were not compiled in\n",
+ argv[0], notfound);
+ }
+ if(nuntested){
+ printf("// %s: WARNING: %d tests were not performed because the floating point rep does not match the IEEE format used to compute reference values\n",
+ argv[0], nuntested);
+ }
+ if(nfail){
+ printf("// %s: FAILED %d Known-Answer-Tests failed\n", argv[0], nfail);
+ printf("Such failures may be due to non-IEEE arithmetic on your platform. In some \n"
+ "cases, you may be able to recover IEEE arithmetic by pre-defining the\n"
+ "pp-symbol R123_UNIFORM_FLOAT_STORE to a non-zero value, e.g., adding\n"
+ "-DR123_UNIFORM_FLOAT_STORE=1 to the compile command line. On some\n"
+ "systems (notably, 32-bit x86 architectures) this will prevent use of\n"
+ "extra-wide internal floating point registers and will recover IEEE\n"
+ "arithmetic. Unfortunately, this will make u01 and uneg11 significantly\n"
+ "slower, so you may not wish to define it in production code. As far\n"
+ "as we know, the floating point values returned with the symbol unset\n"
+ "are perfectly reasonable. They simply don't perfectly match the\n"
+ "values computed on our reference x86-64 platform with IEEE arithmetic\n");
+ }else{
+ printf("// %s: SUCCESS\n", argv[0]);
+ }
+
+ return !!nfail;
+}
diff --git a/tests/ut_uniform_IEEEkatvectors.hpp b/tests/ut_uniform_IEEEkatvectors.hpp
@@ -0,0 +1,2605 @@
+/* This file was created by './ut_uniform_IEEEkat 1' on a reference
+ platform, and is #included in the recompilation of ./ut_uniform_IEEEkat
+ on a target platform. When ./ut_uniform_IEEEkat is run with no arguments
+ on the target platform, it asserts that the values computed
+ on the target platform match the reference values recorded here.
+ These reference values were computed on an x86_64 using 32-bit,
+ 64-bit and 80-bit IEEE arithmetic for float, double and long double
+ respectively. Other platforms with different representations of
+ floating point values or different conventions for how intermediates
+ are stored and rounded will almost certainly fail these tests
+ even though their results might be perfectly valid.
+*/
+insert("u01<float>(minu32 + uint32_t(a)) a=0", 1.16415321826934814453e-10L);
+insert("uneg11<float>(minu32 + uint32_t(a)) a=0", 2.32830643653869628906e-10L);
+insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=0", 5.96046447753906250000e-08L);
+insert("u01<double>(minu32 + uint32_t(a)) a=0", 1.16415321826934814453e-10L);
+insert("uneg11<double>(minu32 + uint32_t(a)) a=0", 2.32830643653869628906e-10L);
+insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=0", 1.16415321826934814453e-10L);
+insert("u01<long double>(minu32 + uint32_t(a)) a=0", 1.16415321826934814453e-10L);
+insert("uneg11<long double>(minu32 + uint32_t(a)) a=0", 2.32830643653869628906e-10L);
+insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=0", 1.16415321826934814453e-10L);
+insert("u01<float>(minu64 + uint64_t(a)) a=0", 2.71050543121376108502e-20L);
+insert("uneg11<float>(minu64 + uint64_t(a)) a=0", 5.42101086242752217004e-20L);
+insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=0", 5.96046447753906250000e-08L);
+insert("u01<double>(minu64 + uint64_t(a)) a=0", 2.71050543121376108502e-20L);
+insert("uneg11<double>(minu64 + uint64_t(a)) a=0", 5.42101086242752217004e-20L);
+insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=0", 1.11022302462515654042e-16L);
+insert("u01<long double>(minu64 + uint64_t(a)) a=0", 2.71050543121376108502e-20L);
+insert("uneg11<long double>(minu64 + uint64_t(a)) a=0", 5.42101086242752217004e-20L);
+insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=0", 5.42101086242752217004e-20L);
+insert("u01<float>(mini32 + int32_t(a)) a=0", 0.500000000000000000000L);
+insert("uneg11<float>(mini32 + int32_t(a)) a=0", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini32 + int32_t(a)) a=0", 0.500000059604644775391L);
+insert("u01<double>(mini32 + int32_t(a)) a=0", 0.500000000116415321827L);
+insert("uneg11<double>(mini32 + int32_t(a)) a=0", -0.999999999767169356346L);
+insert("u01fixedpt<double>(mini32 + int32_t(a)) a=0", 0.500000000116415321827L);
+insert("u01<long double>(mini32 + int32_t(a)) a=0", 0.500000000116415321827L);
+insert("uneg11<long double>(mini32 + int32_t(a)) a=0", -0.999999999767169356346L);
+insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=0", 0.500000000116415321827L);
+insert("u01<float>(mini64 + int64_t(a)) a=0", 0.500000000000000000000L);
+insert("uneg11<float>(mini64 + int64_t(a)) a=0", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini64 + int64_t(a)) a=0", 0.500000059604644775391L);
+insert("u01<double>(mini64 + int64_t(a)) a=0", 0.500000000000000000000L);
+insert("uneg11<double>(mini64 + int64_t(a)) a=0", -1.00000000000000000000L);
+insert("u01fixedpt<double>(mini64 + int64_t(a)) a=0", 0.500000000000000111022L);
+insert("u01<long double>(mini64 + int64_t(a)) a=0", 0.500000000000000000000L);
+insert("uneg11<long double>(mini64 + int64_t(a)) a=0", -0.999999999999999999946L);
+insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=0", 0.500000000000000000054L);
+insert("u01<float>(maxu32 - uint32_t(a)) a=0", 1.00000000000000000000L);
+insert("uneg11<float>(maxu32 - uint32_t(a)) a=0", -2.32830643653869628906e-10L);
+insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=0", 0.999999940395355224609L);
+insert("u01<double>(maxu32 - uint32_t(a)) a=0", 0.999999999883584678173L);
+insert("uneg11<double>(maxu32 - uint32_t(a)) a=0", -2.32830643653869628906e-10L);
+insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=0", 0.999999999883584678173L);
+insert("u01<long double>(maxu32 - uint32_t(a)) a=0", 0.999999999883584678173L);
+insert("uneg11<long double>(maxu32 - uint32_t(a)) a=0", -2.32830643653869628906e-10L);
+insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=0", 0.999999999883584678173L);
+insert("u01<float>(maxu64 - uint64_t(a)) a=0", 1.00000000000000000000L);
+insert("uneg11<float>(maxu64 - uint64_t(a)) a=0", -5.42101086242752217004e-20L);
+insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=0", 0.999999940395355224609L);
+insert("u01<double>(maxu64 - uint64_t(a)) a=0", 1.00000000000000000000L);
+insert("uneg11<double>(maxu64 - uint64_t(a)) a=0", -5.42101086242752217004e-20L);
+insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=0", 0.999999999999999888978L);
+insert("u01<long double>(maxu64 - uint64_t(a)) a=0", 1.00000000000000000000L);
+insert("uneg11<long double>(maxu64 - uint64_t(a)) a=0", -5.42101086242752217004e-20L);
+insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=0", 0.999999999999999999946L);
+insert("u01<float>(maxi32 - int32_t(a)) a=0", 0.500000000000000000000L);
+insert("uneg11<float>(maxi32 - int32_t(a)) a=0", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=0", 0.499999940395355224609L);
+insert("u01<double>(maxi32 - int32_t(a)) a=0", 0.499999999883584678173L);
+insert("uneg11<double>(maxi32 - int32_t(a)) a=0", 0.999999999767169356346L);
+insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=0", 0.499999999883584678173L);
+insert("u01<long double>(maxi32 - int32_t(a)) a=0", 0.499999999883584678173L);
+insert("uneg11<long double>(maxi32 - int32_t(a)) a=0", 0.999999999767169356346L);
+insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=0", 0.499999999883584678173L);
+insert("u01<float>(maxi64 - int64_t(a)) a=0", 0.500000000000000000000L);
+insert("uneg11<float>(maxi64 - int64_t(a)) a=0", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=0", 0.499999940395355224609L);
+insert("u01<double>(maxi64 - int64_t(a)) a=0", 0.500000000000000000000L);
+insert("uneg11<double>(maxi64 - int64_t(a)) a=0", 1.00000000000000000000L);
+insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=0", 0.499999999999999888978L);
+insert("u01<long double>(maxi64 - int64_t(a)) a=0", 0.499999999999999999973L);
+insert("uneg11<long double>(maxi64 - int64_t(a)) a=0", 0.999999999999999999946L);
+insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=0", 0.499999999999999999946L);
+insert("u01<float>(minu32 + uint32_t(a)) a=1", 3.49245965480804443359e-10L);
+insert("uneg11<float>(minu32 + uint32_t(a)) a=1", 6.98491930961608886719e-10L);
+insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=1", 5.96046447753906250000e-08L);
+insert("u01<double>(minu32 + uint32_t(a)) a=1", 3.49245965480804443359e-10L);
+insert("uneg11<double>(minu32 + uint32_t(a)) a=1", 6.98491930961608886719e-10L);
+insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=1", 3.49245965480804443359e-10L);
+insert("u01<long double>(minu32 + uint32_t(a)) a=1", 3.49245965480804443359e-10L);
+insert("uneg11<long double>(minu32 + uint32_t(a)) a=1", 6.98491930961608886719e-10L);
+insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=1", 3.49245965480804443359e-10L);
+insert("u01<float>(minu64 + uint64_t(a)) a=1", 8.13151629364128325506e-20L);
+insert("uneg11<float>(minu64 + uint64_t(a)) a=1", 1.62630325872825665101e-19L);
+insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=1", 5.96046447753906250000e-08L);
+insert("u01<double>(minu64 + uint64_t(a)) a=1", 8.13151629364128325506e-20L);
+insert("uneg11<double>(minu64 + uint64_t(a)) a=1", 1.62630325872825665101e-19L);
+insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=1", 1.11022302462515654042e-16L);
+insert("u01<long double>(minu64 + uint64_t(a)) a=1", 8.13151629364128325506e-20L);
+insert("uneg11<long double>(minu64 + uint64_t(a)) a=1", 1.62630325872825665101e-19L);
+insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=1", 5.42101086242752217004e-20L);
+insert("u01<float>(mini32 + int32_t(a)) a=1", 0.500000000000000000000L);
+insert("uneg11<float>(mini32 + int32_t(a)) a=1", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini32 + int32_t(a)) a=1", 0.500000059604644775391L);
+insert("u01<double>(mini32 + int32_t(a)) a=1", 0.500000000349245965481L);
+insert("uneg11<double>(mini32 + int32_t(a)) a=1", -0.999999999301508069038L);
+insert("u01fixedpt<double>(mini32 + int32_t(a)) a=1", 0.500000000349245965481L);
+insert("u01<long double>(mini32 + int32_t(a)) a=1", 0.500000000349245965481L);
+insert("uneg11<long double>(mini32 + int32_t(a)) a=1", -0.999999999301508069038L);
+insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=1", 0.500000000349245965481L);
+insert("u01<float>(mini64 + int64_t(a)) a=1", 0.500000000000000000000L);
+insert("uneg11<float>(mini64 + int64_t(a)) a=1", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini64 + int64_t(a)) a=1", 0.500000059604644775391L);
+insert("u01<double>(mini64 + int64_t(a)) a=1", 0.500000000000000000000L);
+insert("uneg11<double>(mini64 + int64_t(a)) a=1", -1.00000000000000000000L);
+insert("u01fixedpt<double>(mini64 + int64_t(a)) a=1", 0.500000000000000111022L);
+insert("u01<long double>(mini64 + int64_t(a)) a=1", 0.500000000000000000108L);
+insert("uneg11<long double>(mini64 + int64_t(a)) a=1", -0.999999999999999999837L);
+insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=1", 0.500000000000000000054L);
+insert("u01<float>(maxu32 - uint32_t(a)) a=1", 1.00000000000000000000L);
+insert("uneg11<float>(maxu32 - uint32_t(a)) a=1", -6.98491930961608886719e-10L);
+insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=1", 0.999999940395355224609L);
+insert("u01<double>(maxu32 - uint32_t(a)) a=1", 0.999999999650754034519L);
+insert("uneg11<double>(maxu32 - uint32_t(a)) a=1", -6.98491930961608886719e-10L);
+insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=1", 0.999999999650754034519L);
+insert("u01<long double>(maxu32 - uint32_t(a)) a=1", 0.999999999650754034519L);
+insert("uneg11<long double>(maxu32 - uint32_t(a)) a=1", -6.98491930961608886719e-10L);
+insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=1", 0.999999999650754034519L);
+insert("u01<float>(maxu64 - uint64_t(a)) a=1", 1.00000000000000000000L);
+insert("uneg11<float>(maxu64 - uint64_t(a)) a=1", -1.62630325872825665101e-19L);
+insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=1", 0.999999940395355224609L);
+insert("u01<double>(maxu64 - uint64_t(a)) a=1", 1.00000000000000000000L);
+insert("uneg11<double>(maxu64 - uint64_t(a)) a=1", -1.62630325872825665101e-19L);
+insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=1", 0.999999999999999888978L);
+insert("u01<long double>(maxu64 - uint64_t(a)) a=1", 0.999999999999999999892L);
+insert("uneg11<long double>(maxu64 - uint64_t(a)) a=1", -1.62630325872825665101e-19L);
+insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=1", 0.999999999999999999946L);
+insert("u01<float>(maxi32 - int32_t(a)) a=1", 0.500000000000000000000L);
+insert("uneg11<float>(maxi32 - int32_t(a)) a=1", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=1", 0.499999940395355224609L);
+insert("u01<double>(maxi32 - int32_t(a)) a=1", 0.499999999650754034519L);
+insert("uneg11<double>(maxi32 - int32_t(a)) a=1", 0.999999999301508069038L);
+insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=1", 0.499999999650754034519L);
+insert("u01<long double>(maxi32 - int32_t(a)) a=1", 0.499999999650754034519L);
+insert("uneg11<long double>(maxi32 - int32_t(a)) a=1", 0.999999999301508069038L);
+insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=1", 0.499999999650754034519L);
+insert("u01<float>(maxi64 - int64_t(a)) a=1", 0.500000000000000000000L);
+insert("uneg11<float>(maxi64 - int64_t(a)) a=1", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=1", 0.499999940395355224609L);
+insert("u01<double>(maxi64 - int64_t(a)) a=1", 0.500000000000000000000L);
+insert("uneg11<double>(maxi64 - int64_t(a)) a=1", 1.00000000000000000000L);
+insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=1", 0.499999999999999888978L);
+insert("u01<long double>(maxi64 - int64_t(a)) a=1", 0.499999999999999999919L);
+insert("uneg11<long double>(maxi64 - int64_t(a)) a=1", 0.999999999999999999837L);
+insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=1", 0.499999999999999999946L);
+insert("u01<float>(minu32 + uint32_t(a)) a=2", 5.82076609134674072266e-10L);
+insert("uneg11<float>(minu32 + uint32_t(a)) a=2", 1.16415321826934814453e-09L);
+insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=2", 5.96046447753906250000e-08L);
+insert("u01<double>(minu32 + uint32_t(a)) a=2", 5.82076609134674072266e-10L);
+insert("uneg11<double>(minu32 + uint32_t(a)) a=2", 1.16415321826934814453e-09L);
+insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=2", 5.82076609134674072266e-10L);
+insert("u01<long double>(minu32 + uint32_t(a)) a=2", 5.82076609134674072266e-10L);
+insert("uneg11<long double>(minu32 + uint32_t(a)) a=2", 1.16415321826934814453e-09L);
+insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=2", 5.82076609134674072266e-10L);
+insert("u01<float>(minu64 + uint64_t(a)) a=2", 1.35525271560688054251e-19L);
+insert("uneg11<float>(minu64 + uint64_t(a)) a=2", 2.71050543121376108502e-19L);
+insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=2", 5.96046447753906250000e-08L);
+insert("u01<double>(minu64 + uint64_t(a)) a=2", 1.35525271560688054251e-19L);
+insert("uneg11<double>(minu64 + uint64_t(a)) a=2", 2.71050543121376108502e-19L);
+insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=2", 1.11022302462515654042e-16L);
+insert("u01<long double>(minu64 + uint64_t(a)) a=2", 1.35525271560688054251e-19L);
+insert("uneg11<long double>(minu64 + uint64_t(a)) a=2", 2.71050543121376108502e-19L);
+insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=2", 1.62630325872825665101e-19L);
+insert("u01<float>(mini32 + int32_t(a)) a=2", 0.500000000000000000000L);
+insert("uneg11<float>(mini32 + int32_t(a)) a=2", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini32 + int32_t(a)) a=2", 0.500000059604644775391L);
+insert("u01<double>(mini32 + int32_t(a)) a=2", 0.500000000582076609135L);
+insert("uneg11<double>(mini32 + int32_t(a)) a=2", -0.999999998835846781731L);
+insert("u01fixedpt<double>(mini32 + int32_t(a)) a=2", 0.500000000582076609135L);
+insert("u01<long double>(mini32 + int32_t(a)) a=2", 0.500000000582076609135L);
+insert("uneg11<long double>(mini32 + int32_t(a)) a=2", -0.999999998835846781731L);
+insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=2", 0.500000000582076609135L);
+insert("u01<float>(mini64 + int64_t(a)) a=2", 0.500000000000000000000L);
+insert("uneg11<float>(mini64 + int64_t(a)) a=2", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini64 + int64_t(a)) a=2", 0.500000059604644775391L);
+insert("u01<double>(mini64 + int64_t(a)) a=2", 0.500000000000000000000L);
+insert("uneg11<double>(mini64 + int64_t(a)) a=2", -1.00000000000000000000L);
+insert("u01fixedpt<double>(mini64 + int64_t(a)) a=2", 0.500000000000000111022L);
+insert("u01<long double>(mini64 + int64_t(a)) a=2", 0.500000000000000000108L);
+insert("uneg11<long double>(mini64 + int64_t(a)) a=2", -0.999999999999999999729L);
+insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=2", 0.500000000000000000163L);
+insert("u01<float>(maxu32 - uint32_t(a)) a=2", 1.00000000000000000000L);
+insert("uneg11<float>(maxu32 - uint32_t(a)) a=2", -1.16415321826934814453e-09L);
+insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=2", 0.999999940395355224609L);
+insert("u01<double>(maxu32 - uint32_t(a)) a=2", 0.999999999417923390865L);
+insert("uneg11<double>(maxu32 - uint32_t(a)) a=2", -1.16415321826934814453e-09L);
+insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=2", 0.999999999417923390865L);
+insert("u01<long double>(maxu32 - uint32_t(a)) a=2", 0.999999999417923390865L);
+insert("uneg11<long double>(maxu32 - uint32_t(a)) a=2", -1.16415321826934814453e-09L);
+insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=2", 0.999999999417923390865L);
+insert("u01<float>(maxu64 - uint64_t(a)) a=2", 1.00000000000000000000L);
+insert("uneg11<float>(maxu64 - uint64_t(a)) a=2", -2.71050543121376108502e-19L);
+insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=2", 0.999999940395355224609L);
+insert("u01<double>(maxu64 - uint64_t(a)) a=2", 1.00000000000000000000L);
+insert("uneg11<double>(maxu64 - uint64_t(a)) a=2", -2.71050543121376108502e-19L);
+insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=2", 0.999999999999999888978L);
+insert("u01<long double>(maxu64 - uint64_t(a)) a=2", 0.999999999999999999892L);
+insert("uneg11<long double>(maxu64 - uint64_t(a)) a=2", -2.71050543121376108502e-19L);
+insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=2", 0.999999999999999999837L);
+insert("u01<float>(maxi32 - int32_t(a)) a=2", 0.500000000000000000000L);
+insert("uneg11<float>(maxi32 - int32_t(a)) a=2", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=2", 0.499999940395355224609L);
+insert("u01<double>(maxi32 - int32_t(a)) a=2", 0.499999999417923390865L);
+insert("uneg11<double>(maxi32 - int32_t(a)) a=2", 0.999999998835846781731L);
+insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=2", 0.499999999417923390865L);
+insert("u01<long double>(maxi32 - int32_t(a)) a=2", 0.499999999417923390865L);
+insert("uneg11<long double>(maxi32 - int32_t(a)) a=2", 0.999999998835846781731L);
+insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=2", 0.499999999417923390865L);
+insert("u01<float>(maxi64 - int64_t(a)) a=2", 0.500000000000000000000L);
+insert("uneg11<float>(maxi64 - int64_t(a)) a=2", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=2", 0.499999940395355224609L);
+insert("u01<double>(maxi64 - int64_t(a)) a=2", 0.500000000000000000000L);
+insert("uneg11<double>(maxi64 - int64_t(a)) a=2", 1.00000000000000000000L);
+insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=2", 0.499999999999999888978L);
+insert("u01<long double>(maxi64 - int64_t(a)) a=2", 0.499999999999999999864L);
+insert("uneg11<long double>(maxi64 - int64_t(a)) a=2", 0.999999999999999999729L);
+insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=2", 0.499999999999999999837L);
+insert("u01<float>(minu32 + uint32_t(a)) a=3", 8.14907252788543701172e-10L);
+insert("uneg11<float>(minu32 + uint32_t(a)) a=3", 1.62981450557708740234e-09L);
+insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=3", 5.96046447753906250000e-08L);
+insert("u01<double>(minu32 + uint32_t(a)) a=3", 8.14907252788543701172e-10L);
+insert("uneg11<double>(minu32 + uint32_t(a)) a=3", 1.62981450557708740234e-09L);
+insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=3", 8.14907252788543701172e-10L);
+insert("u01<long double>(minu32 + uint32_t(a)) a=3", 8.14907252788543701172e-10L);
+insert("uneg11<long double>(minu32 + uint32_t(a)) a=3", 1.62981450557708740234e-09L);
+insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=3", 8.14907252788543701172e-10L);
+insert("u01<float>(minu64 + uint64_t(a)) a=3", 1.89735380184963275951e-19L);
+insert("uneg11<float>(minu64 + uint64_t(a)) a=3", 3.79470760369926551903e-19L);
+insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=3", 5.96046447753906250000e-08L);
+insert("u01<double>(minu64 + uint64_t(a)) a=3", 1.89735380184963275951e-19L);
+insert("uneg11<double>(minu64 + uint64_t(a)) a=3", 3.79470760369926551903e-19L);
+insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=3", 1.11022302462515654042e-16L);
+insert("u01<long double>(minu64 + uint64_t(a)) a=3", 1.89735380184963275951e-19L);
+insert("uneg11<long double>(minu64 + uint64_t(a)) a=3", 3.79470760369926551903e-19L);
+insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=3", 1.62630325872825665101e-19L);
+insert("u01<float>(mini32 + int32_t(a)) a=3", 0.500000000000000000000L);
+insert("uneg11<float>(mini32 + int32_t(a)) a=3", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini32 + int32_t(a)) a=3", 0.500000059604644775391L);
+insert("u01<double>(mini32 + int32_t(a)) a=3", 0.500000000814907252789L);
+insert("uneg11<double>(mini32 + int32_t(a)) a=3", -0.999999998370185494423L);
+insert("u01fixedpt<double>(mini32 + int32_t(a)) a=3", 0.500000000814907252789L);
+insert("u01<long double>(mini32 + int32_t(a)) a=3", 0.500000000814907252789L);
+insert("uneg11<long double>(mini32 + int32_t(a)) a=3", -0.999999998370185494423L);
+insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=3", 0.500000000814907252789L);
+insert("u01<float>(mini64 + int64_t(a)) a=3", 0.500000000000000000000L);
+insert("uneg11<float>(mini64 + int64_t(a)) a=3", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini64 + int64_t(a)) a=3", 0.500000059604644775391L);
+insert("u01<double>(mini64 + int64_t(a)) a=3", 0.500000000000000000000L);
+insert("uneg11<double>(mini64 + int64_t(a)) a=3", -1.00000000000000000000L);
+insert("u01fixedpt<double>(mini64 + int64_t(a)) a=3", 0.500000000000000111022L);
+insert("u01<long double>(mini64 + int64_t(a)) a=3", 0.500000000000000000217L);
+insert("uneg11<long double>(mini64 + int64_t(a)) a=3", -0.999999999999999999621L);
+insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=3", 0.500000000000000000163L);
+insert("u01<float>(maxu32 - uint32_t(a)) a=3", 1.00000000000000000000L);
+insert("uneg11<float>(maxu32 - uint32_t(a)) a=3", -1.62981450557708740234e-09L);
+insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=3", 0.999999940395355224609L);
+insert("u01<double>(maxu32 - uint32_t(a)) a=3", 0.999999999185092747211L);
+insert("uneg11<double>(maxu32 - uint32_t(a)) a=3", -1.62981450557708740234e-09L);
+insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=3", 0.999999999185092747211L);
+insert("u01<long double>(maxu32 - uint32_t(a)) a=3", 0.999999999185092747211L);
+insert("uneg11<long double>(maxu32 - uint32_t(a)) a=3", -1.62981450557708740234e-09L);
+insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=3", 0.999999999185092747211L);
+insert("u01<float>(maxu64 - uint64_t(a)) a=3", 1.00000000000000000000L);
+insert("uneg11<float>(maxu64 - uint64_t(a)) a=3", -3.79470760369926551903e-19L);
+insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=3", 0.999999940395355224609L);
+insert("u01<double>(maxu64 - uint64_t(a)) a=3", 1.00000000000000000000L);
+insert("uneg11<double>(maxu64 - uint64_t(a)) a=3", -3.79470760369926551903e-19L);
+insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=3", 0.999999999999999888978L);
+insert("u01<long double>(maxu64 - uint64_t(a)) a=3", 0.999999999999999999783L);
+insert("uneg11<long double>(maxu64 - uint64_t(a)) a=3", -3.79470760369926551903e-19L);
+insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=3", 0.999999999999999999837L);
+insert("u01<float>(maxi32 - int32_t(a)) a=3", 0.500000000000000000000L);
+insert("uneg11<float>(maxi32 - int32_t(a)) a=3", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=3", 0.499999940395355224609L);
+insert("u01<double>(maxi32 - int32_t(a)) a=3", 0.499999999185092747211L);
+insert("uneg11<double>(maxi32 - int32_t(a)) a=3", 0.999999998370185494423L);
+insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=3", 0.499999999185092747211L);
+insert("u01<long double>(maxi32 - int32_t(a)) a=3", 0.499999999185092747211L);
+insert("uneg11<long double>(maxi32 - int32_t(a)) a=3", 0.999999998370185494423L);
+insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=3", 0.499999999185092747211L);
+insert("u01<float>(maxi64 - int64_t(a)) a=3", 0.500000000000000000000L);
+insert("uneg11<float>(maxi64 - int64_t(a)) a=3", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=3", 0.499999940395355224609L);
+insert("u01<double>(maxi64 - int64_t(a)) a=3", 0.500000000000000000000L);
+insert("uneg11<double>(maxi64 - int64_t(a)) a=3", 1.00000000000000000000L);
+insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=3", 0.499999999999999888978L);
+insert("u01<long double>(maxi64 - int64_t(a)) a=3", 0.499999999999999999810L);
+insert("uneg11<long double>(maxi64 - int64_t(a)) a=3", 0.999999999999999999621L);
+insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=3", 0.499999999999999999837L);
+insert("u01<float>(minu32 + uint32_t(a)) a=4", 1.04773789644241333008e-09L);
+insert("uneg11<float>(minu32 + uint32_t(a)) a=4", 2.09547579288482666016e-09L);
+insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=4", 5.96046447753906250000e-08L);
+insert("u01<double>(minu32 + uint32_t(a)) a=4", 1.04773789644241333008e-09L);
+insert("uneg11<double>(minu32 + uint32_t(a)) a=4", 2.09547579288482666016e-09L);
+insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=4", 1.04773789644241333008e-09L);
+insert("u01<long double>(minu32 + uint32_t(a)) a=4", 1.04773789644241333008e-09L);
+insert("uneg11<long double>(minu32 + uint32_t(a)) a=4", 2.09547579288482666016e-09L);
+insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=4", 1.04773789644241333008e-09L);
+insert("u01<float>(minu64 + uint64_t(a)) a=4", 2.43945488809238497652e-19L);
+insert("uneg11<float>(minu64 + uint64_t(a)) a=4", 4.87890977618476995303e-19L);
+insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=4", 5.96046447753906250000e-08L);
+insert("u01<double>(minu64 + uint64_t(a)) a=4", 2.43945488809238497652e-19L);
+insert("uneg11<double>(minu64 + uint64_t(a)) a=4", 4.87890977618476995303e-19L);
+insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=4", 1.11022302462515654042e-16L);
+insert("u01<long double>(minu64 + uint64_t(a)) a=4", 2.43945488809238497652e-19L);
+insert("uneg11<long double>(minu64 + uint64_t(a)) a=4", 4.87890977618476995303e-19L);
+insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=4", 2.71050543121376108502e-19L);
+insert("u01<float>(mini32 + int32_t(a)) a=4", 0.500000000000000000000L);
+insert("uneg11<float>(mini32 + int32_t(a)) a=4", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini32 + int32_t(a)) a=4", 0.500000059604644775391L);
+insert("u01<double>(mini32 + int32_t(a)) a=4", 0.500000001047737896442L);
+insert("uneg11<double>(mini32 + int32_t(a)) a=4", -0.999999997904524207115L);
+insert("u01fixedpt<double>(mini32 + int32_t(a)) a=4", 0.500000001047737896442L);
+insert("u01<long double>(mini32 + int32_t(a)) a=4", 0.500000001047737896442L);
+insert("uneg11<long double>(mini32 + int32_t(a)) a=4", -0.999999997904524207115L);
+insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=4", 0.500000001047737896442L);
+insert("u01<float>(mini64 + int64_t(a)) a=4", 0.500000000000000000000L);
+insert("uneg11<float>(mini64 + int64_t(a)) a=4", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini64 + int64_t(a)) a=4", 0.500000059604644775391L);
+insert("u01<double>(mini64 + int64_t(a)) a=4", 0.500000000000000000000L);
+insert("uneg11<double>(mini64 + int64_t(a)) a=4", -1.00000000000000000000L);
+insert("u01fixedpt<double>(mini64 + int64_t(a)) a=4", 0.500000000000000111022L);
+insert("u01<long double>(mini64 + int64_t(a)) a=4", 0.500000000000000000217L);
+insert("uneg11<long double>(mini64 + int64_t(a)) a=4", -0.999999999999999999512L);
+insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=4", 0.500000000000000000271L);
+insert("u01<float>(maxu32 - uint32_t(a)) a=4", 1.00000000000000000000L);
+insert("uneg11<float>(maxu32 - uint32_t(a)) a=4", -2.09547579288482666016e-09L);
+insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=4", 0.999999940395355224609L);
+insert("u01<double>(maxu32 - uint32_t(a)) a=4", 0.999999998952262103558L);
+insert("uneg11<double>(maxu32 - uint32_t(a)) a=4", -2.09547579288482666016e-09L);
+insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=4", 0.999999998952262103558L);
+insert("u01<long double>(maxu32 - uint32_t(a)) a=4", 0.999999998952262103558L);
+insert("uneg11<long double>(maxu32 - uint32_t(a)) a=4", -2.09547579288482666016e-09L);
+insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=4", 0.999999998952262103558L);
+insert("u01<float>(maxu64 - uint64_t(a)) a=4", 1.00000000000000000000L);
+insert("uneg11<float>(maxu64 - uint64_t(a)) a=4", -4.87890977618476995303e-19L);
+insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=4", 0.999999940395355224609L);
+insert("u01<double>(maxu64 - uint64_t(a)) a=4", 1.00000000000000000000L);
+insert("uneg11<double>(maxu64 - uint64_t(a)) a=4", -4.87890977618476995303e-19L);
+insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=4", 0.999999999999999888978L);
+insert("u01<long double>(maxu64 - uint64_t(a)) a=4", 0.999999999999999999783L);
+insert("uneg11<long double>(maxu64 - uint64_t(a)) a=4", -4.87890977618476995303e-19L);
+insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=4", 0.999999999999999999729L);
+insert("u01<float>(maxi32 - int32_t(a)) a=4", 0.500000000000000000000L);
+insert("uneg11<float>(maxi32 - int32_t(a)) a=4", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=4", 0.499999940395355224609L);
+insert("u01<double>(maxi32 - int32_t(a)) a=4", 0.499999998952262103558L);
+insert("uneg11<double>(maxi32 - int32_t(a)) a=4", 0.999999997904524207115L);
+insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=4", 0.499999998952262103558L);
+insert("u01<long double>(maxi32 - int32_t(a)) a=4", 0.499999998952262103558L);
+insert("uneg11<long double>(maxi32 - int32_t(a)) a=4", 0.999999997904524207115L);
+insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=4", 0.499999998952262103558L);
+insert("u01<float>(maxi64 - int64_t(a)) a=4", 0.500000000000000000000L);
+insert("uneg11<float>(maxi64 - int64_t(a)) a=4", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=4", 0.499999940395355224609L);
+insert("u01<double>(maxi64 - int64_t(a)) a=4", 0.500000000000000000000L);
+insert("uneg11<double>(maxi64 - int64_t(a)) a=4", 1.00000000000000000000L);
+insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=4", 0.499999999999999888978L);
+insert("u01<long double>(maxi64 - int64_t(a)) a=4", 0.499999999999999999756L);
+insert("uneg11<long double>(maxi64 - int64_t(a)) a=4", 0.999999999999999999512L);
+insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=4", 0.499999999999999999729L);
+insert("u01<float>(minu32 + uint32_t(a)) a=5", 1.28056854009628295898e-09L);
+insert("uneg11<float>(minu32 + uint32_t(a)) a=5", 2.56113708019256591797e-09L);
+insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=5", 5.96046447753906250000e-08L);
+insert("u01<double>(minu32 + uint32_t(a)) a=5", 1.28056854009628295898e-09L);
+insert("uneg11<double>(minu32 + uint32_t(a)) a=5", 2.56113708019256591797e-09L);
+insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=5", 1.28056854009628295898e-09L);
+insert("u01<long double>(minu32 + uint32_t(a)) a=5", 1.28056854009628295898e-09L);
+insert("uneg11<long double>(minu32 + uint32_t(a)) a=5", 2.56113708019256591797e-09L);
+insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=5", 1.28056854009628295898e-09L);
+insert("u01<float>(minu64 + uint64_t(a)) a=5", 2.98155597433513719352e-19L);
+insert("uneg11<float>(minu64 + uint64_t(a)) a=5", 5.96311194867027438704e-19L);
+insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=5", 5.96046447753906250000e-08L);
+insert("u01<double>(minu64 + uint64_t(a)) a=5", 2.98155597433513719352e-19L);
+insert("uneg11<double>(minu64 + uint64_t(a)) a=5", 5.96311194867027438704e-19L);
+insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=5", 1.11022302462515654042e-16L);
+insert("u01<long double>(minu64 + uint64_t(a)) a=5", 2.98155597433513719352e-19L);
+insert("uneg11<long double>(minu64 + uint64_t(a)) a=5", 5.96311194867027438704e-19L);
+insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=5", 2.71050543121376108502e-19L);
+insert("u01<float>(mini32 + int32_t(a)) a=5", 0.500000000000000000000L);
+insert("uneg11<float>(mini32 + int32_t(a)) a=5", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini32 + int32_t(a)) a=5", 0.500000059604644775391L);
+insert("u01<double>(mini32 + int32_t(a)) a=5", 0.500000001280568540096L);
+insert("uneg11<double>(mini32 + int32_t(a)) a=5", -0.999999997438862919807L);
+insert("u01fixedpt<double>(mini32 + int32_t(a)) a=5", 0.500000001280568540096L);
+insert("u01<long double>(mini32 + int32_t(a)) a=5", 0.500000001280568540096L);
+insert("uneg11<long double>(mini32 + int32_t(a)) a=5", -0.999999997438862919807L);
+insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=5", 0.500000001280568540096L);
+insert("u01<float>(mini64 + int64_t(a)) a=5", 0.500000000000000000000L);
+insert("uneg11<float>(mini64 + int64_t(a)) a=5", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini64 + int64_t(a)) a=5", 0.500000059604644775391L);
+insert("u01<double>(mini64 + int64_t(a)) a=5", 0.500000000000000000000L);
+insert("uneg11<double>(mini64 + int64_t(a)) a=5", -1.00000000000000000000L);
+insert("u01fixedpt<double>(mini64 + int64_t(a)) a=5", 0.500000000000000111022L);
+insert("u01<long double>(mini64 + int64_t(a)) a=5", 0.500000000000000000325L);
+insert("uneg11<long double>(mini64 + int64_t(a)) a=5", -0.999999999999999999404L);
+insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=5", 0.500000000000000000271L);
+insert("u01<float>(maxu32 - uint32_t(a)) a=5", 1.00000000000000000000L);
+insert("uneg11<float>(maxu32 - uint32_t(a)) a=5", -2.56113708019256591797e-09L);
+insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=5", 0.999999940395355224609L);
+insert("u01<double>(maxu32 - uint32_t(a)) a=5", 0.999999998719431459904L);
+insert("uneg11<double>(maxu32 - uint32_t(a)) a=5", -2.56113708019256591797e-09L);
+insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=5", 0.999999998719431459904L);
+insert("u01<long double>(maxu32 - uint32_t(a)) a=5", 0.999999998719431459904L);
+insert("uneg11<long double>(maxu32 - uint32_t(a)) a=5", -2.56113708019256591797e-09L);
+insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=5", 0.999999998719431459904L);
+insert("u01<float>(maxu64 - uint64_t(a)) a=5", 1.00000000000000000000L);
+insert("uneg11<float>(maxu64 - uint64_t(a)) a=5", -5.96311194867027438704e-19L);
+insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=5", 0.999999940395355224609L);
+insert("u01<double>(maxu64 - uint64_t(a)) a=5", 1.00000000000000000000L);
+insert("uneg11<double>(maxu64 - uint64_t(a)) a=5", -5.96311194867027438704e-19L);
+insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=5", 0.999999999999999888978L);
+insert("u01<long double>(maxu64 - uint64_t(a)) a=5", 0.999999999999999999675L);
+insert("uneg11<long double>(maxu64 - uint64_t(a)) a=5", -5.96311194867027438704e-19L);
+insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=5", 0.999999999999999999729L);
+insert("u01<float>(maxi32 - int32_t(a)) a=5", 0.500000000000000000000L);
+insert("uneg11<float>(maxi32 - int32_t(a)) a=5", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=5", 0.499999940395355224609L);
+insert("u01<double>(maxi32 - int32_t(a)) a=5", 0.499999998719431459904L);
+insert("uneg11<double>(maxi32 - int32_t(a)) a=5", 0.999999997438862919807L);
+insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=5", 0.499999998719431459904L);
+insert("u01<long double>(maxi32 - int32_t(a)) a=5", 0.499999998719431459904L);
+insert("uneg11<long double>(maxi32 - int32_t(a)) a=5", 0.999999997438862919807L);
+insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=5", 0.499999998719431459904L);
+insert("u01<float>(maxi64 - int64_t(a)) a=5", 0.500000000000000000000L);
+insert("uneg11<float>(maxi64 - int64_t(a)) a=5", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=5", 0.499999940395355224609L);
+insert("u01<double>(maxi64 - int64_t(a)) a=5", 0.500000000000000000000L);
+insert("uneg11<double>(maxi64 - int64_t(a)) a=5", 1.00000000000000000000L);
+insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=5", 0.499999999999999888978L);
+insert("u01<long double>(maxi64 - int64_t(a)) a=5", 0.499999999999999999702L);
+insert("uneg11<long double>(maxi64 - int64_t(a)) a=5", 0.999999999999999999404L);
+insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=5", 0.499999999999999999729L);
+insert("u01<float>(minu32 + uint32_t(a)) a=63", 1.47847458720207214355e-08L);
+insert("uneg11<float>(minu32 + uint32_t(a)) a=63", 2.95694917440414428711e-08L);
+insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=63", 5.96046447753906250000e-08L);
+insert("u01<double>(minu32 + uint32_t(a)) a=63", 1.47847458720207214355e-08L);
+insert("uneg11<double>(minu32 + uint32_t(a)) a=63", 2.95694917440414428711e-08L);
+insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=63", 1.47847458720207214355e-08L);
+insert("u01<long double>(minu32 + uint32_t(a)) a=63", 1.47847458720207214355e-08L);
+insert("uneg11<long double>(minu32 + uint32_t(a)) a=63", 2.95694917440414428711e-08L);
+insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=63", 1.47847458720207214355e-08L);
+insert("u01<float>(minu64 + uint64_t(a)) a=63", 3.44234189764147657797e-18L);
+insert("uneg11<float>(minu64 + uint64_t(a)) a=63", 6.88468379528295315595e-18L);
+insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=63", 5.96046447753906250000e-08L);
+insert("u01<double>(minu64 + uint64_t(a)) a=63", 3.44234189764147657797e-18L);
+insert("uneg11<double>(minu64 + uint64_t(a)) a=63", 6.88468379528295315595e-18L);
+insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=63", 1.11022302462515654042e-16L);
+insert("u01<long double>(minu64 + uint64_t(a)) a=63", 3.44234189764147657797e-18L);
+insert("uneg11<long double>(minu64 + uint64_t(a)) a=63", 6.88468379528295315595e-18L);
+insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=63", 3.41523684332933896712e-18L);
+insert("u01<float>(mini32 + int32_t(a)) a=63", 0.500000000000000000000L);
+insert("uneg11<float>(mini32 + int32_t(a)) a=63", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini32 + int32_t(a)) a=63", 0.500000059604644775391L);
+insert("u01<double>(mini32 + int32_t(a)) a=63", 0.500000014784745872021L);
+insert("uneg11<double>(mini32 + int32_t(a)) a=63", -0.999999970430508255959L);
+insert("u01fixedpt<double>(mini32 + int32_t(a)) a=63", 0.500000014784745872021L);
+insert("u01<long double>(mini32 + int32_t(a)) a=63", 0.500000014784745872021L);
+insert("uneg11<long double>(mini32 + int32_t(a)) a=63", -0.999999970430508255959L);
+insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=63", 0.500000014784745872021L);
+insert("u01<float>(mini64 + int64_t(a)) a=63", 0.500000000000000000000L);
+insert("uneg11<float>(mini64 + int64_t(a)) a=63", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini64 + int64_t(a)) a=63", 0.500000059604644775391L);
+insert("u01<double>(mini64 + int64_t(a)) a=63", 0.500000000000000000000L);
+insert("uneg11<double>(mini64 + int64_t(a)) a=63", -1.00000000000000000000L);
+insert("u01fixedpt<double>(mini64 + int64_t(a)) a=63", 0.500000000000000111022L);
+insert("u01<long double>(mini64 + int64_t(a)) a=63", 0.500000000000000003469L);
+insert("uneg11<long double>(mini64 + int64_t(a)) a=63", -0.999999999999999993115L);
+insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=63", 0.500000000000000003415L);
+insert("u01<float>(maxu32 - uint32_t(a)) a=63", 1.00000000000000000000L);
+insert("uneg11<float>(maxu32 - uint32_t(a)) a=63", -2.95694917440414428711e-08L);
+insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=63", 0.999999940395355224609L);
+insert("u01<double>(maxu32 - uint32_t(a)) a=63", 0.999999985215254127979L);
+insert("uneg11<double>(maxu32 - uint32_t(a)) a=63", -2.95694917440414428711e-08L);
+insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=63", 0.999999985215254127979L);
+insert("u01<long double>(maxu32 - uint32_t(a)) a=63", 0.999999985215254127979L);
+insert("uneg11<long double>(maxu32 - uint32_t(a)) a=63", -2.95694917440414428711e-08L);
+insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=63", 0.999999985215254127979L);
+insert("u01<float>(maxu64 - uint64_t(a)) a=63", 1.00000000000000000000L);
+insert("uneg11<float>(maxu64 - uint64_t(a)) a=63", -6.88468379528295315595e-18L);
+insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=63", 0.999999940395355224609L);
+insert("u01<double>(maxu64 - uint64_t(a)) a=63", 1.00000000000000000000L);
+insert("uneg11<double>(maxu64 - uint64_t(a)) a=63", -6.88468379528295315595e-18L);
+insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=63", 0.999999999999999888978L);
+insert("u01<long double>(maxu64 - uint64_t(a)) a=63", 0.999999999999999996531L);
+insert("uneg11<long double>(maxu64 - uint64_t(a)) a=63", -6.88468379528295315595e-18L);
+insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=63", 0.999999999999999996585L);
+insert("u01<float>(maxi32 - int32_t(a)) a=63", 0.500000000000000000000L);
+insert("uneg11<float>(maxi32 - int32_t(a)) a=63", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=63", 0.499999940395355224609L);
+insert("u01<double>(maxi32 - int32_t(a)) a=63", 0.499999985215254127979L);
+insert("uneg11<double>(maxi32 - int32_t(a)) a=63", 0.999999970430508255959L);
+insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=63", 0.499999985215254127979L);
+insert("u01<long double>(maxi32 - int32_t(a)) a=63", 0.499999985215254127979L);
+insert("uneg11<long double>(maxi32 - int32_t(a)) a=63", 0.999999970430508255959L);
+insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=63", 0.499999985215254127979L);
+insert("u01<float>(maxi64 - int64_t(a)) a=63", 0.500000000000000000000L);
+insert("uneg11<float>(maxi64 - int64_t(a)) a=63", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=63", 0.499999940395355224609L);
+insert("u01<double>(maxi64 - int64_t(a)) a=63", 0.500000000000000000000L);
+insert("uneg11<double>(maxi64 - int64_t(a)) a=63", 1.00000000000000000000L);
+insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=63", 0.499999999999999888978L);
+insert("u01<long double>(maxi64 - int64_t(a)) a=63", 0.499999999999999996558L);
+insert("uneg11<long double>(maxi64 - int64_t(a)) a=63", 0.999999999999999993115L);
+insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=63", 0.499999999999999996585L);
+insert("u01<float>(minu32 + uint32_t(a)) a=64", 1.50175765156745910645e-08L);
+insert("uneg11<float>(minu32 + uint32_t(a)) a=64", 3.00351530313491821289e-08L);
+insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=64", 5.96046447753906250000e-08L);
+insert("u01<double>(minu32 + uint32_t(a)) a=64", 1.50175765156745910645e-08L);
+insert("uneg11<double>(minu32 + uint32_t(a)) a=64", 3.00351530313491821289e-08L);
+insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=64", 1.50175765156745910645e-08L);
+insert("u01<long double>(minu32 + uint32_t(a)) a=64", 1.50175765156745910645e-08L);
+insert("uneg11<long double>(minu32 + uint32_t(a)) a=64", 3.00351530313491821289e-08L);
+insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=64", 1.50175765156745910645e-08L);
+insert("u01<float>(minu64 + uint64_t(a)) a=64", 3.49655200626575179967e-18L);
+insert("uneg11<float>(minu64 + uint64_t(a)) a=64", 6.99310401253150359935e-18L);
+insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=64", 5.96046447753906250000e-08L);
+insert("u01<double>(minu64 + uint64_t(a)) a=64", 3.49655200626575179967e-18L);
+insert("uneg11<double>(minu64 + uint64_t(a)) a=64", 6.99310401253150359935e-18L);
+insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=64", 1.11022302462515654042e-16L);
+insert("u01<long double>(minu64 + uint64_t(a)) a=64", 3.49655200626575179967e-18L);
+insert("uneg11<long double>(minu64 + uint64_t(a)) a=64", 6.99310401253150359935e-18L);
+insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=64", 3.52365706057788941052e-18L);
+insert("u01<float>(mini32 + int32_t(a)) a=64", 0.500000000000000000000L);
+insert("uneg11<float>(mini32 + int32_t(a)) a=64", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini32 + int32_t(a)) a=64", 0.500000059604644775391L);
+insert("u01<double>(mini32 + int32_t(a)) a=64", 0.500000015017576515675L);
+insert("uneg11<double>(mini32 + int32_t(a)) a=64", -0.999999969964846968651L);
+insert("u01fixedpt<double>(mini32 + int32_t(a)) a=64", 0.500000015017576515675L);
+insert("u01<long double>(mini32 + int32_t(a)) a=64", 0.500000015017576515675L);
+insert("uneg11<long double>(mini32 + int32_t(a)) a=64", -0.999999969964846968651L);
+insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=64", 0.500000015017576515675L);
+insert("u01<float>(mini64 + int64_t(a)) a=64", 0.500000000000000000000L);
+insert("uneg11<float>(mini64 + int64_t(a)) a=64", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini64 + int64_t(a)) a=64", 0.500000059604644775391L);
+insert("u01<double>(mini64 + int64_t(a)) a=64", 0.500000000000000000000L);
+insert("uneg11<double>(mini64 + int64_t(a)) a=64", -1.00000000000000000000L);
+insert("u01fixedpt<double>(mini64 + int64_t(a)) a=64", 0.500000000000000111022L);
+insert("u01<long double>(mini64 + int64_t(a)) a=64", 0.500000000000000003469L);
+insert("uneg11<long double>(mini64 + int64_t(a)) a=64", -0.999999999999999993007L);
+insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=64", 0.500000000000000003524L);
+insert("u01<float>(maxu32 - uint32_t(a)) a=64", 1.00000000000000000000L);
+insert("uneg11<float>(maxu32 - uint32_t(a)) a=64", -3.00351530313491821289e-08L);
+insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=64", 0.999999940395355224609L);
+insert("u01<double>(maxu32 - uint32_t(a)) a=64", 0.999999984982423484325L);
+insert("uneg11<double>(maxu32 - uint32_t(a)) a=64", -3.00351530313491821289e-08L);
+insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=64", 0.999999984982423484325L);
+insert("u01<long double>(maxu32 - uint32_t(a)) a=64", 0.999999984982423484325L);
+insert("uneg11<long double>(maxu32 - uint32_t(a)) a=64", -3.00351530313491821289e-08L);
+insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=64", 0.999999984982423484325L);
+insert("u01<float>(maxu64 - uint64_t(a)) a=64", 1.00000000000000000000L);
+insert("uneg11<float>(maxu64 - uint64_t(a)) a=64", -6.99310401253150359935e-18L);
+insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=64", 0.999999940395355224609L);
+insert("u01<double>(maxu64 - uint64_t(a)) a=64", 1.00000000000000000000L);
+insert("uneg11<double>(maxu64 - uint64_t(a)) a=64", -6.99310401253150359935e-18L);
+insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=64", 0.999999999999999888978L);
+insert("u01<long double>(maxu64 - uint64_t(a)) a=64", 0.999999999999999996531L);
+insert("uneg11<long double>(maxu64 - uint64_t(a)) a=64", -6.99310401253150359935e-18L);
+insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=64", 0.999999999999999996476L);
+insert("u01<float>(maxi32 - int32_t(a)) a=64", 0.499999970197677612305L);
+insert("uneg11<float>(maxi32 - int32_t(a)) a=64", 0.999999940395355224609L);
+insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=64", 0.499999940395355224609L);
+insert("u01<double>(maxi32 - int32_t(a)) a=64", 0.499999984982423484325L);
+insert("uneg11<double>(maxi32 - int32_t(a)) a=64", 0.999999969964846968651L);
+insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=64", 0.499999984982423484325L);
+insert("u01<long double>(maxi32 - int32_t(a)) a=64", 0.499999984982423484325L);
+insert("uneg11<long double>(maxi32 - int32_t(a)) a=64", 0.999999969964846968651L);
+insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=64", 0.499999984982423484325L);
+insert("u01<float>(maxi64 - int64_t(a)) a=64", 0.500000000000000000000L);
+insert("uneg11<float>(maxi64 - int64_t(a)) a=64", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=64", 0.499999940395355224609L);
+insert("u01<double>(maxi64 - int64_t(a)) a=64", 0.500000000000000000000L);
+insert("uneg11<double>(maxi64 - int64_t(a)) a=64", 1.00000000000000000000L);
+insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=64", 0.499999999999999888978L);
+insert("u01<long double>(maxi64 - int64_t(a)) a=64", 0.499999999999999996503L);
+insert("uneg11<long double>(maxi64 - int64_t(a)) a=64", 0.999999999999999993007L);
+insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=64", 0.499999999999999996476L);
+insert("u01<float>(minu32 + uint32_t(a)) a=65", 1.52504071593284606934e-08L);
+insert("uneg11<float>(minu32 + uint32_t(a)) a=65", 3.05008143186569213867e-08L);
+insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=65", 5.96046447753906250000e-08L);
+insert("u01<double>(minu32 + uint32_t(a)) a=65", 1.52504071593284606934e-08L);
+insert("uneg11<double>(minu32 + uint32_t(a)) a=65", 3.05008143186569213867e-08L);
+insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=65", 1.52504071593284606934e-08L);
+insert("u01<long double>(minu32 + uint32_t(a)) a=65", 1.52504071593284606934e-08L);
+insert("uneg11<long double>(minu32 + uint32_t(a)) a=65", 3.05008143186569213867e-08L);
+insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=65", 1.52504071593284606934e-08L);
+insert("u01<float>(minu64 + uint64_t(a)) a=65", 3.55076211489002702137e-18L);
+insert("uneg11<float>(minu64 + uint64_t(a)) a=65", 7.10152422978005404275e-18L);
+insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=65", 5.96046447753906250000e-08L);
+insert("u01<double>(minu64 + uint64_t(a)) a=65", 3.55076211489002702137e-18L);
+insert("uneg11<double>(minu64 + uint64_t(a)) a=65", 7.10152422978005404275e-18L);
+insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=65", 1.11022302462515654042e-16L);
+insert("u01<long double>(minu64 + uint64_t(a)) a=65", 3.55076211489002702137e-18L);
+insert("uneg11<long double>(minu64 + uint64_t(a)) a=65", 7.10152422978005404275e-18L);
+insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=65", 3.52365706057788941052e-18L);
+insert("u01<float>(mini32 + int32_t(a)) a=65", 0.500000000000000000000L);
+insert("uneg11<float>(mini32 + int32_t(a)) a=65", -0.999999940395355224609L);
+insert("u01fixedpt<float>(mini32 + int32_t(a)) a=65", 0.500000059604644775391L);
+insert("u01<double>(mini32 + int32_t(a)) a=65", 0.500000015250407159328L);
+insert("uneg11<double>(mini32 + int32_t(a)) a=65", -0.999999969499185681343L);
+insert("u01fixedpt<double>(mini32 + int32_t(a)) a=65", 0.500000015250407159328L);
+insert("u01<long double>(mini32 + int32_t(a)) a=65", 0.500000015250407159328L);
+insert("uneg11<long double>(mini32 + int32_t(a)) a=65", -0.999999969499185681343L);
+insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=65", 0.500000015250407159328L);
+insert("u01<float>(mini64 + int64_t(a)) a=65", 0.500000000000000000000L);
+insert("uneg11<float>(mini64 + int64_t(a)) a=65", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini64 + int64_t(a)) a=65", 0.500000059604644775391L);
+insert("u01<double>(mini64 + int64_t(a)) a=65", 0.500000000000000000000L);
+insert("uneg11<double>(mini64 + int64_t(a)) a=65", -1.00000000000000000000L);
+insert("u01fixedpt<double>(mini64 + int64_t(a)) a=65", 0.500000000000000111022L);
+insert("u01<long double>(mini64 + int64_t(a)) a=65", 0.500000000000000003578L);
+insert("uneg11<long double>(mini64 + int64_t(a)) a=65", -0.999999999999999992898L);
+insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=65", 0.500000000000000003524L);
+insert("u01<float>(maxu32 - uint32_t(a)) a=65", 1.00000000000000000000L);
+insert("uneg11<float>(maxu32 - uint32_t(a)) a=65", -3.05008143186569213867e-08L);
+insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=65", 0.999999940395355224609L);
+insert("u01<double>(maxu32 - uint32_t(a)) a=65", 0.999999984749592840672L);
+insert("uneg11<double>(maxu32 - uint32_t(a)) a=65", -3.05008143186569213867e-08L);
+insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=65", 0.999999984749592840672L);
+insert("u01<long double>(maxu32 - uint32_t(a)) a=65", 0.999999984749592840672L);
+insert("uneg11<long double>(maxu32 - uint32_t(a)) a=65", -3.05008143186569213867e-08L);
+insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=65", 0.999999984749592840672L);
+insert("u01<float>(maxu64 - uint64_t(a)) a=65", 1.00000000000000000000L);
+insert("uneg11<float>(maxu64 - uint64_t(a)) a=65", -7.10152422978005404275e-18L);
+insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=65", 0.999999940395355224609L);
+insert("u01<double>(maxu64 - uint64_t(a)) a=65", 1.00000000000000000000L);
+insert("uneg11<double>(maxu64 - uint64_t(a)) a=65", -7.10152422978005404275e-18L);
+insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=65", 0.999999999999999888978L);
+insert("u01<long double>(maxu64 - uint64_t(a)) a=65", 0.999999999999999996422L);
+insert("uneg11<long double>(maxu64 - uint64_t(a)) a=65", -7.10152422978005404275e-18L);
+insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=65", 0.999999999999999996476L);
+insert("u01<float>(maxi32 - int32_t(a)) a=65", 0.499999970197677612305L);
+insert("uneg11<float>(maxi32 - int32_t(a)) a=65", 0.999999940395355224609L);
+insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=65", 0.499999940395355224609L);
+insert("u01<double>(maxi32 - int32_t(a)) a=65", 0.499999984749592840672L);
+insert("uneg11<double>(maxi32 - int32_t(a)) a=65", 0.999999969499185681343L);
+insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=65", 0.499999984749592840672L);
+insert("u01<long double>(maxi32 - int32_t(a)) a=65", 0.499999984749592840672L);
+insert("uneg11<long double>(maxi32 - int32_t(a)) a=65", 0.999999969499185681343L);
+insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=65", 0.499999984749592840672L);
+insert("u01<float>(maxi64 - int64_t(a)) a=65", 0.500000000000000000000L);
+insert("uneg11<float>(maxi64 - int64_t(a)) a=65", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=65", 0.499999940395355224609L);
+insert("u01<double>(maxi64 - int64_t(a)) a=65", 0.500000000000000000000L);
+insert("uneg11<double>(maxi64 - int64_t(a)) a=65", 1.00000000000000000000L);
+insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=65", 0.499999999999999888978L);
+insert("u01<long double>(maxi64 - int64_t(a)) a=65", 0.499999999999999996449L);
+insert("uneg11<long double>(maxi64 - int64_t(a)) a=65", 0.999999999999999992898L);
+insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=65", 0.499999999999999996476L);
+insert("u01<float>(minu32 + uint32_t(a)) a=127", 2.96859070658683776855e-08L);
+insert("uneg11<float>(minu32 + uint32_t(a)) a=127", 5.93718141317367553711e-08L);
+insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=127", 5.96046447753906250000e-08L);
+insert("u01<double>(minu32 + uint32_t(a)) a=127", 2.96859070658683776855e-08L);
+insert("uneg11<double>(minu32 + uint32_t(a)) a=127", 5.93718141317367553711e-08L);
+insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=127", 2.96859070658683776855e-08L);
+insert("u01<long double>(minu32 + uint32_t(a)) a=127", 2.96859070658683776855e-08L);
+insert("uneg11<long double>(minu32 + uint32_t(a)) a=127", 5.93718141317367553711e-08L);
+insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=127", 2.96859070658683776855e-08L);
+insert("u01<float>(minu64 + uint64_t(a)) a=127", 6.91178884959509076680e-18L);
+insert("uneg11<float>(minu64 + uint64_t(a)) a=127", 1.38235776991901815336e-17L);
+insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=127", 5.96046447753906250000e-08L);
+insert("u01<double>(minu64 + uint64_t(a)) a=127", 6.91178884959509076680e-18L);
+insert("uneg11<double>(minu64 + uint64_t(a)) a=127", 1.38235776991901815336e-17L);
+insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=127", 1.11022302462515654042e-16L);
+insert("u01<long double>(minu64 + uint64_t(a)) a=127", 6.91178884959509076680e-18L);
+insert("uneg11<long double>(minu64 + uint64_t(a)) a=127", 1.38235776991901815336e-17L);
+insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=127", 6.88468379528295315595e-18L);
+insert("u01<float>(mini32 + int32_t(a)) a=127", 0.500000000000000000000L);
+insert("uneg11<float>(mini32 + int32_t(a)) a=127", -0.999999940395355224609L);
+insert("u01fixedpt<float>(mini32 + int32_t(a)) a=127", 0.500000059604644775391L);
+insert("u01<double>(mini32 + int32_t(a)) a=127", 0.500000029685907065868L);
+insert("uneg11<double>(mini32 + int32_t(a)) a=127", -0.999999940628185868263L);
+insert("u01fixedpt<double>(mini32 + int32_t(a)) a=127", 0.500000029685907065868L);
+insert("u01<long double>(mini32 + int32_t(a)) a=127", 0.500000029685907065868L);
+insert("uneg11<long double>(mini32 + int32_t(a)) a=127", -0.999999940628185868263L);
+insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=127", 0.500000029685907065868L);
+insert("u01<float>(mini64 + int64_t(a)) a=127", 0.500000000000000000000L);
+insert("uneg11<float>(mini64 + int64_t(a)) a=127", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini64 + int64_t(a)) a=127", 0.500000059604644775391L);
+insert("u01<double>(mini64 + int64_t(a)) a=127", 0.500000000000000000000L);
+insert("uneg11<double>(mini64 + int64_t(a)) a=127", -1.00000000000000000000L);
+insert("u01fixedpt<double>(mini64 + int64_t(a)) a=127", 0.500000000000000111022L);
+insert("u01<long double>(mini64 + int64_t(a)) a=127", 0.500000000000000006939L);
+insert("uneg11<long double>(mini64 + int64_t(a)) a=127", -0.999999999999999986176L);
+insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=127", 0.500000000000000006885L);
+insert("u01<float>(maxu32 - uint32_t(a)) a=127", 1.00000000000000000000L);
+insert("uneg11<float>(maxu32 - uint32_t(a)) a=127", -5.93718141317367553711e-08L);
+insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=127", 0.999999940395355224609L);
+insert("u01<double>(maxu32 - uint32_t(a)) a=127", 0.999999970314092934132L);
+insert("uneg11<double>(maxu32 - uint32_t(a)) a=127", -5.93718141317367553711e-08L);
+insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=127", 0.999999970314092934132L);
+insert("u01<long double>(maxu32 - uint32_t(a)) a=127", 0.999999970314092934132L);
+insert("uneg11<long double>(maxu32 - uint32_t(a)) a=127", -5.93718141317367553711e-08L);
+insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=127", 0.999999970314092934132L);
+insert("u01<float>(maxu64 - uint64_t(a)) a=127", 1.00000000000000000000L);
+insert("uneg11<float>(maxu64 - uint64_t(a)) a=127", -1.38235776991901815336e-17L);
+insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=127", 0.999999940395355224609L);
+insert("u01<double>(maxu64 - uint64_t(a)) a=127", 1.00000000000000000000L);
+insert("uneg11<double>(maxu64 - uint64_t(a)) a=127", -1.38235776991901815336e-17L);
+insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=127", 0.999999999999999888978L);
+insert("u01<long double>(maxu64 - uint64_t(a)) a=127", 0.999999999999999993061L);
+insert("uneg11<long double>(maxu64 - uint64_t(a)) a=127", -1.38235776991901815336e-17L);
+insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=127", 0.999999999999999993115L);
+insert("u01<float>(maxi32 - int32_t(a)) a=127", 0.499999970197677612305L);
+insert("uneg11<float>(maxi32 - int32_t(a)) a=127", 0.999999940395355224609L);
+insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=127", 0.499999940395355224609L);
+insert("u01<double>(maxi32 - int32_t(a)) a=127", 0.499999970314092934132L);
+insert("uneg11<double>(maxi32 - int32_t(a)) a=127", 0.999999940628185868263L);
+insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=127", 0.499999970314092934132L);
+insert("u01<long double>(maxi32 - int32_t(a)) a=127", 0.499999970314092934132L);
+insert("uneg11<long double>(maxi32 - int32_t(a)) a=127", 0.999999940628185868263L);
+insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=127", 0.499999970314092934132L);
+insert("u01<float>(maxi64 - int64_t(a)) a=127", 0.500000000000000000000L);
+insert("uneg11<float>(maxi64 - int64_t(a)) a=127", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=127", 0.499999940395355224609L);
+insert("u01<double>(maxi64 - int64_t(a)) a=127", 0.500000000000000000000L);
+insert("uneg11<double>(maxi64 - int64_t(a)) a=127", 1.00000000000000000000L);
+insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=127", 0.499999999999999888978L);
+insert("u01<long double>(maxi64 - int64_t(a)) a=127", 0.499999999999999993088L);
+insert("uneg11<long double>(maxi64 - int64_t(a)) a=127", 0.999999999999999986176L);
+insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=127", 0.499999999999999993115L);
+insert("u01<float>(minu32 + uint32_t(a)) a=128", 2.99187377095222473145e-08L);
+insert("uneg11<float>(minu32 + uint32_t(a)) a=128", 5.98374754190444946289e-08L);
+insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=128", 5.96046447753906250000e-08L);
+insert("u01<double>(minu32 + uint32_t(a)) a=128", 2.99187377095222473145e-08L);
+insert("uneg11<double>(minu32 + uint32_t(a)) a=128", 5.98374754190444946289e-08L);
+insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=128", 2.99187377095222473145e-08L);
+insert("u01<long double>(minu32 + uint32_t(a)) a=128", 2.99187377095222473145e-08L);
+insert("uneg11<long double>(minu32 + uint32_t(a)) a=128", 5.98374754190444946289e-08L);
+insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=128", 2.99187377095222473145e-08L);
+insert("u01<float>(minu64 + uint64_t(a)) a=128", 6.96599895821936598850e-18L);
+insert("uneg11<float>(minu64 + uint64_t(a)) a=128", 1.39319979164387319770e-17L);
+insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=128", 5.96046447753906250000e-08L);
+insert("u01<double>(minu64 + uint64_t(a)) a=128", 6.96599895821936598850e-18L);
+insert("uneg11<double>(minu64 + uint64_t(a)) a=128", 1.39319979164387319770e-17L);
+insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=128", 1.11022302462515654042e-16L);
+insert("u01<long double>(minu64 + uint64_t(a)) a=128", 6.96599895821936598850e-18L);
+insert("uneg11<long double>(minu64 + uint64_t(a)) a=128", 1.39319979164387319770e-17L);
+insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=128", 6.99310401253150359935e-18L);
+insert("u01<float>(mini32 + int32_t(a)) a=128", 0.500000000000000000000L);
+insert("uneg11<float>(mini32 + int32_t(a)) a=128", -0.999999940395355224609L);
+insert("u01fixedpt<float>(mini32 + int32_t(a)) a=128", 0.500000059604644775391L);
+insert("u01<double>(mini32 + int32_t(a)) a=128", 0.500000029918737709522L);
+insert("uneg11<double>(mini32 + int32_t(a)) a=128", -0.999999940162524580956L);
+insert("u01fixedpt<double>(mini32 + int32_t(a)) a=128", 0.500000029918737709522L);
+insert("u01<long double>(mini32 + int32_t(a)) a=128", 0.500000029918737709522L);
+insert("uneg11<long double>(mini32 + int32_t(a)) a=128", -0.999999940162524580956L);
+insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=128", 0.500000029918737709522L);
+insert("u01<float>(mini64 + int64_t(a)) a=128", 0.500000000000000000000L);
+insert("uneg11<float>(mini64 + int64_t(a)) a=128", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini64 + int64_t(a)) a=128", 0.500000059604644775391L);
+insert("u01<double>(mini64 + int64_t(a)) a=128", 0.500000000000000000000L);
+insert("uneg11<double>(mini64 + int64_t(a)) a=128", -1.00000000000000000000L);
+insert("u01fixedpt<double>(mini64 + int64_t(a)) a=128", 0.500000000000000111022L);
+insert("u01<long double>(mini64 + int64_t(a)) a=128", 0.500000000000000006939L);
+insert("uneg11<long double>(mini64 + int64_t(a)) a=128", -0.999999999999999986068L);
+insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=128", 0.500000000000000006993L);
+insert("u01<float>(maxu32 - uint32_t(a)) a=128", 0.999999940395355224609L);
+insert("uneg11<float>(maxu32 - uint32_t(a)) a=128", -5.98374754190444946289e-08L);
+insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=128", 0.999999940395355224609L);
+insert("u01<double>(maxu32 - uint32_t(a)) a=128", 0.999999970081262290478L);
+insert("uneg11<double>(maxu32 - uint32_t(a)) a=128", -5.98374754190444946289e-08L);
+insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=128", 0.999999970081262290478L);
+insert("u01<long double>(maxu32 - uint32_t(a)) a=128", 0.999999970081262290478L);
+insert("uneg11<long double>(maxu32 - uint32_t(a)) a=128", -5.98374754190444946289e-08L);
+insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=128", 0.999999970081262290478L);
+insert("u01<float>(maxu64 - uint64_t(a)) a=128", 1.00000000000000000000L);
+insert("uneg11<float>(maxu64 - uint64_t(a)) a=128", -1.39319979164387319770e-17L);
+insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=128", 0.999999940395355224609L);
+insert("u01<double>(maxu64 - uint64_t(a)) a=128", 1.00000000000000000000L);
+insert("uneg11<double>(maxu64 - uint64_t(a)) a=128", -1.39319979164387319770e-17L);
+insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=128", 0.999999999999999888978L);
+insert("u01<long double>(maxu64 - uint64_t(a)) a=128", 0.999999999999999993061L);
+insert("uneg11<long double>(maxu64 - uint64_t(a)) a=128", -1.39319979164387319770e-17L);
+insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=128", 0.999999999999999993007L);
+insert("u01<float>(maxi32 - int32_t(a)) a=128", 0.499999970197677612305L);
+insert("uneg11<float>(maxi32 - int32_t(a)) a=128", 0.999999940395355224609L);
+insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=128", 0.499999940395355224609L);
+insert("u01<double>(maxi32 - int32_t(a)) a=128", 0.499999970081262290478L);
+insert("uneg11<double>(maxi32 - int32_t(a)) a=128", 0.999999940162524580956L);
+insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=128", 0.499999970081262290478L);
+insert("u01<long double>(maxi32 - int32_t(a)) a=128", 0.499999970081262290478L);
+insert("uneg11<long double>(maxi32 - int32_t(a)) a=128", 0.999999940162524580956L);
+insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=128", 0.499999970081262290478L);
+insert("u01<float>(maxi64 - int64_t(a)) a=128", 0.500000000000000000000L);
+insert("uneg11<float>(maxi64 - int64_t(a)) a=128", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=128", 0.499999940395355224609L);
+insert("u01<double>(maxi64 - int64_t(a)) a=128", 0.500000000000000000000L);
+insert("uneg11<double>(maxi64 - int64_t(a)) a=128", 1.00000000000000000000L);
+insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=128", 0.499999999999999888978L);
+insert("u01<long double>(maxi64 - int64_t(a)) a=128", 0.499999999999999993034L);
+insert("uneg11<long double>(maxi64 - int64_t(a)) a=128", 0.999999999999999986068L);
+insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=128", 0.499999999999999993007L);
+insert("u01<float>(minu32 + uint32_t(a)) a=129", 3.01515683531761169434e-08L);
+insert("uneg11<float>(minu32 + uint32_t(a)) a=129", 6.03031367063522338867e-08L);
+insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=129", 5.96046447753906250000e-08L);
+insert("u01<double>(minu32 + uint32_t(a)) a=129", 3.01515683531761169434e-08L);
+insert("uneg11<double>(minu32 + uint32_t(a)) a=129", 6.03031367063522338867e-08L);
+insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=129", 3.01515683531761169434e-08L);
+insert("u01<long double>(minu32 + uint32_t(a)) a=129", 3.01515683531761169434e-08L);
+insert("uneg11<long double>(minu32 + uint32_t(a)) a=129", 6.03031367063522338867e-08L);
+insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=129", 3.01515683531761169434e-08L);
+insert("u01<float>(minu64 + uint64_t(a)) a=129", 7.02020906684364121020e-18L);
+insert("uneg11<float>(minu64 + uint64_t(a)) a=129", 1.40404181336872824204e-17L);
+insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=129", 5.96046447753906250000e-08L);
+insert("u01<double>(minu64 + uint64_t(a)) a=129", 7.02020906684364121020e-18L);
+insert("uneg11<double>(minu64 + uint64_t(a)) a=129", 1.40404181336872824204e-17L);
+insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=129", 1.11022302462515654042e-16L);
+insert("u01<long double>(minu64 + uint64_t(a)) a=129", 7.02020906684364121020e-18L);
+insert("uneg11<long double>(minu64 + uint64_t(a)) a=129", 1.40404181336872824204e-17L);
+insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=129", 6.99310401253150359935e-18L);
+insert("u01<float>(mini32 + int32_t(a)) a=129", 0.500000059604644775391L);
+insert("uneg11<float>(mini32 + int32_t(a)) a=129", -0.999999940395355224609L);
+insert("u01fixedpt<float>(mini32 + int32_t(a)) a=129", 0.500000059604644775391L);
+insert("u01<double>(mini32 + int32_t(a)) a=129", 0.500000030151568353176L);
+insert("uneg11<double>(mini32 + int32_t(a)) a=129", -0.999999939696863293648L);
+insert("u01fixedpt<double>(mini32 + int32_t(a)) a=129", 0.500000030151568353176L);
+insert("u01<long double>(mini32 + int32_t(a)) a=129", 0.500000030151568353176L);
+insert("uneg11<long double>(mini32 + int32_t(a)) a=129", -0.999999939696863293648L);
+insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=129", 0.500000030151568353176L);
+insert("u01<float>(mini64 + int64_t(a)) a=129", 0.500000000000000000000L);
+insert("uneg11<float>(mini64 + int64_t(a)) a=129", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini64 + int64_t(a)) a=129", 0.500000059604644775391L);
+insert("u01<double>(mini64 + int64_t(a)) a=129", 0.500000000000000000000L);
+insert("uneg11<double>(mini64 + int64_t(a)) a=129", -1.00000000000000000000L);
+insert("u01fixedpt<double>(mini64 + int64_t(a)) a=129", 0.500000000000000111022L);
+insert("u01<long double>(mini64 + int64_t(a)) a=129", 0.500000000000000007047L);
+insert("uneg11<long double>(mini64 + int64_t(a)) a=129", -0.999999999999999985960L);
+insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=129", 0.500000000000000006993L);
+insert("u01<float>(maxu32 - uint32_t(a)) a=129", 0.999999940395355224609L);
+insert("uneg11<float>(maxu32 - uint32_t(a)) a=129", -6.03031367063522338867e-08L);
+insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=129", 0.999999940395355224609L);
+insert("u01<double>(maxu32 - uint32_t(a)) a=129", 0.999999969848431646824L);
+insert("uneg11<double>(maxu32 - uint32_t(a)) a=129", -6.03031367063522338867e-08L);
+insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=129", 0.999999969848431646824L);
+insert("u01<long double>(maxu32 - uint32_t(a)) a=129", 0.999999969848431646824L);
+insert("uneg11<long double>(maxu32 - uint32_t(a)) a=129", -6.03031367063522338867e-08L);
+insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=129", 0.999999969848431646824L);
+insert("u01<float>(maxu64 - uint64_t(a)) a=129", 1.00000000000000000000L);
+insert("uneg11<float>(maxu64 - uint64_t(a)) a=129", -1.40404181336872824204e-17L);
+insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=129", 0.999999940395355224609L);
+insert("u01<double>(maxu64 - uint64_t(a)) a=129", 1.00000000000000000000L);
+insert("uneg11<double>(maxu64 - uint64_t(a)) a=129", -1.40404181336872824204e-17L);
+insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=129", 0.999999999999999888978L);
+insert("u01<long double>(maxu64 - uint64_t(a)) a=129", 0.999999999999999992953L);
+insert("uneg11<long double>(maxu64 - uint64_t(a)) a=129", -1.40404181336872824204e-17L);
+insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=129", 0.999999999999999993007L);
+insert("u01<float>(maxi32 - int32_t(a)) a=129", 0.499999970197677612305L);
+insert("uneg11<float>(maxi32 - int32_t(a)) a=129", 0.999999940395355224609L);
+insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=129", 0.499999940395355224609L);
+insert("u01<double>(maxi32 - int32_t(a)) a=129", 0.499999969848431646824L);
+insert("uneg11<double>(maxi32 - int32_t(a)) a=129", 0.999999939696863293648L);
+insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=129", 0.499999969848431646824L);
+insert("u01<long double>(maxi32 - int32_t(a)) a=129", 0.499999969848431646824L);
+insert("uneg11<long double>(maxi32 - int32_t(a)) a=129", 0.999999939696863293648L);
+insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=129", 0.499999969848431646824L);
+insert("u01<float>(maxi64 - int64_t(a)) a=129", 0.500000000000000000000L);
+insert("uneg11<float>(maxi64 - int64_t(a)) a=129", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=129", 0.499999940395355224609L);
+insert("u01<double>(maxi64 - int64_t(a)) a=129", 0.500000000000000000000L);
+insert("uneg11<double>(maxi64 - int64_t(a)) a=129", 1.00000000000000000000L);
+insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=129", 0.499999999999999888978L);
+insert("u01<long double>(maxi64 - int64_t(a)) a=129", 0.499999999999999992980L);
+insert("uneg11<long double>(maxi64 - int64_t(a)) a=129", 0.999999999999999985960L);
+insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=129", 0.499999999999999993007L);
+insert("u01<float>(minu32 + uint32_t(a)) a=191", 4.45870682597160339355e-08L);
+insert("uneg11<float>(minu32 + uint32_t(a)) a=191", 8.91741365194320678711e-08L);
+insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=191", 5.96046447753906250000e-08L);
+insert("u01<double>(minu32 + uint32_t(a)) a=191", 4.45870682597160339355e-08L);
+insert("uneg11<double>(minu32 + uint32_t(a)) a=191", 8.91741365194320678711e-08L);
+insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=191", 4.45870682597160339355e-08L);
+insert("u01<long double>(minu32 + uint32_t(a)) a=191", 4.45870682597160339355e-08L);
+insert("uneg11<long double>(minu32 + uint32_t(a)) a=191", 8.91741365194320678711e-08L);
+insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=191", 4.45870682597160339355e-08L);
+insert("u01<float>(minu64 + uint64_t(a)) a=191", 1.03812358015487049556e-17L);
+insert("uneg11<float>(minu64 + uint64_t(a)) a=191", 2.07624716030974099112e-17L);
+insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=191", 5.96046447753906250000e-08L);
+insert("u01<double>(minu64 + uint64_t(a)) a=191", 1.03812358015487049556e-17L);
+insert("uneg11<double>(minu64 + uint64_t(a)) a=191", 2.07624716030974099112e-17L);
+insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=191", 1.11022302462515654042e-16L);
+insert("u01<long double>(minu64 + uint64_t(a)) a=191", 1.03812358015487049556e-17L);
+insert("uneg11<long double>(minu64 + uint64_t(a)) a=191", 2.07624716030974099112e-17L);
+insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=191", 1.03541307472365673448e-17L);
+insert("u01<float>(mini32 + int32_t(a)) a=191", 0.500000059604644775391L);
+insert("uneg11<float>(mini32 + int32_t(a)) a=191", -0.999999940395355224609L);
+insert("u01fixedpt<float>(mini32 + int32_t(a)) a=191", 0.500000059604644775391L);
+insert("u01<double>(mini32 + int32_t(a)) a=191", 0.500000044587068259716L);
+insert("uneg11<double>(mini32 + int32_t(a)) a=191", -0.999999910825863480568L);
+insert("u01fixedpt<double>(mini32 + int32_t(a)) a=191", 0.500000044587068259716L);
+insert("u01<long double>(mini32 + int32_t(a)) a=191", 0.500000044587068259716L);
+insert("uneg11<long double>(mini32 + int32_t(a)) a=191", -0.999999910825863480568L);
+insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=191", 0.500000044587068259716L);
+insert("u01<float>(mini64 + int64_t(a)) a=191", 0.500000000000000000000L);
+insert("uneg11<float>(mini64 + int64_t(a)) a=191", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini64 + int64_t(a)) a=191", 0.500000059604644775391L);
+insert("u01<double>(mini64 + int64_t(a)) a=191", 0.500000000000000000000L);
+insert("uneg11<double>(mini64 + int64_t(a)) a=191", -1.00000000000000000000L);
+insert("u01fixedpt<double>(mini64 + int64_t(a)) a=191", 0.500000000000000111022L);
+insert("u01<long double>(mini64 + int64_t(a)) a=191", 0.500000000000000010408L);
+insert("uneg11<long double>(mini64 + int64_t(a)) a=191", -0.999999999999999979238L);
+insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=191", 0.500000000000000010354L);
+insert("u01<float>(maxu32 - uint32_t(a)) a=191", 0.999999940395355224609L);
+insert("uneg11<float>(maxu32 - uint32_t(a)) a=191", -8.91741365194320678711e-08L);
+insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=191", 0.999999940395355224609L);
+insert("u01<double>(maxu32 - uint32_t(a)) a=191", 0.999999955412931740284L);
+insert("uneg11<double>(maxu32 - uint32_t(a)) a=191", -8.91741365194320678711e-08L);
+insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=191", 0.999999955412931740284L);
+insert("u01<long double>(maxu32 - uint32_t(a)) a=191", 0.999999955412931740284L);
+insert("uneg11<long double>(maxu32 - uint32_t(a)) a=191", -8.91741365194320678711e-08L);
+insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=191", 0.999999955412931740284L);
+insert("u01<float>(maxu64 - uint64_t(a)) a=191", 1.00000000000000000000L);
+insert("uneg11<float>(maxu64 - uint64_t(a)) a=191", -2.07624716030974099112e-17L);
+insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=191", 0.999999940395355224609L);
+insert("u01<double>(maxu64 - uint64_t(a)) a=191", 1.00000000000000000000L);
+insert("uneg11<double>(maxu64 - uint64_t(a)) a=191", -2.07624716030974099112e-17L);
+insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=191", 0.999999999999999888978L);
+insert("u01<long double>(maxu64 - uint64_t(a)) a=191", 0.999999999999999989592L);
+insert("uneg11<long double>(maxu64 - uint64_t(a)) a=191", -2.07624716030974099112e-17L);
+insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=191", 0.999999999999999989646L);
+insert("u01<float>(maxi32 - int32_t(a)) a=191", 0.499999940395355224609L);
+insert("uneg11<float>(maxi32 - int32_t(a)) a=191", 0.999999880790710449219L);
+insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=191", 0.499999940395355224609L);
+insert("u01<double>(maxi32 - int32_t(a)) a=191", 0.499999955412931740284L);
+insert("uneg11<double>(maxi32 - int32_t(a)) a=191", 0.999999910825863480568L);
+insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=191", 0.499999955412931740284L);
+insert("u01<long double>(maxi32 - int32_t(a)) a=191", 0.499999955412931740284L);
+insert("uneg11<long double>(maxi32 - int32_t(a)) a=191", 0.999999910825863480568L);
+insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=191", 0.499999955412931740284L);
+insert("u01<float>(maxi64 - int64_t(a)) a=191", 0.500000000000000000000L);
+insert("uneg11<float>(maxi64 - int64_t(a)) a=191", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=191", 0.499999940395355224609L);
+insert("u01<double>(maxi64 - int64_t(a)) a=191", 0.500000000000000000000L);
+insert("uneg11<double>(maxi64 - int64_t(a)) a=191", 1.00000000000000000000L);
+insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=191", 0.499999999999999888978L);
+insert("u01<long double>(maxi64 - int64_t(a)) a=191", 0.499999999999999989619L);
+insert("uneg11<long double>(maxi64 - int64_t(a)) a=191", 0.999999999999999979238L);
+insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=191", 0.499999999999999989646L);
+insert("u01<float>(minu32 + uint32_t(a)) a=192", 4.48198989033699035645e-08L);
+insert("uneg11<float>(minu32 + uint32_t(a)) a=192", 8.96397978067398071289e-08L);
+insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=192", 5.96046447753906250000e-08L);
+insert("u01<double>(minu32 + uint32_t(a)) a=192", 4.48198989033699035645e-08L);
+insert("uneg11<double>(minu32 + uint32_t(a)) a=192", 8.96397978067398071289e-08L);
+insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=192", 4.48198989033699035645e-08L);
+insert("u01<long double>(minu32 + uint32_t(a)) a=192", 4.48198989033699035645e-08L);
+insert("uneg11<long double>(minu32 + uint32_t(a)) a=192", 8.96397978067398071289e-08L);
+insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=192", 4.48198989033699035645e-08L);
+insert("u01<float>(minu64 + uint64_t(a)) a=192", 1.04354459101729801773e-17L);
+insert("uneg11<float>(minu64 + uint64_t(a)) a=192", 2.08708918203459603546e-17L);
+insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=192", 5.96046447753906250000e-08L);
+insert("u01<double>(minu64 + uint64_t(a)) a=192", 1.04354459101729801773e-17L);
+insert("uneg11<double>(minu64 + uint64_t(a)) a=192", 2.08708918203459603546e-17L);
+insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=192", 1.11022302462515654042e-16L);
+insert("u01<long double>(minu64 + uint64_t(a)) a=192", 1.04354459101729801773e-17L);
+insert("uneg11<long double>(minu64 + uint64_t(a)) a=192", 2.08708918203459603546e-17L);
+insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=192", 1.04625509644851177882e-17L);
+insert("u01<float>(mini32 + int32_t(a)) a=192", 0.500000059604644775391L);
+insert("uneg11<float>(mini32 + int32_t(a)) a=192", -0.999999880790710449219L);
+insert("u01fixedpt<float>(mini32 + int32_t(a)) a=192", 0.500000059604644775391L);
+insert("u01<double>(mini32 + int32_t(a)) a=192", 0.500000044819898903370L);
+insert("uneg11<double>(mini32 + int32_t(a)) a=192", -0.999999910360202193260L);
+insert("u01fixedpt<double>(mini32 + int32_t(a)) a=192", 0.500000044819898903370L);
+insert("u01<long double>(mini32 + int32_t(a)) a=192", 0.500000044819898903370L);
+insert("uneg11<long double>(mini32 + int32_t(a)) a=192", -0.999999910360202193260L);
+insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=192", 0.500000044819898903370L);
+insert("u01<float>(mini64 + int64_t(a)) a=192", 0.500000000000000000000L);
+insert("uneg11<float>(mini64 + int64_t(a)) a=192", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini64 + int64_t(a)) a=192", 0.500000059604644775391L);
+insert("u01<double>(mini64 + int64_t(a)) a=192", 0.500000000000000000000L);
+insert("uneg11<double>(mini64 + int64_t(a)) a=192", -1.00000000000000000000L);
+insert("u01fixedpt<double>(mini64 + int64_t(a)) a=192", 0.500000000000000111022L);
+insert("u01<long double>(mini64 + int64_t(a)) a=192", 0.500000000000000010408L);
+insert("uneg11<long double>(mini64 + int64_t(a)) a=192", -0.999999999999999979129L);
+insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=192", 0.500000000000000010463L);
+insert("u01<float>(maxu32 - uint32_t(a)) a=192", 0.999999940395355224609L);
+insert("uneg11<float>(maxu32 - uint32_t(a)) a=192", -8.96397978067398071289e-08L);
+insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=192", 0.999999940395355224609L);
+insert("u01<double>(maxu32 - uint32_t(a)) a=192", 0.999999955180101096630L);
+insert("uneg11<double>(maxu32 - uint32_t(a)) a=192", -8.96397978067398071289e-08L);
+insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=192", 0.999999955180101096630L);
+insert("u01<long double>(maxu32 - uint32_t(a)) a=192", 0.999999955180101096630L);
+insert("uneg11<long double>(maxu32 - uint32_t(a)) a=192", -8.96397978067398071289e-08L);
+insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=192", 0.999999955180101096630L);
+insert("u01<float>(maxu64 - uint64_t(a)) a=192", 1.00000000000000000000L);
+insert("uneg11<float>(maxu64 - uint64_t(a)) a=192", -2.08708918203459603546e-17L);
+insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=192", 0.999999940395355224609L);
+insert("u01<double>(maxu64 - uint64_t(a)) a=192", 1.00000000000000000000L);
+insert("uneg11<double>(maxu64 - uint64_t(a)) a=192", -2.08708918203459603546e-17L);
+insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=192", 0.999999999999999888978L);
+insert("u01<long double>(maxu64 - uint64_t(a)) a=192", 0.999999999999999989592L);
+insert("uneg11<long double>(maxu64 - uint64_t(a)) a=192", -2.08708918203459603546e-17L);
+insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=192", 0.999999999999999989537L);
+insert("u01<float>(maxi32 - int32_t(a)) a=192", 0.499999940395355224609L);
+insert("uneg11<float>(maxi32 - int32_t(a)) a=192", 0.999999880790710449219L);
+insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=192", 0.499999940395355224609L);
+insert("u01<double>(maxi32 - int32_t(a)) a=192", 0.499999955180101096630L);
+insert("uneg11<double>(maxi32 - int32_t(a)) a=192", 0.999999910360202193260L);
+insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=192", 0.499999955180101096630L);
+insert("u01<long double>(maxi32 - int32_t(a)) a=192", 0.499999955180101096630L);
+insert("uneg11<long double>(maxi32 - int32_t(a)) a=192", 0.999999910360202193260L);
+insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=192", 0.499999955180101096630L);
+insert("u01<float>(maxi64 - int64_t(a)) a=192", 0.500000000000000000000L);
+insert("uneg11<float>(maxi64 - int64_t(a)) a=192", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=192", 0.499999940395355224609L);
+insert("u01<double>(maxi64 - int64_t(a)) a=192", 0.500000000000000000000L);
+insert("uneg11<double>(maxi64 - int64_t(a)) a=192", 1.00000000000000000000L);
+insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=192", 0.499999999999999888978L);
+insert("u01<long double>(maxi64 - int64_t(a)) a=192", 0.499999999999999989565L);
+insert("uneg11<long double>(maxi64 - int64_t(a)) a=192", 0.999999999999999979129L);
+insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=192", 0.499999999999999989537L);
+insert("u01<float>(minu32 + uint32_t(a)) a=193", 4.50527295470237731934e-08L);
+insert("uneg11<float>(minu32 + uint32_t(a)) a=193", 9.01054590940475463867e-08L);
+insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=193", 5.96046447753906250000e-08L);
+insert("u01<double>(minu32 + uint32_t(a)) a=193", 4.50527295470237731934e-08L);
+insert("uneg11<double>(minu32 + uint32_t(a)) a=193", 9.01054590940475463867e-08L);
+insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=193", 4.50527295470237731934e-08L);
+insert("u01<long double>(minu32 + uint32_t(a)) a=193", 4.50527295470237731934e-08L);
+insert("uneg11<long double>(minu32 + uint32_t(a)) a=193", 9.01054590940475463867e-08L);
+insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=193", 4.50527295470237731934e-08L);
+insert("u01<float>(minu64 + uint64_t(a)) a=193", 1.04896560187972553990e-17L);
+insert("uneg11<float>(minu64 + uint64_t(a)) a=193", 2.09793120375945107980e-17L);
+insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=193", 5.96046447753906250000e-08L);
+insert("u01<double>(minu64 + uint64_t(a)) a=193", 1.04896560187972553990e-17L);
+insert("uneg11<double>(minu64 + uint64_t(a)) a=193", 2.09793120375945107980e-17L);
+insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=193", 1.11022302462515654042e-16L);
+insert("u01<long double>(minu64 + uint64_t(a)) a=193", 1.04896560187972553990e-17L);
+insert("uneg11<long double>(minu64 + uint64_t(a)) a=193", 2.09793120375945107980e-17L);
+insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=193", 1.04625509644851177882e-17L);
+insert("u01<float>(mini32 + int32_t(a)) a=193", 0.500000059604644775391L);
+insert("uneg11<float>(mini32 + int32_t(a)) a=193", -0.999999880790710449219L);
+insert("u01fixedpt<float>(mini32 + int32_t(a)) a=193", 0.500000059604644775391L);
+insert("u01<double>(mini32 + int32_t(a)) a=193", 0.500000045052729547024L);
+insert("uneg11<double>(mini32 + int32_t(a)) a=193", -0.999999909894540905952L);
+insert("u01fixedpt<double>(mini32 + int32_t(a)) a=193", 0.500000045052729547024L);
+insert("u01<long double>(mini32 + int32_t(a)) a=193", 0.500000045052729547024L);
+insert("uneg11<long double>(mini32 + int32_t(a)) a=193", -0.999999909894540905952L);
+insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=193", 0.500000045052729547024L);
+insert("u01<float>(mini64 + int64_t(a)) a=193", 0.500000000000000000000L);
+insert("uneg11<float>(mini64 + int64_t(a)) a=193", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini64 + int64_t(a)) a=193", 0.500000059604644775391L);
+insert("u01<double>(mini64 + int64_t(a)) a=193", 0.500000000000000000000L);
+insert("uneg11<double>(mini64 + int64_t(a)) a=193", -1.00000000000000000000L);
+insert("u01fixedpt<double>(mini64 + int64_t(a)) a=193", 0.500000000000000111022L);
+insert("u01<long double>(mini64 + int64_t(a)) a=193", 0.500000000000000010517L);
+insert("uneg11<long double>(mini64 + int64_t(a)) a=193", -0.999999999999999979021L);
+insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=193", 0.500000000000000010463L);
+insert("u01<float>(maxu32 - uint32_t(a)) a=193", 0.999999940395355224609L);
+insert("uneg11<float>(maxu32 - uint32_t(a)) a=193", -9.01054590940475463867e-08L);
+insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=193", 0.999999940395355224609L);
+insert("u01<double>(maxu32 - uint32_t(a)) a=193", 0.999999954947270452976L);
+insert("uneg11<double>(maxu32 - uint32_t(a)) a=193", -9.01054590940475463867e-08L);
+insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=193", 0.999999954947270452976L);
+insert("u01<long double>(maxu32 - uint32_t(a)) a=193", 0.999999954947270452976L);
+insert("uneg11<long double>(maxu32 - uint32_t(a)) a=193", -9.01054590940475463867e-08L);
+insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=193", 0.999999954947270452976L);
+insert("u01<float>(maxu64 - uint64_t(a)) a=193", 1.00000000000000000000L);
+insert("uneg11<float>(maxu64 - uint64_t(a)) a=193", -2.09793120375945107980e-17L);
+insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=193", 0.999999940395355224609L);
+insert("u01<double>(maxu64 - uint64_t(a)) a=193", 1.00000000000000000000L);
+insert("uneg11<double>(maxu64 - uint64_t(a)) a=193", -2.09793120375945107980e-17L);
+insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=193", 0.999999999999999888978L);
+insert("u01<long double>(maxu64 - uint64_t(a)) a=193", 0.999999999999999989483L);
+insert("uneg11<long double>(maxu64 - uint64_t(a)) a=193", -2.09793120375945107980e-17L);
+insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=193", 0.999999999999999989537L);
+insert("u01<float>(maxi32 - int32_t(a)) a=193", 0.499999940395355224609L);
+insert("uneg11<float>(maxi32 - int32_t(a)) a=193", 0.999999880790710449219L);
+insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=193", 0.499999940395355224609L);
+insert("u01<double>(maxi32 - int32_t(a)) a=193", 0.499999954947270452976L);
+insert("uneg11<double>(maxi32 - int32_t(a)) a=193", 0.999999909894540905952L);
+insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=193", 0.499999954947270452976L);
+insert("u01<long double>(maxi32 - int32_t(a)) a=193", 0.499999954947270452976L);
+insert("uneg11<long double>(maxi32 - int32_t(a)) a=193", 0.999999909894540905952L);
+insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=193", 0.499999954947270452976L);
+insert("u01<float>(maxi64 - int64_t(a)) a=193", 0.500000000000000000000L);
+insert("uneg11<float>(maxi64 - int64_t(a)) a=193", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=193", 0.499999940395355224609L);
+insert("u01<double>(maxi64 - int64_t(a)) a=193", 0.500000000000000000000L);
+insert("uneg11<double>(maxi64 - int64_t(a)) a=193", 1.00000000000000000000L);
+insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=193", 0.499999999999999888978L);
+insert("u01<long double>(maxi64 - int64_t(a)) a=193", 0.499999999999999989510L);
+insert("uneg11<long double>(maxi64 - int64_t(a)) a=193", 0.999999999999999979021L);
+insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=193", 0.499999999999999989537L);
+insert("u01<float>(minu32 + uint32_t(a)) a=255", 5.94882294535636901855e-08L);
+insert("uneg11<float>(minu32 + uint32_t(a)) a=255", 1.18976458907127380371e-07L);
+insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=255", 5.96046447753906250000e-08L);
+insert("u01<double>(minu32 + uint32_t(a)) a=255", 5.94882294535636901855e-08L);
+insert("uneg11<double>(minu32 + uint32_t(a)) a=255", 1.18976458907127380371e-07L);
+insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=255", 5.94882294535636901855e-08L);
+insert("u01<long double>(minu32 + uint32_t(a)) a=255", 5.94882294535636901855e-08L);
+insert("uneg11<long double>(minu32 + uint32_t(a)) a=255", 1.18976458907127380371e-07L);
+insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=255", 5.94882294535636901855e-08L);
+insert("u01<float>(minu64 + uint64_t(a)) a=255", 1.38506827535023191444e-17L);
+insert("uneg11<float>(minu64 + uint64_t(a)) a=255", 2.77013655070046382889e-17L);
+insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=255", 5.96046447753906250000e-08L);
+insert("u01<double>(minu64 + uint64_t(a)) a=255", 1.38506827535023191444e-17L);
+insert("uneg11<double>(minu64 + uint64_t(a)) a=255", 2.77013655070046382889e-17L);
+insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=255", 1.11022302462515654042e-16L);
+insert("u01<long double>(minu64 + uint64_t(a)) a=255", 1.38506827535023191444e-17L);
+insert("uneg11<long double>(minu64 + uint64_t(a)) a=255", 2.77013655070046382889e-17L);
+insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=255", 1.38235776991901815336e-17L);
+insert("u01<float>(mini32 + int32_t(a)) a=255", 0.500000059604644775391L);
+insert("uneg11<float>(mini32 + int32_t(a)) a=255", -0.999999880790710449219L);
+insert("u01fixedpt<float>(mini32 + int32_t(a)) a=255", 0.500000059604644775391L);
+insert("u01<double>(mini32 + int32_t(a)) a=255", 0.500000059488229453564L);
+insert("uneg11<double>(mini32 + int32_t(a)) a=255", -0.999999881023541092873L);
+insert("u01fixedpt<double>(mini32 + int32_t(a)) a=255", 0.500000059488229453564L);
+insert("u01<long double>(mini32 + int32_t(a)) a=255", 0.500000059488229453564L);
+insert("uneg11<long double>(mini32 + int32_t(a)) a=255", -0.999999881023541092873L);
+insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=255", 0.500000059488229453564L);
+insert("u01<float>(mini64 + int64_t(a)) a=255", 0.500000000000000000000L);
+insert("uneg11<float>(mini64 + int64_t(a)) a=255", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini64 + int64_t(a)) a=255", 0.500000059604644775391L);
+insert("u01<double>(mini64 + int64_t(a)) a=255", 0.500000000000000000000L);
+insert("uneg11<double>(mini64 + int64_t(a)) a=255", -1.00000000000000000000L);
+insert("u01fixedpt<double>(mini64 + int64_t(a)) a=255", 0.500000000000000111022L);
+insert("u01<long double>(mini64 + int64_t(a)) a=255", 0.500000000000000013878L);
+insert("uneg11<long double>(mini64 + int64_t(a)) a=255", -0.999999999999999972299L);
+insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=255", 0.500000000000000013824L);
+insert("u01<float>(maxu32 - uint32_t(a)) a=255", 0.999999940395355224609L);
+insert("uneg11<float>(maxu32 - uint32_t(a)) a=255", -1.18976458907127380371e-07L);
+insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=255", 0.999999940395355224609L);
+insert("u01<double>(maxu32 - uint32_t(a)) a=255", 0.999999940511770546436L);
+insert("uneg11<double>(maxu32 - uint32_t(a)) a=255", -1.18976458907127380371e-07L);
+insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=255", 0.999999940511770546436L);
+insert("u01<long double>(maxu32 - uint32_t(a)) a=255", 0.999999940511770546436L);
+insert("uneg11<long double>(maxu32 - uint32_t(a)) a=255", -1.18976458907127380371e-07L);
+insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=255", 0.999999940511770546436L);
+insert("u01<float>(maxu64 - uint64_t(a)) a=255", 1.00000000000000000000L);
+insert("uneg11<float>(maxu64 - uint64_t(a)) a=255", -2.77013655070046382889e-17L);
+insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=255", 0.999999940395355224609L);
+insert("u01<double>(maxu64 - uint64_t(a)) a=255", 1.00000000000000000000L);
+insert("uneg11<double>(maxu64 - uint64_t(a)) a=255", -2.77013655070046382889e-17L);
+insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=255", 0.999999999999999888978L);
+insert("u01<long double>(maxu64 - uint64_t(a)) a=255", 0.999999999999999986122L);
+insert("uneg11<long double>(maxu64 - uint64_t(a)) a=255", -2.77013655070046382889e-17L);
+insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=255", 0.999999999999999986176L);
+insert("u01<float>(maxi32 - int32_t(a)) a=255", 0.499999940395355224609L);
+insert("uneg11<float>(maxi32 - int32_t(a)) a=255", 0.999999880790710449219L);
+insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=255", 0.499999940395355224609L);
+insert("u01<double>(maxi32 - int32_t(a)) a=255", 0.499999940511770546436L);
+insert("uneg11<double>(maxi32 - int32_t(a)) a=255", 0.999999881023541092873L);
+insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=255", 0.499999940511770546436L);
+insert("u01<long double>(maxi32 - int32_t(a)) a=255", 0.499999940511770546436L);
+insert("uneg11<long double>(maxi32 - int32_t(a)) a=255", 0.999999881023541092873L);
+insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=255", 0.499999940511770546436L);
+insert("u01<float>(maxi64 - int64_t(a)) a=255", 0.500000000000000000000L);
+insert("uneg11<float>(maxi64 - int64_t(a)) a=255", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=255", 0.499999940395355224609L);
+insert("u01<double>(maxi64 - int64_t(a)) a=255", 0.500000000000000000000L);
+insert("uneg11<double>(maxi64 - int64_t(a)) a=255", 1.00000000000000000000L);
+insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=255", 0.499999999999999888978L);
+insert("u01<long double>(maxi64 - int64_t(a)) a=255", 0.499999999999999986149L);
+insert("uneg11<long double>(maxi64 - int64_t(a)) a=255", 0.999999999999999972299L);
+insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=255", 0.499999999999999986176L);
+insert("u01<float>(minu32 + uint32_t(a)) a=256", 5.97210600972175598145e-08L);
+insert("uneg11<float>(minu32 + uint32_t(a)) a=256", 1.19442120194435119629e-07L);
+insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=256", 5.96046447753906250000e-08L);
+insert("u01<double>(minu32 + uint32_t(a)) a=256", 5.97210600972175598145e-08L);
+insert("uneg11<double>(minu32 + uint32_t(a)) a=256", 1.19442120194435119629e-07L);
+insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=256", 5.97210600972175598145e-08L);
+insert("u01<long double>(minu32 + uint32_t(a)) a=256", 5.97210600972175598145e-08L);
+insert("uneg11<long double>(minu32 + uint32_t(a)) a=256", 1.19442120194435119629e-07L);
+insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=256", 5.97210600972175598145e-08L);
+insert("u01<float>(minu64 + uint64_t(a)) a=256", 1.39048928621265943661e-17L);
+insert("uneg11<float>(minu64 + uint64_t(a)) a=256", 2.78097857242531887323e-17L);
+insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=256", 5.96046447753906250000e-08L);
+insert("u01<double>(minu64 + uint64_t(a)) a=256", 1.39048928621265943661e-17L);
+insert("uneg11<double>(minu64 + uint64_t(a)) a=256", 2.78097857242531887323e-17L);
+insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=256", 1.11022302462515654042e-16L);
+insert("u01<long double>(minu64 + uint64_t(a)) a=256", 1.39048928621265943661e-17L);
+insert("uneg11<long double>(minu64 + uint64_t(a)) a=256", 2.78097857242531887323e-17L);
+insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=256", 1.39319979164387319770e-17L);
+insert("u01<float>(mini32 + int32_t(a)) a=256", 0.500000059604644775391L);
+insert("uneg11<float>(mini32 + int32_t(a)) a=256", -0.999999880790710449219L);
+insert("u01fixedpt<float>(mini32 + int32_t(a)) a=256", 0.500000059604644775391L);
+insert("u01<double>(mini32 + int32_t(a)) a=256", 0.500000059721060097218L);
+insert("uneg11<double>(mini32 + int32_t(a)) a=256", -0.999999880557879805565L);
+insert("u01fixedpt<double>(mini32 + int32_t(a)) a=256", 0.500000059721060097218L);
+insert("u01<long double>(mini32 + int32_t(a)) a=256", 0.500000059721060097218L);
+insert("uneg11<long double>(mini32 + int32_t(a)) a=256", -0.999999880557879805565L);
+insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=256", 0.500000059721060097218L);
+insert("u01<float>(mini64 + int64_t(a)) a=256", 0.500000000000000000000L);
+insert("uneg11<float>(mini64 + int64_t(a)) a=256", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini64 + int64_t(a)) a=256", 0.500000059604644775391L);
+insert("u01<double>(mini64 + int64_t(a)) a=256", 0.500000000000000000000L);
+insert("uneg11<double>(mini64 + int64_t(a)) a=256", -1.00000000000000000000L);
+insert("u01fixedpt<double>(mini64 + int64_t(a)) a=256", 0.500000000000000111022L);
+insert("u01<long double>(mini64 + int64_t(a)) a=256", 0.500000000000000013878L);
+insert("uneg11<long double>(mini64 + int64_t(a)) a=256", -0.999999999999999972190L);
+insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=256", 0.500000000000000013932L);
+insert("u01<float>(maxu32 - uint32_t(a)) a=256", 0.999999940395355224609L);
+insert("uneg11<float>(maxu32 - uint32_t(a)) a=256", -1.19442120194435119629e-07L);
+insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=256", 0.999999940395355224609L);
+insert("u01<double>(maxu32 - uint32_t(a)) a=256", 0.999999940278939902782L);
+insert("uneg11<double>(maxu32 - uint32_t(a)) a=256", -1.19442120194435119629e-07L);
+insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=256", 0.999999940278939902782L);
+insert("u01<long double>(maxu32 - uint32_t(a)) a=256", 0.999999940278939902782L);
+insert("uneg11<long double>(maxu32 - uint32_t(a)) a=256", -1.19442120194435119629e-07L);
+insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=256", 0.999999940278939902782L);
+insert("u01<float>(maxu64 - uint64_t(a)) a=256", 1.00000000000000000000L);
+insert("uneg11<float>(maxu64 - uint64_t(a)) a=256", -2.78097857242531887323e-17L);
+insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=256", 0.999999940395355224609L);
+insert("u01<double>(maxu64 - uint64_t(a)) a=256", 1.00000000000000000000L);
+insert("uneg11<double>(maxu64 - uint64_t(a)) a=256", -2.78097857242531887323e-17L);
+insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=256", 0.999999999999999888978L);
+insert("u01<long double>(maxu64 - uint64_t(a)) a=256", 0.999999999999999986122L);
+insert("uneg11<long double>(maxu64 - uint64_t(a)) a=256", -2.78097857242531887323e-17L);
+insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=256", 0.999999999999999986068L);
+insert("u01<float>(maxi32 - int32_t(a)) a=256", 0.499999940395355224609L);
+insert("uneg11<float>(maxi32 - int32_t(a)) a=256", 0.999999880790710449219L);
+insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=256", 0.499999940395355224609L);
+insert("u01<double>(maxi32 - int32_t(a)) a=256", 0.499999940278939902782L);
+insert("uneg11<double>(maxi32 - int32_t(a)) a=256", 0.999999880557879805565L);
+insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=256", 0.499999940278939902782L);
+insert("u01<long double>(maxi32 - int32_t(a)) a=256", 0.499999940278939902782L);
+insert("uneg11<long double>(maxi32 - int32_t(a)) a=256", 0.999999880557879805565L);
+insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=256", 0.499999940278939902782L);
+insert("u01<float>(maxi64 - int64_t(a)) a=256", 0.500000000000000000000L);
+insert("uneg11<float>(maxi64 - int64_t(a)) a=256", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=256", 0.499999940395355224609L);
+insert("u01<double>(maxi64 - int64_t(a)) a=256", 0.500000000000000000000L);
+insert("uneg11<double>(maxi64 - int64_t(a)) a=256", 1.00000000000000000000L);
+insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=256", 0.499999999999999888978L);
+insert("u01<long double>(maxi64 - int64_t(a)) a=256", 0.499999999999999986095L);
+insert("uneg11<long double>(maxi64 - int64_t(a)) a=256", 0.999999999999999972190L);
+insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=256", 0.499999999999999986068L);
+insert("u01<float>(minu32 + uint32_t(a)) a=257", 5.99538907408714294434e-08L);
+insert("uneg11<float>(minu32 + uint32_t(a)) a=257", 1.19907781481742858887e-07L);
+insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=257", 5.96046447753906250000e-08L);
+insert("u01<double>(minu32 + uint32_t(a)) a=257", 5.99538907408714294434e-08L);
+insert("uneg11<double>(minu32 + uint32_t(a)) a=257", 1.19907781481742858887e-07L);
+insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=257", 5.99538907408714294434e-08L);
+insert("u01<long double>(minu32 + uint32_t(a)) a=257", 5.99538907408714294434e-08L);
+insert("uneg11<long double>(minu32 + uint32_t(a)) a=257", 1.19907781481742858887e-07L);
+insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=257", 5.99538907408714294434e-08L);
+insert("u01<float>(minu64 + uint64_t(a)) a=257", 1.39591029707508695878e-17L);
+insert("uneg11<float>(minu64 + uint64_t(a)) a=257", 2.79182059415017391757e-17L);
+insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=257", 5.96046447753906250000e-08L);
+insert("u01<double>(minu64 + uint64_t(a)) a=257", 1.39591029707508695878e-17L);
+insert("uneg11<double>(minu64 + uint64_t(a)) a=257", 2.79182059415017391757e-17L);
+insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=257", 1.11022302462515654042e-16L);
+insert("u01<long double>(minu64 + uint64_t(a)) a=257", 1.39591029707508695878e-17L);
+insert("uneg11<long double>(minu64 + uint64_t(a)) a=257", 2.79182059415017391757e-17L);
+insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=257", 1.39319979164387319770e-17L);
+insert("u01<float>(mini32 + int32_t(a)) a=257", 0.500000059604644775391L);
+insert("uneg11<float>(mini32 + int32_t(a)) a=257", -0.999999880790710449219L);
+insert("u01fixedpt<float>(mini32 + int32_t(a)) a=257", 0.500000059604644775391L);
+insert("u01<double>(mini32 + int32_t(a)) a=257", 0.500000059953890740871L);
+insert("uneg11<double>(mini32 + int32_t(a)) a=257", -0.999999880092218518257L);
+insert("u01fixedpt<double>(mini32 + int32_t(a)) a=257", 0.500000059953890740871L);
+insert("u01<long double>(mini32 + int32_t(a)) a=257", 0.500000059953890740871L);
+insert("uneg11<long double>(mini32 + int32_t(a)) a=257", -0.999999880092218518257L);
+insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=257", 0.500000059953890740871L);
+insert("u01<float>(mini64 + int64_t(a)) a=257", 0.500000000000000000000L);
+insert("uneg11<float>(mini64 + int64_t(a)) a=257", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini64 + int64_t(a)) a=257", 0.500000059604644775391L);
+insert("u01<double>(mini64 + int64_t(a)) a=257", 0.500000000000000000000L);
+insert("uneg11<double>(mini64 + int64_t(a)) a=257", -1.00000000000000000000L);
+insert("u01fixedpt<double>(mini64 + int64_t(a)) a=257", 0.500000000000000111022L);
+insert("u01<long double>(mini64 + int64_t(a)) a=257", 0.500000000000000013986L);
+insert("uneg11<long double>(mini64 + int64_t(a)) a=257", -0.999999999999999972082L);
+insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=257", 0.500000000000000013932L);
+insert("u01<float>(maxu32 - uint32_t(a)) a=257", 0.999999940395355224609L);
+insert("uneg11<float>(maxu32 - uint32_t(a)) a=257", -1.19907781481742858887e-07L);
+insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=257", 0.999999940395355224609L);
+insert("u01<double>(maxu32 - uint32_t(a)) a=257", 0.999999940046109259129L);
+insert("uneg11<double>(maxu32 - uint32_t(a)) a=257", -1.19907781481742858887e-07L);
+insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=257", 0.999999940046109259129L);
+insert("u01<long double>(maxu32 - uint32_t(a)) a=257", 0.999999940046109259129L);
+insert("uneg11<long double>(maxu32 - uint32_t(a)) a=257", -1.19907781481742858887e-07L);
+insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=257", 0.999999940046109259129L);
+insert("u01<float>(maxu64 - uint64_t(a)) a=257", 1.00000000000000000000L);
+insert("uneg11<float>(maxu64 - uint64_t(a)) a=257", -2.79182059415017391757e-17L);
+insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=257", 0.999999940395355224609L);
+insert("u01<double>(maxu64 - uint64_t(a)) a=257", 1.00000000000000000000L);
+insert("uneg11<double>(maxu64 - uint64_t(a)) a=257", -2.79182059415017391757e-17L);
+insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=257", 0.999999999999999888978L);
+insert("u01<long double>(maxu64 - uint64_t(a)) a=257", 0.999999999999999986014L);
+insert("uneg11<long double>(maxu64 - uint64_t(a)) a=257", -2.79182059415017391757e-17L);
+insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=257", 0.999999999999999986068L);
+insert("u01<float>(maxi32 - int32_t(a)) a=257", 0.499999940395355224609L);
+insert("uneg11<float>(maxi32 - int32_t(a)) a=257", 0.999999880790710449219L);
+insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=257", 0.499999940395355224609L);
+insert("u01<double>(maxi32 - int32_t(a)) a=257", 0.499999940046109259129L);
+insert("uneg11<double>(maxi32 - int32_t(a)) a=257", 0.999999880092218518257L);
+insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=257", 0.499999940046109259129L);
+insert("u01<long double>(maxi32 - int32_t(a)) a=257", 0.499999940046109259129L);
+insert("uneg11<long double>(maxi32 - int32_t(a)) a=257", 0.999999880092218518257L);
+insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=257", 0.499999940046109259129L);
+insert("u01<float>(maxi64 - int64_t(a)) a=257", 0.500000000000000000000L);
+insert("uneg11<float>(maxi64 - int64_t(a)) a=257", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=257", 0.499999940395355224609L);
+insert("u01<double>(maxi64 - int64_t(a)) a=257", 0.500000000000000000000L);
+insert("uneg11<double>(maxi64 - int64_t(a)) a=257", 1.00000000000000000000L);
+insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=257", 0.499999999999999888978L);
+insert("u01<long double>(maxi64 - int64_t(a)) a=257", 0.499999999999999986041L);
+insert("uneg11<long double>(maxi64 - int64_t(a)) a=257", 0.999999999999999972082L);
+insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=257", 0.499999999999999986068L);
+insert("u01<float>(minu32 + uint32_t(a)) a=319", 7.43893906474113464355e-08L);
+insert("uneg11<float>(minu32 + uint32_t(a)) a=319", 1.48778781294822692871e-07L);
+insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=319", 5.96046447753906250000e-08L);
+insert("u01<double>(minu32 + uint32_t(a)) a=319", 7.43893906474113464355e-08L);
+insert("uneg11<double>(minu32 + uint32_t(a)) a=319", 1.48778781294822692871e-07L);
+insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=319", 7.43893906474113464355e-08L);
+insert("u01<long double>(minu32 + uint32_t(a)) a=319", 7.43893906474113464355e-08L);
+insert("uneg11<long double>(minu32 + uint32_t(a)) a=319", 1.48778781294822692871e-07L);
+insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=319", 7.43893906474113464355e-08L);
+insert("u01<float>(minu64 + uint64_t(a)) a=319", 1.73201297054559333333e-17L);
+insert("uneg11<float>(minu64 + uint64_t(a)) a=319", 3.46402594109118666665e-17L);
+insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=319", 5.96046447753906250000e-08L);
+insert("u01<double>(minu64 + uint64_t(a)) a=319", 1.73201297054559333333e-17L);
+insert("uneg11<double>(minu64 + uint64_t(a)) a=319", 3.46402594109118666665e-17L);
+insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=319", 1.11022302462515654042e-16L);
+insert("u01<long double>(minu64 + uint64_t(a)) a=319", 1.73201297054559333333e-17L);
+insert("uneg11<long double>(minu64 + uint64_t(a)) a=319", 3.46402594109118666665e-17L);
+insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=319", 1.72930246511437957224e-17L);
+insert("u01<float>(mini32 + int32_t(a)) a=319", 0.500000059604644775391L);
+insert("uneg11<float>(mini32 + int32_t(a)) a=319", -0.999999880790710449219L);
+insert("u01fixedpt<float>(mini32 + int32_t(a)) a=319", 0.500000059604644775391L);
+insert("u01<double>(mini32 + int32_t(a)) a=319", 0.500000074389390647411L);
+insert("uneg11<double>(mini32 + int32_t(a)) a=319", -0.999999851221218705177L);
+insert("u01fixedpt<double>(mini32 + int32_t(a)) a=319", 0.500000074389390647411L);
+insert("u01<long double>(mini32 + int32_t(a)) a=319", 0.500000074389390647411L);
+insert("uneg11<long double>(mini32 + int32_t(a)) a=319", -0.999999851221218705177L);
+insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=319", 0.500000074389390647411L);
+insert("u01<float>(mini64 + int64_t(a)) a=319", 0.500000000000000000000L);
+insert("uneg11<float>(mini64 + int64_t(a)) a=319", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini64 + int64_t(a)) a=319", 0.500000059604644775391L);
+insert("u01<double>(mini64 + int64_t(a)) a=319", 0.500000000000000000000L);
+insert("uneg11<double>(mini64 + int64_t(a)) a=319", -1.00000000000000000000L);
+insert("u01fixedpt<double>(mini64 + int64_t(a)) a=319", 0.500000000000000111022L);
+insert("u01<long double>(mini64 + int64_t(a)) a=319", 0.500000000000000017347L);
+insert("uneg11<long double>(mini64 + int64_t(a)) a=319", -0.999999999999999965360L);
+insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=319", 0.500000000000000017293L);
+insert("u01<float>(maxu32 - uint32_t(a)) a=319", 0.999999940395355224609L);
+insert("uneg11<float>(maxu32 - uint32_t(a)) a=319", -1.48778781294822692871e-07L);
+insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=319", 0.999999940395355224609L);
+insert("u01<double>(maxu32 - uint32_t(a)) a=319", 0.999999925610609352589L);
+insert("uneg11<double>(maxu32 - uint32_t(a)) a=319", -1.48778781294822692871e-07L);
+insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=319", 0.999999925610609352589L);
+insert("u01<long double>(maxu32 - uint32_t(a)) a=319", 0.999999925610609352589L);
+insert("uneg11<long double>(maxu32 - uint32_t(a)) a=319", -1.48778781294822692871e-07L);
+insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=319", 0.999999925610609352589L);
+insert("u01<float>(maxu64 - uint64_t(a)) a=319", 1.00000000000000000000L);
+insert("uneg11<float>(maxu64 - uint64_t(a)) a=319", -3.46402594109118666665e-17L);
+insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=319", 0.999999940395355224609L);
+insert("u01<double>(maxu64 - uint64_t(a)) a=319", 1.00000000000000000000L);
+insert("uneg11<double>(maxu64 - uint64_t(a)) a=319", -3.46402594109118666665e-17L);
+insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=319", 0.999999999999999888978L);
+insert("u01<long double>(maxu64 - uint64_t(a)) a=319", 0.999999999999999982653L);
+insert("uneg11<long double>(maxu64 - uint64_t(a)) a=319", -3.46402594109118666665e-17L);
+insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=319", 0.999999999999999982707L);
+insert("u01<float>(maxi32 - int32_t(a)) a=319", 0.499999940395355224609L);
+insert("uneg11<float>(maxi32 - int32_t(a)) a=319", 0.999999880790710449219L);
+insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=319", 0.499999940395355224609L);
+insert("u01<double>(maxi32 - int32_t(a)) a=319", 0.499999925610609352589L);
+insert("uneg11<double>(maxi32 - int32_t(a)) a=319", 0.999999851221218705177L);
+insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=319", 0.499999925610609352589L);
+insert("u01<long double>(maxi32 - int32_t(a)) a=319", 0.499999925610609352589L);
+insert("uneg11<long double>(maxi32 - int32_t(a)) a=319", 0.999999851221218705177L);
+insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=319", 0.499999925610609352589L);
+insert("u01<float>(maxi64 - int64_t(a)) a=319", 0.500000000000000000000L);
+insert("uneg11<float>(maxi64 - int64_t(a)) a=319", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=319", 0.499999940395355224609L);
+insert("u01<double>(maxi64 - int64_t(a)) a=319", 0.500000000000000000000L);
+insert("uneg11<double>(maxi64 - int64_t(a)) a=319", 1.00000000000000000000L);
+insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=319", 0.499999999999999888978L);
+insert("u01<long double>(maxi64 - int64_t(a)) a=319", 0.499999999999999982680L);
+insert("uneg11<long double>(maxi64 - int64_t(a)) a=319", 0.999999999999999965360L);
+insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=319", 0.499999999999999982707L);
+insert("u01<float>(minu32 + uint32_t(a)) a=320", 7.46222212910652160645e-08L);
+insert("uneg11<float>(minu32 + uint32_t(a)) a=320", 1.49244442582130432129e-07L);
+insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=320", 5.96046447753906250000e-08L);
+insert("u01<double>(minu32 + uint32_t(a)) a=320", 7.46222212910652160645e-08L);
+insert("uneg11<double>(minu32 + uint32_t(a)) a=320", 1.49244442582130432129e-07L);
+insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=320", 7.46222212910652160645e-08L);
+insert("u01<long double>(minu32 + uint32_t(a)) a=320", 7.46222212910652160645e-08L);
+insert("uneg11<long double>(minu32 + uint32_t(a)) a=320", 1.49244442582130432129e-07L);
+insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=320", 7.46222212910652160645e-08L);
+insert("u01<float>(minu64 + uint64_t(a)) a=320", 1.73743398140802085550e-17L);
+insert("uneg11<float>(minu64 + uint64_t(a)) a=320", 3.47486796281604171099e-17L);
+insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=320", 5.96046447753906250000e-08L);
+insert("u01<double>(minu64 + uint64_t(a)) a=320", 1.73743398140802085550e-17L);
+insert("uneg11<double>(minu64 + uint64_t(a)) a=320", 3.47486796281604171099e-17L);
+insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=320", 1.11022302462515654042e-16L);
+insert("u01<long double>(minu64 + uint64_t(a)) a=320", 1.73743398140802085550e-17L);
+insert("uneg11<long double>(minu64 + uint64_t(a)) a=320", 3.47486796281604171099e-17L);
+insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=320", 1.74014448683923461658e-17L);
+insert("u01<float>(mini32 + int32_t(a)) a=320", 0.500000059604644775391L);
+insert("uneg11<float>(mini32 + int32_t(a)) a=320", -0.999999880790710449219L);
+insert("u01fixedpt<float>(mini32 + int32_t(a)) a=320", 0.500000059604644775391L);
+insert("u01<double>(mini32 + int32_t(a)) a=320", 0.500000074622221291065L);
+insert("uneg11<double>(mini32 + int32_t(a)) a=320", -0.999999850755557417870L);
+insert("u01fixedpt<double>(mini32 + int32_t(a)) a=320", 0.500000074622221291065L);
+insert("u01<long double>(mini32 + int32_t(a)) a=320", 0.500000074622221291065L);
+insert("uneg11<long double>(mini32 + int32_t(a)) a=320", -0.999999850755557417870L);
+insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=320", 0.500000074622221291065L);
+insert("u01<float>(mini64 + int64_t(a)) a=320", 0.500000000000000000000L);
+insert("uneg11<float>(mini64 + int64_t(a)) a=320", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini64 + int64_t(a)) a=320", 0.500000059604644775391L);
+insert("u01<double>(mini64 + int64_t(a)) a=320", 0.500000000000000000000L);
+insert("uneg11<double>(mini64 + int64_t(a)) a=320", -1.00000000000000000000L);
+insert("u01fixedpt<double>(mini64 + int64_t(a)) a=320", 0.500000000000000111022L);
+insert("u01<long double>(mini64 + int64_t(a)) a=320", 0.500000000000000017347L);
+insert("uneg11<long double>(mini64 + int64_t(a)) a=320", -0.999999999999999965251L);
+insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=320", 0.500000000000000017401L);
+insert("u01<float>(maxu32 - uint32_t(a)) a=320", 0.999999940395355224609L);
+insert("uneg11<float>(maxu32 - uint32_t(a)) a=320", -1.49244442582130432129e-07L);
+insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=320", 0.999999940395355224609L);
+insert("u01<double>(maxu32 - uint32_t(a)) a=320", 0.999999925377778708935L);
+insert("uneg11<double>(maxu32 - uint32_t(a)) a=320", -1.49244442582130432129e-07L);
+insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=320", 0.999999925377778708935L);
+insert("u01<long double>(maxu32 - uint32_t(a)) a=320", 0.999999925377778708935L);
+insert("uneg11<long double>(maxu32 - uint32_t(a)) a=320", -1.49244442582130432129e-07L);
+insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=320", 0.999999925377778708935L);
+insert("u01<float>(maxu64 - uint64_t(a)) a=320", 1.00000000000000000000L);
+insert("uneg11<float>(maxu64 - uint64_t(a)) a=320", -3.47486796281604171099e-17L);
+insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=320", 0.999999940395355224609L);
+insert("u01<double>(maxu64 - uint64_t(a)) a=320", 1.00000000000000000000L);
+insert("uneg11<double>(maxu64 - uint64_t(a)) a=320", -3.47486796281604171099e-17L);
+insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=320", 0.999999999999999888978L);
+insert("u01<long double>(maxu64 - uint64_t(a)) a=320", 0.999999999999999982653L);
+insert("uneg11<long double>(maxu64 - uint64_t(a)) a=320", -3.47486796281604171099e-17L);
+insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=320", 0.999999999999999982599L);
+insert("u01<float>(maxi32 - int32_t(a)) a=320", 0.499999910593032836914L);
+insert("uneg11<float>(maxi32 - int32_t(a)) a=320", 0.999999821186065673828L);
+insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=320", 0.499999940395355224609L);
+insert("u01<double>(maxi32 - int32_t(a)) a=320", 0.499999925377778708935L);
+insert("uneg11<double>(maxi32 - int32_t(a)) a=320", 0.999999850755557417870L);
+insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=320", 0.499999925377778708935L);
+insert("u01<long double>(maxi32 - int32_t(a)) a=320", 0.499999925377778708935L);
+insert("uneg11<long double>(maxi32 - int32_t(a)) a=320", 0.999999850755557417870L);
+insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=320", 0.499999925377778708935L);
+insert("u01<float>(maxi64 - int64_t(a)) a=320", 0.500000000000000000000L);
+insert("uneg11<float>(maxi64 - int64_t(a)) a=320", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=320", 0.499999940395355224609L);
+insert("u01<double>(maxi64 - int64_t(a)) a=320", 0.500000000000000000000L);
+insert("uneg11<double>(maxi64 - int64_t(a)) a=320", 1.00000000000000000000L);
+insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=320", 0.499999999999999888978L);
+insert("u01<long double>(maxi64 - int64_t(a)) a=320", 0.499999999999999982626L);
+insert("uneg11<long double>(maxi64 - int64_t(a)) a=320", 0.999999999999999965251L);
+insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=320", 0.499999999999999982599L);
+insert("u01<float>(minu32 + uint32_t(a)) a=321", 7.48550519347190856934e-08L);
+insert("uneg11<float>(minu32 + uint32_t(a)) a=321", 1.49710103869438171387e-07L);
+insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=321", 5.96046447753906250000e-08L);
+insert("u01<double>(minu32 + uint32_t(a)) a=321", 7.48550519347190856934e-08L);
+insert("uneg11<double>(minu32 + uint32_t(a)) a=321", 1.49710103869438171387e-07L);
+insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=321", 7.48550519347190856934e-08L);
+insert("u01<long double>(minu32 + uint32_t(a)) a=321", 7.48550519347190856934e-08L);
+insert("uneg11<long double>(minu32 + uint32_t(a)) a=321", 1.49710103869438171387e-07L);
+insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=321", 7.48550519347190856934e-08L);
+insert("u01<float>(minu64 + uint64_t(a)) a=321", 1.74285499227044837767e-17L);
+insert("uneg11<float>(minu64 + uint64_t(a)) a=321", 3.48570998454089675533e-17L);
+insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=321", 5.96046447753906250000e-08L);
+insert("u01<double>(minu64 + uint64_t(a)) a=321", 1.74285499227044837767e-17L);
+insert("uneg11<double>(minu64 + uint64_t(a)) a=321", 3.48570998454089675533e-17L);
+insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=321", 1.11022302462515654042e-16L);
+insert("u01<long double>(minu64 + uint64_t(a)) a=321", 1.74285499227044837767e-17L);
+insert("uneg11<long double>(minu64 + uint64_t(a)) a=321", 3.48570998454089675533e-17L);
+insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=321", 1.74014448683923461658e-17L);
+insert("u01<float>(mini32 + int32_t(a)) a=321", 0.500000059604644775391L);
+insert("uneg11<float>(mini32 + int32_t(a)) a=321", -0.999999821186065673828L);
+insert("u01fixedpt<float>(mini32 + int32_t(a)) a=321", 0.500000059604644775391L);
+insert("u01<double>(mini32 + int32_t(a)) a=321", 0.500000074855051934719L);
+insert("uneg11<double>(mini32 + int32_t(a)) a=321", -0.999999850289896130562L);
+insert("u01fixedpt<double>(mini32 + int32_t(a)) a=321", 0.500000074855051934719L);
+insert("u01<long double>(mini32 + int32_t(a)) a=321", 0.500000074855051934719L);
+insert("uneg11<long double>(mini32 + int32_t(a)) a=321", -0.999999850289896130562L);
+insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=321", 0.500000074855051934719L);
+insert("u01<float>(mini64 + int64_t(a)) a=321", 0.500000000000000000000L);
+insert("uneg11<float>(mini64 + int64_t(a)) a=321", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini64 + int64_t(a)) a=321", 0.500000059604644775391L);
+insert("u01<double>(mini64 + int64_t(a)) a=321", 0.500000000000000000000L);
+insert("uneg11<double>(mini64 + int64_t(a)) a=321", -1.00000000000000000000L);
+insert("u01fixedpt<double>(mini64 + int64_t(a)) a=321", 0.500000000000000111022L);
+insert("u01<long double>(mini64 + int64_t(a)) a=321", 0.500000000000000017456L);
+insert("uneg11<long double>(mini64 + int64_t(a)) a=321", -0.999999999999999965143L);
+insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=321", 0.500000000000000017401L);
+insert("u01<float>(maxu32 - uint32_t(a)) a=321", 0.999999940395355224609L);
+insert("uneg11<float>(maxu32 - uint32_t(a)) a=321", -1.49710103869438171387e-07L);
+insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=321", 0.999999940395355224609L);
+insert("u01<double>(maxu32 - uint32_t(a)) a=321", 0.999999925144948065281L);
+insert("uneg11<double>(maxu32 - uint32_t(a)) a=321", -1.49710103869438171387e-07L);
+insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=321", 0.999999925144948065281L);
+insert("u01<long double>(maxu32 - uint32_t(a)) a=321", 0.999999925144948065281L);
+insert("uneg11<long double>(maxu32 - uint32_t(a)) a=321", -1.49710103869438171387e-07L);
+insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=321", 0.999999925144948065281L);
+insert("u01<float>(maxu64 - uint64_t(a)) a=321", 1.00000000000000000000L);
+insert("uneg11<float>(maxu64 - uint64_t(a)) a=321", -3.48570998454089675533e-17L);
+insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=321", 0.999999940395355224609L);
+insert("u01<double>(maxu64 - uint64_t(a)) a=321", 1.00000000000000000000L);
+insert("uneg11<double>(maxu64 - uint64_t(a)) a=321", -3.48570998454089675533e-17L);
+insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=321", 0.999999999999999888978L);
+insert("u01<long double>(maxu64 - uint64_t(a)) a=321", 0.999999999999999982544L);
+insert("uneg11<long double>(maxu64 - uint64_t(a)) a=321", -3.48570998454089675533e-17L);
+insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=321", 0.999999999999999982599L);
+insert("u01<float>(maxi32 - int32_t(a)) a=321", 0.499999910593032836914L);
+insert("uneg11<float>(maxi32 - int32_t(a)) a=321", 0.999999821186065673828L);
+insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=321", 0.499999940395355224609L);
+insert("u01<double>(maxi32 - int32_t(a)) a=321", 0.499999925144948065281L);
+insert("uneg11<double>(maxi32 - int32_t(a)) a=321", 0.999999850289896130562L);
+insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=321", 0.499999925144948065281L);
+insert("u01<long double>(maxi32 - int32_t(a)) a=321", 0.499999925144948065281L);
+insert("uneg11<long double>(maxi32 - int32_t(a)) a=321", 0.999999850289896130562L);
+insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=321", 0.499999925144948065281L);
+insert("u01<float>(maxi64 - int64_t(a)) a=321", 0.500000000000000000000L);
+insert("uneg11<float>(maxi64 - int64_t(a)) a=321", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=321", 0.499999940395355224609L);
+insert("u01<double>(maxi64 - int64_t(a)) a=321", 0.500000000000000000000L);
+insert("uneg11<double>(maxi64 - int64_t(a)) a=321", 1.00000000000000000000L);
+insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=321", 0.499999999999999888978L);
+insert("u01<long double>(maxi64 - int64_t(a)) a=321", 0.499999999999999982571L);
+insert("uneg11<long double>(maxi64 - int64_t(a)) a=321", 0.999999999999999965143L);
+insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=321", 0.499999999999999982599L);
+insert("u01<float>(minu32 + uint32_t(a)) a=382", 8.90577211976051330566e-08L);
+insert("uneg11<float>(minu32 + uint32_t(a)) a=382", 1.78115442395210266113e-07L);
+insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=382", 5.96046447753906250000e-08L);
+insert("u01<double>(minu32 + uint32_t(a)) a=382", 8.90577211976051330566e-08L);
+insert("uneg11<double>(minu32 + uint32_t(a)) a=382", 1.78115442395210266113e-07L);
+insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=382", 8.90577211976051330566e-08L);
+insert("u01<long double>(minu32 + uint32_t(a)) a=382", 8.90577211976051330566e-08L);
+insert("uneg11<long double>(minu32 + uint32_t(a)) a=382", 1.78115442395210266113e-07L);
+insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=382", 8.90577211976051330566e-08L);
+insert("u01<float>(minu64 + uint64_t(a)) a=382", 2.07353665487852723004e-17L);
+insert("uneg11<float>(minu64 + uint64_t(a)) a=382", 4.14707330975705446008e-17L);
+insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=382", 5.96046447753906250000e-08L);
+insert("u01<double>(minu64 + uint64_t(a)) a=382", 2.07353665487852723004e-17L);
+insert("uneg11<double>(minu64 + uint64_t(a)) a=382", 4.14707330975705446008e-17L);
+insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=382", 1.11022302462515654042e-16L);
+insert("u01<long double>(minu64 + uint64_t(a)) a=382", 2.07353665487852723004e-17L);
+insert("uneg11<long double>(minu64 + uint64_t(a)) a=382", 4.14707330975705446008e-17L);
+insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=382", 2.07624716030974099112e-17L);
+insert("u01<float>(mini32 + int32_t(a)) a=382", 0.500000059604644775391L);
+insert("uneg11<float>(mini32 + int32_t(a)) a=382", -0.999999821186065673828L);
+insert("u01fixedpt<float>(mini32 + int32_t(a)) a=382", 0.500000059604644775391L);
+insert("u01<double>(mini32 + int32_t(a)) a=382", 0.500000089057721197605L);
+insert("uneg11<double>(mini32 + int32_t(a)) a=382", -0.999999821884557604790L);
+insert("u01fixedpt<double>(mini32 + int32_t(a)) a=382", 0.500000089057721197605L);
+insert("u01<long double>(mini32 + int32_t(a)) a=382", 0.500000089057721197605L);
+insert("uneg11<long double>(mini32 + int32_t(a)) a=382", -0.999999821884557604790L);
+insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=382", 0.500000089057721197605L);
+insert("u01<float>(mini64 + int64_t(a)) a=382", 0.500000000000000000000L);
+insert("uneg11<float>(mini64 + int64_t(a)) a=382", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini64 + int64_t(a)) a=382", 0.500000059604644775391L);
+insert("u01<double>(mini64 + int64_t(a)) a=382", 0.500000000000000000000L);
+insert("uneg11<double>(mini64 + int64_t(a)) a=382", -1.00000000000000000000L);
+insert("u01fixedpt<double>(mini64 + int64_t(a)) a=382", 0.500000000000000111022L);
+insert("u01<long double>(mini64 + int64_t(a)) a=382", 0.500000000000000020708L);
+insert("uneg11<long double>(mini64 + int64_t(a)) a=382", -0.999999999999999958529L);
+insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=382", 0.500000000000000020762L);
+insert("u01<float>(maxu32 - uint32_t(a)) a=382", 0.999999940395355224609L);
+insert("uneg11<float>(maxu32 - uint32_t(a)) a=382", -1.78115442395210266113e-07L);
+insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=382", 0.999999940395355224609L);
+insert("u01<double>(maxu32 - uint32_t(a)) a=382", 0.999999910942278802395L);
+insert("uneg11<double>(maxu32 - uint32_t(a)) a=382", -1.78115442395210266113e-07L);
+insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=382", 0.999999910942278802395L);
+insert("u01<long double>(maxu32 - uint32_t(a)) a=382", 0.999999910942278802395L);
+insert("uneg11<long double>(maxu32 - uint32_t(a)) a=382", -1.78115442395210266113e-07L);
+insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=382", 0.999999910942278802395L);
+insert("u01<float>(maxu64 - uint64_t(a)) a=382", 1.00000000000000000000L);
+insert("uneg11<float>(maxu64 - uint64_t(a)) a=382", -4.14707330975705446008e-17L);
+insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=382", 0.999999940395355224609L);
+insert("u01<double>(maxu64 - uint64_t(a)) a=382", 1.00000000000000000000L);
+insert("uneg11<double>(maxu64 - uint64_t(a)) a=382", -4.14707330975705446008e-17L);
+insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=382", 0.999999999999999888978L);
+insert("u01<long double>(maxu64 - uint64_t(a)) a=382", 0.999999999999999979292L);
+insert("uneg11<long double>(maxu64 - uint64_t(a)) a=382", -4.14707330975705446008e-17L);
+insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=382", 0.999999999999999979238L);
+insert("u01<float>(maxi32 - int32_t(a)) a=382", 0.499999910593032836914L);
+insert("uneg11<float>(maxi32 - int32_t(a)) a=382", 0.999999821186065673828L);
+insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=382", 0.499999940395355224609L);
+insert("u01<double>(maxi32 - int32_t(a)) a=382", 0.499999910942278802395L);
+insert("uneg11<double>(maxi32 - int32_t(a)) a=382", 0.999999821884557604790L);
+insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=382", 0.499999910942278802395L);
+insert("u01<long double>(maxi32 - int32_t(a)) a=382", 0.499999910942278802395L);
+insert("uneg11<long double>(maxi32 - int32_t(a)) a=382", 0.999999821884557604790L);
+insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=382", 0.499999910942278802395L);
+insert("u01<float>(maxi64 - int64_t(a)) a=382", 0.500000000000000000000L);
+insert("uneg11<float>(maxi64 - int64_t(a)) a=382", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=382", 0.499999940395355224609L);
+insert("u01<double>(maxi64 - int64_t(a)) a=382", 0.500000000000000000000L);
+insert("uneg11<double>(maxi64 - int64_t(a)) a=382", 1.00000000000000000000L);
+insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=382", 0.499999999999999888978L);
+insert("u01<long double>(maxi64 - int64_t(a)) a=382", 0.499999999999999979265L);
+insert("uneg11<long double>(maxi64 - int64_t(a)) a=382", 0.999999999999999958529L);
+insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=382", 0.499999999999999979238L);
+insert("u01<float>(minu32 + uint32_t(a)) a=383", 8.92905518412590026855e-08L);
+insert("uneg11<float>(minu32 + uint32_t(a)) a=383", 1.78581103682518005371e-07L);
+insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=383", 5.96046447753906250000e-08L);
+insert("u01<double>(minu32 + uint32_t(a)) a=383", 8.92905518412590026855e-08L);
+insert("uneg11<double>(minu32 + uint32_t(a)) a=383", 1.78581103682518005371e-07L);
+insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=383", 8.92905518412590026855e-08L);
+insert("u01<long double>(minu32 + uint32_t(a)) a=383", 8.92905518412590026855e-08L);
+insert("uneg11<long double>(minu32 + uint32_t(a)) a=383", 1.78581103682518005371e-07L);
+insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=383", 8.92905518412590026855e-08L);
+insert("u01<float>(minu64 + uint64_t(a)) a=383", 2.07895766574095475221e-17L);
+insert("uneg11<float>(minu64 + uint64_t(a)) a=383", 4.15791533148190950442e-17L);
+insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=383", 5.96046447753906250000e-08L);
+insert("u01<double>(minu64 + uint64_t(a)) a=383", 2.07895766574095475221e-17L);
+insert("uneg11<double>(minu64 + uint64_t(a)) a=383", 4.15791533148190950442e-17L);
+insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=383", 1.11022302462515654042e-16L);
+insert("u01<long double>(minu64 + uint64_t(a)) a=383", 2.07895766574095475221e-17L);
+insert("uneg11<long double>(minu64 + uint64_t(a)) a=383", 4.15791533148190950442e-17L);
+insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=383", 2.07624716030974099112e-17L);
+insert("u01<float>(mini32 + int32_t(a)) a=383", 0.500000059604644775391L);
+insert("uneg11<float>(mini32 + int32_t(a)) a=383", -0.999999821186065673828L);
+insert("u01fixedpt<float>(mini32 + int32_t(a)) a=383", 0.500000059604644775391L);
+insert("u01<double>(mini32 + int32_t(a)) a=383", 0.500000089290551841259L);
+insert("uneg11<double>(mini32 + int32_t(a)) a=383", -0.999999821418896317482L);
+insert("u01fixedpt<double>(mini32 + int32_t(a)) a=383", 0.500000089290551841259L);
+insert("u01<long double>(mini32 + int32_t(a)) a=383", 0.500000089290551841259L);
+insert("uneg11<long double>(mini32 + int32_t(a)) a=383", -0.999999821418896317482L);
+insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=383", 0.500000089290551841259L);
+insert("u01<float>(mini64 + int64_t(a)) a=383", 0.500000000000000000000L);
+insert("uneg11<float>(mini64 + int64_t(a)) a=383", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini64 + int64_t(a)) a=383", 0.500000059604644775391L);
+insert("u01<double>(mini64 + int64_t(a)) a=383", 0.500000000000000000000L);
+insert("uneg11<double>(mini64 + int64_t(a)) a=383", -1.00000000000000000000L);
+insert("u01fixedpt<double>(mini64 + int64_t(a)) a=383", 0.500000000000000111022L);
+insert("u01<long double>(mini64 + int64_t(a)) a=383", 0.500000000000000020817L);
+insert("uneg11<long double>(mini64 + int64_t(a)) a=383", -0.999999999999999958421L);
+insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=383", 0.500000000000000020762L);
+insert("u01<float>(maxu32 - uint32_t(a)) a=383", 0.999999880790710449219L);
+insert("uneg11<float>(maxu32 - uint32_t(a)) a=383", -1.78581103682518005371e-07L);
+insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=383", 0.999999940395355224609L);
+insert("u01<double>(maxu32 - uint32_t(a)) a=383", 0.999999910709448158741L);
+insert("uneg11<double>(maxu32 - uint32_t(a)) a=383", -1.78581103682518005371e-07L);
+insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=383", 0.999999910709448158741L);
+insert("u01<long double>(maxu32 - uint32_t(a)) a=383", 0.999999910709448158741L);
+insert("uneg11<long double>(maxu32 - uint32_t(a)) a=383", -1.78581103682518005371e-07L);
+insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=383", 0.999999910709448158741L);
+insert("u01<float>(maxu64 - uint64_t(a)) a=383", 1.00000000000000000000L);
+insert("uneg11<float>(maxu64 - uint64_t(a)) a=383", -4.15791533148190950442e-17L);
+insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=383", 0.999999940395355224609L);
+insert("u01<double>(maxu64 - uint64_t(a)) a=383", 1.00000000000000000000L);
+insert("uneg11<double>(maxu64 - uint64_t(a)) a=383", -4.15791533148190950442e-17L);
+insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=383", 0.999999999999999888978L);
+insert("u01<long double>(maxu64 - uint64_t(a)) a=383", 0.999999999999999979183L);
+insert("uneg11<long double>(maxu64 - uint64_t(a)) a=383", -4.15791533148190950442e-17L);
+insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=383", 0.999999999999999979238L);
+insert("u01<float>(maxi32 - int32_t(a)) a=383", 0.499999910593032836914L);
+insert("uneg11<float>(maxi32 - int32_t(a)) a=383", 0.999999821186065673828L);
+insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=383", 0.499999940395355224609L);
+insert("u01<double>(maxi32 - int32_t(a)) a=383", 0.499999910709448158741L);
+insert("uneg11<double>(maxi32 - int32_t(a)) a=383", 0.999999821418896317482L);
+insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=383", 0.499999910709448158741L);
+insert("u01<long double>(maxi32 - int32_t(a)) a=383", 0.499999910709448158741L);
+insert("uneg11<long double>(maxi32 - int32_t(a)) a=383", 0.999999821418896317482L);
+insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=383", 0.499999910709448158741L);
+insert("u01<float>(maxi64 - int64_t(a)) a=383", 0.500000000000000000000L);
+insert("uneg11<float>(maxi64 - int64_t(a)) a=383", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=383", 0.499999940395355224609L);
+insert("u01<double>(maxi64 - int64_t(a)) a=383", 0.500000000000000000000L);
+insert("uneg11<double>(maxi64 - int64_t(a)) a=383", 1.00000000000000000000L);
+insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=383", 0.499999999999999888978L);
+insert("u01<long double>(maxi64 - int64_t(a)) a=383", 0.499999999999999979210L);
+insert("uneg11<long double>(maxi64 - int64_t(a)) a=383", 0.999999999999999958421L);
+insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=383", 0.499999999999999979238L);
+insert("u01<float>(minu32 + uint32_t(a)) a=384", 8.95233824849128723145e-08L);
+insert("uneg11<float>(minu32 + uint32_t(a)) a=384", 1.79046764969825744629e-07L);
+insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=384", 5.96046447753906250000e-08L);
+insert("u01<double>(minu32 + uint32_t(a)) a=384", 8.95233824849128723145e-08L);
+insert("uneg11<double>(minu32 + uint32_t(a)) a=384", 1.79046764969825744629e-07L);
+insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=384", 8.95233824849128723145e-08L);
+insert("u01<long double>(minu32 + uint32_t(a)) a=384", 8.95233824849128723145e-08L);
+insert("uneg11<long double>(minu32 + uint32_t(a)) a=384", 1.79046764969825744629e-07L);
+insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=384", 8.95233824849128723145e-08L);
+insert("u01<float>(minu64 + uint64_t(a)) a=384", 2.08437867660338227438e-17L);
+insert("uneg11<float>(minu64 + uint64_t(a)) a=384", 4.16875735320676454876e-17L);
+insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=384", 5.96046447753906250000e-08L);
+insert("u01<double>(minu64 + uint64_t(a)) a=384", 2.08437867660338227438e-17L);
+insert("uneg11<double>(minu64 + uint64_t(a)) a=384", 4.16875735320676454876e-17L);
+insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=384", 1.11022302462515654042e-16L);
+insert("u01<long double>(minu64 + uint64_t(a)) a=384", 2.08437867660338227438e-17L);
+insert("uneg11<long double>(minu64 + uint64_t(a)) a=384", 4.16875735320676454876e-17L);
+insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=384", 2.08708918203459603546e-17L);
+insert("u01<float>(mini32 + int32_t(a)) a=384", 0.500000119209289550781L);
+insert("uneg11<float>(mini32 + int32_t(a)) a=384", -0.999999821186065673828L);
+insert("u01fixedpt<float>(mini32 + int32_t(a)) a=384", 0.500000059604644775391L);
+insert("u01<double>(mini32 + int32_t(a)) a=384", 0.500000089523382484913L);
+insert("uneg11<double>(mini32 + int32_t(a)) a=384", -0.999999820953235030174L);
+insert("u01fixedpt<double>(mini32 + int32_t(a)) a=384", 0.500000089523382484913L);
+insert("u01<long double>(mini32 + int32_t(a)) a=384", 0.500000089523382484913L);
+insert("uneg11<long double>(mini32 + int32_t(a)) a=384", -0.999999820953235030174L);
+insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=384", 0.500000089523382484913L);
+insert("u01<float>(mini64 + int64_t(a)) a=384", 0.500000000000000000000L);
+insert("uneg11<float>(mini64 + int64_t(a)) a=384", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini64 + int64_t(a)) a=384", 0.500000059604644775391L);
+insert("u01<double>(mini64 + int64_t(a)) a=384", 0.500000000000000000000L);
+insert("uneg11<double>(mini64 + int64_t(a)) a=384", -1.00000000000000000000L);
+insert("u01fixedpt<double>(mini64 + int64_t(a)) a=384", 0.500000000000000111022L);
+insert("u01<long double>(mini64 + int64_t(a)) a=384", 0.500000000000000020817L);
+insert("uneg11<long double>(mini64 + int64_t(a)) a=384", -0.999999999999999958312L);
+insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=384", 0.500000000000000020871L);
+insert("u01<float>(maxu32 - uint32_t(a)) a=384", 0.999999880790710449219L);
+insert("uneg11<float>(maxu32 - uint32_t(a)) a=384", -1.79046764969825744629e-07L);
+insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=384", 0.999999940395355224609L);
+insert("u01<double>(maxu32 - uint32_t(a)) a=384", 0.999999910476617515087L);
+insert("uneg11<double>(maxu32 - uint32_t(a)) a=384", -1.79046764969825744629e-07L);
+insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=384", 0.999999910476617515087L);
+insert("u01<long double>(maxu32 - uint32_t(a)) a=384", 0.999999910476617515087L);
+insert("uneg11<long double>(maxu32 - uint32_t(a)) a=384", -1.79046764969825744629e-07L);
+insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=384", 0.999999910476617515087L);
+insert("u01<float>(maxu64 - uint64_t(a)) a=384", 1.00000000000000000000L);
+insert("uneg11<float>(maxu64 - uint64_t(a)) a=384", -4.16875735320676454876e-17L);
+insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=384", 0.999999940395355224609L);
+insert("u01<double>(maxu64 - uint64_t(a)) a=384", 1.00000000000000000000L);
+insert("uneg11<double>(maxu64 - uint64_t(a)) a=384", -4.16875735320676454876e-17L);
+insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=384", 0.999999999999999888978L);
+insert("u01<long double>(maxu64 - uint64_t(a)) a=384", 0.999999999999999979183L);
+insert("uneg11<long double>(maxu64 - uint64_t(a)) a=384", -4.16875735320676454876e-17L);
+insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=384", 0.999999999999999979129L);
+insert("u01<float>(maxi32 - int32_t(a)) a=384", 0.499999910593032836914L);
+insert("uneg11<float>(maxi32 - int32_t(a)) a=384", 0.999999821186065673828L);
+insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=384", 0.499999940395355224609L);
+insert("u01<double>(maxi32 - int32_t(a)) a=384", 0.499999910476617515087L);
+insert("uneg11<double>(maxi32 - int32_t(a)) a=384", 0.999999820953235030174L);
+insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=384", 0.499999910476617515087L);
+insert("u01<long double>(maxi32 - int32_t(a)) a=384", 0.499999910476617515087L);
+insert("uneg11<long double>(maxi32 - int32_t(a)) a=384", 0.999999820953235030174L);
+insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=384", 0.499999910476617515087L);
+insert("u01<float>(maxi64 - int64_t(a)) a=384", 0.500000000000000000000L);
+insert("uneg11<float>(maxi64 - int64_t(a)) a=384", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=384", 0.499999940395355224609L);
+insert("u01<double>(maxi64 - int64_t(a)) a=384", 0.500000000000000000000L);
+insert("uneg11<double>(maxi64 - int64_t(a)) a=384", 1.00000000000000000000L);
+insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=384", 0.499999999999999888978L);
+insert("u01<long double>(maxi64 - int64_t(a)) a=384", 0.499999999999999979156L);
+insert("uneg11<long double>(maxi64 - int64_t(a)) a=384", 0.999999999999999958312L);
+insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=384", 0.499999999999999979129L);
+insert("u01<float>(minu32 + uint32_t(a)) a=639", 1.48895196616649627686e-07L);
+insert("uneg11<float>(minu32 + uint32_t(a)) a=639", 2.97790393233299255371e-07L);
+insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=639", 1.78813934326171875000e-07L);
+insert("u01<double>(minu32 + uint32_t(a)) a=639", 1.48895196616649627686e-07L);
+insert("uneg11<double>(minu32 + uint32_t(a)) a=639", 2.97790393233299255371e-07L);
+insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=639", 1.48895196616649627686e-07L);
+insert("u01<long double>(minu32 + uint32_t(a)) a=639", 1.48895196616649627686e-07L);
+insert("uneg11<long double>(minu32 + uint32_t(a)) a=639", 2.97790393233299255371e-07L);
+insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=639", 1.48895196616649627686e-07L);
+insert("u01<float>(minu64 + uint64_t(a)) a=639", 3.46673644652240042774e-17L);
+insert("uneg11<float>(minu64 + uint64_t(a)) a=639", 6.93347289304480085548e-17L);
+insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=639", 5.96046447753906250000e-08L);
+insert("u01<double>(minu64 + uint64_t(a)) a=639", 3.46673644652240042774e-17L);
+insert("uneg11<double>(minu64 + uint64_t(a)) a=639", 6.93347289304480085548e-17L);
+insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=639", 1.11022302462515654042e-16L);
+insert("u01<long double>(minu64 + uint64_t(a)) a=639", 3.46673644652240042774e-17L);
+insert("uneg11<long double>(minu64 + uint64_t(a)) a=639", 6.93347289304480085548e-17L);
+insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=639", 3.46402594109118666665e-17L);
+insert("u01<float>(mini32 + int32_t(a)) a=639", 0.500000119209289550781L);
+insert("uneg11<float>(mini32 + int32_t(a)) a=639", -0.999999701976776123047L);
+insert("u01fixedpt<float>(mini32 + int32_t(a)) a=639", 0.500000178813934326172L);
+insert("u01<double>(mini32 + int32_t(a)) a=639", 0.500000148895196616650L);
+insert("uneg11<double>(mini32 + int32_t(a)) a=639", -0.999999702209606766701L);
+insert("u01fixedpt<double>(mini32 + int32_t(a)) a=639", 0.500000148895196616650L);
+insert("u01<long double>(mini32 + int32_t(a)) a=639", 0.500000148895196616650L);
+insert("uneg11<long double>(mini32 + int32_t(a)) a=639", -0.999999702209606766701L);
+insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=639", 0.500000148895196616650L);
+insert("u01<float>(mini64 + int64_t(a)) a=639", 0.500000000000000000000L);
+insert("uneg11<float>(mini64 + int64_t(a)) a=639", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini64 + int64_t(a)) a=639", 0.500000059604644775391L);
+insert("u01<double>(mini64 + int64_t(a)) a=639", 0.500000000000000000000L);
+insert("uneg11<double>(mini64 + int64_t(a)) a=639", -0.999999999999999888978L);
+insert("u01fixedpt<double>(mini64 + int64_t(a)) a=639", 0.500000000000000111022L);
+insert("u01<long double>(mini64 + int64_t(a)) a=639", 0.500000000000000034694L);
+insert("uneg11<long double>(mini64 + int64_t(a)) a=639", -0.999999999999999930665L);
+insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=639", 0.500000000000000034640L);
+insert("u01<float>(maxu32 - uint32_t(a)) a=639", 0.999999880790710449219L);
+insert("uneg11<float>(maxu32 - uint32_t(a)) a=639", -2.97790393233299255371e-07L);
+insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=639", 0.999999821186065673828L);
+insert("u01<double>(maxu32 - uint32_t(a)) a=639", 0.999999851104803383350L);
+insert("uneg11<double>(maxu32 - uint32_t(a)) a=639", -2.97790393233299255371e-07L);
+insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=639", 0.999999851104803383350L);
+insert("u01<long double>(maxu32 - uint32_t(a)) a=639", 0.999999851104803383350L);
+insert("uneg11<long double>(maxu32 - uint32_t(a)) a=639", -2.97790393233299255371e-07L);
+insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=639", 0.999999851104803383350L);
+insert("u01<float>(maxu64 - uint64_t(a)) a=639", 1.00000000000000000000L);
+insert("uneg11<float>(maxu64 - uint64_t(a)) a=639", -6.93347289304480085548e-17L);
+insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=639", 0.999999940395355224609L);
+insert("u01<double>(maxu64 - uint64_t(a)) a=639", 1.00000000000000000000L);
+insert("uneg11<double>(maxu64 - uint64_t(a)) a=639", -6.93347289304480085548e-17L);
+insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=639", 0.999999999999999888978L);
+insert("u01<long double>(maxu64 - uint64_t(a)) a=639", 0.999999999999999965306L);
+insert("uneg11<long double>(maxu64 - uint64_t(a)) a=639", -6.93347289304480085548e-17L);
+insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=639", 0.999999999999999965360L);
+insert("u01<float>(maxi32 - int32_t(a)) a=639", 0.499999850988388061523L);
+insert("uneg11<float>(maxi32 - int32_t(a)) a=639", 0.999999701976776123047L);
+insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=639", 0.499999821186065673828L);
+insert("u01<double>(maxi32 - int32_t(a)) a=639", 0.499999851104803383350L);
+insert("uneg11<double>(maxi32 - int32_t(a)) a=639", 0.999999702209606766701L);
+insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=639", 0.499999851104803383350L);
+insert("u01<long double>(maxi32 - int32_t(a)) a=639", 0.499999851104803383350L);
+insert("uneg11<long double>(maxi32 - int32_t(a)) a=639", 0.999999702209606766701L);
+insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=639", 0.499999851104803383350L);
+insert("u01<float>(maxi64 - int64_t(a)) a=639", 0.500000000000000000000L);
+insert("uneg11<float>(maxi64 - int64_t(a)) a=639", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=639", 0.499999940395355224609L);
+insert("u01<double>(maxi64 - int64_t(a)) a=639", 0.499999999999999944489L);
+insert("uneg11<double>(maxi64 - int64_t(a)) a=639", 0.999999999999999888978L);
+insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=639", 0.499999999999999888978L);
+insert("u01<long double>(maxi64 - int64_t(a)) a=639", 0.499999999999999965333L);
+insert("uneg11<long double>(maxi64 - int64_t(a)) a=639", 0.999999999999999930665L);
+insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=639", 0.499999999999999965360L);
+insert("u01<float>(minu32 + uint32_t(a)) a=640", 1.49128027260303497314e-07L);
+insert("uneg11<float>(minu32 + uint32_t(a)) a=640", 2.98256054520606994629e-07L);
+insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=640", 1.78813934326171875000e-07L);
+insert("u01<double>(minu32 + uint32_t(a)) a=640", 1.49128027260303497314e-07L);
+insert("uneg11<double>(minu32 + uint32_t(a)) a=640", 2.98256054520606994629e-07L);
+insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=640", 1.49128027260303497314e-07L);
+insert("u01<long double>(minu32 + uint32_t(a)) a=640", 1.49128027260303497314e-07L);
+insert("uneg11<long double>(minu32 + uint32_t(a)) a=640", 2.98256054520606994629e-07L);
+insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=640", 1.49128027260303497314e-07L);
+insert("u01<float>(minu64 + uint64_t(a)) a=640", 3.47215745738482794991e-17L);
+insert("uneg11<float>(minu64 + uint64_t(a)) a=640", 6.94431491476965589982e-17L);
+insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=640", 5.96046447753906250000e-08L);
+insert("u01<double>(minu64 + uint64_t(a)) a=640", 3.47215745738482794991e-17L);
+insert("uneg11<double>(minu64 + uint64_t(a)) a=640", 6.94431491476965589982e-17L);
+insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=640", 1.11022302462515654042e-16L);
+insert("u01<long double>(minu64 + uint64_t(a)) a=640", 3.47215745738482794991e-17L);
+insert("uneg11<long double>(minu64 + uint64_t(a)) a=640", 6.94431491476965589982e-17L);
+insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=640", 3.47486796281604171099e-17L);
+insert("u01<float>(mini32 + int32_t(a)) a=640", 0.500000119209289550781L);
+insert("uneg11<float>(mini32 + int32_t(a)) a=640", -0.999999701976776123047L);
+insert("u01fixedpt<float>(mini32 + int32_t(a)) a=640", 0.500000178813934326172L);
+insert("u01<double>(mini32 + int32_t(a)) a=640", 0.500000149128027260303L);
+insert("uneg11<double>(mini32 + int32_t(a)) a=640", -0.999999701743945479393L);
+insert("u01fixedpt<double>(mini32 + int32_t(a)) a=640", 0.500000149128027260303L);
+insert("u01<long double>(mini32 + int32_t(a)) a=640", 0.500000149128027260303L);
+insert("uneg11<long double>(mini32 + int32_t(a)) a=640", -0.999999701743945479393L);
+insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=640", 0.500000149128027260303L);
+insert("u01<float>(mini64 + int64_t(a)) a=640", 0.500000000000000000000L);
+insert("uneg11<float>(mini64 + int64_t(a)) a=640", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini64 + int64_t(a)) a=640", 0.500000059604644775391L);
+insert("u01<double>(mini64 + int64_t(a)) a=640", 0.500000000000000000000L);
+insert("uneg11<double>(mini64 + int64_t(a)) a=640", -0.999999999999999888978L);
+insert("u01fixedpt<double>(mini64 + int64_t(a)) a=640", 0.500000000000000111022L);
+insert("u01<long double>(mini64 + int64_t(a)) a=640", 0.500000000000000034694L);
+insert("uneg11<long double>(mini64 + int64_t(a)) a=640", -0.999999999999999930557L);
+insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=640", 0.500000000000000034749L);
+insert("u01<float>(maxu32 - uint32_t(a)) a=640", 0.999999821186065673828L);
+insert("uneg11<float>(maxu32 - uint32_t(a)) a=640", -2.98256054520606994629e-07L);
+insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=640", 0.999999821186065673828L);
+insert("u01<double>(maxu32 - uint32_t(a)) a=640", 0.999999850871972739697L);
+insert("uneg11<double>(maxu32 - uint32_t(a)) a=640", -2.98256054520606994629e-07L);
+insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=640", 0.999999850871972739697L);
+insert("u01<long double>(maxu32 - uint32_t(a)) a=640", 0.999999850871972739697L);
+insert("uneg11<long double>(maxu32 - uint32_t(a)) a=640", -2.98256054520606994629e-07L);
+insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=640", 0.999999850871972739697L);
+insert("u01<float>(maxu64 - uint64_t(a)) a=640", 1.00000000000000000000L);
+insert("uneg11<float>(maxu64 - uint64_t(a)) a=640", -6.94431491476965589982e-17L);
+insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=640", 0.999999940395355224609L);
+insert("u01<double>(maxu64 - uint64_t(a)) a=640", 1.00000000000000000000L);
+insert("uneg11<double>(maxu64 - uint64_t(a)) a=640", -6.94431491476965589982e-17L);
+insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=640", 0.999999999999999888978L);
+insert("u01<long double>(maxu64 - uint64_t(a)) a=640", 0.999999999999999965306L);
+insert("uneg11<long double>(maxu64 - uint64_t(a)) a=640", -6.94431491476965589982e-17L);
+insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=640", 0.999999999999999965251L);
+insert("u01<float>(maxi32 - int32_t(a)) a=640", 0.499999850988388061523L);
+insert("uneg11<float>(maxi32 - int32_t(a)) a=640", 0.999999701976776123047L);
+insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=640", 0.499999821186065673828L);
+insert("u01<double>(maxi32 - int32_t(a)) a=640", 0.499999850871972739697L);
+insert("uneg11<double>(maxi32 - int32_t(a)) a=640", 0.999999701743945479393L);
+insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=640", 0.499999850871972739697L);
+insert("u01<long double>(maxi32 - int32_t(a)) a=640", 0.499999850871972739697L);
+insert("uneg11<long double>(maxi32 - int32_t(a)) a=640", 0.999999701743945479393L);
+insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=640", 0.499999850871972739697L);
+insert("u01<float>(maxi64 - int64_t(a)) a=640", 0.500000000000000000000L);
+insert("uneg11<float>(maxi64 - int64_t(a)) a=640", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=640", 0.499999940395355224609L);
+insert("u01<double>(maxi64 - int64_t(a)) a=640", 0.499999999999999944489L);
+insert("uneg11<double>(maxi64 - int64_t(a)) a=640", 0.999999999999999888978L);
+insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=640", 0.499999999999999888978L);
+insert("u01<long double>(maxi64 - int64_t(a)) a=640", 0.499999999999999965278L);
+insert("uneg11<long double>(maxi64 - int64_t(a)) a=640", 0.999999999999999930557L);
+insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=640", 0.499999999999999965251L);
+insert("u01<float>(minu32 + uint32_t(a)) a=641", 1.49360857903957366943e-07L);
+insert("uneg11<float>(minu32 + uint32_t(a)) a=641", 2.98721715807914733887e-07L);
+insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=641", 1.78813934326171875000e-07L);
+insert("u01<double>(minu32 + uint32_t(a)) a=641", 1.49360857903957366943e-07L);
+insert("uneg11<double>(minu32 + uint32_t(a)) a=641", 2.98721715807914733887e-07L);
+insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=641", 1.49360857903957366943e-07L);
+insert("u01<long double>(minu32 + uint32_t(a)) a=641", 1.49360857903957366943e-07L);
+insert("uneg11<long double>(minu32 + uint32_t(a)) a=641", 2.98721715807914733887e-07L);
+insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=641", 1.49360857903957366943e-07L);
+insert("u01<float>(minu64 + uint64_t(a)) a=641", 3.47757846824725547208e-17L);
+insert("uneg11<float>(minu64 + uint64_t(a)) a=641", 6.95515693649451094416e-17L);
+insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=641", 5.96046447753906250000e-08L);
+insert("u01<double>(minu64 + uint64_t(a)) a=641", 3.47757846824725547208e-17L);
+insert("uneg11<double>(minu64 + uint64_t(a)) a=641", 6.95515693649451094416e-17L);
+insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=641", 1.11022302462515654042e-16L);
+insert("u01<long double>(minu64 + uint64_t(a)) a=641", 3.47757846824725547208e-17L);
+insert("uneg11<long double>(minu64 + uint64_t(a)) a=641", 6.95515693649451094416e-17L);
+insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=641", 3.47486796281604171099e-17L);
+insert("u01<float>(mini32 + int32_t(a)) a=641", 0.500000178813934326172L);
+insert("uneg11<float>(mini32 + int32_t(a)) a=641", -0.999999701976776123047L);
+insert("u01fixedpt<float>(mini32 + int32_t(a)) a=641", 0.500000178813934326172L);
+insert("u01<double>(mini32 + int32_t(a)) a=641", 0.500000149360857903957L);
+insert("uneg11<double>(mini32 + int32_t(a)) a=641", -0.999999701278284192085L);
+insert("u01fixedpt<double>(mini32 + int32_t(a)) a=641", 0.500000149360857903957L);
+insert("u01<long double>(mini32 + int32_t(a)) a=641", 0.500000149360857903957L);
+insert("uneg11<long double>(mini32 + int32_t(a)) a=641", -0.999999701278284192085L);
+insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=641", 0.500000149360857903957L);
+insert("u01<float>(mini64 + int64_t(a)) a=641", 0.500000000000000000000L);
+insert("uneg11<float>(mini64 + int64_t(a)) a=641", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini64 + int64_t(a)) a=641", 0.500000059604644775391L);
+insert("u01<double>(mini64 + int64_t(a)) a=641", 0.500000000000000000000L);
+insert("uneg11<double>(mini64 + int64_t(a)) a=641", -0.999999999999999888978L);
+insert("u01fixedpt<double>(mini64 + int64_t(a)) a=641", 0.500000000000000111022L);
+insert("u01<long double>(mini64 + int64_t(a)) a=641", 0.500000000000000034803L);
+insert("uneg11<long double>(mini64 + int64_t(a)) a=641", -0.999999999999999930448L);
+insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=641", 0.500000000000000034749L);
+insert("u01<float>(maxu32 - uint32_t(a)) a=641", 0.999999821186065673828L);
+insert("uneg11<float>(maxu32 - uint32_t(a)) a=641", -2.98721715807914733887e-07L);
+insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=641", 0.999999821186065673828L);
+insert("u01<double>(maxu32 - uint32_t(a)) a=641", 0.999999850639142096043L);
+insert("uneg11<double>(maxu32 - uint32_t(a)) a=641", -2.98721715807914733887e-07L);
+insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=641", 0.999999850639142096043L);
+insert("u01<long double>(maxu32 - uint32_t(a)) a=641", 0.999999850639142096043L);
+insert("uneg11<long double>(maxu32 - uint32_t(a)) a=641", -2.98721715807914733887e-07L);
+insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=641", 0.999999850639142096043L);
+insert("u01<float>(maxu64 - uint64_t(a)) a=641", 1.00000000000000000000L);
+insert("uneg11<float>(maxu64 - uint64_t(a)) a=641", -6.95515693649451094416e-17L);
+insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=641", 0.999999940395355224609L);
+insert("u01<double>(maxu64 - uint64_t(a)) a=641", 1.00000000000000000000L);
+insert("uneg11<double>(maxu64 - uint64_t(a)) a=641", -6.95515693649451094416e-17L);
+insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=641", 0.999999999999999888978L);
+insert("u01<long double>(maxu64 - uint64_t(a)) a=641", 0.999999999999999965197L);
+insert("uneg11<long double>(maxu64 - uint64_t(a)) a=641", -6.95515693649451094416e-17L);
+insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=641", 0.999999999999999965251L);
+insert("u01<float>(maxi32 - int32_t(a)) a=641", 0.499999850988388061523L);
+insert("uneg11<float>(maxi32 - int32_t(a)) a=641", 0.999999701976776123047L);
+insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=641", 0.499999821186065673828L);
+insert("u01<double>(maxi32 - int32_t(a)) a=641", 0.499999850639142096043L);
+insert("uneg11<double>(maxi32 - int32_t(a)) a=641", 0.999999701278284192085L);
+insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=641", 0.499999850639142096043L);
+insert("u01<long double>(maxi32 - int32_t(a)) a=641", 0.499999850639142096043L);
+insert("uneg11<long double>(maxi32 - int32_t(a)) a=641", 0.999999701278284192085L);
+insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=641", 0.499999850639142096043L);
+insert("u01<float>(maxi64 - int64_t(a)) a=641", 0.500000000000000000000L);
+insert("uneg11<float>(maxi64 - int64_t(a)) a=641", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=641", 0.499999940395355224609L);
+insert("u01<double>(maxi64 - int64_t(a)) a=641", 0.499999999999999944489L);
+insert("uneg11<double>(maxi64 - int64_t(a)) a=641", 0.999999999999999888978L);
+insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=641", 0.499999999999999888978L);
+insert("u01<long double>(maxi64 - int64_t(a)) a=641", 0.499999999999999965224L);
+insert("uneg11<long double>(maxi64 - int64_t(a)) a=641", 0.999999999999999930448L);
+insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=641", 0.499999999999999965251L);
+insert("u01<float>(minu32 + uint32_t(a)) a=1023", 2.38302163779735565186e-07L);
+insert("uneg11<float>(minu32 + uint32_t(a)) a=1023", 4.76604327559471130371e-07L);
+insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=1023", 1.78813934326171875000e-07L);
+insert("u01<double>(minu32 + uint32_t(a)) a=1023", 2.38302163779735565186e-07L);
+insert("uneg11<double>(minu32 + uint32_t(a)) a=1023", 4.76604327559471130371e-07L);
+insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=1023", 2.38302163779735565186e-07L);
+insert("u01<long double>(minu32 + uint32_t(a)) a=1023", 2.38302163779735565186e-07L);
+insert("uneg11<long double>(minu32 + uint32_t(a)) a=1023", 4.76604327559471130371e-07L);
+insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=1023", 2.38302163779735565186e-07L);
+insert("u01<float>(minu64 + uint64_t(a)) a=1023", 5.54840461769456894103e-17L);
+insert("uneg11<float>(minu64 + uint64_t(a)) a=1023", 1.10968092353891378821e-16L);
+insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=1023", 5.96046447753906250000e-08L);
+insert("u01<double>(minu64 + uint64_t(a)) a=1023", 5.54840461769456894103e-17L);
+insert("uneg11<double>(minu64 + uint64_t(a)) a=1023", 1.10968092353891378821e-16L);
+insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=1023", 1.11022302462515654042e-16L);
+insert("u01<long double>(minu64 + uint64_t(a)) a=1023", 5.54840461769456894103e-17L);
+insert("uneg11<long double>(minu64 + uint64_t(a)) a=1023", 1.10968092353891378821e-16L);
+insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=1023", 5.54569411226335517995e-17L);
+insert("u01<float>(mini32 + int32_t(a)) a=1023", 0.500000238418579101562L);
+insert("uneg11<float>(mini32 + int32_t(a)) a=1023", -0.999999523162841796875L);
+insert("u01fixedpt<float>(mini32 + int32_t(a)) a=1023", 0.500000178813934326172L);
+insert("u01<double>(mini32 + int32_t(a)) a=1023", 0.500000238302163779736L);
+insert("uneg11<double>(mini32 + int32_t(a)) a=1023", -0.999999523395672440529L);
+insert("u01fixedpt<double>(mini32 + int32_t(a)) a=1023", 0.500000238302163779736L);
+insert("u01<long double>(mini32 + int32_t(a)) a=1023", 0.500000238302163779736L);
+insert("uneg11<long double>(mini32 + int32_t(a)) a=1023", -0.999999523395672440529L);
+insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=1023", 0.500000238302163779736L);
+insert("u01<float>(mini64 + int64_t(a)) a=1023", 0.500000000000000000000L);
+insert("uneg11<float>(mini64 + int64_t(a)) a=1023", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini64 + int64_t(a)) a=1023", 0.500000059604644775391L);
+insert("u01<double>(mini64 + int64_t(a)) a=1023", 0.500000000000000000000L);
+insert("uneg11<double>(mini64 + int64_t(a)) a=1023", -0.999999999999999888978L);
+insert("u01fixedpt<double>(mini64 + int64_t(a)) a=1023", 0.500000000000000111022L);
+insert("u01<long double>(mini64 + int64_t(a)) a=1023", 0.500000000000000055511L);
+insert("uneg11<long double>(mini64 + int64_t(a)) a=1023", -0.999999999999999889032L);
+insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=1023", 0.500000000000000055457L);
+insert("u01<float>(maxu32 - uint32_t(a)) a=1023", 0.999999761581420898438L);
+insert("uneg11<float>(maxu32 - uint32_t(a)) a=1023", -4.76604327559471130371e-07L);
+insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=1023", 0.999999821186065673828L);
+insert("u01<double>(maxu32 - uint32_t(a)) a=1023", 0.999999761697836220264L);
+insert("uneg11<double>(maxu32 - uint32_t(a)) a=1023", -4.76604327559471130371e-07L);
+insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=1023", 0.999999761697836220264L);
+insert("u01<long double>(maxu32 - uint32_t(a)) a=1023", 0.999999761697836220264L);
+insert("uneg11<long double>(maxu32 - uint32_t(a)) a=1023", -4.76604327559471130371e-07L);
+insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=1023", 0.999999761697836220264L);
+insert("u01<float>(maxu64 - uint64_t(a)) a=1023", 1.00000000000000000000L);
+insert("uneg11<float>(maxu64 - uint64_t(a)) a=1023", -1.10968092353891378821e-16L);
+insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=1023", 0.999999940395355224609L);
+insert("u01<double>(maxu64 - uint64_t(a)) a=1023", 1.00000000000000000000L);
+insert("uneg11<double>(maxu64 - uint64_t(a)) a=1023", -1.10968092353891378821e-16L);
+insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=1023", 0.999999999999999888978L);
+insert("u01<long double>(maxu64 - uint64_t(a)) a=1023", 0.999999999999999944489L);
+insert("uneg11<long double>(maxu64 - uint64_t(a)) a=1023", -1.10968092353891378821e-16L);
+insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=1023", 0.999999999999999944543L);
+insert("u01<float>(maxi32 - int32_t(a)) a=1023", 0.499999761581420898438L);
+insert("uneg11<float>(maxi32 - int32_t(a)) a=1023", 0.999999523162841796875L);
+insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=1023", 0.499999821186065673828L);
+insert("u01<double>(maxi32 - int32_t(a)) a=1023", 0.499999761697836220264L);
+insert("uneg11<double>(maxi32 - int32_t(a)) a=1023", 0.999999523395672440529L);
+insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=1023", 0.499999761697836220264L);
+insert("u01<long double>(maxi32 - int32_t(a)) a=1023", 0.499999761697836220264L);
+insert("uneg11<long double>(maxi32 - int32_t(a)) a=1023", 0.999999523395672440529L);
+insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=1023", 0.499999761697836220264L);
+insert("u01<float>(maxi64 - int64_t(a)) a=1023", 0.500000000000000000000L);
+insert("uneg11<float>(maxi64 - int64_t(a)) a=1023", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=1023", 0.499999940395355224609L);
+insert("u01<double>(maxi64 - int64_t(a)) a=1023", 0.499999999999999944489L);
+insert("uneg11<double>(maxi64 - int64_t(a)) a=1023", 0.999999999999999888978L);
+insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=1023", 0.499999999999999888978L);
+insert("u01<long double>(maxi64 - int64_t(a)) a=1023", 0.499999999999999944516L);
+insert("uneg11<long double>(maxi64 - int64_t(a)) a=1023", 0.999999999999999889032L);
+insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=1023", 0.499999999999999944543L);
+insert("u01<float>(minu32 + uint32_t(a)) a=1024", 2.38534994423389434814e-07L);
+insert("uneg11<float>(minu32 + uint32_t(a)) a=1024", 4.77069988846778869629e-07L);
+insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=1024", 2.98023223876953125000e-07L);
+insert("u01<double>(minu32 + uint32_t(a)) a=1024", 2.38534994423389434814e-07L);
+insert("uneg11<double>(minu32 + uint32_t(a)) a=1024", 4.77069988846778869629e-07L);
+insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=1024", 2.38534994423389434814e-07L);
+insert("u01<long double>(minu32 + uint32_t(a)) a=1024", 2.38534994423389434814e-07L);
+insert("uneg11<long double>(minu32 + uint32_t(a)) a=1024", 4.77069988846778869629e-07L);
+insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=1024", 2.38534994423389434814e-07L);
+insert("u01<float>(minu64 + uint64_t(a)) a=1024", 5.55382562855699646320e-17L);
+insert("uneg11<float>(minu64 + uint64_t(a)) a=1024", 1.11076512571139929264e-16L);
+insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=1024", 5.96046447753906250000e-08L);
+insert("u01<double>(minu64 + uint64_t(a)) a=1024", 5.55382562855699646320e-17L);
+insert("uneg11<double>(minu64 + uint64_t(a)) a=1024", 1.11076512571139929264e-16L);
+insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=1024", 1.11022302462515654042e-16L);
+insert("u01<long double>(minu64 + uint64_t(a)) a=1024", 5.55382562855699646320e-17L);
+insert("uneg11<long double>(minu64 + uint64_t(a)) a=1024", 1.11076512571139929264e-16L);
+insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=1024", 5.55653613398821022429e-17L);
+insert("u01<float>(mini32 + int32_t(a)) a=1024", 0.500000238418579101562L);
+insert("uneg11<float>(mini32 + int32_t(a)) a=1024", -0.999999523162841796875L);
+insert("u01fixedpt<float>(mini32 + int32_t(a)) a=1024", 0.500000298023223876953L);
+insert("u01<double>(mini32 + int32_t(a)) a=1024", 0.500000238534994423389L);
+insert("uneg11<double>(mini32 + int32_t(a)) a=1024", -0.999999522930011153221L);
+insert("u01fixedpt<double>(mini32 + int32_t(a)) a=1024", 0.500000238534994423389L);
+insert("u01<long double>(mini32 + int32_t(a)) a=1024", 0.500000238534994423389L);
+insert("uneg11<long double>(mini32 + int32_t(a)) a=1024", -0.999999522930011153221L);
+insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=1024", 0.500000238534994423389L);
+insert("u01<float>(mini64 + int64_t(a)) a=1024", 0.500000000000000000000L);
+insert("uneg11<float>(mini64 + int64_t(a)) a=1024", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini64 + int64_t(a)) a=1024", 0.500000059604644775391L);
+insert("u01<double>(mini64 + int64_t(a)) a=1024", 0.500000000000000000000L);
+insert("uneg11<double>(mini64 + int64_t(a)) a=1024", -0.999999999999999888978L);
+insert("u01fixedpt<double>(mini64 + int64_t(a)) a=1024", 0.500000000000000111022L);
+insert("u01<long double>(mini64 + int64_t(a)) a=1024", 0.500000000000000055511L);
+insert("uneg11<long double>(mini64 + int64_t(a)) a=1024", -0.999999999999999888923L);
+insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=1024", 0.500000000000000055565L);
+insert("u01<float>(maxu32 - uint32_t(a)) a=1024", 0.999999761581420898438L);
+insert("uneg11<float>(maxu32 - uint32_t(a)) a=1024", -4.77069988846778869629e-07L);
+insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=1024", 0.999999701976776123047L);
+insert("u01<double>(maxu32 - uint32_t(a)) a=1024", 0.999999761465005576611L);
+insert("uneg11<double>(maxu32 - uint32_t(a)) a=1024", -4.77069988846778869629e-07L);
+insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=1024", 0.999999761465005576611L);
+insert("u01<long double>(maxu32 - uint32_t(a)) a=1024", 0.999999761465005576611L);
+insert("uneg11<long double>(maxu32 - uint32_t(a)) a=1024", -4.77069988846778869629e-07L);
+insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=1024", 0.999999761465005576611L);
+insert("u01<float>(maxu64 - uint64_t(a)) a=1024", 1.00000000000000000000L);
+insert("uneg11<float>(maxu64 - uint64_t(a)) a=1024", -1.11076512571139929264e-16L);
+insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=1024", 0.999999940395355224609L);
+insert("u01<double>(maxu64 - uint64_t(a)) a=1024", 0.999999999999999888978L);
+insert("uneg11<double>(maxu64 - uint64_t(a)) a=1024", -1.11076512571139929264e-16L);
+insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=1024", 0.999999999999999888978L);
+insert("u01<long double>(maxu64 - uint64_t(a)) a=1024", 0.999999999999999944489L);
+insert("uneg11<long double>(maxu64 - uint64_t(a)) a=1024", -1.11076512571139929264e-16L);
+insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=1024", 0.999999999999999944435L);
+insert("u01<float>(maxi32 - int32_t(a)) a=1024", 0.499999761581420898438L);
+insert("uneg11<float>(maxi32 - int32_t(a)) a=1024", 0.999999523162841796875L);
+insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=1024", 0.499999701976776123047L);
+insert("u01<double>(maxi32 - int32_t(a)) a=1024", 0.499999761465005576611L);
+insert("uneg11<double>(maxi32 - int32_t(a)) a=1024", 0.999999522930011153221L);
+insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=1024", 0.499999761465005576611L);
+insert("u01<long double>(maxi32 - int32_t(a)) a=1024", 0.499999761465005576611L);
+insert("uneg11<long double>(maxi32 - int32_t(a)) a=1024", 0.999999522930011153221L);
+insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=1024", 0.499999761465005576611L);
+insert("u01<float>(maxi64 - int64_t(a)) a=1024", 0.500000000000000000000L);
+insert("uneg11<float>(maxi64 - int64_t(a)) a=1024", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=1024", 0.499999940395355224609L);
+insert("u01<double>(maxi64 - int64_t(a)) a=1024", 0.499999999999999944489L);
+insert("uneg11<double>(maxi64 - int64_t(a)) a=1024", 0.999999999999999888978L);
+insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=1024", 0.499999999999999888978L);
+insert("u01<long double>(maxi64 - int64_t(a)) a=1024", 0.499999999999999944462L);
+insert("uneg11<long double>(maxi64 - int64_t(a)) a=1024", 0.999999999999999888923L);
+insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=1024", 0.499999999999999944435L);
+insert("u01<float>(minu32 + uint32_t(a)) a=1025", 2.38767825067043304443e-07L);
+insert("uneg11<float>(minu32 + uint32_t(a)) a=1025", 4.77535650134086608887e-07L);
+insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=1025", 2.98023223876953125000e-07L);
+insert("u01<double>(minu32 + uint32_t(a)) a=1025", 2.38767825067043304443e-07L);
+insert("uneg11<double>(minu32 + uint32_t(a)) a=1025", 4.77535650134086608887e-07L);
+insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=1025", 2.38767825067043304443e-07L);
+insert("u01<long double>(minu32 + uint32_t(a)) a=1025", 2.38767825067043304443e-07L);
+insert("uneg11<long double>(minu32 + uint32_t(a)) a=1025", 4.77535650134086608887e-07L);
+insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=1025", 2.38767825067043304443e-07L);
+insert("u01<float>(minu64 + uint64_t(a)) a=1025", 5.55924663941942398537e-17L);
+insert("uneg11<float>(minu64 + uint64_t(a)) a=1025", 1.11184932788388479707e-16L);
+insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=1025", 5.96046447753906250000e-08L);
+insert("u01<double>(minu64 + uint64_t(a)) a=1025", 5.55924663941942398537e-17L);
+insert("uneg11<double>(minu64 + uint64_t(a)) a=1025", 1.11184932788388479707e-16L);
+insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=1025", 1.11022302462515654042e-16L);
+insert("u01<long double>(minu64 + uint64_t(a)) a=1025", 5.55924663941942398537e-17L);
+insert("uneg11<long double>(minu64 + uint64_t(a)) a=1025", 1.11184932788388479707e-16L);
+insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=1025", 5.55653613398821022429e-17L);
+insert("u01<float>(mini32 + int32_t(a)) a=1025", 0.500000238418579101562L);
+insert("uneg11<float>(mini32 + int32_t(a)) a=1025", -0.999999523162841796875L);
+insert("u01fixedpt<float>(mini32 + int32_t(a)) a=1025", 0.500000298023223876953L);
+insert("u01<double>(mini32 + int32_t(a)) a=1025", 0.500000238767825067043L);
+insert("uneg11<double>(mini32 + int32_t(a)) a=1025", -0.999999522464349865913L);
+insert("u01fixedpt<double>(mini32 + int32_t(a)) a=1025", 0.500000238767825067043L);
+insert("u01<long double>(mini32 + int32_t(a)) a=1025", 0.500000238767825067043L);
+insert("uneg11<long double>(mini32 + int32_t(a)) a=1025", -0.999999522464349865913L);
+insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=1025", 0.500000238767825067043L);
+insert("u01<float>(mini64 + int64_t(a)) a=1025", 0.500000000000000000000L);
+insert("uneg11<float>(mini64 + int64_t(a)) a=1025", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini64 + int64_t(a)) a=1025", 0.500000059604644775391L);
+insert("u01<double>(mini64 + int64_t(a)) a=1025", 0.500000000000000111022L);
+insert("uneg11<double>(mini64 + int64_t(a)) a=1025", -0.999999999999999888978L);
+insert("u01fixedpt<double>(mini64 + int64_t(a)) a=1025", 0.500000000000000111022L);
+insert("u01<long double>(mini64 + int64_t(a)) a=1025", 0.500000000000000055620L);
+insert("uneg11<long double>(mini64 + int64_t(a)) a=1025", -0.999999999999999888815L);
+insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=1025", 0.500000000000000055565L);
+insert("u01<float>(maxu32 - uint32_t(a)) a=1025", 0.999999761581420898438L);
+insert("uneg11<float>(maxu32 - uint32_t(a)) a=1025", -4.77535650134086608887e-07L);
+insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=1025", 0.999999701976776123047L);
+insert("u01<double>(maxu32 - uint32_t(a)) a=1025", 0.999999761232174932957L);
+insert("uneg11<double>(maxu32 - uint32_t(a)) a=1025", -4.77535650134086608887e-07L);
+insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=1025", 0.999999761232174932957L);
+insert("u01<long double>(maxu32 - uint32_t(a)) a=1025", 0.999999761232174932957L);
+insert("uneg11<long double>(maxu32 - uint32_t(a)) a=1025", -4.77535650134086608887e-07L);
+insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=1025", 0.999999761232174932957L);
+insert("u01<float>(maxu64 - uint64_t(a)) a=1025", 1.00000000000000000000L);
+insert("uneg11<float>(maxu64 - uint64_t(a)) a=1025", -1.11184932788388479707e-16L);
+insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=1025", 0.999999940395355224609L);
+insert("u01<double>(maxu64 - uint64_t(a)) a=1025", 0.999999999999999888978L);
+insert("uneg11<double>(maxu64 - uint64_t(a)) a=1025", -1.11184932788388479707e-16L);
+insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=1025", 0.999999999999999888978L);
+insert("u01<long double>(maxu64 - uint64_t(a)) a=1025", 0.999999999999999944380L);
+insert("uneg11<long double>(maxu64 - uint64_t(a)) a=1025", -1.11184932788388479707e-16L);
+insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=1025", 0.999999999999999944435L);
+insert("u01<float>(maxi32 - int32_t(a)) a=1025", 0.499999761581420898438L);
+insert("uneg11<float>(maxi32 - int32_t(a)) a=1025", 0.999999523162841796875L);
+insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=1025", 0.499999701976776123047L);
+insert("u01<double>(maxi32 - int32_t(a)) a=1025", 0.499999761232174932957L);
+insert("uneg11<double>(maxi32 - int32_t(a)) a=1025", 0.999999522464349865913L);
+insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=1025", 0.499999761232174932957L);
+insert("u01<long double>(maxi32 - int32_t(a)) a=1025", 0.499999761232174932957L);
+insert("uneg11<long double>(maxi32 - int32_t(a)) a=1025", 0.999999522464349865913L);
+insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=1025", 0.499999761232174932957L);
+insert("u01<float>(maxi64 - int64_t(a)) a=1025", 0.500000000000000000000L);
+insert("uneg11<float>(maxi64 - int64_t(a)) a=1025", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=1025", 0.499999940395355224609L);
+insert("u01<double>(maxi64 - int64_t(a)) a=1025", 0.499999999999999944489L);
+insert("uneg11<double>(maxi64 - int64_t(a)) a=1025", 0.999999999999999888978L);
+insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=1025", 0.499999999999999888978L);
+insert("u01<long double>(maxi64 - int64_t(a)) a=1025", 0.499999999999999944408L);
+insert("uneg11<long double>(maxi64 - int64_t(a)) a=1025", 0.999999999999999888815L);
+insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=1025", 0.499999999999999944435L);
+insert("u01<float>(minu32 + uint32_t(a)) a=3070", 7.14906491339206695557e-07L);
+insert("uneg11<float>(minu32 + uint32_t(a)) a=3070", 1.42981298267841339111e-06L);
+insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=3070", 6.55651092529296875000e-07L);
+insert("u01<double>(minu32 + uint32_t(a)) a=3070", 7.14906491339206695557e-07L);
+insert("uneg11<double>(minu32 + uint32_t(a)) a=3070", 1.42981298267841339111e-06L);
+insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=3070", 7.14906491339206695557e-07L);
+insert("u01<long double>(minu32 + uint32_t(a)) a=3070", 7.14906491339206695557e-07L);
+insert("uneg11<long double>(minu32 + uint32_t(a)) a=3070", 1.42981298267841339111e-06L);
+insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=3070", 7.14906491339206695557e-07L);
+insert("u01<float>(minu64 + uint64_t(a)) a=3070", 1.66452138530837068231e-16L);
+insert("uneg11<float>(minu64 + uint64_t(a)) a=3070", 3.32904277061674136462e-16L);
+insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=3070", 5.96046447753906250000e-08L);
+insert("u01<double>(minu64 + uint64_t(a)) a=3070", 1.66452138530837068231e-16L);
+insert("uneg11<double>(minu64 + uint64_t(a)) a=3070", 3.32904277061674136462e-16L);
+insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=3070", 1.11022302462515654042e-16L);
+insert("u01<long double>(minu64 + uint64_t(a)) a=3070", 1.66452138530837068231e-16L);
+insert("uneg11<long double>(minu64 + uint64_t(a)) a=3070", 3.32904277061674136462e-16L);
+insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=3070", 1.66479243585149205842e-16L);
+insert("u01<float>(mini32 + int32_t(a)) a=3070", 0.500000715255737304688L);
+insert("uneg11<float>(mini32 + int32_t(a)) a=3070", -0.999998569488525390625L);
+insert("u01fixedpt<float>(mini32 + int32_t(a)) a=3070", 0.500000655651092529297L);
+insert("u01<double>(mini32 + int32_t(a)) a=3070", 0.500000714906491339207L);
+insert("uneg11<double>(mini32 + int32_t(a)) a=3070", -0.999998570187017321587L);
+insert("u01fixedpt<double>(mini32 + int32_t(a)) a=3070", 0.500000714906491339207L);
+insert("u01<long double>(mini32 + int32_t(a)) a=3070", 0.500000714906491339207L);
+insert("uneg11<long double>(mini32 + int32_t(a)) a=3070", -0.999998570187017321587L);
+insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=3070", 0.500000714906491339207L);
+insert("u01<float>(mini64 + int64_t(a)) a=3070", 0.500000000000000000000L);
+insert("uneg11<float>(mini64 + int64_t(a)) a=3070", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini64 + int64_t(a)) a=3070", 0.500000059604644775391L);
+insert("u01<double>(mini64 + int64_t(a)) a=3070", 0.500000000000000111022L);
+insert("uneg11<double>(mini64 + int64_t(a)) a=3070", -0.999999999999999666933L);
+insert("u01fixedpt<double>(mini64 + int64_t(a)) a=3070", 0.500000000000000111022L);
+insert("u01<long double>(mini64 + int64_t(a)) a=3070", 0.500000000000000166425L);
+insert("uneg11<long double>(mini64 + int64_t(a)) a=3070", -0.999999999999999667096L);
+insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=3070", 0.500000000000000166479L);
+insert("u01<float>(maxu32 - uint32_t(a)) a=3070", 0.999999284744262695312L);
+insert("uneg11<float>(maxu32 - uint32_t(a)) a=3070", -1.42981298267841339111e-06L);
+insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=3070", 0.999999344348907470703L);
+insert("u01<double>(maxu32 - uint32_t(a)) a=3070", 0.999999285093508660793L);
+insert("uneg11<double>(maxu32 - uint32_t(a)) a=3070", -1.42981298267841339111e-06L);
+insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=3070", 0.999999285093508660793L);
+insert("u01<long double>(maxu32 - uint32_t(a)) a=3070", 0.999999285093508660793L);
+insert("uneg11<long double>(maxu32 - uint32_t(a)) a=3070", -1.42981298267841339111e-06L);
+insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=3070", 0.999999285093508660793L);
+insert("u01<float>(maxu64 - uint64_t(a)) a=3070", 1.00000000000000000000L);
+insert("uneg11<float>(maxu64 - uint64_t(a)) a=3070", -3.32904277061674136462e-16L);
+insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=3070", 0.999999940395355224609L);
+insert("u01<double>(maxu64 - uint64_t(a)) a=3070", 0.999999999999999888978L);
+insert("uneg11<double>(maxu64 - uint64_t(a)) a=3070", -3.32904277061674136462e-16L);
+insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=3070", 0.999999999999999888978L);
+insert("u01<long double>(maxu64 - uint64_t(a)) a=3070", 0.999999999999999833575L);
+insert("uneg11<long double>(maxu64 - uint64_t(a)) a=3070", -3.32904277061674136462e-16L);
+insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=3070", 0.999999999999999833521L);
+insert("u01<float>(maxi32 - int32_t(a)) a=3070", 0.499999284744262695312L);
+insert("uneg11<float>(maxi32 - int32_t(a)) a=3070", 0.999998569488525390625L);
+insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=3070", 0.499999344348907470703L);
+insert("u01<double>(maxi32 - int32_t(a)) a=3070", 0.499999285093508660793L);
+insert("uneg11<double>(maxi32 - int32_t(a)) a=3070", 0.999998570187017321587L);
+insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=3070", 0.499999285093508660793L);
+insert("u01<long double>(maxi32 - int32_t(a)) a=3070", 0.499999285093508660793L);
+insert("uneg11<long double>(maxi32 - int32_t(a)) a=3070", 0.999998570187017321587L);
+insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=3070", 0.499999285093508660793L);
+insert("u01<float>(maxi64 - int64_t(a)) a=3070", 0.500000000000000000000L);
+insert("uneg11<float>(maxi64 - int64_t(a)) a=3070", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=3070", 0.499999940395355224609L);
+insert("u01<double>(maxi64 - int64_t(a)) a=3070", 0.499999999999999833467L);
+insert("uneg11<double>(maxi64 - int64_t(a)) a=3070", 0.999999999999999666933L);
+insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=3070", 0.499999999999999888978L);
+insert("u01<long double>(maxi64 - int64_t(a)) a=3070", 0.499999999999999833548L);
+insert("uneg11<long double>(maxi64 - int64_t(a)) a=3070", 0.999999999999999667096L);
+insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=3070", 0.499999999999999833521L);
+insert("u01<float>(minu32 + uint32_t(a)) a=3071", 7.15139321982860565186e-07L);
+insert("uneg11<float>(minu32 + uint32_t(a)) a=3071", 1.43027864396572113037e-06L);
+insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=3071", 6.55651092529296875000e-07L);
+insert("u01<double>(minu32 + uint32_t(a)) a=3071", 7.15139321982860565186e-07L);
+insert("uneg11<double>(minu32 + uint32_t(a)) a=3071", 1.43027864396572113037e-06L);
+insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=3071", 7.15139321982860565186e-07L);
+insert("u01<long double>(minu32 + uint32_t(a)) a=3071", 7.15139321982860565186e-07L);
+insert("uneg11<long double>(minu32 + uint32_t(a)) a=3071", 1.43027864396572113037e-06L);
+insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=3071", 7.15139321982860565186e-07L);
+insert("u01<float>(minu64 + uint64_t(a)) a=3071", 1.66506348639461343453e-16L);
+insert("uneg11<float>(minu64 + uint64_t(a)) a=3071", 3.33012697278922686905e-16L);
+insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=3071", 5.96046447753906250000e-08L);
+insert("u01<double>(minu64 + uint64_t(a)) a=3071", 1.66506348639461343453e-16L);
+insert("uneg11<double>(minu64 + uint64_t(a)) a=3071", 3.33012697278922686905e-16L);
+insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=3071", 1.11022302462515654042e-16L);
+insert("u01<long double>(minu64 + uint64_t(a)) a=3071", 1.66506348639461343453e-16L);
+insert("uneg11<long double>(minu64 + uint64_t(a)) a=3071", 3.33012697278922686905e-16L);
+insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=3071", 1.66479243585149205842e-16L);
+insert("u01<float>(mini32 + int32_t(a)) a=3071", 0.500000715255737304688L);
+insert("uneg11<float>(mini32 + int32_t(a)) a=3071", -0.999998569488525390625L);
+insert("u01fixedpt<float>(mini32 + int32_t(a)) a=3071", 0.500000655651092529297L);
+insert("u01<double>(mini32 + int32_t(a)) a=3071", 0.500000715139321982861L);
+insert("uneg11<double>(mini32 + int32_t(a)) a=3071", -0.999998569721356034279L);
+insert("u01fixedpt<double>(mini32 + int32_t(a)) a=3071", 0.500000715139321982861L);
+insert("u01<long double>(mini32 + int32_t(a)) a=3071", 0.500000715139321982861L);
+insert("uneg11<long double>(mini32 + int32_t(a)) a=3071", -0.999998569721356034279L);
+insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=3071", 0.500000715139321982861L);
+insert("u01<float>(mini64 + int64_t(a)) a=3071", 0.500000000000000000000L);
+insert("uneg11<float>(mini64 + int64_t(a)) a=3071", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini64 + int64_t(a)) a=3071", 0.500000059604644775391L);
+insert("u01<double>(mini64 + int64_t(a)) a=3071", 0.500000000000000111022L);
+insert("uneg11<double>(mini64 + int64_t(a)) a=3071", -0.999999999999999666933L);
+insert("u01fixedpt<double>(mini64 + int64_t(a)) a=3071", 0.500000000000000111022L);
+insert("u01<long double>(mini64 + int64_t(a)) a=3071", 0.500000000000000166533L);
+insert("uneg11<long double>(mini64 + int64_t(a)) a=3071", -0.999999999999999666987L);
+insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=3071", 0.500000000000000166479L);
+insert("u01<float>(maxu32 - uint32_t(a)) a=3071", 0.999999284744262695312L);
+insert("uneg11<float>(maxu32 - uint32_t(a)) a=3071", -1.43027864396572113037e-06L);
+insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=3071", 0.999999344348907470703L);
+insert("u01<double>(maxu32 - uint32_t(a)) a=3071", 0.999999284860678017139L);
+insert("uneg11<double>(maxu32 - uint32_t(a)) a=3071", -1.43027864396572113037e-06L);
+insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=3071", 0.999999284860678017139L);
+insert("u01<long double>(maxu32 - uint32_t(a)) a=3071", 0.999999284860678017139L);
+insert("uneg11<long double>(maxu32 - uint32_t(a)) a=3071", -1.43027864396572113037e-06L);
+insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=3071", 0.999999284860678017139L);
+insert("u01<float>(maxu64 - uint64_t(a)) a=3071", 1.00000000000000000000L);
+insert("uneg11<float>(maxu64 - uint64_t(a)) a=3071", -3.33012697278922686905e-16L);
+insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=3071", 0.999999940395355224609L);
+insert("u01<double>(maxu64 - uint64_t(a)) a=3071", 0.999999999999999777955L);
+insert("uneg11<double>(maxu64 - uint64_t(a)) a=3071", -3.33012697278922686905e-16L);
+insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=3071", 0.999999999999999888978L);
+insert("u01<long double>(maxu64 - uint64_t(a)) a=3071", 0.999999999999999833467L);
+insert("uneg11<long double>(maxu64 - uint64_t(a)) a=3071", -3.33012697278922686905e-16L);
+insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=3071", 0.999999999999999833521L);
+insert("u01<float>(maxi32 - int32_t(a)) a=3071", 0.499999284744262695312L);
+insert("uneg11<float>(maxi32 - int32_t(a)) a=3071", 0.999998569488525390625L);
+insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=3071", 0.499999344348907470703L);
+insert("u01<double>(maxi32 - int32_t(a)) a=3071", 0.499999284860678017139L);
+insert("uneg11<double>(maxi32 - int32_t(a)) a=3071", 0.999998569721356034279L);
+insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=3071", 0.499999284860678017139L);
+insert("u01<long double>(maxi32 - int32_t(a)) a=3071", 0.499999284860678017139L);
+insert("uneg11<long double>(maxi32 - int32_t(a)) a=3071", 0.999998569721356034279L);
+insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=3071", 0.499999284860678017139L);
+insert("u01<float>(maxi64 - int64_t(a)) a=3071", 0.500000000000000000000L);
+insert("uneg11<float>(maxi64 - int64_t(a)) a=3071", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=3071", 0.499999940395355224609L);
+insert("u01<double>(maxi64 - int64_t(a)) a=3071", 0.499999999999999833467L);
+insert("uneg11<double>(maxi64 - int64_t(a)) a=3071", 0.999999999999999666933L);
+insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=3071", 0.499999999999999888978L);
+insert("u01<long double>(maxi64 - int64_t(a)) a=3071", 0.499999999999999833494L);
+insert("uneg11<long double>(maxi64 - int64_t(a)) a=3071", 0.999999999999999666987L);
+insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=3071", 0.499999999999999833521L);
+insert("u01<float>(minu32 + uint32_t(a)) a=3072", 7.15372152626514434814e-07L);
+insert("uneg11<float>(minu32 + uint32_t(a)) a=3072", 1.43074430525302886963e-06L);
+insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=3072", 7.74860382080078125000e-07L);
+insert("u01<double>(minu32 + uint32_t(a)) a=3072", 7.15372152626514434814e-07L);
+insert("uneg11<double>(minu32 + uint32_t(a)) a=3072", 1.43074430525302886963e-06L);
+insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=3072", 7.15372152626514434814e-07L);
+insert("u01<long double>(minu32 + uint32_t(a)) a=3072", 7.15372152626514434814e-07L);
+insert("uneg11<long double>(minu32 + uint32_t(a)) a=3072", 1.43074430525302886963e-06L);
+insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=3072", 7.15372152626514434814e-07L);
+insert("u01<float>(minu64 + uint64_t(a)) a=3072", 1.66560558748085618674e-16L);
+insert("uneg11<float>(minu64 + uint64_t(a)) a=3072", 3.33121117496171237349e-16L);
+insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=3072", 5.96046447753906250000e-08L);
+insert("u01<double>(minu64 + uint64_t(a)) a=3072", 1.66560558748085618674e-16L);
+insert("uneg11<double>(minu64 + uint64_t(a)) a=3072", 3.33121117496171237349e-16L);
+insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=3072", 1.11022302462515654042e-16L);
+insert("u01<long double>(minu64 + uint64_t(a)) a=3072", 1.66560558748085618674e-16L);
+insert("uneg11<long double>(minu64 + uint64_t(a)) a=3072", 3.33121117496171237349e-16L);
+insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=3072", 1.66587663802397756285e-16L);
+insert("u01<float>(mini32 + int32_t(a)) a=3072", 0.500000715255737304688L);
+insert("uneg11<float>(mini32 + int32_t(a)) a=3072", -0.999998569488525390625L);
+insert("u01fixedpt<float>(mini32 + int32_t(a)) a=3072", 0.500000774860382080078L);
+insert("u01<double>(mini32 + int32_t(a)) a=3072", 0.500000715372152626514L);
+insert("uneg11<double>(mini32 + int32_t(a)) a=3072", -0.999998569255694746971L);
+insert("u01fixedpt<double>(mini32 + int32_t(a)) a=3072", 0.500000715372152626514L);
+insert("u01<long double>(mini32 + int32_t(a)) a=3072", 0.500000715372152626514L);
+insert("uneg11<long double>(mini32 + int32_t(a)) a=3072", -0.999998569255694746971L);
+insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=3072", 0.500000715372152626514L);
+insert("u01<float>(mini64 + int64_t(a)) a=3072", 0.500000000000000000000L);
+insert("uneg11<float>(mini64 + int64_t(a)) a=3072", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini64 + int64_t(a)) a=3072", 0.500000059604644775391L);
+insert("u01<double>(mini64 + int64_t(a)) a=3072", 0.500000000000000222045L);
+insert("uneg11<double>(mini64 + int64_t(a)) a=3072", -0.999999999999999666933L);
+insert("u01fixedpt<double>(mini64 + int64_t(a)) a=3072", 0.500000000000000111022L);
+insert("u01<long double>(mini64 + int64_t(a)) a=3072", 0.500000000000000166533L);
+insert("uneg11<long double>(mini64 + int64_t(a)) a=3072", -0.999999999999999666879L);
+insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=3072", 0.500000000000000166588L);
+insert("u01<float>(maxu32 - uint32_t(a)) a=3072", 0.999999284744262695312L);
+insert("uneg11<float>(maxu32 - uint32_t(a)) a=3072", -1.43074430525302886963e-06L);
+insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=3072", 0.999999225139617919922L);
+insert("u01<double>(maxu32 - uint32_t(a)) a=3072", 0.999999284627847373486L);
+insert("uneg11<double>(maxu32 - uint32_t(a)) a=3072", -1.43074430525302886963e-06L);
+insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=3072", 0.999999284627847373486L);
+insert("u01<long double>(maxu32 - uint32_t(a)) a=3072", 0.999999284627847373486L);
+insert("uneg11<long double>(maxu32 - uint32_t(a)) a=3072", -1.43074430525302886963e-06L);
+insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=3072", 0.999999284627847373486L);
+insert("u01<float>(maxu64 - uint64_t(a)) a=3072", 1.00000000000000000000L);
+insert("uneg11<float>(maxu64 - uint64_t(a)) a=3072", -3.33121117496171237349e-16L);
+insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=3072", 0.999999940395355224609L);
+insert("u01<double>(maxu64 - uint64_t(a)) a=3072", 0.999999999999999777955L);
+insert("uneg11<double>(maxu64 - uint64_t(a)) a=3072", -3.33121117496171237349e-16L);
+insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=3072", 0.999999999999999888978L);
+insert("u01<long double>(maxu64 - uint64_t(a)) a=3072", 0.999999999999999833467L);
+insert("uneg11<long double>(maxu64 - uint64_t(a)) a=3072", -3.33121117496171237349e-16L);
+insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=3072", 0.999999999999999833412L);
+insert("u01<float>(maxi32 - int32_t(a)) a=3072", 0.499999284744262695312L);
+insert("uneg11<float>(maxi32 - int32_t(a)) a=3072", 0.999998569488525390625L);
+insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=3072", 0.499999225139617919922L);
+insert("u01<double>(maxi32 - int32_t(a)) a=3072", 0.499999284627847373486L);
+insert("uneg11<double>(maxi32 - int32_t(a)) a=3072", 0.999998569255694746971L);
+insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=3072", 0.499999284627847373486L);
+insert("u01<long double>(maxi32 - int32_t(a)) a=3072", 0.499999284627847373486L);
+insert("uneg11<long double>(maxi32 - int32_t(a)) a=3072", 0.999998569255694746971L);
+insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=3072", 0.499999284627847373486L);
+insert("u01<float>(maxi64 - int64_t(a)) a=3072", 0.500000000000000000000L);
+insert("uneg11<float>(maxi64 - int64_t(a)) a=3072", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=3072", 0.499999940395355224609L);
+insert("u01<double>(maxi64 - int64_t(a)) a=3072", 0.499999999999999833467L);
+insert("uneg11<double>(maxi64 - int64_t(a)) a=3072", 0.999999999999999666933L);
+insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=3072", 0.499999999999999888978L);
+insert("u01<long double>(maxi64 - int64_t(a)) a=3072", 0.499999999999999833439L);
+insert("uneg11<long double>(maxi64 - int64_t(a)) a=3072", 0.999999999999999666879L);
+insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=3072", 0.499999999999999833412L);
+insert("u01<float>(minu32 + uint32_t(a)) a=5119", 1.19197648018598556519e-06L);
+insert("uneg11<float>(minu32 + uint32_t(a)) a=5119", 2.38395296037197113037e-06L);
+insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=5119", 1.13248825073242187500e-06L);
+insert("u01<double>(minu32 + uint32_t(a)) a=5119", 1.19197648018598556519e-06L);
+insert("uneg11<double>(minu32 + uint32_t(a)) a=5119", 2.38395296037197113037e-06L);
+insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=5119", 1.19197648018598556519e-06L);
+insert("u01<long double>(minu32 + uint32_t(a)) a=5119", 1.19197648018598556519e-06L);
+insert("uneg11<long double>(minu32 + uint32_t(a)) a=5119", 2.38395296037197113037e-06L);
+insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=5119", 1.19197648018598556519e-06L);
+insert("u01<float>(minu64 + uint64_t(a)) a=5119", 2.77528651101976997495e-16L);
+insert("uneg11<float>(minu64 + uint64_t(a)) a=5119", 5.55057302203953994990e-16L);
+insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=5119", 5.96046447753906250000e-08L);
+insert("u01<double>(minu64 + uint64_t(a)) a=5119", 2.77528651101976997495e-16L);
+insert("uneg11<double>(minu64 + uint64_t(a)) a=5119", 5.55057302203953994990e-16L);
+insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=5119", 3.33066907387546962127e-16L);
+insert("u01<long double>(minu64 + uint64_t(a)) a=5119", 2.77528651101976997495e-16L);
+insert("uneg11<long double>(minu64 + uint64_t(a)) a=5119", 5.55057302203953994990e-16L);
+insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=5119", 2.77501546047664859884e-16L);
+insert("u01<float>(mini32 + int32_t(a)) a=5119", 0.500001192092895507812L);
+insert("uneg11<float>(mini32 + int32_t(a)) a=5119", -0.999997615814208984375L);
+insert("u01fixedpt<float>(mini32 + int32_t(a)) a=5119", 0.500001132488250732422L);
+insert("u01<double>(mini32 + int32_t(a)) a=5119", 0.500001191976480185986L);
+insert("uneg11<double>(mini32 + int32_t(a)) a=5119", -0.999997616047039628029L);
+insert("u01fixedpt<double>(mini32 + int32_t(a)) a=5119", 0.500001191976480185986L);
+insert("u01<long double>(mini32 + int32_t(a)) a=5119", 0.500001191976480185986L);
+insert("uneg11<long double>(mini32 + int32_t(a)) a=5119", -0.999997616047039628029L);
+insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=5119", 0.500001191976480185986L);
+insert("u01<float>(mini64 + int64_t(a)) a=5119", 0.500000000000000000000L);
+insert("uneg11<float>(mini64 + int64_t(a)) a=5119", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini64 + int64_t(a)) a=5119", 0.500000059604644775391L);
+insert("u01<double>(mini64 + int64_t(a)) a=5119", 0.500000000000000222045L);
+insert("uneg11<double>(mini64 + int64_t(a)) a=5119", -0.999999999999999444888L);
+insert("u01fixedpt<double>(mini64 + int64_t(a)) a=5119", 0.500000000000000333067L);
+insert("u01<long double>(mini64 + int64_t(a)) a=5119", 0.500000000000000277556L);
+insert("uneg11<long double>(mini64 + int64_t(a)) a=5119", -0.999999999999999444943L);
+insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=5119", 0.500000000000000277502L);
+insert("u01<float>(maxu32 - uint32_t(a)) a=5119", 0.999998807907104492188L);
+insert("uneg11<float>(maxu32 - uint32_t(a)) a=5119", -2.38395296037197113037e-06L);
+insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=5119", 0.999998867511749267578L);
+insert("u01<double>(maxu32 - uint32_t(a)) a=5119", 0.999998808023519814014L);
+insert("uneg11<double>(maxu32 - uint32_t(a)) a=5119", -2.38395296037197113037e-06L);
+insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=5119", 0.999998808023519814014L);
+insert("u01<long double>(maxu32 - uint32_t(a)) a=5119", 0.999998808023519814014L);
+insert("uneg11<long double>(maxu32 - uint32_t(a)) a=5119", -2.38395296037197113037e-06L);
+insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=5119", 0.999998808023519814014L);
+insert("u01<float>(maxu64 - uint64_t(a)) a=5119", 1.00000000000000000000L);
+insert("uneg11<float>(maxu64 - uint64_t(a)) a=5119", -5.55057302203953994990e-16L);
+insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=5119", 0.999999940395355224609L);
+insert("u01<double>(maxu64 - uint64_t(a)) a=5119", 0.999999999999999777955L);
+insert("uneg11<double>(maxu64 - uint64_t(a)) a=5119", -5.55057302203953994990e-16L);
+insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=5119", 0.999999999999999666933L);
+insert("u01<long double>(maxu64 - uint64_t(a)) a=5119", 0.999999999999999722444L);
+insert("uneg11<long double>(maxu64 - uint64_t(a)) a=5119", -5.55057302203953994990e-16L);
+insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=5119", 0.999999999999999722498L);
+insert("u01<float>(maxi32 - int32_t(a)) a=5119", 0.499998807907104492188L);
+insert("uneg11<float>(maxi32 - int32_t(a)) a=5119", 0.999997615814208984375L);
+insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=5119", 0.499998867511749267578L);
+insert("u01<double>(maxi32 - int32_t(a)) a=5119", 0.499998808023519814014L);
+insert("uneg11<double>(maxi32 - int32_t(a)) a=5119", 0.999997616047039628029L);
+insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=5119", 0.499998808023519814014L);
+insert("u01<long double>(maxi32 - int32_t(a)) a=5119", 0.499998808023519814014L);
+insert("uneg11<long double>(maxi32 - int32_t(a)) a=5119", 0.999997616047039628029L);
+insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=5119", 0.499998808023519814014L);
+insert("u01<float>(maxi64 - int64_t(a)) a=5119", 0.500000000000000000000L);
+insert("uneg11<float>(maxi64 - int64_t(a)) a=5119", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=5119", 0.499999940395355224609L);
+insert("u01<double>(maxi64 - int64_t(a)) a=5119", 0.499999999999999722444L);
+insert("uneg11<double>(maxi64 - int64_t(a)) a=5119", 0.999999999999999444888L);
+insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=5119", 0.499999999999999666933L);
+insert("u01<long double>(maxi64 - int64_t(a)) a=5119", 0.499999999999999722471L);
+insert("uneg11<long double>(maxi64 - int64_t(a)) a=5119", 0.999999999999999444943L);
+insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=5119", 0.499999999999999722498L);
+insert("u01<float>(minu32 + uint32_t(a)) a=5120", 1.19220931082963943481e-06L);
+insert("uneg11<float>(minu32 + uint32_t(a)) a=5120", 2.38441862165927886963e-06L);
+insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=5120", 1.25169754028320312500e-06L);
+insert("u01<double>(minu32 + uint32_t(a)) a=5120", 1.19220931082963943481e-06L);
+insert("uneg11<double>(minu32 + uint32_t(a)) a=5120", 2.38441862165927886963e-06L);
+insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=5120", 1.19220931082963943481e-06L);
+insert("u01<long double>(minu32 + uint32_t(a)) a=5120", 1.19220931082963943481e-06L);
+insert("uneg11<long double>(minu32 + uint32_t(a)) a=5120", 2.38441862165927886963e-06L);
+insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=5120", 1.19220931082963943481e-06L);
+insert("u01<float>(minu64 + uint64_t(a)) a=5120", 2.77582861210601272717e-16L);
+insert("uneg11<float>(minu64 + uint64_t(a)) a=5120", 5.55165722421202545434e-16L);
+insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=5120", 5.96046447753906250000e-08L);
+insert("u01<double>(minu64 + uint64_t(a)) a=5120", 2.77582861210601272717e-16L);
+insert("uneg11<double>(minu64 + uint64_t(a)) a=5120", 5.55165722421202545434e-16L);
+insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=5120", 3.33066907387546962127e-16L);
+insert("u01<long double>(minu64 + uint64_t(a)) a=5120", 2.77582861210601272717e-16L);
+insert("uneg11<long double>(minu64 + uint64_t(a)) a=5120", 5.55165722421202545434e-16L);
+insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=5120", 2.77609966264913410328e-16L);
+insert("u01<float>(mini32 + int32_t(a)) a=5120", 0.500001192092895507812L);
+insert("uneg11<float>(mini32 + int32_t(a)) a=5120", -0.999997615814208984375L);
+insert("u01fixedpt<float>(mini32 + int32_t(a)) a=5120", 0.500001251697540283203L);
+insert("u01<double>(mini32 + int32_t(a)) a=5120", 0.500001192209310829639L);
+insert("uneg11<double>(mini32 + int32_t(a)) a=5120", -0.999997615581378340721L);
+insert("u01fixedpt<double>(mini32 + int32_t(a)) a=5120", 0.500001192209310829639L);
+insert("u01<long double>(mini32 + int32_t(a)) a=5120", 0.500001192209310829639L);
+insert("uneg11<long double>(mini32 + int32_t(a)) a=5120", -0.999997615581378340721L);
+insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=5120", 0.500001192209310829639L);
+insert("u01<float>(mini64 + int64_t(a)) a=5120", 0.500000000000000000000L);
+insert("uneg11<float>(mini64 + int64_t(a)) a=5120", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini64 + int64_t(a)) a=5120", 0.500000059604644775391L);
+insert("u01<double>(mini64 + int64_t(a)) a=5120", 0.500000000000000222045L);
+insert("uneg11<double>(mini64 + int64_t(a)) a=5120", -0.999999999999999444888L);
+insert("u01fixedpt<double>(mini64 + int64_t(a)) a=5120", 0.500000000000000333067L);
+insert("u01<long double>(mini64 + int64_t(a)) a=5120", 0.500000000000000277556L);
+insert("uneg11<long double>(mini64 + int64_t(a)) a=5120", -0.999999999999999444834L);
+insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=5120", 0.500000000000000277610L);
+insert("u01<float>(maxu32 - uint32_t(a)) a=5120", 0.999998807907104492188L);
+insert("uneg11<float>(maxu32 - uint32_t(a)) a=5120", -2.38441862165927886963e-06L);
+insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=5120", 0.999998748302459716797L);
+insert("u01<double>(maxu32 - uint32_t(a)) a=5120", 0.999998807790689170361L);
+insert("uneg11<double>(maxu32 - uint32_t(a)) a=5120", -2.38441862165927886963e-06L);
+insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=5120", 0.999998807790689170361L);
+insert("u01<long double>(maxu32 - uint32_t(a)) a=5120", 0.999998807790689170361L);
+insert("uneg11<long double>(maxu32 - uint32_t(a)) a=5120", -2.38441862165927886963e-06L);
+insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=5120", 0.999998807790689170361L);
+insert("u01<float>(maxu64 - uint64_t(a)) a=5120", 1.00000000000000000000L);
+insert("uneg11<float>(maxu64 - uint64_t(a)) a=5120", -5.55165722421202545434e-16L);
+insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=5120", 0.999999940395355224609L);
+insert("u01<double>(maxu64 - uint64_t(a)) a=5120", 0.999999999999999666933L);
+insert("uneg11<double>(maxu64 - uint64_t(a)) a=5120", -5.55165722421202545434e-16L);
+insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=5120", 0.999999999999999666933L);
+insert("u01<long double>(maxu64 - uint64_t(a)) a=5120", 0.999999999999999722444L);
+insert("uneg11<long double>(maxu64 - uint64_t(a)) a=5120", -5.55165722421202545434e-16L);
+insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=5120", 0.999999999999999722390L);
+insert("u01<float>(maxi32 - int32_t(a)) a=5120", 0.499998807907104492188L);
+insert("uneg11<float>(maxi32 - int32_t(a)) a=5120", 0.999997615814208984375L);
+insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=5120", 0.499998748302459716797L);
+insert("u01<double>(maxi32 - int32_t(a)) a=5120", 0.499998807790689170361L);
+insert("uneg11<double>(maxi32 - int32_t(a)) a=5120", 0.999997615581378340721L);
+insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=5120", 0.499998807790689170361L);
+insert("u01<long double>(maxi32 - int32_t(a)) a=5120", 0.499998807790689170361L);
+insert("uneg11<long double>(maxi32 - int32_t(a)) a=5120", 0.999997615581378340721L);
+insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=5120", 0.499998807790689170361L);
+insert("u01<float>(maxi64 - int64_t(a)) a=5120", 0.500000000000000000000L);
+insert("uneg11<float>(maxi64 - int64_t(a)) a=5120", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=5120", 0.499999940395355224609L);
+insert("u01<double>(maxi64 - int64_t(a)) a=5120", 0.499999999999999722444L);
+insert("uneg11<double>(maxi64 - int64_t(a)) a=5120", 0.999999999999999444888L);
+insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=5120", 0.499999999999999666933L);
+insert("u01<long double>(maxi64 - int64_t(a)) a=5120", 0.499999999999999722417L);
+insert("uneg11<long double>(maxi64 - int64_t(a)) a=5120", 0.999999999999999444834L);
+insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=5120", 0.499999999999999722390L);
+insert("u01<float>(minu32 + uint32_t(a)) a=5121", 1.19244214147329330444e-06L);
+insert("uneg11<float>(minu32 + uint32_t(a)) a=5121", 2.38488428294658660889e-06L);
+insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=5121", 1.25169754028320312500e-06L);
+insert("u01<double>(minu32 + uint32_t(a)) a=5121", 1.19244214147329330444e-06L);
+insert("uneg11<double>(minu32 + uint32_t(a)) a=5121", 2.38488428294658660889e-06L);
+insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=5121", 1.19244214147329330444e-06L);
+insert("u01<long double>(minu32 + uint32_t(a)) a=5121", 1.19244214147329330444e-06L);
+insert("uneg11<long double>(minu32 + uint32_t(a)) a=5121", 2.38488428294658660889e-06L);
+insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=5121", 1.19244214147329330444e-06L);
+insert("u01<float>(minu64 + uint64_t(a)) a=5121", 2.77637071319225547938e-16L);
+insert("uneg11<float>(minu64 + uint64_t(a)) a=5121", 5.55274142638451095877e-16L);
+insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=5121", 5.96046447753906250000e-08L);
+insert("u01<double>(minu64 + uint64_t(a)) a=5121", 2.77637071319225547938e-16L);
+insert("uneg11<double>(minu64 + uint64_t(a)) a=5121", 5.55274142638451095877e-16L);
+insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=5121", 3.33066907387546962127e-16L);
+insert("u01<long double>(minu64 + uint64_t(a)) a=5121", 2.77637071319225547938e-16L);
+insert("uneg11<long double>(minu64 + uint64_t(a)) a=5121", 5.55274142638451095877e-16L);
+insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=5121", 2.77609966264913410328e-16L);
+insert("u01<float>(mini32 + int32_t(a)) a=5121", 0.500001192092895507812L);
+insert("uneg11<float>(mini32 + int32_t(a)) a=5121", -0.999997615814208984375L);
+insert("u01fixedpt<float>(mini32 + int32_t(a)) a=5121", 0.500001251697540283203L);
+insert("u01<double>(mini32 + int32_t(a)) a=5121", 0.500001192442141473293L);
+insert("uneg11<double>(mini32 + int32_t(a)) a=5121", -0.999997615115717053413L);
+insert("u01fixedpt<double>(mini32 + int32_t(a)) a=5121", 0.500001192442141473293L);
+insert("u01<long double>(mini32 + int32_t(a)) a=5121", 0.500001192442141473293L);
+insert("uneg11<long double>(mini32 + int32_t(a)) a=5121", -0.999997615115717053413L);
+insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=5121", 0.500001192442141473293L);
+insert("u01<float>(mini64 + int64_t(a)) a=5121", 0.500000000000000000000L);
+insert("uneg11<float>(mini64 + int64_t(a)) a=5121", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini64 + int64_t(a)) a=5121", 0.500000059604644775391L);
+insert("u01<double>(mini64 + int64_t(a)) a=5121", 0.500000000000000333067L);
+insert("uneg11<double>(mini64 + int64_t(a)) a=5121", -0.999999999999999444888L);
+insert("u01fixedpt<double>(mini64 + int64_t(a)) a=5121", 0.500000000000000333067L);
+insert("u01<long double>(mini64 + int64_t(a)) a=5121", 0.500000000000000277664L);
+insert("uneg11<long double>(mini64 + int64_t(a)) a=5121", -0.999999999999999444726L);
+insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=5121", 0.500000000000000277610L);
+insert("u01<float>(maxu32 - uint32_t(a)) a=5121", 0.999998807907104492188L);
+insert("uneg11<float>(maxu32 - uint32_t(a)) a=5121", -2.38488428294658660889e-06L);
+insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=5121", 0.999998748302459716797L);
+insert("u01<double>(maxu32 - uint32_t(a)) a=5121", 0.999998807557858526707L);
+insert("uneg11<double>(maxu32 - uint32_t(a)) a=5121", -2.38488428294658660889e-06L);
+insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=5121", 0.999998807557858526707L);
+insert("u01<long double>(maxu32 - uint32_t(a)) a=5121", 0.999998807557858526707L);
+insert("uneg11<long double>(maxu32 - uint32_t(a)) a=5121", -2.38488428294658660889e-06L);
+insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=5121", 0.999998807557858526707L);
+insert("u01<float>(maxu64 - uint64_t(a)) a=5121", 1.00000000000000000000L);
+insert("uneg11<float>(maxu64 - uint64_t(a)) a=5121", -5.55274142638451095877e-16L);
+insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=5121", 0.999999940395355224609L);
+insert("u01<double>(maxu64 - uint64_t(a)) a=5121", 0.999999999999999666933L);
+insert("uneg11<double>(maxu64 - uint64_t(a)) a=5121", -5.55274142638451095877e-16L);
+insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=5121", 0.999999999999999666933L);
+insert("u01<long double>(maxu64 - uint64_t(a)) a=5121", 0.999999999999999722336L);
+insert("uneg11<long double>(maxu64 - uint64_t(a)) a=5121", -5.55274142638451095877e-16L);
+insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=5121", 0.999999999999999722390L);
+insert("u01<float>(maxi32 - int32_t(a)) a=5121", 0.499998807907104492188L);
+insert("uneg11<float>(maxi32 - int32_t(a)) a=5121", 0.999997615814208984375L);
+insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=5121", 0.499998748302459716797L);
+insert("u01<double>(maxi32 - int32_t(a)) a=5121", 0.499998807557858526707L);
+insert("uneg11<double>(maxi32 - int32_t(a)) a=5121", 0.999997615115717053413L);
+insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=5121", 0.499998807557858526707L);
+insert("u01<long double>(maxi32 - int32_t(a)) a=5121", 0.499998807557858526707L);
+insert("uneg11<long double>(maxi32 - int32_t(a)) a=5121", 0.999997615115717053413L);
+insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=5121", 0.499998807557858526707L);
+insert("u01<float>(maxi64 - int64_t(a)) a=5121", 0.500000000000000000000L);
+insert("uneg11<float>(maxi64 - int64_t(a)) a=5121", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=5121", 0.499999940395355224609L);
+insert("u01<double>(maxi64 - int64_t(a)) a=5121", 0.499999999999999722444L);
+insert("uneg11<double>(maxi64 - int64_t(a)) a=5121", 0.999999999999999444888L);
+insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=5121", 0.499999999999999666933L);
+insert("u01<long double>(maxi64 - int64_t(a)) a=5121", 0.499999999999999722363L);
+insert("uneg11<long double>(maxi64 - int64_t(a)) a=5121", 0.999999999999999444726L);
+insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=5121", 0.499999999999999722390L);
+// ./ut_uniform_IEEEkat: SUCCESS
diff --git a/tests/ut_uniform_kat_vectors.dat b/tests/ut_uniform_kat_vectors.dat
@@ -0,0 +1,2604 @@
+/* This file was created by 'ut_uniform with-arg' on a reference
+ platform, and is #included in the recompilation of ut_uniform
+ on a target platform. When ut_uniform is run with no arguments
+ on the target platform, it asserts that the values computed
+ on the target platform match the reference values recorded here.
+ These reference values were computed on an x86_64 using 32-bit,
+ 64-bit and 80-bit IEEE arithmetic for float, double and long double
+ respectively. Other platforms with different representations of
+ floating point values will almost certainly fail these tests
+ even though their results might be perfectly valid.
+*/
+insert("u01<float>(minu32 + uint32_t(a)) a=0", 1.16415321826934814453e-10L);
+insert("uneg11<float>(minu32 + uint32_t(a)) a=0", 2.32830643653869628906e-10L);
+insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=0", 5.96046447753906250000e-08L);
+insert("u01<double>(minu32 + uint32_t(a)) a=0", 1.16415321826934814453e-10L);
+insert("uneg11<double>(minu32 + uint32_t(a)) a=0", 2.32830643653869628906e-10L);
+insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=0", 1.16415321826934814453e-10L);
+insert("u01<long double>(minu32 + uint32_t(a)) a=0", 1.16415321826934814453e-10L);
+insert("uneg11<long double>(minu32 + uint32_t(a)) a=0", 2.32830643653869628906e-10L);
+insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=0", 1.16415321826934814453e-10L);
+insert("u01<float>(minu64 + uint64_t(a)) a=0", 2.71050543121376108502e-20L);
+insert("uneg11<float>(minu64 + uint64_t(a)) a=0", 5.42101086242752217004e-20L);
+insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=0", 5.96046447753906250000e-08L);
+insert("u01<double>(minu64 + uint64_t(a)) a=0", 2.71050543121376108502e-20L);
+insert("uneg11<double>(minu64 + uint64_t(a)) a=0", 5.42101086242752217004e-20L);
+insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=0", 1.11022302462515654042e-16L);
+insert("u01<long double>(minu64 + uint64_t(a)) a=0", 2.71050543121376108502e-20L);
+insert("uneg11<long double>(minu64 + uint64_t(a)) a=0", 5.42101086242752217004e-20L);
+insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=0", 5.42101086242752217004e-20L);
+insert("u01<float>(mini32 + int32_t(a)) a=0", 0.500000000000000000000L);
+insert("uneg11<float>(mini32 + int32_t(a)) a=0", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini32 + int32_t(a)) a=0", 0.500000059604644775391L);
+insert("u01<double>(mini32 + int32_t(a)) a=0", 0.500000000116415321827L);
+insert("uneg11<double>(mini32 + int32_t(a)) a=0", -0.999999999767169356346L);
+insert("u01fixedpt<double>(mini32 + int32_t(a)) a=0", 0.500000000116415321827L);
+insert("u01<long double>(mini32 + int32_t(a)) a=0", 0.500000000116415321827L);
+insert("uneg11<long double>(mini32 + int32_t(a)) a=0", -0.999999999767169356346L);
+insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=0", 0.500000000116415321827L);
+insert("u01<float>(mini64 + int64_t(a)) a=0", 0.500000000000000000000L);
+insert("uneg11<float>(mini64 + int64_t(a)) a=0", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini64 + int64_t(a)) a=0", 0.500000059604644775391L);
+insert("u01<double>(mini64 + int64_t(a)) a=0", 0.500000000000000000000L);
+insert("uneg11<double>(mini64 + int64_t(a)) a=0", -1.00000000000000000000L);
+insert("u01fixedpt<double>(mini64 + int64_t(a)) a=0", 0.500000000000000111022L);
+insert("u01<long double>(mini64 + int64_t(a)) a=0", 0.500000000000000000000L);
+insert("uneg11<long double>(mini64 + int64_t(a)) a=0", -0.999999999999999999946L);
+insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=0", 0.500000000000000000054L);
+insert("u01<float>(maxu32 - uint32_t(a)) a=0", 1.00000000000000000000L);
+insert("uneg11<float>(maxu32 - uint32_t(a)) a=0", -2.32830643653869628906e-10L);
+insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=0", 0.999999940395355224609L);
+insert("u01<double>(maxu32 - uint32_t(a)) a=0", 0.999999999883584678173L);
+insert("uneg11<double>(maxu32 - uint32_t(a)) a=0", -2.32830643653869628906e-10L);
+insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=0", 0.999999999883584678173L);
+insert("u01<long double>(maxu32 - uint32_t(a)) a=0", 0.999999999883584678173L);
+insert("uneg11<long double>(maxu32 - uint32_t(a)) a=0", -2.32830643653869628906e-10L);
+insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=0", 0.999999999883584678173L);
+insert("u01<float>(maxu64 - uint64_t(a)) a=0", 1.00000000000000000000L);
+insert("uneg11<float>(maxu64 - uint64_t(a)) a=0", -5.42101086242752217004e-20L);
+insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=0", 0.999999940395355224609L);
+insert("u01<double>(maxu64 - uint64_t(a)) a=0", 1.00000000000000000000L);
+insert("uneg11<double>(maxu64 - uint64_t(a)) a=0", -5.42101086242752217004e-20L);
+insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=0", 0.999999999999999888978L);
+insert("u01<long double>(maxu64 - uint64_t(a)) a=0", 1.00000000000000000000L);
+insert("uneg11<long double>(maxu64 - uint64_t(a)) a=0", -5.42101086242752217004e-20L);
+insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=0", 0.999999999999999999946L);
+insert("u01<float>(maxi32 - int32_t(a)) a=0", 0.500000000000000000000L);
+insert("uneg11<float>(maxi32 - int32_t(a)) a=0", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=0", 0.499999940395355224609L);
+insert("u01<double>(maxi32 - int32_t(a)) a=0", 0.499999999883584678173L);
+insert("uneg11<double>(maxi32 - int32_t(a)) a=0", 0.999999999767169356346L);
+insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=0", 0.499999999883584678173L);
+insert("u01<long double>(maxi32 - int32_t(a)) a=0", 0.499999999883584678173L);
+insert("uneg11<long double>(maxi32 - int32_t(a)) a=0", 0.999999999767169356346L);
+insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=0", 0.499999999883584678173L);
+insert("u01<float>(maxi64 - int64_t(a)) a=0", 0.500000000000000000000L);
+insert("uneg11<float>(maxi64 - int64_t(a)) a=0", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=0", 0.499999940395355224609L);
+insert("u01<double>(maxi64 - int64_t(a)) a=0", 0.500000000000000000000L);
+insert("uneg11<double>(maxi64 - int64_t(a)) a=0", 1.00000000000000000000L);
+insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=0", 0.499999999999999888978L);
+insert("u01<long double>(maxi64 - int64_t(a)) a=0", 0.499999999999999999973L);
+insert("uneg11<long double>(maxi64 - int64_t(a)) a=0", 0.999999999999999999946L);
+insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=0", 0.499999999999999999946L);
+insert("u01<float>(minu32 + uint32_t(a)) a=1", 3.49245965480804443359e-10L);
+insert("uneg11<float>(minu32 + uint32_t(a)) a=1", 6.98491930961608886719e-10L);
+insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=1", 5.96046447753906250000e-08L);
+insert("u01<double>(minu32 + uint32_t(a)) a=1", 3.49245965480804443359e-10L);
+insert("uneg11<double>(minu32 + uint32_t(a)) a=1", 6.98491930961608886719e-10L);
+insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=1", 3.49245965480804443359e-10L);
+insert("u01<long double>(minu32 + uint32_t(a)) a=1", 3.49245965480804443359e-10L);
+insert("uneg11<long double>(minu32 + uint32_t(a)) a=1", 6.98491930961608886719e-10L);
+insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=1", 3.49245965480804443359e-10L);
+insert("u01<float>(minu64 + uint64_t(a)) a=1", 8.13151629364128325506e-20L);
+insert("uneg11<float>(minu64 + uint64_t(a)) a=1", 1.62630325872825665101e-19L);
+insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=1", 5.96046447753906250000e-08L);
+insert("u01<double>(minu64 + uint64_t(a)) a=1", 8.13151629364128325506e-20L);
+insert("uneg11<double>(minu64 + uint64_t(a)) a=1", 1.62630325872825665101e-19L);
+insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=1", 1.11022302462515654042e-16L);
+insert("u01<long double>(minu64 + uint64_t(a)) a=1", 8.13151629364128325506e-20L);
+insert("uneg11<long double>(minu64 + uint64_t(a)) a=1", 1.62630325872825665101e-19L);
+insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=1", 5.42101086242752217004e-20L);
+insert("u01<float>(mini32 + int32_t(a)) a=1", 0.500000000000000000000L);
+insert("uneg11<float>(mini32 + int32_t(a)) a=1", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini32 + int32_t(a)) a=1", 0.500000059604644775391L);
+insert("u01<double>(mini32 + int32_t(a)) a=1", 0.500000000349245965481L);
+insert("uneg11<double>(mini32 + int32_t(a)) a=1", -0.999999999301508069038L);
+insert("u01fixedpt<double>(mini32 + int32_t(a)) a=1", 0.500000000349245965481L);
+insert("u01<long double>(mini32 + int32_t(a)) a=1", 0.500000000349245965481L);
+insert("uneg11<long double>(mini32 + int32_t(a)) a=1", -0.999999999301508069038L);
+insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=1", 0.500000000349245965481L);
+insert("u01<float>(mini64 + int64_t(a)) a=1", 0.500000000000000000000L);
+insert("uneg11<float>(mini64 + int64_t(a)) a=1", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini64 + int64_t(a)) a=1", 0.500000059604644775391L);
+insert("u01<double>(mini64 + int64_t(a)) a=1", 0.500000000000000000000L);
+insert("uneg11<double>(mini64 + int64_t(a)) a=1", -1.00000000000000000000L);
+insert("u01fixedpt<double>(mini64 + int64_t(a)) a=1", 0.500000000000000111022L);
+insert("u01<long double>(mini64 + int64_t(a)) a=1", 0.500000000000000000108L);
+insert("uneg11<long double>(mini64 + int64_t(a)) a=1", -0.999999999999999999837L);
+insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=1", 0.500000000000000000054L);
+insert("u01<float>(maxu32 - uint32_t(a)) a=1", 1.00000000000000000000L);
+insert("uneg11<float>(maxu32 - uint32_t(a)) a=1", -6.98491930961608886719e-10L);
+insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=1", 0.999999940395355224609L);
+insert("u01<double>(maxu32 - uint32_t(a)) a=1", 0.999999999650754034519L);
+insert("uneg11<double>(maxu32 - uint32_t(a)) a=1", -6.98491930961608886719e-10L);
+insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=1", 0.999999999650754034519L);
+insert("u01<long double>(maxu32 - uint32_t(a)) a=1", 0.999999999650754034519L);
+insert("uneg11<long double>(maxu32 - uint32_t(a)) a=1", -6.98491930961608886719e-10L);
+insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=1", 0.999999999650754034519L);
+insert("u01<float>(maxu64 - uint64_t(a)) a=1", 1.00000000000000000000L);
+insert("uneg11<float>(maxu64 - uint64_t(a)) a=1", -1.62630325872825665101e-19L);
+insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=1", 0.999999940395355224609L);
+insert("u01<double>(maxu64 - uint64_t(a)) a=1", 1.00000000000000000000L);
+insert("uneg11<double>(maxu64 - uint64_t(a)) a=1", -1.62630325872825665101e-19L);
+insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=1", 0.999999999999999888978L);
+insert("u01<long double>(maxu64 - uint64_t(a)) a=1", 0.999999999999999999892L);
+insert("uneg11<long double>(maxu64 - uint64_t(a)) a=1", -1.62630325872825665101e-19L);
+insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=1", 0.999999999999999999946L);
+insert("u01<float>(maxi32 - int32_t(a)) a=1", 0.500000000000000000000L);
+insert("uneg11<float>(maxi32 - int32_t(a)) a=1", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=1", 0.499999940395355224609L);
+insert("u01<double>(maxi32 - int32_t(a)) a=1", 0.499999999650754034519L);
+insert("uneg11<double>(maxi32 - int32_t(a)) a=1", 0.999999999301508069038L);
+insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=1", 0.499999999650754034519L);
+insert("u01<long double>(maxi32 - int32_t(a)) a=1", 0.499999999650754034519L);
+insert("uneg11<long double>(maxi32 - int32_t(a)) a=1", 0.999999999301508069038L);
+insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=1", 0.499999999650754034519L);
+insert("u01<float>(maxi64 - int64_t(a)) a=1", 0.500000000000000000000L);
+insert("uneg11<float>(maxi64 - int64_t(a)) a=1", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=1", 0.499999940395355224609L);
+insert("u01<double>(maxi64 - int64_t(a)) a=1", 0.500000000000000000000L);
+insert("uneg11<double>(maxi64 - int64_t(a)) a=1", 1.00000000000000000000L);
+insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=1", 0.499999999999999888978L);
+insert("u01<long double>(maxi64 - int64_t(a)) a=1", 0.499999999999999999919L);
+insert("uneg11<long double>(maxi64 - int64_t(a)) a=1", 0.999999999999999999837L);
+insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=1", 0.499999999999999999946L);
+insert("u01<float>(minu32 + uint32_t(a)) a=2", 5.82076609134674072266e-10L);
+insert("uneg11<float>(minu32 + uint32_t(a)) a=2", 1.16415321826934814453e-09L);
+insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=2", 5.96046447753906250000e-08L);
+insert("u01<double>(minu32 + uint32_t(a)) a=2", 5.82076609134674072266e-10L);
+insert("uneg11<double>(minu32 + uint32_t(a)) a=2", 1.16415321826934814453e-09L);
+insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=2", 5.82076609134674072266e-10L);
+insert("u01<long double>(minu32 + uint32_t(a)) a=2", 5.82076609134674072266e-10L);
+insert("uneg11<long double>(minu32 + uint32_t(a)) a=2", 1.16415321826934814453e-09L);
+insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=2", 5.82076609134674072266e-10L);
+insert("u01<float>(minu64 + uint64_t(a)) a=2", 1.35525271560688054251e-19L);
+insert("uneg11<float>(minu64 + uint64_t(a)) a=2", 2.71050543121376108502e-19L);
+insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=2", 5.96046447753906250000e-08L);
+insert("u01<double>(minu64 + uint64_t(a)) a=2", 1.35525271560688054251e-19L);
+insert("uneg11<double>(minu64 + uint64_t(a)) a=2", 2.71050543121376108502e-19L);
+insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=2", 1.11022302462515654042e-16L);
+insert("u01<long double>(minu64 + uint64_t(a)) a=2", 1.35525271560688054251e-19L);
+insert("uneg11<long double>(minu64 + uint64_t(a)) a=2", 2.71050543121376108502e-19L);
+insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=2", 1.62630325872825665101e-19L);
+insert("u01<float>(mini32 + int32_t(a)) a=2", 0.500000000000000000000L);
+insert("uneg11<float>(mini32 + int32_t(a)) a=2", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini32 + int32_t(a)) a=2", 0.500000059604644775391L);
+insert("u01<double>(mini32 + int32_t(a)) a=2", 0.500000000582076609135L);
+insert("uneg11<double>(mini32 + int32_t(a)) a=2", -0.999999998835846781731L);
+insert("u01fixedpt<double>(mini32 + int32_t(a)) a=2", 0.500000000582076609135L);
+insert("u01<long double>(mini32 + int32_t(a)) a=2", 0.500000000582076609135L);
+insert("uneg11<long double>(mini32 + int32_t(a)) a=2", -0.999999998835846781731L);
+insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=2", 0.500000000582076609135L);
+insert("u01<float>(mini64 + int64_t(a)) a=2", 0.500000000000000000000L);
+insert("uneg11<float>(mini64 + int64_t(a)) a=2", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini64 + int64_t(a)) a=2", 0.500000059604644775391L);
+insert("u01<double>(mini64 + int64_t(a)) a=2", 0.500000000000000000000L);
+insert("uneg11<double>(mini64 + int64_t(a)) a=2", -1.00000000000000000000L);
+insert("u01fixedpt<double>(mini64 + int64_t(a)) a=2", 0.500000000000000111022L);
+insert("u01<long double>(mini64 + int64_t(a)) a=2", 0.500000000000000000108L);
+insert("uneg11<long double>(mini64 + int64_t(a)) a=2", -0.999999999999999999729L);
+insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=2", 0.500000000000000000163L);
+insert("u01<float>(maxu32 - uint32_t(a)) a=2", 1.00000000000000000000L);
+insert("uneg11<float>(maxu32 - uint32_t(a)) a=2", -1.16415321826934814453e-09L);
+insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=2", 0.999999940395355224609L);
+insert("u01<double>(maxu32 - uint32_t(a)) a=2", 0.999999999417923390865L);
+insert("uneg11<double>(maxu32 - uint32_t(a)) a=2", -1.16415321826934814453e-09L);
+insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=2", 0.999999999417923390865L);
+insert("u01<long double>(maxu32 - uint32_t(a)) a=2", 0.999999999417923390865L);
+insert("uneg11<long double>(maxu32 - uint32_t(a)) a=2", -1.16415321826934814453e-09L);
+insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=2", 0.999999999417923390865L);
+insert("u01<float>(maxu64 - uint64_t(a)) a=2", 1.00000000000000000000L);
+insert("uneg11<float>(maxu64 - uint64_t(a)) a=2", -2.71050543121376108502e-19L);
+insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=2", 0.999999940395355224609L);
+insert("u01<double>(maxu64 - uint64_t(a)) a=2", 1.00000000000000000000L);
+insert("uneg11<double>(maxu64 - uint64_t(a)) a=2", -2.71050543121376108502e-19L);
+insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=2", 0.999999999999999888978L);
+insert("u01<long double>(maxu64 - uint64_t(a)) a=2", 0.999999999999999999892L);
+insert("uneg11<long double>(maxu64 - uint64_t(a)) a=2", -2.71050543121376108502e-19L);
+insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=2", 0.999999999999999999837L);
+insert("u01<float>(maxi32 - int32_t(a)) a=2", 0.500000000000000000000L);
+insert("uneg11<float>(maxi32 - int32_t(a)) a=2", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=2", 0.499999940395355224609L);
+insert("u01<double>(maxi32 - int32_t(a)) a=2", 0.499999999417923390865L);
+insert("uneg11<double>(maxi32 - int32_t(a)) a=2", 0.999999998835846781731L);
+insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=2", 0.499999999417923390865L);
+insert("u01<long double>(maxi32 - int32_t(a)) a=2", 0.499999999417923390865L);
+insert("uneg11<long double>(maxi32 - int32_t(a)) a=2", 0.999999998835846781731L);
+insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=2", 0.499999999417923390865L);
+insert("u01<float>(maxi64 - int64_t(a)) a=2", 0.500000000000000000000L);
+insert("uneg11<float>(maxi64 - int64_t(a)) a=2", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=2", 0.499999940395355224609L);
+insert("u01<double>(maxi64 - int64_t(a)) a=2", 0.500000000000000000000L);
+insert("uneg11<double>(maxi64 - int64_t(a)) a=2", 1.00000000000000000000L);
+insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=2", 0.499999999999999888978L);
+insert("u01<long double>(maxi64 - int64_t(a)) a=2", 0.499999999999999999864L);
+insert("uneg11<long double>(maxi64 - int64_t(a)) a=2", 0.999999999999999999729L);
+insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=2", 0.499999999999999999837L);
+insert("u01<float>(minu32 + uint32_t(a)) a=3", 8.14907252788543701172e-10L);
+insert("uneg11<float>(minu32 + uint32_t(a)) a=3", 1.62981450557708740234e-09L);
+insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=3", 5.96046447753906250000e-08L);
+insert("u01<double>(minu32 + uint32_t(a)) a=3", 8.14907252788543701172e-10L);
+insert("uneg11<double>(minu32 + uint32_t(a)) a=3", 1.62981450557708740234e-09L);
+insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=3", 8.14907252788543701172e-10L);
+insert("u01<long double>(minu32 + uint32_t(a)) a=3", 8.14907252788543701172e-10L);
+insert("uneg11<long double>(minu32 + uint32_t(a)) a=3", 1.62981450557708740234e-09L);
+insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=3", 8.14907252788543701172e-10L);
+insert("u01<float>(minu64 + uint64_t(a)) a=3", 1.89735380184963275951e-19L);
+insert("uneg11<float>(minu64 + uint64_t(a)) a=3", 3.79470760369926551903e-19L);
+insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=3", 5.96046447753906250000e-08L);
+insert("u01<double>(minu64 + uint64_t(a)) a=3", 1.89735380184963275951e-19L);
+insert("uneg11<double>(minu64 + uint64_t(a)) a=3", 3.79470760369926551903e-19L);
+insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=3", 1.11022302462515654042e-16L);
+insert("u01<long double>(minu64 + uint64_t(a)) a=3", 1.89735380184963275951e-19L);
+insert("uneg11<long double>(minu64 + uint64_t(a)) a=3", 3.79470760369926551903e-19L);
+insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=3", 1.62630325872825665101e-19L);
+insert("u01<float>(mini32 + int32_t(a)) a=3", 0.500000000000000000000L);
+insert("uneg11<float>(mini32 + int32_t(a)) a=3", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini32 + int32_t(a)) a=3", 0.500000059604644775391L);
+insert("u01<double>(mini32 + int32_t(a)) a=3", 0.500000000814907252789L);
+insert("uneg11<double>(mini32 + int32_t(a)) a=3", -0.999999998370185494423L);
+insert("u01fixedpt<double>(mini32 + int32_t(a)) a=3", 0.500000000814907252789L);
+insert("u01<long double>(mini32 + int32_t(a)) a=3", 0.500000000814907252789L);
+insert("uneg11<long double>(mini32 + int32_t(a)) a=3", -0.999999998370185494423L);
+insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=3", 0.500000000814907252789L);
+insert("u01<float>(mini64 + int64_t(a)) a=3", 0.500000000000000000000L);
+insert("uneg11<float>(mini64 + int64_t(a)) a=3", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini64 + int64_t(a)) a=3", 0.500000059604644775391L);
+insert("u01<double>(mini64 + int64_t(a)) a=3", 0.500000000000000000000L);
+insert("uneg11<double>(mini64 + int64_t(a)) a=3", -1.00000000000000000000L);
+insert("u01fixedpt<double>(mini64 + int64_t(a)) a=3", 0.500000000000000111022L);
+insert("u01<long double>(mini64 + int64_t(a)) a=3", 0.500000000000000000217L);
+insert("uneg11<long double>(mini64 + int64_t(a)) a=3", -0.999999999999999999621L);
+insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=3", 0.500000000000000000163L);
+insert("u01<float>(maxu32 - uint32_t(a)) a=3", 1.00000000000000000000L);
+insert("uneg11<float>(maxu32 - uint32_t(a)) a=3", -1.62981450557708740234e-09L);
+insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=3", 0.999999940395355224609L);
+insert("u01<double>(maxu32 - uint32_t(a)) a=3", 0.999999999185092747211L);
+insert("uneg11<double>(maxu32 - uint32_t(a)) a=3", -1.62981450557708740234e-09L);
+insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=3", 0.999999999185092747211L);
+insert("u01<long double>(maxu32 - uint32_t(a)) a=3", 0.999999999185092747211L);
+insert("uneg11<long double>(maxu32 - uint32_t(a)) a=3", -1.62981450557708740234e-09L);
+insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=3", 0.999999999185092747211L);
+insert("u01<float>(maxu64 - uint64_t(a)) a=3", 1.00000000000000000000L);
+insert("uneg11<float>(maxu64 - uint64_t(a)) a=3", -3.79470760369926551903e-19L);
+insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=3", 0.999999940395355224609L);
+insert("u01<double>(maxu64 - uint64_t(a)) a=3", 1.00000000000000000000L);
+insert("uneg11<double>(maxu64 - uint64_t(a)) a=3", -3.79470760369926551903e-19L);
+insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=3", 0.999999999999999888978L);
+insert("u01<long double>(maxu64 - uint64_t(a)) a=3", 0.999999999999999999783L);
+insert("uneg11<long double>(maxu64 - uint64_t(a)) a=3", -3.79470760369926551903e-19L);
+insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=3", 0.999999999999999999837L);
+insert("u01<float>(maxi32 - int32_t(a)) a=3", 0.500000000000000000000L);
+insert("uneg11<float>(maxi32 - int32_t(a)) a=3", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=3", 0.499999940395355224609L);
+insert("u01<double>(maxi32 - int32_t(a)) a=3", 0.499999999185092747211L);
+insert("uneg11<double>(maxi32 - int32_t(a)) a=3", 0.999999998370185494423L);
+insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=3", 0.499999999185092747211L);
+insert("u01<long double>(maxi32 - int32_t(a)) a=3", 0.499999999185092747211L);
+insert("uneg11<long double>(maxi32 - int32_t(a)) a=3", 0.999999998370185494423L);
+insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=3", 0.499999999185092747211L);
+insert("u01<float>(maxi64 - int64_t(a)) a=3", 0.500000000000000000000L);
+insert("uneg11<float>(maxi64 - int64_t(a)) a=3", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=3", 0.499999940395355224609L);
+insert("u01<double>(maxi64 - int64_t(a)) a=3", 0.500000000000000000000L);
+insert("uneg11<double>(maxi64 - int64_t(a)) a=3", 1.00000000000000000000L);
+insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=3", 0.499999999999999888978L);
+insert("u01<long double>(maxi64 - int64_t(a)) a=3", 0.499999999999999999810L);
+insert("uneg11<long double>(maxi64 - int64_t(a)) a=3", 0.999999999999999999621L);
+insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=3", 0.499999999999999999837L);
+insert("u01<float>(minu32 + uint32_t(a)) a=4", 1.04773789644241333008e-09L);
+insert("uneg11<float>(minu32 + uint32_t(a)) a=4", 2.09547579288482666016e-09L);
+insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=4", 5.96046447753906250000e-08L);
+insert("u01<double>(minu32 + uint32_t(a)) a=4", 1.04773789644241333008e-09L);
+insert("uneg11<double>(minu32 + uint32_t(a)) a=4", 2.09547579288482666016e-09L);
+insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=4", 1.04773789644241333008e-09L);
+insert("u01<long double>(minu32 + uint32_t(a)) a=4", 1.04773789644241333008e-09L);
+insert("uneg11<long double>(minu32 + uint32_t(a)) a=4", 2.09547579288482666016e-09L);
+insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=4", 1.04773789644241333008e-09L);
+insert("u01<float>(minu64 + uint64_t(a)) a=4", 2.43945488809238497652e-19L);
+insert("uneg11<float>(minu64 + uint64_t(a)) a=4", 4.87890977618476995303e-19L);
+insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=4", 5.96046447753906250000e-08L);
+insert("u01<double>(minu64 + uint64_t(a)) a=4", 2.43945488809238497652e-19L);
+insert("uneg11<double>(minu64 + uint64_t(a)) a=4", 4.87890977618476995303e-19L);
+insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=4", 1.11022302462515654042e-16L);
+insert("u01<long double>(minu64 + uint64_t(a)) a=4", 2.43945488809238497652e-19L);
+insert("uneg11<long double>(minu64 + uint64_t(a)) a=4", 4.87890977618476995303e-19L);
+insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=4", 2.71050543121376108502e-19L);
+insert("u01<float>(mini32 + int32_t(a)) a=4", 0.500000000000000000000L);
+insert("uneg11<float>(mini32 + int32_t(a)) a=4", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini32 + int32_t(a)) a=4", 0.500000059604644775391L);
+insert("u01<double>(mini32 + int32_t(a)) a=4", 0.500000001047737896442L);
+insert("uneg11<double>(mini32 + int32_t(a)) a=4", -0.999999997904524207115L);
+insert("u01fixedpt<double>(mini32 + int32_t(a)) a=4", 0.500000001047737896442L);
+insert("u01<long double>(mini32 + int32_t(a)) a=4", 0.500000001047737896442L);
+insert("uneg11<long double>(mini32 + int32_t(a)) a=4", -0.999999997904524207115L);
+insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=4", 0.500000001047737896442L);
+insert("u01<float>(mini64 + int64_t(a)) a=4", 0.500000000000000000000L);
+insert("uneg11<float>(mini64 + int64_t(a)) a=4", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini64 + int64_t(a)) a=4", 0.500000059604644775391L);
+insert("u01<double>(mini64 + int64_t(a)) a=4", 0.500000000000000000000L);
+insert("uneg11<double>(mini64 + int64_t(a)) a=4", -1.00000000000000000000L);
+insert("u01fixedpt<double>(mini64 + int64_t(a)) a=4", 0.500000000000000111022L);
+insert("u01<long double>(mini64 + int64_t(a)) a=4", 0.500000000000000000217L);
+insert("uneg11<long double>(mini64 + int64_t(a)) a=4", -0.999999999999999999512L);
+insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=4", 0.500000000000000000271L);
+insert("u01<float>(maxu32 - uint32_t(a)) a=4", 1.00000000000000000000L);
+insert("uneg11<float>(maxu32 - uint32_t(a)) a=4", -2.09547579288482666016e-09L);
+insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=4", 0.999999940395355224609L);
+insert("u01<double>(maxu32 - uint32_t(a)) a=4", 0.999999998952262103558L);
+insert("uneg11<double>(maxu32 - uint32_t(a)) a=4", -2.09547579288482666016e-09L);
+insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=4", 0.999999998952262103558L);
+insert("u01<long double>(maxu32 - uint32_t(a)) a=4", 0.999999998952262103558L);
+insert("uneg11<long double>(maxu32 - uint32_t(a)) a=4", -2.09547579288482666016e-09L);
+insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=4", 0.999999998952262103558L);
+insert("u01<float>(maxu64 - uint64_t(a)) a=4", 1.00000000000000000000L);
+insert("uneg11<float>(maxu64 - uint64_t(a)) a=4", -4.87890977618476995303e-19L);
+insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=4", 0.999999940395355224609L);
+insert("u01<double>(maxu64 - uint64_t(a)) a=4", 1.00000000000000000000L);
+insert("uneg11<double>(maxu64 - uint64_t(a)) a=4", -4.87890977618476995303e-19L);
+insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=4", 0.999999999999999888978L);
+insert("u01<long double>(maxu64 - uint64_t(a)) a=4", 0.999999999999999999783L);
+insert("uneg11<long double>(maxu64 - uint64_t(a)) a=4", -4.87890977618476995303e-19L);
+insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=4", 0.999999999999999999729L);
+insert("u01<float>(maxi32 - int32_t(a)) a=4", 0.500000000000000000000L);
+insert("uneg11<float>(maxi32 - int32_t(a)) a=4", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=4", 0.499999940395355224609L);
+insert("u01<double>(maxi32 - int32_t(a)) a=4", 0.499999998952262103558L);
+insert("uneg11<double>(maxi32 - int32_t(a)) a=4", 0.999999997904524207115L);
+insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=4", 0.499999998952262103558L);
+insert("u01<long double>(maxi32 - int32_t(a)) a=4", 0.499999998952262103558L);
+insert("uneg11<long double>(maxi32 - int32_t(a)) a=4", 0.999999997904524207115L);
+insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=4", 0.499999998952262103558L);
+insert("u01<float>(maxi64 - int64_t(a)) a=4", 0.500000000000000000000L);
+insert("uneg11<float>(maxi64 - int64_t(a)) a=4", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=4", 0.499999940395355224609L);
+insert("u01<double>(maxi64 - int64_t(a)) a=4", 0.500000000000000000000L);
+insert("uneg11<double>(maxi64 - int64_t(a)) a=4", 1.00000000000000000000L);
+insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=4", 0.499999999999999888978L);
+insert("u01<long double>(maxi64 - int64_t(a)) a=4", 0.499999999999999999756L);
+insert("uneg11<long double>(maxi64 - int64_t(a)) a=4", 0.999999999999999999512L);
+insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=4", 0.499999999999999999729L);
+insert("u01<float>(minu32 + uint32_t(a)) a=5", 1.28056854009628295898e-09L);
+insert("uneg11<float>(minu32 + uint32_t(a)) a=5", 2.56113708019256591797e-09L);
+insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=5", 5.96046447753906250000e-08L);
+insert("u01<double>(minu32 + uint32_t(a)) a=5", 1.28056854009628295898e-09L);
+insert("uneg11<double>(minu32 + uint32_t(a)) a=5", 2.56113708019256591797e-09L);
+insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=5", 1.28056854009628295898e-09L);
+insert("u01<long double>(minu32 + uint32_t(a)) a=5", 1.28056854009628295898e-09L);
+insert("uneg11<long double>(minu32 + uint32_t(a)) a=5", 2.56113708019256591797e-09L);
+insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=5", 1.28056854009628295898e-09L);
+insert("u01<float>(minu64 + uint64_t(a)) a=5", 2.98155597433513719352e-19L);
+insert("uneg11<float>(minu64 + uint64_t(a)) a=5", 5.96311194867027438704e-19L);
+insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=5", 5.96046447753906250000e-08L);
+insert("u01<double>(minu64 + uint64_t(a)) a=5", 2.98155597433513719352e-19L);
+insert("uneg11<double>(minu64 + uint64_t(a)) a=5", 5.96311194867027438704e-19L);
+insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=5", 1.11022302462515654042e-16L);
+insert("u01<long double>(minu64 + uint64_t(a)) a=5", 2.98155597433513719352e-19L);
+insert("uneg11<long double>(minu64 + uint64_t(a)) a=5", 5.96311194867027438704e-19L);
+insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=5", 2.71050543121376108502e-19L);
+insert("u01<float>(mini32 + int32_t(a)) a=5", 0.500000000000000000000L);
+insert("uneg11<float>(mini32 + int32_t(a)) a=5", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini32 + int32_t(a)) a=5", 0.500000059604644775391L);
+insert("u01<double>(mini32 + int32_t(a)) a=5", 0.500000001280568540096L);
+insert("uneg11<double>(mini32 + int32_t(a)) a=5", -0.999999997438862919807L);
+insert("u01fixedpt<double>(mini32 + int32_t(a)) a=5", 0.500000001280568540096L);
+insert("u01<long double>(mini32 + int32_t(a)) a=5", 0.500000001280568540096L);
+insert("uneg11<long double>(mini32 + int32_t(a)) a=5", -0.999999997438862919807L);
+insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=5", 0.500000001280568540096L);
+insert("u01<float>(mini64 + int64_t(a)) a=5", 0.500000000000000000000L);
+insert("uneg11<float>(mini64 + int64_t(a)) a=5", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini64 + int64_t(a)) a=5", 0.500000059604644775391L);
+insert("u01<double>(mini64 + int64_t(a)) a=5", 0.500000000000000000000L);
+insert("uneg11<double>(mini64 + int64_t(a)) a=5", -1.00000000000000000000L);
+insert("u01fixedpt<double>(mini64 + int64_t(a)) a=5", 0.500000000000000111022L);
+insert("u01<long double>(mini64 + int64_t(a)) a=5", 0.500000000000000000325L);
+insert("uneg11<long double>(mini64 + int64_t(a)) a=5", -0.999999999999999999404L);
+insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=5", 0.500000000000000000271L);
+insert("u01<float>(maxu32 - uint32_t(a)) a=5", 1.00000000000000000000L);
+insert("uneg11<float>(maxu32 - uint32_t(a)) a=5", -2.56113708019256591797e-09L);
+insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=5", 0.999999940395355224609L);
+insert("u01<double>(maxu32 - uint32_t(a)) a=5", 0.999999998719431459904L);
+insert("uneg11<double>(maxu32 - uint32_t(a)) a=5", -2.56113708019256591797e-09L);
+insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=5", 0.999999998719431459904L);
+insert("u01<long double>(maxu32 - uint32_t(a)) a=5", 0.999999998719431459904L);
+insert("uneg11<long double>(maxu32 - uint32_t(a)) a=5", -2.56113708019256591797e-09L);
+insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=5", 0.999999998719431459904L);
+insert("u01<float>(maxu64 - uint64_t(a)) a=5", 1.00000000000000000000L);
+insert("uneg11<float>(maxu64 - uint64_t(a)) a=5", -5.96311194867027438704e-19L);
+insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=5", 0.999999940395355224609L);
+insert("u01<double>(maxu64 - uint64_t(a)) a=5", 1.00000000000000000000L);
+insert("uneg11<double>(maxu64 - uint64_t(a)) a=5", -5.96311194867027438704e-19L);
+insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=5", 0.999999999999999888978L);
+insert("u01<long double>(maxu64 - uint64_t(a)) a=5", 0.999999999999999999675L);
+insert("uneg11<long double>(maxu64 - uint64_t(a)) a=5", -5.96311194867027438704e-19L);
+insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=5", 0.999999999999999999729L);
+insert("u01<float>(maxi32 - int32_t(a)) a=5", 0.500000000000000000000L);
+insert("uneg11<float>(maxi32 - int32_t(a)) a=5", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=5", 0.499999940395355224609L);
+insert("u01<double>(maxi32 - int32_t(a)) a=5", 0.499999998719431459904L);
+insert("uneg11<double>(maxi32 - int32_t(a)) a=5", 0.999999997438862919807L);
+insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=5", 0.499999998719431459904L);
+insert("u01<long double>(maxi32 - int32_t(a)) a=5", 0.499999998719431459904L);
+insert("uneg11<long double>(maxi32 - int32_t(a)) a=5", 0.999999997438862919807L);
+insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=5", 0.499999998719431459904L);
+insert("u01<float>(maxi64 - int64_t(a)) a=5", 0.500000000000000000000L);
+insert("uneg11<float>(maxi64 - int64_t(a)) a=5", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=5", 0.499999940395355224609L);
+insert("u01<double>(maxi64 - int64_t(a)) a=5", 0.500000000000000000000L);
+insert("uneg11<double>(maxi64 - int64_t(a)) a=5", 1.00000000000000000000L);
+insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=5", 0.499999999999999888978L);
+insert("u01<long double>(maxi64 - int64_t(a)) a=5", 0.499999999999999999702L);
+insert("uneg11<long double>(maxi64 - int64_t(a)) a=5", 0.999999999999999999404L);
+insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=5", 0.499999999999999999729L);
+insert("u01<float>(minu32 + uint32_t(a)) a=63", 1.47847458720207214355e-08L);
+insert("uneg11<float>(minu32 + uint32_t(a)) a=63", 2.95694917440414428711e-08L);
+insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=63", 5.96046447753906250000e-08L);
+insert("u01<double>(minu32 + uint32_t(a)) a=63", 1.47847458720207214355e-08L);
+insert("uneg11<double>(minu32 + uint32_t(a)) a=63", 2.95694917440414428711e-08L);
+insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=63", 1.47847458720207214355e-08L);
+insert("u01<long double>(minu32 + uint32_t(a)) a=63", 1.47847458720207214355e-08L);
+insert("uneg11<long double>(minu32 + uint32_t(a)) a=63", 2.95694917440414428711e-08L);
+insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=63", 1.47847458720207214355e-08L);
+insert("u01<float>(minu64 + uint64_t(a)) a=63", 3.44234189764147657797e-18L);
+insert("uneg11<float>(minu64 + uint64_t(a)) a=63", 6.88468379528295315595e-18L);
+insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=63", 5.96046447753906250000e-08L);
+insert("u01<double>(minu64 + uint64_t(a)) a=63", 3.44234189764147657797e-18L);
+insert("uneg11<double>(minu64 + uint64_t(a)) a=63", 6.88468379528295315595e-18L);
+insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=63", 1.11022302462515654042e-16L);
+insert("u01<long double>(minu64 + uint64_t(a)) a=63", 3.44234189764147657797e-18L);
+insert("uneg11<long double>(minu64 + uint64_t(a)) a=63", 6.88468379528295315595e-18L);
+insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=63", 3.41523684332933896712e-18L);
+insert("u01<float>(mini32 + int32_t(a)) a=63", 0.500000000000000000000L);
+insert("uneg11<float>(mini32 + int32_t(a)) a=63", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini32 + int32_t(a)) a=63", 0.500000059604644775391L);
+insert("u01<double>(mini32 + int32_t(a)) a=63", 0.500000014784745872021L);
+insert("uneg11<double>(mini32 + int32_t(a)) a=63", -0.999999970430508255959L);
+insert("u01fixedpt<double>(mini32 + int32_t(a)) a=63", 0.500000014784745872021L);
+insert("u01<long double>(mini32 + int32_t(a)) a=63", 0.500000014784745872021L);
+insert("uneg11<long double>(mini32 + int32_t(a)) a=63", -0.999999970430508255959L);
+insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=63", 0.500000014784745872021L);
+insert("u01<float>(mini64 + int64_t(a)) a=63", 0.500000000000000000000L);
+insert("uneg11<float>(mini64 + int64_t(a)) a=63", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini64 + int64_t(a)) a=63", 0.500000059604644775391L);
+insert("u01<double>(mini64 + int64_t(a)) a=63", 0.500000000000000000000L);
+insert("uneg11<double>(mini64 + int64_t(a)) a=63", -1.00000000000000000000L);
+insert("u01fixedpt<double>(mini64 + int64_t(a)) a=63", 0.500000000000000111022L);
+insert("u01<long double>(mini64 + int64_t(a)) a=63", 0.500000000000000003469L);
+insert("uneg11<long double>(mini64 + int64_t(a)) a=63", -0.999999999999999993115L);
+insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=63", 0.500000000000000003415L);
+insert("u01<float>(maxu32 - uint32_t(a)) a=63", 1.00000000000000000000L);
+insert("uneg11<float>(maxu32 - uint32_t(a)) a=63", -2.95694917440414428711e-08L);
+insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=63", 0.999999940395355224609L);
+insert("u01<double>(maxu32 - uint32_t(a)) a=63", 0.999999985215254127979L);
+insert("uneg11<double>(maxu32 - uint32_t(a)) a=63", -2.95694917440414428711e-08L);
+insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=63", 0.999999985215254127979L);
+insert("u01<long double>(maxu32 - uint32_t(a)) a=63", 0.999999985215254127979L);
+insert("uneg11<long double>(maxu32 - uint32_t(a)) a=63", -2.95694917440414428711e-08L);
+insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=63", 0.999999985215254127979L);
+insert("u01<float>(maxu64 - uint64_t(a)) a=63", 1.00000000000000000000L);
+insert("uneg11<float>(maxu64 - uint64_t(a)) a=63", -6.88468379528295315595e-18L);
+insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=63", 0.999999940395355224609L);
+insert("u01<double>(maxu64 - uint64_t(a)) a=63", 1.00000000000000000000L);
+insert("uneg11<double>(maxu64 - uint64_t(a)) a=63", -6.88468379528295315595e-18L);
+insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=63", 0.999999999999999888978L);
+insert("u01<long double>(maxu64 - uint64_t(a)) a=63", 0.999999999999999996531L);
+insert("uneg11<long double>(maxu64 - uint64_t(a)) a=63", -6.88468379528295315595e-18L);
+insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=63", 0.999999999999999996585L);
+insert("u01<float>(maxi32 - int32_t(a)) a=63", 0.500000000000000000000L);
+insert("uneg11<float>(maxi32 - int32_t(a)) a=63", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=63", 0.499999940395355224609L);
+insert("u01<double>(maxi32 - int32_t(a)) a=63", 0.499999985215254127979L);
+insert("uneg11<double>(maxi32 - int32_t(a)) a=63", 0.999999970430508255959L);
+insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=63", 0.499999985215254127979L);
+insert("u01<long double>(maxi32 - int32_t(a)) a=63", 0.499999985215254127979L);
+insert("uneg11<long double>(maxi32 - int32_t(a)) a=63", 0.999999970430508255959L);
+insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=63", 0.499999985215254127979L);
+insert("u01<float>(maxi64 - int64_t(a)) a=63", 0.500000000000000000000L);
+insert("uneg11<float>(maxi64 - int64_t(a)) a=63", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=63", 0.499999940395355224609L);
+insert("u01<double>(maxi64 - int64_t(a)) a=63", 0.500000000000000000000L);
+insert("uneg11<double>(maxi64 - int64_t(a)) a=63", 1.00000000000000000000L);
+insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=63", 0.499999999999999888978L);
+insert("u01<long double>(maxi64 - int64_t(a)) a=63", 0.499999999999999996558L);
+insert("uneg11<long double>(maxi64 - int64_t(a)) a=63", 0.999999999999999993115L);
+insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=63", 0.499999999999999996585L);
+insert("u01<float>(minu32 + uint32_t(a)) a=64", 1.50175765156745910645e-08L);
+insert("uneg11<float>(minu32 + uint32_t(a)) a=64", 3.00351530313491821289e-08L);
+insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=64", 5.96046447753906250000e-08L);
+insert("u01<double>(minu32 + uint32_t(a)) a=64", 1.50175765156745910645e-08L);
+insert("uneg11<double>(minu32 + uint32_t(a)) a=64", 3.00351530313491821289e-08L);
+insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=64", 1.50175765156745910645e-08L);
+insert("u01<long double>(minu32 + uint32_t(a)) a=64", 1.50175765156745910645e-08L);
+insert("uneg11<long double>(minu32 + uint32_t(a)) a=64", 3.00351530313491821289e-08L);
+insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=64", 1.50175765156745910645e-08L);
+insert("u01<float>(minu64 + uint64_t(a)) a=64", 3.49655200626575179967e-18L);
+insert("uneg11<float>(minu64 + uint64_t(a)) a=64", 6.99310401253150359935e-18L);
+insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=64", 5.96046447753906250000e-08L);
+insert("u01<double>(minu64 + uint64_t(a)) a=64", 3.49655200626575179967e-18L);
+insert("uneg11<double>(minu64 + uint64_t(a)) a=64", 6.99310401253150359935e-18L);
+insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=64", 1.11022302462515654042e-16L);
+insert("u01<long double>(minu64 + uint64_t(a)) a=64", 3.49655200626575179967e-18L);
+insert("uneg11<long double>(minu64 + uint64_t(a)) a=64", 6.99310401253150359935e-18L);
+insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=64", 3.52365706057788941052e-18L);
+insert("u01<float>(mini32 + int32_t(a)) a=64", 0.500000000000000000000L);
+insert("uneg11<float>(mini32 + int32_t(a)) a=64", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini32 + int32_t(a)) a=64", 0.500000059604644775391L);
+insert("u01<double>(mini32 + int32_t(a)) a=64", 0.500000015017576515675L);
+insert("uneg11<double>(mini32 + int32_t(a)) a=64", -0.999999969964846968651L);
+insert("u01fixedpt<double>(mini32 + int32_t(a)) a=64", 0.500000015017576515675L);
+insert("u01<long double>(mini32 + int32_t(a)) a=64", 0.500000015017576515675L);
+insert("uneg11<long double>(mini32 + int32_t(a)) a=64", -0.999999969964846968651L);
+insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=64", 0.500000015017576515675L);
+insert("u01<float>(mini64 + int64_t(a)) a=64", 0.500000000000000000000L);
+insert("uneg11<float>(mini64 + int64_t(a)) a=64", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini64 + int64_t(a)) a=64", 0.500000059604644775391L);
+insert("u01<double>(mini64 + int64_t(a)) a=64", 0.500000000000000000000L);
+insert("uneg11<double>(mini64 + int64_t(a)) a=64", -1.00000000000000000000L);
+insert("u01fixedpt<double>(mini64 + int64_t(a)) a=64", 0.500000000000000111022L);
+insert("u01<long double>(mini64 + int64_t(a)) a=64", 0.500000000000000003469L);
+insert("uneg11<long double>(mini64 + int64_t(a)) a=64", -0.999999999999999993007L);
+insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=64", 0.500000000000000003524L);
+insert("u01<float>(maxu32 - uint32_t(a)) a=64", 1.00000000000000000000L);
+insert("uneg11<float>(maxu32 - uint32_t(a)) a=64", -3.00351530313491821289e-08L);
+insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=64", 0.999999940395355224609L);
+insert("u01<double>(maxu32 - uint32_t(a)) a=64", 0.999999984982423484325L);
+insert("uneg11<double>(maxu32 - uint32_t(a)) a=64", -3.00351530313491821289e-08L);
+insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=64", 0.999999984982423484325L);
+insert("u01<long double>(maxu32 - uint32_t(a)) a=64", 0.999999984982423484325L);
+insert("uneg11<long double>(maxu32 - uint32_t(a)) a=64", -3.00351530313491821289e-08L);
+insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=64", 0.999999984982423484325L);
+insert("u01<float>(maxu64 - uint64_t(a)) a=64", 1.00000000000000000000L);
+insert("uneg11<float>(maxu64 - uint64_t(a)) a=64", -6.99310401253150359935e-18L);
+insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=64", 0.999999940395355224609L);
+insert("u01<double>(maxu64 - uint64_t(a)) a=64", 1.00000000000000000000L);
+insert("uneg11<double>(maxu64 - uint64_t(a)) a=64", -6.99310401253150359935e-18L);
+insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=64", 0.999999999999999888978L);
+insert("u01<long double>(maxu64 - uint64_t(a)) a=64", 0.999999999999999996531L);
+insert("uneg11<long double>(maxu64 - uint64_t(a)) a=64", -6.99310401253150359935e-18L);
+insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=64", 0.999999999999999996476L);
+insert("u01<float>(maxi32 - int32_t(a)) a=64", 0.499999970197677612305L);
+insert("uneg11<float>(maxi32 - int32_t(a)) a=64", 0.999999940395355224609L);
+insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=64", 0.499999940395355224609L);
+insert("u01<double>(maxi32 - int32_t(a)) a=64", 0.499999984982423484325L);
+insert("uneg11<double>(maxi32 - int32_t(a)) a=64", 0.999999969964846968651L);
+insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=64", 0.499999984982423484325L);
+insert("u01<long double>(maxi32 - int32_t(a)) a=64", 0.499999984982423484325L);
+insert("uneg11<long double>(maxi32 - int32_t(a)) a=64", 0.999999969964846968651L);
+insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=64", 0.499999984982423484325L);
+insert("u01<float>(maxi64 - int64_t(a)) a=64", 0.500000000000000000000L);
+insert("uneg11<float>(maxi64 - int64_t(a)) a=64", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=64", 0.499999940395355224609L);
+insert("u01<double>(maxi64 - int64_t(a)) a=64", 0.500000000000000000000L);
+insert("uneg11<double>(maxi64 - int64_t(a)) a=64", 1.00000000000000000000L);
+insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=64", 0.499999999999999888978L);
+insert("u01<long double>(maxi64 - int64_t(a)) a=64", 0.499999999999999996503L);
+insert("uneg11<long double>(maxi64 - int64_t(a)) a=64", 0.999999999999999993007L);
+insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=64", 0.499999999999999996476L);
+insert("u01<float>(minu32 + uint32_t(a)) a=65", 1.52504071593284606934e-08L);
+insert("uneg11<float>(minu32 + uint32_t(a)) a=65", 3.05008143186569213867e-08L);
+insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=65", 5.96046447753906250000e-08L);
+insert("u01<double>(minu32 + uint32_t(a)) a=65", 1.52504071593284606934e-08L);
+insert("uneg11<double>(minu32 + uint32_t(a)) a=65", 3.05008143186569213867e-08L);
+insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=65", 1.52504071593284606934e-08L);
+insert("u01<long double>(minu32 + uint32_t(a)) a=65", 1.52504071593284606934e-08L);
+insert("uneg11<long double>(minu32 + uint32_t(a)) a=65", 3.05008143186569213867e-08L);
+insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=65", 1.52504071593284606934e-08L);
+insert("u01<float>(minu64 + uint64_t(a)) a=65", 3.55076211489002702137e-18L);
+insert("uneg11<float>(minu64 + uint64_t(a)) a=65", 7.10152422978005404275e-18L);
+insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=65", 5.96046447753906250000e-08L);
+insert("u01<double>(minu64 + uint64_t(a)) a=65", 3.55076211489002702137e-18L);
+insert("uneg11<double>(minu64 + uint64_t(a)) a=65", 7.10152422978005404275e-18L);
+insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=65", 1.11022302462515654042e-16L);
+insert("u01<long double>(minu64 + uint64_t(a)) a=65", 3.55076211489002702137e-18L);
+insert("uneg11<long double>(minu64 + uint64_t(a)) a=65", 7.10152422978005404275e-18L);
+insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=65", 3.52365706057788941052e-18L);
+insert("u01<float>(mini32 + int32_t(a)) a=65", 0.500000000000000000000L);
+insert("uneg11<float>(mini32 + int32_t(a)) a=65", -0.999999940395355224609L);
+insert("u01fixedpt<float>(mini32 + int32_t(a)) a=65", 0.500000059604644775391L);
+insert("u01<double>(mini32 + int32_t(a)) a=65", 0.500000015250407159328L);
+insert("uneg11<double>(mini32 + int32_t(a)) a=65", -0.999999969499185681343L);
+insert("u01fixedpt<double>(mini32 + int32_t(a)) a=65", 0.500000015250407159328L);
+insert("u01<long double>(mini32 + int32_t(a)) a=65", 0.500000015250407159328L);
+insert("uneg11<long double>(mini32 + int32_t(a)) a=65", -0.999999969499185681343L);
+insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=65", 0.500000015250407159328L);
+insert("u01<float>(mini64 + int64_t(a)) a=65", 0.500000000000000000000L);
+insert("uneg11<float>(mini64 + int64_t(a)) a=65", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini64 + int64_t(a)) a=65", 0.500000059604644775391L);
+insert("u01<double>(mini64 + int64_t(a)) a=65", 0.500000000000000000000L);
+insert("uneg11<double>(mini64 + int64_t(a)) a=65", -1.00000000000000000000L);
+insert("u01fixedpt<double>(mini64 + int64_t(a)) a=65", 0.500000000000000111022L);
+insert("u01<long double>(mini64 + int64_t(a)) a=65", 0.500000000000000003578L);
+insert("uneg11<long double>(mini64 + int64_t(a)) a=65", -0.999999999999999992898L);
+insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=65", 0.500000000000000003524L);
+insert("u01<float>(maxu32 - uint32_t(a)) a=65", 1.00000000000000000000L);
+insert("uneg11<float>(maxu32 - uint32_t(a)) a=65", -3.05008143186569213867e-08L);
+insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=65", 0.999999940395355224609L);
+insert("u01<double>(maxu32 - uint32_t(a)) a=65", 0.999999984749592840672L);
+insert("uneg11<double>(maxu32 - uint32_t(a)) a=65", -3.05008143186569213867e-08L);
+insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=65", 0.999999984749592840672L);
+insert("u01<long double>(maxu32 - uint32_t(a)) a=65", 0.999999984749592840672L);
+insert("uneg11<long double>(maxu32 - uint32_t(a)) a=65", -3.05008143186569213867e-08L);
+insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=65", 0.999999984749592840672L);
+insert("u01<float>(maxu64 - uint64_t(a)) a=65", 1.00000000000000000000L);
+insert("uneg11<float>(maxu64 - uint64_t(a)) a=65", -7.10152422978005404275e-18L);
+insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=65", 0.999999940395355224609L);
+insert("u01<double>(maxu64 - uint64_t(a)) a=65", 1.00000000000000000000L);
+insert("uneg11<double>(maxu64 - uint64_t(a)) a=65", -7.10152422978005404275e-18L);
+insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=65", 0.999999999999999888978L);
+insert("u01<long double>(maxu64 - uint64_t(a)) a=65", 0.999999999999999996422L);
+insert("uneg11<long double>(maxu64 - uint64_t(a)) a=65", -7.10152422978005404275e-18L);
+insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=65", 0.999999999999999996476L);
+insert("u01<float>(maxi32 - int32_t(a)) a=65", 0.499999970197677612305L);
+insert("uneg11<float>(maxi32 - int32_t(a)) a=65", 0.999999940395355224609L);
+insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=65", 0.499999940395355224609L);
+insert("u01<double>(maxi32 - int32_t(a)) a=65", 0.499999984749592840672L);
+insert("uneg11<double>(maxi32 - int32_t(a)) a=65", 0.999999969499185681343L);
+insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=65", 0.499999984749592840672L);
+insert("u01<long double>(maxi32 - int32_t(a)) a=65", 0.499999984749592840672L);
+insert("uneg11<long double>(maxi32 - int32_t(a)) a=65", 0.999999969499185681343L);
+insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=65", 0.499999984749592840672L);
+insert("u01<float>(maxi64 - int64_t(a)) a=65", 0.500000000000000000000L);
+insert("uneg11<float>(maxi64 - int64_t(a)) a=65", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=65", 0.499999940395355224609L);
+insert("u01<double>(maxi64 - int64_t(a)) a=65", 0.500000000000000000000L);
+insert("uneg11<double>(maxi64 - int64_t(a)) a=65", 1.00000000000000000000L);
+insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=65", 0.499999999999999888978L);
+insert("u01<long double>(maxi64 - int64_t(a)) a=65", 0.499999999999999996449L);
+insert("uneg11<long double>(maxi64 - int64_t(a)) a=65", 0.999999999999999992898L);
+insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=65", 0.499999999999999996476L);
+insert("u01<float>(minu32 + uint32_t(a)) a=127", 2.96859070658683776855e-08L);
+insert("uneg11<float>(minu32 + uint32_t(a)) a=127", 5.93718141317367553711e-08L);
+insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=127", 5.96046447753906250000e-08L);
+insert("u01<double>(minu32 + uint32_t(a)) a=127", 2.96859070658683776855e-08L);
+insert("uneg11<double>(minu32 + uint32_t(a)) a=127", 5.93718141317367553711e-08L);
+insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=127", 2.96859070658683776855e-08L);
+insert("u01<long double>(minu32 + uint32_t(a)) a=127", 2.96859070658683776855e-08L);
+insert("uneg11<long double>(minu32 + uint32_t(a)) a=127", 5.93718141317367553711e-08L);
+insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=127", 2.96859070658683776855e-08L);
+insert("u01<float>(minu64 + uint64_t(a)) a=127", 6.91178884959509076680e-18L);
+insert("uneg11<float>(minu64 + uint64_t(a)) a=127", 1.38235776991901815336e-17L);
+insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=127", 5.96046447753906250000e-08L);
+insert("u01<double>(minu64 + uint64_t(a)) a=127", 6.91178884959509076680e-18L);
+insert("uneg11<double>(minu64 + uint64_t(a)) a=127", 1.38235776991901815336e-17L);
+insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=127", 1.11022302462515654042e-16L);
+insert("u01<long double>(minu64 + uint64_t(a)) a=127", 6.91178884959509076680e-18L);
+insert("uneg11<long double>(minu64 + uint64_t(a)) a=127", 1.38235776991901815336e-17L);
+insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=127", 6.88468379528295315595e-18L);
+insert("u01<float>(mini32 + int32_t(a)) a=127", 0.500000000000000000000L);
+insert("uneg11<float>(mini32 + int32_t(a)) a=127", -0.999999940395355224609L);
+insert("u01fixedpt<float>(mini32 + int32_t(a)) a=127", 0.500000059604644775391L);
+insert("u01<double>(mini32 + int32_t(a)) a=127", 0.500000029685907065868L);
+insert("uneg11<double>(mini32 + int32_t(a)) a=127", -0.999999940628185868263L);
+insert("u01fixedpt<double>(mini32 + int32_t(a)) a=127", 0.500000029685907065868L);
+insert("u01<long double>(mini32 + int32_t(a)) a=127", 0.500000029685907065868L);
+insert("uneg11<long double>(mini32 + int32_t(a)) a=127", -0.999999940628185868263L);
+insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=127", 0.500000029685907065868L);
+insert("u01<float>(mini64 + int64_t(a)) a=127", 0.500000000000000000000L);
+insert("uneg11<float>(mini64 + int64_t(a)) a=127", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini64 + int64_t(a)) a=127", 0.500000059604644775391L);
+insert("u01<double>(mini64 + int64_t(a)) a=127", 0.500000000000000000000L);
+insert("uneg11<double>(mini64 + int64_t(a)) a=127", -1.00000000000000000000L);
+insert("u01fixedpt<double>(mini64 + int64_t(a)) a=127", 0.500000000000000111022L);
+insert("u01<long double>(mini64 + int64_t(a)) a=127", 0.500000000000000006939L);
+insert("uneg11<long double>(mini64 + int64_t(a)) a=127", -0.999999999999999986176L);
+insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=127", 0.500000000000000006885L);
+insert("u01<float>(maxu32 - uint32_t(a)) a=127", 1.00000000000000000000L);
+insert("uneg11<float>(maxu32 - uint32_t(a)) a=127", -5.93718141317367553711e-08L);
+insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=127", 0.999999940395355224609L);
+insert("u01<double>(maxu32 - uint32_t(a)) a=127", 0.999999970314092934132L);
+insert("uneg11<double>(maxu32 - uint32_t(a)) a=127", -5.93718141317367553711e-08L);
+insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=127", 0.999999970314092934132L);
+insert("u01<long double>(maxu32 - uint32_t(a)) a=127", 0.999999970314092934132L);
+insert("uneg11<long double>(maxu32 - uint32_t(a)) a=127", -5.93718141317367553711e-08L);
+insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=127", 0.999999970314092934132L);
+insert("u01<float>(maxu64 - uint64_t(a)) a=127", 1.00000000000000000000L);
+insert("uneg11<float>(maxu64 - uint64_t(a)) a=127", -1.38235776991901815336e-17L);
+insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=127", 0.999999940395355224609L);
+insert("u01<double>(maxu64 - uint64_t(a)) a=127", 1.00000000000000000000L);
+insert("uneg11<double>(maxu64 - uint64_t(a)) a=127", -1.38235776991901815336e-17L);
+insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=127", 0.999999999999999888978L);
+insert("u01<long double>(maxu64 - uint64_t(a)) a=127", 0.999999999999999993061L);
+insert("uneg11<long double>(maxu64 - uint64_t(a)) a=127", -1.38235776991901815336e-17L);
+insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=127", 0.999999999999999993115L);
+insert("u01<float>(maxi32 - int32_t(a)) a=127", 0.499999970197677612305L);
+insert("uneg11<float>(maxi32 - int32_t(a)) a=127", 0.999999940395355224609L);
+insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=127", 0.499999940395355224609L);
+insert("u01<double>(maxi32 - int32_t(a)) a=127", 0.499999970314092934132L);
+insert("uneg11<double>(maxi32 - int32_t(a)) a=127", 0.999999940628185868263L);
+insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=127", 0.499999970314092934132L);
+insert("u01<long double>(maxi32 - int32_t(a)) a=127", 0.499999970314092934132L);
+insert("uneg11<long double>(maxi32 - int32_t(a)) a=127", 0.999999940628185868263L);
+insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=127", 0.499999970314092934132L);
+insert("u01<float>(maxi64 - int64_t(a)) a=127", 0.500000000000000000000L);
+insert("uneg11<float>(maxi64 - int64_t(a)) a=127", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=127", 0.499999940395355224609L);
+insert("u01<double>(maxi64 - int64_t(a)) a=127", 0.500000000000000000000L);
+insert("uneg11<double>(maxi64 - int64_t(a)) a=127", 1.00000000000000000000L);
+insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=127", 0.499999999999999888978L);
+insert("u01<long double>(maxi64 - int64_t(a)) a=127", 0.499999999999999993088L);
+insert("uneg11<long double>(maxi64 - int64_t(a)) a=127", 0.999999999999999986176L);
+insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=127", 0.499999999999999993115L);
+insert("u01<float>(minu32 + uint32_t(a)) a=128", 2.99187377095222473145e-08L);
+insert("uneg11<float>(minu32 + uint32_t(a)) a=128", 5.98374754190444946289e-08L);
+insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=128", 5.96046447753906250000e-08L);
+insert("u01<double>(minu32 + uint32_t(a)) a=128", 2.99187377095222473145e-08L);
+insert("uneg11<double>(minu32 + uint32_t(a)) a=128", 5.98374754190444946289e-08L);
+insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=128", 2.99187377095222473145e-08L);
+insert("u01<long double>(minu32 + uint32_t(a)) a=128", 2.99187377095222473145e-08L);
+insert("uneg11<long double>(minu32 + uint32_t(a)) a=128", 5.98374754190444946289e-08L);
+insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=128", 2.99187377095222473145e-08L);
+insert("u01<float>(minu64 + uint64_t(a)) a=128", 6.96599895821936598850e-18L);
+insert("uneg11<float>(minu64 + uint64_t(a)) a=128", 1.39319979164387319770e-17L);
+insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=128", 5.96046447753906250000e-08L);
+insert("u01<double>(minu64 + uint64_t(a)) a=128", 6.96599895821936598850e-18L);
+insert("uneg11<double>(minu64 + uint64_t(a)) a=128", 1.39319979164387319770e-17L);
+insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=128", 1.11022302462515654042e-16L);
+insert("u01<long double>(minu64 + uint64_t(a)) a=128", 6.96599895821936598850e-18L);
+insert("uneg11<long double>(minu64 + uint64_t(a)) a=128", 1.39319979164387319770e-17L);
+insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=128", 6.99310401253150359935e-18L);
+insert("u01<float>(mini32 + int32_t(a)) a=128", 0.500000000000000000000L);
+insert("uneg11<float>(mini32 + int32_t(a)) a=128", -0.999999940395355224609L);
+insert("u01fixedpt<float>(mini32 + int32_t(a)) a=128", 0.500000059604644775391L);
+insert("u01<double>(mini32 + int32_t(a)) a=128", 0.500000029918737709522L);
+insert("uneg11<double>(mini32 + int32_t(a)) a=128", -0.999999940162524580956L);
+insert("u01fixedpt<double>(mini32 + int32_t(a)) a=128", 0.500000029918737709522L);
+insert("u01<long double>(mini32 + int32_t(a)) a=128", 0.500000029918737709522L);
+insert("uneg11<long double>(mini32 + int32_t(a)) a=128", -0.999999940162524580956L);
+insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=128", 0.500000029918737709522L);
+insert("u01<float>(mini64 + int64_t(a)) a=128", 0.500000000000000000000L);
+insert("uneg11<float>(mini64 + int64_t(a)) a=128", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini64 + int64_t(a)) a=128", 0.500000059604644775391L);
+insert("u01<double>(mini64 + int64_t(a)) a=128", 0.500000000000000000000L);
+insert("uneg11<double>(mini64 + int64_t(a)) a=128", -1.00000000000000000000L);
+insert("u01fixedpt<double>(mini64 + int64_t(a)) a=128", 0.500000000000000111022L);
+insert("u01<long double>(mini64 + int64_t(a)) a=128", 0.500000000000000006939L);
+insert("uneg11<long double>(mini64 + int64_t(a)) a=128", -0.999999999999999986068L);
+insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=128", 0.500000000000000006993L);
+insert("u01<float>(maxu32 - uint32_t(a)) a=128", 0.999999940395355224609L);
+insert("uneg11<float>(maxu32 - uint32_t(a)) a=128", -5.98374754190444946289e-08L);
+insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=128", 0.999999940395355224609L);
+insert("u01<double>(maxu32 - uint32_t(a)) a=128", 0.999999970081262290478L);
+insert("uneg11<double>(maxu32 - uint32_t(a)) a=128", -5.98374754190444946289e-08L);
+insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=128", 0.999999970081262290478L);
+insert("u01<long double>(maxu32 - uint32_t(a)) a=128", 0.999999970081262290478L);
+insert("uneg11<long double>(maxu32 - uint32_t(a)) a=128", -5.98374754190444946289e-08L);
+insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=128", 0.999999970081262290478L);
+insert("u01<float>(maxu64 - uint64_t(a)) a=128", 1.00000000000000000000L);
+insert("uneg11<float>(maxu64 - uint64_t(a)) a=128", -1.39319979164387319770e-17L);
+insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=128", 0.999999940395355224609L);
+insert("u01<double>(maxu64 - uint64_t(a)) a=128", 1.00000000000000000000L);
+insert("uneg11<double>(maxu64 - uint64_t(a)) a=128", -1.39319979164387319770e-17L);
+insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=128", 0.999999999999999888978L);
+insert("u01<long double>(maxu64 - uint64_t(a)) a=128", 0.999999999999999993061L);
+insert("uneg11<long double>(maxu64 - uint64_t(a)) a=128", -1.39319979164387319770e-17L);
+insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=128", 0.999999999999999993007L);
+insert("u01<float>(maxi32 - int32_t(a)) a=128", 0.499999970197677612305L);
+insert("uneg11<float>(maxi32 - int32_t(a)) a=128", 0.999999940395355224609L);
+insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=128", 0.499999940395355224609L);
+insert("u01<double>(maxi32 - int32_t(a)) a=128", 0.499999970081262290478L);
+insert("uneg11<double>(maxi32 - int32_t(a)) a=128", 0.999999940162524580956L);
+insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=128", 0.499999970081262290478L);
+insert("u01<long double>(maxi32 - int32_t(a)) a=128", 0.499999970081262290478L);
+insert("uneg11<long double>(maxi32 - int32_t(a)) a=128", 0.999999940162524580956L);
+insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=128", 0.499999970081262290478L);
+insert("u01<float>(maxi64 - int64_t(a)) a=128", 0.500000000000000000000L);
+insert("uneg11<float>(maxi64 - int64_t(a)) a=128", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=128", 0.499999940395355224609L);
+insert("u01<double>(maxi64 - int64_t(a)) a=128", 0.500000000000000000000L);
+insert("uneg11<double>(maxi64 - int64_t(a)) a=128", 1.00000000000000000000L);
+insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=128", 0.499999999999999888978L);
+insert("u01<long double>(maxi64 - int64_t(a)) a=128", 0.499999999999999993034L);
+insert("uneg11<long double>(maxi64 - int64_t(a)) a=128", 0.999999999999999986068L);
+insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=128", 0.499999999999999993007L);
+insert("u01<float>(minu32 + uint32_t(a)) a=129", 3.01515683531761169434e-08L);
+insert("uneg11<float>(minu32 + uint32_t(a)) a=129", 6.03031367063522338867e-08L);
+insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=129", 5.96046447753906250000e-08L);
+insert("u01<double>(minu32 + uint32_t(a)) a=129", 3.01515683531761169434e-08L);
+insert("uneg11<double>(minu32 + uint32_t(a)) a=129", 6.03031367063522338867e-08L);
+insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=129", 3.01515683531761169434e-08L);
+insert("u01<long double>(minu32 + uint32_t(a)) a=129", 3.01515683531761169434e-08L);
+insert("uneg11<long double>(minu32 + uint32_t(a)) a=129", 6.03031367063522338867e-08L);
+insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=129", 3.01515683531761169434e-08L);
+insert("u01<float>(minu64 + uint64_t(a)) a=129", 7.02020906684364121020e-18L);
+insert("uneg11<float>(minu64 + uint64_t(a)) a=129", 1.40404181336872824204e-17L);
+insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=129", 5.96046447753906250000e-08L);
+insert("u01<double>(minu64 + uint64_t(a)) a=129", 7.02020906684364121020e-18L);
+insert("uneg11<double>(minu64 + uint64_t(a)) a=129", 1.40404181336872824204e-17L);
+insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=129", 1.11022302462515654042e-16L);
+insert("u01<long double>(minu64 + uint64_t(a)) a=129", 7.02020906684364121020e-18L);
+insert("uneg11<long double>(minu64 + uint64_t(a)) a=129", 1.40404181336872824204e-17L);
+insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=129", 6.99310401253150359935e-18L);
+insert("u01<float>(mini32 + int32_t(a)) a=129", 0.500000059604644775391L);
+insert("uneg11<float>(mini32 + int32_t(a)) a=129", -0.999999940395355224609L);
+insert("u01fixedpt<float>(mini32 + int32_t(a)) a=129", 0.500000059604644775391L);
+insert("u01<double>(mini32 + int32_t(a)) a=129", 0.500000030151568353176L);
+insert("uneg11<double>(mini32 + int32_t(a)) a=129", -0.999999939696863293648L);
+insert("u01fixedpt<double>(mini32 + int32_t(a)) a=129", 0.500000030151568353176L);
+insert("u01<long double>(mini32 + int32_t(a)) a=129", 0.500000030151568353176L);
+insert("uneg11<long double>(mini32 + int32_t(a)) a=129", -0.999999939696863293648L);
+insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=129", 0.500000030151568353176L);
+insert("u01<float>(mini64 + int64_t(a)) a=129", 0.500000000000000000000L);
+insert("uneg11<float>(mini64 + int64_t(a)) a=129", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini64 + int64_t(a)) a=129", 0.500000059604644775391L);
+insert("u01<double>(mini64 + int64_t(a)) a=129", 0.500000000000000000000L);
+insert("uneg11<double>(mini64 + int64_t(a)) a=129", -1.00000000000000000000L);
+insert("u01fixedpt<double>(mini64 + int64_t(a)) a=129", 0.500000000000000111022L);
+insert("u01<long double>(mini64 + int64_t(a)) a=129", 0.500000000000000007047L);
+insert("uneg11<long double>(mini64 + int64_t(a)) a=129", -0.999999999999999985960L);
+insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=129", 0.500000000000000006993L);
+insert("u01<float>(maxu32 - uint32_t(a)) a=129", 0.999999940395355224609L);
+insert("uneg11<float>(maxu32 - uint32_t(a)) a=129", -6.03031367063522338867e-08L);
+insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=129", 0.999999940395355224609L);
+insert("u01<double>(maxu32 - uint32_t(a)) a=129", 0.999999969848431646824L);
+insert("uneg11<double>(maxu32 - uint32_t(a)) a=129", -6.03031367063522338867e-08L);
+insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=129", 0.999999969848431646824L);
+insert("u01<long double>(maxu32 - uint32_t(a)) a=129", 0.999999969848431646824L);
+insert("uneg11<long double>(maxu32 - uint32_t(a)) a=129", -6.03031367063522338867e-08L);
+insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=129", 0.999999969848431646824L);
+insert("u01<float>(maxu64 - uint64_t(a)) a=129", 1.00000000000000000000L);
+insert("uneg11<float>(maxu64 - uint64_t(a)) a=129", -1.40404181336872824204e-17L);
+insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=129", 0.999999940395355224609L);
+insert("u01<double>(maxu64 - uint64_t(a)) a=129", 1.00000000000000000000L);
+insert("uneg11<double>(maxu64 - uint64_t(a)) a=129", -1.40404181336872824204e-17L);
+insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=129", 0.999999999999999888978L);
+insert("u01<long double>(maxu64 - uint64_t(a)) a=129", 0.999999999999999992953L);
+insert("uneg11<long double>(maxu64 - uint64_t(a)) a=129", -1.40404181336872824204e-17L);
+insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=129", 0.999999999999999993007L);
+insert("u01<float>(maxi32 - int32_t(a)) a=129", 0.499999970197677612305L);
+insert("uneg11<float>(maxi32 - int32_t(a)) a=129", 0.999999940395355224609L);
+insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=129", 0.499999940395355224609L);
+insert("u01<double>(maxi32 - int32_t(a)) a=129", 0.499999969848431646824L);
+insert("uneg11<double>(maxi32 - int32_t(a)) a=129", 0.999999939696863293648L);
+insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=129", 0.499999969848431646824L);
+insert("u01<long double>(maxi32 - int32_t(a)) a=129", 0.499999969848431646824L);
+insert("uneg11<long double>(maxi32 - int32_t(a)) a=129", 0.999999939696863293648L);
+insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=129", 0.499999969848431646824L);
+insert("u01<float>(maxi64 - int64_t(a)) a=129", 0.500000000000000000000L);
+insert("uneg11<float>(maxi64 - int64_t(a)) a=129", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=129", 0.499999940395355224609L);
+insert("u01<double>(maxi64 - int64_t(a)) a=129", 0.500000000000000000000L);
+insert("uneg11<double>(maxi64 - int64_t(a)) a=129", 1.00000000000000000000L);
+insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=129", 0.499999999999999888978L);
+insert("u01<long double>(maxi64 - int64_t(a)) a=129", 0.499999999999999992980L);
+insert("uneg11<long double>(maxi64 - int64_t(a)) a=129", 0.999999999999999985960L);
+insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=129", 0.499999999999999993007L);
+insert("u01<float>(minu32 + uint32_t(a)) a=191", 4.45870682597160339355e-08L);
+insert("uneg11<float>(minu32 + uint32_t(a)) a=191", 8.91741365194320678711e-08L);
+insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=191", 5.96046447753906250000e-08L);
+insert("u01<double>(minu32 + uint32_t(a)) a=191", 4.45870682597160339355e-08L);
+insert("uneg11<double>(minu32 + uint32_t(a)) a=191", 8.91741365194320678711e-08L);
+insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=191", 4.45870682597160339355e-08L);
+insert("u01<long double>(minu32 + uint32_t(a)) a=191", 4.45870682597160339355e-08L);
+insert("uneg11<long double>(minu32 + uint32_t(a)) a=191", 8.91741365194320678711e-08L);
+insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=191", 4.45870682597160339355e-08L);
+insert("u01<float>(minu64 + uint64_t(a)) a=191", 1.03812358015487049556e-17L);
+insert("uneg11<float>(minu64 + uint64_t(a)) a=191", 2.07624716030974099112e-17L);
+insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=191", 5.96046447753906250000e-08L);
+insert("u01<double>(minu64 + uint64_t(a)) a=191", 1.03812358015487049556e-17L);
+insert("uneg11<double>(minu64 + uint64_t(a)) a=191", 2.07624716030974099112e-17L);
+insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=191", 1.11022302462515654042e-16L);
+insert("u01<long double>(minu64 + uint64_t(a)) a=191", 1.03812358015487049556e-17L);
+insert("uneg11<long double>(minu64 + uint64_t(a)) a=191", 2.07624716030974099112e-17L);
+insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=191", 1.03541307472365673448e-17L);
+insert("u01<float>(mini32 + int32_t(a)) a=191", 0.500000059604644775391L);
+insert("uneg11<float>(mini32 + int32_t(a)) a=191", -0.999999940395355224609L);
+insert("u01fixedpt<float>(mini32 + int32_t(a)) a=191", 0.500000059604644775391L);
+insert("u01<double>(mini32 + int32_t(a)) a=191", 0.500000044587068259716L);
+insert("uneg11<double>(mini32 + int32_t(a)) a=191", -0.999999910825863480568L);
+insert("u01fixedpt<double>(mini32 + int32_t(a)) a=191", 0.500000044587068259716L);
+insert("u01<long double>(mini32 + int32_t(a)) a=191", 0.500000044587068259716L);
+insert("uneg11<long double>(mini32 + int32_t(a)) a=191", -0.999999910825863480568L);
+insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=191", 0.500000044587068259716L);
+insert("u01<float>(mini64 + int64_t(a)) a=191", 0.500000000000000000000L);
+insert("uneg11<float>(mini64 + int64_t(a)) a=191", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini64 + int64_t(a)) a=191", 0.500000059604644775391L);
+insert("u01<double>(mini64 + int64_t(a)) a=191", 0.500000000000000000000L);
+insert("uneg11<double>(mini64 + int64_t(a)) a=191", -1.00000000000000000000L);
+insert("u01fixedpt<double>(mini64 + int64_t(a)) a=191", 0.500000000000000111022L);
+insert("u01<long double>(mini64 + int64_t(a)) a=191", 0.500000000000000010408L);
+insert("uneg11<long double>(mini64 + int64_t(a)) a=191", -0.999999999999999979238L);
+insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=191", 0.500000000000000010354L);
+insert("u01<float>(maxu32 - uint32_t(a)) a=191", 0.999999940395355224609L);
+insert("uneg11<float>(maxu32 - uint32_t(a)) a=191", -8.91741365194320678711e-08L);
+insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=191", 0.999999940395355224609L);
+insert("u01<double>(maxu32 - uint32_t(a)) a=191", 0.999999955412931740284L);
+insert("uneg11<double>(maxu32 - uint32_t(a)) a=191", -8.91741365194320678711e-08L);
+insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=191", 0.999999955412931740284L);
+insert("u01<long double>(maxu32 - uint32_t(a)) a=191", 0.999999955412931740284L);
+insert("uneg11<long double>(maxu32 - uint32_t(a)) a=191", -8.91741365194320678711e-08L);
+insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=191", 0.999999955412931740284L);
+insert("u01<float>(maxu64 - uint64_t(a)) a=191", 1.00000000000000000000L);
+insert("uneg11<float>(maxu64 - uint64_t(a)) a=191", -2.07624716030974099112e-17L);
+insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=191", 0.999999940395355224609L);
+insert("u01<double>(maxu64 - uint64_t(a)) a=191", 1.00000000000000000000L);
+insert("uneg11<double>(maxu64 - uint64_t(a)) a=191", -2.07624716030974099112e-17L);
+insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=191", 0.999999999999999888978L);
+insert("u01<long double>(maxu64 - uint64_t(a)) a=191", 0.999999999999999989592L);
+insert("uneg11<long double>(maxu64 - uint64_t(a)) a=191", -2.07624716030974099112e-17L);
+insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=191", 0.999999999999999989646L);
+insert("u01<float>(maxi32 - int32_t(a)) a=191", 0.499999940395355224609L);
+insert("uneg11<float>(maxi32 - int32_t(a)) a=191", 0.999999880790710449219L);
+insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=191", 0.499999940395355224609L);
+insert("u01<double>(maxi32 - int32_t(a)) a=191", 0.499999955412931740284L);
+insert("uneg11<double>(maxi32 - int32_t(a)) a=191", 0.999999910825863480568L);
+insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=191", 0.499999955412931740284L);
+insert("u01<long double>(maxi32 - int32_t(a)) a=191", 0.499999955412931740284L);
+insert("uneg11<long double>(maxi32 - int32_t(a)) a=191", 0.999999910825863480568L);
+insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=191", 0.499999955412931740284L);
+insert("u01<float>(maxi64 - int64_t(a)) a=191", 0.500000000000000000000L);
+insert("uneg11<float>(maxi64 - int64_t(a)) a=191", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=191", 0.499999940395355224609L);
+insert("u01<double>(maxi64 - int64_t(a)) a=191", 0.500000000000000000000L);
+insert("uneg11<double>(maxi64 - int64_t(a)) a=191", 1.00000000000000000000L);
+insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=191", 0.499999999999999888978L);
+insert("u01<long double>(maxi64 - int64_t(a)) a=191", 0.499999999999999989619L);
+insert("uneg11<long double>(maxi64 - int64_t(a)) a=191", 0.999999999999999979238L);
+insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=191", 0.499999999999999989646L);
+insert("u01<float>(minu32 + uint32_t(a)) a=192", 4.48198989033699035645e-08L);
+insert("uneg11<float>(minu32 + uint32_t(a)) a=192", 8.96397978067398071289e-08L);
+insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=192", 5.96046447753906250000e-08L);
+insert("u01<double>(minu32 + uint32_t(a)) a=192", 4.48198989033699035645e-08L);
+insert("uneg11<double>(minu32 + uint32_t(a)) a=192", 8.96397978067398071289e-08L);
+insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=192", 4.48198989033699035645e-08L);
+insert("u01<long double>(minu32 + uint32_t(a)) a=192", 4.48198989033699035645e-08L);
+insert("uneg11<long double>(minu32 + uint32_t(a)) a=192", 8.96397978067398071289e-08L);
+insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=192", 4.48198989033699035645e-08L);
+insert("u01<float>(minu64 + uint64_t(a)) a=192", 1.04354459101729801773e-17L);
+insert("uneg11<float>(minu64 + uint64_t(a)) a=192", 2.08708918203459603546e-17L);
+insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=192", 5.96046447753906250000e-08L);
+insert("u01<double>(minu64 + uint64_t(a)) a=192", 1.04354459101729801773e-17L);
+insert("uneg11<double>(minu64 + uint64_t(a)) a=192", 2.08708918203459603546e-17L);
+insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=192", 1.11022302462515654042e-16L);
+insert("u01<long double>(minu64 + uint64_t(a)) a=192", 1.04354459101729801773e-17L);
+insert("uneg11<long double>(minu64 + uint64_t(a)) a=192", 2.08708918203459603546e-17L);
+insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=192", 1.04625509644851177882e-17L);
+insert("u01<float>(mini32 + int32_t(a)) a=192", 0.500000059604644775391L);
+insert("uneg11<float>(mini32 + int32_t(a)) a=192", -0.999999880790710449219L);
+insert("u01fixedpt<float>(mini32 + int32_t(a)) a=192", 0.500000059604644775391L);
+insert("u01<double>(mini32 + int32_t(a)) a=192", 0.500000044819898903370L);
+insert("uneg11<double>(mini32 + int32_t(a)) a=192", -0.999999910360202193260L);
+insert("u01fixedpt<double>(mini32 + int32_t(a)) a=192", 0.500000044819898903370L);
+insert("u01<long double>(mini32 + int32_t(a)) a=192", 0.500000044819898903370L);
+insert("uneg11<long double>(mini32 + int32_t(a)) a=192", -0.999999910360202193260L);
+insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=192", 0.500000044819898903370L);
+insert("u01<float>(mini64 + int64_t(a)) a=192", 0.500000000000000000000L);
+insert("uneg11<float>(mini64 + int64_t(a)) a=192", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini64 + int64_t(a)) a=192", 0.500000059604644775391L);
+insert("u01<double>(mini64 + int64_t(a)) a=192", 0.500000000000000000000L);
+insert("uneg11<double>(mini64 + int64_t(a)) a=192", -1.00000000000000000000L);
+insert("u01fixedpt<double>(mini64 + int64_t(a)) a=192", 0.500000000000000111022L);
+insert("u01<long double>(mini64 + int64_t(a)) a=192", 0.500000000000000010408L);
+insert("uneg11<long double>(mini64 + int64_t(a)) a=192", -0.999999999999999979129L);
+insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=192", 0.500000000000000010463L);
+insert("u01<float>(maxu32 - uint32_t(a)) a=192", 0.999999940395355224609L);
+insert("uneg11<float>(maxu32 - uint32_t(a)) a=192", -8.96397978067398071289e-08L);
+insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=192", 0.999999940395355224609L);
+insert("u01<double>(maxu32 - uint32_t(a)) a=192", 0.999999955180101096630L);
+insert("uneg11<double>(maxu32 - uint32_t(a)) a=192", -8.96397978067398071289e-08L);
+insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=192", 0.999999955180101096630L);
+insert("u01<long double>(maxu32 - uint32_t(a)) a=192", 0.999999955180101096630L);
+insert("uneg11<long double>(maxu32 - uint32_t(a)) a=192", -8.96397978067398071289e-08L);
+insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=192", 0.999999955180101096630L);
+insert("u01<float>(maxu64 - uint64_t(a)) a=192", 1.00000000000000000000L);
+insert("uneg11<float>(maxu64 - uint64_t(a)) a=192", -2.08708918203459603546e-17L);
+insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=192", 0.999999940395355224609L);
+insert("u01<double>(maxu64 - uint64_t(a)) a=192", 1.00000000000000000000L);
+insert("uneg11<double>(maxu64 - uint64_t(a)) a=192", -2.08708918203459603546e-17L);
+insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=192", 0.999999999999999888978L);
+insert("u01<long double>(maxu64 - uint64_t(a)) a=192", 0.999999999999999989592L);
+insert("uneg11<long double>(maxu64 - uint64_t(a)) a=192", -2.08708918203459603546e-17L);
+insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=192", 0.999999999999999989537L);
+insert("u01<float>(maxi32 - int32_t(a)) a=192", 0.499999940395355224609L);
+insert("uneg11<float>(maxi32 - int32_t(a)) a=192", 0.999999880790710449219L);
+insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=192", 0.499999940395355224609L);
+insert("u01<double>(maxi32 - int32_t(a)) a=192", 0.499999955180101096630L);
+insert("uneg11<double>(maxi32 - int32_t(a)) a=192", 0.999999910360202193260L);
+insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=192", 0.499999955180101096630L);
+insert("u01<long double>(maxi32 - int32_t(a)) a=192", 0.499999955180101096630L);
+insert("uneg11<long double>(maxi32 - int32_t(a)) a=192", 0.999999910360202193260L);
+insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=192", 0.499999955180101096630L);
+insert("u01<float>(maxi64 - int64_t(a)) a=192", 0.500000000000000000000L);
+insert("uneg11<float>(maxi64 - int64_t(a)) a=192", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=192", 0.499999940395355224609L);
+insert("u01<double>(maxi64 - int64_t(a)) a=192", 0.500000000000000000000L);
+insert("uneg11<double>(maxi64 - int64_t(a)) a=192", 1.00000000000000000000L);
+insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=192", 0.499999999999999888978L);
+insert("u01<long double>(maxi64 - int64_t(a)) a=192", 0.499999999999999989565L);
+insert("uneg11<long double>(maxi64 - int64_t(a)) a=192", 0.999999999999999979129L);
+insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=192", 0.499999999999999989537L);
+insert("u01<float>(minu32 + uint32_t(a)) a=193", 4.50527295470237731934e-08L);
+insert("uneg11<float>(minu32 + uint32_t(a)) a=193", 9.01054590940475463867e-08L);
+insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=193", 5.96046447753906250000e-08L);
+insert("u01<double>(minu32 + uint32_t(a)) a=193", 4.50527295470237731934e-08L);
+insert("uneg11<double>(minu32 + uint32_t(a)) a=193", 9.01054590940475463867e-08L);
+insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=193", 4.50527295470237731934e-08L);
+insert("u01<long double>(minu32 + uint32_t(a)) a=193", 4.50527295470237731934e-08L);
+insert("uneg11<long double>(minu32 + uint32_t(a)) a=193", 9.01054590940475463867e-08L);
+insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=193", 4.50527295470237731934e-08L);
+insert("u01<float>(minu64 + uint64_t(a)) a=193", 1.04896560187972553990e-17L);
+insert("uneg11<float>(minu64 + uint64_t(a)) a=193", 2.09793120375945107980e-17L);
+insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=193", 5.96046447753906250000e-08L);
+insert("u01<double>(minu64 + uint64_t(a)) a=193", 1.04896560187972553990e-17L);
+insert("uneg11<double>(minu64 + uint64_t(a)) a=193", 2.09793120375945107980e-17L);
+insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=193", 1.11022302462515654042e-16L);
+insert("u01<long double>(minu64 + uint64_t(a)) a=193", 1.04896560187972553990e-17L);
+insert("uneg11<long double>(minu64 + uint64_t(a)) a=193", 2.09793120375945107980e-17L);
+insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=193", 1.04625509644851177882e-17L);
+insert("u01<float>(mini32 + int32_t(a)) a=193", 0.500000059604644775391L);
+insert("uneg11<float>(mini32 + int32_t(a)) a=193", -0.999999880790710449219L);
+insert("u01fixedpt<float>(mini32 + int32_t(a)) a=193", 0.500000059604644775391L);
+insert("u01<double>(mini32 + int32_t(a)) a=193", 0.500000045052729547024L);
+insert("uneg11<double>(mini32 + int32_t(a)) a=193", -0.999999909894540905952L);
+insert("u01fixedpt<double>(mini32 + int32_t(a)) a=193", 0.500000045052729547024L);
+insert("u01<long double>(mini32 + int32_t(a)) a=193", 0.500000045052729547024L);
+insert("uneg11<long double>(mini32 + int32_t(a)) a=193", -0.999999909894540905952L);
+insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=193", 0.500000045052729547024L);
+insert("u01<float>(mini64 + int64_t(a)) a=193", 0.500000000000000000000L);
+insert("uneg11<float>(mini64 + int64_t(a)) a=193", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini64 + int64_t(a)) a=193", 0.500000059604644775391L);
+insert("u01<double>(mini64 + int64_t(a)) a=193", 0.500000000000000000000L);
+insert("uneg11<double>(mini64 + int64_t(a)) a=193", -1.00000000000000000000L);
+insert("u01fixedpt<double>(mini64 + int64_t(a)) a=193", 0.500000000000000111022L);
+insert("u01<long double>(mini64 + int64_t(a)) a=193", 0.500000000000000010517L);
+insert("uneg11<long double>(mini64 + int64_t(a)) a=193", -0.999999999999999979021L);
+insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=193", 0.500000000000000010463L);
+insert("u01<float>(maxu32 - uint32_t(a)) a=193", 0.999999940395355224609L);
+insert("uneg11<float>(maxu32 - uint32_t(a)) a=193", -9.01054590940475463867e-08L);
+insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=193", 0.999999940395355224609L);
+insert("u01<double>(maxu32 - uint32_t(a)) a=193", 0.999999954947270452976L);
+insert("uneg11<double>(maxu32 - uint32_t(a)) a=193", -9.01054590940475463867e-08L);
+insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=193", 0.999999954947270452976L);
+insert("u01<long double>(maxu32 - uint32_t(a)) a=193", 0.999999954947270452976L);
+insert("uneg11<long double>(maxu32 - uint32_t(a)) a=193", -9.01054590940475463867e-08L);
+insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=193", 0.999999954947270452976L);
+insert("u01<float>(maxu64 - uint64_t(a)) a=193", 1.00000000000000000000L);
+insert("uneg11<float>(maxu64 - uint64_t(a)) a=193", -2.09793120375945107980e-17L);
+insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=193", 0.999999940395355224609L);
+insert("u01<double>(maxu64 - uint64_t(a)) a=193", 1.00000000000000000000L);
+insert("uneg11<double>(maxu64 - uint64_t(a)) a=193", -2.09793120375945107980e-17L);
+insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=193", 0.999999999999999888978L);
+insert("u01<long double>(maxu64 - uint64_t(a)) a=193", 0.999999999999999989483L);
+insert("uneg11<long double>(maxu64 - uint64_t(a)) a=193", -2.09793120375945107980e-17L);
+insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=193", 0.999999999999999989537L);
+insert("u01<float>(maxi32 - int32_t(a)) a=193", 0.499999940395355224609L);
+insert("uneg11<float>(maxi32 - int32_t(a)) a=193", 0.999999880790710449219L);
+insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=193", 0.499999940395355224609L);
+insert("u01<double>(maxi32 - int32_t(a)) a=193", 0.499999954947270452976L);
+insert("uneg11<double>(maxi32 - int32_t(a)) a=193", 0.999999909894540905952L);
+insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=193", 0.499999954947270452976L);
+insert("u01<long double>(maxi32 - int32_t(a)) a=193", 0.499999954947270452976L);
+insert("uneg11<long double>(maxi32 - int32_t(a)) a=193", 0.999999909894540905952L);
+insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=193", 0.499999954947270452976L);
+insert("u01<float>(maxi64 - int64_t(a)) a=193", 0.500000000000000000000L);
+insert("uneg11<float>(maxi64 - int64_t(a)) a=193", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=193", 0.499999940395355224609L);
+insert("u01<double>(maxi64 - int64_t(a)) a=193", 0.500000000000000000000L);
+insert("uneg11<double>(maxi64 - int64_t(a)) a=193", 1.00000000000000000000L);
+insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=193", 0.499999999999999888978L);
+insert("u01<long double>(maxi64 - int64_t(a)) a=193", 0.499999999999999989510L);
+insert("uneg11<long double>(maxi64 - int64_t(a)) a=193", 0.999999999999999979021L);
+insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=193", 0.499999999999999989537L);
+insert("u01<float>(minu32 + uint32_t(a)) a=255", 5.94882294535636901855e-08L);
+insert("uneg11<float>(minu32 + uint32_t(a)) a=255", 1.18976458907127380371e-07L);
+insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=255", 5.96046447753906250000e-08L);
+insert("u01<double>(minu32 + uint32_t(a)) a=255", 5.94882294535636901855e-08L);
+insert("uneg11<double>(minu32 + uint32_t(a)) a=255", 1.18976458907127380371e-07L);
+insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=255", 5.94882294535636901855e-08L);
+insert("u01<long double>(minu32 + uint32_t(a)) a=255", 5.94882294535636901855e-08L);
+insert("uneg11<long double>(minu32 + uint32_t(a)) a=255", 1.18976458907127380371e-07L);
+insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=255", 5.94882294535636901855e-08L);
+insert("u01<float>(minu64 + uint64_t(a)) a=255", 1.38506827535023191444e-17L);
+insert("uneg11<float>(minu64 + uint64_t(a)) a=255", 2.77013655070046382889e-17L);
+insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=255", 5.96046447753906250000e-08L);
+insert("u01<double>(minu64 + uint64_t(a)) a=255", 1.38506827535023191444e-17L);
+insert("uneg11<double>(minu64 + uint64_t(a)) a=255", 2.77013655070046382889e-17L);
+insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=255", 1.11022302462515654042e-16L);
+insert("u01<long double>(minu64 + uint64_t(a)) a=255", 1.38506827535023191444e-17L);
+insert("uneg11<long double>(minu64 + uint64_t(a)) a=255", 2.77013655070046382889e-17L);
+insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=255", 1.38235776991901815336e-17L);
+insert("u01<float>(mini32 + int32_t(a)) a=255", 0.500000059604644775391L);
+insert("uneg11<float>(mini32 + int32_t(a)) a=255", -0.999999880790710449219L);
+insert("u01fixedpt<float>(mini32 + int32_t(a)) a=255", 0.500000059604644775391L);
+insert("u01<double>(mini32 + int32_t(a)) a=255", 0.500000059488229453564L);
+insert("uneg11<double>(mini32 + int32_t(a)) a=255", -0.999999881023541092873L);
+insert("u01fixedpt<double>(mini32 + int32_t(a)) a=255", 0.500000059488229453564L);
+insert("u01<long double>(mini32 + int32_t(a)) a=255", 0.500000059488229453564L);
+insert("uneg11<long double>(mini32 + int32_t(a)) a=255", -0.999999881023541092873L);
+insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=255", 0.500000059488229453564L);
+insert("u01<float>(mini64 + int64_t(a)) a=255", 0.500000000000000000000L);
+insert("uneg11<float>(mini64 + int64_t(a)) a=255", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini64 + int64_t(a)) a=255", 0.500000059604644775391L);
+insert("u01<double>(mini64 + int64_t(a)) a=255", 0.500000000000000000000L);
+insert("uneg11<double>(mini64 + int64_t(a)) a=255", -1.00000000000000000000L);
+insert("u01fixedpt<double>(mini64 + int64_t(a)) a=255", 0.500000000000000111022L);
+insert("u01<long double>(mini64 + int64_t(a)) a=255", 0.500000000000000013878L);
+insert("uneg11<long double>(mini64 + int64_t(a)) a=255", -0.999999999999999972299L);
+insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=255", 0.500000000000000013824L);
+insert("u01<float>(maxu32 - uint32_t(a)) a=255", 0.999999940395355224609L);
+insert("uneg11<float>(maxu32 - uint32_t(a)) a=255", -1.18976458907127380371e-07L);
+insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=255", 0.999999940395355224609L);
+insert("u01<double>(maxu32 - uint32_t(a)) a=255", 0.999999940511770546436L);
+insert("uneg11<double>(maxu32 - uint32_t(a)) a=255", -1.18976458907127380371e-07L);
+insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=255", 0.999999940511770546436L);
+insert("u01<long double>(maxu32 - uint32_t(a)) a=255", 0.999999940511770546436L);
+insert("uneg11<long double>(maxu32 - uint32_t(a)) a=255", -1.18976458907127380371e-07L);
+insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=255", 0.999999940511770546436L);
+insert("u01<float>(maxu64 - uint64_t(a)) a=255", 1.00000000000000000000L);
+insert("uneg11<float>(maxu64 - uint64_t(a)) a=255", -2.77013655070046382889e-17L);
+insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=255", 0.999999940395355224609L);
+insert("u01<double>(maxu64 - uint64_t(a)) a=255", 1.00000000000000000000L);
+insert("uneg11<double>(maxu64 - uint64_t(a)) a=255", -2.77013655070046382889e-17L);
+insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=255", 0.999999999999999888978L);
+insert("u01<long double>(maxu64 - uint64_t(a)) a=255", 0.999999999999999986122L);
+insert("uneg11<long double>(maxu64 - uint64_t(a)) a=255", -2.77013655070046382889e-17L);
+insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=255", 0.999999999999999986176L);
+insert("u01<float>(maxi32 - int32_t(a)) a=255", 0.499999940395355224609L);
+insert("uneg11<float>(maxi32 - int32_t(a)) a=255", 0.999999880790710449219L);
+insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=255", 0.499999940395355224609L);
+insert("u01<double>(maxi32 - int32_t(a)) a=255", 0.499999940511770546436L);
+insert("uneg11<double>(maxi32 - int32_t(a)) a=255", 0.999999881023541092873L);
+insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=255", 0.499999940511770546436L);
+insert("u01<long double>(maxi32 - int32_t(a)) a=255", 0.499999940511770546436L);
+insert("uneg11<long double>(maxi32 - int32_t(a)) a=255", 0.999999881023541092873L);
+insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=255", 0.499999940511770546436L);
+insert("u01<float>(maxi64 - int64_t(a)) a=255", 0.500000000000000000000L);
+insert("uneg11<float>(maxi64 - int64_t(a)) a=255", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=255", 0.499999940395355224609L);
+insert("u01<double>(maxi64 - int64_t(a)) a=255", 0.500000000000000000000L);
+insert("uneg11<double>(maxi64 - int64_t(a)) a=255", 1.00000000000000000000L);
+insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=255", 0.499999999999999888978L);
+insert("u01<long double>(maxi64 - int64_t(a)) a=255", 0.499999999999999986149L);
+insert("uneg11<long double>(maxi64 - int64_t(a)) a=255", 0.999999999999999972299L);
+insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=255", 0.499999999999999986176L);
+insert("u01<float>(minu32 + uint32_t(a)) a=256", 5.97210600972175598145e-08L);
+insert("uneg11<float>(minu32 + uint32_t(a)) a=256", 1.19442120194435119629e-07L);
+insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=256", 5.96046447753906250000e-08L);
+insert("u01<double>(minu32 + uint32_t(a)) a=256", 5.97210600972175598145e-08L);
+insert("uneg11<double>(minu32 + uint32_t(a)) a=256", 1.19442120194435119629e-07L);
+insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=256", 5.97210600972175598145e-08L);
+insert("u01<long double>(minu32 + uint32_t(a)) a=256", 5.97210600972175598145e-08L);
+insert("uneg11<long double>(minu32 + uint32_t(a)) a=256", 1.19442120194435119629e-07L);
+insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=256", 5.97210600972175598145e-08L);
+insert("u01<float>(minu64 + uint64_t(a)) a=256", 1.39048928621265943661e-17L);
+insert("uneg11<float>(minu64 + uint64_t(a)) a=256", 2.78097857242531887323e-17L);
+insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=256", 5.96046447753906250000e-08L);
+insert("u01<double>(minu64 + uint64_t(a)) a=256", 1.39048928621265943661e-17L);
+insert("uneg11<double>(minu64 + uint64_t(a)) a=256", 2.78097857242531887323e-17L);
+insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=256", 1.11022302462515654042e-16L);
+insert("u01<long double>(minu64 + uint64_t(a)) a=256", 1.39048928621265943661e-17L);
+insert("uneg11<long double>(minu64 + uint64_t(a)) a=256", 2.78097857242531887323e-17L);
+insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=256", 1.39319979164387319770e-17L);
+insert("u01<float>(mini32 + int32_t(a)) a=256", 0.500000059604644775391L);
+insert("uneg11<float>(mini32 + int32_t(a)) a=256", -0.999999880790710449219L);
+insert("u01fixedpt<float>(mini32 + int32_t(a)) a=256", 0.500000059604644775391L);
+insert("u01<double>(mini32 + int32_t(a)) a=256", 0.500000059721060097218L);
+insert("uneg11<double>(mini32 + int32_t(a)) a=256", -0.999999880557879805565L);
+insert("u01fixedpt<double>(mini32 + int32_t(a)) a=256", 0.500000059721060097218L);
+insert("u01<long double>(mini32 + int32_t(a)) a=256", 0.500000059721060097218L);
+insert("uneg11<long double>(mini32 + int32_t(a)) a=256", -0.999999880557879805565L);
+insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=256", 0.500000059721060097218L);
+insert("u01<float>(mini64 + int64_t(a)) a=256", 0.500000000000000000000L);
+insert("uneg11<float>(mini64 + int64_t(a)) a=256", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini64 + int64_t(a)) a=256", 0.500000059604644775391L);
+insert("u01<double>(mini64 + int64_t(a)) a=256", 0.500000000000000000000L);
+insert("uneg11<double>(mini64 + int64_t(a)) a=256", -1.00000000000000000000L);
+insert("u01fixedpt<double>(mini64 + int64_t(a)) a=256", 0.500000000000000111022L);
+insert("u01<long double>(mini64 + int64_t(a)) a=256", 0.500000000000000013878L);
+insert("uneg11<long double>(mini64 + int64_t(a)) a=256", -0.999999999999999972190L);
+insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=256", 0.500000000000000013932L);
+insert("u01<float>(maxu32 - uint32_t(a)) a=256", 0.999999940395355224609L);
+insert("uneg11<float>(maxu32 - uint32_t(a)) a=256", -1.19442120194435119629e-07L);
+insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=256", 0.999999940395355224609L);
+insert("u01<double>(maxu32 - uint32_t(a)) a=256", 0.999999940278939902782L);
+insert("uneg11<double>(maxu32 - uint32_t(a)) a=256", -1.19442120194435119629e-07L);
+insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=256", 0.999999940278939902782L);
+insert("u01<long double>(maxu32 - uint32_t(a)) a=256", 0.999999940278939902782L);
+insert("uneg11<long double>(maxu32 - uint32_t(a)) a=256", -1.19442120194435119629e-07L);
+insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=256", 0.999999940278939902782L);
+insert("u01<float>(maxu64 - uint64_t(a)) a=256", 1.00000000000000000000L);
+insert("uneg11<float>(maxu64 - uint64_t(a)) a=256", -2.78097857242531887323e-17L);
+insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=256", 0.999999940395355224609L);
+insert("u01<double>(maxu64 - uint64_t(a)) a=256", 1.00000000000000000000L);
+insert("uneg11<double>(maxu64 - uint64_t(a)) a=256", -2.78097857242531887323e-17L);
+insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=256", 0.999999999999999888978L);
+insert("u01<long double>(maxu64 - uint64_t(a)) a=256", 0.999999999999999986122L);
+insert("uneg11<long double>(maxu64 - uint64_t(a)) a=256", -2.78097857242531887323e-17L);
+insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=256", 0.999999999999999986068L);
+insert("u01<float>(maxi32 - int32_t(a)) a=256", 0.499999940395355224609L);
+insert("uneg11<float>(maxi32 - int32_t(a)) a=256", 0.999999880790710449219L);
+insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=256", 0.499999940395355224609L);
+insert("u01<double>(maxi32 - int32_t(a)) a=256", 0.499999940278939902782L);
+insert("uneg11<double>(maxi32 - int32_t(a)) a=256", 0.999999880557879805565L);
+insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=256", 0.499999940278939902782L);
+insert("u01<long double>(maxi32 - int32_t(a)) a=256", 0.499999940278939902782L);
+insert("uneg11<long double>(maxi32 - int32_t(a)) a=256", 0.999999880557879805565L);
+insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=256", 0.499999940278939902782L);
+insert("u01<float>(maxi64 - int64_t(a)) a=256", 0.500000000000000000000L);
+insert("uneg11<float>(maxi64 - int64_t(a)) a=256", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=256", 0.499999940395355224609L);
+insert("u01<double>(maxi64 - int64_t(a)) a=256", 0.500000000000000000000L);
+insert("uneg11<double>(maxi64 - int64_t(a)) a=256", 1.00000000000000000000L);
+insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=256", 0.499999999999999888978L);
+insert("u01<long double>(maxi64 - int64_t(a)) a=256", 0.499999999999999986095L);
+insert("uneg11<long double>(maxi64 - int64_t(a)) a=256", 0.999999999999999972190L);
+insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=256", 0.499999999999999986068L);
+insert("u01<float>(minu32 + uint32_t(a)) a=257", 5.99538907408714294434e-08L);
+insert("uneg11<float>(minu32 + uint32_t(a)) a=257", 1.19907781481742858887e-07L);
+insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=257", 5.96046447753906250000e-08L);
+insert("u01<double>(minu32 + uint32_t(a)) a=257", 5.99538907408714294434e-08L);
+insert("uneg11<double>(minu32 + uint32_t(a)) a=257", 1.19907781481742858887e-07L);
+insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=257", 5.99538907408714294434e-08L);
+insert("u01<long double>(minu32 + uint32_t(a)) a=257", 5.99538907408714294434e-08L);
+insert("uneg11<long double>(minu32 + uint32_t(a)) a=257", 1.19907781481742858887e-07L);
+insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=257", 5.99538907408714294434e-08L);
+insert("u01<float>(minu64 + uint64_t(a)) a=257", 1.39591029707508695878e-17L);
+insert("uneg11<float>(minu64 + uint64_t(a)) a=257", 2.79182059415017391757e-17L);
+insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=257", 5.96046447753906250000e-08L);
+insert("u01<double>(minu64 + uint64_t(a)) a=257", 1.39591029707508695878e-17L);
+insert("uneg11<double>(minu64 + uint64_t(a)) a=257", 2.79182059415017391757e-17L);
+insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=257", 1.11022302462515654042e-16L);
+insert("u01<long double>(minu64 + uint64_t(a)) a=257", 1.39591029707508695878e-17L);
+insert("uneg11<long double>(minu64 + uint64_t(a)) a=257", 2.79182059415017391757e-17L);
+insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=257", 1.39319979164387319770e-17L);
+insert("u01<float>(mini32 + int32_t(a)) a=257", 0.500000059604644775391L);
+insert("uneg11<float>(mini32 + int32_t(a)) a=257", -0.999999880790710449219L);
+insert("u01fixedpt<float>(mini32 + int32_t(a)) a=257", 0.500000059604644775391L);
+insert("u01<double>(mini32 + int32_t(a)) a=257", 0.500000059953890740871L);
+insert("uneg11<double>(mini32 + int32_t(a)) a=257", -0.999999880092218518257L);
+insert("u01fixedpt<double>(mini32 + int32_t(a)) a=257", 0.500000059953890740871L);
+insert("u01<long double>(mini32 + int32_t(a)) a=257", 0.500000059953890740871L);
+insert("uneg11<long double>(mini32 + int32_t(a)) a=257", -0.999999880092218518257L);
+insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=257", 0.500000059953890740871L);
+insert("u01<float>(mini64 + int64_t(a)) a=257", 0.500000000000000000000L);
+insert("uneg11<float>(mini64 + int64_t(a)) a=257", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini64 + int64_t(a)) a=257", 0.500000059604644775391L);
+insert("u01<double>(mini64 + int64_t(a)) a=257", 0.500000000000000000000L);
+insert("uneg11<double>(mini64 + int64_t(a)) a=257", -1.00000000000000000000L);
+insert("u01fixedpt<double>(mini64 + int64_t(a)) a=257", 0.500000000000000111022L);
+insert("u01<long double>(mini64 + int64_t(a)) a=257", 0.500000000000000013986L);
+insert("uneg11<long double>(mini64 + int64_t(a)) a=257", -0.999999999999999972082L);
+insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=257", 0.500000000000000013932L);
+insert("u01<float>(maxu32 - uint32_t(a)) a=257", 0.999999940395355224609L);
+insert("uneg11<float>(maxu32 - uint32_t(a)) a=257", -1.19907781481742858887e-07L);
+insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=257", 0.999999940395355224609L);
+insert("u01<double>(maxu32 - uint32_t(a)) a=257", 0.999999940046109259129L);
+insert("uneg11<double>(maxu32 - uint32_t(a)) a=257", -1.19907781481742858887e-07L);
+insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=257", 0.999999940046109259129L);
+insert("u01<long double>(maxu32 - uint32_t(a)) a=257", 0.999999940046109259129L);
+insert("uneg11<long double>(maxu32 - uint32_t(a)) a=257", -1.19907781481742858887e-07L);
+insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=257", 0.999999940046109259129L);
+insert("u01<float>(maxu64 - uint64_t(a)) a=257", 1.00000000000000000000L);
+insert("uneg11<float>(maxu64 - uint64_t(a)) a=257", -2.79182059415017391757e-17L);
+insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=257", 0.999999940395355224609L);
+insert("u01<double>(maxu64 - uint64_t(a)) a=257", 1.00000000000000000000L);
+insert("uneg11<double>(maxu64 - uint64_t(a)) a=257", -2.79182059415017391757e-17L);
+insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=257", 0.999999999999999888978L);
+insert("u01<long double>(maxu64 - uint64_t(a)) a=257", 0.999999999999999986014L);
+insert("uneg11<long double>(maxu64 - uint64_t(a)) a=257", -2.79182059415017391757e-17L);
+insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=257", 0.999999999999999986068L);
+insert("u01<float>(maxi32 - int32_t(a)) a=257", 0.499999940395355224609L);
+insert("uneg11<float>(maxi32 - int32_t(a)) a=257", 0.999999880790710449219L);
+insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=257", 0.499999940395355224609L);
+insert("u01<double>(maxi32 - int32_t(a)) a=257", 0.499999940046109259129L);
+insert("uneg11<double>(maxi32 - int32_t(a)) a=257", 0.999999880092218518257L);
+insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=257", 0.499999940046109259129L);
+insert("u01<long double>(maxi32 - int32_t(a)) a=257", 0.499999940046109259129L);
+insert("uneg11<long double>(maxi32 - int32_t(a)) a=257", 0.999999880092218518257L);
+insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=257", 0.499999940046109259129L);
+insert("u01<float>(maxi64 - int64_t(a)) a=257", 0.500000000000000000000L);
+insert("uneg11<float>(maxi64 - int64_t(a)) a=257", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=257", 0.499999940395355224609L);
+insert("u01<double>(maxi64 - int64_t(a)) a=257", 0.500000000000000000000L);
+insert("uneg11<double>(maxi64 - int64_t(a)) a=257", 1.00000000000000000000L);
+insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=257", 0.499999999999999888978L);
+insert("u01<long double>(maxi64 - int64_t(a)) a=257", 0.499999999999999986041L);
+insert("uneg11<long double>(maxi64 - int64_t(a)) a=257", 0.999999999999999972082L);
+insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=257", 0.499999999999999986068L);
+insert("u01<float>(minu32 + uint32_t(a)) a=319", 7.43893906474113464355e-08L);
+insert("uneg11<float>(minu32 + uint32_t(a)) a=319", 1.48778781294822692871e-07L);
+insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=319", 5.96046447753906250000e-08L);
+insert("u01<double>(minu32 + uint32_t(a)) a=319", 7.43893906474113464355e-08L);
+insert("uneg11<double>(minu32 + uint32_t(a)) a=319", 1.48778781294822692871e-07L);
+insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=319", 7.43893906474113464355e-08L);
+insert("u01<long double>(minu32 + uint32_t(a)) a=319", 7.43893906474113464355e-08L);
+insert("uneg11<long double>(minu32 + uint32_t(a)) a=319", 1.48778781294822692871e-07L);
+insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=319", 7.43893906474113464355e-08L);
+insert("u01<float>(minu64 + uint64_t(a)) a=319", 1.73201297054559333333e-17L);
+insert("uneg11<float>(minu64 + uint64_t(a)) a=319", 3.46402594109118666665e-17L);
+insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=319", 5.96046447753906250000e-08L);
+insert("u01<double>(minu64 + uint64_t(a)) a=319", 1.73201297054559333333e-17L);
+insert("uneg11<double>(minu64 + uint64_t(a)) a=319", 3.46402594109118666665e-17L);
+insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=319", 1.11022302462515654042e-16L);
+insert("u01<long double>(minu64 + uint64_t(a)) a=319", 1.73201297054559333333e-17L);
+insert("uneg11<long double>(minu64 + uint64_t(a)) a=319", 3.46402594109118666665e-17L);
+insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=319", 1.72930246511437957224e-17L);
+insert("u01<float>(mini32 + int32_t(a)) a=319", 0.500000059604644775391L);
+insert("uneg11<float>(mini32 + int32_t(a)) a=319", -0.999999880790710449219L);
+insert("u01fixedpt<float>(mini32 + int32_t(a)) a=319", 0.500000059604644775391L);
+insert("u01<double>(mini32 + int32_t(a)) a=319", 0.500000074389390647411L);
+insert("uneg11<double>(mini32 + int32_t(a)) a=319", -0.999999851221218705177L);
+insert("u01fixedpt<double>(mini32 + int32_t(a)) a=319", 0.500000074389390647411L);
+insert("u01<long double>(mini32 + int32_t(a)) a=319", 0.500000074389390647411L);
+insert("uneg11<long double>(mini32 + int32_t(a)) a=319", -0.999999851221218705177L);
+insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=319", 0.500000074389390647411L);
+insert("u01<float>(mini64 + int64_t(a)) a=319", 0.500000000000000000000L);
+insert("uneg11<float>(mini64 + int64_t(a)) a=319", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini64 + int64_t(a)) a=319", 0.500000059604644775391L);
+insert("u01<double>(mini64 + int64_t(a)) a=319", 0.500000000000000000000L);
+insert("uneg11<double>(mini64 + int64_t(a)) a=319", -1.00000000000000000000L);
+insert("u01fixedpt<double>(mini64 + int64_t(a)) a=319", 0.500000000000000111022L);
+insert("u01<long double>(mini64 + int64_t(a)) a=319", 0.500000000000000017347L);
+insert("uneg11<long double>(mini64 + int64_t(a)) a=319", -0.999999999999999965360L);
+insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=319", 0.500000000000000017293L);
+insert("u01<float>(maxu32 - uint32_t(a)) a=319", 0.999999940395355224609L);
+insert("uneg11<float>(maxu32 - uint32_t(a)) a=319", -1.48778781294822692871e-07L);
+insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=319", 0.999999940395355224609L);
+insert("u01<double>(maxu32 - uint32_t(a)) a=319", 0.999999925610609352589L);
+insert("uneg11<double>(maxu32 - uint32_t(a)) a=319", -1.48778781294822692871e-07L);
+insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=319", 0.999999925610609352589L);
+insert("u01<long double>(maxu32 - uint32_t(a)) a=319", 0.999999925610609352589L);
+insert("uneg11<long double>(maxu32 - uint32_t(a)) a=319", -1.48778781294822692871e-07L);
+insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=319", 0.999999925610609352589L);
+insert("u01<float>(maxu64 - uint64_t(a)) a=319", 1.00000000000000000000L);
+insert("uneg11<float>(maxu64 - uint64_t(a)) a=319", -3.46402594109118666665e-17L);
+insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=319", 0.999999940395355224609L);
+insert("u01<double>(maxu64 - uint64_t(a)) a=319", 1.00000000000000000000L);
+insert("uneg11<double>(maxu64 - uint64_t(a)) a=319", -3.46402594109118666665e-17L);
+insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=319", 0.999999999999999888978L);
+insert("u01<long double>(maxu64 - uint64_t(a)) a=319", 0.999999999999999982653L);
+insert("uneg11<long double>(maxu64 - uint64_t(a)) a=319", -3.46402594109118666665e-17L);
+insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=319", 0.999999999999999982707L);
+insert("u01<float>(maxi32 - int32_t(a)) a=319", 0.499999940395355224609L);
+insert("uneg11<float>(maxi32 - int32_t(a)) a=319", 0.999999880790710449219L);
+insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=319", 0.499999940395355224609L);
+insert("u01<double>(maxi32 - int32_t(a)) a=319", 0.499999925610609352589L);
+insert("uneg11<double>(maxi32 - int32_t(a)) a=319", 0.999999851221218705177L);
+insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=319", 0.499999925610609352589L);
+insert("u01<long double>(maxi32 - int32_t(a)) a=319", 0.499999925610609352589L);
+insert("uneg11<long double>(maxi32 - int32_t(a)) a=319", 0.999999851221218705177L);
+insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=319", 0.499999925610609352589L);
+insert("u01<float>(maxi64 - int64_t(a)) a=319", 0.500000000000000000000L);
+insert("uneg11<float>(maxi64 - int64_t(a)) a=319", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=319", 0.499999940395355224609L);
+insert("u01<double>(maxi64 - int64_t(a)) a=319", 0.500000000000000000000L);
+insert("uneg11<double>(maxi64 - int64_t(a)) a=319", 1.00000000000000000000L);
+insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=319", 0.499999999999999888978L);
+insert("u01<long double>(maxi64 - int64_t(a)) a=319", 0.499999999999999982680L);
+insert("uneg11<long double>(maxi64 - int64_t(a)) a=319", 0.999999999999999965360L);
+insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=319", 0.499999999999999982707L);
+insert("u01<float>(minu32 + uint32_t(a)) a=320", 7.46222212910652160645e-08L);
+insert("uneg11<float>(minu32 + uint32_t(a)) a=320", 1.49244442582130432129e-07L);
+insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=320", 5.96046447753906250000e-08L);
+insert("u01<double>(minu32 + uint32_t(a)) a=320", 7.46222212910652160645e-08L);
+insert("uneg11<double>(minu32 + uint32_t(a)) a=320", 1.49244442582130432129e-07L);
+insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=320", 7.46222212910652160645e-08L);
+insert("u01<long double>(minu32 + uint32_t(a)) a=320", 7.46222212910652160645e-08L);
+insert("uneg11<long double>(minu32 + uint32_t(a)) a=320", 1.49244442582130432129e-07L);
+insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=320", 7.46222212910652160645e-08L);
+insert("u01<float>(minu64 + uint64_t(a)) a=320", 1.73743398140802085550e-17L);
+insert("uneg11<float>(minu64 + uint64_t(a)) a=320", 3.47486796281604171099e-17L);
+insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=320", 5.96046447753906250000e-08L);
+insert("u01<double>(minu64 + uint64_t(a)) a=320", 1.73743398140802085550e-17L);
+insert("uneg11<double>(minu64 + uint64_t(a)) a=320", 3.47486796281604171099e-17L);
+insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=320", 1.11022302462515654042e-16L);
+insert("u01<long double>(minu64 + uint64_t(a)) a=320", 1.73743398140802085550e-17L);
+insert("uneg11<long double>(minu64 + uint64_t(a)) a=320", 3.47486796281604171099e-17L);
+insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=320", 1.74014448683923461658e-17L);
+insert("u01<float>(mini32 + int32_t(a)) a=320", 0.500000059604644775391L);
+insert("uneg11<float>(mini32 + int32_t(a)) a=320", -0.999999880790710449219L);
+insert("u01fixedpt<float>(mini32 + int32_t(a)) a=320", 0.500000059604644775391L);
+insert("u01<double>(mini32 + int32_t(a)) a=320", 0.500000074622221291065L);
+insert("uneg11<double>(mini32 + int32_t(a)) a=320", -0.999999850755557417870L);
+insert("u01fixedpt<double>(mini32 + int32_t(a)) a=320", 0.500000074622221291065L);
+insert("u01<long double>(mini32 + int32_t(a)) a=320", 0.500000074622221291065L);
+insert("uneg11<long double>(mini32 + int32_t(a)) a=320", -0.999999850755557417870L);
+insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=320", 0.500000074622221291065L);
+insert("u01<float>(mini64 + int64_t(a)) a=320", 0.500000000000000000000L);
+insert("uneg11<float>(mini64 + int64_t(a)) a=320", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini64 + int64_t(a)) a=320", 0.500000059604644775391L);
+insert("u01<double>(mini64 + int64_t(a)) a=320", 0.500000000000000000000L);
+insert("uneg11<double>(mini64 + int64_t(a)) a=320", -1.00000000000000000000L);
+insert("u01fixedpt<double>(mini64 + int64_t(a)) a=320", 0.500000000000000111022L);
+insert("u01<long double>(mini64 + int64_t(a)) a=320", 0.500000000000000017347L);
+insert("uneg11<long double>(mini64 + int64_t(a)) a=320", -0.999999999999999965251L);
+insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=320", 0.500000000000000017401L);
+insert("u01<float>(maxu32 - uint32_t(a)) a=320", 0.999999940395355224609L);
+insert("uneg11<float>(maxu32 - uint32_t(a)) a=320", -1.49244442582130432129e-07L);
+insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=320", 0.999999940395355224609L);
+insert("u01<double>(maxu32 - uint32_t(a)) a=320", 0.999999925377778708935L);
+insert("uneg11<double>(maxu32 - uint32_t(a)) a=320", -1.49244442582130432129e-07L);
+insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=320", 0.999999925377778708935L);
+insert("u01<long double>(maxu32 - uint32_t(a)) a=320", 0.999999925377778708935L);
+insert("uneg11<long double>(maxu32 - uint32_t(a)) a=320", -1.49244442582130432129e-07L);
+insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=320", 0.999999925377778708935L);
+insert("u01<float>(maxu64 - uint64_t(a)) a=320", 1.00000000000000000000L);
+insert("uneg11<float>(maxu64 - uint64_t(a)) a=320", -3.47486796281604171099e-17L);
+insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=320", 0.999999940395355224609L);
+insert("u01<double>(maxu64 - uint64_t(a)) a=320", 1.00000000000000000000L);
+insert("uneg11<double>(maxu64 - uint64_t(a)) a=320", -3.47486796281604171099e-17L);
+insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=320", 0.999999999999999888978L);
+insert("u01<long double>(maxu64 - uint64_t(a)) a=320", 0.999999999999999982653L);
+insert("uneg11<long double>(maxu64 - uint64_t(a)) a=320", -3.47486796281604171099e-17L);
+insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=320", 0.999999999999999982599L);
+insert("u01<float>(maxi32 - int32_t(a)) a=320", 0.499999910593032836914L);
+insert("uneg11<float>(maxi32 - int32_t(a)) a=320", 0.999999821186065673828L);
+insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=320", 0.499999940395355224609L);
+insert("u01<double>(maxi32 - int32_t(a)) a=320", 0.499999925377778708935L);
+insert("uneg11<double>(maxi32 - int32_t(a)) a=320", 0.999999850755557417870L);
+insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=320", 0.499999925377778708935L);
+insert("u01<long double>(maxi32 - int32_t(a)) a=320", 0.499999925377778708935L);
+insert("uneg11<long double>(maxi32 - int32_t(a)) a=320", 0.999999850755557417870L);
+insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=320", 0.499999925377778708935L);
+insert("u01<float>(maxi64 - int64_t(a)) a=320", 0.500000000000000000000L);
+insert("uneg11<float>(maxi64 - int64_t(a)) a=320", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=320", 0.499999940395355224609L);
+insert("u01<double>(maxi64 - int64_t(a)) a=320", 0.500000000000000000000L);
+insert("uneg11<double>(maxi64 - int64_t(a)) a=320", 1.00000000000000000000L);
+insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=320", 0.499999999999999888978L);
+insert("u01<long double>(maxi64 - int64_t(a)) a=320", 0.499999999999999982626L);
+insert("uneg11<long double>(maxi64 - int64_t(a)) a=320", 0.999999999999999965251L);
+insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=320", 0.499999999999999982599L);
+insert("u01<float>(minu32 + uint32_t(a)) a=321", 7.48550519347190856934e-08L);
+insert("uneg11<float>(minu32 + uint32_t(a)) a=321", 1.49710103869438171387e-07L);
+insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=321", 5.96046447753906250000e-08L);
+insert("u01<double>(minu32 + uint32_t(a)) a=321", 7.48550519347190856934e-08L);
+insert("uneg11<double>(minu32 + uint32_t(a)) a=321", 1.49710103869438171387e-07L);
+insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=321", 7.48550519347190856934e-08L);
+insert("u01<long double>(minu32 + uint32_t(a)) a=321", 7.48550519347190856934e-08L);
+insert("uneg11<long double>(minu32 + uint32_t(a)) a=321", 1.49710103869438171387e-07L);
+insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=321", 7.48550519347190856934e-08L);
+insert("u01<float>(minu64 + uint64_t(a)) a=321", 1.74285499227044837767e-17L);
+insert("uneg11<float>(minu64 + uint64_t(a)) a=321", 3.48570998454089675533e-17L);
+insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=321", 5.96046447753906250000e-08L);
+insert("u01<double>(minu64 + uint64_t(a)) a=321", 1.74285499227044837767e-17L);
+insert("uneg11<double>(minu64 + uint64_t(a)) a=321", 3.48570998454089675533e-17L);
+insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=321", 1.11022302462515654042e-16L);
+insert("u01<long double>(minu64 + uint64_t(a)) a=321", 1.74285499227044837767e-17L);
+insert("uneg11<long double>(minu64 + uint64_t(a)) a=321", 3.48570998454089675533e-17L);
+insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=321", 1.74014448683923461658e-17L);
+insert("u01<float>(mini32 + int32_t(a)) a=321", 0.500000059604644775391L);
+insert("uneg11<float>(mini32 + int32_t(a)) a=321", -0.999999821186065673828L);
+insert("u01fixedpt<float>(mini32 + int32_t(a)) a=321", 0.500000059604644775391L);
+insert("u01<double>(mini32 + int32_t(a)) a=321", 0.500000074855051934719L);
+insert("uneg11<double>(mini32 + int32_t(a)) a=321", -0.999999850289896130562L);
+insert("u01fixedpt<double>(mini32 + int32_t(a)) a=321", 0.500000074855051934719L);
+insert("u01<long double>(mini32 + int32_t(a)) a=321", 0.500000074855051934719L);
+insert("uneg11<long double>(mini32 + int32_t(a)) a=321", -0.999999850289896130562L);
+insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=321", 0.500000074855051934719L);
+insert("u01<float>(mini64 + int64_t(a)) a=321", 0.500000000000000000000L);
+insert("uneg11<float>(mini64 + int64_t(a)) a=321", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini64 + int64_t(a)) a=321", 0.500000059604644775391L);
+insert("u01<double>(mini64 + int64_t(a)) a=321", 0.500000000000000000000L);
+insert("uneg11<double>(mini64 + int64_t(a)) a=321", -1.00000000000000000000L);
+insert("u01fixedpt<double>(mini64 + int64_t(a)) a=321", 0.500000000000000111022L);
+insert("u01<long double>(mini64 + int64_t(a)) a=321", 0.500000000000000017456L);
+insert("uneg11<long double>(mini64 + int64_t(a)) a=321", -0.999999999999999965143L);
+insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=321", 0.500000000000000017401L);
+insert("u01<float>(maxu32 - uint32_t(a)) a=321", 0.999999940395355224609L);
+insert("uneg11<float>(maxu32 - uint32_t(a)) a=321", -1.49710103869438171387e-07L);
+insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=321", 0.999999940395355224609L);
+insert("u01<double>(maxu32 - uint32_t(a)) a=321", 0.999999925144948065281L);
+insert("uneg11<double>(maxu32 - uint32_t(a)) a=321", -1.49710103869438171387e-07L);
+insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=321", 0.999999925144948065281L);
+insert("u01<long double>(maxu32 - uint32_t(a)) a=321", 0.999999925144948065281L);
+insert("uneg11<long double>(maxu32 - uint32_t(a)) a=321", -1.49710103869438171387e-07L);
+insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=321", 0.999999925144948065281L);
+insert("u01<float>(maxu64 - uint64_t(a)) a=321", 1.00000000000000000000L);
+insert("uneg11<float>(maxu64 - uint64_t(a)) a=321", -3.48570998454089675533e-17L);
+insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=321", 0.999999940395355224609L);
+insert("u01<double>(maxu64 - uint64_t(a)) a=321", 1.00000000000000000000L);
+insert("uneg11<double>(maxu64 - uint64_t(a)) a=321", -3.48570998454089675533e-17L);
+insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=321", 0.999999999999999888978L);
+insert("u01<long double>(maxu64 - uint64_t(a)) a=321", 0.999999999999999982544L);
+insert("uneg11<long double>(maxu64 - uint64_t(a)) a=321", -3.48570998454089675533e-17L);
+insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=321", 0.999999999999999982599L);
+insert("u01<float>(maxi32 - int32_t(a)) a=321", 0.499999910593032836914L);
+insert("uneg11<float>(maxi32 - int32_t(a)) a=321", 0.999999821186065673828L);
+insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=321", 0.499999940395355224609L);
+insert("u01<double>(maxi32 - int32_t(a)) a=321", 0.499999925144948065281L);
+insert("uneg11<double>(maxi32 - int32_t(a)) a=321", 0.999999850289896130562L);
+insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=321", 0.499999925144948065281L);
+insert("u01<long double>(maxi32 - int32_t(a)) a=321", 0.499999925144948065281L);
+insert("uneg11<long double>(maxi32 - int32_t(a)) a=321", 0.999999850289896130562L);
+insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=321", 0.499999925144948065281L);
+insert("u01<float>(maxi64 - int64_t(a)) a=321", 0.500000000000000000000L);
+insert("uneg11<float>(maxi64 - int64_t(a)) a=321", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=321", 0.499999940395355224609L);
+insert("u01<double>(maxi64 - int64_t(a)) a=321", 0.500000000000000000000L);
+insert("uneg11<double>(maxi64 - int64_t(a)) a=321", 1.00000000000000000000L);
+insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=321", 0.499999999999999888978L);
+insert("u01<long double>(maxi64 - int64_t(a)) a=321", 0.499999999999999982571L);
+insert("uneg11<long double>(maxi64 - int64_t(a)) a=321", 0.999999999999999965143L);
+insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=321", 0.499999999999999982599L);
+insert("u01<float>(minu32 + uint32_t(a)) a=382", 8.90577211976051330566e-08L);
+insert("uneg11<float>(minu32 + uint32_t(a)) a=382", 1.78115442395210266113e-07L);
+insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=382", 5.96046447753906250000e-08L);
+insert("u01<double>(minu32 + uint32_t(a)) a=382", 8.90577211976051330566e-08L);
+insert("uneg11<double>(minu32 + uint32_t(a)) a=382", 1.78115442395210266113e-07L);
+insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=382", 8.90577211976051330566e-08L);
+insert("u01<long double>(minu32 + uint32_t(a)) a=382", 8.90577211976051330566e-08L);
+insert("uneg11<long double>(minu32 + uint32_t(a)) a=382", 1.78115442395210266113e-07L);
+insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=382", 8.90577211976051330566e-08L);
+insert("u01<float>(minu64 + uint64_t(a)) a=382", 2.07353665487852723004e-17L);
+insert("uneg11<float>(minu64 + uint64_t(a)) a=382", 4.14707330975705446008e-17L);
+insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=382", 5.96046447753906250000e-08L);
+insert("u01<double>(minu64 + uint64_t(a)) a=382", 2.07353665487852723004e-17L);
+insert("uneg11<double>(minu64 + uint64_t(a)) a=382", 4.14707330975705446008e-17L);
+insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=382", 1.11022302462515654042e-16L);
+insert("u01<long double>(minu64 + uint64_t(a)) a=382", 2.07353665487852723004e-17L);
+insert("uneg11<long double>(minu64 + uint64_t(a)) a=382", 4.14707330975705446008e-17L);
+insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=382", 2.07624716030974099112e-17L);
+insert("u01<float>(mini32 + int32_t(a)) a=382", 0.500000059604644775391L);
+insert("uneg11<float>(mini32 + int32_t(a)) a=382", -0.999999821186065673828L);
+insert("u01fixedpt<float>(mini32 + int32_t(a)) a=382", 0.500000059604644775391L);
+insert("u01<double>(mini32 + int32_t(a)) a=382", 0.500000089057721197605L);
+insert("uneg11<double>(mini32 + int32_t(a)) a=382", -0.999999821884557604790L);
+insert("u01fixedpt<double>(mini32 + int32_t(a)) a=382", 0.500000089057721197605L);
+insert("u01<long double>(mini32 + int32_t(a)) a=382", 0.500000089057721197605L);
+insert("uneg11<long double>(mini32 + int32_t(a)) a=382", -0.999999821884557604790L);
+insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=382", 0.500000089057721197605L);
+insert("u01<float>(mini64 + int64_t(a)) a=382", 0.500000000000000000000L);
+insert("uneg11<float>(mini64 + int64_t(a)) a=382", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini64 + int64_t(a)) a=382", 0.500000059604644775391L);
+insert("u01<double>(mini64 + int64_t(a)) a=382", 0.500000000000000000000L);
+insert("uneg11<double>(mini64 + int64_t(a)) a=382", -1.00000000000000000000L);
+insert("u01fixedpt<double>(mini64 + int64_t(a)) a=382", 0.500000000000000111022L);
+insert("u01<long double>(mini64 + int64_t(a)) a=382", 0.500000000000000020708L);
+insert("uneg11<long double>(mini64 + int64_t(a)) a=382", -0.999999999999999958529L);
+insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=382", 0.500000000000000020762L);
+insert("u01<float>(maxu32 - uint32_t(a)) a=382", 0.999999940395355224609L);
+insert("uneg11<float>(maxu32 - uint32_t(a)) a=382", -1.78115442395210266113e-07L);
+insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=382", 0.999999940395355224609L);
+insert("u01<double>(maxu32 - uint32_t(a)) a=382", 0.999999910942278802395L);
+insert("uneg11<double>(maxu32 - uint32_t(a)) a=382", -1.78115442395210266113e-07L);
+insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=382", 0.999999910942278802395L);
+insert("u01<long double>(maxu32 - uint32_t(a)) a=382", 0.999999910942278802395L);
+insert("uneg11<long double>(maxu32 - uint32_t(a)) a=382", -1.78115442395210266113e-07L);
+insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=382", 0.999999910942278802395L);
+insert("u01<float>(maxu64 - uint64_t(a)) a=382", 1.00000000000000000000L);
+insert("uneg11<float>(maxu64 - uint64_t(a)) a=382", -4.14707330975705446008e-17L);
+insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=382", 0.999999940395355224609L);
+insert("u01<double>(maxu64 - uint64_t(a)) a=382", 1.00000000000000000000L);
+insert("uneg11<double>(maxu64 - uint64_t(a)) a=382", -4.14707330975705446008e-17L);
+insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=382", 0.999999999999999888978L);
+insert("u01<long double>(maxu64 - uint64_t(a)) a=382", 0.999999999999999979292L);
+insert("uneg11<long double>(maxu64 - uint64_t(a)) a=382", -4.14707330975705446008e-17L);
+insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=382", 0.999999999999999979238L);
+insert("u01<float>(maxi32 - int32_t(a)) a=382", 0.499999910593032836914L);
+insert("uneg11<float>(maxi32 - int32_t(a)) a=382", 0.999999821186065673828L);
+insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=382", 0.499999940395355224609L);
+insert("u01<double>(maxi32 - int32_t(a)) a=382", 0.499999910942278802395L);
+insert("uneg11<double>(maxi32 - int32_t(a)) a=382", 0.999999821884557604790L);
+insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=382", 0.499999910942278802395L);
+insert("u01<long double>(maxi32 - int32_t(a)) a=382", 0.499999910942278802395L);
+insert("uneg11<long double>(maxi32 - int32_t(a)) a=382", 0.999999821884557604790L);
+insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=382", 0.499999910942278802395L);
+insert("u01<float>(maxi64 - int64_t(a)) a=382", 0.500000000000000000000L);
+insert("uneg11<float>(maxi64 - int64_t(a)) a=382", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=382", 0.499999940395355224609L);
+insert("u01<double>(maxi64 - int64_t(a)) a=382", 0.500000000000000000000L);
+insert("uneg11<double>(maxi64 - int64_t(a)) a=382", 1.00000000000000000000L);
+insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=382", 0.499999999999999888978L);
+insert("u01<long double>(maxi64 - int64_t(a)) a=382", 0.499999999999999979265L);
+insert("uneg11<long double>(maxi64 - int64_t(a)) a=382", 0.999999999999999958529L);
+insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=382", 0.499999999999999979238L);
+insert("u01<float>(minu32 + uint32_t(a)) a=383", 8.92905518412590026855e-08L);
+insert("uneg11<float>(minu32 + uint32_t(a)) a=383", 1.78581103682518005371e-07L);
+insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=383", 5.96046447753906250000e-08L);
+insert("u01<double>(minu32 + uint32_t(a)) a=383", 8.92905518412590026855e-08L);
+insert("uneg11<double>(minu32 + uint32_t(a)) a=383", 1.78581103682518005371e-07L);
+insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=383", 8.92905518412590026855e-08L);
+insert("u01<long double>(minu32 + uint32_t(a)) a=383", 8.92905518412590026855e-08L);
+insert("uneg11<long double>(minu32 + uint32_t(a)) a=383", 1.78581103682518005371e-07L);
+insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=383", 8.92905518412590026855e-08L);
+insert("u01<float>(minu64 + uint64_t(a)) a=383", 2.07895766574095475221e-17L);
+insert("uneg11<float>(minu64 + uint64_t(a)) a=383", 4.15791533148190950442e-17L);
+insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=383", 5.96046447753906250000e-08L);
+insert("u01<double>(minu64 + uint64_t(a)) a=383", 2.07895766574095475221e-17L);
+insert("uneg11<double>(minu64 + uint64_t(a)) a=383", 4.15791533148190950442e-17L);
+insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=383", 1.11022302462515654042e-16L);
+insert("u01<long double>(minu64 + uint64_t(a)) a=383", 2.07895766574095475221e-17L);
+insert("uneg11<long double>(minu64 + uint64_t(a)) a=383", 4.15791533148190950442e-17L);
+insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=383", 2.07624716030974099112e-17L);
+insert("u01<float>(mini32 + int32_t(a)) a=383", 0.500000059604644775391L);
+insert("uneg11<float>(mini32 + int32_t(a)) a=383", -0.999999821186065673828L);
+insert("u01fixedpt<float>(mini32 + int32_t(a)) a=383", 0.500000059604644775391L);
+insert("u01<double>(mini32 + int32_t(a)) a=383", 0.500000089290551841259L);
+insert("uneg11<double>(mini32 + int32_t(a)) a=383", -0.999999821418896317482L);
+insert("u01fixedpt<double>(mini32 + int32_t(a)) a=383", 0.500000089290551841259L);
+insert("u01<long double>(mini32 + int32_t(a)) a=383", 0.500000089290551841259L);
+insert("uneg11<long double>(mini32 + int32_t(a)) a=383", -0.999999821418896317482L);
+insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=383", 0.500000089290551841259L);
+insert("u01<float>(mini64 + int64_t(a)) a=383", 0.500000000000000000000L);
+insert("uneg11<float>(mini64 + int64_t(a)) a=383", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini64 + int64_t(a)) a=383", 0.500000059604644775391L);
+insert("u01<double>(mini64 + int64_t(a)) a=383", 0.500000000000000000000L);
+insert("uneg11<double>(mini64 + int64_t(a)) a=383", -1.00000000000000000000L);
+insert("u01fixedpt<double>(mini64 + int64_t(a)) a=383", 0.500000000000000111022L);
+insert("u01<long double>(mini64 + int64_t(a)) a=383", 0.500000000000000020817L);
+insert("uneg11<long double>(mini64 + int64_t(a)) a=383", -0.999999999999999958421L);
+insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=383", 0.500000000000000020762L);
+insert("u01<float>(maxu32 - uint32_t(a)) a=383", 0.999999880790710449219L);
+insert("uneg11<float>(maxu32 - uint32_t(a)) a=383", -1.78581103682518005371e-07L);
+insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=383", 0.999999940395355224609L);
+insert("u01<double>(maxu32 - uint32_t(a)) a=383", 0.999999910709448158741L);
+insert("uneg11<double>(maxu32 - uint32_t(a)) a=383", -1.78581103682518005371e-07L);
+insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=383", 0.999999910709448158741L);
+insert("u01<long double>(maxu32 - uint32_t(a)) a=383", 0.999999910709448158741L);
+insert("uneg11<long double>(maxu32 - uint32_t(a)) a=383", -1.78581103682518005371e-07L);
+insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=383", 0.999999910709448158741L);
+insert("u01<float>(maxu64 - uint64_t(a)) a=383", 1.00000000000000000000L);
+insert("uneg11<float>(maxu64 - uint64_t(a)) a=383", -4.15791533148190950442e-17L);
+insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=383", 0.999999940395355224609L);
+insert("u01<double>(maxu64 - uint64_t(a)) a=383", 1.00000000000000000000L);
+insert("uneg11<double>(maxu64 - uint64_t(a)) a=383", -4.15791533148190950442e-17L);
+insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=383", 0.999999999999999888978L);
+insert("u01<long double>(maxu64 - uint64_t(a)) a=383", 0.999999999999999979183L);
+insert("uneg11<long double>(maxu64 - uint64_t(a)) a=383", -4.15791533148190950442e-17L);
+insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=383", 0.999999999999999979238L);
+insert("u01<float>(maxi32 - int32_t(a)) a=383", 0.499999910593032836914L);
+insert("uneg11<float>(maxi32 - int32_t(a)) a=383", 0.999999821186065673828L);
+insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=383", 0.499999940395355224609L);
+insert("u01<double>(maxi32 - int32_t(a)) a=383", 0.499999910709448158741L);
+insert("uneg11<double>(maxi32 - int32_t(a)) a=383", 0.999999821418896317482L);
+insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=383", 0.499999910709448158741L);
+insert("u01<long double>(maxi32 - int32_t(a)) a=383", 0.499999910709448158741L);
+insert("uneg11<long double>(maxi32 - int32_t(a)) a=383", 0.999999821418896317482L);
+insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=383", 0.499999910709448158741L);
+insert("u01<float>(maxi64 - int64_t(a)) a=383", 0.500000000000000000000L);
+insert("uneg11<float>(maxi64 - int64_t(a)) a=383", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=383", 0.499999940395355224609L);
+insert("u01<double>(maxi64 - int64_t(a)) a=383", 0.500000000000000000000L);
+insert("uneg11<double>(maxi64 - int64_t(a)) a=383", 1.00000000000000000000L);
+insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=383", 0.499999999999999888978L);
+insert("u01<long double>(maxi64 - int64_t(a)) a=383", 0.499999999999999979210L);
+insert("uneg11<long double>(maxi64 - int64_t(a)) a=383", 0.999999999999999958421L);
+insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=383", 0.499999999999999979238L);
+insert("u01<float>(minu32 + uint32_t(a)) a=384", 8.95233824849128723145e-08L);
+insert("uneg11<float>(minu32 + uint32_t(a)) a=384", 1.79046764969825744629e-07L);
+insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=384", 5.96046447753906250000e-08L);
+insert("u01<double>(minu32 + uint32_t(a)) a=384", 8.95233824849128723145e-08L);
+insert("uneg11<double>(minu32 + uint32_t(a)) a=384", 1.79046764969825744629e-07L);
+insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=384", 8.95233824849128723145e-08L);
+insert("u01<long double>(minu32 + uint32_t(a)) a=384", 8.95233824849128723145e-08L);
+insert("uneg11<long double>(minu32 + uint32_t(a)) a=384", 1.79046764969825744629e-07L);
+insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=384", 8.95233824849128723145e-08L);
+insert("u01<float>(minu64 + uint64_t(a)) a=384", 2.08437867660338227438e-17L);
+insert("uneg11<float>(minu64 + uint64_t(a)) a=384", 4.16875735320676454876e-17L);
+insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=384", 5.96046447753906250000e-08L);
+insert("u01<double>(minu64 + uint64_t(a)) a=384", 2.08437867660338227438e-17L);
+insert("uneg11<double>(minu64 + uint64_t(a)) a=384", 4.16875735320676454876e-17L);
+insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=384", 1.11022302462515654042e-16L);
+insert("u01<long double>(minu64 + uint64_t(a)) a=384", 2.08437867660338227438e-17L);
+insert("uneg11<long double>(minu64 + uint64_t(a)) a=384", 4.16875735320676454876e-17L);
+insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=384", 2.08708918203459603546e-17L);
+insert("u01<float>(mini32 + int32_t(a)) a=384", 0.500000119209289550781L);
+insert("uneg11<float>(mini32 + int32_t(a)) a=384", -0.999999821186065673828L);
+insert("u01fixedpt<float>(mini32 + int32_t(a)) a=384", 0.500000059604644775391L);
+insert("u01<double>(mini32 + int32_t(a)) a=384", 0.500000089523382484913L);
+insert("uneg11<double>(mini32 + int32_t(a)) a=384", -0.999999820953235030174L);
+insert("u01fixedpt<double>(mini32 + int32_t(a)) a=384", 0.500000089523382484913L);
+insert("u01<long double>(mini32 + int32_t(a)) a=384", 0.500000089523382484913L);
+insert("uneg11<long double>(mini32 + int32_t(a)) a=384", -0.999999820953235030174L);
+insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=384", 0.500000089523382484913L);
+insert("u01<float>(mini64 + int64_t(a)) a=384", 0.500000000000000000000L);
+insert("uneg11<float>(mini64 + int64_t(a)) a=384", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini64 + int64_t(a)) a=384", 0.500000059604644775391L);
+insert("u01<double>(mini64 + int64_t(a)) a=384", 0.500000000000000000000L);
+insert("uneg11<double>(mini64 + int64_t(a)) a=384", -1.00000000000000000000L);
+insert("u01fixedpt<double>(mini64 + int64_t(a)) a=384", 0.500000000000000111022L);
+insert("u01<long double>(mini64 + int64_t(a)) a=384", 0.500000000000000020817L);
+insert("uneg11<long double>(mini64 + int64_t(a)) a=384", -0.999999999999999958312L);
+insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=384", 0.500000000000000020871L);
+insert("u01<float>(maxu32 - uint32_t(a)) a=384", 0.999999880790710449219L);
+insert("uneg11<float>(maxu32 - uint32_t(a)) a=384", -1.79046764969825744629e-07L);
+insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=384", 0.999999940395355224609L);
+insert("u01<double>(maxu32 - uint32_t(a)) a=384", 0.999999910476617515087L);
+insert("uneg11<double>(maxu32 - uint32_t(a)) a=384", -1.79046764969825744629e-07L);
+insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=384", 0.999999910476617515087L);
+insert("u01<long double>(maxu32 - uint32_t(a)) a=384", 0.999999910476617515087L);
+insert("uneg11<long double>(maxu32 - uint32_t(a)) a=384", -1.79046764969825744629e-07L);
+insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=384", 0.999999910476617515087L);
+insert("u01<float>(maxu64 - uint64_t(a)) a=384", 1.00000000000000000000L);
+insert("uneg11<float>(maxu64 - uint64_t(a)) a=384", -4.16875735320676454876e-17L);
+insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=384", 0.999999940395355224609L);
+insert("u01<double>(maxu64 - uint64_t(a)) a=384", 1.00000000000000000000L);
+insert("uneg11<double>(maxu64 - uint64_t(a)) a=384", -4.16875735320676454876e-17L);
+insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=384", 0.999999999999999888978L);
+insert("u01<long double>(maxu64 - uint64_t(a)) a=384", 0.999999999999999979183L);
+insert("uneg11<long double>(maxu64 - uint64_t(a)) a=384", -4.16875735320676454876e-17L);
+insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=384", 0.999999999999999979129L);
+insert("u01<float>(maxi32 - int32_t(a)) a=384", 0.499999910593032836914L);
+insert("uneg11<float>(maxi32 - int32_t(a)) a=384", 0.999999821186065673828L);
+insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=384", 0.499999940395355224609L);
+insert("u01<double>(maxi32 - int32_t(a)) a=384", 0.499999910476617515087L);
+insert("uneg11<double>(maxi32 - int32_t(a)) a=384", 0.999999820953235030174L);
+insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=384", 0.499999910476617515087L);
+insert("u01<long double>(maxi32 - int32_t(a)) a=384", 0.499999910476617515087L);
+insert("uneg11<long double>(maxi32 - int32_t(a)) a=384", 0.999999820953235030174L);
+insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=384", 0.499999910476617515087L);
+insert("u01<float>(maxi64 - int64_t(a)) a=384", 0.500000000000000000000L);
+insert("uneg11<float>(maxi64 - int64_t(a)) a=384", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=384", 0.499999940395355224609L);
+insert("u01<double>(maxi64 - int64_t(a)) a=384", 0.500000000000000000000L);
+insert("uneg11<double>(maxi64 - int64_t(a)) a=384", 1.00000000000000000000L);
+insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=384", 0.499999999999999888978L);
+insert("u01<long double>(maxi64 - int64_t(a)) a=384", 0.499999999999999979156L);
+insert("uneg11<long double>(maxi64 - int64_t(a)) a=384", 0.999999999999999958312L);
+insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=384", 0.499999999999999979129L);
+insert("u01<float>(minu32 + uint32_t(a)) a=639", 1.48895196616649627686e-07L);
+insert("uneg11<float>(minu32 + uint32_t(a)) a=639", 2.97790393233299255371e-07L);
+insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=639", 1.78813934326171875000e-07L);
+insert("u01<double>(minu32 + uint32_t(a)) a=639", 1.48895196616649627686e-07L);
+insert("uneg11<double>(minu32 + uint32_t(a)) a=639", 2.97790393233299255371e-07L);
+insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=639", 1.48895196616649627686e-07L);
+insert("u01<long double>(minu32 + uint32_t(a)) a=639", 1.48895196616649627686e-07L);
+insert("uneg11<long double>(minu32 + uint32_t(a)) a=639", 2.97790393233299255371e-07L);
+insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=639", 1.48895196616649627686e-07L);
+insert("u01<float>(minu64 + uint64_t(a)) a=639", 3.46673644652240042774e-17L);
+insert("uneg11<float>(minu64 + uint64_t(a)) a=639", 6.93347289304480085548e-17L);
+insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=639", 5.96046447753906250000e-08L);
+insert("u01<double>(minu64 + uint64_t(a)) a=639", 3.46673644652240042774e-17L);
+insert("uneg11<double>(minu64 + uint64_t(a)) a=639", 6.93347289304480085548e-17L);
+insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=639", 1.11022302462515654042e-16L);
+insert("u01<long double>(minu64 + uint64_t(a)) a=639", 3.46673644652240042774e-17L);
+insert("uneg11<long double>(minu64 + uint64_t(a)) a=639", 6.93347289304480085548e-17L);
+insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=639", 3.46402594109118666665e-17L);
+insert("u01<float>(mini32 + int32_t(a)) a=639", 0.500000119209289550781L);
+insert("uneg11<float>(mini32 + int32_t(a)) a=639", -0.999999701976776123047L);
+insert("u01fixedpt<float>(mini32 + int32_t(a)) a=639", 0.500000178813934326172L);
+insert("u01<double>(mini32 + int32_t(a)) a=639", 0.500000148895196616650L);
+insert("uneg11<double>(mini32 + int32_t(a)) a=639", -0.999999702209606766701L);
+insert("u01fixedpt<double>(mini32 + int32_t(a)) a=639", 0.500000148895196616650L);
+insert("u01<long double>(mini32 + int32_t(a)) a=639", 0.500000148895196616650L);
+insert("uneg11<long double>(mini32 + int32_t(a)) a=639", -0.999999702209606766701L);
+insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=639", 0.500000148895196616650L);
+insert("u01<float>(mini64 + int64_t(a)) a=639", 0.500000000000000000000L);
+insert("uneg11<float>(mini64 + int64_t(a)) a=639", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini64 + int64_t(a)) a=639", 0.500000059604644775391L);
+insert("u01<double>(mini64 + int64_t(a)) a=639", 0.500000000000000000000L);
+insert("uneg11<double>(mini64 + int64_t(a)) a=639", -0.999999999999999888978L);
+insert("u01fixedpt<double>(mini64 + int64_t(a)) a=639", 0.500000000000000111022L);
+insert("u01<long double>(mini64 + int64_t(a)) a=639", 0.500000000000000034694L);
+insert("uneg11<long double>(mini64 + int64_t(a)) a=639", -0.999999999999999930665L);
+insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=639", 0.500000000000000034640L);
+insert("u01<float>(maxu32 - uint32_t(a)) a=639", 0.999999880790710449219L);
+insert("uneg11<float>(maxu32 - uint32_t(a)) a=639", -2.97790393233299255371e-07L);
+insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=639", 0.999999821186065673828L);
+insert("u01<double>(maxu32 - uint32_t(a)) a=639", 0.999999851104803383350L);
+insert("uneg11<double>(maxu32 - uint32_t(a)) a=639", -2.97790393233299255371e-07L);
+insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=639", 0.999999851104803383350L);
+insert("u01<long double>(maxu32 - uint32_t(a)) a=639", 0.999999851104803383350L);
+insert("uneg11<long double>(maxu32 - uint32_t(a)) a=639", -2.97790393233299255371e-07L);
+insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=639", 0.999999851104803383350L);
+insert("u01<float>(maxu64 - uint64_t(a)) a=639", 1.00000000000000000000L);
+insert("uneg11<float>(maxu64 - uint64_t(a)) a=639", -6.93347289304480085548e-17L);
+insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=639", 0.999999940395355224609L);
+insert("u01<double>(maxu64 - uint64_t(a)) a=639", 1.00000000000000000000L);
+insert("uneg11<double>(maxu64 - uint64_t(a)) a=639", -6.93347289304480085548e-17L);
+insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=639", 0.999999999999999888978L);
+insert("u01<long double>(maxu64 - uint64_t(a)) a=639", 0.999999999999999965306L);
+insert("uneg11<long double>(maxu64 - uint64_t(a)) a=639", -6.93347289304480085548e-17L);
+insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=639", 0.999999999999999965360L);
+insert("u01<float>(maxi32 - int32_t(a)) a=639", 0.499999850988388061523L);
+insert("uneg11<float>(maxi32 - int32_t(a)) a=639", 0.999999701976776123047L);
+insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=639", 0.499999821186065673828L);
+insert("u01<double>(maxi32 - int32_t(a)) a=639", 0.499999851104803383350L);
+insert("uneg11<double>(maxi32 - int32_t(a)) a=639", 0.999999702209606766701L);
+insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=639", 0.499999851104803383350L);
+insert("u01<long double>(maxi32 - int32_t(a)) a=639", 0.499999851104803383350L);
+insert("uneg11<long double>(maxi32 - int32_t(a)) a=639", 0.999999702209606766701L);
+insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=639", 0.499999851104803383350L);
+insert("u01<float>(maxi64 - int64_t(a)) a=639", 0.500000000000000000000L);
+insert("uneg11<float>(maxi64 - int64_t(a)) a=639", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=639", 0.499999940395355224609L);
+insert("u01<double>(maxi64 - int64_t(a)) a=639", 0.499999999999999944489L);
+insert("uneg11<double>(maxi64 - int64_t(a)) a=639", 0.999999999999999888978L);
+insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=639", 0.499999999999999888978L);
+insert("u01<long double>(maxi64 - int64_t(a)) a=639", 0.499999999999999965333L);
+insert("uneg11<long double>(maxi64 - int64_t(a)) a=639", 0.999999999999999930665L);
+insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=639", 0.499999999999999965360L);
+insert("u01<float>(minu32 + uint32_t(a)) a=640", 1.49128027260303497314e-07L);
+insert("uneg11<float>(minu32 + uint32_t(a)) a=640", 2.98256054520606994629e-07L);
+insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=640", 1.78813934326171875000e-07L);
+insert("u01<double>(minu32 + uint32_t(a)) a=640", 1.49128027260303497314e-07L);
+insert("uneg11<double>(minu32 + uint32_t(a)) a=640", 2.98256054520606994629e-07L);
+insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=640", 1.49128027260303497314e-07L);
+insert("u01<long double>(minu32 + uint32_t(a)) a=640", 1.49128027260303497314e-07L);
+insert("uneg11<long double>(minu32 + uint32_t(a)) a=640", 2.98256054520606994629e-07L);
+insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=640", 1.49128027260303497314e-07L);
+insert("u01<float>(minu64 + uint64_t(a)) a=640", 3.47215745738482794991e-17L);
+insert("uneg11<float>(minu64 + uint64_t(a)) a=640", 6.94431491476965589982e-17L);
+insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=640", 5.96046447753906250000e-08L);
+insert("u01<double>(minu64 + uint64_t(a)) a=640", 3.47215745738482794991e-17L);
+insert("uneg11<double>(minu64 + uint64_t(a)) a=640", 6.94431491476965589982e-17L);
+insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=640", 1.11022302462515654042e-16L);
+insert("u01<long double>(minu64 + uint64_t(a)) a=640", 3.47215745738482794991e-17L);
+insert("uneg11<long double>(minu64 + uint64_t(a)) a=640", 6.94431491476965589982e-17L);
+insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=640", 3.47486796281604171099e-17L);
+insert("u01<float>(mini32 + int32_t(a)) a=640", 0.500000119209289550781L);
+insert("uneg11<float>(mini32 + int32_t(a)) a=640", -0.999999701976776123047L);
+insert("u01fixedpt<float>(mini32 + int32_t(a)) a=640", 0.500000178813934326172L);
+insert("u01<double>(mini32 + int32_t(a)) a=640", 0.500000149128027260303L);
+insert("uneg11<double>(mini32 + int32_t(a)) a=640", -0.999999701743945479393L);
+insert("u01fixedpt<double>(mini32 + int32_t(a)) a=640", 0.500000149128027260303L);
+insert("u01<long double>(mini32 + int32_t(a)) a=640", 0.500000149128027260303L);
+insert("uneg11<long double>(mini32 + int32_t(a)) a=640", -0.999999701743945479393L);
+insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=640", 0.500000149128027260303L);
+insert("u01<float>(mini64 + int64_t(a)) a=640", 0.500000000000000000000L);
+insert("uneg11<float>(mini64 + int64_t(a)) a=640", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini64 + int64_t(a)) a=640", 0.500000059604644775391L);
+insert("u01<double>(mini64 + int64_t(a)) a=640", 0.500000000000000000000L);
+insert("uneg11<double>(mini64 + int64_t(a)) a=640", -0.999999999999999888978L);
+insert("u01fixedpt<double>(mini64 + int64_t(a)) a=640", 0.500000000000000111022L);
+insert("u01<long double>(mini64 + int64_t(a)) a=640", 0.500000000000000034694L);
+insert("uneg11<long double>(mini64 + int64_t(a)) a=640", -0.999999999999999930557L);
+insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=640", 0.500000000000000034749L);
+insert("u01<float>(maxu32 - uint32_t(a)) a=640", 0.999999821186065673828L);
+insert("uneg11<float>(maxu32 - uint32_t(a)) a=640", -2.98256054520606994629e-07L);
+insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=640", 0.999999821186065673828L);
+insert("u01<double>(maxu32 - uint32_t(a)) a=640", 0.999999850871972739697L);
+insert("uneg11<double>(maxu32 - uint32_t(a)) a=640", -2.98256054520606994629e-07L);
+insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=640", 0.999999850871972739697L);
+insert("u01<long double>(maxu32 - uint32_t(a)) a=640", 0.999999850871972739697L);
+insert("uneg11<long double>(maxu32 - uint32_t(a)) a=640", -2.98256054520606994629e-07L);
+insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=640", 0.999999850871972739697L);
+insert("u01<float>(maxu64 - uint64_t(a)) a=640", 1.00000000000000000000L);
+insert("uneg11<float>(maxu64 - uint64_t(a)) a=640", -6.94431491476965589982e-17L);
+insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=640", 0.999999940395355224609L);
+insert("u01<double>(maxu64 - uint64_t(a)) a=640", 1.00000000000000000000L);
+insert("uneg11<double>(maxu64 - uint64_t(a)) a=640", -6.94431491476965589982e-17L);
+insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=640", 0.999999999999999888978L);
+insert("u01<long double>(maxu64 - uint64_t(a)) a=640", 0.999999999999999965306L);
+insert("uneg11<long double>(maxu64 - uint64_t(a)) a=640", -6.94431491476965589982e-17L);
+insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=640", 0.999999999999999965251L);
+insert("u01<float>(maxi32 - int32_t(a)) a=640", 0.499999850988388061523L);
+insert("uneg11<float>(maxi32 - int32_t(a)) a=640", 0.999999701976776123047L);
+insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=640", 0.499999821186065673828L);
+insert("u01<double>(maxi32 - int32_t(a)) a=640", 0.499999850871972739697L);
+insert("uneg11<double>(maxi32 - int32_t(a)) a=640", 0.999999701743945479393L);
+insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=640", 0.499999850871972739697L);
+insert("u01<long double>(maxi32 - int32_t(a)) a=640", 0.499999850871972739697L);
+insert("uneg11<long double>(maxi32 - int32_t(a)) a=640", 0.999999701743945479393L);
+insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=640", 0.499999850871972739697L);
+insert("u01<float>(maxi64 - int64_t(a)) a=640", 0.500000000000000000000L);
+insert("uneg11<float>(maxi64 - int64_t(a)) a=640", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=640", 0.499999940395355224609L);
+insert("u01<double>(maxi64 - int64_t(a)) a=640", 0.499999999999999944489L);
+insert("uneg11<double>(maxi64 - int64_t(a)) a=640", 0.999999999999999888978L);
+insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=640", 0.499999999999999888978L);
+insert("u01<long double>(maxi64 - int64_t(a)) a=640", 0.499999999999999965278L);
+insert("uneg11<long double>(maxi64 - int64_t(a)) a=640", 0.999999999999999930557L);
+insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=640", 0.499999999999999965251L);
+insert("u01<float>(minu32 + uint32_t(a)) a=641", 1.49360857903957366943e-07L);
+insert("uneg11<float>(minu32 + uint32_t(a)) a=641", 2.98721715807914733887e-07L);
+insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=641", 1.78813934326171875000e-07L);
+insert("u01<double>(minu32 + uint32_t(a)) a=641", 1.49360857903957366943e-07L);
+insert("uneg11<double>(minu32 + uint32_t(a)) a=641", 2.98721715807914733887e-07L);
+insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=641", 1.49360857903957366943e-07L);
+insert("u01<long double>(minu32 + uint32_t(a)) a=641", 1.49360857903957366943e-07L);
+insert("uneg11<long double>(minu32 + uint32_t(a)) a=641", 2.98721715807914733887e-07L);
+insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=641", 1.49360857903957366943e-07L);
+insert("u01<float>(minu64 + uint64_t(a)) a=641", 3.47757846824725547208e-17L);
+insert("uneg11<float>(minu64 + uint64_t(a)) a=641", 6.95515693649451094416e-17L);
+insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=641", 5.96046447753906250000e-08L);
+insert("u01<double>(minu64 + uint64_t(a)) a=641", 3.47757846824725547208e-17L);
+insert("uneg11<double>(minu64 + uint64_t(a)) a=641", 6.95515693649451094416e-17L);
+insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=641", 1.11022302462515654042e-16L);
+insert("u01<long double>(minu64 + uint64_t(a)) a=641", 3.47757846824725547208e-17L);
+insert("uneg11<long double>(minu64 + uint64_t(a)) a=641", 6.95515693649451094416e-17L);
+insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=641", 3.47486796281604171099e-17L);
+insert("u01<float>(mini32 + int32_t(a)) a=641", 0.500000178813934326172L);
+insert("uneg11<float>(mini32 + int32_t(a)) a=641", -0.999999701976776123047L);
+insert("u01fixedpt<float>(mini32 + int32_t(a)) a=641", 0.500000178813934326172L);
+insert("u01<double>(mini32 + int32_t(a)) a=641", 0.500000149360857903957L);
+insert("uneg11<double>(mini32 + int32_t(a)) a=641", -0.999999701278284192085L);
+insert("u01fixedpt<double>(mini32 + int32_t(a)) a=641", 0.500000149360857903957L);
+insert("u01<long double>(mini32 + int32_t(a)) a=641", 0.500000149360857903957L);
+insert("uneg11<long double>(mini32 + int32_t(a)) a=641", -0.999999701278284192085L);
+insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=641", 0.500000149360857903957L);
+insert("u01<float>(mini64 + int64_t(a)) a=641", 0.500000000000000000000L);
+insert("uneg11<float>(mini64 + int64_t(a)) a=641", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini64 + int64_t(a)) a=641", 0.500000059604644775391L);
+insert("u01<double>(mini64 + int64_t(a)) a=641", 0.500000000000000000000L);
+insert("uneg11<double>(mini64 + int64_t(a)) a=641", -0.999999999999999888978L);
+insert("u01fixedpt<double>(mini64 + int64_t(a)) a=641", 0.500000000000000111022L);
+insert("u01<long double>(mini64 + int64_t(a)) a=641", 0.500000000000000034803L);
+insert("uneg11<long double>(mini64 + int64_t(a)) a=641", -0.999999999999999930448L);
+insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=641", 0.500000000000000034749L);
+insert("u01<float>(maxu32 - uint32_t(a)) a=641", 0.999999821186065673828L);
+insert("uneg11<float>(maxu32 - uint32_t(a)) a=641", -2.98721715807914733887e-07L);
+insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=641", 0.999999821186065673828L);
+insert("u01<double>(maxu32 - uint32_t(a)) a=641", 0.999999850639142096043L);
+insert("uneg11<double>(maxu32 - uint32_t(a)) a=641", -2.98721715807914733887e-07L);
+insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=641", 0.999999850639142096043L);
+insert("u01<long double>(maxu32 - uint32_t(a)) a=641", 0.999999850639142096043L);
+insert("uneg11<long double>(maxu32 - uint32_t(a)) a=641", -2.98721715807914733887e-07L);
+insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=641", 0.999999850639142096043L);
+insert("u01<float>(maxu64 - uint64_t(a)) a=641", 1.00000000000000000000L);
+insert("uneg11<float>(maxu64 - uint64_t(a)) a=641", -6.95515693649451094416e-17L);
+insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=641", 0.999999940395355224609L);
+insert("u01<double>(maxu64 - uint64_t(a)) a=641", 1.00000000000000000000L);
+insert("uneg11<double>(maxu64 - uint64_t(a)) a=641", -6.95515693649451094416e-17L);
+insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=641", 0.999999999999999888978L);
+insert("u01<long double>(maxu64 - uint64_t(a)) a=641", 0.999999999999999965197L);
+insert("uneg11<long double>(maxu64 - uint64_t(a)) a=641", -6.95515693649451094416e-17L);
+insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=641", 0.999999999999999965251L);
+insert("u01<float>(maxi32 - int32_t(a)) a=641", 0.499999850988388061523L);
+insert("uneg11<float>(maxi32 - int32_t(a)) a=641", 0.999999701976776123047L);
+insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=641", 0.499999821186065673828L);
+insert("u01<double>(maxi32 - int32_t(a)) a=641", 0.499999850639142096043L);
+insert("uneg11<double>(maxi32 - int32_t(a)) a=641", 0.999999701278284192085L);
+insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=641", 0.499999850639142096043L);
+insert("u01<long double>(maxi32 - int32_t(a)) a=641", 0.499999850639142096043L);
+insert("uneg11<long double>(maxi32 - int32_t(a)) a=641", 0.999999701278284192085L);
+insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=641", 0.499999850639142096043L);
+insert("u01<float>(maxi64 - int64_t(a)) a=641", 0.500000000000000000000L);
+insert("uneg11<float>(maxi64 - int64_t(a)) a=641", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=641", 0.499999940395355224609L);
+insert("u01<double>(maxi64 - int64_t(a)) a=641", 0.499999999999999944489L);
+insert("uneg11<double>(maxi64 - int64_t(a)) a=641", 0.999999999999999888978L);
+insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=641", 0.499999999999999888978L);
+insert("u01<long double>(maxi64 - int64_t(a)) a=641", 0.499999999999999965224L);
+insert("uneg11<long double>(maxi64 - int64_t(a)) a=641", 0.999999999999999930448L);
+insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=641", 0.499999999999999965251L);
+insert("u01<float>(minu32 + uint32_t(a)) a=1023", 2.38302163779735565186e-07L);
+insert("uneg11<float>(minu32 + uint32_t(a)) a=1023", 4.76604327559471130371e-07L);
+insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=1023", 1.78813934326171875000e-07L);
+insert("u01<double>(minu32 + uint32_t(a)) a=1023", 2.38302163779735565186e-07L);
+insert("uneg11<double>(minu32 + uint32_t(a)) a=1023", 4.76604327559471130371e-07L);
+insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=1023", 2.38302163779735565186e-07L);
+insert("u01<long double>(minu32 + uint32_t(a)) a=1023", 2.38302163779735565186e-07L);
+insert("uneg11<long double>(minu32 + uint32_t(a)) a=1023", 4.76604327559471130371e-07L);
+insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=1023", 2.38302163779735565186e-07L);
+insert("u01<float>(minu64 + uint64_t(a)) a=1023", 5.54840461769456894103e-17L);
+insert("uneg11<float>(minu64 + uint64_t(a)) a=1023", 1.10968092353891378821e-16L);
+insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=1023", 5.96046447753906250000e-08L);
+insert("u01<double>(minu64 + uint64_t(a)) a=1023", 5.54840461769456894103e-17L);
+insert("uneg11<double>(minu64 + uint64_t(a)) a=1023", 1.10968092353891378821e-16L);
+insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=1023", 1.11022302462515654042e-16L);
+insert("u01<long double>(minu64 + uint64_t(a)) a=1023", 5.54840461769456894103e-17L);
+insert("uneg11<long double>(minu64 + uint64_t(a)) a=1023", 1.10968092353891378821e-16L);
+insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=1023", 5.54569411226335517995e-17L);
+insert("u01<float>(mini32 + int32_t(a)) a=1023", 0.500000238418579101562L);
+insert("uneg11<float>(mini32 + int32_t(a)) a=1023", -0.999999523162841796875L);
+insert("u01fixedpt<float>(mini32 + int32_t(a)) a=1023", 0.500000178813934326172L);
+insert("u01<double>(mini32 + int32_t(a)) a=1023", 0.500000238302163779736L);
+insert("uneg11<double>(mini32 + int32_t(a)) a=1023", -0.999999523395672440529L);
+insert("u01fixedpt<double>(mini32 + int32_t(a)) a=1023", 0.500000238302163779736L);
+insert("u01<long double>(mini32 + int32_t(a)) a=1023", 0.500000238302163779736L);
+insert("uneg11<long double>(mini32 + int32_t(a)) a=1023", -0.999999523395672440529L);
+insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=1023", 0.500000238302163779736L);
+insert("u01<float>(mini64 + int64_t(a)) a=1023", 0.500000000000000000000L);
+insert("uneg11<float>(mini64 + int64_t(a)) a=1023", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini64 + int64_t(a)) a=1023", 0.500000059604644775391L);
+insert("u01<double>(mini64 + int64_t(a)) a=1023", 0.500000000000000000000L);
+insert("uneg11<double>(mini64 + int64_t(a)) a=1023", -0.999999999999999888978L);
+insert("u01fixedpt<double>(mini64 + int64_t(a)) a=1023", 0.500000000000000111022L);
+insert("u01<long double>(mini64 + int64_t(a)) a=1023", 0.500000000000000055511L);
+insert("uneg11<long double>(mini64 + int64_t(a)) a=1023", -0.999999999999999889032L);
+insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=1023", 0.500000000000000055457L);
+insert("u01<float>(maxu32 - uint32_t(a)) a=1023", 0.999999761581420898438L);
+insert("uneg11<float>(maxu32 - uint32_t(a)) a=1023", -4.76604327559471130371e-07L);
+insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=1023", 0.999999821186065673828L);
+insert("u01<double>(maxu32 - uint32_t(a)) a=1023", 0.999999761697836220264L);
+insert("uneg11<double>(maxu32 - uint32_t(a)) a=1023", -4.76604327559471130371e-07L);
+insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=1023", 0.999999761697836220264L);
+insert("u01<long double>(maxu32 - uint32_t(a)) a=1023", 0.999999761697836220264L);
+insert("uneg11<long double>(maxu32 - uint32_t(a)) a=1023", -4.76604327559471130371e-07L);
+insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=1023", 0.999999761697836220264L);
+insert("u01<float>(maxu64 - uint64_t(a)) a=1023", 1.00000000000000000000L);
+insert("uneg11<float>(maxu64 - uint64_t(a)) a=1023", -1.10968092353891378821e-16L);
+insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=1023", 0.999999940395355224609L);
+insert("u01<double>(maxu64 - uint64_t(a)) a=1023", 1.00000000000000000000L);
+insert("uneg11<double>(maxu64 - uint64_t(a)) a=1023", -1.10968092353891378821e-16L);
+insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=1023", 0.999999999999999888978L);
+insert("u01<long double>(maxu64 - uint64_t(a)) a=1023", 0.999999999999999944489L);
+insert("uneg11<long double>(maxu64 - uint64_t(a)) a=1023", -1.10968092353891378821e-16L);
+insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=1023", 0.999999999999999944543L);
+insert("u01<float>(maxi32 - int32_t(a)) a=1023", 0.499999761581420898438L);
+insert("uneg11<float>(maxi32 - int32_t(a)) a=1023", 0.999999523162841796875L);
+insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=1023", 0.499999821186065673828L);
+insert("u01<double>(maxi32 - int32_t(a)) a=1023", 0.499999761697836220264L);
+insert("uneg11<double>(maxi32 - int32_t(a)) a=1023", 0.999999523395672440529L);
+insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=1023", 0.499999761697836220264L);
+insert("u01<long double>(maxi32 - int32_t(a)) a=1023", 0.499999761697836220264L);
+insert("uneg11<long double>(maxi32 - int32_t(a)) a=1023", 0.999999523395672440529L);
+insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=1023", 0.499999761697836220264L);
+insert("u01<float>(maxi64 - int64_t(a)) a=1023", 0.500000000000000000000L);
+insert("uneg11<float>(maxi64 - int64_t(a)) a=1023", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=1023", 0.499999940395355224609L);
+insert("u01<double>(maxi64 - int64_t(a)) a=1023", 0.499999999999999944489L);
+insert("uneg11<double>(maxi64 - int64_t(a)) a=1023", 0.999999999999999888978L);
+insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=1023", 0.499999999999999888978L);
+insert("u01<long double>(maxi64 - int64_t(a)) a=1023", 0.499999999999999944516L);
+insert("uneg11<long double>(maxi64 - int64_t(a)) a=1023", 0.999999999999999889032L);
+insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=1023", 0.499999999999999944543L);
+insert("u01<float>(minu32 + uint32_t(a)) a=1024", 2.38534994423389434814e-07L);
+insert("uneg11<float>(minu32 + uint32_t(a)) a=1024", 4.77069988846778869629e-07L);
+insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=1024", 2.98023223876953125000e-07L);
+insert("u01<double>(minu32 + uint32_t(a)) a=1024", 2.38534994423389434814e-07L);
+insert("uneg11<double>(minu32 + uint32_t(a)) a=1024", 4.77069988846778869629e-07L);
+insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=1024", 2.38534994423389434814e-07L);
+insert("u01<long double>(minu32 + uint32_t(a)) a=1024", 2.38534994423389434814e-07L);
+insert("uneg11<long double>(minu32 + uint32_t(a)) a=1024", 4.77069988846778869629e-07L);
+insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=1024", 2.38534994423389434814e-07L);
+insert("u01<float>(minu64 + uint64_t(a)) a=1024", 5.55382562855699646320e-17L);
+insert("uneg11<float>(minu64 + uint64_t(a)) a=1024", 1.11076512571139929264e-16L);
+insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=1024", 5.96046447753906250000e-08L);
+insert("u01<double>(minu64 + uint64_t(a)) a=1024", 5.55382562855699646320e-17L);
+insert("uneg11<double>(minu64 + uint64_t(a)) a=1024", 1.11076512571139929264e-16L);
+insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=1024", 1.11022302462515654042e-16L);
+insert("u01<long double>(minu64 + uint64_t(a)) a=1024", 5.55382562855699646320e-17L);
+insert("uneg11<long double>(minu64 + uint64_t(a)) a=1024", 1.11076512571139929264e-16L);
+insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=1024", 5.55653613398821022429e-17L);
+insert("u01<float>(mini32 + int32_t(a)) a=1024", 0.500000238418579101562L);
+insert("uneg11<float>(mini32 + int32_t(a)) a=1024", -0.999999523162841796875L);
+insert("u01fixedpt<float>(mini32 + int32_t(a)) a=1024", 0.500000298023223876953L);
+insert("u01<double>(mini32 + int32_t(a)) a=1024", 0.500000238534994423389L);
+insert("uneg11<double>(mini32 + int32_t(a)) a=1024", -0.999999522930011153221L);
+insert("u01fixedpt<double>(mini32 + int32_t(a)) a=1024", 0.500000238534994423389L);
+insert("u01<long double>(mini32 + int32_t(a)) a=1024", 0.500000238534994423389L);
+insert("uneg11<long double>(mini32 + int32_t(a)) a=1024", -0.999999522930011153221L);
+insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=1024", 0.500000238534994423389L);
+insert("u01<float>(mini64 + int64_t(a)) a=1024", 0.500000000000000000000L);
+insert("uneg11<float>(mini64 + int64_t(a)) a=1024", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini64 + int64_t(a)) a=1024", 0.500000059604644775391L);
+insert("u01<double>(mini64 + int64_t(a)) a=1024", 0.500000000000000000000L);
+insert("uneg11<double>(mini64 + int64_t(a)) a=1024", -0.999999999999999888978L);
+insert("u01fixedpt<double>(mini64 + int64_t(a)) a=1024", 0.500000000000000111022L);
+insert("u01<long double>(mini64 + int64_t(a)) a=1024", 0.500000000000000055511L);
+insert("uneg11<long double>(mini64 + int64_t(a)) a=1024", -0.999999999999999888923L);
+insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=1024", 0.500000000000000055565L);
+insert("u01<float>(maxu32 - uint32_t(a)) a=1024", 0.999999761581420898438L);
+insert("uneg11<float>(maxu32 - uint32_t(a)) a=1024", -4.77069988846778869629e-07L);
+insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=1024", 0.999999701976776123047L);
+insert("u01<double>(maxu32 - uint32_t(a)) a=1024", 0.999999761465005576611L);
+insert("uneg11<double>(maxu32 - uint32_t(a)) a=1024", -4.77069988846778869629e-07L);
+insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=1024", 0.999999761465005576611L);
+insert("u01<long double>(maxu32 - uint32_t(a)) a=1024", 0.999999761465005576611L);
+insert("uneg11<long double>(maxu32 - uint32_t(a)) a=1024", -4.77069988846778869629e-07L);
+insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=1024", 0.999999761465005576611L);
+insert("u01<float>(maxu64 - uint64_t(a)) a=1024", 1.00000000000000000000L);
+insert("uneg11<float>(maxu64 - uint64_t(a)) a=1024", -1.11076512571139929264e-16L);
+insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=1024", 0.999999940395355224609L);
+insert("u01<double>(maxu64 - uint64_t(a)) a=1024", 0.999999999999999888978L);
+insert("uneg11<double>(maxu64 - uint64_t(a)) a=1024", -1.11076512571139929264e-16L);
+insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=1024", 0.999999999999999888978L);
+insert("u01<long double>(maxu64 - uint64_t(a)) a=1024", 0.999999999999999944489L);
+insert("uneg11<long double>(maxu64 - uint64_t(a)) a=1024", -1.11076512571139929264e-16L);
+insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=1024", 0.999999999999999944435L);
+insert("u01<float>(maxi32 - int32_t(a)) a=1024", 0.499999761581420898438L);
+insert("uneg11<float>(maxi32 - int32_t(a)) a=1024", 0.999999523162841796875L);
+insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=1024", 0.499999701976776123047L);
+insert("u01<double>(maxi32 - int32_t(a)) a=1024", 0.499999761465005576611L);
+insert("uneg11<double>(maxi32 - int32_t(a)) a=1024", 0.999999522930011153221L);
+insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=1024", 0.499999761465005576611L);
+insert("u01<long double>(maxi32 - int32_t(a)) a=1024", 0.499999761465005576611L);
+insert("uneg11<long double>(maxi32 - int32_t(a)) a=1024", 0.999999522930011153221L);
+insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=1024", 0.499999761465005576611L);
+insert("u01<float>(maxi64 - int64_t(a)) a=1024", 0.500000000000000000000L);
+insert("uneg11<float>(maxi64 - int64_t(a)) a=1024", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=1024", 0.499999940395355224609L);
+insert("u01<double>(maxi64 - int64_t(a)) a=1024", 0.499999999999999944489L);
+insert("uneg11<double>(maxi64 - int64_t(a)) a=1024", 0.999999999999999888978L);
+insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=1024", 0.499999999999999888978L);
+insert("u01<long double>(maxi64 - int64_t(a)) a=1024", 0.499999999999999944462L);
+insert("uneg11<long double>(maxi64 - int64_t(a)) a=1024", 0.999999999999999888923L);
+insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=1024", 0.499999999999999944435L);
+insert("u01<float>(minu32 + uint32_t(a)) a=1025", 2.38767825067043304443e-07L);
+insert("uneg11<float>(minu32 + uint32_t(a)) a=1025", 4.77535650134086608887e-07L);
+insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=1025", 2.98023223876953125000e-07L);
+insert("u01<double>(minu32 + uint32_t(a)) a=1025", 2.38767825067043304443e-07L);
+insert("uneg11<double>(minu32 + uint32_t(a)) a=1025", 4.77535650134086608887e-07L);
+insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=1025", 2.38767825067043304443e-07L);
+insert("u01<long double>(minu32 + uint32_t(a)) a=1025", 2.38767825067043304443e-07L);
+insert("uneg11<long double>(minu32 + uint32_t(a)) a=1025", 4.77535650134086608887e-07L);
+insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=1025", 2.38767825067043304443e-07L);
+insert("u01<float>(minu64 + uint64_t(a)) a=1025", 5.55924663941942398537e-17L);
+insert("uneg11<float>(minu64 + uint64_t(a)) a=1025", 1.11184932788388479707e-16L);
+insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=1025", 5.96046447753906250000e-08L);
+insert("u01<double>(minu64 + uint64_t(a)) a=1025", 5.55924663941942398537e-17L);
+insert("uneg11<double>(minu64 + uint64_t(a)) a=1025", 1.11184932788388479707e-16L);
+insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=1025", 1.11022302462515654042e-16L);
+insert("u01<long double>(minu64 + uint64_t(a)) a=1025", 5.55924663941942398537e-17L);
+insert("uneg11<long double>(minu64 + uint64_t(a)) a=1025", 1.11184932788388479707e-16L);
+insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=1025", 5.55653613398821022429e-17L);
+insert("u01<float>(mini32 + int32_t(a)) a=1025", 0.500000238418579101562L);
+insert("uneg11<float>(mini32 + int32_t(a)) a=1025", -0.999999523162841796875L);
+insert("u01fixedpt<float>(mini32 + int32_t(a)) a=1025", 0.500000298023223876953L);
+insert("u01<double>(mini32 + int32_t(a)) a=1025", 0.500000238767825067043L);
+insert("uneg11<double>(mini32 + int32_t(a)) a=1025", -0.999999522464349865913L);
+insert("u01fixedpt<double>(mini32 + int32_t(a)) a=1025", 0.500000238767825067043L);
+insert("u01<long double>(mini32 + int32_t(a)) a=1025", 0.500000238767825067043L);
+insert("uneg11<long double>(mini32 + int32_t(a)) a=1025", -0.999999522464349865913L);
+insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=1025", 0.500000238767825067043L);
+insert("u01<float>(mini64 + int64_t(a)) a=1025", 0.500000000000000000000L);
+insert("uneg11<float>(mini64 + int64_t(a)) a=1025", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini64 + int64_t(a)) a=1025", 0.500000059604644775391L);
+insert("u01<double>(mini64 + int64_t(a)) a=1025", 0.500000000000000111022L);
+insert("uneg11<double>(mini64 + int64_t(a)) a=1025", -0.999999999999999888978L);
+insert("u01fixedpt<double>(mini64 + int64_t(a)) a=1025", 0.500000000000000111022L);
+insert("u01<long double>(mini64 + int64_t(a)) a=1025", 0.500000000000000055620L);
+insert("uneg11<long double>(mini64 + int64_t(a)) a=1025", -0.999999999999999888815L);
+insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=1025", 0.500000000000000055565L);
+insert("u01<float>(maxu32 - uint32_t(a)) a=1025", 0.999999761581420898438L);
+insert("uneg11<float>(maxu32 - uint32_t(a)) a=1025", -4.77535650134086608887e-07L);
+insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=1025", 0.999999701976776123047L);
+insert("u01<double>(maxu32 - uint32_t(a)) a=1025", 0.999999761232174932957L);
+insert("uneg11<double>(maxu32 - uint32_t(a)) a=1025", -4.77535650134086608887e-07L);
+insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=1025", 0.999999761232174932957L);
+insert("u01<long double>(maxu32 - uint32_t(a)) a=1025", 0.999999761232174932957L);
+insert("uneg11<long double>(maxu32 - uint32_t(a)) a=1025", -4.77535650134086608887e-07L);
+insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=1025", 0.999999761232174932957L);
+insert("u01<float>(maxu64 - uint64_t(a)) a=1025", 1.00000000000000000000L);
+insert("uneg11<float>(maxu64 - uint64_t(a)) a=1025", -1.11184932788388479707e-16L);
+insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=1025", 0.999999940395355224609L);
+insert("u01<double>(maxu64 - uint64_t(a)) a=1025", 0.999999999999999888978L);
+insert("uneg11<double>(maxu64 - uint64_t(a)) a=1025", -1.11184932788388479707e-16L);
+insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=1025", 0.999999999999999888978L);
+insert("u01<long double>(maxu64 - uint64_t(a)) a=1025", 0.999999999999999944380L);
+insert("uneg11<long double>(maxu64 - uint64_t(a)) a=1025", -1.11184932788388479707e-16L);
+insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=1025", 0.999999999999999944435L);
+insert("u01<float>(maxi32 - int32_t(a)) a=1025", 0.499999761581420898438L);
+insert("uneg11<float>(maxi32 - int32_t(a)) a=1025", 0.999999523162841796875L);
+insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=1025", 0.499999701976776123047L);
+insert("u01<double>(maxi32 - int32_t(a)) a=1025", 0.499999761232174932957L);
+insert("uneg11<double>(maxi32 - int32_t(a)) a=1025", 0.999999522464349865913L);
+insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=1025", 0.499999761232174932957L);
+insert("u01<long double>(maxi32 - int32_t(a)) a=1025", 0.499999761232174932957L);
+insert("uneg11<long double>(maxi32 - int32_t(a)) a=1025", 0.999999522464349865913L);
+insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=1025", 0.499999761232174932957L);
+insert("u01<float>(maxi64 - int64_t(a)) a=1025", 0.500000000000000000000L);
+insert("uneg11<float>(maxi64 - int64_t(a)) a=1025", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=1025", 0.499999940395355224609L);
+insert("u01<double>(maxi64 - int64_t(a)) a=1025", 0.499999999999999944489L);
+insert("uneg11<double>(maxi64 - int64_t(a)) a=1025", 0.999999999999999888978L);
+insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=1025", 0.499999999999999888978L);
+insert("u01<long double>(maxi64 - int64_t(a)) a=1025", 0.499999999999999944408L);
+insert("uneg11<long double>(maxi64 - int64_t(a)) a=1025", 0.999999999999999888815L);
+insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=1025", 0.499999999999999944435L);
+insert("u01<float>(minu32 + uint32_t(a)) a=3070", 7.14906491339206695557e-07L);
+insert("uneg11<float>(minu32 + uint32_t(a)) a=3070", 1.42981298267841339111e-06L);
+insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=3070", 6.55651092529296875000e-07L);
+insert("u01<double>(minu32 + uint32_t(a)) a=3070", 7.14906491339206695557e-07L);
+insert("uneg11<double>(minu32 + uint32_t(a)) a=3070", 1.42981298267841339111e-06L);
+insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=3070", 7.14906491339206695557e-07L);
+insert("u01<long double>(minu32 + uint32_t(a)) a=3070", 7.14906491339206695557e-07L);
+insert("uneg11<long double>(minu32 + uint32_t(a)) a=3070", 1.42981298267841339111e-06L);
+insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=3070", 7.14906491339206695557e-07L);
+insert("u01<float>(minu64 + uint64_t(a)) a=3070", 1.66452138530837068231e-16L);
+insert("uneg11<float>(minu64 + uint64_t(a)) a=3070", 3.32904277061674136462e-16L);
+insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=3070", 5.96046447753906250000e-08L);
+insert("u01<double>(minu64 + uint64_t(a)) a=3070", 1.66452138530837068231e-16L);
+insert("uneg11<double>(minu64 + uint64_t(a)) a=3070", 3.32904277061674136462e-16L);
+insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=3070", 1.11022302462515654042e-16L);
+insert("u01<long double>(minu64 + uint64_t(a)) a=3070", 1.66452138530837068231e-16L);
+insert("uneg11<long double>(minu64 + uint64_t(a)) a=3070", 3.32904277061674136462e-16L);
+insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=3070", 1.66479243585149205842e-16L);
+insert("u01<float>(mini32 + int32_t(a)) a=3070", 0.500000715255737304688L);
+insert("uneg11<float>(mini32 + int32_t(a)) a=3070", -0.999998569488525390625L);
+insert("u01fixedpt<float>(mini32 + int32_t(a)) a=3070", 0.500000655651092529297L);
+insert("u01<double>(mini32 + int32_t(a)) a=3070", 0.500000714906491339207L);
+insert("uneg11<double>(mini32 + int32_t(a)) a=3070", -0.999998570187017321587L);
+insert("u01fixedpt<double>(mini32 + int32_t(a)) a=3070", 0.500000714906491339207L);
+insert("u01<long double>(mini32 + int32_t(a)) a=3070", 0.500000714906491339207L);
+insert("uneg11<long double>(mini32 + int32_t(a)) a=3070", -0.999998570187017321587L);
+insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=3070", 0.500000714906491339207L);
+insert("u01<float>(mini64 + int64_t(a)) a=3070", 0.500000000000000000000L);
+insert("uneg11<float>(mini64 + int64_t(a)) a=3070", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini64 + int64_t(a)) a=3070", 0.500000059604644775391L);
+insert("u01<double>(mini64 + int64_t(a)) a=3070", 0.500000000000000111022L);
+insert("uneg11<double>(mini64 + int64_t(a)) a=3070", -0.999999999999999666933L);
+insert("u01fixedpt<double>(mini64 + int64_t(a)) a=3070", 0.500000000000000111022L);
+insert("u01<long double>(mini64 + int64_t(a)) a=3070", 0.500000000000000166425L);
+insert("uneg11<long double>(mini64 + int64_t(a)) a=3070", -0.999999999999999667096L);
+insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=3070", 0.500000000000000166479L);
+insert("u01<float>(maxu32 - uint32_t(a)) a=3070", 0.999999284744262695312L);
+insert("uneg11<float>(maxu32 - uint32_t(a)) a=3070", -1.42981298267841339111e-06L);
+insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=3070", 0.999999344348907470703L);
+insert("u01<double>(maxu32 - uint32_t(a)) a=3070", 0.999999285093508660793L);
+insert("uneg11<double>(maxu32 - uint32_t(a)) a=3070", -1.42981298267841339111e-06L);
+insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=3070", 0.999999285093508660793L);
+insert("u01<long double>(maxu32 - uint32_t(a)) a=3070", 0.999999285093508660793L);
+insert("uneg11<long double>(maxu32 - uint32_t(a)) a=3070", -1.42981298267841339111e-06L);
+insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=3070", 0.999999285093508660793L);
+insert("u01<float>(maxu64 - uint64_t(a)) a=3070", 1.00000000000000000000L);
+insert("uneg11<float>(maxu64 - uint64_t(a)) a=3070", -3.32904277061674136462e-16L);
+insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=3070", 0.999999940395355224609L);
+insert("u01<double>(maxu64 - uint64_t(a)) a=3070", 0.999999999999999888978L);
+insert("uneg11<double>(maxu64 - uint64_t(a)) a=3070", -3.32904277061674136462e-16L);
+insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=3070", 0.999999999999999888978L);
+insert("u01<long double>(maxu64 - uint64_t(a)) a=3070", 0.999999999999999833575L);
+insert("uneg11<long double>(maxu64 - uint64_t(a)) a=3070", -3.32904277061674136462e-16L);
+insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=3070", 0.999999999999999833521L);
+insert("u01<float>(maxi32 - int32_t(a)) a=3070", 0.499999284744262695312L);
+insert("uneg11<float>(maxi32 - int32_t(a)) a=3070", 0.999998569488525390625L);
+insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=3070", 0.499999344348907470703L);
+insert("u01<double>(maxi32 - int32_t(a)) a=3070", 0.499999285093508660793L);
+insert("uneg11<double>(maxi32 - int32_t(a)) a=3070", 0.999998570187017321587L);
+insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=3070", 0.499999285093508660793L);
+insert("u01<long double>(maxi32 - int32_t(a)) a=3070", 0.499999285093508660793L);
+insert("uneg11<long double>(maxi32 - int32_t(a)) a=3070", 0.999998570187017321587L);
+insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=3070", 0.499999285093508660793L);
+insert("u01<float>(maxi64 - int64_t(a)) a=3070", 0.500000000000000000000L);
+insert("uneg11<float>(maxi64 - int64_t(a)) a=3070", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=3070", 0.499999940395355224609L);
+insert("u01<double>(maxi64 - int64_t(a)) a=3070", 0.499999999999999833467L);
+insert("uneg11<double>(maxi64 - int64_t(a)) a=3070", 0.999999999999999666933L);
+insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=3070", 0.499999999999999888978L);
+insert("u01<long double>(maxi64 - int64_t(a)) a=3070", 0.499999999999999833548L);
+insert("uneg11<long double>(maxi64 - int64_t(a)) a=3070", 0.999999999999999667096L);
+insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=3070", 0.499999999999999833521L);
+insert("u01<float>(minu32 + uint32_t(a)) a=3071", 7.15139321982860565186e-07L);
+insert("uneg11<float>(minu32 + uint32_t(a)) a=3071", 1.43027864396572113037e-06L);
+insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=3071", 6.55651092529296875000e-07L);
+insert("u01<double>(minu32 + uint32_t(a)) a=3071", 7.15139321982860565186e-07L);
+insert("uneg11<double>(minu32 + uint32_t(a)) a=3071", 1.43027864396572113037e-06L);
+insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=3071", 7.15139321982860565186e-07L);
+insert("u01<long double>(minu32 + uint32_t(a)) a=3071", 7.15139321982860565186e-07L);
+insert("uneg11<long double>(minu32 + uint32_t(a)) a=3071", 1.43027864396572113037e-06L);
+insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=3071", 7.15139321982860565186e-07L);
+insert("u01<float>(minu64 + uint64_t(a)) a=3071", 1.66506348639461343453e-16L);
+insert("uneg11<float>(minu64 + uint64_t(a)) a=3071", 3.33012697278922686905e-16L);
+insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=3071", 5.96046447753906250000e-08L);
+insert("u01<double>(minu64 + uint64_t(a)) a=3071", 1.66506348639461343453e-16L);
+insert("uneg11<double>(minu64 + uint64_t(a)) a=3071", 3.33012697278922686905e-16L);
+insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=3071", 1.11022302462515654042e-16L);
+insert("u01<long double>(minu64 + uint64_t(a)) a=3071", 1.66506348639461343453e-16L);
+insert("uneg11<long double>(minu64 + uint64_t(a)) a=3071", 3.33012697278922686905e-16L);
+insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=3071", 1.66479243585149205842e-16L);
+insert("u01<float>(mini32 + int32_t(a)) a=3071", 0.500000715255737304688L);
+insert("uneg11<float>(mini32 + int32_t(a)) a=3071", -0.999998569488525390625L);
+insert("u01fixedpt<float>(mini32 + int32_t(a)) a=3071", 0.500000655651092529297L);
+insert("u01<double>(mini32 + int32_t(a)) a=3071", 0.500000715139321982861L);
+insert("uneg11<double>(mini32 + int32_t(a)) a=3071", -0.999998569721356034279L);
+insert("u01fixedpt<double>(mini32 + int32_t(a)) a=3071", 0.500000715139321982861L);
+insert("u01<long double>(mini32 + int32_t(a)) a=3071", 0.500000715139321982861L);
+insert("uneg11<long double>(mini32 + int32_t(a)) a=3071", -0.999998569721356034279L);
+insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=3071", 0.500000715139321982861L);
+insert("u01<float>(mini64 + int64_t(a)) a=3071", 0.500000000000000000000L);
+insert("uneg11<float>(mini64 + int64_t(a)) a=3071", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini64 + int64_t(a)) a=3071", 0.500000059604644775391L);
+insert("u01<double>(mini64 + int64_t(a)) a=3071", 0.500000000000000111022L);
+insert("uneg11<double>(mini64 + int64_t(a)) a=3071", -0.999999999999999666933L);
+insert("u01fixedpt<double>(mini64 + int64_t(a)) a=3071", 0.500000000000000111022L);
+insert("u01<long double>(mini64 + int64_t(a)) a=3071", 0.500000000000000166533L);
+insert("uneg11<long double>(mini64 + int64_t(a)) a=3071", -0.999999999999999666987L);
+insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=3071", 0.500000000000000166479L);
+insert("u01<float>(maxu32 - uint32_t(a)) a=3071", 0.999999284744262695312L);
+insert("uneg11<float>(maxu32 - uint32_t(a)) a=3071", -1.43027864396572113037e-06L);
+insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=3071", 0.999999344348907470703L);
+insert("u01<double>(maxu32 - uint32_t(a)) a=3071", 0.999999284860678017139L);
+insert("uneg11<double>(maxu32 - uint32_t(a)) a=3071", -1.43027864396572113037e-06L);
+insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=3071", 0.999999284860678017139L);
+insert("u01<long double>(maxu32 - uint32_t(a)) a=3071", 0.999999284860678017139L);
+insert("uneg11<long double>(maxu32 - uint32_t(a)) a=3071", -1.43027864396572113037e-06L);
+insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=3071", 0.999999284860678017139L);
+insert("u01<float>(maxu64 - uint64_t(a)) a=3071", 1.00000000000000000000L);
+insert("uneg11<float>(maxu64 - uint64_t(a)) a=3071", -3.33012697278922686905e-16L);
+insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=3071", 0.999999940395355224609L);
+insert("u01<double>(maxu64 - uint64_t(a)) a=3071", 0.999999999999999777955L);
+insert("uneg11<double>(maxu64 - uint64_t(a)) a=3071", -3.33012697278922686905e-16L);
+insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=3071", 0.999999999999999888978L);
+insert("u01<long double>(maxu64 - uint64_t(a)) a=3071", 0.999999999999999833467L);
+insert("uneg11<long double>(maxu64 - uint64_t(a)) a=3071", -3.33012697278922686905e-16L);
+insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=3071", 0.999999999999999833521L);
+insert("u01<float>(maxi32 - int32_t(a)) a=3071", 0.499999284744262695312L);
+insert("uneg11<float>(maxi32 - int32_t(a)) a=3071", 0.999998569488525390625L);
+insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=3071", 0.499999344348907470703L);
+insert("u01<double>(maxi32 - int32_t(a)) a=3071", 0.499999284860678017139L);
+insert("uneg11<double>(maxi32 - int32_t(a)) a=3071", 0.999998569721356034279L);
+insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=3071", 0.499999284860678017139L);
+insert("u01<long double>(maxi32 - int32_t(a)) a=3071", 0.499999284860678017139L);
+insert("uneg11<long double>(maxi32 - int32_t(a)) a=3071", 0.999998569721356034279L);
+insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=3071", 0.499999284860678017139L);
+insert("u01<float>(maxi64 - int64_t(a)) a=3071", 0.500000000000000000000L);
+insert("uneg11<float>(maxi64 - int64_t(a)) a=3071", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=3071", 0.499999940395355224609L);
+insert("u01<double>(maxi64 - int64_t(a)) a=3071", 0.499999999999999833467L);
+insert("uneg11<double>(maxi64 - int64_t(a)) a=3071", 0.999999999999999666933L);
+insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=3071", 0.499999999999999888978L);
+insert("u01<long double>(maxi64 - int64_t(a)) a=3071", 0.499999999999999833494L);
+insert("uneg11<long double>(maxi64 - int64_t(a)) a=3071", 0.999999999999999666987L);
+insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=3071", 0.499999999999999833521L);
+insert("u01<float>(minu32 + uint32_t(a)) a=3072", 7.15372152626514434814e-07L);
+insert("uneg11<float>(minu32 + uint32_t(a)) a=3072", 1.43074430525302886963e-06L);
+insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=3072", 7.74860382080078125000e-07L);
+insert("u01<double>(minu32 + uint32_t(a)) a=3072", 7.15372152626514434814e-07L);
+insert("uneg11<double>(minu32 + uint32_t(a)) a=3072", 1.43074430525302886963e-06L);
+insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=3072", 7.15372152626514434814e-07L);
+insert("u01<long double>(minu32 + uint32_t(a)) a=3072", 7.15372152626514434814e-07L);
+insert("uneg11<long double>(minu32 + uint32_t(a)) a=3072", 1.43074430525302886963e-06L);
+insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=3072", 7.15372152626514434814e-07L);
+insert("u01<float>(minu64 + uint64_t(a)) a=3072", 1.66560558748085618674e-16L);
+insert("uneg11<float>(minu64 + uint64_t(a)) a=3072", 3.33121117496171237349e-16L);
+insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=3072", 5.96046447753906250000e-08L);
+insert("u01<double>(minu64 + uint64_t(a)) a=3072", 1.66560558748085618674e-16L);
+insert("uneg11<double>(minu64 + uint64_t(a)) a=3072", 3.33121117496171237349e-16L);
+insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=3072", 1.11022302462515654042e-16L);
+insert("u01<long double>(minu64 + uint64_t(a)) a=3072", 1.66560558748085618674e-16L);
+insert("uneg11<long double>(minu64 + uint64_t(a)) a=3072", 3.33121117496171237349e-16L);
+insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=3072", 1.66587663802397756285e-16L);
+insert("u01<float>(mini32 + int32_t(a)) a=3072", 0.500000715255737304688L);
+insert("uneg11<float>(mini32 + int32_t(a)) a=3072", -0.999998569488525390625L);
+insert("u01fixedpt<float>(mini32 + int32_t(a)) a=3072", 0.500000774860382080078L);
+insert("u01<double>(mini32 + int32_t(a)) a=3072", 0.500000715372152626514L);
+insert("uneg11<double>(mini32 + int32_t(a)) a=3072", -0.999998569255694746971L);
+insert("u01fixedpt<double>(mini32 + int32_t(a)) a=3072", 0.500000715372152626514L);
+insert("u01<long double>(mini32 + int32_t(a)) a=3072", 0.500000715372152626514L);
+insert("uneg11<long double>(mini32 + int32_t(a)) a=3072", -0.999998569255694746971L);
+insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=3072", 0.500000715372152626514L);
+insert("u01<float>(mini64 + int64_t(a)) a=3072", 0.500000000000000000000L);
+insert("uneg11<float>(mini64 + int64_t(a)) a=3072", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini64 + int64_t(a)) a=3072", 0.500000059604644775391L);
+insert("u01<double>(mini64 + int64_t(a)) a=3072", 0.500000000000000222045L);
+insert("uneg11<double>(mini64 + int64_t(a)) a=3072", -0.999999999999999666933L);
+insert("u01fixedpt<double>(mini64 + int64_t(a)) a=3072", 0.500000000000000111022L);
+insert("u01<long double>(mini64 + int64_t(a)) a=3072", 0.500000000000000166533L);
+insert("uneg11<long double>(mini64 + int64_t(a)) a=3072", -0.999999999999999666879L);
+insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=3072", 0.500000000000000166588L);
+insert("u01<float>(maxu32 - uint32_t(a)) a=3072", 0.999999284744262695312L);
+insert("uneg11<float>(maxu32 - uint32_t(a)) a=3072", -1.43074430525302886963e-06L);
+insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=3072", 0.999999225139617919922L);
+insert("u01<double>(maxu32 - uint32_t(a)) a=3072", 0.999999284627847373486L);
+insert("uneg11<double>(maxu32 - uint32_t(a)) a=3072", -1.43074430525302886963e-06L);
+insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=3072", 0.999999284627847373486L);
+insert("u01<long double>(maxu32 - uint32_t(a)) a=3072", 0.999999284627847373486L);
+insert("uneg11<long double>(maxu32 - uint32_t(a)) a=3072", -1.43074430525302886963e-06L);
+insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=3072", 0.999999284627847373486L);
+insert("u01<float>(maxu64 - uint64_t(a)) a=3072", 1.00000000000000000000L);
+insert("uneg11<float>(maxu64 - uint64_t(a)) a=3072", -3.33121117496171237349e-16L);
+insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=3072", 0.999999940395355224609L);
+insert("u01<double>(maxu64 - uint64_t(a)) a=3072", 0.999999999999999777955L);
+insert("uneg11<double>(maxu64 - uint64_t(a)) a=3072", -3.33121117496171237349e-16L);
+insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=3072", 0.999999999999999888978L);
+insert("u01<long double>(maxu64 - uint64_t(a)) a=3072", 0.999999999999999833467L);
+insert("uneg11<long double>(maxu64 - uint64_t(a)) a=3072", -3.33121117496171237349e-16L);
+insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=3072", 0.999999999999999833412L);
+insert("u01<float>(maxi32 - int32_t(a)) a=3072", 0.499999284744262695312L);
+insert("uneg11<float>(maxi32 - int32_t(a)) a=3072", 0.999998569488525390625L);
+insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=3072", 0.499999225139617919922L);
+insert("u01<double>(maxi32 - int32_t(a)) a=3072", 0.499999284627847373486L);
+insert("uneg11<double>(maxi32 - int32_t(a)) a=3072", 0.999998569255694746971L);
+insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=3072", 0.499999284627847373486L);
+insert("u01<long double>(maxi32 - int32_t(a)) a=3072", 0.499999284627847373486L);
+insert("uneg11<long double>(maxi32 - int32_t(a)) a=3072", 0.999998569255694746971L);
+insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=3072", 0.499999284627847373486L);
+insert("u01<float>(maxi64 - int64_t(a)) a=3072", 0.500000000000000000000L);
+insert("uneg11<float>(maxi64 - int64_t(a)) a=3072", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=3072", 0.499999940395355224609L);
+insert("u01<double>(maxi64 - int64_t(a)) a=3072", 0.499999999999999833467L);
+insert("uneg11<double>(maxi64 - int64_t(a)) a=3072", 0.999999999999999666933L);
+insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=3072", 0.499999999999999888978L);
+insert("u01<long double>(maxi64 - int64_t(a)) a=3072", 0.499999999999999833439L);
+insert("uneg11<long double>(maxi64 - int64_t(a)) a=3072", 0.999999999999999666879L);
+insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=3072", 0.499999999999999833412L);
+insert("u01<float>(minu32 + uint32_t(a)) a=5119", 1.19197648018598556519e-06L);
+insert("uneg11<float>(minu32 + uint32_t(a)) a=5119", 2.38395296037197113037e-06L);
+insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=5119", 1.13248825073242187500e-06L);
+insert("u01<double>(minu32 + uint32_t(a)) a=5119", 1.19197648018598556519e-06L);
+insert("uneg11<double>(minu32 + uint32_t(a)) a=5119", 2.38395296037197113037e-06L);
+insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=5119", 1.19197648018598556519e-06L);
+insert("u01<long double>(minu32 + uint32_t(a)) a=5119", 1.19197648018598556519e-06L);
+insert("uneg11<long double>(minu32 + uint32_t(a)) a=5119", 2.38395296037197113037e-06L);
+insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=5119", 1.19197648018598556519e-06L);
+insert("u01<float>(minu64 + uint64_t(a)) a=5119", 2.77528651101976997495e-16L);
+insert("uneg11<float>(minu64 + uint64_t(a)) a=5119", 5.55057302203953994990e-16L);
+insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=5119", 5.96046447753906250000e-08L);
+insert("u01<double>(minu64 + uint64_t(a)) a=5119", 2.77528651101976997495e-16L);
+insert("uneg11<double>(minu64 + uint64_t(a)) a=5119", 5.55057302203953994990e-16L);
+insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=5119", 3.33066907387546962127e-16L);
+insert("u01<long double>(minu64 + uint64_t(a)) a=5119", 2.77528651101976997495e-16L);
+insert("uneg11<long double>(minu64 + uint64_t(a)) a=5119", 5.55057302203953994990e-16L);
+insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=5119", 2.77501546047664859884e-16L);
+insert("u01<float>(mini32 + int32_t(a)) a=5119", 0.500001192092895507812L);
+insert("uneg11<float>(mini32 + int32_t(a)) a=5119", -0.999997615814208984375L);
+insert("u01fixedpt<float>(mini32 + int32_t(a)) a=5119", 0.500001132488250732422L);
+insert("u01<double>(mini32 + int32_t(a)) a=5119", 0.500001191976480185986L);
+insert("uneg11<double>(mini32 + int32_t(a)) a=5119", -0.999997616047039628029L);
+insert("u01fixedpt<double>(mini32 + int32_t(a)) a=5119", 0.500001191976480185986L);
+insert("u01<long double>(mini32 + int32_t(a)) a=5119", 0.500001191976480185986L);
+insert("uneg11<long double>(mini32 + int32_t(a)) a=5119", -0.999997616047039628029L);
+insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=5119", 0.500001191976480185986L);
+insert("u01<float>(mini64 + int64_t(a)) a=5119", 0.500000000000000000000L);
+insert("uneg11<float>(mini64 + int64_t(a)) a=5119", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini64 + int64_t(a)) a=5119", 0.500000059604644775391L);
+insert("u01<double>(mini64 + int64_t(a)) a=5119", 0.500000000000000222045L);
+insert("uneg11<double>(mini64 + int64_t(a)) a=5119", -0.999999999999999444888L);
+insert("u01fixedpt<double>(mini64 + int64_t(a)) a=5119", 0.500000000000000333067L);
+insert("u01<long double>(mini64 + int64_t(a)) a=5119", 0.500000000000000277556L);
+insert("uneg11<long double>(mini64 + int64_t(a)) a=5119", -0.999999999999999444943L);
+insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=5119", 0.500000000000000277502L);
+insert("u01<float>(maxu32 - uint32_t(a)) a=5119", 0.999998807907104492188L);
+insert("uneg11<float>(maxu32 - uint32_t(a)) a=5119", -2.38395296037197113037e-06L);
+insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=5119", 0.999998867511749267578L);
+insert("u01<double>(maxu32 - uint32_t(a)) a=5119", 0.999998808023519814014L);
+insert("uneg11<double>(maxu32 - uint32_t(a)) a=5119", -2.38395296037197113037e-06L);
+insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=5119", 0.999998808023519814014L);
+insert("u01<long double>(maxu32 - uint32_t(a)) a=5119", 0.999998808023519814014L);
+insert("uneg11<long double>(maxu32 - uint32_t(a)) a=5119", -2.38395296037197113037e-06L);
+insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=5119", 0.999998808023519814014L);
+insert("u01<float>(maxu64 - uint64_t(a)) a=5119", 1.00000000000000000000L);
+insert("uneg11<float>(maxu64 - uint64_t(a)) a=5119", -5.55057302203953994990e-16L);
+insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=5119", 0.999999940395355224609L);
+insert("u01<double>(maxu64 - uint64_t(a)) a=5119", 0.999999999999999777955L);
+insert("uneg11<double>(maxu64 - uint64_t(a)) a=5119", -5.55057302203953994990e-16L);
+insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=5119", 0.999999999999999666933L);
+insert("u01<long double>(maxu64 - uint64_t(a)) a=5119", 0.999999999999999722444L);
+insert("uneg11<long double>(maxu64 - uint64_t(a)) a=5119", -5.55057302203953994990e-16L);
+insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=5119", 0.999999999999999722498L);
+insert("u01<float>(maxi32 - int32_t(a)) a=5119", 0.499998807907104492188L);
+insert("uneg11<float>(maxi32 - int32_t(a)) a=5119", 0.999997615814208984375L);
+insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=5119", 0.499998867511749267578L);
+insert("u01<double>(maxi32 - int32_t(a)) a=5119", 0.499998808023519814014L);
+insert("uneg11<double>(maxi32 - int32_t(a)) a=5119", 0.999997616047039628029L);
+insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=5119", 0.499998808023519814014L);
+insert("u01<long double>(maxi32 - int32_t(a)) a=5119", 0.499998808023519814014L);
+insert("uneg11<long double>(maxi32 - int32_t(a)) a=5119", 0.999997616047039628029L);
+insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=5119", 0.499998808023519814014L);
+insert("u01<float>(maxi64 - int64_t(a)) a=5119", 0.500000000000000000000L);
+insert("uneg11<float>(maxi64 - int64_t(a)) a=5119", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=5119", 0.499999940395355224609L);
+insert("u01<double>(maxi64 - int64_t(a)) a=5119", 0.499999999999999722444L);
+insert("uneg11<double>(maxi64 - int64_t(a)) a=5119", 0.999999999999999444888L);
+insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=5119", 0.499999999999999666933L);
+insert("u01<long double>(maxi64 - int64_t(a)) a=5119", 0.499999999999999722471L);
+insert("uneg11<long double>(maxi64 - int64_t(a)) a=5119", 0.999999999999999444943L);
+insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=5119", 0.499999999999999722498L);
+insert("u01<float>(minu32 + uint32_t(a)) a=5120", 1.19220931082963943481e-06L);
+insert("uneg11<float>(minu32 + uint32_t(a)) a=5120", 2.38441862165927886963e-06L);
+insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=5120", 1.25169754028320312500e-06L);
+insert("u01<double>(minu32 + uint32_t(a)) a=5120", 1.19220931082963943481e-06L);
+insert("uneg11<double>(minu32 + uint32_t(a)) a=5120", 2.38441862165927886963e-06L);
+insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=5120", 1.19220931082963943481e-06L);
+insert("u01<long double>(minu32 + uint32_t(a)) a=5120", 1.19220931082963943481e-06L);
+insert("uneg11<long double>(minu32 + uint32_t(a)) a=5120", 2.38441862165927886963e-06L);
+insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=5120", 1.19220931082963943481e-06L);
+insert("u01<float>(minu64 + uint64_t(a)) a=5120", 2.77582861210601272717e-16L);
+insert("uneg11<float>(minu64 + uint64_t(a)) a=5120", 5.55165722421202545434e-16L);
+insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=5120", 5.96046447753906250000e-08L);
+insert("u01<double>(minu64 + uint64_t(a)) a=5120", 2.77582861210601272717e-16L);
+insert("uneg11<double>(minu64 + uint64_t(a)) a=5120", 5.55165722421202545434e-16L);
+insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=5120", 3.33066907387546962127e-16L);
+insert("u01<long double>(minu64 + uint64_t(a)) a=5120", 2.77582861210601272717e-16L);
+insert("uneg11<long double>(minu64 + uint64_t(a)) a=5120", 5.55165722421202545434e-16L);
+insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=5120", 2.77609966264913410328e-16L);
+insert("u01<float>(mini32 + int32_t(a)) a=5120", 0.500001192092895507812L);
+insert("uneg11<float>(mini32 + int32_t(a)) a=5120", -0.999997615814208984375L);
+insert("u01fixedpt<float>(mini32 + int32_t(a)) a=5120", 0.500001251697540283203L);
+insert("u01<double>(mini32 + int32_t(a)) a=5120", 0.500001192209310829639L);
+insert("uneg11<double>(mini32 + int32_t(a)) a=5120", -0.999997615581378340721L);
+insert("u01fixedpt<double>(mini32 + int32_t(a)) a=5120", 0.500001192209310829639L);
+insert("u01<long double>(mini32 + int32_t(a)) a=5120", 0.500001192209310829639L);
+insert("uneg11<long double>(mini32 + int32_t(a)) a=5120", -0.999997615581378340721L);
+insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=5120", 0.500001192209310829639L);
+insert("u01<float>(mini64 + int64_t(a)) a=5120", 0.500000000000000000000L);
+insert("uneg11<float>(mini64 + int64_t(a)) a=5120", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini64 + int64_t(a)) a=5120", 0.500000059604644775391L);
+insert("u01<double>(mini64 + int64_t(a)) a=5120", 0.500000000000000222045L);
+insert("uneg11<double>(mini64 + int64_t(a)) a=5120", -0.999999999999999444888L);
+insert("u01fixedpt<double>(mini64 + int64_t(a)) a=5120", 0.500000000000000333067L);
+insert("u01<long double>(mini64 + int64_t(a)) a=5120", 0.500000000000000277556L);
+insert("uneg11<long double>(mini64 + int64_t(a)) a=5120", -0.999999999999999444834L);
+insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=5120", 0.500000000000000277610L);
+insert("u01<float>(maxu32 - uint32_t(a)) a=5120", 0.999998807907104492188L);
+insert("uneg11<float>(maxu32 - uint32_t(a)) a=5120", -2.38441862165927886963e-06L);
+insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=5120", 0.999998748302459716797L);
+insert("u01<double>(maxu32 - uint32_t(a)) a=5120", 0.999998807790689170361L);
+insert("uneg11<double>(maxu32 - uint32_t(a)) a=5120", -2.38441862165927886963e-06L);
+insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=5120", 0.999998807790689170361L);
+insert("u01<long double>(maxu32 - uint32_t(a)) a=5120", 0.999998807790689170361L);
+insert("uneg11<long double>(maxu32 - uint32_t(a)) a=5120", -2.38441862165927886963e-06L);
+insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=5120", 0.999998807790689170361L);
+insert("u01<float>(maxu64 - uint64_t(a)) a=5120", 1.00000000000000000000L);
+insert("uneg11<float>(maxu64 - uint64_t(a)) a=5120", -5.55165722421202545434e-16L);
+insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=5120", 0.999999940395355224609L);
+insert("u01<double>(maxu64 - uint64_t(a)) a=5120", 0.999999999999999666933L);
+insert("uneg11<double>(maxu64 - uint64_t(a)) a=5120", -5.55165722421202545434e-16L);
+insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=5120", 0.999999999999999666933L);
+insert("u01<long double>(maxu64 - uint64_t(a)) a=5120", 0.999999999999999722444L);
+insert("uneg11<long double>(maxu64 - uint64_t(a)) a=5120", -5.55165722421202545434e-16L);
+insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=5120", 0.999999999999999722390L);
+insert("u01<float>(maxi32 - int32_t(a)) a=5120", 0.499998807907104492188L);
+insert("uneg11<float>(maxi32 - int32_t(a)) a=5120", 0.999997615814208984375L);
+insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=5120", 0.499998748302459716797L);
+insert("u01<double>(maxi32 - int32_t(a)) a=5120", 0.499998807790689170361L);
+insert("uneg11<double>(maxi32 - int32_t(a)) a=5120", 0.999997615581378340721L);
+insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=5120", 0.499998807790689170361L);
+insert("u01<long double>(maxi32 - int32_t(a)) a=5120", 0.499998807790689170361L);
+insert("uneg11<long double>(maxi32 - int32_t(a)) a=5120", 0.999997615581378340721L);
+insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=5120", 0.499998807790689170361L);
+insert("u01<float>(maxi64 - int64_t(a)) a=5120", 0.500000000000000000000L);
+insert("uneg11<float>(maxi64 - int64_t(a)) a=5120", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=5120", 0.499999940395355224609L);
+insert("u01<double>(maxi64 - int64_t(a)) a=5120", 0.499999999999999722444L);
+insert("uneg11<double>(maxi64 - int64_t(a)) a=5120", 0.999999999999999444888L);
+insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=5120", 0.499999999999999666933L);
+insert("u01<long double>(maxi64 - int64_t(a)) a=5120", 0.499999999999999722417L);
+insert("uneg11<long double>(maxi64 - int64_t(a)) a=5120", 0.999999999999999444834L);
+insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=5120", 0.499999999999999722390L);
+insert("u01<float>(minu32 + uint32_t(a)) a=5121", 1.19244214147329330444e-06L);
+insert("uneg11<float>(minu32 + uint32_t(a)) a=5121", 2.38488428294658660889e-06L);
+insert("u01fixedpt<float>(minu32 + uint32_t(a)) a=5121", 1.25169754028320312500e-06L);
+insert("u01<double>(minu32 + uint32_t(a)) a=5121", 1.19244214147329330444e-06L);
+insert("uneg11<double>(minu32 + uint32_t(a)) a=5121", 2.38488428294658660889e-06L);
+insert("u01fixedpt<double>(minu32 + uint32_t(a)) a=5121", 1.19244214147329330444e-06L);
+insert("u01<long double>(minu32 + uint32_t(a)) a=5121", 1.19244214147329330444e-06L);
+insert("uneg11<long double>(minu32 + uint32_t(a)) a=5121", 2.38488428294658660889e-06L);
+insert("u01fixedpt<long double>(minu32 + uint32_t(a)) a=5121", 1.19244214147329330444e-06L);
+insert("u01<float>(minu64 + uint64_t(a)) a=5121", 2.77637071319225547938e-16L);
+insert("uneg11<float>(minu64 + uint64_t(a)) a=5121", 5.55274142638451095877e-16L);
+insert("u01fixedpt<float>(minu64 + uint64_t(a)) a=5121", 5.96046447753906250000e-08L);
+insert("u01<double>(minu64 + uint64_t(a)) a=5121", 2.77637071319225547938e-16L);
+insert("uneg11<double>(minu64 + uint64_t(a)) a=5121", 5.55274142638451095877e-16L);
+insert("u01fixedpt<double>(minu64 + uint64_t(a)) a=5121", 3.33066907387546962127e-16L);
+insert("u01<long double>(minu64 + uint64_t(a)) a=5121", 2.77637071319225547938e-16L);
+insert("uneg11<long double>(minu64 + uint64_t(a)) a=5121", 5.55274142638451095877e-16L);
+insert("u01fixedpt<long double>(minu64 + uint64_t(a)) a=5121", 2.77609966264913410328e-16L);
+insert("u01<float>(mini32 + int32_t(a)) a=5121", 0.500001192092895507812L);
+insert("uneg11<float>(mini32 + int32_t(a)) a=5121", -0.999997615814208984375L);
+insert("u01fixedpt<float>(mini32 + int32_t(a)) a=5121", 0.500001251697540283203L);
+insert("u01<double>(mini32 + int32_t(a)) a=5121", 0.500001192442141473293L);
+insert("uneg11<double>(mini32 + int32_t(a)) a=5121", -0.999997615115717053413L);
+insert("u01fixedpt<double>(mini32 + int32_t(a)) a=5121", 0.500001192442141473293L);
+insert("u01<long double>(mini32 + int32_t(a)) a=5121", 0.500001192442141473293L);
+insert("uneg11<long double>(mini32 + int32_t(a)) a=5121", -0.999997615115717053413L);
+insert("u01fixedpt<long double>(mini32 + int32_t(a)) a=5121", 0.500001192442141473293L);
+insert("u01<float>(mini64 + int64_t(a)) a=5121", 0.500000000000000000000L);
+insert("uneg11<float>(mini64 + int64_t(a)) a=5121", -1.00000000000000000000L);
+insert("u01fixedpt<float>(mini64 + int64_t(a)) a=5121", 0.500000059604644775391L);
+insert("u01<double>(mini64 + int64_t(a)) a=5121", 0.500000000000000333067L);
+insert("uneg11<double>(mini64 + int64_t(a)) a=5121", -0.999999999999999444888L);
+insert("u01fixedpt<double>(mini64 + int64_t(a)) a=5121", 0.500000000000000333067L);
+insert("u01<long double>(mini64 + int64_t(a)) a=5121", 0.500000000000000277664L);
+insert("uneg11<long double>(mini64 + int64_t(a)) a=5121", -0.999999999999999444726L);
+insert("u01fixedpt<long double>(mini64 + int64_t(a)) a=5121", 0.500000000000000277610L);
+insert("u01<float>(maxu32 - uint32_t(a)) a=5121", 0.999998807907104492188L);
+insert("uneg11<float>(maxu32 - uint32_t(a)) a=5121", -2.38488428294658660889e-06L);
+insert("u01fixedpt<float>(maxu32 - uint32_t(a)) a=5121", 0.999998748302459716797L);
+insert("u01<double>(maxu32 - uint32_t(a)) a=5121", 0.999998807557858526707L);
+insert("uneg11<double>(maxu32 - uint32_t(a)) a=5121", -2.38488428294658660889e-06L);
+insert("u01fixedpt<double>(maxu32 - uint32_t(a)) a=5121", 0.999998807557858526707L);
+insert("u01<long double>(maxu32 - uint32_t(a)) a=5121", 0.999998807557858526707L);
+insert("uneg11<long double>(maxu32 - uint32_t(a)) a=5121", -2.38488428294658660889e-06L);
+insert("u01fixedpt<long double>(maxu32 - uint32_t(a)) a=5121", 0.999998807557858526707L);
+insert("u01<float>(maxu64 - uint64_t(a)) a=5121", 1.00000000000000000000L);
+insert("uneg11<float>(maxu64 - uint64_t(a)) a=5121", -5.55274142638451095877e-16L);
+insert("u01fixedpt<float>(maxu64 - uint64_t(a)) a=5121", 0.999999940395355224609L);
+insert("u01<double>(maxu64 - uint64_t(a)) a=5121", 0.999999999999999666933L);
+insert("uneg11<double>(maxu64 - uint64_t(a)) a=5121", -5.55274142638451095877e-16L);
+insert("u01fixedpt<double>(maxu64 - uint64_t(a)) a=5121", 0.999999999999999666933L);
+insert("u01<long double>(maxu64 - uint64_t(a)) a=5121", 0.999999999999999722336L);
+insert("uneg11<long double>(maxu64 - uint64_t(a)) a=5121", -5.55274142638451095877e-16L);
+insert("u01fixedpt<long double>(maxu64 - uint64_t(a)) a=5121", 0.999999999999999722390L);
+insert("u01<float>(maxi32 - int32_t(a)) a=5121", 0.499998807907104492188L);
+insert("uneg11<float>(maxi32 - int32_t(a)) a=5121", 0.999997615814208984375L);
+insert("u01fixedpt<float>(maxi32 - int32_t(a)) a=5121", 0.499998748302459716797L);
+insert("u01<double>(maxi32 - int32_t(a)) a=5121", 0.499998807557858526707L);
+insert("uneg11<double>(maxi32 - int32_t(a)) a=5121", 0.999997615115717053413L);
+insert("u01fixedpt<double>(maxi32 - int32_t(a)) a=5121", 0.499998807557858526707L);
+insert("u01<long double>(maxi32 - int32_t(a)) a=5121", 0.499998807557858526707L);
+insert("uneg11<long double>(maxi32 - int32_t(a)) a=5121", 0.999997615115717053413L);
+insert("u01fixedpt<long double>(maxi32 - int32_t(a)) a=5121", 0.499998807557858526707L);
+insert("u01<float>(maxi64 - int64_t(a)) a=5121", 0.500000000000000000000L);
+insert("uneg11<float>(maxi64 - int64_t(a)) a=5121", 1.00000000000000000000L);
+insert("u01fixedpt<float>(maxi64 - int64_t(a)) a=5121", 0.499999940395355224609L);
+insert("u01<double>(maxi64 - int64_t(a)) a=5121", 0.499999999999999722444L);
+insert("uneg11<double>(maxi64 - int64_t(a)) a=5121", 0.999999999999999444888L);
+insert("u01fixedpt<double>(maxi64 - int64_t(a)) a=5121", 0.499999999999999666933L);
+insert("u01<long double>(maxi64 - int64_t(a)) a=5121", 0.499999999999999722363L);
+insert("uneg11<long double>(maxi64 - int64_t(a)) a=5121", 0.999999999999999444726L);
+insert("u01fixedpt<long double>(maxi64 - int64_t(a)) a=5121", 0.499999999999999722390L);
+// ./ut_uniform: SUCCESS
diff --git a/tests/ut_uniform_reference.hpp b/tests/ut_uniform_reference.hpp
@@ -0,0 +1,19 @@
+RefHist("u01 Threefry4x32 float", " 0 0 0 0 0 0 0 0 0 0 0 0 0 301 330 326 320 295 291 298 287 305 307 310 316 314");
+RefHist("u01 Threefry4x32 double", " 0 0 0 0 0 0 0 0 0 0 0 0 0 301 330 326 320 295 291 298 287 305 307 310 316 314");
+RefHist("u01 Threefry4x32 long double", " 0 0 0 0 0 0 0 0 0 0 0 0 0 301 330 326 320 295 291 298 287 305 307 310 316 314");
+RefHist("u01 Threefry4x64 float", " 0 0 0 0 0 0 0 0 0 0 0 0 0 308 295 322 300 316 291 311 289 346 297 310 340 275");
+RefHist("u01 Threefry4x64 double", " 0 0 0 0 0 0 0 0 0 0 0 0 0 308 295 322 300 316 291 311 289 346 297 310 340 275");
+RefHist("u01 Threefry4x64 long double", " 0 0 0 0 0 0 0 0 0 0 0 0 0 308 295 322 300 316 291 311 289 346 297 310 340 275");
+RefHist("uneg11 Threefry4x32 float", " 156 139 148 146 159 148 159 168 142 160 156 161 153 143 158 150 180 174 152 163 157 129 166 151 140 142");
+RefHist("uneg11 Threefry4x32 double", " 156 139 148 146 159 148 159 168 142 160 156 161 153 143 158 150 180 174 152 163 157 129 166 151 140 142");
+RefHist("uneg11 Threefry4x32 long double", " 156 139 148 146 159 148 159 168 142 160 156 161 153 143 158 150 180 174 152 163 157 129 166 151 140 142");
+RefHist("uneg11 Threefry4x64 float", " 159 141 148 184 162 142 155 137 173 187 153 140 135 164 144 146 149 151 171 152 148 137 179 146 145 152");
+RefHist("uneg11 Threefry4x64 double", " 159 141 148 184 162 142 155 137 173 187 153 140 135 164 144 146 149 151 171 152 148 137 179 146 145 152");
+RefHist("uneg11 Threefry4x64 long double", " 159 141 148 184 162 142 155 137 173 187 153 140 135 164 144 146 149 151 171 152 148 137 179 146 145 152");
+RefHist("u01fixedpt Threefry4x32 float", " 0 0 0 0 0 0 0 0 0 0 0 0 0 301 330 326 320 295 291 298 287 305 307 310 316 314");
+RefHist("u01fixedpt Threefry4x32 double", " 0 0 0 0 0 0 0 0 0 0 0 0 0 301 330 326 320 295 291 298 287 305 307 310 316 314");
+RefHist("u01fixedpt Threefry4x32 long double", " 0 0 0 0 0 0 0 0 0 0 0 0 0 301 330 326 320 295 291 298 287 305 307 310 316 314");
+RefHist("u01fixedpt Threefry4x64 float", " 0 0 0 0 0 0 0 0 0 0 0 0 0 308 295 322 300 316 291 311 289 346 297 310 340 275");
+RefHist("u01fixedpt Threefry4x64 double", " 0 0 0 0 0 0 0 0 0 0 0 0 0 308 295 322 300 316 291 311 289 346 297 310 340 275");
+RefHist("u01fixedpt Threefry4x64 long double", " 0 0 0 0 0 0 0 0 0 0 0 0 0 308 295 322 300 316 291 311 289 346 297 310 340 275");
+// ./ut_uniform: SUCCESS
diff --git a/tests/util.h b/tests/util.h
@@ -0,0 +1,221 @@
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+ notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions, and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+#ifndef UTIL_H__
+#define UTIL_H__
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+#include <assert.h>
+#include <math.h>
+#include <Random123/features/compilerfeatures.h>
+
+extern const char *progname;
+extern int debug;
+extern int verbose;
+
+#if defined(_MSC_VER)
+#define NOMINMAX /* tells Windows.h to NOT define min() & max() */
+#include <Windows.h>
+R123_STATIC_INLINE double now(){
+ LARGE_INTEGER f; // ticks per second
+ LARGE_INTEGER t;
+ QueryPerformanceFrequency(&f);
+ QueryPerformanceCounter(&t); // ticks since epoch
+ return ((double)t.QuadPart)/((double)f.QuadPart);
+}
+#else // _MSC_VER
+#include <sys/time.h>
+R123_STATIC_INLINE double now(){
+ struct timeval tv;
+ gettimeofday(&tv, 0);
+ return 1.e-6*tv.tv_usec + tv.tv_sec;
+}
+#endif // _MSC_VER
+
+/* timer returns difference between current time and *d, also updates *d with current time. */
+R123_STATIC_INLINE double timer(double *d) {
+ double dold = *d;
+ *d = now();
+ return *d - dold;
+}
+
+/* strdup may or may not be in string.h, depending on the value
+ of the pp-symbol _XOPEN_SOURCE and other arcana. Just
+ do it ourselves.
+ Mnemonic: "ntcs" = "nul-terminated character string" */
+char *ntcsdup(const char *s){
+ char *p = (char *)malloc(strlen(s)+1);
+ strcpy(p, s);
+ return p;
+}
+
+/* MSVC doesn't know about strtoull. Strictly speaking, strtoull
+ isn't standardized in C++98, either, but that seems not to be a
+ problem so we blissfully ignore it and use strtoull (or its MSVC
+ equivalent, _strtoui64) in both C and C++. If strtoull in C++
+ becomes a problem, we can adopt the prtu strategy (see below) and
+ write C++ versions of strtouNN, that use an istringstream
+ instead. */
+#ifdef _MSC_FULL_VER
+#define strtoull _strtoui64
+#endif
+uint32_t strtou32(const char *p, char **endp, int base){
+ uint32_t ret;
+ errno = 0;
+ ret = strtoul(p, endp, base);
+ assert(errno==0);
+ return ret;
+}
+uint64_t strtou64(const char *p, char **endp, int base){
+ uint64_t ret;
+ errno = 0;
+ ret = strtoull(p, endp, base);
+ assert(errno==0);
+ return ret;
+}
+
+#if defined(__cplusplus)
+/* Strict C++98 doesn't grok %llx or unsigned long long, and with
+ aggressive error-checking, e.g., g++ -pedantic -Wall, will refuse
+ to compile code like:
+
+ fprintf(stderr, "%llx", (R123_ULONG_LONG)v);
+
+ On the other hand, when compiling to a 32-bit target, the only
+ 64-bit type is long long, so we're out of luck if we can't use llx.
+ A portable, almost-standard way to do I/O on uint64_t values in C++
+ is to use bona fide C++ I/O streams. We are still playing
+ fast-and-loose with standards because C++98 doesn't have <stdint.h>
+ and hence doesn't even guarantee that there's a uint64_t, much less
+ that the insertion operator<<(ostream&) works correctly with
+ whatever we've typedef'ed to uint64_t in
+ <features/compilerfeatures.h>. Hope for the best... */
+#include <iostream>
+#include <limits>
+template <typename T>
+void prtu(T val){
+ using namespace std;
+ cerr.width(std::numeric_limits<T>::digits/4);
+ char prevfill = cerr.fill('0');
+ ios_base::fmtflags prevflags = cerr.setf(ios_base::hex, ios_base::basefield);
+ cerr << val;
+ cerr.flags(prevflags);
+ cerr.fill(prevfill);
+ assert(!cerr.bad());
+}
+void prtu32(uint32_t v){ prtu(v); }
+void prtu64(uint64_t v){ prtu(v); }
+
+#else /* __cplusplus */
+/* C should be easy. inttypes.h was standardized in 1999. But Microsoft
+ refuses to recognize the 12-year old standard, so: */
+#if defined(_MSC_FULL_VER)
+#define PRIx32 "x"
+#define PRIx64 "I64x"
+#else /* _MSC_FULL_VER */
+#include <inttypes.h>
+#endif /* _MSVC_FULL_VER */
+void prtu32(uint32_t v){ fprintf(stderr, "%08" PRIx32, v); }
+void prtu64(uint64_t v){ fprintf(stderr, "%016" PRIx64, v); }
+
+#endif /* __cplusplus */
+
+#define CHECKNOTEQUAL(x, y) do { if ((x) != (y)) ; else { \
+ fprintf(stderr, "%s: %s line %d error %s == %s (%s)\n", progname, __FILE__, __LINE__, #x, #y, strerror(errno)); \
+ exit(1); \
+} } while (0)
+#define CHECKEQUAL(x, y) do { if ((x) == (y)) ; else { \
+ fprintf(stderr, "%s: %s line %d error %s != %s (%s)\n", progname, __FILE__, __LINE__, #x, #y, strerror(errno)); \
+ exit(1); \
+} } while (0)
+#define CHECKZERO(x) CHECKEQUAL((x), 0)
+#define CHECKNOTZERO(x) CHECKNOTEQUAL((x), 0)
+
+#define dprintf(x) do { if (debug < 1) ; else { printf x; fflush(stdout); } } while (0)
+
+#define ALLZEROS(x, K, N) \
+do { \
+ int allzeros = 1; \
+ unsigned xi, xj; \
+ for (xi = 0; xi < (unsigned)(K); xi++) \
+ for (xj = 0; xj < (unsigned)(N); xj++) \
+ allzeros = allzeros & ((x)[xi].v[xj] == 0); \
+ if (allzeros) fprintf(stderr, "%s: Unexpected, all %lu elements of %ux%u had all zeros!\n", progname, (unsigned long)K, (unsigned)N, 8/*CHAR_BITS*/*(unsigned)sizeof(x[0].v[0])); \
+} while(0)
+
+/* Read in N words of width W into ARR */
+#define SCANFARRAY(ARR, NAME, N, W) \
+do { \
+ int xi, xj; \
+ unsigned long long xv; \
+ for (xi = 0; xi < (N); xi++) { \
+ /* Avoid any cleverness with SCNx##W because Microsoft (as of Visual Studio 10.x) silently trashes the stack by pretending that %hhx is %x). */ \
+ const char *xfmt = " %llx%n"; \
+ ret = sscanf(cp, xfmt, &xv, &xj); \
+ ARR.v[xi] = (uint##W##_t)xv; \
+ if (debug > 1) printf("line %d: xfmt for W=%d is \"%s\", got ret=%d xj=%d, %s[%d]=%llx cp=%s", linenum, W, xfmt, ret, xj, #ARR, xi, (unsigned long long) ARR.v[xi], cp); \
+ if (ret < 1) { \
+ fprintf(stderr, "%s: ran out of words reading %s on line %d: " #NAME #N "x" #W " %2d %s", \
+ progname, #ARR, linenum, rounds, line); \
+ errs++; \
+ return; \
+ } \
+ cp += xj; \
+ } \
+} while(0)
+
+#define PRINTARRAY(ARR, fp) \
+do { \
+ char ofmt[64]; \
+ size_t xj; \
+ /* use %lu and the cast (instead of z) for portability to Microsoft, sizeof(v[0]) should fit easily in an unsigned long. Avoid inttypes for the same reason. */ \
+ sprintf(ofmt, " %%0%lullx", (unsigned long)sizeof(ARR.v[0])*2UL); \
+ for (xj = 0; xj < sizeof(ARR.v)/sizeof(ARR.v[0]); xj++) { \
+ fprintf(fp, ofmt, (unsigned long long) ARR.v[xj]); \
+ } \
+} while(0)
+
+#define PRINTLINE(NAME, N, W, R, ictr, ukey, octr, fp) \
+do { \
+ fprintf(fp, "%s %d ", #NAME #N "x" #W, R); \
+ PRINTARRAY(ictr, fp); \
+ putc(' ', fp); \
+ PRINTARRAY(ukey, fp); \
+ putc(' ', fp); \
+ PRINTARRAY(octr, fp); \
+ putc('\n', fp); \
+ fflush(fp); \
+} while(0)
+
+#endif /* UTIL_H__ */
diff --git a/tests/util_cuda.h b/tests/util_cuda.h
@@ -0,0 +1,135 @@
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+ notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions, and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+#ifndef UTIL_CUDA_H__
+#define UTIL_CUDA_H__
+
+#include "util.h"
+
+#include <cuda.h>
+#include <cuda_runtime_api.h>
+
+// utility macros to check return codes and complain/exit on failure
+#define CHECKLAST(MSG) do { cudaError_t e = cudaGetLastError(); if (e != cudaSuccess) {fprintf(stderr, "%s:%d: CUDA Error: %s: %s\n", __FILE__, __LINE__, (MSG), cudaGetErrorString(e)); exit(1); }} while(0)
+#define CHECKCALL(RET) do { cudaError_t e = (RET); if (e != cudaSuccess) { fprintf(stderr, "%s:%d: CUDA Error: %s\n", __FILE__, __LINE__, cudaGetErrorString(e)); exit(1); } } while(0)
+
+typedef struct cuda_info {
+ int devnum, cores, blocks_per_grid, threads_per_block;
+ double cycles;
+ struct cudaDeviceProp dev;
+} CUDAInfo;
+
+// If devstr is none, chooses device with most cores.
+static CUDAInfo *cuda_init(const char *devstr)
+{
+ CUDAInfo *tp;
+ int i, ndev, cores, devcores;
+ double cycles;
+ CHECKNOTZERO(tp = (CUDAInfo *) malloc(sizeof(CUDAInfo)));
+ CHECKCALL( cudaGetDeviceCount(&ndev) );
+ devcores = 0;
+ if (devstr == NULL)
+ devstr = getenv("R123EXAMPLE_ENVCONF_CUDA_DEVICE");
+ for (i = 0; i < ndev; i++) {
+ struct cudaDeviceProp cu;
+ CHECKCALL( cudaGetDeviceProperties (&cu, i) );
+ // Number of cores is not available from a query, have to hardwire
+ // some knowledge here, from web articles about the various generations
+ // SM or SMX, might also find this info in
+ // CUDA SDK $CUDA_SAMPLES_DIR/common/inc/helper_cuda.h
+ // or https://github.com/NVIDIA/nvidia-docker/blob/master/tools/src/cuda/cuda.go
+ cores = cu.multiProcessorCount;
+ if (cu.major == 1 && cu.minor >= 0 && cu.minor <= 3) {
+ // 1.0 (G80, G92, aka GTX880, Tesla [CSD]870) to 1.3 (GT200, aka GTX280, Tesla [CS]10xx) have 8 cores per MP
+ cores *= 8;
+ } else if (cu.major == 2 && cu.minor == 0) {
+ // 2.0 (G100, aka GTX480, Tesla/Fermi [CSM]20[567]0, and GF110, aka GTX580, M2090)
+ cores *= 32;
+ } else if (cu.major == 2 && cu.minor == 1) {
+ // 2.1 (GF104, GF114, GF116 aka GTX [45][56]0)
+ cores *= 48;
+ } else if (cu.major == 3) {
+ // 3.0 (Kepler GK104 aka GTX 680), 3.2 (TK1), 3.5 (GK11x, GK20x), 3.7 (GK21x)
+ cores *= 192;
+ } else if (cu.major == 5) {
+ // 5.0 (Maxwell GM10x), 5.2 (GM20x), 5.3 (TX1)
+ cores *= 128;
+ } else if (cu.major == 6 && cu.minor == 0) {
+ // 6.0 (Pascal P100)
+ cores *= 64;
+ } else if (cu.major == 6) {
+ // 6.1 (Pascal 10xx, Titan Xp, P40), 6.2 (Drive PX2 and Tegra)
+ cores *= 128;
+ } else if (cu.major == 7) {
+ // 7.[025] (Volta and Turing RTX 20[678]0, Titan RTX, Quadro RTX)
+ cores *= 128;
+ } else {
+ int coremultguess = 384;
+ cores *= coremultguess;
+ fprintf(stderr, "WARNING: Unknown number of cores per MP for this device: assuming %d, so cpb calculation will be wrong and choice of blocks/grid might be suboptimal\n", coremultguess);
+ }
+ /* clockrate is in KHz */
+ cycles = 1e3 * cu.clockRate * cores;
+ printf(" %d: maj %d min %d %s%s ( %d units @ %g MHz ECC=%d %d cores %g Gcycles/s)\n",
+ i, cu.major, cu.minor, cu.name, cu.integrated ? " integrated" : "",
+ cu.multiProcessorCount, cu.clockRate*1e-3, cu.ECCEnabled, cores, cycles*1e-9);
+ if (devstr && strstr(cu.name, devstr) == NULL) {
+ dprintf(("skipping device %s\n", cu.name));
+ continue;
+ }
+ if (cores > devcores) {
+ devcores = cores;
+ tp->devnum = i;
+ tp->cores = cores;
+ tp->cycles = cycles;
+ tp->dev = cu;
+ }
+ }
+ if (devcores == 0) {
+ fprintf(stderr, "could not find specified device\n");
+ exit(1);
+ }
+ tp->blocks_per_grid = tp->cores; /* seems like a good guess */
+ tp->threads_per_block = tp->dev.warpSize * 2;
+ printf("Using CUDA device %d, %d cores, %g cycles, will try %d blocks/grid %d threads/block\n",
+ tp->devnum, tp->cores, tp->cycles, tp->blocks_per_grid, tp->threads_per_block);
+ CHECKCALL(cudaSetDevice(tp->devnum));
+ dprintf(("cuda_init done\n"));
+ return tp;
+}
+
+static void cuda_done(CUDAInfo *tp)
+{
+ dprintf(("cuda_done\n"));
+ free(tp);
+}
+
+#endif /* UTIL_CUDA_H__ */
diff --git a/tests/util_demangle.hpp b/tests/util_demangle.hpp
@@ -0,0 +1,75 @@
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+ notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions, and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+#ifndef demangle_dot_hpp_
+#include <string>
+
+// Every compiler has a demangling library *somewhere*. Unfortunately, they're
+// all different...
+
+#ifdef __GNUC__
+ // Clang defines __GNUC__, but clang3.1 with -stdlib=libc++ can't
+ // find a <cxxabi.h> even though it *can* find the symbols at link
+ // time. I suspect this is a bug/oversight in the installation
+ // process (which, in June 2012 is still pretty fluid for libc++), so
+ // it might be fixed in the future. On the other hand, the API in
+ // cxxabi.h is locked down pretty tightly, so writing out an explicit
+ // extern declaration is pretty safe, and avoids a rats nest of
+ // ifdefs. It is tempting to use clang's __has_include(<cxxabi.h>),
+ // but it feels like more #ifdefs with no obvious upside.
+ //
+ // #include <cxxabi.h>
+extern "C"{
+ char*
+ __cxa_demangle(const char* __mangled_name, char* __output_buffer,
+ size_t* __length, int* __status);
+}
+#endif
+#include <typeinfo>
+
+template <typename T>
+std::string demangle(const T& ignored){
+#ifdef __GNUC__
+ int status;
+ char *realname = __cxa_demangle(typeid(ignored).name(), 0, 0, &status);
+ std::string ret;
+ if(status!=0 || realname==0)
+ ret = typeid(ignored).name();
+ else
+ ret = realname;
+ free(realname);
+ return ret;
+#else
+ return typeid(ignored).name();
+#endif
+}
+
+#endif
diff --git a/tests/util_expandtpl.h b/tests/util_expandtpl.h
@@ -0,0 +1,72 @@
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+ notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions, and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+#ifndef TEST_TPL
+#error "TEST_TPL not defined before including util_expandtpl.h"
+#else
+/*
+ * This is included by various files after defining TEST_TPL to
+ * expand TEST_TPL for each of the RNGs we want to test.
+ * TEST_TPL args are the name of the RNG, N, W, and R,
+ * N being the number of words, W being the wordsize in bits,
+ * and R being the number of rounds.
+ */
+
+#if TRY_PHILOX2X32
+TEST_TPL(philox, 2, 32, 7)
+TEST_TPL(philox, 2, 32, 10)
+#endif
+TEST_TPL(philox, 4, 32, 7)
+TEST_TPL(philox, 4, 32, 10)
+#if R123_USE_PHILOX_64BIT
+TEST_TPL(philox, 2, 64, 6)
+TEST_TPL(philox, 2, 64, 10)
+TEST_TPL(philox, 4, 64, 7)
+TEST_TPL(philox, 4, 64, 10)
+#endif
+#if R123_USE_64BIT
+TEST_TPL(threefry, 2, 64, 13)
+TEST_TPL(threefry, 2, 64, 20)
+TEST_TPL(threefry, 4, 64, 12)
+TEST_TPL(threefry, 4, 64, 20)
+TEST_TPL(threefry, 4, 64, 72)
+#endif
+TEST_TPL(threefry, 4, 32, 12)
+TEST_TPL(threefry, 4, 32, 20)
+
+#if R123_USE_AES_NI
+TEST_TPL(ars, 4, 32, 5)
+TEST_TPL(ars, 4, 32, 7)
+TEST_TPL(aesni, 4, 32, 10)
+#endif
+
+#undef TEST_TPL
+#endif /* TEST_TPL */
diff --git a/tests/util_m128.h b/tests/util_m128.h
@@ -0,0 +1,87 @@
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+ notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions, and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+#ifndef UTIL_M128_H__
+#define UTIL_M128_H__
+#include <Random123/features/sse.h>
+
+// The formatting in fips-197 seems to correspond to
+// byte[15] [14] ... [0]
+__m128i m128i_from_charbuf(const char *s){
+ unsigned int bytes[16];
+ sscanf(s, "%02x%02x%02x%02x" "%02x%02x%02x%02x" "%02x%02x%02x%02x" "%02x%02x%02x%02x",
+ &bytes[0], &bytes[1], &bytes[2], &bytes[3],
+ &bytes[4], &bytes[5], &bytes[6], &bytes[7],
+ &bytes[8], &bytes[9], &bytes[10], &bytes[11],
+ &bytes[12], &bytes[13], &bytes[14], &bytes[15]);
+ return _mm_set_epi8(
+ bytes[15], bytes[14], bytes[13], bytes[12],
+ bytes[11], bytes[10], bytes[9], bytes[8],
+ bytes[7], bytes[6], bytes[5], bytes[4],
+ bytes[3], bytes[2], bytes[1], bytes[0]
+ );
+}
+
+#define M128_STR_SIZE 34 /* minimum size of the charbuf "hex" argument */
+
+char *m128i_to_charbuf(__m128i m, char *hex){
+ union {
+ unsigned char bytes[16];
+ __m128i m;
+ } u;
+ _mm_storeu_si128((__m128i*)&u.bytes[0], m);
+ sprintf(hex, "%02x%02x%02x%02x" "%02x%02x%02x%02x"
+ " "
+ "%02x%02x%02x%02x""%02x%02x%02x%02x",
+ u.bytes[0], u.bytes[1], u.bytes[2], u.bytes[3],
+ u.bytes[4], u.bytes[5], u.bytes[6], u.bytes[7],
+ u.bytes[8], u.bytes[9], u.bytes[10], u.bytes[11],
+ u.bytes[12], u.bytes[13], u.bytes[14], u.bytes[15]);
+
+ return hex;
+}
+
+#ifdef __cplusplus
+#include <string>
+
+__m128i m128i_from_string(const std::string& s) {
+ return m128i_from_charbuf(s.c_str());
+}
+
+std::string m128i_to_string(__m128i m) {
+ char hex[M128_STR_SIZE];
+
+ m128i_to_charbuf(m, hex);
+ return std::string(hex);
+}
+#endif /* __cplusplus */
+
+#endif /* UTIL_M128_H__ */
diff --git a/tests/util_metal.h b/tests/util_metal.h
@@ -0,0 +1,113 @@
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+ notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions, and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+#ifndef UTIL_METAL_H__
+#define UTIL_METAL_H__
+/*
+ * has a couple of utility functions to setup and teardown Metal.
+ * Avoid much boilerplate in every Metal program
+ *
+ * Written by Tom Schoonjans <Tom.Schoonjans@me.com>
+ */
+
+#import <Foundation/Foundation.h>
+#import <Metal/Metal.h>
+
+#include "util.h"
+
+typedef struct umetal_info {
+ id<MTLDevice> device;
+ id<MTLCommandQueue> queue;
+ id<MTLLibrary> library;
+} UMetalInfo;
+
+/* Miscellaneous checking macros for convenience */
+static char *print_metal_errstring(NSError *err) {
+ if (err == nil)
+ return nil;
+ return strdup(err.localizedDescription.UTF8String);
+}
+
+#define CHECKERR(x) do { \
+ (x); \
+ if (err != nil) { \
+ fprintf(stderr, "%s: error %s from %s\n", progname, print_metal_errstring(err), #x); \
+ exit(1); \
+ } \
+} while(0)
+
+//#define CHECK(x) CHECKERR(err = (x))
+
+static UMetalInfo *metal_init(const char *devstr, const char *metallib)
+{
+ UMetalInfo *tp;
+ NSError *err = nil;
+ NSArray<id<MTLDevice>> *devices;
+ unsigned i;
+ unsigned long ndevices;
+
+ /* get list of platforms */
+ CHECKNOTZERO(devices = MTLCopyAllDevices());
+ ndevices = (unsigned long) devices.count;
+ dprintf(("ndevices = %lu\n", ndevices));
+ if (ndevices == 0) {
+ fprintf(stderr, "No Metal devices available\n");
+ return NULL;
+ }
+ dprintf(("found %lu device%s\n", ndevices, ndevices == 1 ? "" : "s"));
+ CHECKNOTZERO(tp = (UMetalInfo *) malloc(sizeof(UMetalInfo)));
+ for (i = 0; i < devices.count; i++) {
+ dprintf(("device %d: %s\n", i, devices[i].name.UTF8String));
+ }
+
+ // get default device
+ tp->device = MTLCreateSystemDefaultDevice();
+
+ dprintf(("create Metal command queue for device %s\n", tp->device.name.UTF8String));
+ CHECKNOTZERO(tp->queue = [tp->device newCommandQueue]);
+ dprintf(("create Metal library from %s\n", metallib));
+ CHECKERR(tp->library = [tp->device newLibraryWithFile: [[NSString alloc] initWithUTF8String:metallib] error:&err]);
+
+ return tp;
+}
+
+
+static void metal_done(UMetalInfo *tp) {
+
+ dprintf(("metal_done\n"));
+ [tp->library release];
+ [tp->queue release];
+ [tp->device release];
+ free(tp);
+}
+
+
+#endif /* UTIL_METAL_H__ */
diff --git a/tests/util_opencl.h b/tests/util_opencl.h
@@ -0,0 +1,381 @@
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+ notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions, and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+#ifndef UTIL_OPENCL_H__
+#define UTIL_OPENCL_H__
+/*
+ * has a couple of utility functions to setup and teardown OpenCL.
+ * Avoid much boilerplate in every OpenCL program
+ */
+
+#include "util.h"
+
+/* We use the old clCreateCommandQueue for max portability since we do not
+ * use any cmdq properties anyway, avoids a warning.
+ */
+#define CL_USE_DEPRECATED_OPENCL_1_2_APIS
+
+#if defined(__APPLE__) || defined(__MACOSX)
+#include <OpenCL/cl.h>
+#include <OpenCL/cl_ext.h>
+#else
+#include <CL/cl.h>
+#include <CL/cl_ext.h>
+#endif
+
+#define UCL_STRSIZE 128
+
+typedef struct ucl_info {
+ cl_context ctx;
+ cl_program prog;
+ cl_device_id devid;
+ cl_command_queue cmdq;
+ cl_uint clkfreq, compunits;
+ size_t wgsize;
+ int cores;
+ double cycles;
+ char vendor[UCL_STRSIZE], devname[UCL_STRSIZE],
+ version[UCL_STRSIZE], driver[UCL_STRSIZE];
+ int computeflags;
+ cl_device_fp_config fpdbl;
+ cl_device_type devtype;
+} UCLInfo;
+
+/* Miscellaneous checking macros for convenience */
+static char *print_cl_errstring(cl_int err) {
+ switch (err) {
+ case CL_SUCCESS: return strdup("Success!");
+ case CL_DEVICE_NOT_FOUND: return strdup("Device not found.");
+ case CL_DEVICE_NOT_AVAILABLE: return strdup("Device not available");
+ case CL_COMPILER_NOT_AVAILABLE: return strdup("Compiler not available");
+ case CL_MEM_OBJECT_ALLOCATION_FAILURE: return strdup("Memory object allocation failure");
+ case CL_OUT_OF_RESOURCES: return strdup("Out of resources");
+ case CL_OUT_OF_HOST_MEMORY: return strdup("Out of host memory");
+ case CL_PROFILING_INFO_NOT_AVAILABLE: return strdup("Profiling information not available");
+ case CL_MEM_COPY_OVERLAP: return strdup("Memory copy overlap");
+ case CL_IMAGE_FORMAT_MISMATCH: return strdup("Image format mismatch");
+ case CL_IMAGE_FORMAT_NOT_SUPPORTED: return strdup("Image format not supported");
+ case CL_BUILD_PROGRAM_FAILURE: return strdup("Program build failure");
+ case CL_MAP_FAILURE: return strdup("Map failure");
+ case CL_INVALID_VALUE: return strdup("Invalid value");
+ case CL_INVALID_DEVICE_TYPE: return strdup("Invalid device type");
+ case CL_INVALID_PLATFORM: return strdup("Invalid platform");
+ case CL_INVALID_DEVICE: return strdup("Invalid device");
+ case CL_INVALID_CONTEXT: return strdup("Invalid context");
+ case CL_INVALID_QUEUE_PROPERTIES: return strdup("Invalid queue properties");
+ case CL_INVALID_COMMAND_QUEUE: return strdup("Invalid command queue");
+ case CL_INVALID_HOST_PTR: return strdup("Invalid host pointer");
+ case CL_INVALID_MEM_OBJECT: return strdup("Invalid memory object");
+ case CL_INVALID_IMAGE_FORMAT_DESCRIPTOR: return strdup("Invalid image format descriptor");
+ case CL_INVALID_IMAGE_SIZE: return strdup("Invalid image size");
+ case CL_INVALID_SAMPLER: return strdup("Invalid sampler");
+ case CL_INVALID_BINARY: return strdup("Invalid binary");
+ case CL_INVALID_BUILD_OPTIONS: return strdup("Invalid build options");
+ case CL_INVALID_PROGRAM: return strdup("Invalid program");
+ case CL_INVALID_PROGRAM_EXECUTABLE: return strdup("Invalid program executable");
+ case CL_INVALID_KERNEL_NAME: return strdup("Invalid kernel name");
+ case CL_INVALID_KERNEL_DEFINITION: return strdup("Invalid kernel definition");
+ case CL_INVALID_KERNEL: return strdup("Invalid kernel");
+ case CL_INVALID_ARG_INDEX: return strdup("Invalid argument index");
+ case CL_INVALID_ARG_VALUE: return strdup("Invalid argument value");
+ case CL_INVALID_ARG_SIZE: return strdup("Invalid argument size");
+ case CL_INVALID_KERNEL_ARGS: return strdup("Invalid kernel arguments");
+ case CL_INVALID_WORK_DIMENSION: return strdup("Invalid work dimension");
+ case CL_INVALID_WORK_GROUP_SIZE: return strdup("Invalid work group size");
+ case CL_INVALID_WORK_ITEM_SIZE: return strdup("Invalid work item size");
+ case CL_INVALID_GLOBAL_OFFSET: return strdup("Invalid global offset");
+ case CL_INVALID_EVENT_WAIT_LIST: return strdup("Invalid event wait list");
+ case CL_INVALID_EVENT: return strdup("Invalid event");
+ case CL_INVALID_OPERATION: return strdup("Invalid operation");
+ case CL_INVALID_GL_OBJECT: return strdup("Invalid OpenGL object");
+ case CL_INVALID_BUFFER_SIZE: return strdup("Invalid buffer size");
+ case CL_INVALID_MIP_LEVEL: return strdup("Invalid mip-map level");
+ default: return strdup("Unknown");
+ }
+}
+
+static const char *cldevtypestr(cl_device_type c) {
+ switch (c) {
+ case CL_DEVICE_TYPE_CPU: return "CPU";
+ case CL_DEVICE_TYPE_GPU: return "GPU";
+ case CL_DEVICE_TYPE_ACCELERATOR: return "ACCELERATOR";
+ case CL_DEVICE_TYPE_DEFAULT: return "DEFAULT";
+ default: return "UNKNOWN";
+ }
+}
+
+#define CHECKERR(x) do { \
+ (x); \
+ if (err != CL_SUCCESS) { \
+ fprintf(stderr, "%s: error %d: %s from %s\n", progname, err, print_cl_errstring(err), #x); \
+ exit(1); \
+ } \
+} while(0)
+
+#define CHECK(x) CHECKERR(err = (x))
+
+static UCLInfo *opencl_init(const char *devstr, const char *src,
+ const char *options)
+{
+#define UCL_MAX_PROPERTIES 32
+#define UCL_MAX_PLATFORMS 8
+#define UCL_MAX_DEVICES 16
+ UCLInfo *tp;
+ cl_context_properties ctxprop[UCL_MAX_PROPERTIES];
+ cl_int err;
+ cl_platform_id platforms[UCL_MAX_PLATFORMS];
+ cl_uint nplatforms, ndevices;
+ cl_device_id devices[UCL_MAX_DEVICES];
+ const char *srcstr[2], *clbinfile, *coremultstr;
+ unsigned i, j;
+ int cores, devcores, coremultguess = 0;
+
+ if (devstr == NULL)
+ devstr = getenv("R123EXAMPLE_ENVCONF_OPENCL_DEVICE");
+
+ coremultstr = getenv("R123EXAMPLE_ENVCONF_OPENCL_CORES_PER_UNIT");
+ if (coremultstr) {
+ coremultguess = atoi(coremultstr);
+ dprintf(("setting coremultguess to %d\n", coremultguess));
+ }
+
+ /* get list of platforms */
+ CHECK(clGetPlatformIDs(0, NULL, &nplatforms));
+ dprintf(("nplatforms = %d\n", nplatforms));
+ CHECK(clGetPlatformIDs(UCL_MAX_PLATFORMS, platforms, &nplatforms));
+ if (nplatforms == 0) {
+ fprintf(stderr, "No OpenCL platforms available\n");
+ return NULL;
+ }
+ dprintf(("found %d platform%s:\n", nplatforms, nplatforms == 1 ? "" : "s"));
+ CHECKNOTZERO(tp = (UCLInfo *) malloc(sizeof(UCLInfo)));
+ ctxprop[0] = CL_CONTEXT_PLATFORM;
+ ctxprop[1] = 0; /* will fill in platform in loop */
+ ctxprop[2] = 0;
+ cores = devcores = 0;
+ for (i = 0; i < nplatforms; i++) {
+ dprintf(("platform %d: 0x%lx\n", i, (unsigned long)platforms[i]));
+ clGetDeviceIDs(platforms[i], CL_DEVICE_TYPE_ALL, UCL_MAX_DEVICES,
+ devices, &ndevices);
+ // Sometimes, a platform with no devices will just return a failure instead
+ // of 0 devices, do not be deterred by that ...
+ if (err != CL_SUCCESS) {
+ fprintf(stderr, "%s: error %d: %s from clGetDeviceIDs for platform %d ( 0x%lx )\n", progname, err, print_cl_errstring(err), i,
+ (unsigned long)platforms[i]);
+ continue;
+ }
+ dprintf(("platform 0x%lx has %d devices:\n", (unsigned long)platforms[i], ndevices));
+ for (j = 0; j < ndevices; j++) {
+ UCLInfo uc;
+ uc.devid = devices[j];
+ CHECK(clGetDeviceInfo(devices[j], CL_DEVICE_NAME,
+ sizeof uc.devname, uc.devname, 0));
+ CHECK(clGetDeviceInfo(devices[j], CL_DEVICE_VENDOR,
+ sizeof uc.vendor, uc.vendor, 0));
+ CHECK(clGetDeviceInfo(devices[j], CL_DEVICE_VERSION,
+ sizeof uc.version, uc.version, 0));
+ CHECK(clGetDeviceInfo(devices[j], CL_DRIVER_VERSION,
+ sizeof uc.driver, uc.driver, 0));
+ CHECK(clGetDeviceInfo(devices[j], CL_DEVICE_MAX_CLOCK_FREQUENCY,
+ sizeof uc.clkfreq, &uc.clkfreq, 0));
+ CHECK(clGetDeviceInfo(devices[j], CL_DEVICE_MAX_COMPUTE_UNITS,
+ sizeof uc.compunits, &uc.compunits, 0));
+ CHECK(clGetDeviceInfo(devices[j], CL_DEVICE_MAX_WORK_GROUP_SIZE,
+ sizeof uc.wgsize, &uc.wgsize, 0));
+ CHECK(clGetDeviceInfo(devices[j], CL_DEVICE_DOUBLE_FP_CONFIG,
+ sizeof uc.fpdbl, &uc.fpdbl, 0));
+ CHECK(clGetDeviceInfo(devices[j], CL_DEVICE_TYPE,
+ sizeof uc.devtype, &uc.devtype, 0));
+ uc.computeflags = 0;
+#ifdef CL_DEVICE_COMPUTE_CAPABILITY_MAJOR_NV
+ {
+ cl_uint nvmaj, nvmin;
+ if(clGetDeviceInfo(devices[j], CL_DEVICE_COMPUTE_CAPABILITY_MAJOR_NV,
+ sizeof(nvmaj), &nvmaj, 0) == CL_SUCCESS &&
+ clGetDeviceInfo(devices[j], CL_DEVICE_COMPUTE_CAPABILITY_MINOR_NV,
+ sizeof(nvmin), &nvmin, 0) == CL_SUCCESS) {
+ uc.computeflags = nvmaj*10 + nvmin;
+ }
+ }
+#endif
+ cores = uc.compunits;
+ /* XXX Hardwired knowledge about devices */
+ if (coremultguess) {
+ cores *= coremultguess;
+ printf("Using override cores per unit %d so %d cores\n", coremultguess, cores);
+ } else if (strstr(uc.devname, "Cayman") || strstr(uc.devname, "Tahiti")) {
+ /*
+ * Most modern AMD compute units (shader cluster?)
+ * are a 16-lane SIMD Engine with 4 (Cayman) or 5
+ * (Cypress) VLIW slots per lane. AMD appears to
+ * think of each slot as a "stream processor"
+ * (shader processor) in their marketing i.e. a
+ * Cayman-based Radeon 6950 with 24 compute units
+ * has 1536 stream processors.
+ * With Tahiti/Southern Islands/GCN, each compute
+ * unit has four vector execution SIMD units, each
+ * with 16 lanes. So the Tahiti-based Radeon 7970 with
+ * 32 compute units has 2048 cores/stream processors.
+ */
+ cores *= 16*4;
+ } else if (strstr(uc.devname, "Cypress")) {
+ cores *= 16*5;
+ } else if (strstr(uc.devname, "GTX TITAN X") ||
+ strstr(uc.devname, "GTX 9")) {
+ cores *= 128;
+ } else if (strstr(uc.devname, "GTX 6") ||
+ strstr(uc.devname, "GTX 7") ||
+ strstr(uc.devname, "Tesla K2") ||
+ strstr(uc.devname, "Tesla K4") ||
+ strstr(uc.devname, "GTX TITAN")) {
+ /* Kepler has 192 cores per SMX */
+ cores *= 192;
+ } else if (strstr(uc.devname, "GTX 580") ||
+ strstr(uc.devname, "GTX 480") ||
+ strstr(uc.devname, "C20") ||
+ strstr(uc.devname, "M20")) {
+ /*
+ * Fermi has 32 cores per SM. Maybe use
+ * computeflags to figure this out?
+ */
+ cores *= 32;
+ } else if (uc.devtype == CL_DEVICE_TYPE_GPU) {
+ fprintf(stderr, "Unknown # of cores per unit for this device \"%s\", assuming 1, so cpb may be wrong and choice of threads may be suboptimal, fix by setting R123EXAMPLE_ENVCONF_OPENCL_CORES_PER_UNIT\n",
+ uc.devname);
+ }
+ /* clkfreq is in Megahertz! */
+ uc.cycles = 1e6 * uc.clkfreq * cores;
+ dprintf((" %d: device 0x%lx vendor %s %s version %s driver %s : %u compute units @ %u MHz %d cores cycles/s %.2f flags %d fpdbl 0x%lx\n",
+ j, (unsigned long) devices[j], uc.vendor, uc.devname, uc.version,
+ uc.driver, uc.compunits, uc.clkfreq, cores, uc.cycles, uc.computeflags,
+ (unsigned long) uc.fpdbl));
+ if (devstr && strstr(uc.devname, devstr) == NULL) {
+ if (verbose || debug)
+ printf("skipping device %s\n", uc.devname);
+ continue;
+ }
+ if (cores > devcores) {
+ ctxprop[1] = (cl_context_properties) platforms[i];
+ devcores = cores;
+ *tp = uc;
+ }
+ }
+ }
+ if (devcores == 0) {
+ fprintf(stderr, "%s: No matching devices found\n", progname);
+ exit(1);
+ }
+ tp->cores = devcores;
+
+ // using DEVICE_MAX_WORKGROUP_SIZE as the workgroup size seems to break
+ // weirdly on NVIDIA SDK 4.0.17 (the returned ctr arrays are all zeros)
+ // Halving it seems to produce as good or fractionally better performance
+ // on AMD, so seems a good choice. -- mm, 20110831
+ if (tp->wgsize > 2) {
+ tp->wgsize /= 2;
+ }
+ printf("device 0x%lx %s : %d units %d cores %.2f Gcycles/s %lu maxwg %s device\n",
+ (unsigned long)tp->devid, tp->devname, tp->compunits, devcores, tp->cycles*1e-9, tp->wgsize, cldevtypestr(tp->devtype));
+ CHECKERR(tp->ctx = clCreateContext(ctxprop, 1, &tp->devid, 0, 0, &err));
+ dprintf(("create OpenCL context for device 0x%lx %s\n", (unsigned long)tp->devid, tp->devname));
+ CHECKERR(tp->cmdq = clCreateCommandQueue(tp->ctx, tp->devid, 0, &err));
+ /*
+ * create & compile OpenCL program from source string. Could
+ * normalize this out of the context but that creates a more
+ * complex API.
+ */
+ dprintf(("create OpenCL program from source\n"));
+
+ /* If the device has support for double, enable it, might need it for u01.h */
+ i = 0;
+#define UCLDBL "\n\
+#ifdef cl_khr_fp64\n\
+#pragma OPENCL EXTENSION cl_khr_fp64 : enable\n\
+#elif defined(cl_amd_fp64)\n\
+#pragma OPENCL EXTENSION cl_amd_fp64 : enable\n\
+#endif\n\
+"
+ if (tp->fpdbl) {
+ srcstr[i++] = UCLDBL;
+ }
+ srcstr[i++] = src;
+ CHECKERR(tp->prog = clCreateProgramWithSource(tp->ctx, i, srcstr, 0, &err));
+ if ((err = clBuildProgram(tp->prog, 1, &tp->devid, options, 0, 0)) != CL_SUCCESS || debug) {
+ char errbuf[512*1024];
+ strcpy(errbuf, "<error report not filled in>");
+ cl_int builderr = err;
+ CHECK(clGetProgramBuildInfo(tp->prog, tp->devid, CL_PROGRAM_BUILD_LOG,
+ sizeof errbuf, &errbuf[0], 0));
+ fprintf(stderr, "%s: OpenCL build for device id 0x%lx %s returned error %d (%s): %s\n",
+ progname, (unsigned long) tp->devid, tp->devname, builderr, print_cl_errstring(builderr), errbuf);
+ if (builderr != CL_SUCCESS)
+ exit(1);
+ }
+ if ((clbinfile = getenv("R123_SAVE_OPENCL_BINARY")) != NULL) {
+ size_t sz, szret;
+ unsigned char *binp;
+ FILE *fp;
+ CHECKERR(clGetProgramInfo(tp->prog, CL_PROGRAM_BINARY_SIZES, sizeof(sz), &sz, &szret));
+ CHECKNOTZERO(szret);
+ CHECKNOTZERO(sz);
+ printf("szret %lu, sz %lu\n", szret, (unsigned long) sz);
+ if (szret > 0 && sz > 0) {
+ CHECKNOTZERO((binp = (unsigned char *) malloc(sz)));
+ CHECKERR(clGetProgramInfo(tp->prog, CL_PROGRAM_BINARIES, sizeof(binp), &binp, &szret));
+ CHECKNOTZERO(szret);
+ CHECKNOTZERO(fp = fopen(clbinfile, "wc"));
+ CHECKEQUAL(sz, fwrite(binp, 1, sz, fp));
+ CHECKZERO(fclose(fp));
+ free(binp);
+ printf("wrote OpenCL binary to %s\n", clbinfile);
+ }
+ }
+ dprintf(("opencl_init done\n"));
+ /* XXX Save build programs as .deviceid so we can read them back and run? */
+ return tp;
+}
+
+
+static void opencl_done(UCLInfo *tp) {
+ cl_int err;
+
+ dprintf(("opencl_done\n"));
+ CHECK(clReleaseCommandQueue(tp->cmdq));
+ tp->cmdq = 0;
+ CHECK(clReleaseProgram(tp->prog));
+ tp->prog = 0;
+ CHECK(clReleaseContext(tp->ctx));
+ tp->ctx = 0;
+ free(tp);
+}
+
+
+#endif /* UTIL_OPENCL_H__ */
diff --git a/tests/util_print.h b/tests/util_print.h
@@ -0,0 +1,58 @@
+/*
+Copyright 2010-2011, D. E. Shaw Research.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+ notice, this list of conditions, and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions, and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+* Neither the name of D. E. Shaw Research nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+#ifndef UTIL_PRINT_H__
+#define UTIL_PRINT_H__
+
+#include <stdio.h>
+
+extern int verbose;
+
+#define TEST_TPL(NAME, N, W, R) \
+void printline_##NAME##N##x##W##_##R(NAME##N##x##W##_ukey_t ukey, NAME##N##x##W##_ctr_t ictr, NAME##N##x##W##_ctr_t *octrs, size_t nctr) \
+{ \
+ size_t i; \
+ for (i = 0; i < nctr; i++) { \
+ if (i > 0) { \
+ printf(" [%lu]", (unsigned long)i); \
+ PRINTARRAY(octrs[i], stdout); \
+ putc('\n', stdout); \
+ fflush(stdout); \
+ } else { \
+ PRINTLINE(NAME, N, W, R, ictr, ukey, octrs[0], stdout); \
+ } \
+ if (verbose < 2) break; \
+ } \
+}
+
+#include "util_expandtpl.h"
+
+#endif /* UTIL_PRINT_H__ */