diff --git a/corsika/detail/framework/random/RNGManager.inl b/corsika/detail/framework/random/RNGManager.inl index 1d0da48313f622e3c9b567127ed2104b15fc3029..21c924bf7765208d39c57f385ba3ac02e7acda3e 100644 --- a/corsika/detail/framework/random/RNGManager.inl +++ b/corsika/detail/framework/random/RNGManager.inl @@ -11,21 +11,28 @@ #include <iterator> #include <random> #include <sstream> +#include <tuple> +#include <utility> namespace corsika { - inline void RNGManager::registerRandomStream(string_type const& pStreamName) { - prng_type rng; + template<typename CBPRNG> + inline void RNGManager<CBPRNG>::registerRandomStream(string_type const& pStreamName) { - if (auto const& it = seeds_.find(pStreamName); it != seeds_.end()) { - rng.seed(it->second); - } + auto const& it = rngs_.find(pStreamName); + + if ( it == rngs_.end())//key not in container, so create one and initialize the value + rngs_.emplace(std::piecewise_construct, + std::forward_as_tuple(pStreamName.c_str()), + std::forward_as_tuple(seed_, uint32_t(rngs_.size()))); - rngs_[pStreamName] = std::move(rng); } - inline RNGManager::prng_type& RNGManager::getRandomStream( + template<typename CBPRNG> + inline typename RNGManager<CBPRNG>::prng_type& + RNGManager<CBPRNG>::getRandomStream( string_type const& pStreamName) { + if (isRegistered(pStreamName)) { return rngs_.at(pStreamName); } else { // this stream name is not in the map @@ -33,11 +40,13 @@ namespace corsika { } } - inline bool RNGManager::isRegistered(string_type const& pStreamName) const { + template<typename CBPRNG> + inline bool RNGManager<CBPRNG>::isRegistered(string_type const& pStreamName) const { return rngs_.count(pStreamName) > 0; } - inline std::stringstream RNGManager::dumpState() const { + template<typename CBPRNG> + inline std::stringstream RNGManager<CBPRNG>::dumpState() const { std::stringstream buffer; for (auto const& [streamName, rng] : rngs_) { buffer << '"' << streamName << "\" = \"" << rng << '"' << std::endl; @@ -46,23 +55,6 @@ namespace corsika { return buffer; } - inline void RNGManager::seedAll(seed_type vSeed) { - for (auto& entry : rngs_) { entry.second.seed(vSeed++); } - } - - inline void RNGManager::seedAll(void) { - std::random_device rd; - for (auto& [streamName, rng] : rngs_) { - std::seed_seq sseq{rd(), rd(), rd(), rd(), rd(), rd()}; // 6 really random values - - // for logging collect sseq input values in string - std::stringstream ss; - sseq.param(std::ostream_iterator<int>{ss, " "}); - CORSIKA_LOG_DEBUG("Random seed stream {} seed {}", streamName, ss.str()); - - rng.seed(sseq); - } - } } // namespace corsika diff --git a/corsika/detail/framework/random/random_iterator/RandomIterator.h b/corsika/detail/framework/random/random_iterator/RandomIterator.h new file mode 100644 index 0000000000000000000000000000000000000000..57356a6cacb480a69a88652d777722516708b16f --- /dev/null +++ b/corsika/detail/framework/random/random_iterator/RandomIterator.h @@ -0,0 +1,81 @@ +/*---------------------------------------------------------------------------- + * + * Copyright (C) 2021 Antonio Augusto Alves Junior + * + * This file is part of RandomIterator. + * + * RandomIterator is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * RandomIterator is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with RandomIterator. If not, see <http://www.gnu.org/licenses/>. + * + *---------------------------------------------------------------------------*/ + +/* + * RandomIterator.h + * + * Created on: 21/02/2021 + * Author: Antonio Augusto Alves Junior + */ + +#pragma once + +// This is the only RandomIterator header that is guaranteed to +// change with every RandomIterator release. +// +// RandomIterator_VERSION % 100 is the sub-minor version +// RandomIterator_VERSION / 100 % 1000 is the minor version +// RandomIterator_VERSION / 100000 is the major version +// +// Because this header does not #include <RandomIterator/detail/Config.h>, +// it is the only RandomIterator header that does not cause +// RandomIterator_HOST_SYSTEM and RandomIterator_DEVICE_SYSTEM to be defined. + +/*! \def RandomIterator_VERSION + * \brief The preprocessor macro \p RandomIterator_VERSION encodes the version + * number of the RandomIterator. + * + * <tt>RandomIterator_VERSION % 100</tt> is the patch version. + * <tt>RandomIterator_VERSION / 100 % 1000</tt> is the feature version. + * <tt>RandomIterator_VERSION / 100000</tt> is the major version. + */ +#define RandomIterator_VERSION 100001 + + +/*! \def RandomIterator_MAJOR_VERSION + * \brief The preprocessor macro \p RandomIterator_MAJOR_VERSION encodes the + * major version number of RandomIterator. + */ +#define RandomIterator_MAJOR_VERSION (RandomIterator_VERSION / 100000) + +/*! \def RandomIterator_MINOR_VERSION + * \brief The preprocessor macro \p RandomIterator_MINOR_VERSION encodes the + * minor version number of RandomIterator. + */ +#define RandomIterator_MINOR_VERSION (RandomIterator_VERSION / 100 % 1000) + +/*! \def RandomIterator_PATCH_NUMBER + * \brief The preprocessor macro \p RandomIterator_PATCH_NUMBER encodes the + * patch number of the RandomIterator library. + */ +#define RandomIterator_PATCH_NUMBER 0 + + + +// Declare these namespaces here for the purpose of Doxygenating them + +/*! + * \brief \p random_iterator is the top-level namespace which contains all RandomIterator + * functions and types. + */ +namespace random_iterator{ } + + diff --git a/corsika/detail/framework/random/random_iterator/Stream.hpp b/corsika/detail/framework/random/random_iterator/Stream.hpp new file mode 100644 index 0000000000000000000000000000000000000000..9fb36c846d1ecd5a7668643adfa44e18a4c710e3 --- /dev/null +++ b/corsika/detail/framework/random/random_iterator/Stream.hpp @@ -0,0 +1,313 @@ +/*---------------------------------------------------------------------------- + * + * Copyright (C) 2021 Antonio Augusto Alves Junior + * + * This file is part of RandomIterator. + * + * RandomIterator is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * RandomIterator is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with RandomIterator. If not, see <http://www.gnu.org/licenses/>. + * + *---------------------------------------------------------------------------*/ +/* + * Stream.hpp + * + * Created on: 23/02/2021 + * Author: Antonio Augusto Alves Junior + */ + +#pragma once + +#include <stdint.h> + +#include "detail/tbb/iterators.h" +#include "detail/Engine.hpp" +#include "detail/functors/EngineCaller.hpp" + +namespace random_iterator { + + +/// philox engine +typedef detail::philox philox; +/// threefry engine +typedef detail::threefry threefry; +/// squares3_128 engine +typedef detail::squares3_128 squares3_128; +/// squares4_128 engine +typedef detail::squares4_128 squares4_128; +/// squares3_64 engine +typedef detail::squares3_64 squares3_64; +/// squares4_64 engine +typedef detail::squares4_64 squares4_64; + +#if RANDOM_ITERATOR_R123_USE_AES_NI +/// ars engine +typedef detail::ars ars; +#endif + + +/** + * \class Stream + * + * \brief representation for streams of pseudorandom numbers + * + * Objects of this class represent collections of up to \f$ {2}^{32} \f$ streams of random numbers for each seed. Each of such streams + * has a length of \f$ {2}^{64} \f$. If the chosen distribution generates data with 64bits, like ``double``, then + * each stream can handle up to 128 ExaByte of data. Stream objects are thread-safe and lazy-evaluated. Output is produced + * only when requested. It is user responsibility to retrieve and store, if needed, the generated output. + * + * \tparam DistibutionType STL compliant distribution type. For example: ```std::uniform_real_distribution```, ```std::exponential_distribution```. + * + * \tparam EngineType RNG type. + * + * There are seven options: + * + * * random_iterator::philox + * * random_iterator::threefry + * * random_iterator::ars + * * random_iterator::squares3_128 + * * random_iterator::squares4_128 + * * random_iterator::squares3_64 + * * random_iterator::squares4_64 + * + * Usage: + * + * 1) Direct class instantiation: + * + * \code + * \\this code will print the 10 doubles randomly distributed in the range [0.0, 1.0]. + * + * \\instantiate real uniform distribution from C++ standard libray + * std::uniform_real_distribution<double> udist(0.0, 1.0); + * + * \\ + * Stream<std::uniform_real_distribution<double>, random_iterator::philox> uniform_stream(udist, 0x1a2b3c4d, 1 ); + * + * for( size_t i=0; i<10; ++i ) + * std::cout << uniform_stream[i] << std::endl; + * \endcode + * + * 2) Using ```random_iterator::make_stream(...)```: + * + * \code + * \\this code will print the 10 doubles randomly distributed in the range [0.0, 1.0]. + * + * \\instantiate real uniform distribution from C++ standard libray + * std::uniform_real_distribution<double> udist(0.0, 1.0); + * + * \\instantiate the generator + * random_iterator::philox rng(0x1a2b3c4d); + * + * \\create stream + * auto uniform_stream = random_iterator::make_stream(udist, rng, 1 ); + * + * for( size_t i=0; i<10; ++i ) + * std::cout << uniform_stream[i] << std::endl; + * \endcode + */ +template<typename DistibutionType, typename EngineType> +class Stream +{ + typedef detail::EngineCaller<DistibutionType,EngineType> caller_type;//! + typedef random_iterator_tbb::counting_iterator<typename EngineType::advance_type> counting_iterator;//! + +public: + + typedef EngineType engine_type; //! Engine type + typedef typename engine_type::state_type state_type;//! Type of RNG state + typedef typename engine_type::seed_type seed_type;//! Type of RNG seed + typedef typename engine_type::advance_type advance_type;//! Type of RNG displacement + typedef typename engine_type::init_type init_type;//! Type of RNG initializer + + typedef DistibutionType distribution_type; //! type of the STL compliant distribution + typedef typename distribution_type::result_type result_type;//! type of the result + + typedef random_iterator_tbb::transform_iterator< caller_type, counting_iterator> iterator;//! type of stream iterator + + Stream()=delete; + + /** + * Constructor. + * + * @param distribution Distribution with stl compliant interface. + * @param seed Seed for pseudorandom number generation. + * @param stream Pseudorandom number stream. + */ + Stream(distribution_type const& distribution, seed_type seed, uint32_t stream=0): + distribution_(distribution), + engine_(seed, stream), + seed_(seed), + stream_(stream) + {} + + /** + * Copy constructor + * + * @param other + */ + Stream( Stream<DistibutionType,EngineType> const& other ): + distribution_(other.getDistribution()), + engine_(other.getEngine()), + seed_(other.getSeed()), + stream_(other.getStream()) + {} + + /** + * Returns an iterator to the first element of the stream. + * @return iterator to the first element of the stream. + */ + inline iterator begin() const{ + + counting_iterator first( 0); + caller_type caller(distribution_, seed_, stream_ ); + + return iterator(first, caller); + } + + /** + * Returns an iterator to the past last element of the stream. + * @return iterator to the past last element of the stream. + */ + inline iterator end() const{ + + counting_iterator last(std::numeric_limits<advance_type>::max()); + caller_type caller(distribution_, seed_, stream_ ); + + return iterator(last, caller) ; + } + + /** + * Returns the element at specified location n. No bounds checking is performed. + * + * @param n position in the sequence. + * @return element at location n + */ + inline result_type operator[](advance_type n) const{ + + caller_type caller(distribution_, seed_, stream_ ); + + return caller(n); + } + + /** + * At each call, this function will produce a pseudorandom number and advance the engine state. + * + * @return pseudorandom number distributed according with `DistributionType` + */ + inline result_type operator()(void){ + + return distribution_(engine_); + } + + /** + * Get the distribution + * + * @return Copy of the object's distribution. + */ + inline distribution_type getDistribution() const { + return distribution_; + } + + /** + * Set the distribution + * @param dist + * + */ + inline void setDistribution(distribution_type dist) { + distribution_ = dist; + } + + /** + * Get the associated engine + * + * @return Copy of the object's engine + */ + inline engine_type getEngine() const { + return engine_; + } + + /** + * Set the object's engine + * + * @param engine + */ + inline void setEngine(engine_type engine) { + engine_ = engine; + } + + /** + * Get the seed + * + * @return Copy of the object's seed + */ + inline const seed_type& getSeed() const { + return seed_; + } + + /** + * Set the seed + * + * @param seed + */ + inline void setSeed(const seed_type& seed) { + seed_ = seed; + } + + /** + * Get the object's stream number + * + * @return stream number + */ + inline uint32_t getStream() const { + return stream_; + } + + /** + * Set the object's stream number + * + * @param stream + */ + inline void setStream(uint32_t stream) { + stream_ = stream; + } + + friend inline std::ostream& operator<<(std::ostream& os, const Stream<DistibutionType, EngineType>& be){ + return os << "engine: " << be.getEngine() + << " stream: "<< be.getStream() + << " distribution: " << be.getDistribution() ; + } +private: + + distribution_type distribution_; + engine_type engine_; + seed_type seed_; + uint32_t stream_; + +}; + +/** + * Stream + * + * @param dist STL compliant distribution instance. + * @param eng Engine instance + * @param stream Stream number, in the range [0, 2^{32} - 1] + * @return Stream object. + */ +template<typename DistibutionType, typename EngineType> +Stream<DistibutionType, EngineType> +make_stream( DistibutionType const& dist, EngineType eng, uint32_t stream ){ + + return Stream<DistibutionType, EngineType>( dist, eng.getSeed(), stream); +} + + +} // namespace random_iterator diff --git a/corsika/detail/framework/random/random_iterator/detail/Engine.hpp b/corsika/detail/framework/random/random_iterator/detail/Engine.hpp new file mode 100644 index 0000000000000000000000000000000000000000..b8f3e0f0a667fc75d678c72d9bc2583da2f93a70 --- /dev/null +++ b/corsika/detail/framework/random/random_iterator/detail/Engine.hpp @@ -0,0 +1,250 @@ +/*---------------------------------------------------------------------------- + * + * Copyright (C) 2021 Antonio Augusto Alves Junior + * + * This file is part of RandomIterator. + * + * RandomIterator is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * RandomIterator is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with RandomIterator. If not, see <http://www.gnu.org/licenses/>. + * + *---------------------------------------------------------------------------*/ + +/* + * Engine.hpp + * + * Created on: 22 de fev. de 2021 + * Author: Antonio Augusto Alves Junior + */ + +#pragma once + +#include <limits> + +#include "EngineTraits.hpp" +#include "SplitMix.hpp" +#include "Squares3_128.hpp" +#include "Squares4_128.hpp" +#include "Squares3_64.hpp" +#include "Squares4_64.hpp" + +namespace random_iterator { + +namespace detail { + + + + + +template<typename Engine123> +class Engine{ + + typedef unsigned trigger_type; + +public: + + typedef Engine123 engine_type; + typedef typename detail::random_traits<engine_type>::state_type state_type; + typedef typename detail::random_traits<engine_type>::seed_type seed_type; + typedef typename detail::random_traits<engine_type>::advance_type advance_type; + typedef typename detail::random_traits<engine_type>::init_type init_type; + typedef typename detail::random_traits<engine_type>::result_type result_type; + + static const unsigned arity = detail::random_traits<engine_type>::arity; + + Engine()=delete; + + Engine(result_type seed): + engine_(engine_type{}), + cache_(state_type{}), + state_(state_type{}), + seed_(seed_type{}), + trigger_(arity) + { + init_type temp{{}}; + + for(unsigned i=0; i< temp.size(); ++i){ + temp[i]=detail::splitmix<result_type>(seed); + } + + seed_ = temp; + } + + Engine(result_type seed, uint32_t stream ): + engine_(engine_type{}), + cache_(state_type{}), + state_(state_type{}), + seed_(seed_type{}), + trigger_(arity) + { + init_type temp{{}}; + + for(unsigned i=0; i< temp.size(); ++i){ + temp[i]=detail::splitmix<result_type>(seed); + } + + state_[arity-1] = stream; + state_[arity-1] = state_[arity-1] << 32; + + seed_ = temp; + } + + Engine(init_type seed): + engine_(engine_type{}), + cache_(state_type{}), + state_(state_type{}), + seed_(seed), + trigger_(arity) + {} + + + Engine(init_type seed , uint32_t stream): + engine_(engine_type{}), + cache_(state_type{}), + state_(state_type{}), + seed_(seed), + trigger_(arity) + { + state_[arity-1] = stream; + state_[arity-1] << 32; + + } + + Engine( Engine<Engine123> const& other): + engine_(engine_type{} ), + cache_(other.getCache()), + state_(other.getState()), + seed_(other.getSeed() ), + trigger_(other.getTrigger()) + {} + + inline Engine<Engine123>& + operator=( Engine<Engine123> const& other) + { + + if(this==&other) return *this; + + engine_ = engine_type{}; + cache_ = other.getCache(); + state_ = other.getState(); + seed_ = other.getSeed(); + trigger_ = other.getTrigger(); + return *this; + } + + inline result_type operator()(void) + { + result_type result = 0; + + if(trigger_==arity){ + + trigger_=0; + cache_ = engine_(state_.incr(), seed_); + result = cache_[trigger_]; + ++trigger_; + } + else { + result = cache_[trigger_]; + ++trigger_; + } + + return result; + } + + inline void discard( advance_type n){ + + state_.incr(n); + trigger_=arity; + } + + inline void reset(void) { + trigger_ = arity; + state_ = state_type{}; + cache_ = state_type{}; + } + + inline const seed_type& getSeed() const { + return seed_; + } + + inline void setSeed(seed_type seed) { + seed_ = seed; + } + + inline void setSeed(result_type seed) { + + init_type temp{{}}; + for(unsigned i=0; i< temp.size(); ++i){ + temp[i]=detail::splitmix<result_type>(seed); + } + seed_ = temp; + } + + inline const state_type& getState() const { + return state_; + } + + inline void setState(const state_type& state) { + state_ = state; + } + + inline trigger_type getTrigger() const { + return trigger_; + } + + inline void setTrigger(trigger_type trigger) { + trigger_ = trigger; + } + static constexpr result_type min() { return 0;} + + static constexpr result_type max() { return std::numeric_limits<result_type>::max(); } + + + friend inline std::ostream& operator<<(std::ostream& os, const Engine<Engine123>& be){ + return os << "state: " << be.getState() + << " seed: " << be.getSeed() + << " trigger: " << be.getTrigger(); + } + + + +private: + + inline state_type getCache() const { + return cache_; + } + + + + engine_type engine_; + state_type cache_; + state_type state_; + seed_type seed_; + trigger_type trigger_; +}; + +typedef Engine<random_iterator_r123::Philox2x64> philox; +typedef Engine<random_iterator_r123::Threefry2x64> threefry; +typedef detail::Squares3_64 squares3_64; +typedef detail::Squares4_64 squares4_64; +typedef detail::Squares3_128 squares3_128; +typedef detail::Squares4_128 squares4_128; + +#if RANDOM_ITERATOR_R123_USE_AES_NI +typedef Engine<random_iterator_r123::ARS2x64> ars; +#endif + +} // namespace detail + +} // namespace random_iterator + + diff --git a/corsika/detail/framework/random/random_iterator/detail/EngineTraits.hpp b/corsika/detail/framework/random/random_iterator/detail/EngineTraits.hpp new file mode 100644 index 0000000000000000000000000000000000000000..4c285fcebbf1917e099db69b2b9cc1842fce2d24 --- /dev/null +++ b/corsika/detail/framework/random/random_iterator/detail/EngineTraits.hpp @@ -0,0 +1,128 @@ +/*---------------------------------------------------------------------------- + * + * Copyright (C) 2021 Antonio Augusto Alves Junior + * + * This file is part of RandomIterator. + * + * RandomIterator is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * RandomIterator is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with RandomIterator. If not, see <http://www.gnu.org/licenses/>. + * + *---------------------------------------------------------------------------*/ + +/* + * EngineTraits.hpp + * + * Created on: 23 de fev. de 2021 + * Author: Antonio Augusto Alves Junior + */ + +#pragma once + +#include <stdint.h> +#include "Random123/array.h" +#include "Random123/philox.h" +#include "Random123/threefry.h" +#include "Random123/ars.h" +#include "Random123/ReinterpretCtr.hpp" + + +namespace random_iterator { + +namespace detail { + + +template<typename Engine> +struct random_traits; +/* + * random_traits<T>::state_type { counter, state} + * random_traits<T>::advance_type; + * random_traits<T>::init_type; + * random_traits<T>::result_type; + */ + +//philox +template<> struct random_traits<random_iterator_r123::Philox2x64> +{ + typedef typename random_iterator_r123::Philox2x64::ctr_type state_type; + typedef typename random_iterator_r123::Philox2x64::key_type seed_type; + typedef typename random_iterator_r123::Philox2x64::ukey_type init_type; + typedef uint64_t advance_type; + typedef state_type::value_type result_type; + + enum{arity=2}; +}; + +template<> struct random_traits<random_iterator_r123::Philox4x64> +{ + typedef typename random_iterator_r123::Philox4x64::ctr_type state_type; + typedef typename random_iterator_r123::Philox4x64::key_type seed_type; + typedef typename random_iterator_r123::Philox4x64::ukey_type init_type; + typedef uint64_t advance_type; + typedef state_type::value_type result_type; + + enum{arity=4}; +}; +// +template<> struct random_traits<random_iterator_r123::Threefry2x64> +{ + typedef typename random_iterator_r123::Threefry2x64::ctr_type state_type; + typedef typename random_iterator_r123::Threefry2x64::key_type seed_type; + typedef typename random_iterator_r123::Threefry2x64::ukey_type init_type; + typedef uint64_t advance_type; + typedef state_type::value_type result_type; + + enum{arity=2}; +}; + +// +template<> struct random_traits<random_iterator_r123::Threefry4x64> +{ + typedef typename random_iterator_r123::Threefry4x64::ctr_type state_type; + typedef typename random_iterator_r123::Threefry4x64::key_type seed_type; + typedef typename random_iterator_r123::Threefry4x64::ukey_type init_type; + typedef uint64_t advance_type; + typedef state_type::value_type result_type; + + enum{arity=4}; +}; + + +#if RANDOM_ITERATOR_R123_USE_AES_NI +template<> struct random_traits<random_iterator_r123::ARS4x32> +{ + typedef typename random_iterator_r123::ARS4x32::ctr_type state_type; + typedef typename random_iterator_r123::ARS4x32::key_type seed_type; + typedef typename random_iterator_r123::ARS4x32::ukey_type init_type; + typedef uint64_t advance_type; + typedef state_type::value_type result_type; + + enum{arity=4}; +}; + +template<> struct random_traits<random_iterator_r123::ARS2x64> +{ + typedef typename random_iterator_r123::ARS2x64::ctr_type state_type; + typedef typename random_iterator_r123::ARS2x64::key_type seed_type; + typedef typename random_iterator_r123::ARS2x64::ukey_type init_type; + typedef uint64_t advance_type; + typedef state_type::value_type result_type; + + enum{arity=2}; +}; + + +#endif + +} // namespace detail + +} // namespace random_iterator diff --git a/corsika/detail/framework/random/random_iterator/detail/Macros.h b/corsika/detail/framework/random/random_iterator/detail/Macros.h new file mode 100644 index 0000000000000000000000000000000000000000..b71a11370f179e7e6dba58d2372dedc36b59dfe2 --- /dev/null +++ b/corsika/detail/framework/random/random_iterator/detail/Macros.h @@ -0,0 +1,68 @@ +/*---------------------------------------------------------------------------- + * + * Copyright (C) 2021 Antonio Augusto Alves Junior + * + * This file is part of RandomIterator. + * + * RandomIterator is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * RandomIterator is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with RandomIterator. If not, see <http://www.gnu.org/licenses/>. + * + *---------------------------------------------------------------------------*/ +/* + * Macros.h + * + * Created on: 04/03/2021 + * Author: Antonio Augusto Alves Junior + */ + +#pragma once + +#if defined(__has_builtin) + //__has_builtin(__builtin_expect) + #if __has_builtin(__builtin_expect) + #define _LIKELY_(x) __builtin_expect(x, 1) + #define _UNLIKELY_(x) __builtin_expect(x, 0) + #else + #define _LIKELY_(x) x + #define _UNLIKELY_(x) x + #endif //__has_builtin(__builtin_expect) +#else + #define _LIKELY_(x) x + #define _UNLIKELY_(x) x +#endif //defined(__has_builtin) + + +//detect endianess +#if defined(__BYTE_ORDER) && __BYTE_ORDER == __BIG_ENDIAN || \ + defined(__BIG_ENDIAN__) || \ + defined(__ARMEB__) || \ + defined(__THUMBEB__) || \ + defined(__AARCH64EB__) || \ + defined(_MIBSEB) || defined(__MIBSEB) || defined(__MIBSEB__) +#ifndef __BIG_ENDIAN__ +#define __BIG_ENDIAN__ +#endif +#elif defined(__BYTE_ORDER) && __BYTE_ORDER == __LITTLE_ENDIAN || \ + defined(__LITTLE_ENDIAN__) || \ + defined(__ARMEL__) || \ + defined(__THUMBEL__) || \ + defined(__AARCH64EL__) || \ + defined(_MIPSEL) || defined(__MIPSEL) || defined(__MIPSEL__) || \ + defined(_WIN32) || defined(__i386__) || defined(__x86_64__) || \ + defined(_X86_) || defined(_IA64_) +#ifndef __LITTLE_ENDIAN__ +#define __LITTLE_ENDIAN__ +#endif +#else +#error "I don't know what architecture this is!" +#endif diff --git a/corsika/detail/framework/random/random_iterator/detail/Random123/MicroURNG.hpp b/corsika/detail/framework/random/random_iterator/detail/Random123/MicroURNG.hpp new file mode 100644 index 0000000000000000000000000000000000000000..e49cb71c8b98c790f5bbb5f07caecdfd7990528f --- /dev/null +++ b/corsika/detail/framework/random/random_iterator/detail/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 random_iterator_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; + + RANDOM_ITERATOR_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 RANDOM_ITERATOR_R123_CONSTEXPR result_type min RANDOM_ITERATOR_R123_NO_MACRO_SUBST () { return _Min; } + static RANDOM_ITERATOR_R123_CONSTEXPR result_type max RANDOM_ITERATOR_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; + RANDOM_ITERATOR_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 RANDOM_ITERATOR_R123_NO_MACRO_SUBST ())>>BITS; + if((r&mask) != r) + throw std::runtime_error("MicroURNG: c0, does not have high bits clear"); + } +}; +} // namespace random_iterator_r123 +#endif diff --git a/corsika/detail/framework/random/random_iterator/detail/Random123/ReinterpretCtr.hpp b/corsika/detail/framework/random/random_iterator/detail/Random123/ReinterpretCtr.hpp new file mode 100644 index 0000000000000000000000000000000000000000..9b4921fe24b2384d2fedde9575064dd7d3fd6655 --- /dev/null +++ b/corsika/detail/framework/random/random_iterator/detail/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 random_iterator_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; + RANDOM_ITERATOR_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 random_iterator_r123 +#endif diff --git a/corsika/detail/framework/random/random_iterator/detail/Random123/aes.h b/corsika/detail/framework/random/random_iterator/detail/Random123/aes.h new file mode 100644 index 0000000000000000000000000000000000000000..4d7c839e333397d857a8db438a910878ffa0af9e --- /dev/null +++ b/corsika/detail/framework/random/random_iterator/detail/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 RANDOM_ITERATOR_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 */ +RANDOM_ITERATOR_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; +} + +RANDOM_ITERATOR_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 */ +RANDOM_ITERATOR_R123_STATIC_INLINE aesni1xm128i_key_t aesni1xm128ikeyinit(aesni1xm128i_ukey_t uk){ + aesni1xm128i_key_t ret; + aesni1xm128iexpand(uk, ret.k); + return ret; +} +#endif + +/** @ingroup AESNI */ +RANDOM_ITERATOR_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 */ +RANDOM_ITERATOR_R123_STATIC_INLINE aesni1xm128i_ctr_t aesni1xm128i_R(unsigned R, aesni1xm128i_ctr_t in, aesni1xm128i_key_t k){ + RANDOM_ITERATOR_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 */ +RANDOM_ITERATOR_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 **/ +RANDOM_ITERATOR_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 random_iterator_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 RANDOM_ITERATOR_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{ + RANDOM_ITERATOR_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{ + RANDOM_ITERATOR_R123_STATIC_ASSERT(ROUNDS==10, "AESNI4x32_R<R> is only valid with R=10"); +}; +} // namespace random_iterator_r123 +#endif /* __cplusplus */ + +#endif /* RANDOM_ITERATOR_R123_USE_AES_NI */ + +#if RANDOM_ITERATOR_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; +RANDOM_ITERATOR_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 + +RANDOM_ITERATOR_R123_STATIC_INLINE RANDOM_ITERATOR_R123_FORCE_INLINE(aesopenssl16x8_ctr_t aesopenssl16x8_R(aesopenssl16x8_ctr_t ctr, aesopenssl16x8_key_t key)); +RANDOM_ITERATOR_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 random_iterator_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 random_iterator_r123 +#endif /* __cplusplus */ +#endif /* RANDOM_ITERATOR_R123_USE_AES_OPENSSL */ + +#endif diff --git a/corsika/detail/framework/random/random_iterator/detail/Random123/array.h b/corsika/detail/framework/random/random_iterator/detail/Random123/array.h new file mode 100644 index 0000000000000000000000000000000000000000..4f4443ad85caf5d73d9c76acc7d37909dfb5011b --- /dev/null +++ b/corsika/detail/framework/random/random_iterator/detail/Random123/array.h @@ -0,0 +1,348 @@ +/* +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 RANDOM_ITERATOR_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; \ + RANDOM_ITERATOR_R123_CUDA_DEVICE reverse_iterator rbegin(){ return reverse_iterator(end()); } \ + RANDOM_ITERATOR_R123_CUDA_DEVICE const_reverse_iterator rbegin() const{ return const_reverse_iterator(end()); } \ + RANDOM_ITERATOR_R123_CUDA_DEVICE reverse_iterator rend(){ return reverse_iterator(begin()); } \ + RANDOM_ITERATOR_R123_CUDA_DEVICE const_reverse_iterator rend() const{ return const_reverse_iterator(begin()); } \ + RANDOM_ITERATOR_R123_CUDA_DEVICE const_reverse_iterator crbegin() const{ return const_reverse_iterator(cend()); } \ + RANDOM_ITERATOR_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}; \ + RANDOM_ITERATOR_R123_CUDA_DEVICE reference operator[](size_type i){return v[i];} \ + RANDOM_ITERATOR_R123_CUDA_DEVICE const_reference operator[](size_type i) const {return v[i];} \ + RANDOM_ITERATOR_R123_CUDA_DEVICE reference at(size_type i){ if(i >= _N) RANDOM_ITERATOR_R123_THROW(std::out_of_range("array index out of range")); return (*this)[i]; } \ + RANDOM_ITERATOR_R123_CUDA_DEVICE const_reference at(size_type i) const { if(i >= _N) RANDOM_ITERATOR_R123_THROW(std::out_of_range("array index out of range")); return (*this)[i]; } \ + RANDOM_ITERATOR_R123_CUDA_DEVICE size_type size() const { return _N; } \ + RANDOM_ITERATOR_R123_CUDA_DEVICE size_type max_size() const { return _N; } \ + RANDOM_ITERATOR_R123_CUDA_DEVICE bool empty() const { return _N==0; }; \ + RANDOM_ITERATOR_R123_CUDA_DEVICE iterator begin() { return &v[0]; } \ + RANDOM_ITERATOR_R123_CUDA_DEVICE iterator end() { return &v[_N]; } \ + RANDOM_ITERATOR_R123_CUDA_DEVICE const_iterator begin() const { return &v[0]; } \ + RANDOM_ITERATOR_R123_CUDA_DEVICE const_iterator end() const { return &v[_N]; } \ + RANDOM_ITERATOR_R123_CUDA_DEVICE const_iterator cbegin() const { return &v[0]; } \ + RANDOM_ITERATOR_R123_CUDA_DEVICE const_iterator cend() const { return &v[_N]; } \ + RANDOM_ITERATOR_R123_CUDA_DEVICE pointer data(){ return &v[0]; } \ + RANDOM_ITERATOR_R123_CUDA_DEVICE const_pointer data() const{ return &v[0]; } \ + RANDOM_ITERATOR_R123_CUDA_DEVICE reference front(){ return v[0]; } \ + RANDOM_ITERATOR_R123_CUDA_DEVICE const_reference front() const{ return v[0]; } \ + RANDOM_ITERATOR_R123_CUDA_DEVICE reference back(){ return v[_N-1]; } \ + RANDOM_ITERATOR_R123_CUDA_DEVICE const_reference back() const{ return v[_N-1]; } \ + RANDOM_ITERATOR_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; \ + } \ + RANDOM_ITERATOR_R123_CUDA_DEVICE bool operator!=(const r123array##_N##x##W& rhs) const{ return !(*this == rhs); } \ + /* CUDA3 does not have std::fill_n */ \ + RANDOM_ITERATOR_R123_CUDA_DEVICE void fill(const value_type& val){ for (size_t i = 0; i < _N; ++i) v[i] = val; } \ + RANDOM_ITERATOR_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; \ + } \ + } \ + RANDOM_ITERATOR_R123_CUDA_DEVICE r123array##_N##x##W& incr(RANDOM_ITERATOR_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 || RANDOM_ITERATOR_R123_BUILTIN_EXPECT(!!v[0], 1)) return *this; \ + }else{ \ + v[0] += n; \ + if(_N==1 || RANDOM_ITERATOR_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 || RANDOM_ITERATOR_R123_BUILTIN_EXPECT(!!v[_N>1?1:0], 1)) return *this; \ + ++v[_N>2?2:0]; \ + if(_N==3 || RANDOM_ITERATOR_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( RANDOM_ITERATOR_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> \ + RANDOM_ITERATOR_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: \ + RANDOM_ITERATOR_R123_CUDA_DEVICE r123array##_N##x##W& incr_carefully(RANDOM_ITERATOR_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 random_iterator_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) + + +_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 RANDOM_ITERATOR_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 + +_r123array_tpl(16, 8, uint8_t) /* r123array16x8 for ARSsw, AESsw */ + +#if RANDOM_ITERATOR_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 RANDOM_ITERATOR_R123_W(a) (8*sizeof(((a *)0)->v[0])) + +/** @namespace random_iterator_r123 + Most of the Random123 C++ API is contained in the r123 namespace. +*/ + +#endif + diff --git a/corsika/detail/framework/random/random_iterator/detail/Random123/ars.h b/corsika/detail/framework/random/random_iterator/detail/Random123/ars.h new file mode 100644 index 0000000000000000000000000000000000000000..015bf833ced8abcef982709c728cbe7dfecc03df --- /dev/null +++ b/corsika/detail/framework/random/random_iterator/detail/Random123/ars.h @@ -0,0 +1,239 @@ +/* +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 RANDOM_ITERATOR_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 */ +RANDOM_ITERATOR_R123_STATIC_INLINE ars1xm128i_key_t ars1xm128ikeyinit(ars1xm128i_ukey_t uk) { return uk; } +/** @ingroup AESNI */ +RANDOM_ITERATOR_R123_STATIC_INLINE ars1xm128i_ctr_t ars1xm128i_R(unsigned int Nrounds, ars1xm128i_ctr_t in, ars1xm128i_key_t k){ + __m128i kweyl = _mm_set_epi64x(RANDOM_ITERATOR_R123_64BIT(0xBB67AE8584CAA73B), /* sqrt(3) - 1.0 */ + RANDOM_ITERATOR_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; + RANDOM_ITERATOR_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; + +typedef struct r123array2x64 ars2x64_ctr_t; +/** @ingroup AESNI */ +typedef struct r123array2x64 ars2x64_key_t; +/** @ingroup AESNI */ +typedef struct r123array2x64 ars2x64_ukey_t; + +/** @ingroup AESNI */ +enum r123_enum_ars4x32 {ars4x32_rounds = ARS1xm128i_DEFAULT_ROUNDS}; +/** @ingroup AESNI */ +RANDOM_ITERATOR_R123_STATIC_INLINE ars4x32_key_t ars4x32keyinit(ars4x32_ukey_t uk) { return uk; } +/** @ingroup AESNI */ +RANDOM_ITERATOR_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 random_iterator_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 RANDOM_ITERATOR_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; + RANDOM_ITERATOR_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; + RANDOM_ITERATOR_R123_FORCE_INLINE(ctr_type operator()(ctr_type ctr, key_type key) const){ + return ars4x32_R(ROUNDS, ctr, key); + } + + +}; + +template<unsigned int ROUNDS> +struct ARS2x64_R{ + + typedef ars2x64_ctr_t ctr_type; + typedef ars2x64_key_t key_type; + typedef ars2x64_key_t ukey_type; + + static const unsigned int rounds=ROUNDS; + + RANDOM_ITERATOR_R123_FORCE_INLINE(ctr_type operator()(ctr_type ctr, key_type key) const){ + + ars4x32_ctr_t ctr_{ctr.v[0], ctr.v[0]>>32 , ctr.v[1], ctr.v[1]>>32}; + ars4x32_key_t key_{key.v[0], key.v[0]>>32 , key.v[1], key.v[1]>>32}; + ars4x32_ctr_t res_ = ars4x32_R(ROUNDS, ctr_, key_); + ctr_type res{{}}; + res.v[0] = (res.v[0] | res_[1])<<32; + res.v[0] = (res.v[0] | res_[0]); + res.v[1] = (res.v[1] | res_[3])<<32; + res.v[1] = (res.v[1] | res_[2]); + + return res; + } +}; +/** +@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; +typedef ARS2x64_R<ars4x32_rounds> ARS2x64; + +} // namespace random_iterator_r123 + +#endif /* __cplusplus */ + +#endif /* RANDOM_ITERATOR_R123_USE_AES_NI */ + +#endif diff --git a/corsika/detail/framework/random/random_iterator/detail/Random123/boxmuller.hpp b/corsika/detail/framework/random/random_iterator/detail/Random123/boxmuller.hpp new file mode 100644 index 0000000000000000000000000000000000000000..0c282cb8cafcd69d100341614900d275be3dc485 --- /dev/null +++ b/corsika/detail/framework/random/random_iterator/detail/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 random_iterator_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(RANDOM_ITERATOR_R123_NO_SINCOS) && defined(__APPLE__) +/* MacOS X 10.10.5 (2015) doesn't have sincosf */ +#define RANDOM_ITERATOR_R123_NO_SINCOS 1 +#endif + +#if RANDOM_ITERATOR_R123_NO_SINCOS /* enable this if sincos and sincosf are not in the math library */ +RANDOM_ITERATOR_R123_CUDA_DEVICE RANDOM_ITERATOR_R123_STATIC_INLINE void sincosf(float x, float *s, float *c) { + *s = sinf(x); + *c = cosf(x); +} + +RANDOM_ITERATOR_R123_CUDA_DEVICE RANDOM_ITERATOR_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 */ + +RANDOM_ITERATOR_R123_CUDA_DEVICE RANDOM_ITERATOR_R123_STATIC_INLINE void sincospif(float x, float *s, float *c){ + const float PIf = 3.1415926535897932f; + sincosf(PIf*x, s, c); +} + +RANDOM_ITERATOR_R123_CUDA_DEVICE RANDOM_ITERATOR_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 + */ +RANDOM_ITERATOR_R123_CUDA_DEVICE RANDOM_ITERATOR_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 + */ +RANDOM_ITERATOR_R123_CUDA_DEVICE RANDOM_ITERATOR_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 random_iterator_r123 + +#endif /* BOXMULLER_H__ */ diff --git a/corsika/detail/framework/random/random_iterator/detail/Random123/conventional/Engine.hpp b/corsika/detail/framework/random/random_iterator/detail/Random123/conventional/Engine.hpp new file mode 100644 index 0000000000000000000000000000000000000000..867d765f728afef461af0873e5bf3e93e5aeb673 --- /dev/null +++ b/corsika/detail/framework/random/random_iterator/detail/Random123/conventional/Engine.hpp @@ -0,0 +1,276 @@ +/* +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 RANDOM_ITERATOR_R123_USE_CXX11_TYPE_TRAITS +#include <type_traits> +#endif + +namespace random_iterator_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(); + } + + template <typename SeedSeq> + explicit Engine(SeedSeq &s +#if RANDOM_ITERATOR_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 RANDOM_ITERATOR_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 RANDOM_ITERATOR_R123_CONSTEXPR result_type min RANDOM_ITERATOR_R123_NO_MACRO_SUBST () { return _Min; } + static RANDOM_ITERATOR_R123_CONSTEXPR result_type max RANDOM_ITERATOR_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(RANDOM_ITERATOR_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 RANDOM_ITERATOR_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 random_iterator_r123 + +#endif diff --git a/corsika/detail/framework/random/random_iterator/detail/Random123/conventional/gsl_cbrng.h b/corsika/detail/framework/random/random_iterator/detail/Random123/conventional/gsl_cbrng.h new file mode 100644 index 0000000000000000000000000000000000000000..44457d002b0d40ec5319236f67bcd3ec2a3ce629 --- /dev/null +++ b/corsika/detail/framework/random/random_iterator/detail/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/corsika/detail/framework/random/random_iterator/detail/Random123/features/clangfeatures.h b/corsika/detail/framework/random/random_iterator/detail/Random123/features/clangfeatures.h new file mode 100644 index 0000000000000000000000000000000000000000..6fe7a572c86ad69f83eb60df1a5a6d10d4215fcd --- /dev/null +++ b/corsika/detail/framework/random/random_iterator/detail/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 RANDOM_ITERATOR_R123_USE_X86INTRIN_H +#if (defined(__x86_64__)||defined(__i386__)) +#define RANDOM_ITERATOR_R123_USE_X86INTRIN_H 1 +#else +#define RANDOM_ITERATOR_R123_USE_X86INTRIN_H 0 +#endif +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_CXX11_UNRESTRICTED_UNIONS +#define RANDOM_ITERATOR_R123_USE_CXX11_UNRESTRICTED_UNIONS __has_feature(cxx_unrestricted_unions) +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_CXX11_STATIC_ASSERT +#define RANDOM_ITERATOR_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 !RANDOM_ITERATOR_R123_USE_CXX11_STATIC_ASSERT && !defined(RANDOM_ITERATOR_R123_STATIC_ASSERT) +#define RANDOM_ITERATOR_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 RANDOM_ITERATOR_R123_USE_CXX11_CONSTEXPR +#define RANDOM_ITERATOR_R123_USE_CXX11_CONSTEXPR __has_feature(cxx_constexpr) +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_CXX11_EXPLICIT_CONVERSIONS +#define RANDOM_ITERATOR_R123_USE_CXX11_EXPLICIT_CONVERSIONS __has_feature(cxx_explicit_conversions) +#endif + +// With clang-3.0, the apparently simpler: +// #define RANDOM_ITERATOR_R123_USE_CXX11_RANDOM __has_include(<random>) +// dumps core. +#ifndef RANDOM_ITERATOR_R123_USE_CXX11_RANDOM +#if __cplusplus>=201103L && __has_include(<random>) +#define RANDOM_ITERATOR_R123_USE_CXX11_RANDOM 1 +#else +#define RANDOM_ITERATOR_R123_USE_CXX11_RANDOM 0 +#endif +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_CXX11_TYPE_TRAITS +#if __cplusplus>=201103L && __has_include(<type_traits>) +#define RANDOM_ITERATOR_R123_USE_CXX11_TYPE_TRAITS 1 +#else +#define RANDOM_ITERATOR_R123_USE_CXX11_TYPE_TRAITS 0 +#endif +#endif + +#include "gccfeatures.h" + +#endif diff --git a/corsika/detail/framework/random/random_iterator/detail/Random123/features/compilerfeatures.h b/corsika/detail/framework/random/random_iterator/detail/Random123/features/compilerfeatures.h new file mode 100644 index 0000000000000000000000000000000000000000..0648742cdd5d522375ee08dec325a06f59c27ac6 --- /dev/null +++ b/corsika/detail/framework/random/random_iterator/detail/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 RANDOM_ITERATOR_R123_USE_SOMETHING instead. + +Library users can override any value by defining the pp-symbol with a compiler option, +e.g., + + cc -DRANDOM_ITERATOR_R123_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 RANDOM_ITERATOR_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 RANDOM_ITERATOR_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>RANDOM_ITERATOR_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>RANDOM_ITERATOR_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>RANDOM_ITERATOR_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>RANDOM_ITERATOR_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>RANDOM_ITERATOR_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>RANDOM_ITERATOR_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>RANDOM_ITERATOR_R123_ULONG_LONG - which expands to a declaration of the longest available + unsigned integer. + +<li>RANDOM_ITERATOR_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>RANDOM_ITERATOR_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__) +#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 RANDOM_ITERATOR_R123_USE_CXX11 +#define RANDOM_ITERATOR_R123_USE_CXX11 (__cplusplus >= 201103L) +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_CXX11_UNRESTRICTED_UNIONS +#define RANDOM_ITERATOR_R123_USE_CXX11_UNRESTRICTED_UNIONS RANDOM_ITERATOR_R123_USE_CXX11 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_CXX11_STATIC_ASSERT +#define RANDOM_ITERATOR_R123_USE_CXX11_STATIC_ASSERT RANDOM_ITERATOR_R123_USE_CXX11 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_CXX11_CONSTEXPR +#define RANDOM_ITERATOR_R123_USE_CXX11_CONSTEXPR RANDOM_ITERATOR_R123_USE_CXX11 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_CXX11_EXPLICIT_CONVERSIONS +#define RANDOM_ITERATOR_R123_USE_CXX11_EXPLICIT_CONVERSIONS RANDOM_ITERATOR_R123_USE_CXX11 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_CXX11_RANDOM +#define RANDOM_ITERATOR_R123_USE_CXX11_RANDOM RANDOM_ITERATOR_R123_USE_CXX11 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_CXX11_TYPE_TRAITS +#define RANDOM_ITERATOR_R123_USE_CXX11_TYPE_TRAITS RANDOM_ITERATOR_R123_USE_CXX11 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_CXX11_LONG_LONG +#define RANDOM_ITERATOR_R123_USE_CXX11_LONG_LONG RANDOM_ITERATOR_R123_USE_CXX11 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_CXX11_STD_ARRAY +#define RANDOM_ITERATOR_R123_USE_CXX11_STD_ARRAY RANDOM_ITERATOR_R123_USE_CXX11 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_MULHILO64_C99 +#define RANDOM_ITERATOR_R123_USE_MULHILO64_C99 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_MULHILO64_MULHI_INTRIN +#define RANDOM_ITERATOR_R123_USE_MULHILO64_MULHI_INTRIN 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_MULHILO32_MULHI_INTRIN +#define RANDOM_ITERATOR_R123_USE_MULHILO32_MULHI_INTRIN 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_STATIC_ASSERT +#if RANDOM_ITERATOR_R123_USE_CXX11_STATIC_ASSERT +#define RANDOM_ITERATOR_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 RANDOM_ITERATOR_R123_STATIC_ASSERT(expr, msg) typedef char static_assertion[(!!(expr))*2-1] +#endif +#endif + +#ifndef RANDOM_ITERATOR_R123_CONSTEXPR +#if RANDOM_ITERATOR_R123_USE_CXX11_CONSTEXPR +#define RANDOM_ITERATOR_R123_CONSTEXPR constexpr +#else +#define RANDOM_ITERATOR_R123_CONSTEXPR +#endif +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_64BIT +#define RANDOM_ITERATOR_R123_USE_64BIT 1 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_PHILOX_64BIT +#define RANDOM_ITERATOR_R123_USE_PHILOX_64BIT (RANDOM_ITERATOR_R123_USE_64BIT && (RANDOM_ITERATOR_R123_USE_MULHILO64_ASM || RANDOM_ITERATOR_R123_USE_MULHILO64_MSVC_INTRIN || RANDOM_ITERATOR_R123_USE_MULHILO64_CUDA_INTRIN || RANDOM_ITERATOR_R123_USE_GNU_UINT128 || RANDOM_ITERATOR_R123_USE_MULHILO64_C99 || RANDOM_ITERATOR_R123_USE_MULHILO64_OPENCL_INTRIN || RANDOM_ITERATOR_R123_USE_MULHILO64_MULHI_INTRIN)) +#endif + +#ifndef RANDOM_ITERATOR_R123_ULONG_LONG +#if defined(__cplusplus) && !RANDOM_ITERATOR_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 RANDOM_ITERATOR_R123_ULONG_LONG uint64_t +#else +#define RANDOM_ITERATOR_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 RANDOM_ITERATOR_R123_64BIT +#define RANDOM_ITERATOR_R123_64BIT(x) UINT64_C(x) +#endif + +#ifndef RANDOM_ITERATOR_R123_THROW +#define RANDOM_ITERATOR_R123_THROW(x) throw (x) +#endif + +#ifndef RANDOM_ITERATOR_R123_METAL_THREAD_ADDRESS_SPACE +#define RANDOM_ITERATOR_R123_METAL_THREAD_ADDRESS_SPACE +#endif + +#ifndef RANDOM_ITERATOR_R123_METAL_CONSTANT_ADDRESS_SPACE +#define RANDOM_ITERATOR_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 RANDOM_ITERATOR_R123_NO_MACRO_SUBST + +/** \endcond */ diff --git a/corsika/detail/framework/random/random_iterator/detail/Random123/features/gccfeatures.h b/corsika/detail/framework/random/random_iterator/detail/Random123/features/gccfeatures.h new file mode 100644 index 0000000000000000000000000000000000000000..5fda36f60f32f509b74d8286027bc0a2c1d58b54 --- /dev/null +++ b/corsika/detail/framework/random/random_iterator/detail/Random123/features/gccfeatures.h @@ -0,0 +1,263 @@ +/* +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 RANDOM_ITERATOR_R123_GNUC_VERSION (__GNUC__*10000 + __GNUC_MINOR__*100 + __GNUC_PATCHLEVEL__) + +#if !defined(__x86_64__) && !defined(__i386__) && !defined(__powerpc__) && !defined(__arm__) && !defined(__aarch64__) +# 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 + +#ifdef __powerpc__ +#include <ppu_intrinsics.h> +#endif + +#ifndef RANDOM_ITERATOR_R123_STATIC_INLINE +#define RANDOM_ITERATOR_R123_STATIC_INLINE static __inline__ +#endif + +#ifndef RANDOM_ITERATOR_R123_FORCE_INLINE +#if RANDOM_ITERATOR_R123_GNUC_VERSION >= 40000 +#define RANDOM_ITERATOR_R123_FORCE_INLINE(decl) decl __attribute__((always_inline)) +#else +#define RANDOM_ITERATOR_R123_FORCE_INLINE(decl) decl +#endif +#endif + +#ifndef RANDOM_ITERATOR_R123_CUDA_DEVICE +#define RANDOM_ITERATOR_R123_CUDA_DEVICE +#endif + +#ifndef RANDOM_ITERATOR_R123_ASSERT +#include <assert.h> +#define RANDOM_ITERATOR_R123_ASSERT(x) assert(x) +#endif + +#ifndef RANDOM_ITERATOR_R123_BUILTIN_EXPECT +#define RANDOM_ITERATOR_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 || (RANDOM_ITERATOR_R123_GNUC_VERSION<40700 && 1/* defined(__GCC_EXPERIMENTAL_CXX0X__) */)) +#else +#define GNU_CXX11 (__cplusplus>=201103L || (RANDOM_ITERATOR_R123_GNUC_VERSION<40700 && 0/* defined(__GCC_EXPERIMENTAL_CXX0X__) */)) +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_CXX11_UNRESTRICTED_UNIONS +#define RANDOM_ITERATOR_R123_USE_CXX11_UNRESTRICTED_UNIONS ((RANDOM_ITERATOR_R123_GNUC_VERSION >= 40600) && GNU_CXX11) +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_CXX11_STATIC_ASSERT +#define RANDOM_ITERATOR_R123_USE_CXX11_STATIC_ASSERT ((RANDOM_ITERATOR_R123_GNUC_VERSION >= 40300) && GNU_CXX11) +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_CXX11_CONSTEXPR +#define RANDOM_ITERATOR_R123_USE_CXX11_CONSTEXPR ((RANDOM_ITERATOR_R123_GNUC_VERSION >= 40600) && GNU_CXX11) +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_CXX11_EXPLICIT_CONVERSIONS +#define RANDOM_ITERATOR_R123_USE_CXX11_EXPLICIT_CONVERSIONS ((RANDOM_ITERATOR_R123_GNUC_VERSION >= 40500) && GNU_CXX11) +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_CXX11_RANDOM +#define RANDOM_ITERATOR_R123_USE_CXX11_RANDOM ((RANDOM_ITERATOR_R123_GNUC_VERSION>=40500) && GNU_CXX11) +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_CXX11_TYPE_TRAITS +#define RANDOM_ITERATOR_R123_USE_CXX11_TYPE_TRAITS ((RANDOM_ITERATOR_R123_GNUC_VERSION>=40400) && GNU_CXX11) +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_AES_NI +#ifdef __AES__ +#define RANDOM_ITERATOR_R123_USE_AES_NI 1 +#else +#define RANDOM_ITERATOR_R123_USE_AES_NI 0 +#endif +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_SSE4_2 +#ifdef __SSE4_2__ +#define RANDOM_ITERATOR_R123_USE_SSE4_2 1 +#else +#define RANDOM_ITERATOR_R123_USE_SSE4_2 0 +#endif +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_SSE4_1 +#ifdef __SSE4_1__ +#define RANDOM_ITERATOR_R123_USE_SSE4_1 1 +#else +#define RANDOM_ITERATOR_R123_USE_SSE4_1 0 +#endif +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_SSE +/* There's no point in trying to compile SSE code in Random123 + unless SSE2 is available. */ +#ifdef __SSE2__ +#define RANDOM_ITERATOR_R123_USE_SSE 1 +#else +#define RANDOM_ITERATOR_R123_USE_SSE 0 +#endif +#endif + +#ifndef RANDOM_ITERATOR_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 + -DRANDOM_ITERATOR_R123_USE_AES_OPENSSL=1 and any necessary LDFLAGS or LDLIBS to + play with openssl */ +#define RANDOM_ITERATOR_R123_USE_AES_OPENSSL 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_GNU_UINT128 +#if defined(__x86_64__) || defined(__aarch64__) +#define RANDOM_ITERATOR_R123_USE_GNU_UINT128 1 +#else +#define RANDOM_ITERATOR_R123_USE_GNU_UINT128 0 +#endif +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_ASM_GNU +#if (defined(__x86_64__)||defined(__i386__)) +#define RANDOM_ITERATOR_R123_USE_ASM_GNU 1 +#else +#define RANDOM_ITERATOR_R123_USE_ASM_GNU 1 +#endif +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_CPUID_MSVC +#define RANDOM_ITERATOR_R123_USE_CPUID_MSVC 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_X86INTRIN_H +#if (defined(__x86_64__)||defined(__i386__)) +#define RANDOM_ITERATOR_R123_USE_X86INTRIN_H (1/* (defined(__x86_64__)||defined(__i386__)) */ && RANDOM_ITERATOR_R123_GNUC_VERSION >= 40402) +#else +#define RANDOM_ITERATOR_R123_USE_X86INTRIN_H (0/* (defined(__x86_64__)||defined(__i386__)) */ && RANDOM_ITERATOR_R123_GNUC_VERSION >= 40402) +#endif +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_IA32INTRIN_H +#define RANDOM_ITERATOR_R123_USE_IA32INTRIN_H 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_XMMINTRIN_H +#define RANDOM_ITERATOR_R123_USE_XMMINTRIN_H 0 +#endif + +#ifndef RANDOM_ITERATOR_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 -DRANDOM_ITERATOR_R123_USE_SSE=0. */ +#define RANDOM_ITERATOR_R123_USE_EMMINTRIN_H (RANDOM_ITERATOR_R123_USE_SSE && (RANDOM_ITERATOR_R123_GNUC_VERSION < 40402)) +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_SMMINTRIN_H +#define RANDOM_ITERATOR_R123_USE_SMMINTRIN_H ((RANDOM_ITERATOR_R123_USE_SSE4_1 || RANDOM_ITERATOR_R123_USE_SSE4_2) && (RANDOM_ITERATOR_R123_GNUC_VERSION < 40402)) +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_WMMINTRIN_H +#define RANDOM_ITERATOR_R123_USE_WMMINTRIN_H 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_INTRIN_H +#define RANDOM_ITERATOR_R123_USE_INTRIN_H 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_MULHILO32_ASM +#define RANDOM_ITERATOR_R123_USE_MULHILO32_ASM 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_MULHILO64_ASM +#define RANDOM_ITERATOR_R123_USE_MULHILO64_ASM 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_MULHILO64_MSVC_INTRIN +#define RANDOM_ITERATOR_R123_USE_MULHILO64_MSVC_INTRIN 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_MULHILO64_CUDA_INTRIN +#define RANDOM_ITERATOR_R123_USE_MULHILO64_CUDA_INTRIN 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_MULHILO64_OPENCL_INTRIN +#define RANDOM_ITERATOR_R123_USE_MULHILO64_OPENCL_INTRIN 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_MULHILO64_MULHI_INTRIN +#if (defined(__powerpc64__)) +#define RANDOM_ITERATOR_R123_USE_MULHILO64_MULHI_INTRIN 1 +#else +#define RANDOM_ITERATOR_R123_USE_MULHILO64_MULHI_INTRIN 0 +#endif +#endif + +#ifndef RANDOM_ITERATOR_R123_MULHILO64_MULHI_INTRIN +#define RANDOM_ITERATOR_R123_MULHILO64_MULHI_INTRIN __mulhdu +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_MULHILO32_MULHI_INTRIN +#define RANDOM_ITERATOR_R123_USE_MULHILO32_MULHI_INTRIN 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_MULHILO32_MULHI_INTRIN +#define RANDOM_ITERATOR_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/corsika/detail/framework/random/random_iterator/detail/Random123/features/iccfeatures.h b/corsika/detail/framework/random/random_iterator/detail/Random123/features/iccfeatures.h new file mode 100644 index 0000000000000000000000000000000000000000..d41f139ef482f788d86a187a3a4afa6bde067e53 --- /dev/null +++ b/corsika/detail/framework/random/random_iterator/detail/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 RANDOM_ITERATOR_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 RANDOM_ITERATOR_R123_STATIC_INLINE +#define RANDOM_ITERATOR_R123_STATIC_INLINE static inline +#endif + +#ifndef RANDOM_ITERATOR_R123_FORCE_INLINE +#define RANDOM_ITERATOR_R123_FORCE_INLINE(decl) decl __attribute__((always_inline)) +#endif + +#ifndef RANDOM_ITERATOR_R123_CUDA_DEVICE +#define RANDOM_ITERATOR_R123_CUDA_DEVICE +#endif + +#ifndef RANDOM_ITERATOR_R123_ASSERT +#include <assert.h> +#define RANDOM_ITERATOR_R123_ASSERT(x) assert(x) +#endif + +#ifndef RANDOM_ITERATOR_R123_BUILTIN_EXPECT +#define RANDOM_ITERATOR_R123_BUILTIN_EXPECT(expr,likely) __builtin_expect(expr,likely) +#endif + +// The basic idiom is: +// #ifndef RANDOM_ITERATOR_R123_SOMETHING +// #if some condition +// #define RANDOM_ITERATOR_R123_SOMETHING 1 +// #else +// #define RANDOM_ITERATOR_R123_SOMETHING 0 +// #endif +// #endif +// This idiom allows an external user to override any decision +// in this file with a command-line -DRANDOM_ITERATOR_R123_SOMETHING=1 or -DRANDOM_ITERATOR_R123_SOMETHINE=0 + +// An alternative idiom is: +// #ifndef RANDOM_ITERATOR_R123_SOMETHING +// #define RANDOM_ITERATOR_R123_SOMETHING (some boolean expression) +// #endif +// where the boolean expression might contain previously-defined RANDOM_ITERATOR_R123_SOMETHING_ELSE +// pp-symbols. + +#ifndef RANDOM_ITERATOR_R123_USE_SSE4_2 +#ifdef __SSE4_2__ +#define RANDOM_ITERATOR_R123_USE_SSE4_2 1 +#else +#define RANDOM_ITERATOR_R123_USE_SSE4_2 0 +#endif +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_SSE4_1 +#ifdef __SSE4_1__ +#define RANDOM_ITERATOR_R123_USE_SSE4_1 1 +#else +#define RANDOM_ITERATOR_R123_USE_SSE4_1 0 +#endif +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_SSE +#ifdef __SSE2__ +#define RANDOM_ITERATOR_R123_USE_SSE 1 +#else +#define RANDOM_ITERATOR_R123_USE_SSE 0 +#endif +#endif + +#ifndef RANDOM_ITERATOR_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 +// -DRANDOM_ITERATOR_R123_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 RANDOM_ITERATOR_R123_USE_AES_NI ((__ICC>=1101) && 1/*defined(__AES__)*/) +#else +#define RANDOM_ITERATOR_R123_USE_AES_NI ((__ICC>=1101) && 0/*defined(__AES__)*/) +#endif +#endif + +#ifndef RANDOM_ITERATOR_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 + -DRANDOM_ITERATOR_R123_USE_AES_OPENSSL=1 and any necessary LDFLAGS or LDLIBS to + play with openssl */ +#define RANDOM_ITERATOR_R123_USE_AES_OPENSSL 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_GNU_UINT128 +#define RANDOM_ITERATOR_R123_USE_GNU_UINT128 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_ASM_GNU +#define RANDOM_ITERATOR_R123_USE_ASM_GNU 1 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_CPUID_MSVC +#define RANDOM_ITERATOR_R123_USE_CPUID_MSVC 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_X86INTRIN_H +#define RANDOM_ITERATOR_R123_USE_X86INTRIN_H 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_IA32INTRIN_H +#define RANDOM_ITERATOR_R123_USE_IA32INTRIN_H 1 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_XMMINTRIN_H +#define RANDOM_ITERATOR_R123_USE_XMMINTRIN_H 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_EMMINTRIN_H +#define RANDOM_ITERATOR_R123_USE_EMMINTRIN_H 1 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_SMMINTRIN_H +#define RANDOM_ITERATOR_R123_USE_SMMINTRIN_H 1 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_WMMINTRIN_H +#define RANDOM_ITERATOR_R123_USE_WMMINTRIN_H 1 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_INTRIN_H +#define RANDOM_ITERATOR_R123_USE_INTRIN_H 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_MULHILO16_ASM +#define RANDOM_ITERATOR_R123_USE_MULHILO16_ASM 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_MULHILO32_ASM +#define RANDOM_ITERATOR_R123_USE_MULHILO32_ASM 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_MULHILO64_ASM +#define RANDOM_ITERATOR_R123_USE_MULHILO64_ASM 1 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_MULHILO64_MSVC_INTRIN +#define RANDOM_ITERATOR_R123_USE_MULHILO64_MSVC_INTRIN 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_MULHILO64_CUDA_INTRIN +#define RANDOM_ITERATOR_R123_USE_MULHILO64_CUDA_INTRIN 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_MULHILO64_OPENCL_INTRIN +#define RANDOM_ITERATOR_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/corsika/detail/framework/random/random_iterator/detail/Random123/features/metalfeatures.h b/corsika/detail/framework/random/random_iterator/detail/Random123/features/metalfeatures.h new file mode 100644 index 0000000000000000000000000000000000000000..d31e86b65d9fe4d15d69ea86069a9bcc9627be62 --- /dev/null +++ b/corsika/detail/framework/random/random_iterator/detail/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 RANDOM_ITERATOR_R123_STATIC_INLINE +#define RANDOM_ITERATOR_R123_STATIC_INLINE inline +#endif + +#ifndef RANDOM_ITERATOR_R123_FORCE_INLINE +#define RANDOM_ITERATOR_R123_FORCE_INLINE(decl) decl __attribute__((always_inline)) +#endif + +#ifndef RANDOM_ITERATOR_R123_CUDA_DEVICE +#define RANDOM_ITERATOR_R123_CUDA_DEVICE +#endif + +#ifndef RANDOM_ITERATOR_R123_METAL_THREAD_ADDRESS_SPACE +#define RANDOM_ITERATOR_R123_METAL_THREAD_ADDRESS_SPACE thread +#endif + +#ifndef RANDOM_ITERATOR_R123_METAL_CONSTANT_ADDRESS_SPACE +#define RANDOM_ITERATOR_R123_METAL_CONSTANT_ADDRESS_SPACE constant +#endif + +#ifndef RANDOM_ITERATOR_R123_ASSERT +#define RANDOM_ITERATOR_R123_ASSERT(x) +#endif + +#ifndef RANDOM_ITERATOR_R123_BUILTIN_EXPECT +#define RANDOM_ITERATOR_R123_BUILTIN_EXPECT(expr,likely) expr +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_GNU_UINT128 +#define RANDOM_ITERATOR_R123_USE_GNU_UINT128 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_MULHILO64_ASM +#define RANDOM_ITERATOR_R123_USE_MULHILO64_ASM 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_MULHILO64_MSVC_INTRIN +#define RANDOM_ITERATOR_R123_USE_MULHILO64_MSVC_INTRIN 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_MULHILO64_CUDA_INTRIN +#define RANDOM_ITERATOR_R123_USE_MULHILO64_CUDA_INTRIN 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_MULHILO64_OPENCL_INTRIN +#define RANDOM_ITERATOR_R123_USE_MULHILO64_OPENCL_INTRIN 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_MULHILO32_MULHI_INTRIN +#define RANDOM_ITERATOR_R123_USE_MULHILO32_MULHI_INTRIN 1 +#endif + +#if RANDOM_ITERATOR_R123_USE_MULHILO32_MULHI_INTRIN +#include <metal_integer> +#define RANDOM_ITERATOR_R123_MULHILO32_MULHI_INTRIN metal::mulhi +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_AES_NI +#define RANDOM_ITERATOR_R123_USE_AES_NI 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_64BIT +#define RANDOM_ITERATOR_R123_USE_64BIT 0 /* Metal currently (Feb 2019, Specification-2) does not support 64-bit variable types */ +#endif + +#ifndef RANDOM_ITERATOR_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 RANDOM_ITERATOR_R123_ULONG_LONG unsigned int +#endif + +#endif diff --git a/corsika/detail/framework/random/random_iterator/detail/Random123/features/msvcfeatures.h b/corsika/detail/framework/random/random_iterator/detail/Random123/features/msvcfeatures.h new file mode 100644 index 0000000000000000000000000000000000000000..894d578b3b076f55db5686e2a5cfb935979b08ab --- /dev/null +++ b/corsika/detail/framework/random/random_iterator/detail/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 RANDOM_ITERATOR_R123_STATIC_INLINE +#define RANDOM_ITERATOR_R123_STATIC_INLINE static __inline +#endif + +#ifndef RANDOM_ITERATOR_R123_FORCE_INLINE +#define RANDOM_ITERATOR_R123_FORCE_INLINE(decl) _forceinline decl +#endif + +#ifndef RANDOM_ITERATOR_R123_CUDA_DEVICE +#define RANDOM_ITERATOR_R123_CUDA_DEVICE +#endif + +#ifndef RANDOM_ITERATOR_R123_ASSERT +#include <assert.h> +#define RANDOM_ITERATOR_R123_ASSERT(x) assert(x) +#endif + +#ifndef RANDOM_ITERATOR_R123_BUILTIN_EXPECT +#define RANDOM_ITERATOR_R123_BUILTIN_EXPECT(expr,likely) expr +#endif + +// The basic idiom is: +// #ifndef RANDOM_ITERATOR_R123_SOMETHING +// #if some condition +// #define RANDOM_ITERATOR_R123_SOMETHING 1 +// #else +// #define RANDOM_ITERATOR_R123_SOMETHING 0 +// #endif +// #endif +// This idiom allows an external user to override any decision +// in this file with a command-line -DRANDOM_ITERATOR_R123_SOMETHING=1 or -DRANDOM_ITERATOR_R123_SOMETHINE=0 + +// An alternative idiom is: +// #ifndef RANDOM_ITERATOR_R123_SOMETHING +// #define RANDOM_ITERATOR_R123_SOMETHING (some boolean expression) +// #endif +// where the boolean expression might contain previously-defined RANDOM_ITERATOR_R123_SOMETHING_ELSE +// pp-symbols. + +#ifndef RANDOM_ITERATOR_R123_USE_AES_NI +#if defined(_M_X64) +#define RANDOM_ITERATOR_R123_USE_AES_NI 1 +#else +#define RANDOM_ITERATOR_R123_USE_AES_NI 0 +#endif +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_SSE4_2 +#if defined(_M_X64) +#define RANDOM_ITERATOR_R123_USE_SSE4_2 1 +#else +#define RANDOM_ITERATOR_R123_USE_SSE4_2 0 +#endif +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_SSE4_1 +#if defined(_M_X64) +#define RANDOM_ITERATOR_R123_USE_SSE4_1 1 +#else +#define RANDOM_ITERATOR_R123_USE_SSE4_1 0 +#endif +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_SSE +#define RANDOM_ITERATOR_R123_USE_SSE 1 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_AES_OPENSSL +#define RANDOM_ITERATOR_R123_USE_AES_OPENSSL 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_GNU_UINT128 +#define RANDOM_ITERATOR_R123_USE_GNU_UINT128 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_ASM_GNU +#define RANDOM_ITERATOR_R123_USE_ASM_GNU 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_CPUID_MSVC +#define RANDOM_ITERATOR_R123_USE_CPUID_MSVC 1 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_X86INTRIN_H +#define RANDOM_ITERATOR_R123_USE_X86INTRIN_H 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_IA32INTRIN_H +#define RANDOM_ITERATOR_R123_USE_IA32INTRIN_H 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_XMMINTRIN_H +#define RANDOM_ITERATOR_R123_USE_XMMINTRIN_H 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_EMMINTRIN_H +#define RANDOM_ITERATOR_R123_USE_EMMINTRIN_H 1 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_SMMINTRIN_H +#define RANDOM_ITERATOR_R123_USE_SMMINTRIN_H 1 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_WMMINTRIN_H +#define RANDOM_ITERATOR_R123_USE_WMMINTRIN_H 1 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_INTRIN_H +#define RANDOM_ITERATOR_R123_USE_INTRIN_H 1 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_MULHILO16_ASM +#define RANDOM_ITERATOR_R123_USE_MULHILO16_ASM 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_MULHILO32_ASM +#define RANDOM_ITERATOR_R123_USE_MULHILO32_ASM 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_MULHILO64_ASM +#define RANDOM_ITERATOR_R123_USE_MULHILO64_ASM 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_MULHILO64_MSVC_INTRIN +#if defined(_M_X64) +#define RANDOM_ITERATOR_R123_USE_MULHILO64_MSVC_INTRIN 1 +#else +#define RANDOM_ITERATOR_R123_USE_MULHILO64_MSVC_INTRIN 0 +#endif +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_MULHILO64_CUDA_INTRIN +#define RANDOM_ITERATOR_R123_USE_MULHILO64_CUDA_INTRIN 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_MULHILO64_OPENCL_INTRIN +#define RANDOM_ITERATOR_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/corsika/detail/framework/random/random_iterator/detail/Random123/features/nvccfeatures.h b/corsika/detail/framework/random/random_iterator/detail/Random123/features/nvccfeatures.h new file mode 100644 index 0000000000000000000000000000000000000000..cf5d3bcbf8e94c48151b6477960fe5862b07e446 --- /dev/null +++ b/corsika/detail/framework/random/random_iterator/detail/Random123/features/nvccfeatures.h @@ -0,0 +1,125 @@ +/* +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 RANDOM_ITERATOR_R123_CUDA_DEVICE +#define RANDOM_ITERATOR_R123_CUDA_DEVICE __device__ +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_MULHILO64_CUDA_INTRIN +#define RANDOM_ITERATOR_R123_USE_MULHILO64_CUDA_INTRIN 1 +#endif + +#ifndef RANDOM_ITERATOR_R123_THROW +// No exceptions in CUDA, at least upto 4.0 +#define RANDOM_ITERATOR_R123_THROW(x) RANDOM_ITERATOR_R123_ASSERT(0) +#endif + +#ifndef RANDOM_ITERATOR_R123_ASSERT +#define RANDOM_ITERATOR_R123_ASSERT(x) if((x)) ; else asm("trap;") +#endif + +#else // ! __CUDA_ARCH__ +// If we're using nvcc not compiling for the CUDA architecture, +// then we must be compiling for the host. In that case, +// tell the philox code to use the mulhilo64 asm because +// nvcc doesn't grok uint128_t. +#ifndef RANDOM_ITERATOR_R123_USE_MULHILO64_ASM +#define RANDOM_ITERATOR_R123_USE_MULHILO64_ASM 1 +#endif + +#endif // __CUDA_ARCH__ + +#ifndef RANDOM_ITERATOR_R123_BUILTIN_EXPECT +#define RANDOM_ITERATOR_R123_BUILTIN_EXPECT(expr,likely) expr +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_AES_NI +#define RANDOM_ITERATOR_R123_USE_AES_NI 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_SSE4_2 +#define RANDOM_ITERATOR_R123_USE_SSE4_2 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_SSE4_1 +#define RANDOM_ITERATOR_R123_USE_SSE4_1 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_SSE +#define RANDOM_ITERATOR_R123_USE_SSE 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_GNU_UINT128 +#define RANDOM_ITERATOR_R123_USE_GNU_UINT128 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_ULONG_LONG +// uint64_t, which is what we'd get without this, is +// not the same as unsigned long long +#define RANDOM_ITERATOR_R123_ULONG_LONG unsigned long long +#endif + +#if defined(__GNUC__) +#include "gccfeatures.h" +#elif defined(_MSC_FULL_VER) +#include "msvcfeatures.h" +#endif + +#endif diff --git a/corsika/detail/framework/random/random_iterator/detail/Random123/features/open64features.h b/corsika/detail/framework/random/random_iterator/detail/Random123/features/open64features.h new file mode 100644 index 0000000000000000000000000000000000000000..fc86f1aeff75087d3aa3418fb4de7278c75fef67 --- /dev/null +++ b/corsika/detail/framework/random/random_iterator/detail/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 RANDOM_ITERATOR_R123_USE_GNU_UINT128 +#define RANDOM_ITERATOR_R123_USE_GNU_UINT128 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_MULHILO64_ASM +#define RANDOM_ITERATOR_R123_USE_MULHILO64_ASM 1 +#endif + +#include "gccfeatures.h" + +#endif diff --git a/corsika/detail/framework/random/random_iterator/detail/Random123/features/openclfeatures.h b/corsika/detail/framework/random/random_iterator/detail/Random123/features/openclfeatures.h new file mode 100644 index 0000000000000000000000000000000000000000..81b8fec1124c7e2bbdbfe6dcdc0a4633aa98899f --- /dev/null +++ b/corsika/detail/framework/random/random_iterator/detail/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 RANDOM_ITERATOR_R123_STATIC_INLINE +#define RANDOM_ITERATOR_R123_STATIC_INLINE inline +#endif + +#ifndef RANDOM_ITERATOR_R123_FORCE_INLINE +#define RANDOM_ITERATOR_R123_FORCE_INLINE(decl) decl __attribute__((always_inline)) +#endif + +#ifndef RANDOM_ITERATOR_R123_CUDA_DEVICE +#define RANDOM_ITERATOR_R123_CUDA_DEVICE +#endif + +#ifndef RANDOM_ITERATOR_R123_ASSERT +#define RANDOM_ITERATOR_R123_ASSERT(x) +#endif + +#ifndef RANDOM_ITERATOR_R123_BUILTIN_EXPECT +#define RANDOM_ITERATOR_R123_BUILTIN_EXPECT(expr,likely) expr +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_GNU_UINT128 +#define RANDOM_ITERATOR_R123_USE_GNU_UINT128 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_MULHILO64_ASM +#define RANDOM_ITERATOR_R123_USE_MULHILO64_ASM 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_MULHILO64_MSVC_INTRIN +#define RANDOM_ITERATOR_R123_USE_MULHILO64_MSVC_INTRIN 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_MULHILO64_CUDA_INTRIN +#define RANDOM_ITERATOR_R123_USE_MULHILO64_CUDA_INTRIN 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_MULHILO64_OPENCL_INTRIN +#define RANDOM_ITERATOR_R123_USE_MULHILO64_OPENCL_INTRIN 1 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_AES_NI +#define RANDOM_ITERATOR_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 RANDOM_ITERATOR_R123_64T, RANDOM_ITERATOR_R123_32T, RANDOM_ITERATOR_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/corsika/detail/framework/random/random_iterator/detail/Random123/features/pgccfeatures.h b/corsika/detail/framework/random/random_iterator/detail/Random123/features/pgccfeatures.h new file mode 100644 index 0000000000000000000000000000000000000000..221c2ecc7b3694ce07fc7462e04472a5ae13cfec --- /dev/null +++ b/corsika/detail/framework/random/random_iterator/detail/Random123/features/pgccfeatures.h @@ -0,0 +1,194 @@ +/* +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 RANDOM_ITERATOR_R123_STATIC_INLINE +#define RANDOM_ITERATOR_R123_STATIC_INLINE static inline +#endif + +/* Found this example in PGI's emmintrin.h. */ +#ifndef RANDOM_ITERATOR_R123_FORCE_INLINE +#define RANDOM_ITERATOR_R123_FORCE_INLINE(decl) decl __attribute__((__always_inline__)) +#endif + +#ifndef RANDOM_ITERATOR_R123_CUDA_DEVICE +#define RANDOM_ITERATOR_R123_CUDA_DEVICE +#endif + +#ifndef RANDOM_ITERATOR_R123_ASSERT +#include <assert.h> +#define RANDOM_ITERATOR_R123_ASSERT(x) assert(x) +#endif + +#ifndef RANDOM_ITERATOR_R123_BUILTIN_EXPECT +#define RANDOM_ITERATOR_R123_BUILTIN_EXPECT(expr,likely) (expr) +#endif + +/* PGI through 13.2 doesn't appear to support AES-NI. */ +#ifndef RANDOM_ITERATOR_R123_USE_AES_NI +#define RANDOM_ITERATOR_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 RANDOM_ITERATOR_R123_USE_SSE4_2 +#define RANDOM_ITERATOR_R123_USE_SSE4_2 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_SSE4_1 +#define RANDOM_ITERATOR_R123_USE_SSE4_1 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_SSE +/* There's no point in trying to compile SSE code in Random123 + unless SSE2 is available. */ +#ifdef __SSE2__ +#define RANDOM_ITERATOR_R123_USE_SSE 1 +#else +#define RANDOM_ITERATOR_R123_USE_SSE 0 +#endif +#endif + +#ifndef RANDOM_ITERATOR_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 + -DRANDOM_ITERATOR_R123_USE_AES_OPENSSL=1 and any necessary LDFLAGS or LDLIBS to + play with openssl */ +#define RANDOM_ITERATOR_R123_USE_AES_OPENSSL 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_GNU_UINT128 +#define RANDOM_ITERATOR_R123_USE_GNU_UINT128 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_ASM_GNU +#define RANDOM_ITERATOR_R123_USE_ASM_GNU 1 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_CPUID_MSVC +#define RANDOM_ITERATOR_R123_USE_CPUID_MSVC 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_X86INTRIN_H +#define RANDOM_ITERATOR_R123_USE_X86INTRIN_H 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_IA32INTRIN_H +#define RANDOM_ITERATOR_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 RANDOM_ITERATOR_R123_USE_XMMINTRIN_H +#define RANDOM_ITERATOR_R123_USE_XMMINTRIN_H 1 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_EMMINTRIN_H +#define RANDOM_ITERATOR_R123_USE_EMMINTRIN_H 1 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_SMMINTRIN_H +#define RANDOM_ITERATOR_R123_USE_SMMINTRIN_H 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_WMMINTRIN_H +#define RANDOM_ITERATOR_R123_USE_WMMINTRIN_H 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_INTRIN_H +#ifdef __ABM__ +#define RANDOM_ITERATOR_R123_USE_INTRIN_H 1 +#else +#define RANDOM_ITERATOR_R123_USE_INTRIN_H 0 +#endif +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_MULHILO32_ASM +#define RANDOM_ITERATOR_R123_USE_MULHILO32_ASM 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_MULHILO64_MULHI_INTRIN +#define RANDOM_ITERATOR_R123_USE_MULHILO64_MULHI_INTRIN 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_MULHILO64_ASM +#define RANDOM_ITERATOR_R123_USE_MULHILO64_ASM 1 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_MULHILO64_MSVC_INTRIN +#define RANDOM_ITERATOR_R123_USE_MULHILO64_MSVC_INTRIN 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_MULHILO64_CUDA_INTRIN +#define RANDOM_ITERATOR_R123_USE_MULHILO64_CUDA_INTRIN 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_MULHILO64_OPENCL_INTRIN +#define RANDOM_ITERATOR_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/corsika/detail/framework/random/random_iterator/detail/Random123/features/sse.h b/corsika/detail/framework/random/random_iterator/detail/Random123/features/sse.h new file mode 100644 index 0000000000000000000000000000000000000000..1de01ca61fbb22832f458b8dc3455250c62d4cea --- /dev/null +++ b/corsika/detail/framework/random/random_iterator/detail/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 RANDOM_ITERATOR_R123_USE_SSE + +#if RANDOM_ITERATOR_R123_USE_X86INTRIN_H +#include <x86intrin.h> +#endif +#if RANDOM_ITERATOR_R123_USE_IA32INTRIN_H +#include <ia32intrin.h> +#endif +#if RANDOM_ITERATOR_R123_USE_XMMINTRIN_H +#include <xmmintrin.h> +#endif +#if RANDOM_ITERATOR_R123_USE_EMMINTRIN_H +#include <emmintrin.h> +#endif +#if RANDOM_ITERATOR_R123_USE_SMMINTRIN_H +#include <smmintrin.h> +#endif +#if RANDOM_ITERATOR_R123_USE_WMMINTRIN_H +#include <wmmintrin.h> +#endif +#if RANDOM_ITERATOR_R123_USE_INTRIN_H +#include <intrin.h> +#endif +#ifdef __cplusplus +#include <iostream> +#include <limits> +#include <stdexcept> +#endif + +#if RANDOM_ITERATOR_R123_USE_ASM_GNU + +/* bit25 of CX tells us whether AES is enabled. */ +RANDOM_ITERATOR_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 RANDOM_ITERATOR_R123_USE_CPUID_MSVC +RANDOM_ITERATOR_R123_STATIC_INLINE int haveAESNI(){ + int CPUInfo[4]; + __cpuid(CPUInfo, 1); + return (CPUInfo[2]>>25)&1; +} +#else /* RANDOM_ITERATOR_R123_USE_CPUID_??? */ +#warning "No RANDOM_ITERATOR_R123_USE_CPUID_XXX method chosen. haveAESNI will always return false" +RANDOM_ITERATOR_R123_STATIC_INLINE int haveAESNI(){ + return 0; +} +#endif /* RANDOM_ITERATOR_R123_USE_ASM_GNU || RANDOM_ITERATOR_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 +// RANDOM_ITERATOR_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)) +/* 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. +*/ +RANDOM_ITERATOR_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__) +RANDOM_ITERATOR_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) +RANDOM_ITERATOR_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. */ +RANDOM_ITERATOR_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. */ +RANDOM_ITERATOR_R123_STATIC_INLINE __m128 _mm_castsi128_ps(__m128i si){ + return (__m128)si; +} +#endif + +#ifdef __cplusplus + +struct r123m128i{ + __m128i m; +#if RANDOM_ITERATOR_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=(RANDOM_ITERATOR_R123_ULONG_LONG n){ m = _mm_set_epi64x(0, n); return *this;} +#if RANDOM_ITERATOR_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 RANDOM_ITERATOR_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 +}; + +RANDOM_ITERATOR_R123_STATIC_INLINE r123m128i& operator++(r123m128i& v){ + __m128i& c = v.m; + __m128i zeroone = _mm_set_epi64x(RANDOM_ITERATOR_R123_64BIT(0), RANDOM_ITERATOR_R123_64BIT(1)); + c = _mm_add_epi64(c, zeroone); + //return c; +#if RANDOM_ITERATOR_R123_USE_SSE4_1 + __m128i zerofff = _mm_set_epi64x(0, ~(RANDOM_ITERATOR_R123_64BIT(0))); + if( RANDOM_ITERATOR_R123_BUILTIN_EXPECT(_mm_testz_si128(c,zerofff), 0) ){ + __m128i onezero = _mm_set_epi64x(RANDOM_ITERATOR_R123_64BIT(1), RANDOM_ITERATOR_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( RANDOM_ITERATOR_R123_BUILTIN_EXPECT((mask&0x3) == 0x3, 0) ){ + __m128i onezero = _mm_set_epi64x(1,0); + c = _mm_add_epi64(c, onezero); + } +#endif + return v; +} + +RANDOM_ITERATOR_R123_STATIC_INLINE r123m128i& operator+=(r123m128i& lhs, RANDOM_ITERATOR_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(1,0)); + lhs.m = c; + return lhs; +} + +// We need this one because it's present, but never used in r123array1xm128i::incr +RANDOM_ITERATOR_R123_STATIC_INLINE bool operator<=(RANDOM_ITERATOR_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... +RANDOM_ITERATOR_R123_STATIC_INLINE bool operator<(const r123m128i&, const r123m128i&){ + throw std::runtime_error("operator<(r123m128i, r123m128i) is unimplemented.");} +RANDOM_ITERATOR_R123_STATIC_INLINE bool operator<=(const r123m128i&, const r123m128i&){ + throw std::runtime_error("operator<=(r123m128i, r123m128i) is unimplemented.");} +RANDOM_ITERATOR_R123_STATIC_INLINE bool operator>(const r123m128i&, const r123m128i&){ + throw std::runtime_error("operator>(r123m128i, r123m128i) is unimplemented.");} +RANDOM_ITERATOR_R123_STATIC_INLINE bool operator>=(const r123m128i&, const r123m128i&){ + throw std::runtime_error("operator>=(r123m128i, r123m128i) is unimplemented.");} + +RANDOM_ITERATOR_R123_STATIC_INLINE bool operator==(const r123m128i &lhs, const r123m128i &rhs){ + return 0xf==_mm_movemask_ps(_mm_castsi128_ps(_mm_cmpeq_epi32(lhs, rhs))); } +RANDOM_ITERATOR_R123_STATIC_INLINE bool operator!=(const r123m128i &lhs, const r123m128i &rhs){ + return !(lhs==rhs);} +RANDOM_ITERATOR_R123_STATIC_INLINE bool operator==(RANDOM_ITERATOR_R123_ULONG_LONG lhs, const r123m128i &rhs){ + r123m128i LHS; LHS.m=_mm_set_epi64x(0, lhs); return LHS == rhs; } +RANDOM_ITERATOR_R123_STATIC_INLINE bool operator!=(RANDOM_ITERATOR_R123_ULONG_LONG lhs, const r123m128i &rhs){ + return !(lhs==rhs);} +RANDOM_ITERATOR_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]; +} + +RANDOM_ITERATOR_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 /* !RANDOM_ITERATOR_R123_USE_SSE */ +RANDOM_ITERATOR_R123_STATIC_INLINE int haveAESNI(){ + return 0; +} +#endif /* RANDOM_ITERATOR_R123_USE_SSE */ + +#endif /* _Random123_sse_dot_h__ */ diff --git a/corsika/detail/framework/random/random_iterator/detail/Random123/features/sunprofeatures.h b/corsika/detail/framework/random/random_iterator/detail/Random123/features/sunprofeatures.h new file mode 100644 index 0000000000000000000000000000000000000000..747d99ab2f98ea30a9a5eb5e6a7638e96e063339 --- /dev/null +++ b/corsika/detail/framework/random/random_iterator/detail/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 RANDOM_ITERATOR_R123_STATIC_INLINE +#define RANDOM_ITERATOR_R123_STATIC_INLINE static inline +#endif + +#ifndef RANDOM_ITERATOR_R123_FORCE_INLINE +#define RANDOM_ITERATOR_R123_FORCE_INLINE(decl) decl +#endif + +#ifndef RANDOM_ITERATOR_R123_CUDA_DEVICE +#define RANDOM_ITERATOR_R123_CUDA_DEVICE +#endif + +#ifndef RANDOM_ITERATOR_R123_ASSERT +#include <assert.h> +#define RANDOM_ITERATOR_R123_ASSERT(x) assert(x) +#endif + +#ifndef RANDOM_ITERATOR_R123_BUILTIN_EXPECT +#define RANDOM_ITERATOR_R123_BUILTIN_EXPECT(expr,likely) expr +#endif + +// The basic idiom is: +// #ifndef RANDOM_ITERATOR_R123_SOMETHING +// #if some condition +// #define RANDOM_ITERATOR_R123_SOMETHING 1 +// #else +// #define RANDOM_ITERATOR_R123_SOMETHING 0 +// #endif +// #endif +// This idiom allows an external user to override any decision +// in this file with a command-line -DRANDOM_ITERATOR_R123_SOMETHING=1 or -DRANDOM_ITERATOR_R123_SOMETHINE=0 + +// An alternative idiom is: +// #ifndef RANDOM_ITERATOR_R123_SOMETHING +// #define RANDOM_ITERATOR_R123_SOMETHING (some boolean expression) +// #endif +// where the boolean expression might contain previously-defined RANDOM_ITERATOR_R123_SOMETHING_ELSE +// pp-symbols. + +#ifndef RANDOM_ITERATOR_R123_USE_AES_NI +#define RANDOM_ITERATOR_R123_USE_AES_NI 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_SSE4_2 +#define RANDOM_ITERATOR_R123_USE_SSE4_2 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_SSE4_1 +#define RANDOM_ITERATOR_R123_USE_SSE4_1 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_SSE +#define RANDOM_ITERATOR_R123_USE_SSE 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_AES_OPENSSL +#define RANDOM_ITERATOR_R123_USE_AES_OPENSSL 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_GNU_UINT128 +#define RANDOM_ITERATOR_R123_USE_GNU_UINT128 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_ASM_GNU +#define RANDOM_ITERATOR_R123_USE_ASM_GNU 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_CPUID_MSVC +#define RANDOM_ITERATOR_R123_USE_CPUID_MSVC 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_X86INTRIN_H +#define RANDOM_ITERATOR_R123_USE_X86INTRIN_H 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_IA32INTRIN_H +#define RANDOM_ITERATOR_R123_USE_IA32INTRIN_H 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_XMMINTRIN_H +#define RANDOM_ITERATOR_R123_USE_XMMINTRIN_H 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_EMMINTRIN_H +#define RANDOM_ITERATOR_R123_USE_EMMINTRIN_H 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_SMMINTRIN_H +#define RANDOM_ITERATOR_R123_USE_SMMINTRIN_H 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_WMMINTRIN_H +#define RANDOM_ITERATOR_R123_USE_WMMINTRIN_H 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_INTRIN_H +#define RANDOM_ITERATOR_R123_USE_INTRIN_H 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_MULHILO16_ASM +#define RANDOM_ITERATOR_R123_USE_MULHILO16_ASM 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_MULHILO32_ASM +#define RANDOM_ITERATOR_R123_USE_MULHILO32_ASM 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_MULHILO64_ASM +#define RANDOM_ITERATOR_R123_USE_MULHILO64_ASM 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_MULHILO64_MSVC_INTRIN +#define RANDOM_ITERATOR_R123_USE_MULHILO64_MSVC_INTRIN 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_MULHILO64_CUDA_INTRIN +#define RANDOM_ITERATOR_R123_USE_MULHILO64_CUDA_INTRIN 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_MULHILO64_OPENCL_INTRIN +#define RANDOM_ITERATOR_R123_USE_MULHILO64_OPENCL_INTRIN 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_PHILOX_64BIT +#define RANDOM_ITERATOR_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/corsika/detail/framework/random/random_iterator/detail/Random123/features/xlcfeatures.h b/corsika/detail/framework/random/random_iterator/detail/Random123/features/xlcfeatures.h new file mode 100644 index 0000000000000000000000000000000000000000..d11006d95039b5bd5a0bcebfa01d0fa5d1080503 --- /dev/null +++ b/corsika/detail/framework/random/random_iterator/detail/Random123/features/xlcfeatures.h @@ -0,0 +1,210 @@ +/* +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 RANDOM_ITERATOR_R123_STATIC_INLINE +#define RANDOM_ITERATOR_R123_STATIC_INLINE static inline +#endif + +#ifndef RANDOM_ITERATOR_R123_FORCE_INLINE +#define RANDOM_ITERATOR_R123_FORCE_INLINE(decl) decl __attribute__((__always_inline__)) +#endif + +#ifndef RANDOM_ITERATOR_R123_CUDA_DEVICE +#define RANDOM_ITERATOR_R123_CUDA_DEVICE +#endif + +#ifndef RANDOM_ITERATOR_R123_ASSERT +#include <assert.h> +#define RANDOM_ITERATOR_R123_ASSERT(x) assert(x) +#endif + +#ifndef RANDOM_ITERATOR_R123_BUILTIN_EXPECT +#define RANDOM_ITERATOR_R123_BUILTIN_EXPECT(expr,likely) __builtin_expect(expr,likely) +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_AES_NI +#define RANDOM_ITERATOR_R123_USE_AES_NI 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_SSE4_2 +#define RANDOM_ITERATOR_R123_USE_SSE4_2 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_SSE4_1 +#define RANDOM_ITERATOR_R123_USE_SSE4_1 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_SSE +#define RANDOM_ITERATOR_R123_USE_SSE 0 +#endif + +#ifndef RANDOM_ITERATOR_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 + -DRANDOM_ITERATOR_R123_USE_AES_OPENSSL=1 and any necessary LDFLAGS or LDLIBS to + play with openssl */ +#define RANDOM_ITERATOR_R123_USE_AES_OPENSSL 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_GNU_UINT128 +#define RANDOM_ITERATOR_R123_USE_GNU_UINT128 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_ASM_GNU +#define RANDOM_ITERATOR_R123_USE_ASM_GNU 1 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_CPUID_MSVC +#define RANDOM_ITERATOR_R123_USE_CPUID_MSVC 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_X86INTRIN_H +#define RANDOM_ITERATOR_R123_USE_X86INTRIN_H 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_IA32INTRIN_H +#define RANDOM_ITERATOR_R123_USE_IA32INTRIN_H 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_XMMINTRIN_H +#define RANDOM_ITERATOR_R123_USE_XMMINTRIN_H 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_EMMINTRIN_H +#define RANDOM_ITERATOR_R123_USE_EMMINTRIN_H 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_SMMINTRIN_H +#define RANDOM_ITERATOR_R123_USE_SMMINTRIN_H 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_WMMINTRIN_H +#define RANDOM_ITERATOR_R123_USE_WMMINTRIN_H 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_INTRIN_H +#ifdef __ABM__ +#define RANDOM_ITERATOR_R123_USE_INTRIN_H 1 +#else +#define RANDOM_ITERATOR_R123_USE_INTRIN_H 0 +#endif +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_MULHILO32_ASM +#define RANDOM_ITERATOR_R123_USE_MULHILO32_ASM 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_MULHILO64_MULHI_INTRIN +#if (defined(__powerpc64__)) +#define RANDOM_ITERATOR_R123_USE_MULHILO64_MULHI_INTRIN 1 +#else +#define RANDOM_ITERATOR_R123_USE_MULHILO64_MULHI_INTRIN 0 +#endif +#endif + +#ifndef RANDOM_ITERATOR_R123_MULHILO64_MULHI_INTRIN +#define RANDOM_ITERATOR_R123_MULHILO64_MULHI_INTRIN __mulhdu +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_MULHILO32_MULHI_INTRIN +#define RANDOM_ITERATOR_R123_USE_MULHILO32_MULHI_INTRIN 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_MULHILO32_MULHI_INTRIN +#define RANDOM_ITERATOR_R123_MULHILO32_MULHI_INTRIN __mulhwu +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_MULHILO64_ASM +#if defined(__powerpc64__) +#define RANDOM_ITERATOR_R123_USE_MULHILO64_ASM (1 /*defined(__powerpc64__)*/ && !(RANDOM_ITERATOR_R123_USE_MULHILO64_MULHI_INTRIN)) +#else +#define RANDOM_ITERATOR_R123_USE_MULHILO64_ASM (0 /*defined(__powerpc64__)*/ && !(RANDOM_ITERATOR_R123_USE_MULHILO64_MULHI_INTRIN)) +#endif +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_MULHILO64_MSVC_INTRIN +#define RANDOM_ITERATOR_R123_USE_MULHILO64_MSVC_INTRIN 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_MULHILO64_CUDA_INTRIN +#define RANDOM_ITERATOR_R123_USE_MULHILO64_CUDA_INTRIN 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_MULHILO64_OPENCL_INTRIN +#define RANDOM_ITERATOR_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/corsika/detail/framework/random/random_iterator/detail/Random123/gsl_microrng.h b/corsika/detail/framework/random/random_iterator/detail/Random123/gsl_microrng.h new file mode 100644 index 0000000000000000000000000000000000000000..d127292ecbfb78624acfecdfbb237e475a6ff9aa --- /dev/null +++ b/corsika/detail/framework/random/random_iterator/detail/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; \ + RANDOM_ITERATOR_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<<(RANDOM_ITERATOR_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 \ +}; \ + \ +RANDOM_ITERATOR_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/corsika/detail/framework/random/random_iterator/detail/Random123/philox.h b/corsika/detail/framework/random/random_iterator/detail/Random123/philox.h new file mode 100644 index 0000000000000000000000000000000000000000..92eb91ad7cba85d5d482ea094eca890e18805c89 --- /dev/null +++ b/corsika/detail/framework/random/random_iterator/detail/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) \ +RANDOM_ITERATOR_R123_CUDA_DEVICE RANDOM_ITERATOR_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) \ +RANDOM_ITERATOR_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) \ +RANDOM_ITERATOR_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) \ +RANDOM_ITERATOR_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) \ +RANDOM_ITERATOR_R123_CUDA_DEVICE RANDOM_ITERATOR_R123_STATIC_INLINE Word mulhilo##W(Word a, Word b, RANDOM_ITERATOR_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 RANDOM_ITERATOR_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) \ +RANDOM_ITERATOR_R123_STATIC_INLINE Word mulhilo##W(Word a, Word b, RANDOM_ITERATOR_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) \ +RANDOM_ITERATOR_R123_STATIC_INLINE Word mulhilo##W(Word a, Word b, Word *hip){ \ + RANDOM_ITERATOR_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 RANDOM_ITERATOR_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 RANDOM_ITERATOR_R123_USE_64BIT +_mulhilo_dword_tpl(32, uint32_t, uint64_t) +#elif RANDOM_ITERATOR_R123_USE_MULHILO32_MULHI_INTRIN +_mulhilo_cuda_intrin_tpl(32, uint32_t, RANDOM_ITERATOR_R123_MULHILO32_MULHI_INTRIN) +#else +_mulhilo_c99_tpl(32, uint32_t) +#endif +#endif + +#if RANDOM_ITERATOR_R123_USE_PHILOX_64BIT +#if RANDOM_ITERATOR_R123_USE_MULHILO64_ASM +#ifdef __powerpc64__ +_mulhilo_asm_tpl(64, uint64_t, "mulhdu") +#else +_mulhilo_asm_tpl(64, uint64_t, "mulq") +#endif /* __powerpc64__ */ +#elif RANDOM_ITERATOR_R123_USE_MULHILO64_MSVC_INTRIN +_mulhilo_msvc_intrin_tpl(64, uint64_t, _umul128) +#elif RANDOM_ITERATOR_R123_USE_MULHILO64_CUDA_INTRIN +_mulhilo_cuda_intrin_tpl(64, uint64_t, __umul64hi) +#elif RANDOM_ITERATOR_R123_USE_MULHILO64_OPENCL_INTRIN +_mulhilo_cuda_intrin_tpl(64, uint64_t, mul_hi) +#elif RANDOM_ITERATOR_R123_USE_MULHILO64_MULHI_INTRIN +_mulhilo_cuda_intrin_tpl(64, uint64_t, RANDOM_ITERATOR_R123_MULHILO64_MULHI_INTRIN) +#elif RANDOM_ITERATOR_R123_USE_GNU_UINT128 +_mulhilo_dword_tpl(64, uint64_t, __uint128_t) +#elif RANDOM_ITERATOR_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 RANDOM_ITERATOR_R123_64BIT(0xD2B74407B1CE6E93) +#endif + +#ifndef PHILOX_M4x64_0 +#define PHILOX_M4x64_0 RANDOM_ITERATOR_R123_64BIT(0xD2E7470EE14C6C93) +#endif + +#ifndef PHILOX_M4x64_1 +#define PHILOX_M4x64_1 RANDOM_ITERATOR_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 RANDOM_ITERATOR_R123_64BIT(0x9E3779B97F4A7C15) /* golden ratio */ +#endif +#ifndef PHILOX_W64_1 +#define PHILOX_W64_1 RANDOM_ITERATOR_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) \ +RANDOM_ITERATOR_R123_CUDA_DEVICE RANDOM_ITERATOR_R123_STATIC_INLINE RANDOM_ITERATOR_R123_FORCE_INLINE(struct r123array2x##W _philox2x##W##round(struct r123array2x##W ctr, struct r123array1x##W key)); \ +RANDOM_ITERATOR_R123_CUDA_DEVICE RANDOM_ITERATOR_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) \ +RANDOM_ITERATOR_R123_CUDA_DEVICE RANDOM_ITERATOR_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) \ +RANDOM_ITERATOR_R123_CUDA_DEVICE RANDOM_ITERATOR_R123_STATIC_INLINE RANDOM_ITERATOR_R123_FORCE_INLINE(struct r123array4x##W _philox4x##W##round(struct r123array4x##W ctr, struct r123array2x##W key)); \ +RANDOM_ITERATOR_R123_CUDA_DEVICE RANDOM_ITERATOR_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) \ +RANDOM_ITERATOR_R123_CUDA_DEVICE RANDOM_ITERATOR_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; \ +RANDOM_ITERATOR_R123_CUDA_DEVICE RANDOM_ITERATOR_R123_STATIC_INLINE philox##N##x##W##_key_t philox##N##x##W##keyinit(philox##N##x##W##_ukey_t uk) { return uk; } \ +RANDOM_ITERATOR_R123_CUDA_DEVICE RANDOM_ITERATOR_R123_STATIC_INLINE RANDOM_ITERATOR_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)); \ +RANDOM_ITERATOR_R123_CUDA_DEVICE RANDOM_ITERATOR_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) { \ + RANDOM_ITERATOR_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 RANDOM_ITERATOR_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 /* RANDOM_ITERATOR_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 RANDOM_ITERATOR_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 /* RANDOM_ITERATOR_R123_USE_PHILOX_64BIT */ + +#if defined(__cplusplus) + +#define _PhiloxNxW_base_tpl(CType, KType, N, W) \ +namespace random_iterator_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 RANDOM_ITERATOR_R123_METAL_CONSTANT_ADDRESS_SPACE unsigned int rounds=ROUNDS; \ + inline RANDOM_ITERATOR_R123_CUDA_DEVICE RANDOM_ITERATOR_R123_FORCE_INLINE(ctr_type operator()(ctr_type ctr, key_type key) const){ \ + RANDOM_ITERATOR_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 random_iterator_r123 + +_PhiloxNxW_base_tpl(r123array2x32, r123array1x32, 2, 32) // Philox2x32_R<R> +_PhiloxNxW_base_tpl(r123array4x32, r123array2x32, 4, 32) // Philox4x32_R<R> +#if RANDOM_ITERATOR_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/corsika/detail/framework/random/random_iterator/detail/Random123/threefry.h b/corsika/detail/framework/random/random_iterator/detail/Random123/threefry.h new file mode 100644 index 0000000000000000000000000000000000000000..b5bb304436e69bf00cd97a99d86d51a805e6ed78 --- /dev/null +++ b/corsika/detail/framework/random/random_iterator/detail/Random123/threefry.h @@ -0,0 +1,870 @@ +/* +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 RANDOM_ITERATOR_R123_USE_64BIT +RANDOM_ITERATOR_R123_CUDA_DEVICE RANDOM_ITERATOR_R123_STATIC_INLINE RANDOM_ITERATOR_R123_FORCE_INLINE(uint64_t RotL_64(uint64_t x, unsigned int N)); +RANDOM_ITERATOR_R123_CUDA_DEVICE RANDOM_ITERATOR_R123_STATIC_INLINE uint64_t RotL_64(uint64_t x, unsigned int N) +{ + return (x << (N & 63)) | (x >> ((64-N) & 63)); +} +#endif + +RANDOM_ITERATOR_R123_CUDA_DEVICE RANDOM_ITERATOR_R123_STATIC_INLINE RANDOM_ITERATOR_R123_FORCE_INLINE(uint32_t RotL_32(uint32_t x, unsigned int N)); +RANDOM_ITERATOR_R123_CUDA_DEVICE RANDOM_ITERATOR_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; \ +RANDOM_ITERATOR_R123_CUDA_DEVICE RANDOM_ITERATOR_R123_STATIC_INLINE threefry2x##W##_key_t threefry2x##W##keyinit(threefry2x##W##_ukey_t uk) { return uk; } \ +RANDOM_ITERATOR_R123_CUDA_DEVICE RANDOM_ITERATOR_R123_STATIC_INLINE RANDOM_ITERATOR_R123_FORCE_INLINE(threefry2x##W##_ctr_t threefry2x##W##_R(unsigned int Nrounds, threefry2x##W##_ctr_t in, threefry2x##W##_key_t k)); \ +RANDOM_ITERATOR_R123_CUDA_DEVICE RANDOM_ITERATOR_R123_STATIC_INLINE \ +threefry2x##W##_ctr_t threefry2x##W##_R(unsigned int Nrounds, threefry2x##W##_ctr_t in, threefry2x##W##_key_t k){ \ + threefry2x##W##_ctr_t X; \ + uint##W##_t ks[2+1]; \ + int i; /* avoid size_t to avoid need for stddef.h */ \ + RANDOM_ITERATOR_R123_ASSERT(Nrounds<=32); \ + ks[2] = SKEIN_KS_PARITY##W; \ + for (i=0;i < 2; i++) \ + { \ + ks[i] = k.v[i]; \ + X.v[i] = in.v[i]; \ + ks[2] ^= k.v[i]; \ + } \ + \ + /* Insert initial key before round 0 */ \ + X.v[0] += ks[0]; X.v[1] += ks[1]; \ + \ + if(Nrounds>0){ X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x2_0_0); X.v[1] ^= X.v[0]; } \ + if(Nrounds>1){ X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x2_1_0); X.v[1] ^= X.v[0]; } \ + if(Nrounds>2){ X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x2_2_0); X.v[1] ^= X.v[0]; } \ + if(Nrounds>3){ X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x2_3_0); X.v[1] ^= X.v[0]; } \ + if(Nrounds>3){ \ + /* InjectKey(r=1) */ \ + X.v[0] += ks[1]; X.v[1] += ks[2]; \ + X.v[1] += 1; /* X.v[2-1] += r */ \ + } \ + if(Nrounds>4){ X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x2_4_0); X.v[1] ^= X.v[0]; } \ + if(Nrounds>5){ X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x2_5_0); X.v[1] ^= X.v[0]; } \ + if(Nrounds>6){ X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x2_6_0); X.v[1] ^= X.v[0]; } \ + if(Nrounds>7){ X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x2_7_0); X.v[1] ^= X.v[0]; } \ + if(Nrounds>7){ \ + /* InjectKey(r=2) */ \ + X.v[0] += ks[2]; X.v[1] += ks[0]; \ + X.v[1] += 2; \ + } \ + if(Nrounds>8){ X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x2_0_0); X.v[1] ^= X.v[0]; } \ + if(Nrounds>9){ X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x2_1_0); X.v[1] ^= X.v[0]; } \ + if(Nrounds>10){ X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x2_2_0); X.v[1] ^= X.v[0]; } \ + if(Nrounds>11){ X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x2_3_0); X.v[1] ^= X.v[0]; } \ + if(Nrounds>11){ \ + /* InjectKey(r=3) */ \ + X.v[0] += ks[0]; X.v[1] += ks[1]; \ + X.v[1] += 3; \ + } \ + if(Nrounds>12){ X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x2_4_0); X.v[1] ^= X.v[0]; } \ + if(Nrounds>13){ X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x2_5_0); X.v[1] ^= X.v[0]; } \ + if(Nrounds>14){ X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x2_6_0); X.v[1] ^= X.v[0]; } \ + if(Nrounds>15){ X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x2_7_0); X.v[1] ^= X.v[0]; } \ + if(Nrounds>15){ \ + /* InjectKey(r=4) */ \ + X.v[0] += ks[1]; X.v[1] += ks[2]; \ + X.v[1] += 4; \ + } \ + if(Nrounds>16){ X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x2_0_0); X.v[1] ^= X.v[0]; } \ + if(Nrounds>17){ X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x2_1_0); X.v[1] ^= X.v[0]; } \ + if(Nrounds>18){ X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x2_2_0); X.v[1] ^= X.v[0]; } \ + if(Nrounds>19){ X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x2_3_0); X.v[1] ^= X.v[0]; } \ + if(Nrounds>19){ \ + /* InjectKey(r=5) */ \ + X.v[0] += ks[2]; X.v[1] += ks[0]; \ + X.v[1] += 5; \ + } \ + if(Nrounds>20){ X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x2_4_0); X.v[1] ^= X.v[0]; } \ + if(Nrounds>21){ X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x2_5_0); X.v[1] ^= X.v[0]; } \ + if(Nrounds>22){ X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x2_6_0); X.v[1] ^= X.v[0]; } \ + if(Nrounds>23){ X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x2_7_0); X.v[1] ^= X.v[0]; } \ + if(Nrounds>23){ \ + /* InjectKey(r=6) */ \ + X.v[0] += ks[0]; X.v[1] += ks[1]; \ + X.v[1] += 6; \ + } \ + if(Nrounds>24){ X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x2_0_0); X.v[1] ^= X.v[0]; } \ + if(Nrounds>25){ X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x2_1_0); X.v[1] ^= X.v[0]; } \ + if(Nrounds>26){ X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x2_2_0); X.v[1] ^= X.v[0]; } \ + if(Nrounds>27){ X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x2_3_0); X.v[1] ^= X.v[0]; } \ + if(Nrounds>27){ \ + /* InjectKey(r=7) */ \ + X.v[0] += ks[1]; X.v[1] += ks[2]; \ + X.v[1] += 7; \ + } \ + if(Nrounds>28){ X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x2_4_0); X.v[1] ^= X.v[0]; } \ + if(Nrounds>29){ X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x2_5_0); X.v[1] ^= X.v[0]; } \ + if(Nrounds>30){ X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x2_6_0); X.v[1] ^= X.v[0]; } \ + if(Nrounds>31){ X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x2_7_0); X.v[1] ^= X.v[0]; } \ + if(Nrounds>31){ \ + /* InjectKey(r=8) */ \ + X.v[0] += ks[2]; X.v[1] += ks[0]; \ + X.v[1] += 8; \ + } \ + return X; \ +} \ + /** @ingroup ThreefryNxW */ \ +enum r123_enum_threefry2x##W { threefry2x##W##_rounds = THREEFRY2x##W##_DEFAULT_ROUNDS }; \ +RANDOM_ITERATOR_R123_CUDA_DEVICE RANDOM_ITERATOR_R123_STATIC_INLINE RANDOM_ITERATOR_R123_FORCE_INLINE(threefry2x##W##_ctr_t threefry2x##W(threefry2x##W##_ctr_t in, threefry2x##W##_key_t k)); \ +RANDOM_ITERATOR_R123_CUDA_DEVICE RANDOM_ITERATOR_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; \ +RANDOM_ITERATOR_R123_CUDA_DEVICE RANDOM_ITERATOR_R123_STATIC_INLINE threefry4x##W##_key_t threefry4x##W##keyinit(threefry4x##W##_ukey_t uk) { return uk; } \ +RANDOM_ITERATOR_R123_CUDA_DEVICE RANDOM_ITERATOR_R123_STATIC_INLINE RANDOM_ITERATOR_R123_FORCE_INLINE(threefry4x##W##_ctr_t threefry4x##W##_R(unsigned int Nrounds, threefry4x##W##_ctr_t in, threefry4x##W##_key_t k)); \ +RANDOM_ITERATOR_R123_CUDA_DEVICE RANDOM_ITERATOR_R123_STATIC_INLINE \ +threefry4x##W##_ctr_t threefry4x##W##_R(unsigned int Nrounds, threefry4x##W##_ctr_t in, threefry4x##W##_key_t k){ \ + threefry4x##W##_ctr_t X; \ + uint##W##_t ks[4+1]; \ + int i; /* avoid size_t to avoid need for stddef.h */ \ + RANDOM_ITERATOR_R123_ASSERT(Nrounds<=72); \ + ks[4] = SKEIN_KS_PARITY##W; \ + for (i=0;i < 4; i++) \ + { \ + ks[i] = k.v[i]; \ + X.v[i] = in.v[i]; \ + ks[4] ^= k.v[i]; \ + } \ + \ + /* Insert initial key before round 0 */ \ + X.v[0] += ks[0]; X.v[1] += ks[1]; X.v[2] += ks[2]; X.v[3] += ks[3]; \ + \ + if(Nrounds>0){ \ + X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_0_0); X.v[1] ^= X.v[0]; \ + X.v[2] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_0_1); X.v[3] ^= X.v[2]; \ + } \ + if(Nrounds>1){ \ + X.v[0] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_1_0); X.v[3] ^= X.v[0]; \ + X.v[2] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_1_1); X.v[1] ^= X.v[2]; \ + } \ + if(Nrounds>2){ \ + X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_2_0); X.v[1] ^= X.v[0]; \ + X.v[2] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_2_1); X.v[3] ^= X.v[2]; \ + } \ + if(Nrounds>3){ \ + X.v[0] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_3_0); X.v[3] ^= X.v[0]; \ + X.v[2] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_3_1); X.v[1] ^= X.v[2]; \ + } \ + if(Nrounds>3){ \ + /* InjectKey(r=1) */ \ + X.v[0] += ks[1]; X.v[1] += ks[2]; X.v[2] += ks[3]; X.v[3] += ks[4]; \ + X.v[4-1] += 1; /* X.v[WCNT4-1] += r */ \ + } \ + \ + if(Nrounds>4){ \ + X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_4_0); X.v[1] ^= X.v[0]; \ + X.v[2] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_4_1); X.v[3] ^= X.v[2]; \ + } \ + if(Nrounds>5){ \ + X.v[0] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_5_0); X.v[3] ^= X.v[0]; \ + X.v[2] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_5_1); X.v[1] ^= X.v[2]; \ + } \ + if(Nrounds>6){ \ + X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_6_0); X.v[1] ^= X.v[0]; \ + X.v[2] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_6_1); X.v[3] ^= X.v[2]; \ + } \ + if(Nrounds>7){ \ + X.v[0] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_7_0); X.v[3] ^= X.v[0]; \ + X.v[2] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_7_1); X.v[1] ^= X.v[2]; \ + } \ + if(Nrounds>7){ \ + /* InjectKey(r=2) */ \ + X.v[0] += ks[2]; X.v[1] += ks[3]; X.v[2] += ks[4]; X.v[3] += ks[0]; \ + X.v[4-1] += 2; /* X.v[WCNT4-1] += r */ \ + } \ + \ + if(Nrounds>8){ \ + X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_0_0); X.v[1] ^= X.v[0]; \ + X.v[2] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_0_1); X.v[3] ^= X.v[2]; \ + } \ + if(Nrounds>9){ \ + X.v[0] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_1_0); X.v[3] ^= X.v[0]; \ + X.v[2] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_1_1); X.v[1] ^= X.v[2]; \ + } \ + if(Nrounds>10){ \ + X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_2_0); X.v[1] ^= X.v[0]; \ + X.v[2] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_2_1); X.v[3] ^= X.v[2]; \ + } \ + if(Nrounds>11){ \ + X.v[0] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_3_0); X.v[3] ^= X.v[0]; \ + X.v[2] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_3_1); X.v[1] ^= X.v[2]; \ + } \ + if(Nrounds>11){ \ + /* InjectKey(r=3) */ \ + X.v[0] += ks[3]; X.v[1] += ks[4]; X.v[2] += ks[0]; X.v[3] += ks[1]; \ + X.v[4-1] += 3; /* X.v[WCNT4-1] += r */ \ + } \ + \ + if(Nrounds>12){ \ + X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_4_0); X.v[1] ^= X.v[0]; \ + X.v[2] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_4_1); X.v[3] ^= X.v[2]; \ + } \ + if(Nrounds>13){ \ + X.v[0] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_5_0); X.v[3] ^= X.v[0]; \ + X.v[2] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_5_1); X.v[1] ^= X.v[2]; \ + } \ + if(Nrounds>14){ \ + X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_6_0); X.v[1] ^= X.v[0]; \ + X.v[2] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_6_1); X.v[3] ^= X.v[2]; \ + } \ + if(Nrounds>15){ \ + X.v[0] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_7_0); X.v[3] ^= X.v[0]; \ + X.v[2] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_7_1); X.v[1] ^= X.v[2]; \ + } \ + if(Nrounds>15){ \ + /* InjectKey(r=1) */ \ + X.v[0] += ks[4]; X.v[1] += ks[0]; X.v[2] += ks[1]; X.v[3] += ks[2]; \ + X.v[4-1] += 4; /* X.v[WCNT4-1] += r */ \ + } \ + \ + if(Nrounds>16){ \ + X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_0_0); X.v[1] ^= X.v[0]; \ + X.v[2] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_0_1); X.v[3] ^= X.v[2]; \ + } \ + if(Nrounds>17){ \ + X.v[0] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_1_0); X.v[3] ^= X.v[0]; \ + X.v[2] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_1_1); X.v[1] ^= X.v[2]; \ + } \ + if(Nrounds>18){ \ + X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_2_0); X.v[1] ^= X.v[0]; \ + X.v[2] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_2_1); X.v[3] ^= X.v[2]; \ + } \ + if(Nrounds>19){ \ + X.v[0] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_3_0); X.v[3] ^= X.v[0]; \ + X.v[2] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_3_1); X.v[1] ^= X.v[2]; \ + } \ + if(Nrounds>19){ \ + /* InjectKey(r=1) */ \ + X.v[0] += ks[0]; X.v[1] += ks[1]; X.v[2] += ks[2]; X.v[3] += ks[3]; \ + X.v[4-1] += 5; /* X.v[WCNT4-1] += r */ \ + } \ + \ + if(Nrounds>20){ \ + X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_4_0); X.v[1] ^= X.v[0]; \ + X.v[2] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_4_1); X.v[3] ^= X.v[2]; \ + } \ + if(Nrounds>21){ \ + X.v[0] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_5_0); X.v[3] ^= X.v[0]; \ + X.v[2] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_5_1); X.v[1] ^= X.v[2]; \ + } \ + if(Nrounds>22){ \ + X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_6_0); X.v[1] ^= X.v[0]; \ + X.v[2] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_6_1); X.v[3] ^= X.v[2]; \ + } \ + if(Nrounds>23){ \ + X.v[0] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_7_0); X.v[3] ^= X.v[0]; \ + X.v[2] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_7_1); X.v[1] ^= X.v[2]; \ + } \ + if(Nrounds>23){ \ + /* InjectKey(r=1) */ \ + X.v[0] += ks[1]; X.v[1] += ks[2]; X.v[2] += ks[3]; X.v[3] += ks[4]; \ + X.v[4-1] += 6; /* X.v[WCNT4-1] += r */ \ + } \ + \ + if(Nrounds>24){ \ + X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_0_0); X.v[1] ^= X.v[0]; \ + X.v[2] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_0_1); X.v[3] ^= X.v[2]; \ + } \ + if(Nrounds>25){ \ + X.v[0] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_1_0); X.v[3] ^= X.v[0]; \ + X.v[2] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_1_1); X.v[1] ^= X.v[2]; \ + } \ + if(Nrounds>26){ \ + X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_2_0); X.v[1] ^= X.v[0]; \ + X.v[2] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_2_1); X.v[3] ^= X.v[2]; \ + } \ + if(Nrounds>27){ \ + X.v[0] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_3_0); X.v[3] ^= X.v[0]; \ + X.v[2] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_3_1); X.v[1] ^= X.v[2]; \ + } \ + if(Nrounds>27){ \ + /* InjectKey(r=1) */ \ + X.v[0] += ks[2]; X.v[1] += ks[3]; X.v[2] += ks[4]; X.v[3] += ks[0]; \ + X.v[4-1] += 7; /* X.v[WCNT4-1] += r */ \ + } \ + \ + if(Nrounds>28){ \ + X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_4_0); X.v[1] ^= X.v[0]; \ + X.v[2] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_4_1); X.v[3] ^= X.v[2]; \ + } \ + if(Nrounds>29){ \ + X.v[0] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_5_0); X.v[3] ^= X.v[0]; \ + X.v[2] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_5_1); X.v[1] ^= X.v[2]; \ + } \ + if(Nrounds>30){ \ + X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_6_0); X.v[1] ^= X.v[0]; \ + X.v[2] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_6_1); X.v[3] ^= X.v[2]; \ + } \ + if(Nrounds>31){ \ + X.v[0] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_7_0); X.v[3] ^= X.v[0]; \ + X.v[2] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_7_1); X.v[1] ^= X.v[2]; \ + } \ + if(Nrounds>31){ \ + /* InjectKey(r=1) */ \ + X.v[0] += ks[3]; X.v[1] += ks[4]; X.v[2] += ks[0]; X.v[3] += ks[1]; \ + X.v[4-1] += 8; /* X.v[WCNT4-1] += r */ \ + } \ + \ + if(Nrounds>32){ \ + X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_0_0); X.v[1] ^= X.v[0]; \ + X.v[2] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_0_1); X.v[3] ^= X.v[2]; \ + } \ + if(Nrounds>33){ \ + X.v[0] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_1_0); X.v[3] ^= X.v[0]; \ + X.v[2] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_1_1); X.v[1] ^= X.v[2]; \ + } \ + if(Nrounds>34){ \ + X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_2_0); X.v[1] ^= X.v[0]; \ + X.v[2] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_2_1); X.v[3] ^= X.v[2]; \ + } \ + if(Nrounds>35){ \ + X.v[0] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_3_0); X.v[3] ^= X.v[0]; \ + X.v[2] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_3_1); X.v[1] ^= X.v[2]; \ + } \ + if(Nrounds>35){ \ + /* InjectKey(r=1) */ \ + X.v[0] += ks[4]; X.v[1] += ks[0]; X.v[2] += ks[1]; X.v[3] += ks[2]; \ + X.v[4-1] += 9; /* X.v[WCNT4-1] += r */ \ + } \ + \ + if(Nrounds>36){ \ + X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_4_0); X.v[1] ^= X.v[0]; \ + X.v[2] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_4_1); X.v[3] ^= X.v[2]; \ + } \ + if(Nrounds>37){ \ + X.v[0] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_5_0); X.v[3] ^= X.v[0]; \ + X.v[2] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_5_1); X.v[1] ^= X.v[2]; \ + } \ + if(Nrounds>38){ \ + X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_6_0); X.v[1] ^= X.v[0]; \ + X.v[2] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_6_1); X.v[3] ^= X.v[2]; \ + } \ + if(Nrounds>39){ \ + X.v[0] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_7_0); X.v[3] ^= X.v[0]; \ + X.v[2] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_7_1); X.v[1] ^= X.v[2]; \ + } \ + if(Nrounds>39){ \ + /* InjectKey(r=1) */ \ + X.v[0] += ks[0]; X.v[1] += ks[1]; X.v[2] += ks[2]; X.v[3] += ks[3]; \ + X.v[4-1] += 10; /* X.v[WCNT4-1] += r */ \ + } \ + \ + if(Nrounds>40){ \ + X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_0_0); X.v[1] ^= X.v[0]; \ + X.v[2] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_0_1); X.v[3] ^= X.v[2]; \ + } \ + if(Nrounds>41){ \ + X.v[0] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_1_0); X.v[3] ^= X.v[0]; \ + X.v[2] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_1_1); X.v[1] ^= X.v[2]; \ + } \ + if(Nrounds>42){ \ + X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_2_0); X.v[1] ^= X.v[0]; \ + X.v[2] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_2_1); X.v[3] ^= X.v[2]; \ + } \ + if(Nrounds>43){ \ + X.v[0] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_3_0); X.v[3] ^= X.v[0]; \ + X.v[2] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_3_1); X.v[1] ^= X.v[2]; \ + } \ + if(Nrounds>43){ \ + /* InjectKey(r=1) */ \ + X.v[0] += ks[1]; X.v[1] += ks[2]; X.v[2] += ks[3]; X.v[3] += ks[4]; \ + X.v[4-1] += 11; /* X.v[WCNT4-1] += r */ \ + } \ + \ + if(Nrounds>44){ \ + X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_4_0); X.v[1] ^= X.v[0]; \ + X.v[2] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_4_1); X.v[3] ^= X.v[2]; \ + } \ + if(Nrounds>45){ \ + X.v[0] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_5_0); X.v[3] ^= X.v[0]; \ + X.v[2] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_5_1); X.v[1] ^= X.v[2]; \ + } \ + if(Nrounds>46){ \ + X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_6_0); X.v[1] ^= X.v[0]; \ + X.v[2] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_6_1); X.v[3] ^= X.v[2]; \ + } \ + if(Nrounds>47){ \ + X.v[0] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_7_0); X.v[3] ^= X.v[0]; \ + X.v[2] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_7_1); X.v[1] ^= X.v[2]; \ + } \ + if(Nrounds>47){ \ + /* InjectKey(r=1) */ \ + X.v[0] += ks[2]; X.v[1] += ks[3]; X.v[2] += ks[4]; X.v[3] += ks[0]; \ + X.v[4-1] += 12; /* X.v[WCNT4-1] += r */ \ + } \ + \ + if(Nrounds>48){ \ + X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_0_0); X.v[1] ^= X.v[0]; \ + X.v[2] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_0_1); X.v[3] ^= X.v[2]; \ + } \ + if(Nrounds>49){ \ + X.v[0] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_1_0); X.v[3] ^= X.v[0]; \ + X.v[2] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_1_1); X.v[1] ^= X.v[2]; \ + } \ + if(Nrounds>50){ \ + X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_2_0); X.v[1] ^= X.v[0]; \ + X.v[2] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_2_1); X.v[3] ^= X.v[2]; \ + } \ + if(Nrounds>51){ \ + X.v[0] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_3_0); X.v[3] ^= X.v[0]; \ + X.v[2] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_3_1); X.v[1] ^= X.v[2]; \ + } \ + if(Nrounds>51){ \ + /* InjectKey(r=1) */ \ + X.v[0] += ks[3]; X.v[1] += ks[4]; X.v[2] += ks[0]; X.v[3] += ks[1]; \ + X.v[4-1] += 13; /* X.v[WCNT4-1] += r */ \ + } \ + \ + if(Nrounds>52){ \ + X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_4_0); X.v[1] ^= X.v[0]; \ + X.v[2] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_4_1); X.v[3] ^= X.v[2]; \ + } \ + if(Nrounds>53){ \ + X.v[0] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_5_0); X.v[3] ^= X.v[0]; \ + X.v[2] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_5_1); X.v[1] ^= X.v[2]; \ + } \ + if(Nrounds>54){ \ + X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_6_0); X.v[1] ^= X.v[0]; \ + X.v[2] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_6_1); X.v[3] ^= X.v[2]; \ + } \ + if(Nrounds>55){ \ + X.v[0] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_7_0); X.v[3] ^= X.v[0]; \ + X.v[2] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_7_1); X.v[1] ^= X.v[2]; \ + } \ + if(Nrounds>55){ \ + /* InjectKey(r=1) */ \ + X.v[0] += ks[4]; X.v[1] += ks[0]; X.v[2] += ks[1]; X.v[3] += ks[2]; \ + X.v[4-1] += 14; /* X.v[WCNT4-1] += r */ \ + } \ + \ + if(Nrounds>56){ \ + X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_0_0); X.v[1] ^= X.v[0]; \ + X.v[2] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_0_1); X.v[3] ^= X.v[2]; \ + } \ + if(Nrounds>57){ \ + X.v[0] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_1_0); X.v[3] ^= X.v[0]; \ + X.v[2] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_1_1); X.v[1] ^= X.v[2]; \ + } \ + if(Nrounds>58){ \ + X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_2_0); X.v[1] ^= X.v[0]; \ + X.v[2] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_2_1); X.v[3] ^= X.v[2]; \ + } \ + if(Nrounds>59){ \ + X.v[0] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_3_0); X.v[3] ^= X.v[0]; \ + X.v[2] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_3_1); X.v[1] ^= X.v[2]; \ + } \ + if(Nrounds>59){ \ + /* InjectKey(r=1) */ \ + X.v[0] += ks[0]; X.v[1] += ks[1]; X.v[2] += ks[2]; X.v[3] += ks[3]; \ + X.v[4-1] += 15; /* X.v[WCNT4-1] += r */ \ + } \ + \ + if(Nrounds>60){ \ + X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_4_0); X.v[1] ^= X.v[0]; \ + X.v[2] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_4_1); X.v[3] ^= X.v[2]; \ + } \ + if(Nrounds>61){ \ + X.v[0] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_5_0); X.v[3] ^= X.v[0]; \ + X.v[2] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_5_1); X.v[1] ^= X.v[2]; \ + } \ + if(Nrounds>62){ \ + X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_6_0); X.v[1] ^= X.v[0]; \ + X.v[2] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_6_1); X.v[3] ^= X.v[2]; \ + } \ + if(Nrounds>63){ \ + X.v[0] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_7_0); X.v[3] ^= X.v[0]; \ + X.v[2] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_7_1); X.v[1] ^= X.v[2]; \ + } \ + if(Nrounds>63){ \ + /* InjectKey(r=1) */ \ + X.v[0] += ks[1]; X.v[1] += ks[2]; X.v[2] += ks[3]; X.v[3] += ks[4]; \ + X.v[4-1] += 16; /* X.v[WCNT4-1] += r */ \ + } \ + \ + if(Nrounds>64){ \ + X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_0_0); X.v[1] ^= X.v[0]; \ + X.v[2] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_0_1); X.v[3] ^= X.v[2]; \ + } \ + if(Nrounds>65){ \ + X.v[0] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_1_0); X.v[3] ^= X.v[0]; \ + X.v[2] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_1_1); X.v[1] ^= X.v[2]; \ + } \ + if(Nrounds>66){ \ + X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_2_0); X.v[1] ^= X.v[0]; \ + X.v[2] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_2_1); X.v[3] ^= X.v[2]; \ + } \ + if(Nrounds>67){ \ + X.v[0] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_3_0); X.v[3] ^= X.v[0]; \ + X.v[2] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_3_1); X.v[1] ^= X.v[2]; \ + } \ + if(Nrounds>67){ \ + /* InjectKey(r=1) */ \ + X.v[0] += ks[2]; X.v[1] += ks[3]; X.v[2] += ks[4]; X.v[3] += ks[0]; \ + X.v[4-1] += 17; /* X.v[WCNT4-1] += r */ \ + } \ + \ + if(Nrounds>68){ \ + X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_4_0); X.v[1] ^= X.v[0]; \ + X.v[2] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_4_1); X.v[3] ^= X.v[2]; \ + } \ + if(Nrounds>69){ \ + X.v[0] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_5_0); X.v[3] ^= X.v[0]; \ + X.v[2] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_5_1); X.v[1] ^= X.v[2]; \ + } \ + if(Nrounds>70){ \ + X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_6_0); X.v[1] ^= X.v[0]; \ + X.v[2] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_6_1); X.v[3] ^= X.v[2]; \ + } \ + if(Nrounds>71){ \ + X.v[0] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_7_0); X.v[3] ^= X.v[0]; \ + X.v[2] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_7_1); X.v[1] ^= X.v[2]; \ + } \ + if(Nrounds>71){ \ + /* InjectKey(r=1) */ \ + X.v[0] += ks[3]; X.v[1] += ks[4]; X.v[2] += ks[0]; X.v[3] += ks[1]; \ + X.v[4-1] += 18; /* X.v[WCNT4-1] += r */ \ + } \ + \ + return X; \ +} \ + \ + /** @ingroup ThreefryNxW */ \ +enum r123_enum_threefry4x##W { threefry4x##W##_rounds = THREEFRY4x##W##_DEFAULT_ROUNDS }; \ +RANDOM_ITERATOR_R123_CUDA_DEVICE RANDOM_ITERATOR_R123_STATIC_INLINE RANDOM_ITERATOR_R123_FORCE_INLINE(threefry4x##W##_ctr_t threefry4x##W(threefry4x##W##_ctr_t in, threefry4x##W##_key_t k)); \ +RANDOM_ITERATOR_R123_CUDA_DEVICE RANDOM_ITERATOR_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 RANDOM_ITERATOR_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 random_iterator_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 RANDOM_ITERATOR_R123_METAL_CONSTANT_ADDRESS_SPACE unsigned int rounds=ROUNDS; \ + inline RANDOM_ITERATOR_R123_CUDA_DEVICE RANDOM_ITERATOR_R123_FORCE_INLINE(ctr_type operator()(ctr_type ctr, key_type key)){ \ + RANDOM_ITERATOR_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 random_iterator_r123 + +_threefryNxWclass_tpl(2x32) +_threefryNxWclass_tpl(4x32) +#if RANDOM_ITERATOR_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/corsika/detail/framework/random/random_iterator/detail/Random123/u01fixedpt.h b/corsika/detail/framework/random/random_iterator/detail/Random123/u01fixedpt.h new file mode 100644 index 0000000000000000000000000000000000000000..64988b55a68bbb6b931411aa99b5cc878f2a81eb --- /dev/null +++ b/corsika/detail/framework/random/random_iterator/detail/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 RANDOM_ITERATOR_R123_0x1p_31f (1.f/(1024.f*1024.f*1024.f*2.f)) +#define RANDOM_ITERATOR_R123_0x1p_24f (128.f*RANDOM_ITERATOR_R123_0x1p_31f) +#define RANDOM_ITERATOR_R123_0x1p_23f (256.f*RANDOM_ITERATOR_R123_0x1p_31f) +#define RANDOM_ITERATOR_R123_0x1p_32 (1./(1024.*1024.*1024.*4.)) +#define RANDOM_ITERATOR_R123_0x1p_63 (2.*RANDOM_ITERATOR_R123_0x1p_32*RANDOM_ITERATOR_R123_0x1p_32) +#define RANDOM_ITERATOR_R123_0x1p_53 (1024.*RANDOM_ITERATOR_R123_0x1p_63) +#define RANDOM_ITERATOR_R123_0x1p_52 (2048.*RANDOM_ITERATOR_R123_0x1p_63) + +/** @endcond */ + +#ifndef RANDOM_ITERATOR_R123_USE_U01_DOUBLE +#define RANDOM_ITERATOR_R123_USE_U01_DOUBLE 1 +#endif + +#ifdef __cplusplus +extern "C"{ +#endif + +/* narrowing conversions: uint32_t to float */ +RANDOM_ITERATOR_R123_CUDA_DEVICE RANDOM_ITERATOR_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))*RANDOM_ITERATOR_R123_0x1p_31f; /* 0x1.p-31f */ +} + +RANDOM_ITERATOR_R123_CUDA_DEVICE RANDOM_ITERATOR_R123_STATIC_INLINE float u01fixedpt_closed_open_32_float(uint32_t i){ + return (i>>8)*RANDOM_ITERATOR_R123_0x1p_24f; /* 0x1.0p-24f; */ +} + +RANDOM_ITERATOR_R123_CUDA_DEVICE RANDOM_ITERATOR_R123_STATIC_INLINE float u01fixedpt_open_closed_32_float(uint32_t i){ + return (1+(i>>8))*RANDOM_ITERATOR_R123_0x1p_24f; /* *0x1.0p-24f; */ +} + +RANDOM_ITERATOR_R123_CUDA_DEVICE RANDOM_ITERATOR_R123_STATIC_INLINE float u01fixedpt_open_open_32_float(uint32_t i){ + return (0.5f+(i>>9))*RANDOM_ITERATOR_R123_0x1p_23f; /* 0x1.p-23f; */ +} + +#if RANDOM_ITERATOR_R123_USE_U01_DOUBLE +/* narrowing conversions: uint64_t to double */ +RANDOM_ITERATOR_R123_CUDA_DEVICE RANDOM_ITERATOR_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&RANDOM_ITERATOR_R123_64BIT(0x7ffffffffffffe00)) + (i&0x200))*RANDOM_ITERATOR_R123_0x1p_63; /* 0x1.p-63; */ +} + +RANDOM_ITERATOR_R123_CUDA_DEVICE RANDOM_ITERATOR_R123_STATIC_INLINE double u01fixedpt_closed_open_64_double(uint64_t i){ + return (i>>11)*RANDOM_ITERATOR_R123_0x1p_53; /* 0x1.0p-53; */ +} + +RANDOM_ITERATOR_R123_CUDA_DEVICE RANDOM_ITERATOR_R123_STATIC_INLINE double u01fixedpt_open_closed_64_double(uint64_t i){ + return (1+(i>>11))*RANDOM_ITERATOR_R123_0x1p_53; /* 0x1.0p-53; */ +} + +RANDOM_ITERATOR_R123_CUDA_DEVICE RANDOM_ITERATOR_R123_STATIC_INLINE double u01fixedpt_open_open_64_double(uint64_t i){ + return (0.5+(i>>12))*RANDOM_ITERATOR_R123_0x1p_52; /* 0x1.0p-52; */ +} + +/* widening conversions: u32 to double */ +RANDOM_ITERATOR_R123_CUDA_DEVICE RANDOM_ITERATOR_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)*RANDOM_ITERATOR_R123_0x1p_32; /* 0x1.p-32; */ +} + +RANDOM_ITERATOR_R123_CUDA_DEVICE RANDOM_ITERATOR_R123_STATIC_INLINE double u01fixedpt_closed_open_32_double(uint32_t i){ + return i*RANDOM_ITERATOR_R123_0x1p_32; /* 0x1.p-32; */ +} + +RANDOM_ITERATOR_R123_CUDA_DEVICE RANDOM_ITERATOR_R123_STATIC_INLINE double u01fixedpt_open_closed_32_double(uint32_t i){ + return (1.+i)*RANDOM_ITERATOR_R123_0x1p_32; /* 0x1.p-32; */ +} + +RANDOM_ITERATOR_R123_CUDA_DEVICE RANDOM_ITERATOR_R123_STATIC_INLINE double u01fixedpt_open_open_32_double(uint32_t i){ + return (0.5+i)*RANDOM_ITERATOR_R123_0x1p_32; /* 0x1.p-32; */ +} +#endif /* RANDOM_ITERATOR_R123_USE_U01_DOUBLE */ + +#ifdef __cplusplus +} +#endif + +/** @} */ +#endif diff --git a/corsika/detail/framework/random/random_iterator/detail/Random123/uniform.hpp b/corsika/detail/framework/random/random_iterator/detail/Random123/uniform.hpp new file mode 100644 index 0000000000000000000000000000000000000000..f89c533b81919a0ea0f706f085b9e4e192447abd --- /dev/null +++ b/corsika/detail/framework/random/random_iterator/detail/Random123/uniform.hpp @@ -0,0 +1,312 @@ +/* +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: +RANDOM_ITERATOR_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> +#include <cstdint> +#include <cstddef> +#if RANDOM_ITERATOR_R123_USE_CXX11_TYPE_TRAITS +#include <type_traits> +#endif +#if __cplusplus >= 201103L +#include <array> +#endif + +namespace random_iterator_r123{ +/** +@{ +@cond HIDDEN_FROM_DOXYGEN +*/ + +#if RANDOM_ITERATOR_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 RANDOM_ITERATOR_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; } + +RANDOM_ITERATOR_R123_MK_SIGNED_UNSIGNED(int8_t, uint8_t); +RANDOM_ITERATOR_R123_MK_SIGNED_UNSIGNED(int16_t, uint16_t); +RANDOM_ITERATOR_R123_MK_SIGNED_UNSIGNED(int32_t, uint32_t); +RANDOM_ITERATOR_R123_MK_SIGNED_UNSIGNED(int64_t, uint64_t); +#if RANDOM_ITERATOR_R123_USE_GNU_UINT128 +RANDOM_ITERATOR_R123_MK_SIGNED_UNSIGNED(__int128_t, __uint128_t); +#endif +#undef RANDOM_ITERATOR_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> +RANDOM_ITERATOR_R123_CONSTEXPR RANDOM_ITERATOR_R123_STATIC_INLINE RANDOM_ITERATOR_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> +RANDOM_ITERATOR_R123_CONSTEXPR RANDOM_ITERATOR_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> +RANDOM_ITERATOR_R123_CUDA_DEVICE RANDOM_ITERATOR_R123_STATIC_INLINE Ftype u01(Itype in){ + typedef typename make_unsigned<Itype>::type Utype; + RANDOM_ITERATOR_R123_CONSTEXPR Ftype factor = Ftype(1.)/(maxTvalue<Utype>() + Ftype(1.)); + RANDOM_ITERATOR_R123_CONSTEXPR Ftype halffactor = Ftype(0.5)*factor; +#if RANDOM_ITERATOR_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> +RANDOM_ITERATOR_R123_CUDA_DEVICE RANDOM_ITERATOR_R123_STATIC_INLINE Ftype uneg11(Itype in){ + typedef typename make_signed<Itype>::type Stype; + RANDOM_ITERATOR_R123_CONSTEXPR Ftype factor = Ftype(1.)/(maxTvalue<Stype>() + Ftype(1.)); + RANDOM_ITERATOR_R123_CONSTEXPR Ftype halffactor = Ftype(0.5)*factor; +#if RANDOM_ITERATOR_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> +RANDOM_ITERATOR_R123_CUDA_DEVICE RANDOM_ITERATOR_R123_STATIC_INLINE Ftype u01fixedpt(Itype in){ + typedef typename make_unsigned<Itype>::type Utype; + RANDOM_ITERATOR_R123_CONSTEXPR int excess = std::numeric_limits<Utype>::digits - std::numeric_limits<Ftype>::digits; + if(excess>=0){ + RANDOM_ITERATOR_R123_CONSTEXPR int ex_nowarn = (excess>=0) ? excess : 0; + RANDOM_ITERATOR_R123_CONSTEXPR Ftype factor = Ftype(1.)/(Ftype(1.) + ((maxTvalue<Utype>()>>ex_nowarn))); + return (1 | (Utype(in)>>ex_nowarn)) * factor; + }else + return u01<Ftype>(in); +} + +#if RANDOM_ITERATOR_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; + size_t i=0; + for(auto e : in){ + ret[i++] = 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; + size_t i=0; + for(auto e : in){ + ret[i++] = 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; + size_t i=0; + for(auto e : in){ + ret[i++] = u01fixedpt<Ftype>(e); + } + return ret; +} +#endif // __cplusplus >= 201103L + +} // namespace random_iterator_r123 + +#endif + diff --git a/corsika/detail/framework/random/random_iterator/detail/SplitMix.hpp b/corsika/detail/framework/random/random_iterator/detail/SplitMix.hpp new file mode 100644 index 0000000000000000000000000000000000000000..03a6b152f21ed4db7d9c912e1a6571ca2722d243 --- /dev/null +++ b/corsika/detail/framework/random/random_iterator/detail/SplitMix.hpp @@ -0,0 +1,57 @@ +/*---------------------------------------------------------------------------- + * + * Copyright (C) 2021 Antonio Augusto Alves Junior + * + * This file is part of RandomIterator. + * + * RandomIterator is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * RandomIterator is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with RandomIterator. If not, see <http://www.gnu.org/licenses/>. + * + *---------------------------------------------------------------------------*/ +/* + * SplitMix.hpp + * + * Created on: 25/02/2021 + * Author: Antonio Augusto Alves Junior + */ + +#pragma once + +namespace random_iterator { + +namespace detail { + +template<typename UIntType> +inline UIntType splitmix( UIntType& ); + + +template<> +inline uint32_t splitmix<uint32_t>(uint32_t& x) { + uint32_t z = (x += 0x6D2B79F5UL); + z = (z ^ (z >> 15)) * (z | 1UL); + z ^= z + (z ^ (z >> 7)) * (z | 61UL); + return z ^ (z >> 14); +} + +template<> +inline uint64_t splitmix<uint64_t>(uint64_t& x){ + uint64_t z = (x += 0x9e3779b97f4a7c15); + z = (z ^ (z >> 30)) * 0xbf58476d1ce4e5b9; + z = (z ^ (z >> 27)) * 0x94d049bb133111eb; + return z ^ (z >> 31); +} + + +} // namespace detail + +} // namespace random_iterator diff --git a/corsika/detail/framework/random/random_iterator/detail/Squares3_128.hpp b/corsika/detail/framework/random/random_iterator/detail/Squares3_128.hpp new file mode 100644 index 0000000000000000000000000000000000000000..fa62c8c8b805149d5cd6a0eda5524a36159f8567 --- /dev/null +++ b/corsika/detail/framework/random/random_iterator/detail/Squares3_128.hpp @@ -0,0 +1,158 @@ +/*---------------------------------------------------------------------------- + * + * Copyright (C) 2021 Antonio Augusto Alves Junior + * + * This file is part of RandomIterator. + * + * RandomIterator is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * RandomIterator is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with RandomIterator. If not, see <http://www.gnu.org/licenses/>. + * + *---------------------------------------------------------------------------*/ +/* + * Squares3_128.hpp + * + * Created on: 25/02/2021 + * Author: Antonio Augusto Alves Junior + */ + +#pragma once + +#include <stdint.h> +#include "SquaresKeys.hpp" +#include "uint128.hpp" + +namespace random_iterator { + +namespace detail { + +/* +* Three round counter-based middle square +* +* squares3 - returns a 32-bit unsigned int [0,0xffffffff] +* +* +* Three rounds of squaring are performed and the result is returned. +* For the first two rounds, the result is rotated right 32 bits. +* This places the random data in the best position for the next round. +* y = ctr*key or z = (ctr+1)*key is added on each round. For keys +* generated by the key utility, either ctr*key or (ctr+1)*key will +* have non-zero digits. This improves randomization and also provides +* for a uniform output. +* +* Note: The squares RNG was based on ideas derived from Middle Square +* Weyl Sequence RNG. One of the ideas was to obtain uniformity by adding +* the Weyl sequence after squaring. Richard P. Brent (creator of the +* xorgens RNG) suggested this method. It turns out that adding ctr*key +* is equivalent. Brent's idea provides the basis for uniformity in this +* generator. +* +* Implementation of the algorithm authored by Bernard Widynski and +* described in https://arxiv.org/pdf/2004.06278v2.pdf +*/ + +class Squares3_128 +{ + +public: + + typedef uint128_t init_type; + typedef uint128_t state_type; + typedef uint128_t seed_type; + typedef uint64_t advance_type; + typedef uint64_t result_type; + + Squares3_128()=delete; + + Squares3_128(size_t s, uint32_t stream =0): + state_(uint64_t(stream)<<32, 0), + seed_(seed_type{ splitmix<size_t>(s) }) + { + + } + + Squares3_128( Squares3_128 const& other): + state_(other.getState() ), + seed_(other.getSeed() ) + {} + + inline Squares3_128& operator=( Squares3_128 const& other) + { + if(this==&other) return *this; + + state_ = other.getState(); + seed_ = other.getSeed(); + + return *this; + } + + + inline result_type operator()(void) + { + uint128_t x, y, z; + + y = x = seed_*state_ ; + z = y + seed_; + + x = x*x + y; x = x.rotate_right() ; /* round 1 */ + + x = x*x + z; x = x.rotate_right() ; /* round 2 */ + + ++state_; /* advance state */ + + return (x*x + y).upper(); /* round 3 */ + + } + + inline void discard(advance_type n){ + + state_ += n; + } + + inline seed_type getSeed() const { + return seed_; + } + + inline void setSeed(seed_type seed) { + seed_ = seed; + } + + inline state_type getState() const { + return state_; + } + + inline void setState( state_type state) { + state_ = state; + } + + inline static uint64_t generateSeed( size_t i ){ + return keys[i]; + } + + friend inline std::ostream& operator<<(std::ostream& os, const Squares3_128& be){ + return os << "state: " << be.getState() + << " seed: " << be.getSeed(); + } + + static constexpr result_type min(){ return 0;} + + static constexpr result_type max(){ return std::numeric_limits<result_type>::max();} + +private: + + state_type state_; + seed_type seed_; +}; + +} // namespace detail + +} // namespace random_iterator diff --git a/corsika/detail/framework/random/random_iterator/detail/Squares3_64.hpp b/corsika/detail/framework/random/random_iterator/detail/Squares3_64.hpp new file mode 100644 index 0000000000000000000000000000000000000000..fa76bb25f763ef27555dcb471355b76e885e288f --- /dev/null +++ b/corsika/detail/framework/random/random_iterator/detail/Squares3_64.hpp @@ -0,0 +1,154 @@ +/*---------------------------------------------------------------------------- + * + * Copyright (C) 2021 Antonio Augusto Alves Junior + * + * This file is part of RandomIterator. + * + * RandomIterator is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * RandomIterator is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with RandomIterator. If not, see <http://www.gnu.org/licenses/>. + * + *---------------------------------------------------------------------------*/ +/* + * Squares3.hpp + * + * Created on: 25/02/2021 + * Author: Antonio Augusto Alves Junior + */ + +#pragma once + +#include <stdint.h> +#include "SquaresKeys.hpp" + +namespace random_iterator { + +namespace detail { + +/* +* Three round counter-based middle square +* +* squares3 - returns a 32-bit unsigned int [0,0xffffffff] +* +* +* Three rounds of squaring are performed and the result is returned. +* For the first two rounds, the result is rotated right 32 bits. +* This places the random data in the best position for the next round. +* y = ctr*key or z = (ctr+1)*key is added on each round. For keys +* generated by the key utility, either ctr*key or (ctr+1)*key will +* have non-zero digits. This improves randomization and also provides +* for a uniform output. +* +* Note: The squares RNG was based on ideas derived from Middle Square +* Weyl Sequence RNG. One of the ideas was to obtain uniformity by adding +* the Weyl sequence after squaring. Richard P. Brent (creator of the +* xorgens RNG) suggested this method. It turns out that adding ctr*key +* is equivalent. Brent's idea provides the basis for uniformity in this +* generator. +* +* Implementation of the algorithm authored by Bernard Widynski and +* described in https://arxiv.org/pdf/2004.06278v2.pdf +*/ + +class Squares3_64 +{ + +public: + + typedef uint64_t init_type; + typedef uint64_t state_type; + typedef uint64_t seed_type; + typedef uint64_t advance_type; + typedef uint32_t result_type; + + Squares3_64()=delete; + + Squares3_64(seed_type s, uint32_t): + state_(0), + seed_(seed_type{ splitmix<seed_type>(s) }) + {} + + Squares3_64( Squares3_64 const& other): + state_(other.getState() ), + seed_(other.getSeed() ) + {} + + inline Squares3_64& operator=( Squares3_64 const& other) + { + if(this==&other) return *this; + + state_ = other.getState(); + seed_ = other.getSeed(); + + return *this; + } + + + inline result_type operator()(void) + { + uint64_t x, y, z; + + y = x = seed_*state_ ; z = y + seed_; + + x = x*x + y; x = (x>>32) | (x<<32); /* round 1 */ + + x = x*x + z; x = (x>>32) | (x<<32); /* round 2 */ + + ++state_; /* advance state */ + + return (x*x + y) >> 32; /* round 3 */ + + } + + inline void discard(advance_type n){ + + state_ += n; + } + + inline seed_type getSeed() const { + return seed_; + } + + inline void setSeed(seed_type seed) { + seed_ = seed; + } + + inline state_type getState() const { + return state_; + } + + inline void setState( state_type state) { + state_ = state; + } + + inline static uint64_t generateSeed( size_t i ){ + return keys[i]; + } + + static constexpr result_type min(){ return 0;} + + static constexpr result_type max(){ return std::numeric_limits<result_type>::max();} + + friend inline std::ostream& operator<<(std::ostream& os, const Squares3_64& be){ + return os << "state: " << be.getState() + << " seed: " << be.getSeed(); + } + +private: + + state_type state_; + seed_type seed_; +}; + +} // namespace detail + +} // namespace random_iterator diff --git a/corsika/detail/framework/random/random_iterator/detail/Squares4_128.hpp b/corsika/detail/framework/random/random_iterator/detail/Squares4_128.hpp new file mode 100644 index 0000000000000000000000000000000000000000..86db25011c1ac46f67caadc74716723fbba54f26 --- /dev/null +++ b/corsika/detail/framework/random/random_iterator/detail/Squares4_128.hpp @@ -0,0 +1,161 @@ +/*---------------------------------------------------------------------------- + * + * Copyright (C) 2021 Antonio Augusto Alves Junior + * + * This file is part of RandomIterator. + * + * RandomIterator is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * RandomIterator is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with RandomIterator. If not, see <http://www.gnu.org/licenses/>. + * + *---------------------------------------------------------------------------*/ +/* + * Squares4_128.hpp + * + * Created on: 25/02/2021 + * Author: Antonio Augusto Alves Junior + */ + +#pragma once + +#include <stdint.h> +#include "SquaresKeys.hpp" +#include "uint128.hpp" + +namespace random_iterator { + +namespace detail { + +/* +* Three round counter-based middle square +* +* squares3 - returns a 32-bit unsigned int [0,0xffffffff] +* +* +* Three rounds of squaring are performed and the result is returned. +* For the first two rounds, the result is rotated right 32 bits. +* This places the random data in the best position for the next round. +* y = ctr*key or z = (ctr+1)*key is added on each round. For keys +* generated by the key utility, either ctr*key or (ctr+1)*key will +* have non-zero digits. This improves randomization and also provides +* for a uniform output. +* +* Note: The squares RNG was based on ideas derived from Middle Square +* Weyl Sequence RNG. One of the ideas was to obtain uniformity by adding +* the Weyl sequence after squaring. Richard P. Brent (creator of the +* xorgens RNG) suggested this method. It turns out that adding ctr*key +* is equivalent. Brent's idea provides the basis for uniformity in this +* generator. +* +* Implementation of the algorithm authored by Bernard Widynski and +* described in https://arxiv.org/pdf/2004.06278v2.pdf +*/ + +class Squares4_128 +{ + +public: + + typedef uint128_t init_type; + typedef uint128_t state_type; + typedef uint128_t seed_type; + typedef uint64_t advance_type; + typedef uint64_t result_type; + + Squares4_128()=delete; + + Squares4_128(size_t s, uint32_t stream =0): + state_(uint64_t(stream)<<32, 0), + seed_(seed_type{ splitmix<size_t>(s) }) + {} + + Squares4_128( Squares4_128 const& other): + state_(other.getState() ), + seed_(other.getSeed() ) + {} + + inline Squares4_128& operator=( Squares4_128 const& other) + { + if(this==&other) return *this; + + state_ = other.getState(); + seed_ = other.getSeed(); + + return *this; + } + + + inline result_type operator()(void) + { + uint128_t x, y, z; + + y = x = seed_*state_ ; + z = y + seed_; + + x = x*x + y; x = x.rotate_right() ; /* round 1 */ + + x = x*x + z; x = x.rotate_right() ; /* round 2 */ + + x = x*x + y; x = x.rotate_right() ; /* round 1 */ + + ++state_; /* advance state */ + + return (x*x + z).upper(); /* round 3 */ + + } + + inline void discard(advance_type n){ + + state_ += n; + } + + inline seed_type getSeed() const { + return seed_; + } + + inline void setSeed(seed_type seed) { + seed_ = seed; + } + + inline state_type getState() const { + return state_; + } + + inline void setState( state_type state) { + state_ = state; + } + + inline static uint64_t generateSeed( size_t i ){ + return keys[i]; + } + + friend inline std::ostream& operator<<(std::ostream& os, const Squares4_128& be){ + return os << "state: " << be.getState() + << " seed: " << be.getSeed(); + } + + + static constexpr result_type min(){ return 0;} + + static constexpr result_type max(){ return std::numeric_limits<result_type>::max();} + + + +private: + + state_type state_; + seed_type seed_; +}; + +} // namespace detail + +} // namespace random_iterator diff --git a/corsika/detail/framework/random/random_iterator/detail/Squares4_64.hpp b/corsika/detail/framework/random/random_iterator/detail/Squares4_64.hpp new file mode 100644 index 0000000000000000000000000000000000000000..b40c4abf332de665f6e98d8a092a997da0757800 --- /dev/null +++ b/corsika/detail/framework/random/random_iterator/detail/Squares4_64.hpp @@ -0,0 +1,134 @@ +/*---------------------------------------------------------------------------- + * + * Copyright (C) 2021 Antonio Augusto Alves Junior + * + * This file is part of RandomIterator. + * + * RandomIterator is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * RandomIterator is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with RandomIterator. If not, see <http://www.gnu.org/licenses/>. + * + *---------------------------------------------------------------------------*/ +/* + * Squares4.hpp + * + * Created on: 25/02/2021 + * Author: Antonio Augusto Alves Junior + */ + +#pragma once + +#include <stdint.h> +#include "SquaresKeys.hpp" + +namespace random_iterator { + +namespace detail { + +class Squares4_64 +{ + +public: + + typedef uint64_t init_type; + typedef uint64_t state_type; + typedef uint64_t seed_type; + typedef uint64_t advance_type; + typedef uint32_t result_type; + + Squares4_64()=delete; + + Squares4_64(seed_type s, uint32_t): + state_(0), + seed_(seed_type{ splitmix<seed_type>(s)}) + {} + + Squares4_64( Squares4_64 const& other): + state_(other.getState() ), + seed_(other.getSeed() ) + {} + + inline Squares4_64& operator=( Squares4_64 const& other) + { + if(this==&other) return *this; + + state_ = other.getState(); + seed_ = other.getSeed(); + + return *this; + } + + inline result_type operator()(void) + { + uint64_t x, y, z; + + y = x = seed_*state_ ; z = y + seed_; + + x = x*x + y; x = (x>>32) | (x<<32); /* round 1 */ + + x = x*x + z; x = (x>>32) | (x<<32); /* round 2 */ + + x = x*x + y; x = (x>>32) | (x<<32); /* round 3 */ + + ++state_; /* advance state */ + + return (x*x + z) >> 32; /* round 4 */ + + } + + inline void reset(void) { + state_ = 0; + } + + inline void discard(advance_type n){ + + state_ += n; + } + + inline seed_type getSeed() const { + return seed_; + } + + inline void setSeed(seed_type seed) { + seed_ = seed; + } + + inline state_type getState() const { + return state_; + } + + inline void setState( state_type state) { + state_ = state; + } + + inline static uint64_t generateSeed( size_t i ){ + return keys[i]; + } + + static constexpr result_type min() { return 0;} + + static constexpr result_type max() { return std::numeric_limits<result_type>::max(); } + + friend inline std::ostream& operator<<(std::ostream& os, const Squares4_64& be){ + return os << "state: " << be.getState() + << " seed: " << be.getSeed(); + } + +private: + + state_type state_; + seed_type seed_; +}; + +} // namespace detail + +} // namespace random_iterator diff --git a/corsika/detail/framework/random/random_iterator/detail/SquaresKeys.hpp b/corsika/detail/framework/random/random_iterator/detail/SquaresKeys.hpp new file mode 100644 index 0000000000000000000000000000000000000000..0f4d871d281c99a9881c98090acf116e20b60eff --- /dev/null +++ b/corsika/detail/framework/random/random_iterator/detail/SquaresKeys.hpp @@ -0,0 +1,25057 @@ +/*---------------------------------------------------------------------------- + * + * Copyright (C) 2021 Antonio Augusto Alves Junior + * + * This file is part of RandomIterator. + * + * RandomIterator is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * RandomIterator is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with RandomIterator. If not, see <http://www.gnu.org/licenses/>. + * + *---------------------------------------------------------------------------*/ +/* + * SquaresKeys.hpp + * + * Created on: 25/02/2021 + * Author: Antonio Augusto Alves Junior + */ + +#pragma once + + + +namespace random_iterator { + +namespace detail { + +/* +* +* The keys are created so that the upper 8 digits are different and also +* that the lower 8 digits are different. The lower 8 digits are created +* systematically so that all possible combinations are produced. The +* ninth digit is chosen to be different than the eighth digit. The rest +* of the upper 7 digits are chosen randomly. For any two keys produced, +* it is certain that at least one digit is different in the lower 9 +* digits. Testing has shown that this prevents similarities that can +* arise in streams produced by keys that vary only in the upper digits. +* +* Credits: Bernard Widynski in https://arxiv.org/pdf/2004.06278v2.pdf +* +*/ + +static uint64_t keys[] = { + + 0xc58efd154ce32f6d, + 0xfcbd65e54bf53ed9, + 0xea3742c76bf95d47, + 0xfb9e125878fa6cb3, + 0x1ebd294ba7fe8b31, + 0xf29ba87dc5f1a98d, + 0x815a7e4ed4e3b7f9, + 0x63acbfe213f5d867, + 0x67e2d1b542f9e6d3, + 0x682ec13872ecf651, + 0x912f87476ecf14ad, + 0x3cd7581a9de3542b, + 0x548c9decbce65297, + 0x49b37fddcad971f3, + 0x52413dcfe7db8f61, + 0xbf785e3215ac7ebd, + 0x6be5329546e1ad3b, + 0x8b7ef19654e3dca7, + 0x91d763c983d7eb15, + 0x3284b1c872d9fa81, + 0x2af83db87fab18ed, + 0xb185f4cbadcf285b, + 0x53d684c1fbd246c7, + 0x235fda821cd68735, + 0xfd7915843bd985a1, + 0x76f9c4b657cb941f, + 0x19f3e5b765cea27b, + 0xaf6235ea95b2c1e7, + 0x9d827c5ba2b3df45, + 0x8a149e2dc2a6feb1, + 0xa9d234bdcea91d2f, + 0xab34cd621f9c2d8b, + 0x65c348e32c9e3bf7, + 0x7e93bdc54dc26b75, + 0x4b37a2976ab579d1, + 0xf28b71eba6b7984f, + 0x4b2596aed48c96ab, + 0x39a5fc8ed4aec629, + 0x729c8ab1f3b1e495, + 0xb6e4a37323a5e4f1, + 0x6ac4b21652b8136f, + 0xaf89ed465f8932db, + 0xbcae59887ead5149, + 0xd3bec9487b8e4fa5, + 0xbad24f5dcba48e13, + 0xfeca932ed6948c7f, + 0x8ab14351f4768aeb, + 0x8fa96252147acb59, + 0xb479ef53237ed9c5, + 0x69581da875a1f943, + 0x72ae6d4982a4179f, + 0xd5b9184baf98371d, + 0x32dab6fdce8b3579, + 0x12bc48fedb8c64e5, + 0xa763b59feb9f8463, + 0x9d3fe4521a7382bf, + 0x7acf9b254986a13d, + 0x7f482bd43456bf89, + 0x5acef6487369bdf5, + 0x8af4673a926ced73, + 0x2bc59e6ba3721bcf, + 0x9b8a23ddcf752b4d, + 0x71d69231fe563ab9, + 0x8ec74d321e6b5a27, + 0x6cf18d432c5d6893, + 0xa1c6b984394d76ef, + 0xd41735298972a56d, + 0xd6187e9ba765b4d9, + 0x63547dbdc569d347, + 0xf846e95ed46ae2b3, + 0xa84dc2bfe47df231, + 0x89f6da365472318d, + 0x4ea36b932d543fe9, + 0x17fd98a76d384e57, + 0x63f52c987b496dc3, + 0xe874dcba9a5d8c41, + 0xd7e4f9ccb63f7a9d, + 0x5fa74d6fe753c91b, + 0x783c12e1f534d987, + 0xe7c435b21548d7e3, + 0xc128ab66534bf761, + 0xaec842f8724e15bd, + 0x176f8e4a9f61453b, + 0xc48512fcbe2453a7, + 0x6b2a87fdcd498315, + 0x593674ffec4b9281, + 0x5d7f912fe62a7fcd, + 0x9adb3652172f9e4b, + 0xc71f35e54632cdb7, + 0xd2eca7598736ec25, + 0xeb6a51298437fb91, + 0x635c9b49823a19fd, + 0xcd82715baf1e296b, + 0x924e7afdce2148d7, + 0xd5b836c1fd137845, + 0xfb6da2843d2786b1, + 0xa38dbf654b1a952f, + 0x2cb1d736571da38b, + 0x59b3ecf9861eb2f7, + 0x35e297ccb823e175, + 0x847f3c6ba425efc1, + 0xe398fdbdc4281e3f, + 0xa5d3fe4dcdf82e9b, + 0xfdc145332efc4d19, + 0xc8947ae32bef4c85, + 0xea1479f65bf37ae1, + 0xa4efd3576ae4895f, + 0xcb296a7985f697cb, + 0x738c1b6ba5fbc739, + 0x35a6921cb3fed6a5, + 0xb31528eed5e2f613, + 0x965bc7e323e5147f, + 0x8cbf97a651f723eb, + 0x872b1a476feb4259, + 0xc951deb87bed61c5, + 0xfa23b9e98ace7f23, + 0x4d972b1ba9c27d8f, + 0xf4296b1ba6d48cfb, + 0x4c7931a1f4e7bc69, + 0xdb4637f214e9cad5, + 0xdb31c5a324cdea53, + 0x1aeb345764d218af, + 0xbd6aefca91e5382d, + 0x412c9b8bafd73689, + 0xd6578baa9dca46f5, + 0xc32198dfebcd8573, + 0x8a2c6f5ed8ae73cf, + 0x9d8c457219c3a24d, + 0x52f18cd437d5c1b9, + 0x8eb72d5545b8cf17, + 0xcfeb218764bade83, + 0xbca193f7628aebdf, + 0x4ec597dba3b12c5d, + 0x4cf172eedfa43bc9, + 0xd9a614e1fec85b37, + 0x9523c4b21ecb69a3, + 0x398bec154cbd8921, + 0xe62fd8a438af967d, + 0xe7abf3c767a2b5e9, + 0xe9521c3ba8b6d457, + 0x31a5fe6cb5a8e4c3, + 0x5ce34b9ed5abf341, + 0xdaeb2391f3ae129d, + 0x59e3ab2764c3521b, + 0xba1c6e532ea34f67, + 0x6fb127854c976ed3, + 0x57e82a976c9a8d51, + 0x4dba9fe6586c7bad, + 0xfd62e85dc67f9a2b, + 0x129c348fe582da97, + 0xfb85d3cfe495d8f3, + 0xae17f8b324a9f871, + 0x687c23b5438a16cd, + 0xe48a26d8719e264b, + 0xcb24e1998f9154b7, + 0xa5e6c32cbea68425, + 0x46d1e9adcda78391, + 0xde6821fdca6981fd, + 0x78ba1d3fe76c9f5b, + 0xfde38452165faec7, + 0xb73a96d54782ed35, + 0x384ca5776475fca1, + 0xc1643d7a94782b1f, + 0xea1b52da916c2a7b, + 0x4ce23b5baf5d39e7, + 0x7cb82eaede817965, + 0xab637dc1fd6487c1, + 0xfce8da921c57963f, + 0xb83a69132c58a49b, + 0x6a92ef86586dc419, + 0x637a8f4a976fd285, + 0xb2163ceba674f2e1, + 0x4f9853ddc487215f, + 0xa432f17ed1572fab, + 0x361afe5edf5b4e29, + 0xd63948f21f3e4d95, + 0x368fb5e54d527bf1, + 0x6e2438165c438a6f, + 0x1c8df9776a3598db, + 0xef43159cb73ac849, + 0x52e6814ba63cd7b5, + 0xf5b7639dc65fe723, + 0xb72f4c8fe463158f, + 0xaf384952135624fb, + 0xab2591f8715a4369, + 0xa8132fb87f3b62d5, + 0xc12d5aea9d4e8153, + 0xeb364c598b317e9f, + 0xe51c628cba349e1d, + 0x257bf19fe825bd79, + 0xea8c6391f628cbe5, + 0x253e9b82172ceb63, + 0xe8276ab4342de8bf, + 0x1efc56d98654293d, + 0x4ca7512cb12537a9, + 0x2de7ca1cbf2a5817, + 0xfc431a2cbe1c7683, + 0xe124c39cba1c74df, + 0x3ba281d1fb21a35d, + 0xf69b57243a14b2c9, + 0x7298a6365a28d137, + 0x3b4987665618df93, + 0x95c4b8e76419dcef, + 0xd8ea12fa942f1e6d, + 0x93cfd65cb4123cd9, + 0xa34f8e9cbef35c47, + 0xb53d64ffedf76ab3, + 0x64e753832dfb8a31, + 0x83c51d432afc978d, + 0x4bf7829437dea6f9, + 0x791ed52989f2d567, + 0xc73ef4aa97f6e5d3, + 0xe94f2a6cb6e9f451, + 0x7e381b4dc4fb13ad, + 0xc1294afed1fe432b, + 0xb2d59a7543f25197, + 0xf3e9b8532dc46fe3, + 0xa275cf354cd78e61, + 0xec8b3a7549e87cbd, + 0xf3e4bd2767ed9c3b, + 0x47d926a985dfcba7, + 0x3e4618adc7d3ea15, + 0xf7291c3fe4d5f981, + 0x91c53af324c817ed, + 0x956d273543ec275b, + 0xae54193761de35c7, + 0xe2c5a1da9fd18635, + 0x3167ecfa9ed584a1, + 0xf89d531babc7931f, + 0x657afdcfe8d9a17b, + 0xb15a2fcfe59bafd7, + 0x7d54b28217afce45, + 0x28d61bf546a3fdb1, + 0x8fd1b34875b61c2f, + 0x2da37ec763d72c8b, + 0xc23e9a7981cb3af7, + 0x87dbfa4a9fbe4a75, + 0xd34b259dceb278d1, + 0x8643a5cfecb3974f, + 0xe5d3a8721dc695ab, + 0xef7cd65438bac529, + 0x71fd2b6547acd395, + 0xc2e84a68769ed3f1, + 0x5bc38e6ba7b4126f, + 0xa5b67e4dc4a631db, + 0x9ac8526ed1b84f39, + 0x51a4e6bedf8b4ea5, + 0x34d86eb32f9e7d13, + 0x6958ebf43d918b7f, + 0xbcadf2954c7389eb, + 0xe527f3b54b86ca59, + 0x71bfd98ba679d8c5, + 0x1d93c26cb69ce843, + 0xfa45e9dcb37de59f, + 0x7d8b6531f5a4361d, + 0x7bfd654212b63479, + 0x857bc2f541a963e5, + 0x8f6e21465f9c8263, + 0x2ad3ce765c6d71bf, + 0x2e13fb698b719f2d, + 0x75962eddca63be89, + 0x968cf5eed876bcf5, + 0x5b38a711f569ec73, + 0xd6b28f72145ae9cf, + 0x1df2a8c4357f1a4d, + 0x48a13527647238b9, + 0x345fe8ccb1a65927, + 0x1e8564ccbf5a6793, + 0x17d283ca9c4a75ef, + 0xe296a41dcb5e946d, + 0x748a1651fa61b3d9, + 0xb39ad2521b85d247, + 0xd68a5ec54967e1b3, + 0xc812df965769ef21, + 0xe1d53af9845b1f7d, + 0x2d7b5e69835f2de9, + 0x5eb7683dc1824d57, + 0xa9cb375edf456bc3, + 0x87c6a511fe598b41, + 0xed89cbf21e3b789d, + 0x97becd443c4ea81b, + 0x34a96b865b41d687, + 0x41a579b98954d6e3, + 0x2a95c36cb948f561, + 0xa73f846dc65914bd, + 0x5b147f6fe56d243b, + 0xb58dc7ffe15f42a7, + 0x92873bd763748215, + 0x231875b54e358f71, + 0x2ebf7c954b267ecd, + 0xe8b423576c2a9d4b, + 0xe2d34a57682eacb7, + 0x1349e8bdc941eb25, + 0x1725ecfed734fa91, + 0xbf63852fe53618fd, + 0x4bf7e582153a286b, + 0x17c63986542c36d7, + 0xd5b27a1a912f6745, + 0x86fe754a9f2385b1, + 0x6dbf4cebad16942f, + 0x3d56fbedcd17a28b, + 0x91e382ced92ab1f7, + 0xb5a7189fe81dcf65, + 0xb3296fe54832fec1, + 0xb1c85f4768251d3f, + 0xab39512875162d9b, + 0xa613fb49852a4c19, + 0xc7419f8ba21d4b85, + 0xdc9456198cfd69e1, + 0x192f58ccbce1985f, + 0x6b5da74feaf396cb, + 0x6e3729f21bf7c639, + 0x4b3e9ac328f9d4a5, + 0xe71c345768fce513, + 0xc472593765cde27f, + 0x1385f4da96f432eb, + 0x14fd3ebdc3f74159, + 0xafe4891dc1e84fb5, + 0xd1453b2dcfdb7e23, + 0xe48c5b221ebd6c8f, + 0x4d26fe743cd18afb, + 0x95d86fa54ae3cb69, + 0xbadf35e548e6c9d5, + 0x649ecbf987dae953, + 0x95d2c6a984cbe6af, + 0x7d95286cb5cf172d, + 0xba165e71f4e23589, + 0xceb974f212d764f5, + 0x4e79bc3651ea8473, + 0x3abfe5254eba72cf, + 0x897c12e76cbe914d, + 0x3cd4851768c1bfa9, + 0x36159c4ba9b4ce17, + 0x546bea9dc7b6ed83, + 0x16ed2b9dc497eadf, + 0xcd91876326ac1b5d, + 0x9bf65e4434bf2ac9, + 0xcf7a269984d25a37, + 0xa84f7bda91d568a3, + 0xb5c364187fca9821, + 0xb492cde98eab957d, + 0x29f785ddcb8da4e9, + 0xc14bde21fab1d357, + 0xd5728fc219a5e2c3, + 0x8be3d9c659b8f241, + 0x29648ac656ba219d, + 0x3a987be7648b2ef9, + 0xbf4127ca92af3e67, + 0x4f3e6a9cb1a26cd3, + 0x47af91cedfa68c51, + 0x9d745181fe8679ad, + 0xceb963721e7ca92b, + 0xd65e1a732b6ec897, + 0xf796a2865a91d7f3, + 0x21bc7e3989a4f671, + 0x7539fc4ba69715cd, + 0xe8134afed69a254b, + 0x3c5a618fe29d43b7, + 0x98674bffe1af7325, + 0x23c7e91653b48291, + 0xefa789532c647fed, + 0x759d1bc43d679e5b, + 0xbe79df554b59adc7, + 0xac5b31f9897edc35, + 0x4b376f1dc872fba1, + 0xaf75843ed7852a1f, + 0x36d54121f486297b, + 0xf9b478d2146a38e7, + 0x6ade2cb4329d4865, + 0x149acd36528f76c1, + 0xc1e2f5798e72953f, + 0x3b7decf98e65a39b, + 0xe79ca23cbd68c319, + 0xfb51793fea6bd185, + 0x16d49f7fe75bcfd1, + 0x14aec58439721e4f, + 0x9a6ed82437642eab, + 0xafbe526985674d29, + 0x9e57b349826a4c95, + 0x5e1fac2a925c6af1, + 0x932c41bbad3e796f, + 0x2d9f63edce4297db, + 0x69c34711fd35c749, + 0x48f5e9b21c38d6b5, + 0x9d1823e54a5be623, + 0xed8f3b66574ce38f, + 0x46f2edca986123fb, + 0xb19ea6ddc8754269, + 0x5461792dc34861d5, + 0x2fe9b81ed15a7f43, + 0x2179d53dce2b6d9f, + 0x85ce47f32e3f8c1d, + 0x5b9d62e54e32bc79, + 0xd8bf34776b24cae5, + 0x58d192f87b28ea63, + 0xc1be47998629e7bf, + 0x4de82f1cb74e183d, + 0x87f4c5afe74136a9, + 0x14b63da1f8345617, + 0xb256a43214297583, + 0x6bd2c316512973df, + 0xd8ce49376f1c925d, + 0xaf71bdc76d2fa1c9, + 0xb3d84a6a9b13cf27, + 0x4cfe38acba15de93, + 0x2e41bd3ba716dbef, + 0x8591d7e1f72a1c6d, + 0xb45a67e4361e2bd9, + 0x2917f3d768215b47, + 0xf5d2eba9851469b3, + 0xfe59c83cb4278931, + 0x1dceb4a65ef7968d, + 0x89e6cb487ceba5f9, + 0x4a81527cbafec467, + 0x6f2b54ddc9f1e4d3, + 0xa3bde9c32ae6f351, + 0x1e63d78548f712ad, + 0x9f72ab1767fa412b, + 0xdc71e3b764ec3f87, + 0xf9b25a7982cf5de3, + 0x9174f8acb2f38d61, + 0x6d3fca5a9fe47abd, + 0x64ab1371fde79a3b, + 0x6e4f97221debc9a7, + 0xd971a8543aced915, + 0x1c4a9b865ad2f781, + 0xda1b53f878c416ed, + 0x4c16fd8ba7e8265b, + 0x7f8a3e6cb5ea34c7, + 0xe47516adc2ed7435, + 0xa8c52fdfe2df73a1, + 0xa6f1943653d4921f, + 0x5b6df4732ec49f6b, + 0xf2a154643cb6aed7, + 0xf9a1ecb769bacd45, + 0x743b18f7679decb1, + 0x92168deba8c31b2f, + 0x65db129fe6d42a8b, + 0x3c7264ffe4c639f7, + 0x9ebf384213db4975, + 0x1ecb836543bc67d1, + 0x6b24d8c651be864f, + 0x518947a76fc294ab, + 0xfc3e6a198eb6c429, + 0x3895ec7bacb8d295, + 0x79bd84edc89ad2f1, + 0x2fe6b9ddc68bde5f, + 0x4c961af437912fcb, + 0x96f17e8327b54e39, + 0x1be795c763b74da5, + 0x4c9d253984ba7c13, + 0x7db136c9819c6a7f, + 0x8edac12a9d6f78eb, + 0x8439ab2edea2c859, + 0x47a21691fb94d7c5, + 0x9cd7b3821ca9e743, + 0xcda1e5b3287ae49f, + 0xd8ae3bc7689e251d, + 0x8dc1742ba8b14379, + 0x42f76d5cb7a462e5, + 0x4a98165ed4b98163, + 0x415fe36dc1786eaf, + 0x5f2de79dcf6b8e2d, + 0xa8f756321e5fad89, + 0x91f5de843d72cbf5, + 0xce21f5354c85eb73, + 0x5cbe3a654956e8cf, + 0xc4df7e2ba87b194d, + 0x1f82ba9dc56e27b9, + 0x1cf4a83fe6a15827, + 0x2e459b31f2a47693, + 0x57d84ca2128674ef, + 0x1cd538a5417a936d, + 0xf8b539a54f5ca2d9, + 0x4b762d998d6fc147, + 0x65c439f98b62dfa3, + 0x7183a2ccba76fe21, + 0xa39f5d1dc9581e7d, + 0xa3d8ce21f65a2ce9, + 0xf9bca622186e3c57, + 0xbfa7ed2545716ac3, + 0xdc4e672a93758a41, + 0x4d35b9fba145879d, + 0x46e59cb98f49a71b, + 0x23de976bae3dc587, + 0x5f6ec73cba4fc5e3, + 0x3c814a6feb73f461, + 0xb7d4f8c32a5613bd, + 0xbe769c465a69423b, + 0xebd41a97685c41a7, + 0x54be1a79864c5ef3, + 0xc348fa5cb4528e71, + 0x23e7984ba1437bcd, + 0xfa5cb87edf269c4b, + 0x5b497311fe28cab7, + 0xd638bca21e3cda25, + 0xf281bdc54b3fe891, + 0x81cb9a776a4317fd, + 0xbe43f2da9a35276b, + 0x47a1982cb82935d7, + 0x9a5e832ed82c7645, + 0xa26e17ced53e74b1, + 0x8acd63ffe451932f, + 0x139a2f665234a18b, + 0xb4e5c1f43d15afe7, + 0xc692b5354d19ce65, + 0xf18e42b7692aedc1, + 0x9be6d458781deb3f, + 0x26435afed8132c9b, + 0xcdba26ffe8264b19, + 0x1c5724b1f6194a85, + 0xa46178b4352b68e1, + 0x7aefcb95431d875f, + 0xb46c89e8732195cb, + 0xc2d63a987ef2c539, + 0x2e675d198cf6d3a5, + 0xbfe6928babf9e413, + 0x3f8c4a1cb8dae17f, + 0x892e4b5dc7fd21eb, + 0xf36ab95328e13f49, + 0xabc1589327f34eb5, + 0xec1d4f3765f87d23, + 0x68a432f652e96b8f, + 0xd57c2ba761ec79fb, + 0x3b9d8a687edfba69, + 0x83d746bbabe2c8d5, + 0x5b97d621fbd6e853, + 0x9258d7c219c7e5af, + 0x21fda79549eb162d, + 0xb49a18d657de2489, + 0x5d4f6bca98d163f5, + 0x4efd126cb6e58273, + 0x71f8935ba3d671cf, + 0xe71c894cb1c98f3d, + 0xe9f85b3edfbc8ea9, + 0xfc173d632eafbd17, + 0xf9316ba54db2ec83, + 0x2db7c98438a4e9df, + 0xc79b23e769c81a5d, + 0xd15b96c876db28c9, + 0x31ca824cb6ce4937, + 0x3a624d8fe5d167a3, + 0xca42d6e1f4d59721, + 0xabf4563212c6947d, + 0x12d5c9a541c8a3e9, + 0x38eb96554fadc257, + 0x7c3b81276b9fd1c3, + 0x2fe9c5798ba4ef31, + 0xe8691c7cb9a51f8d, + 0x48bda12dc6a72df9, + 0x6c94b281f5ab3d67, + 0xa38d2b92169e5bd3, + 0x519b6ad546c28b51, + 0xb73edf6652b378ad, + 0x251e3f9871c6a82b, + 0x376eb2c65f8ac697, + 0x81fc2a3a9d8bc6f3, + 0x3fa9126dcb9fe571, + 0x1d4ec5b1fa9314cd, + 0x9ba36d521ca7234b, + 0x42fec1a438a942b7, + 0x1d9a2e8768ac7125, + 0xa9584128749d6f81, + 0x3c6bef4a93817ced, + 0x7eab124dc1839d5b, + 0x87eb125edf65abc7, + 0xec31b8d1fe79db35, + 0xdab537e32d6ce9a1, + 0xba712cd43a6de81f, + 0x7fd93b665c93287b, + 0xdbf932a98a9536e7, + 0x54bae38dc89a4765, + 0x41c685bed48b75c1, + 0xe8132f5dc27d843f, + 0xe68d31c1f371a29b, + 0x2e1b9c654385c219, + 0x3ceab1d32e46cf75, + 0xd9e381b54b58ced1, + 0x29d3c5a7695aec4f, + 0x254fa8c8785f1dab, + 0x6c254e7eda734c29, + 0x7cf56b9fe8764b95, + 0x532d9f8fe45869f1, + 0x85679422134b786f, + 0x8b415f24324e86db, + 0xa3d5f4298271c649, + 0x4791afd98f63d4b5, + 0xd2e3cbfbad68e523, + 0xf173c62bab49e28f, + 0xc58ef37ed95c12fb, + 0xcf89342fea5f3169, + 0xbd957f3219624fc5, + 0x37e1b6c329567e43, + 0xce41f72654376c9f, + 0x6ef4ba98734a8b1d, + 0x13bc7529813eab79, + 0x6cdb9f2baf31c9e5, + 0x52a498fdcd24e963, + 0xca73f62eda25e6bf, + 0xb4c73a932c4a173d, + 0x1bd293554b3d25a9, + 0xc9ebf5398a3f4517, + 0x3762e14cba527483, + 0xe4c87f9ba63572df, + 0xf265149dc438915d, + 0xa5418fced12a8fb9, + 0xe12ad8bdcf1dbe27, + 0x2b15cd754f21ed93, + 0xdcab68354b13daef, + 0xa6c942165c271b6d, + 0x8a5234f76b182ad9, + 0xc29af5dcb91d3a47, + 0xf4e3ab5dc71f58b3, + 0x4c73f2bfe7249831, + 0x59c1ab61f314958d, + 0xc8435d632317a4f9, + 0x34cde9a6521bc367, + 0xbe9376865efbc2d3, + 0x2b4c5df87bdfe251, + 0x9a4b76c98bf421ad, + 0x63c9df4ba9e63f1b, + 0x2674539dc6f93e87, + 0x627581fed6fa5ce3, + 0x93c54e8325fe7c61, + 0x7e49586434f179bd, + 0x1c98b27762f4a93b, + 0x9afc283761f5c8a7, + 0xd4592fa87fead815, + 0x34b6a7da9bdce681, + 0xbcd386fa98acf4ed, + 0x84651ab1fae3245b, + 0x84ab36221ae643c7, + 0x3ac625d549ea7235, + 0xbf9ce8a656ec72a1, + 0xc69ae34653ab6efd, + 0x4ecad75983d19e6b, + 0xd71a62fa91e3acd7, + 0xbfc94d5bafb7dc45, + 0x6e78c5b1fdc8eab1, + 0xa4cdb7921cabe92f, + 0xc8b2df543acf198b, + 0x2ab986e65ac238f7, + 0xae6c3bfa9ad64875, + 0x1c4f298ba5c976d1, + 0xcbf8371ba3cb854f, + 0x5aeb9c3ed2ce83ab, + 0x94625be1f4d1c329, + 0x6bf9471432c4d195, + 0x1d9528f43d96cfe1, + 0xefa49dc43b98ed5f, + 0xac27f3d6598a1ecb, + 0x15e6ca8878af2d39, + 0x89c2ab5ed8b24ca5, + 0xbfd5219fe8c67b13, + 0x61d725cfe3b8697f, + 0x75bce8f2139a87eb, + 0x6d5412b432aeb759, + 0x849e625872a1d6c5, + 0xa62db4e98fa5e643, + 0x68d3ac487c86e39f, + 0xefa743ccbc9a241d, + 0x6c294adfebad3279, + 0x142957bed89f41e5, + 0xf796bec219a27f53, + 0xfb35d6e325846daf, + 0xcf76a3d654978c2d, + 0x2e7b6cd6526bac89, + 0x4b2619d9817dbaf5, + 0x3784a96cbf81ea73, + 0xdc269b1bab63e7cf, + 0x64a79211fc97184d, + 0xc26e37f21d7a26b9, + 0x7ba64f943b9d4627, + 0xa3be9f254a8f6593, + 0x4e3a821a968273ef, + 0x26cf391cb485926d, + 0xd571863dc367a1d9, + 0x163c8abed16abf37, + 0x58ac2d4cbf5dcea3, + 0xfd9782654e73fd21, + 0x5e6417843e641c7d, + 0xe625b8a54c562be9, + 0xb39c74598c6a3b57, + 0xf372c6dba86d59c3, + 0xa6145dedc86f7941, + 0x5b81d9afe452869d, + 0x4dcb5e71f375a61b, + 0x7b5af4e21259c487, + 0xd3a21e76516ac4e3, + 0x9dbe5c387f5de361, + 0x27eb4d598e6312bd, + 0xd2635c4bad76413b, + 0x6f539e4dcb463f97, + 0x2156d4adc8495df3, + 0xed9a5341f84c6d71, + 0x4576b8e2153f6acd, + 0x8562d4f436529a4b, + 0x7adb94876234c9b7, + 0x762bc39ba148d925, + 0xb93fea598f3be791, + 0x4cab7d298a2be5fd, + 0x1f53c49fed41256b, + 0x3a6c5d11fb2534d7, + 0xbef52a321c297345, + 0x8f2d3ac6594a73b1, + 0xe18c9457674c812f, + 0x92acd417642e8f7b, + 0xe2f1b3aa9432ade7, + 0x7c3d48ecb124cd65, + 0xf632541baf27ebc1, + 0xc658e2bedc19ea3f, + 0xe8d52f943d2e1a9b, + 0xfab958276d324a19, + 0x824c5af87c134985, + 0xfba4d85a9a2867e1, + 0xd7e5a81cb71a865f, + 0x1d9463cba51d84cb, + 0x36792fced51fb439, + 0xb8ae97d1f413d2a5, + 0xaedcb9176547e213, + 0xf84ecd632bc5de6f, + 0x2a9fe5754ae81fdb, + 0x9327cad76afc2e49, + 0x3fa6cb8878ef3db5, + 0x9fd674ecb9f47c23, + 0x5f7836bdc5e46a8f, + 0x12f7b95ed3e678fb, + 0x4a267e3213fcb869, + 0x8921fa7432feb7d5, + 0x9fae754982f1e753, + 0x5ef2c4976dc3e4af, + 0x62f51a7a9ce8152d, + 0x849732fbaceb2389, + 0xf26c5a3cb9dc42f5, + 0xa75b64dfe9df6173, + 0xbefa682217c26ebf, + 0xc74b56e326c58e3d, + 0x35d97f2543e68da9, + 0x9eacbf3763eabc17, + 0x265a49d871cedb83, + 0x65db3c187ca1e8df, + 0x5e1d297cbec4195d, + 0x65ac8ed1fbd627c9, + 0xcafd3be21cdb4837, + 0xa4ed1b9329cd56a3, + 0x6b814d7659cf8621, + 0xd41efab986c2937d, + 0x21796b3984c5a2e9, + 0x6df7a15cb3d9c157, + 0xf8ce714ed1a9cfb3, + 0xd4e2568cbf9cde31, + 0xbe149fa43fa21e8d, + 0x478d9f543da42cf9, + 0xd3a58c154db83c67, + 0x91f5cd7768b95ad3, + 0x7f352a6a98bd7a51, + 0x375cf19cb49f67ad, + 0x15289f6fe5c3a72b, + 0xe2964dc1f2b4c597, + 0x2659e3c212a8c5f3, + 0xc46bf9a652abe471, + 0x265b8e354e7bf2cd, + 0x167243c98ea1324b, + 0x53e6da7a9da541b7, + 0x5f169e4dcba86f15, + 0xe98ac1fed79a6e81, + 0x8ca2b911f47a6bed, + 0x8a2d9c42147f8c5b, + 0x745bafc43482bac7, + 0x6329c4d87296da35, + 0xbfa439776297e8a1, + 0xdefab1c98d6ae71f, + 0xf16492bbad8e167b, + 0xa86f597edc9135e7, + 0xd3b8ca41fca37465, + 0x3e184dc32b9874c1, + 0xc8659215497a823f, + 0x73fd52c5456d819b, + 0xa2478937635d9ef7, + 0x795bd13ba382ce75, + 0x1498635ba275ecd1, + 0x479265ebad57eb4f, + 0x2d19a871fe591cab, + 0xf58ec9321d6e3b29, + 0xc7adb2f43d714a95, + 0x4befda665b7468f1, + 0xc5ad813a9a45876f, + 0x34c6951ba64985db, + 0x79e531adc36db549, + 0xa1ef728ed26fc3b5, + 0x57e86491f185e423, + 0xd7a582443265e18f, + 0x3daf9c854e5821fb, + 0x513a47c76d4b2f59, + 0x542f36b87a4d3ec5, + 0x15d876fbab617d43, + 0xdb32e69dc8436b9f, + 0xa8dcbf5fe7468a1d, + 0x8a6931d1f438ba79, + 0xc3e869f2143cb8e5, + 0xba6287d6524fd863, + 0x4e915ab87142e5bf, + 0xce2f176a9f47163d, + 0x97ef8c6cbe3824a9, + 0x34a7d1ecbd3c5417, + 0xea2b8f9edb4e6283, + 0xd98c7f1fe94271df, + 0xcbe7d8f219238f4d, + 0xaf2edcb436258eb9, + 0xbf5ed7176539bd27, + 0x5a824b98742bdc93, + 0x3a986b18712dc9ef, + 0x43e6829cbf231a6d, + 0xe86b145dce1528d9, + 0xba2e8741fd1a3947, + 0x51dc67432d1c57b3, + 0xb63a92e65b2e8731, + 0x5739fac76a21948d, + 0x2c94f5b98714a3f9, + 0x875126ccb518c267, + 0x1235f46cb529c1d3, + 0x78a4bf2dc32bdf41, + 0xb54da2e98acbfe9d, + 0x9bf361254df23e1b, + 0xbef1a4d32cf43d87, + 0x516879e54af75be3, + 0xce28f3a659fa7b61, + 0x596c13d875fc68bd, + 0xefd8273ba5ef983b, + 0xf578219ed4f2c6a7, + 0x6159fb7fe3f6d715, + 0x3e97416323f9e581, + 0x6759c3b541c9f3ed, + 0x739ca1576fde135b, + 0x7129d5e98de142c7, + 0x168dcbfbace67135, + 0x978ca23cbad76f91, + 0x28c579eba5b86cfd, + 0x493ba581f4ec8d6b, + 0xf5732a6214cf9bd7, + 0x4fb6752436e2db45, + 0x4e1ac8d763d5e9b1, + 0x13d8acf761c7e82f, + 0xdf82ba976fdc178b, + 0x5436fe8a9cbd26f7, + 0xf5d4c16fecd14675, + 0x65ad7e31fac475d1, + 0xad5fc6321ac7834f, + 0x1d4bfa5436d982ab, + 0x9c1de34656cdb129, + 0xf1785d2763aebf85, + 0xa61d95b984a3cde1, + 0x2b41538a91a4ec5f, + 0x19cb584baf971dcb, + 0x26ac57b1feab2c39, + 0x692bed821d9e3ba5, + 0xe69d1a765dc27a13, + 0x96da5bc54ab3687f, + 0x3c981f7547a586eb, + 0xf59b641984cab659, + 0x489257eba39db4c5, + 0xa21d834dc2afd543, + 0x64b2e9aed1a3e29f, + 0xace671b654b7231d, + 0xc67df8e54fba3179, + 0x3bcd6e954c8a3fd5, + 0x89a5db687b9d6e53, + 0x98fc31a879816caf, + 0x285174bdc7948b2d, + 0x61fcd27fe475ab89, + 0xac3bd79fe378b9f5, + 0xf73bac22148cd973, + 0x4fb57c84327ed6cf, + 0xa2351cd982a3174d, + 0x1af8e4c87f8625b9, + 0x923d845cbe9a4527, + 0xcd49736cbd8c6493, + 0xa26e4f7cb97c62ef, + 0x1e854a71fa82916d, + 0x67f83d4217638fc9, + 0x6e1bc4a32586be37, + 0x8ae239665468cda3, + 0x76f12db9847bec21, + 0x5fde6919815efa7d, + 0x5a63271cbf632ae9, + 0x817c54bede863a57, + 0xec986521fd6958c3, + 0xfc819a732d6c7841, + 0xb597f8c32a4e759d, + 0x95184c776972a51b, + 0x5e92461ba964c387, + 0x4de71b6ba567c2e3, + 0x2e5d9fadc47ae261, + 0x75e934acb149efad, + 0x149d8eadcd5e1f2b, + 0x432bd5e21f523e97, + 0x9a58b4632d465cf3, + 0x7baf82d65d496c71, + 0xe6f83c46583a69cd, + 0x2dfe538ba73e894b, + 0x587a2fbed641c8b7, + 0xcfdba72fe764d825, + 0x39b6c151f347e691, + 0x2ec67f321238e4fd, + 0xdce458b8725d146b, + 0xafbc24e76e4f23d7, + 0x2b83fe5bae637245, + 0xe7b13c2bad4672b1, + 0x97f1a63cba387e1f, + 0x29e7846ed62a8e7b, + 0xa3479be1f52d9ce7, + 0x467fda932831dc65, + 0x7ca41fd65634eac1, + 0xf3dba5287426e93f, + 0xda6c8f98723a189b, + 0x7c9fb82baf2d3819, + 0xfe12468cbd1f3785, + 0xef24c9bedc2376e1, + 0x4951db8feb16845f, + 0xa9b1c8e32a1783cb, + 0xc9124d66581cb239, + 0x4f253c77672ec1a5, + 0x5bf2ac998632cef1, + 0x13f56dba9413ed6f, + 0xf17e8b3ba3261edb, + 0x5c27f68cbef82d49, + 0x3f5a612fedfa3cb5, + 0x5b2ca8421cfe6b23, + 0x62d5fe143be1698f, + 0x81fc9ed549e387fb, + 0x9e1dfa2548f5b769, + 0x4963edc984f9b6d5, + 0xe98c2dbba4fcd653, + 0xbae831ca92ced3af, + 0x1ac2f39fe3f5142d, + 0x3cae279541f63289, + 0x7e5c4ba43ed941f5, + 0xda13b2e54cdb5f63, + 0xd68cb59548ac5dbf, + 0xe59cda8879e18c3d, + 0x8493d71cb6e38ca9, + 0xe3b92fced5e6cb17, + 0xe3b2ac51f4e9da83, + 0x9be2745213bac7df, + 0x6b4ac5e432bef75d, + 0x4f36e2b871e326c9, + 0x21de38ba9fd84637, + 0xda96efb98ed965a3, + 0xc81be73babdc8521, + 0xf17ba62dc9be827d, + 0x5e29d4c1f7c2a1e9, + 0x7c5b6a3218c3bf47, + 0x3acf915325a6ceb3, + 0x1a295fb765b9ed31, + 0x2ed38746529afb8d, + 0x836e954872ae1bf9, + 0x3d478bebafc23b67, + 0x31fa65edceb659d3, + 0x28ec75b1fdca7951, + 0x625879c21c9b76ad, + 0xd27fc4b438ae962b, + 0x6fa4192658b1c497, + 0xb753cae987a5c4f3, + 0x94bf178ba5b8e371, + 0xcd478fbba398f1cd, + 0x67bca52fe3ad214b, + 0x581eadfdcd8e2fa7, + 0x1ecf6b932fa36e15, + 0xc2f765843ea56d81, + 0x148dab543b876aed, + 0x912d8e75497c8a5b, + 0x42731ed9856ea9c7, + 0xa5e2b46dc7a1d935, + 0x59f64b8ed594e7a1, + 0xfb8ea53ed397e61f, + 0x8743fea3239a157b, + 0xafcb31e6519c24e7, + 0xdeba41987e9f4365, + 0x75269bd98e9473c1, + 0xf5ec319bac96813f, + 0xfd1b52adca567f8b, + 0x2da9b8edc65a9df7, + 0xcb817261f46ebd75, + 0x67cb48943672ebd1, + 0xa614dbe32573ea4f, + 0xa46b3fe6537619ab, + 0xa264b979817b3a29, + 0x72f9e53baf6d3895, + 0xf69d783bac6e57f1, + 0x8aeb35cedc72856f, + 0xde9cba11fa6584db, + 0x9a2d6b521c68b349, + 0xef698db4386ac2b5, + 0x148e2da7687ed123, + 0x94fde1598451de7f, + 0xc27d41aa93641feb, + 0x3bf7a56dc1672e59, + 0xd6c5fe2cbf493dc5, + 0xbc1952e1fe5d6c43, + 0x35cbef921c3e5a9f, + 0x2a8e9b354c53891d, + 0x34eba2f65c34b879, + 0x2cf974576938b7e5, + 0x3f18d47ba84bd763, + 0x3b67ecfa953cd4bf, + 0x67dc291fe672153d, + 0xa75b18e1f16523a9, + 0x3ca8fbd542695317, + 0xbc9fed365f4b6183, + 0x71cdb9854b2a5ecf, + 0x312d47e76a2f7e4d, + 0x29cb1f687a328db9, + 0xc1a462fed935bc27, + 0x64718b2fe627db93, + 0x78293baed429c8ef, + 0x6cb79fe2142cf86d, + 0x89d7b5a7654127d9, + 0x13f8749ba1253847, + 0x2d47853a9f1856b3, + 0x4efdc81bae2b8631, + 0xf35d91bbab1c738d, + 0x124f3a6dca1e82f9, + 0x5b397c61fa23c167, + 0x791cb8d32815bfc3, + 0xfa893b165728de41, + 0xb16a98e65418fc9d, + 0xb9d7e619853e2d1b, + 0xed3f4c7cb4213c87, + 0x3a81652a9df25ae3, + 0x73a12f5dcdf57a61, + 0x4bfd396feaf867bd, + 0xc6d394521afc973b, + 0x5ce1d68328feb5a7, + 0x13eca9f879f2d615, + 0x68bd321a97f5e481, + 0xc65d3f7984c6f2ed, + 0x2d5e691dc4fa125b, + 0x5c72e64cb2fd31c7, + 0xec62a98cbdce4f25, + 0x7158b4e32fd36e91, + 0xed3f5b432ac46bfd, + 0x1abdf6943ae78c6b, + 0x7d51fb2546eb9ad7, + 0xd71f9c5987deca45, + 0x9d43156ba6d2e8b1, + 0x48af192cb5c4e72f, + 0xd5b2e7a1f3e7168b, + 0x729cd64213da25f7, + 0x8dac9e7761ed3475, + 0x38f2ea965ebf64d1, + 0x694128587dc3824f, + 0x3c2b6ad87cd581ab, + 0xf42dec5cb8c7af19, + 0x76913cbed6cabe85, + 0xe793b8d1f59dbce1, + 0xf136ead326a1eb5f, + 0xa82e5f6435d41acb, + 0x49dcfea764d72b39, + 0x396be2c871db39a5, + 0xb19c27698fbd6913, + 0x5dce63aa9cae567f, + 0x29f8531edca285eb, + 0x6bd852a1fac6b459, + 0xbc4d897219a8b3c5, + 0x679d342658abd243, + 0xd2b85fe5458cd19f, + 0x36eba41a97b4321d, + 0xdc4b8f5ba3b42f69, + 0x3cf1e5dcb1a73ed5, + 0x92e685bdcf9a6d53, + 0xb726ad9fed7c5baf, + 0x6e8dac421c8f7a2d, + 0xd491ec543d72ba89, + 0x9f4e8ca43a94b8f5, + 0x1fa2476656a9d873, + 0xba316ec98479d5cf, + 0xb6129d8ba38cf54d, + 0x54cb391fe5a124b9, + 0x8b617931f1b65427, + 0xd6b8c12541b86293, + 0x89cb21743d7961ef, + 0xca56e2f43c6b7f5d, + 0xb823a1d54a5f7ec9, + 0x6fac481a9a82bd37, + 0xad6f317cb875dca3, + 0x26451e8ed678eb21, + 0x6afb1d9fe35af97d, + 0xf3785cb3246d18e9, + 0xc743bd2764a13957, + 0xf1e7b249819457c3, + 0x1b829e7baf698741, + 0x7edc26198e5a749d, + 0xdbc9518bac6d941b, + 0x96752c4eda5fb287, + 0x28d34ac1f974c1e3, + 0x51a93fb32976df51, + 0xba1463832546fead, + 0xfdeb5468756a1e2b, + 0x7fe3dc69835e2d97, + 0xe6c4f21ba2715bf3, + 0xd86e529dcf546b71, + 0xcd6794acbe3568cd, + 0xb9738641fd3a984b, + 0x4d75e8f21c3da6b7, + 0x1acd69443a4fc725, + 0x4285ac687a63e591, + 0x1a7629498745e3fd, + 0x3b98de2dc759136b, + 0x8a459fddc45b32d7, + 0xc8524b7ed27e6145, + 0x8a6e734ede426fa1, + 0xcfb79ed32e347d1f, + 0xabe2cd743e258d7b, + 0x9ced3a154c289be7, + 0xc9632ab8792dcb65, + 0xa5d6c719873fd9c1, + 0xc1f5e67cb742e83f, + 0xa3986b2fe635179b, + 0x4b8a19d1f54a3719, + 0xafd34722142c3685, + 0x394d6fc8723d65e1, + 0x8d41ec687e21835f, + 0xdba62ef87e1482cb, + 0x8647f3dbad27b139, + 0x7f481d5dca18bf95, + 0x83f724ddc72abdf1, + 0xd7145f3cb51edc6f, + 0x1ac8269547231cdb, + 0xe3cb6d1657162c49, + 0xf24bd31874183ab5, + 0x7d3ab62a941c6a23, + 0xbc5432d76dec578f, + 0xdc6a51f98ade76fb, + 0xf25b4c6edcf2b569, + 0xa6278d3fe9f6b4d5, + 0xc5d746921af9d453, + 0x571bed4436e9d2af, + 0xf1bcd49656ecf12d, + 0xdce4528ba6f23189, + 0xe8a4163a92d43fe5, + 0x12dc689cb1f85e63, + 0x82573a6a9ed85cbf, + 0x25d83641faec7b3d, + 0xa5fe36b21cdf7ba9, + 0x92fe78554be3ca17, + 0x96eb73c54ae5d983, + 0xe87f591545b7c6df, + 0x4963c51984caf65d, + 0x69edb12ba4de15c9, + 0x6b42198ed6e14537, + 0x9a825b41f1e564a3, + 0x3f7d841653e98421, + 0x89c761443fca817d, + 0x2614d9c43cab7fd9, + 0x741d6ba659bfae47, + 0x54fa36d878a2cdb3, + 0xe2d315fba8b6ec31, + 0x92d57badc4b6fa8d, + 0x1ba5936fe4cb1af9, + 0x8d6eb34214ce2a67, + 0xb1329e4764c158d3, + 0xb836de1a92d47851, + 0x72b819c54fb675ad, + 0xa821bd987eca952b, + 0xc65d7f298cadb397, + 0x4a6eb7ddc89eb2f3, + 0x25689c11f9b4e271, + 0x8562bac21684efbd, + 0x921eac7546a81f3b, + 0x4138e6c6549b2ea7, + 0x691e4db983ae4d15, + 0x8b2175fba3b26c81, + 0x65e72fbbaf8369ed, + 0x97b35f4edea6895b, + 0x321ce581fd69a8c7, + 0xc793afe21b9dc835, + 0xde98f6b4398fd6a1, + 0xb3a145776893e51f, + 0xc7f28e4a98a6147b, + 0x6537adccb5a923e7, + 0x35184baed3ac4265, + 0x8a5791ced39e62c1, + 0x2584d97dcd817e2f, + 0x429bf6521f637e8b, + 0x6b854ed32d659cf7, + 0x82967f443d69bc75, + 0xdb2896e6586bcad1, + 0xbe92d179876ed94f, + 0xb27fc8aed67318ab, + 0x8b97c12fe5a63829, + 0x9c7bd521f28a3795, + 0x5d76bf83238b56f1, + 0xf85e9264318d746f, + 0xe17dabf65f6183db, + 0xebdfa3998e75b249, + 0xa7de468a9d67c1b5, + 0xa31d47fcba69cf13, + 0xa2718dccb64acd7f, + 0x215dcb9ba54dfceb, + 0xca8342d218732d59, + 0xca318d4324763bc5, + 0xf196da7982796b43, + 0x56a8d9f8714b589f, + 0x4db1f63a9f4e781d, + 0x7ae3854dce41b679, + 0x5b96a7fedc43b6e5, + 0x3791c5e1fb48d563, + 0x2e5b69721948d3bf, + 0xbfc71255485bf23d, + 0x9124e787675f12a9, + 0x3e2648acb9845217, + 0x8f5491acb2465f73, + 0xd6be4c5ba1375dcf, + 0x36e541fcbf2a7c4d, + 0x493c6571fd2e7cb9, + 0x16b298443e41cb27, + 0xde3168c65c24da93, + 0x82bec7d54925c7ef, + 0xa43ed6265829f76d, + 0x6f59374ba73c16d9, + 0x4e7a8bfdc83f2647, + 0xdc72ba5fe74265b3, + 0xb342e1c1f2478531, + 0xf16289e54139728d, + 0x81b7af354e2b81f9, + 0x5eb328f54c1daf57, + 0xeb5a1c287a21bec3, + 0xc4216eda9a25ed41, + 0xd238c46ba715fb9d, + 0x152973afe7392c1b, + 0xbde16831f51d2b87, + 0x15cfd8e3261f49e3, + 0xdb4fc13985237961, + 0xfa453e19821476bd, + 0x723b16d65ef7963b, + 0x4dc1e9876df9b4a7, + 0xd51e2fba9afdc415, + 0x58da9c3cb9efd381, + 0x4c2a938cb7c3f1ed, + 0xca7d265439f7215b, + 0xf16745e435e82fb7, + 0xe9cb643876fb4e25, + 0x9fd2b45873fe5d91, + 0x5d13f27982e16afd, + 0xd2a1e47a9fe38a6b, + 0x87f9245cbce5a9d7, + 0xec6291b1fbeac945, + 0xfcab649329ecd7b1, + 0x1b68e95438bed62f, + 0xbe43da5769e3158b, + 0x42a83c1a98d624f7, + 0xfd8e672cb6ea4375, + 0xe6bc134ba4eb63d1, + 0x4ea169fcb2cd714f, + 0xe145963edec17f9b, + 0xef57c8a32fc4ae19, + 0xe5c9ab632ec6bd85, + 0xb17f6a2549a8cbe1, + 0x31286755479bda5f, + 0xa9b135f7659ef8cb, + 0x6fa93e2dc7d42a39, + 0x536981bfe4d638a5, + 0x6a5c4e31f4da6813, + 0x24cefb7212cb657f, + 0xb8259e7431ad74eb, + 0x1c3925a76fc1b359, + 0x836cadb87ea4b2c5, + 0x83fac6da9cb8d143, + 0xc6be1d4ba697ce8f, + 0x72c84bfba579edfb, + 0xa2641e9ed5af1e69, + 0xf3857b4217a23cd5, + 0xeb7d6f3324b76c53, + 0x823ce17542b759af, + 0x98a74db761ab792d, + 0x4b7982e65f6ea789, + 0xc1e685fbad91b7f5, + 0xfd237b5feca4d673, + 0x7189adffe986d4cf, + 0xca4329521a89f34d, + 0x2eb318d5478d13b9, + 0xfb3c879768af4327, + 0xc4f5321ba7b46193, + 0x1a5b7dea92845edf, + 0x79fde58cb1987e5d, + 0xe36cf2acbf5a7dc9, + 0x513b8641fd6eac37, + 0x64cedb132e71dba3, + 0xdc5163254c85ea21, + 0xe97264543a65f87d, + 0x3bd769e6586a17e9, + 0x6f4d28ecb69d2857, + 0x84ea1fdcb58f46c3, + 0xc61af7bfe5a38641, + 0xd24695a1f185739d, + 0xdb9fc5a54278931b, + 0x9f2cbe143f5cb187, + 0x5f8a76b54b5cafd3, + 0x1a63ce598b72de51, + 0x98c6ef387853fcad, + 0x72ea819dc9671d2b, + 0xd218b79fe65a2c97, + 0x512c48afe56c4af3, + 0x7fad43c3246f5a71, + 0xef89b255435267cd, + 0xda49e5198165974b, + 0x27afbce76f38a5b7, + 0xd734b65a9e4bc625, + 0xc68be5dbab5ed491, + 0x8269753cb951e2fd, + 0x7c248161fa75126b, + 0x841fdb632a5831d7, + 0x76f1c3d3286a4f35, + 0xd9a53f18764c5ea1, + 0x5f6b7ed9834e6c1f, + 0xc532fe9ba1428c7b, + 0x7429fa6cbf249ae7, + 0x1f39c42ede28ca65, + 0x4175bd81fb3ad8c1, + 0xae4f93c21a2cd73f, + 0x1b7ce4365c42169b, + 0x46357b998b453619, + 0x4a31657cba293485, + 0x623195ecb73a64e1, + 0x2587c63cb43c725f, + 0xf947ac2ed23f71cb, + 0xcfab683ede13af29, + 0x43b58e932f14be95, + 0x1ac78d954d27bcf1, + 0x8c7e25354a19db6f, + 0x3987abd6571cf9db, + 0x349bfd2dca312b49, + 0xcbf1843ed81439b5, + 0x91ca84ffe7186923, + 0x14b9735fe31a568f, + 0xc9d8ab33231c75fb, + 0xac1fd396521fa469, + 0xb3ed24a76ef1b3d5, + 0x72f351998cf6d253, + 0x3e56281879e6d1af, + 0x876e5c3a97c8ef1d, + 0xe954186cb6ec1f79, + 0x9a674e3cb6cf2de5, + 0x7f6832c218f25d63, + 0xcf67a35323e45abf, + 0x6efa319652f87a3d, + 0x293bd14651fc78a9, + 0x32cf9d876fdeb917, + 0x2583d6ebace1d783, + 0x756d32fba9b3c5df, + 0x5da329ffe9c7f45d, + 0x785dcfb328ea14c9, + 0x69db1a2659ed2437, + 0x37bd51e767df52a3, + 0x67e3b1dba7e58321, + 0x81a5f6ba92c47f6d, + 0x1e79b5dba1c67ed9, + 0xe27586ca9fcbad47, + 0x36d95c21fd9eacb3, + 0xf6c152354dc2eb31, + 0xde86b5a32ab3f98d, + 0x8f2571e54ac618f9, + 0xa6827fc658db2967, + 0x3bc7ed6a96bc47d3, + 0x8217e39cb4cf6751, + 0x38abf42fe3c274ad, + 0x9c318d71f1d6942b, + 0x8d5c24e431d8b297, + 0xd3a916254e9ab1f3, + 0x19e2dab54b9dcf61, + 0x3ef276465981febd, + 0x19c5462989a51e3b, + 0x624b9f8dc8b62da7, + 0x129fbdcfe7ba4c15, + 0xc81b2561f4ad5b81, + 0xed32ca92139f58ed, + 0x65edc78543c2985b, + 0x6c3abd4651b4a6c7, + 0xce19fda76fa9c735, + 0x3d4e81a87e8bd5a1, + 0x657cf31a9a8cd41f, + 0x2cb8163feca2137b, + 0x5b42d691f9a532e7, + 0x1fd679332ab94165, + 0x5a4cd9e436895fb1, + 0xea6fb1d6548b6d2f, + 0x4312ef66527f6d8b, + 0x7b2f431ba1829bf7, + 0xe5f9d87baf84cb75, + 0x914cf7ecbe67c9d1, + 0xf3cb482feb6ad84f, + 0x974d65c2195df6ab, + 0x4b386a165ca13729, + 0xa3e69c587ba43695, + 0x5c62871ba79865f1, + 0x96ed74acb48a736f, + 0x19de74cba36c72db, + 0x2476ec5ed27fa149, + 0x85e761cede62bfa5, + 0xb7f9ea832f76ce13, + 0xea68bc432b46dc7f, + 0xa745df943948faeb, + 0xc3b92d587a6e1c59, + 0x27c6195cb9713ac5, + 0xe892357ed9856a43, + 0xc52f34eed346579f, + 0x5123dc81f35a871d, + 0x2eba6c92124da579, + 0xe2ba8df4316fa4e5, + 0xa36c75d98f72d463, + 0xf6abc5d87c45d2bf, + 0x172befaa9b58f13d, + 0x8739e56edb5c21a9, + 0x41537f2cb84c2ef5, + 0x6b9571a1f9615e73, + 0xa4c3e6b217435bcf, + 0x76891ae325367b4d, + 0x8364172652387ab9, + 0xf51a6479814dba27, + 0x8a9fc4587e2fc893, + 0xd246f83a9b32c6ef, + 0x92baef8dcb24f56d, + 0xd34127c1fb3815d9, + 0x9acd62b21b3c2547, + 0x8fa34797692e54b3, + 0xbc82ea6a9a628431, + 0x3d26f84ba634718d, + 0x369fcd7ba3257fe9, + 0xe79f541dc129ae57, + 0x57cf2d4a9f1badc3, + 0x623afc7feb2fdc41, + 0xfa5874d43c12fa9d, + 0x24916df65d362a1b, + 0xf2ed61965c192a87, + 0xd2e3ba18791b48e3, + 0xa7c1348cb92e5861, + 0xb1ae439dc62175bd, + 0x76b2da8fe614953b, + 0xc91e53d1f216b3a7, + 0x2b3d97c7642ac315, + 0xf9dac8354efbd281, + 0xd427b8c438eabfcd, + 0xd5c3fe887ae21f4b, + 0xdba3795989f42eb7, + 0xed6c1a7cb9f84d25, + 0x23145c9ed6fa5c91, + 0xe34629adc3eb59fd, + 0x764a982213ef796b, + 0xafdb829543f2a8d7, + 0x9e3546d871f6c845, + 0xde7694f65fe8d6b1, + 0xdf8265987bcad52f, + 0xef19584879cdf38b, + 0x2a63584dcad123f7, + 0xcb59a481fae64275, + 0xe92a7f8439e862d1, + 0xfd5c483325c96e3f, + 0x57a693f543dc6e9b, + 0xfd1832e763cf8d19, + 0xe4687dba91e2bc85, + 0xec49b6d98fb5cae1, + 0x82c6fd3bacb7d95f, + 0x74d5ac8fe8a9f7cb, + 0x8b314ac32bce1839, + 0xce8a12754bd137a5, + 0x1cbf92498ad56713, + 0x3cb816da95c8647f, + 0x71bf643984c973eb, + 0xf9248d7cb3cda259, + 0xbcf68e4ed2bfa1c5, + 0x31f5cb7edea4cf23, + 0x4bf982c21e94cd8f, + 0xb1e34cd32a86ecfb, + 0xb73a28e54cab1d69, + 0x7ba4ed87689e2bd5, + 0xe439625ba9c16b53, + 0xb2ae143dc6b358af, + 0x1873f49fe4b6782d, + 0x1958ec61f2cba689, + 0x5d7c4f62129ca6f5, + 0x23dfa1c541afc573, + 0x1efb6a465e82d3cf, + 0xd4baf8987c96f24d, + 0x81e96ad87da812b9, + 0x68721b5edbac4127, + 0x2986143dc79d4f83, + 0xf379ca5fe6815cdf, + 0xcf9ed62216937c5d, + 0x5fce948323857bc9, + 0x17ec98b65289ab37, + 0x3e5cfa47617dc9a3, + 0x6da9cf498e7fd921, + 0xc468bf3bac82f67d, + 0x67b513aedc8516e9, + 0xc9a53261fc9a2657, + 0x5d2643821a8b45c3, + 0x67fa49c43a9e7541, + 0xde7c46965681729d, + 0x75d6c3eba685921b, + 0xfc381e9cb285af67, + 0x2e367dccb168aed3, + 0x6487e5bbaf6bcd51, + 0xad7549fdc94febad, + 0x28be61f43e741c2b, + 0x472afb843d652b97, + 0xf4cb8a365b6849f3, + 0x59a23bc98a6c5971, + 0xfb7e5a2a974e56cd, + 0xc45e16fed571964b, + 0xb23146cfe263a4b7, + 0x491e7831f178c425, + 0x67bf8e55426ad391, + 0xf81c9b443e4ac1fd, + 0xe85cb6754a3def5b, + 0xadc926498b532fc7, + 0x67fbd18bab674e35, + 0xbed93f5dc9485da1, + 0xa195384ed74a6b1f, + 0x724ea681f43e6a7b, + 0xf17b46932541a9e7, + 0x2843c9b87243c965, + 0xa962b7598246d7c1, + 0x5ef628b87e29d63f, + 0x8eb164587d2cf49b, + 0x93847cecbc4f2519, + 0xad968b7fec624385, + 0xd14a29e1fa4763e1, + 0x14b9efd32a39715f, + 0xe8b1f4c435296fab, + 0xc48af757653d8e29, + 0x45aef1298431bd95, + 0x31a8d25a9234cbf1, + 0x4827fd1a9e15da6f, + 0xe16d284bac17f8db, + 0x13de6741fc2d1a49, + 0xc6f7b4a43c1f28b5, + 0xd1298fc87c146823, + 0xeb62a4d87a14658f, + 0x1fedb6aa961874fb, + 0x78f5241cb51ca369, + 0xf194de6cb41ea2d5, + 0x91cb7f5fe642d153, + 0x74bfe96babd2ce9f, + 0xdb7c45a32bc5fe1d, + 0x74fc51943cf81e79, + 0x1d3fc27549fa2ce5, + 0x96ab341879fe4c63, + 0x251674a987e159bf, + 0x9ce6f85cb6f4793d, + 0x96a3bc2ed3f587a9, + 0x276c3a8fe3fab817, + 0x786f95e212fdc683, + 0xdbe6f24431ceb4df, + 0xe7d1c9b76ec2f35d, + 0x24df31687de613c9, + 0x6542d38a9cea4237, + 0x8671ad5cb9ec51a3, + 0xa2f51eca96ab4def, + 0x6eca8b91f5c17e6d, + 0x962b43a215e37cd9, + 0xcadb654323e6ac47, + 0xcf37ed9652e8cab3, + 0xcb183f2872ecda31, + 0x897c2ea65cafe78d, + 0x95d1746badc317f9, + 0xda638c9fecd52867, + 0xb382e191fac946d3, + 0xc7e3f5432adc7651, + 0xa8dbfc1327be63ad, + 0x3aec8b9767d1932b, + 0xe391f4b985d4b197, + 0xa695f42982b6afe3, + 0x6175c8fba2b9ce61, + 0xc7ef12a98f79ecbd, + 0x9a721f3eda8efc3b, + 0x234de8621eb32ca7, + 0xe84dc1b43dc74b15, + 0x3857b1254bc95a81, + 0x9eab7865469a57ed, + 0xaecb7f5a94ae875b, + 0x3861c5eed4b1a5c7, + 0x986c75dfe2b4c635, + 0x34bea861f2b7d4a1, + 0x8653afb542a9d31f, + 0xbec8d5143e8cf17b, + 0xfd6e19465c9f21e7, + 0x19dc63e98ca23f45, + 0x92d3ea498a965eb1, + 0xc79a23ecb7986c2f, + 0x35c14f2fe47a6c8b, + 0xc4bf123fe36d8af7, + 0x3a675fb32491ca75, + 0xe984d3a65394c8d1, + 0x3dea48965196d74f, + 0xe268adb54e68f5ab, + 0x8fd5e1bbae8d1629, + 0x615c48ecbc8f2495, + 0x372b85aedb9364f1, + 0xdabc457fea95726f, + 0xe39158f3296871db, + 0xf8d765e3256b8f39, + 0x1a98d625436d9ea5, + 0xb521ea7a9582cd13, + 0x2efa3d5a9163db7f, + 0xac49f5d98d45f9eb, + 0x6b492faede6a1b59, + 0x8937d211fb6d29c5, + 0xbf7a6e521c7f5943, + 0xc5d1b9e43b72569f, + 0x2c1b5ef54a75861d, + 0x913c548cb658a479, + 0x374cd8aa946ba3e5, + 0xde7c652cb47ec263, + 0xb73e914dc362d1bf, + 0x68a5e73cbc54ef2d, + 0x61e89a732e461f89, + 0x4b7ef2d43c492df5, + 0xa42e85d76b5c4d73, + 0x28daf457683e4acf, + 0xec21fd9cb9527a4d, + 0x7893be4ed63478b9, + 0xaf9283cfe548b927, + 0xa975ebc1f24bc793, + 0xfca89bd2123cb5ef, + 0x458b23187251f46d, + 0x4cd8baf87f3514d9, + 0x9bfc654bae592347, + 0x8c3df41a9d4a52b3, + 0xb2753f9dcb5d7231, + 0xe1a38dccb82e5f7d, + 0xe5d6ba11f6327de9, + 0x743a96c21824ad57, + 0x63cafde54527abc3, + 0xdaf42358753adb41, + 0xd3f78ce7612ce89d, + 0x38b4792baf43291b, + 0x28e67d4dce142987, + 0x26583b9edc1847e3, + 0xd21857e1fc2b5761, + 0x81db9363291c64bd, + 0x39e7c4f6591f843b, + 0xabcf3e776813b2a7, + 0x51f9d84ba837c215, + 0x135c672ba428cf71, + 0x7d4568fa9218becd, + 0x94c1d7298ceafd4b, + 0xeb3f985dcaef1db7, + 0x3b7d8fe21df34c25, + 0xc57d1ef43cf65b91, + 0xdab1e92439e758fd, + 0xcfb9ea2545fc786b, + 0x7fd25b3984fe96d7, + 0x4a6d3efcb6f1c745, + 0xa8149bddc3f4d5b1, + 0x71dbf36dc1e7d42f, + 0x4be76c1431e9f28b, + 0x2cfa67954edc12f7, + 0x938fc7b76cdf3175, + 0x69bf48287ad35fc1, + 0xf5a7d16989c56d3f, + 0xed84937ba5e76d9b, + 0x194c523ed5eb8c19, + 0x67eb2351f3deab85, + 0x5cd746f435d2c9e1, + 0xcbe619f542c3d85f, + 0x9531a78541d5f6cb, + 0x943c25f76fdb1739, + 0xd14ca6798ecd26a5, + 0xedc2135babcf5613, + 0x5c17964edac2637f, + 0x24c63be1f8c572eb, + 0xab415de327d8a159, + 0x1ec9d75324ca9fb5, + 0xd21ef3a765adbe23, + 0xd32be1c763a1dc8f, + 0xba81d9687193eafb, + 0x7954d8cbafb71c69, + 0x15a6f73dceb92ad5, + 0xb2a93171fcbd4a53, + 0x36be4a921b9e47af, + 0x127c6d554ab3872d, + 0x1b25c84437c4a589, + 0xd6b594f876b8a4f5, + 0x1ebfc8aa95abc473, + 0x4d27feba938db2cf, + 0xb7f648edc3a2f14d, + 0x19d674bfefa521b9, + 0xb4fe68932ea83f17, + 0x31bd9ce32d9a4e83, + 0x2c5e76f4397a4bdf, + 0xc8e2f755498f6b5d, + 0x8694ef7cb6827ac9, + 0x9246ab7ed695ba37, + 0xb5124cafe497c8a3, + 0xe91b2c51f49bd821, + 0x283794f2128ce57d, + 0x38157bf763a215e9, + 0x37c249e98fa62457, + 0xb524e8187e9854c3, + 0xf491cbebad9b7341, + 0x18ea4fccba7c619d, + 0x4a1f652cb75d6ef9, + 0xb1a64251f582ae67, + 0xafb3cd421675acd3, + 0xc54dea643478dc51, + 0x5feb63254258e9ad, + 0xad86cb28716df92b, + 0x7e8632acbf612a97, + 0xd2c36e8cbd7548f3, + 0xb7c92a8fed695871, + 0xd75c9621fa4965cd, + 0x38e246921a6d854b, + 0x15cf47d3285f93b7, + 0xce13bdf87984c325, + 0xdb34915ba576d291, + 0xdc965a398246bfed, + 0x35b172eba149fe5b, + 0x1b69dc7baf4d1ec7, + 0x38bec5a1fe714d35, + 0x8f47a3e32e645ca1, + 0xf8ed47b43c476a1f, + 0xac72e1654c3a697b, + 0x89ec34a6563c98e7, + 0x16287cfba73fb865, + 0x6d1753ecb753d6c1, + 0xb429351dc246d53f, + 0xa7526bdfe147f39b, + 0xb2a1d646536c2419, + 0xdf7e94276f4e3285, + 0xb627d3e98d5362e1, + 0xe97a4f698b236e4f, + 0x2e46a95989256eab, + 0x9d65a23dc73a8d29, + 0xd82a1f6fe62dac95, + 0x21c87f9ed53ebaf1, + 0xf5e83ca21532d96f, + 0x18c9fd265324f7db, + 0xdf5684c8723a1849, + 0x2c49f1398f1c27b5, + 0x176e24bbad1e5723, + 0xf4de891cbc21648f, + 0xe8c6951eda1473fb, + 0x1d935a61fb17a269, + 0xf6ebdc943829a1d5, + 0xefba7d66571cbf43, + 0x81bf6ca6541ebd9f, + 0xfaed4b298523fc1d, + 0x73d69aecb3251d79, + 0x8e2c47aa9df72be5, + 0xf6d248bdcdfa4b63, + 0x2495e3ced9ec48bf, + 0x397ca2f21aef683d, + 0x9b6ef2c43bf286a9, + 0xce6ba79549f5b617, + 0x16fbc2d876f9c583, + 0xe418c62874e9b3df, + 0x73b2e14a93fce25d, + 0x726a351ed4f312c9, + 0xc5e32a9edfe64137, + 0xc7529bd21ed74f93, + 0xc18f9d432ab84cef, + 0x78ea265439eb5c6d, + 0x692b1dc547cf6bd9, + 0xc86243fa98e2ab47, + 0x61c589bba6e5c9b3, + 0x59e4312dc5e8d931, + 0xdcb57481f2cae68d, + 0x4769e38212bce5f9, + 0x46fe19c983e12567, + 0xdb5c1ea87fc645d3, + 0xc32b91d98ed97451, + 0xca3486d87bc962ad, + 0x726eb38ba9cd812b, + 0xba15f32dc5be9f87, + 0x8c7e32a1f6b2ade3, + 0x1934efc327b5cd61, + 0xf5ca37132396eabd, + 0x6b7493a652c9fa3b, + 0x198fabc762ce1ba7, + 0x3a5cf12a9fc24a15, + 0xaed4c3fcbec45981, + 0x85f6da3dcba756ed, + 0x7512ed81f9ca865b, + 0x354be6f218ad94c7, + 0xc6758b1328afb435, + 0xd493bc5767b4d3a1, + 0x4eb1c2f985a6d21f, + 0x3e9cad498297ef6b, + 0x856ce9fcb29a1fd7, + 0xf951683cbf9d2e45, + 0x67421951fe925db1, + 0xbade28421d946b2f, + 0x1cd568932d956a8b, + 0x5ba714943b6a89f7, + 0xa6e9b535468db975, + 0x51ca47ea958fb7d1, + 0xe1569d8cb592d64f, + 0x2f134b6ed285f4ab, + 0x45698b21f3ba1529, + 0x96efb38541ac2395, + 0xc23be5754e8d53f1, + 0x8cb63d465d92716f, + 0x3f1d68765a736fcb, + 0xc14d753bab768e39, + 0x15afd84dc7689da5, + 0x689ca5ffe67dbc13, + 0x9178a4fed35eca7f, + 0x8baf42521462f8eb, + 0xc8b25e9543861a59, + 0xf7241897617928c5, + 0x13a2bc7a9f7c5843, + 0x591d74698c6d459f, + 0xdf38156cbc72851d, + 0x6c74bd8fec64a379, + 0xd9a6b371f967a2e5, + 0xc569d8f3297ac163, + 0x954a38e32549beaf, + 0x1f987537645fce2d, + 0x7d923efba4631e89, + 0x49f7b23ba1762cf5, + 0x1fe2c73cbf594c73, + 0xa35ce97cbd3a49cf, + 0x9861ca71fb3e694d, + 0xb6e147932d4187b9, + 0xb6cfe4843c54b827, + 0x63b19c865a47c693, + 0xe3a568b87638b4ef, + 0xf14eb53a954be36d, + 0xd8349bfba34ef2d9, + 0x9d21b43fe1853247, + 0xb7f9318fef4751b3, + 0x487961d43e496f21, + 0xadbc29f43c2a5e7d, + 0x5cda7e654a2d6ce9, + 0x4a3d95198b31ac57, + 0x5db3f18a9824bac3, + 0x7a56891dc837da41, + 0xae16578dc428e79d, + 0xd79ba85fe43cf71b, + 0x6a3b14c3243f1687, + 0xc63a7599815246e3, + 0x18dbfc5a9f287561, + 0x4da19c687e1863bd, + 0x3e8bc6aa9d1c823b, + 0x65f3291dcb2e91a7, + 0x7154af3dc821aef3, + 0xadbc1491f824ce71, + 0x57d8af632615ebcd, + 0xace71d843518fc4b, + 0x9fb7e2c7642d1cb7, + 0x7621c8ba941f3b25, + 0x5d314f698ef25a91, + 0x423df7ba9be357fd, + 0x342c7ebedcf5876b, + 0x927564dfe8fa95d7, + 0xd5439b7219fdb645, + 0xea49168437efc4b1, + 0xf81ae43767e4d32f, + 0x52f1b9c874e5f18b, + 0xf9312c5ba4e921f7, + 0xf2684beba1eb2f65, + 0x35ac1dea9fbd4ec1, + 0xfdb37c5febd16c3f, + 0x9feb36721de36c9b, + 0xea79b8443ce68b19, + 0x17462a5437e9ba85, + 0xc8ed96f656dcb8e1, + 0xd724bf5984bec75f, + 0xa8123bfa94d2f5cb, + 0x39b8a54ed4e71639, + 0x3b564e21f1e924a5, + 0xf5bca27542ec6513, + 0xae724d643ebd527f, + 0xa83d26b65dc271eb, + 0x78bef3976bc38f49, + 0x28e3b61878c69eb5, + 0x3b5f2e9ba7c9bd23, + 0x473fc98ed49acb8f, + 0xf49a235dc38ed9fb, + 0x8bf5316325d31b69, + 0x6fbe851543c629d5, + 0x8215ade871da4953, + 0xab792f465e9b46af, + 0xf37a29698cae762d, + 0x16ad7cecbdc1a489, + 0x59c6b4aed9b4a3f5, + 0xe6bc7311f9b8c273, + 0x1fc537632698b1cf, + 0xade58433258acf3d, + 0xdabc8175437dfea9, + 0x3c15d42a95b43e17, + 0xd38b76fba1b64d83, + 0x1a3de87a9e874adf, + 0xf35bae2dce8b6a5d, + 0x8b62a9d1fb7e68c9, + 0x93dafc832da1b937, + 0xb3c6d8532b94c7a3, + 0x6f74dec659a8d721, + 0x4c82eba76589e47d, + 0xdf49b2a9847bf3e9, + 0xdaf3927dc4af1357, + 0x59783affe1a452c3, + 0xf8cbd63fefa87241, + 0x4f3682721e675f8d, + 0x7c465e932c5a6df9, + 0x245f79843b5e9d67, + 0xa748efb76971abd3, + 0xc268ebdba984db51, + 0xac986d4cb465e8ad, + 0xc761a95ed469f82b, + 0xde67acb1f36d1897, + 0xbe3827f2148e27f3, + 0x2dc4ab1982a35671, + 0xd1f29c643f7564cd, + 0x65d23ea87e69834b, + 0x12e47ac98d5c92b7, + 0x8691b2edca7eb125, + 0x86b7ef1ed962cf81, + 0x7de5a8b1f653bced, + 0x25e63f421746fd5b, + 0x5972fc1434591dc7, + 0xbfc15a69847d2c35, + 0x6ab72e59826f4ba1, + 0x5fb946cbae53691f, + 0xf26d9bedce34687b, + 0xb7f6539edc3896e7, + 0x5287ea11fa3cb765, + 0x6a5d7ce3294eb5c1, + 0xbd41c9665961d43f, + 0xe2ac74576754f29b, + 0xf4a8217cb7682319, + 0xf952eb6dc46b3185, + 0xe9568cdba25b4fd1, + 0x281467bbac2e5d4f, + 0x87db3e41fe326dab, + 0x3fe9cab21e358c29, + 0x2fde18743d27ab95, + 0x1bf28a96583ab9f1, + 0x214879f6572dc86f, + 0x5127faea9731f6db, + 0x37e8946ed8351749, + 0x649d231fe43826b5, + 0xec258791f14b5623, + 0x95fa61c5412c538f, + 0x96732ab54d1e62fb, + 0x5c8fb3187e23a169, + 0x452f39687b149fc5, + 0xea7cb13a9a18be43, + 0x5fc267eba618bc9f, + 0x9c58fd1ba62ceb1d, + 0x6e7283b1f6321c79, + 0xe4cda56437142ae5, + 0xb4c286d875184a63, + 0xd1c395f7621947bf, + 0xca7e1bd65efb673d, + 0x27fba8476cfe75a9, + 0x8c9f542bacf2b517, + 0x72fc568edaf5c483, + 0xf84de7bdc7e6b2df, + 0x4fb7a65327f9e15d, + 0x735c8df324daefb9, + 0xc7fd3e5765de1f27, + 0xf27d49b985f24e93, + 0x5764d91981d54bef, + 0x4a7f1b5a9fe85b6d, + 0x52fd67398ceb6ad9, + 0x3b864ed1fbde9a47, + 0x6fd73e432ae1c8b3, + 0xe68cbd554ae5d831, + 0xc84fb9e437c6e58d, + 0xb97384a765c8e4f9, + 0xb9fc51dba5ed1467, + 0x4e7fdb9ba5cf24d3, + 0xb645193ed2e47351, + 0xf7d69c8fefc561ad, + 0x8743d9532ec87f1b, + 0xabd541f32dcb9e87, + 0xf7813e2548ad9ce3, + 0xd318549879b2dc61, + 0xbd536a1876a3e9bd, + 0x6cb5231ba5c6f93b, + 0x2f3cd6afe4db19a7, + 0x1bc6e3d1f4cd3915, + 0xca14def323cf4781, + 0x35a967d541b265ed, + 0xb6d7e9c43fc6845b, + 0x47dca2865eb893c7, + 0xc9bade198dacb235, + 0x386f47acb89ec2a1, + 0xd2c835bba681befd, + 0x45ef632ed593fe6b, + 0x19ef3da325a61ed7, + 0x29fbe8c436ba2d45, + 0xd7591bf7639d4cb1, + 0x2df95488719e5a2f, + 0x92af84187fa2698b, + 0x5372e68cbda498f7, + 0x5ab163cfeda9b875, + 0x97368511f98ab6d1, + 0xd54b93f2198dc54f, + 0x38ac7b254781f3ab, + 0x5c1982a878b61429, + 0x31d698cba6b83295, + 0xae21d94cb49a52f1, + 0x741e26fba18b4e5f, + 0x573fe6ba9d6f5ecb, + 0xc84b52d1fe728d39, + 0x2d937ba21e749ca5, + 0xab8c52754d78cb13, + 0xf962a844385ac97f, + 0xa175c8e5465cd7eb, + 0x7f91b54dc7a21859, + 0x25f3aebed69427c5, + 0x628adb9fe2a95743, + 0xf84631bfe17a549f, + 0xf5d7e694328c741d, + 0xbce126543e5f8279, + 0xe491cf776d73a1e5, + 0x5e7b91698c76bf53, + 0x6412c5d87846bdaf, + 0x253db47ba759ec2d, + 0xd7395cacb54dfc89, + 0x5bf16c3fe6712bf5, + 0x6b93875216854b73, + 0xe2cd6174325648cf, + 0x98d3cb58715a684d, + 0xa2967be65f3d76b9, + 0xaebd7f2a9d4fa627, + 0xd153f86cbd62c593, + 0x79165badc945b3ef, + 0xa2bd98e1f948e26d, + 0x78b46a13274af1d9, + 0xcf8eb766596e2147, + 0x5b72c6a987614fa3, + 0xecd972bba4756e21, + 0xd2c8f35ba1365c7d, + 0xf923e74baf286be9, + 0x4f35be2dce2d9b57, + 0x9fa7db4feb2fa9c3, + 0xafd796432c53d941, + 0x8e4d1a243a24e69d, + 0x32c6eb965938f61b, + 0xed47b91ba93c1587, + 0x2819de5ba74d25e3, + 0x93f846ced8527461, + 0x9d5b48cfe13462bd, + 0xb62da59fef27813b, + 0xb67cf3e32e1a8f97, + 0x913c8fd54c1b9df3, + 0x8924cf765a2fbd71, + 0xc9a5db276812eacd, + 0x21c84fba9815fa4b, + 0x8b5fe27ed6281ab7, + 0xf84a621fe71c3a25, + 0x4edb1521f52e4891, + 0xfd2b97e4342156fd, + 0x68fdc5987213856b, + 0x92e867d43ef594d7, + 0x29ba34e87df9b345, + 0x95f43a2879fac3b1, + 0x2e4adf3a98edc12f, + 0x12f8bc7ba6d1ef7b, + 0x41387addc6d41fe7, + 0x8ba2394217f82e65, + 0x7b85cfe435f94dc1, + 0x43a9cf1762ec5b3f, + 0xcda8351761ef5a9b, + 0x164a5bc87fe38a19, + 0x1cbe946bade4b985, + 0xf7ab1dedcad8b7e1, + 0x76f2a85fe8dac65f, + 0x9a8d5e7217ade4cb, + 0xe4a271c76ae21539, + 0x1ea95fb878e623a5, + 0x3fb675cba7e96413, + 0xb6d8f75a93da517f, + 0xd146ebf981ca5fdb, + 0xeb6952dbadbf7e49, + 0xa79d4611fec29db5, + 0x85b724a21ed6bc23, + 0x38c6bf7329b6ca8f, + 0xbf4c51a436a9d8fb, + 0xfeba981545bdf869, + 0x72319e5ba7c128d5, + 0x6a84132dc7d64853, + 0xc7b14e3ed2c745af, + 0x5d47e8b1f1ca752d, + 0x6bf8e94321cd7389, + 0xfa75ce943dae92f5, + 0x4a218fc76eb4c173, + 0x413ba7665984aebf, + 0xdb571a476897ce3d, + 0x27863c1cb578fda9, + 0xd7e9b3fdc6ae2d17, + 0x7eb15c91f6b14c83, + 0xfd58eb3215a349df, + 0x67bf21e432b7695d, + 0x21cf9ea541ba67c9, + 0xfed46c165f9da837, + 0xcbe492887d8fb6a3, + 0x6872ca5cbca4d621, + 0x4efd582dca95e37d, + 0x98b42eaed687f2e9, + 0x1a26f4b439ac1257, + 0x1afd3b76579e41c3, + 0x7e41a63987a26f31, + 0xa42c86b872935e8d, + 0x92eb81cba1856cf9, + 0xd842ea5cbf5a9c67, + 0xc597214cbe6c9ad3, + 0xc3b5d7afeb7fca51, + 0x6fd7c3b21b62e7ad, + 0x8524c6a43a85f72b, + 0xb8ac31954b8a1697, + 0xdeba461a978b26f3, + 0x986ef52cb69e4571, + 0x752c61ecb48163cd, + 0x7d58293fe195824b, + 0xf726839fef5691b7, + 0xcb8aef532e69af15, + 0x9dcf26443d5cbe81, + 0x1a85d2b4384fabed, + 0xb4cd1e587962fc5b, + 0x82f6d5cba9651bc7, + 0xab71926ed8792b35, + 0xa2d6839fe56c49a1, + 0x63f821dfe36d581f, + 0x7efa3dc32351867b, + 0x86ad37c5416395e7, + 0x196fdba87f38b465, + 0x9e2a18687e59b4c1, + 0xdc1937f98a5bc23f, + 0xfb3c7d6ba84fe19b, + 0x4fd78c3feb753219, + 0x15637cbfe9462f75, + 0xb73ec81327584ed1, + 0x49513863263a5c4f, + 0x3a2ed157623e5cab, + 0x6315942ba3518b29, + 0x59d3be698f23ba95, + 0xc5e1f34bad36b8f1, + 0x2f8651cedb29c76f, + 0x95a67c81f82ae5db, + 0xc29ea6b21a2ef549, + 0x4913e5887a6324b5, + 0xa514e82a9a486523, + 0x4c7d986ba639528f, + 0xd1ecb38a943a61fb, + 0xc37de16cb12d7f59, + 0x1e846c7cbf219ec5, + 0x17493b61fe15bd43, + 0xf73418d32d15cb9f, + 0x57b26dc54b28ea1d, + 0xa7bc8e65481cfa79, + 0x6cb24d18782f19e5, + 0x6931bdedca124963, + 0xf582b74dc71546bf, + 0xd253a78fe419763d, + 0x9c65a1b1f21c74a9, + 0x491ec766532ea417, + 0x1b9f5d654defb283, + 0x9ce8db665ae3b1df, + 0xb2cd897769e5cf4d, + 0xc12d793657d6feb9, + 0xc2d8f46ba8fb1e27, + 0xdcf6548cb6fe2d93, + 0x913d64fdc5d14aef, + 0xb36afe9214f35a6d, + 0x56d18bc432f568d9, + 0xf4b71ce651fba947, + 0xb639a1d65feda7b3, + 0x5bca4e198bdfc731, + 0xb3752d6a9ac2e48d, + 0x35fec12cb8c5e3f9, + 0x7c2461b1f9ea1367, + 0x96b5fc4218eb42d3, + 0x9f28576548de6251, + 0x749f38b764c15f9d, + 0x37dbfe4983d47e1b, + 0x3c9d8b7ba1e59d87, + 0xbde194387fc89be3, + 0x647bef1a9eadcb61, + 0x72f86cbfe79fc8bd, + 0x7d68c3b21ac2f83b, + 0x68ad42f43bd518a7, + 0x1789a54769da3815, + 0x17b5238a97dc4681, + 0xf629315983ac54ed, + 0x7fd2153dc4d1835b, + 0x3986725fe1d492c7, + 0x6b372a1fefc8b135, + 0xd1e9f4c32ea8bf91, + 0x86d47f132b79acfd, + 0x1bfe72c4398fed6b, + 0x3159f8e769a31cd7, + 0x98c5d27ba9b72c45, + 0x3f8c952ed6c84ab1, + 0x953726aed4ab592f, + 0x127cdb31f2ae578b, + 0xa41579c323b196f7, + 0x7163c92541c3b675, + 0x386cb9d54f97b5d1, + 0x21a7be876d89c34f, + 0x9ca2bdf7697ce2ab, + 0x5f1382ccba8ef129, + 0xb726415feab43195, + 0x46b8c13ed7964fe1, + 0x654af3d216984d5f, + 0x5e796fd323795dcb, + 0xc3e1a426528e7c39, + 0x2c48b36872819ba5, + 0x5cb1a62a9f85ca13, + 0xc4b27febad65c87f, + 0x483f657dca58d6eb, + 0xc54db1ffea7cf659, + 0xa35f18432a8f16c5, + 0xa29851f87ba25643, + 0x9ca571254786539f, + 0xe69375bba589731d, + 0xe6cf1d9cb36c8179, + 0x96f4312ba16c8fd5, + 0x92b8f13dcf71be53, + 0x42b581dfed53bcaf, + 0x29d534c21c56eb2d, + 0x67139d432c47fb89, + 0xde71afc5496c1af5, + 0x45763dc9896f2a73, + 0xd4358fbba86247cf, + 0xed63b19dc385674d, + 0xf17d64cfe24875b9, + 0xb6859ca1f16ca527, + 0x581acbe3216eb493, + 0xc76e89b54d51b2ef, + 0xb28651987c54e16d, + 0x15d72ce76a35efc9, + 0x6375caea9b5a1f37, + 0x6c287e1cb85c2ea3, + 0x4926387dc86f5d21, + 0xa147c291f6425b7d, + 0x6a38d24215346ae9, + 0x3dc1975542389a57, + 0xc453b8f7614ba8c3, + 0xb21d48987f3ec841, + 0x1c34de298c31e59d, + 0x517fd36bac34f51b, + 0x4bfd526fec391487, + 0x1ca59631f95a24e3, + 0x8c351b932a4d5361, + 0xf9cb7de5473f51bd, + 0x7ec9fa5986437f2b, + 0x519d423ba3248e97, + 0x12db48fba1279cf3, + 0xf84b52ea9f2abc71, + 0x13df7c598a1eb9cd, + 0x4c6b5dafec21f94b, + 0x5e91dca43d2419b7, + 0xa894c1f76c183925, + 0xb3e5a4976a2b4791, + 0xeba2c659871b45fd, + 0x7c23649ba51f746b, + 0x48d72eadc51293d7, + 0x92b4cf7fe317b245, + 0x38bc46fedef7c2b1, + 0x84e19ba32cd8be1f, + 0xbd5eaf1329fade7b, + 0xf91b458438bdfce7, + 0x427cefa98af32d65, + 0x461dc25a98f64bc1, + 0x94c58edcb6e85a3f, + 0x47c15f6ed3fc589b, + 0x6af3b9ced3fe7819, + 0x5bd7861323f1b785, + 0xdf672c8652f4b6e1, + 0xc76a9f543ed7c45f, + 0x327d4ca65ad8e3cb, + 0x2a43e9187adcf239, + 0x7ac5e12cb9df12a5, + 0xea7129cedae56213, + 0x9743c58ed7c54e6f, + 0xe2fca8b214c75edb, + 0xbce154f323eb7d49, + 0xbead367542de8cb5, + 0xacfd425984e1cb23, + 0xdba4f9176eb3c98f, + 0xf5cb6d298ca5d7fb, + 0xf1a8369edbcaf769, + 0x52c6b181f9bc17d5, + 0xc4f526321acf2753, + 0x6c98ae5438c254af, + 0xf3a1c49658c6742d, + 0x7a1fdcb764da7289, + 0xac173bf983cb91f5, + 0x27381d6a91bdaf63, + 0x2f138c4a9e81adbf, + 0x28ad7341fb94ec3d, + 0x3edb48621d85fca9, + 0x8edb52354dba2c17, + 0x6f9cdea659ad2b83, + 0x6af9c716569e38df, + 0xf8c1d4bba7b2685d, + 0xef6a7c8ed3b476c9, + 0x2c1dbfafe2c9a637, + 0x3ac4e5b1f19cb5a3, + 0xf23e87c543aec521, + 0xf3d12a554f91e27d, + 0xb31a97d65c84f1e9, + 0x2bc3e1998db92157, + 0x86fa3e187a892fb3, + 0xedf2c83cb89c5e31, + 0x5e8df76cb57f4c8d, + 0xb1c34a8fe4826bf9, + 0x543ba27213a49b67, + 0xe3a2c7b54287a9d3, + 0x79ec2417628bc951, + 0x9cf6ba354f5ec6ad, + 0x8da53bea9d81f62b, + 0x85e1ad2dcda41597, + 0xb547186edb9825f3, + 0xeda41851fa9b5471, + 0x4f8c9ed2187b52cd, + 0x7192ba44368f714b, + 0xa1b836c654628fa7, + 0x5d6a1b8a9386ae15, + 0x3c976f1ba267bd81, + 0xa452d8e87f48baed, + 0x7a8e4b5a9c4dea5b, + 0x329165e1fd621ac7, + 0x3d678c921d862a35, + 0x8c97ae643c6748a1, + 0x6e5329c5496a571f, + 0x1df687ba984d657b, + 0xec194bdba35f84e7, + 0xe2b95f6ed482b365, + 0x6db31a8fe276b3c1, + 0x74f9618ede58c13f, + 0x64e2cba21e39df8b, + 0xb7451a632a3bedf7, + 0x139eb4798c612e75, + 0x52ecb9d98a654cd1, + 0xb4d92c6ba9375b4f, + 0x4f79c16ed63859ab, + 0xa3f62c9fe54d7a29, + 0xf96ad71fe23fa895, + 0xc5dfa6e32453b7f1, + 0x3acfb4e87134c56f, + 0x4873fe965f27e4db, + 0x6b98cad87d2bf349, + 0xc3deb65a9c4e13b5, + 0xf4b1586edc716423, + 0x4bc796eeda34518f, + 0xab23847ed7265feb, + 0xd48729c2162a7e59, + 0x7a841654342b8dc5, + 0xf1a39c58752fac43, + 0x458f31687132ca9f, + 0x651b29498f25e91d, + 0xd542fc6cbd16f879, + 0x6853491edc2b18e5, + 0x1edc6941fb1e2863, + 0x5fb2edc43a2145bf, + 0x17bc8fe76a14753d, + 0xe261d8f6581673a9, + 0x43b7e61a962ba317, + 0x4d7feb9ba52db183, + 0xe5bc9d79821d9ecf, + 0x57c21fba9bf1ce4d, + 0x9df2b67dcae3fdb9, + 0x78c59df43cf81d27, + 0x6eba1f354bfa2c93, + 0xb51e2dc547db39ef, + 0xa416ceb657ef496d, + 0xf685741ba5f267d9, + 0x7fd82bedc3f5a847, + 0x6274b1fed2f8a6b3, + 0x15b497ffe2fbc631, + 0x6c48a31321fec38d, + 0xb37df8654dc1e2f9, + 0xda5614c98de51267, + 0xdb62a5c87be841d3, + 0x4c637a2989da5f41, + 0xd9c7e1b986cb4e9d, + 0x9e6c534ba5cf6d1b, + 0xd742c131f4e29c87, + 0xb246f38214d59ae3, + 0x2ea9587543e8ca61, + 0xab57cef541e9c7bd, + 0x6cd34b165fade73b, + 0x23cf56ba9ed216a7, + 0xc19236acbcd63715, + 0xf2893a1febd94581, + 0x8c324911f7b953ed, + 0xea854c7218cd725b, + 0xc476eb9435bf81c7, + 0x56a9b34876c3af25, + 0x3f41e6a873c5be91, + 0x8e12b9487196abfd, + 0x12d5caf87f89ec6b, + 0xeca5fd2a9b8cfad7, + 0x1e8d4b71fdc12b45, + 0xe9b8df432dc549b1, + 0xa9bc45143ab7582f, + 0xa51e9db437ca568b, + 0x273e81d764ac85f7, + 0xf85c67aa93bfa475, + 0x12fea8ddc5a3b4d1, + 0x598472ced1a6c24f, + 0xa2365efedf87e1ab, + 0x74cdb5632d7aef19, + 0xf87eb6a43c9d1f85, + 0x491d5ef76b924de1, + 0x49e521687a934c5f, + 0x1a6d2fca97865acb, + 0xb1524c6ed58a7b39, + 0x5f21bc3fe37d89a5, + 0x5b3a61dfe48fb913, + 0xacbe36221392c67f, + 0x72b8d9543184d5eb, + 0x65f78cd43e78f459, + 0xd1896c387e8b14c5, + 0xc6f39ebbac9e2543, + 0xe25b46fdcb81529f, + 0x4359682fea95721d, + 0x68fb2a9fe4857f69, + 0xb6d5f34214698ed5, + 0x1fc8eda3247cad53, + 0xf7e8cb95425e9baf, + 0x42a61d998173ea2d, + 0x25a3e6b87e54fa89, + 0x1a926c3cbd6819f5, + 0x2fa693cfed6c2973, + 0x4a6829bfe95d36cf, + 0x7ade63832b81764d, + 0xbca917632a6374b9, + 0x7b6cf4a65968a427, + 0x1a2e93c9856ab293, + 0xe3da1459835ba1ef, + 0x1d2465fa914ebf5d, + 0x236cbe5bad42fec9, + 0x382da491fd561e37, + 0x8d4a2c921e582da3, + 0x537bafc54d6b5c21, + 0x1fcb4926593e4a7d, + 0xd8a952c87a4168e9, + 0x1a82b59dc843a957, + 0x635e97aed546a7c3, + 0x97c8145fe35ac741, + 0x943bd6c1f13bc49d, + 0x78e96b14325fe41b, + 0x218e5fa76f541387, + 0x67341dc98d5742e3, + 0x7db4f86a9d4a5261, + 0x9a5d612878294fad, + 0xd234c96ba83d6e2b, + 0xf4d2839fe6318d97, + 0x45c6abdfe6249bf3, + 0xc13db9732536cb71, + 0x178c6d954327b8cd, + 0x842a9cd7612ce84b, + 0x3271e6f65d1ef6b7, + 0x846715dcbe143825, + 0x2ef9a3ddcd274691, + 0x1e469d7dca1854fd, + 0x8172b391f91c736b, + 0xf7c491b4391e82d7, + 0x1bcef8d87932b145, + 0x4b15cf287624bfa1, + 0xa14759d98426bd1f, + 0xf71e6b2a9218ed7b, + 0x9a45edc76cd9fbe7, + 0xd61e754babfe1c65, + 0x91a6d27febf24ac1, + 0xce953a721be4593f, + 0xa1f36be32af6579b, + 0x93cae67546fb8719, + 0xf598b1a874fda685, + 0x564faeb984dfa5e1, + 0xef5b7d4ba4e2c35f, + 0xce17df4ba1f5e2cb, + 0x6df1593dced8f139, + 0x1a7e52443fec21a5, + 0xc87ab3654abc3ef1, + 0x9fb81c365ac14d6f, + 0xbf58e43768e35cdb, + 0xeb47126ba8e67c49, + 0xf3569a4dc4e98ab5, + 0xa54df67dc5edba23, + 0x3a7c52eed2ceb78f, + 0xea9b7d5213c2d6fb, + 0x86149ed431d4f569, + 0xa85df6954fc916d5, + 0x79bc23d98edc2653, + 0xa862cf3879bd43af, + 0xa64d289cbac1732d, + 0xc97423dfead47189, + 0x4b652e1ed4b68fe5, + 0xf32859b215c9ae63, + 0xc5f3d143238a9cbf, + 0x8d213946529fcb3d, + 0x94835da761c2fba9, + 0x53412dba9fc62b17, + 0x4e9a6c5cbec92a83, + 0x9145afbdcb9a37df, + 0x9e4a2361f9ae475d, + 0x1b5e4d632ab175c9, + 0xeb54d87329c4a537, + 0xd4ecb19656c7b4a3, + 0xc3621df986bac421, + 0x16bd94a9839bc17d, + 0x6c19f3a9817ecfd9, + 0x29a74f5dcea31f47, + 0xbd847231fd962eb3, + 0x9d5c84332ea95d31, + 0xca861e732c7a4b8d, + 0x5a8de4f4387d5af9, + 0x186472b658b19a67, + 0xf245c87cb694a8d3, + 0x6b51f83ed4a7c851, + 0x45f6dc2fe278c5ad, + 0x49751cb1f18ce52b, + 0xf7dbc943218ef397, + 0x3dc2ef176e9524f3, + 0x1ac48df76ea85371, + 0x278da3976b7851cd, + 0x4e3a9579897a6f3b, + 0x67c891ecb85d6ea7, + 0xf5acdb9fe782ad15, + 0x2d1e8cb1f574bc81, + 0x29eb8fc21365b9ed, + 0xe4672fa43268e95b, + 0x9d61a7b5415bf8c7, + 0xa2d5bc798e7f1935, + 0xa731c8fcbe8347a1, + 0x29a346dcbc87561f, + 0x1b27596fec59647b, + 0xa83e6241f95b83e7, + 0xead6b272197ea265, + 0x3e2f9c165873b2c1, + 0xafd961e87564be2f, + 0x32acb8e87245de8b, + 0xefd134aa9148ecf7, + 0x356c914baf4c1d75, + 0xcbfd458bac5f3bd1, + 0xb5dac64fec625a4f, + 0x856abcf21d3458ab, + 0xf584c1b43c4a7829, + 0xf3569dc5483ca795, + 0xd1f57cb9874da6f1, + 0x1f25c7eba751c46f, + 0x38d45fbba254e3db, + 0xf4e3a25ed157f249, + 0x1c39d82fef4a12b5, + 0x3c2d9be54f6d5123, + 0xebca36f54b2d3e7f, + 0x93cfa4876a325deb, + 0x7f5a39198b247d59, + 0x5f813b4ba9278bc5, + 0x3891e2ced72cab43, + 0x84da927dc42db89f, + 0xa3298e41f542e81d, + 0x938742521423f679, + 0x4f58d3b7623817e5, + 0x21afe6d98f1b2763, + 0x3c845d687d1c34bf, + 0x4fb5817a9b1f643d, + 0xf5c76baedc1372a9, + 0x8ba6932feb36a217, + 0x89c6a43fe618af73, + 0xfc31ad8325189dcf, + 0xed5acb74351ebc4d, + 0x2d9fe7476421fcb9, + 0xdf43196ba4351c27, + 0xa27134f98ef62b93, + 0xa7bc86da9bd738ef, + 0x7319f82dcafb486d, + 0x94ef762dc8fe56d9, + 0x147aec632bf1a647, + 0x4da36f8328f4a5b3, + 0x987132a767f8c531, + 0x3ea421f764f9c28d, + 0x1b29ead873ebd1f9, + 0x6d172bca91cdef57, + 0x83f695dbaed42fc3, + 0x53c146d1fcd75e41, + 0xbda4c6321be74c9d, + 0xace15f6439ea6c1b, + 0x57ca9be439de6b87, + 0xa89457f767d1a9e3, + 0xe5398bfba7e4c961, + 0x71df23ca93e5c6bd, + 0xed8735adc2d9e63b, + 0x9a2346bfe1dcf4a7, + 0xd5837e9543df2615, + 0x428ce7576fd35481, + 0x1dbfa8654cb652ed, + 0xa51c37d76cd9715b, + 0x2b483df658ca6fb7, + 0x79e51f2ba7bd9e25, + 0x3c856fafe6c2bd91, + 0xa591d47fe493bafd, + 0x9fe4a8b213c5ea6b, + 0x98ac7d4432b8f9d7, + 0x352ecab872cd1a45, + 0x32a187976eaf38b1, + 0x8af5d32a9db3572f, + 0x1567de9badc4658b, + 0xf7842c6edab984f7, + 0xb27a3651f8bca375, + 0x4c1ba9f3279ea3d1, + 0xbac31f9657a2c14f, + 0x9d12ca865483df9b, + 0xd465b81873a6fe19, + 0xda2ce73a92ba1e85, + 0xf5d81a3a9f8b3ce1, + 0x4b16c25bac8e3b5f, + 0x5ae8d761fd8259cb, + 0xfd65be721db57a39, + 0x98fa5d332cb798a5, + 0x9c2efab6579cb813, + 0x8bfa14e7648db57f, + 0x45db7a2a9581d4eb, + 0x8d4e963dc2a4f359, + 0x1f728adfe2a813c5, + 0xb9235a8fef9b5243, + 0x458aed632e7c419f, + 0xcd41e8532a6d4efb, + 0x9cb2f6554c827e69, + 0x24c98a176a748cd5, + 0xc1f5739cb978ac53, + 0x9af1348dc458b9af, + 0xc6432aecb46ec92d, + 0xc9351f4fe361f789, + 0xa3def763239418f5, + 0xb627d34651a92873, + 0x87ce1f254e6935cf, + 0xdbe4ca298e7c654d, + 0xc36de5f98c5f63b9, + 0x2e463f7edc84a327, + 0xd9375f2fea76b193, + 0x538d97fdc5469edf, + 0xfd964ea21649be5d, + 0xf7c49a83234bedc9, + 0x7c5b38aa95821d37, + 0xe84d263a91752ca3, + 0xd7f5c69baf685b21, + 0xa438c52cbe3a497d, + 0x2e78f4bedb3c57e9, + 0x8c6327afeb3f9857, + 0xefac5b221b52a6c3, + 0x9b8ca2443a57c641, + 0xfc6213e65647c39d, + 0xba7e36d9865ae31b, + 0x52ecf67ba34df187, + 0xe2a8754dc57241e3, + 0xa496b8edce364f51, + 0x3bc298d1fc264ead, + 0xa9f52ce21e396d2b, + 0x768b41f43b2d6c97, + 0x1f39e7a6592e8af3, + 0xc3614b998943ca71, + 0x1423f5ba9624b7cd, + 0x136b5a9dc528e74b, + 0x73e12a5ed32af5b7, + 0x1c5a6471f34e1725, + 0xa5bd234873624591, + 0x94a78d176e1453fd, + 0x1382ceb65e18726b, + 0xe97cd2476c2a81d7, + 0x47ea2d598a1c9f35, + 0x951f764cb72f9ea1, + 0xf4e6753ed723bc1f, + 0x734a2d11f514ec7b, + 0x49eb17332416fae7, + 0xdb158c28742c1b65, + 0x263b5ae8742e39c1, + 0x148ef7376cde483f, + 0xec4613598df2569b, + 0xc4317d9cbcf58619, + 0xc1a3724edbf9a485, + 0xaf9b731ed7fba4e1, + 0x4fce29b217edb25f, + 0xab57d69546f2e1cb, + 0x938d1bc765d4ef29, + 0x67e3a5b983e71f95, + 0xb497af5982e93df1, + 0x7c26e4b98edb3c6f, + 0x5d47eb2989cf4adb, + 0x4d3a58b1fce27b49, + 0x2ae6cb521ce489b5, + 0xac2edf554ae8b923, + 0xe52b7ca435dab68f, + 0x7a49f2c764adc5fb, + 0x621749dba5d1f469, + 0x8ea9734cb3e614d5, + 0xf829ab7ed1e92453, + 0x43aec28edec942af, + 0xf19725d43fbc612d, + 0xad17b6832cbe5f79, + 0x82fb3d654ab28de5, + 0xbf64dc2879c5ad63, + 0x1af39eb875c69abf, + 0x637fdbe985b9ca3d, + 0xb78943fdc3bde8a9, + 0xa764ed11f5d32a17, + 0x6928aed214d52983, + 0x9db81f2541b736df, + 0xce6fd1a43fba465d, + 0x79462bd65ead64c9, + 0xbc2916398cbf9437, + 0xf84512ced9c4b2a3, + 0x5b748dafe9b7c321, + 0x8bc7a41fe497bf6d, + 0x3ab7e4621478ced9, + 0x5f13c693239cfd47, + 0xad3f6ec875a12db3, + 0x8cda615a92b65c31, + 0x52cf6ab87f964a8d, + 0x9e16247cbd7a58f9, + 0xd937b2cfecad8967, + 0x46da7bcfea8f97d3, + 0xa563fd432ba3c751, + 0xc586f3732785c4ad, + 0x6c479be65698e42b, + 0x973d1cb7648bf297, + 0x7d9b21eba59d12f3, + 0x96835bfed4b35271, + 0x69b3854bae734fbd, + 0x648c9721fd876e3b, + 0xf78459c21e596da7, + 0x5b8e92643b7d9c15, + 0x623acfb5496fab81, + 0x6f9432865762b8ed, + 0x9b73fc5ba674e85b, + 0xdec139acb358f6c7, + 0xcdb2f35fe49c1835, + 0x2e768d91f28e36a1, + 0xa98f67554392651f, + 0x3a9bdec32f84637b, + 0xf239c5154d5682e7, + 0x1d9762398d7ba165, + 0x1e42c8b8785c9fb1, + 0x2618fd4a975ead2f, + 0x3b159dedc652ed8b, + 0x5e48c91ed354ebf7, + 0x1abe738324691c75, + 0xb8d2f316546b3ad1, + 0xae9f43b8716d394f, + 0x1da7e2698f4157ab, + 0x5e9f6a3cbe548729, + 0xd7a9f82dcd37a695, + 0x54681faedb49a5f1, + 0x9384162fe84cb36f, + 0xed7b65a2174fc2db, + 0x3bf8de765863f149, + 0x86d1f73a986721b5, + 0x2389c15ba5694f13, + 0x6be4d71a914a3d7f, + 0xa31e57998f2d4ceb, + 0x687e52cede317c59, + 0xc21a46b1fd238ac5, + 0xe57238f21d27ba43, + 0xd1784ab43a28b79f, + 0x71cedf26583bc71d, + 0xc9375b19862fe579, + 0x7d8f349cb84316e5, + 0xca65781ed7482563, + 0x4c9fa72ed12843bf, + 0xbfd5a37fef1b623d, + 0xf51d2ec43f2e61a9, + 0x73bc69a54c218ef5, + 0x135a4db76c14ae73, + 0x7f2be18768159bcf, + 0x182bfd4a9718cb4d, + 0xe2f1b3d9851ceab9, + 0xa7bd81fdc51efa27, + 0x7e6d5821f6142a93, + 0xc63914e3241537ef, + 0xfa6182c65219476d, + 0x1279f6843efa65d9, + 0x2dc79a876cfd9547, + 0x1869b5387aef94b3, + 0x249817fcbaf5c431, + 0xc51f4a3cb7f5c18d, + 0x546df1ccb4d6cfe9, + 0x48cd756214dafe57, + 0xcdea28f545fd1ec3, + 0x31f25cd986f25d41, + 0xf2cba69871f34b9d, + 0xd9f5b2698fe76a1b, + 0xce4fbd7a9deb6a87, + 0x9e813a5cbadc98e3, + 0xb8fa4c3fe9dfb861, + 0x67ce5d3218e2c5bd, + 0x98be167328d6e53b, + 0x5abf9e6545d8f3a7, + 0x26efcb8a97ec2415, + 0xe1345cfba5de4381, + 0xf7316b4ba3c251ed, + 0x1b423d7baec36f4b, + 0xa27618b1fdc56eb7, + 0xb49352e21eca9d25, + 0x4d6821e438bdac91, + 0x58b69ad4368ea9fd, + 0x8ab7f46657c2e96b, + 0x2d74e38a95b4f8d7, + 0x58e2913dc6da1945, + 0x1796dbcfe4dc37b1, + 0x3dc6278fe1bd462f, + 0x64be5a2432d1648b, + 0xdeb1cf532eb483f7, + 0xc97eab254ec8a275, + 0xe3f158476cb9a2d1, + 0xcd3275f7678bae3f, + 0xe6fa92d9857fce9b, + 0x632de78dc6a3fd19, + 0x16b24571f4b61d85, + 0xfa37659325a83be1, + 0x21fd69c5429b3a5f, + 0x8f6eabd6519e48cb, + 0xd9e23af76fb17839, + 0x3da64f798eb397a5, + 0xe9daf12dcda8b713, + 0x8eb6a79eda89b47f, + 0x586a2941f67ac3eb, + 0xfd8e43b2178fe259, + 0x928c45b768a412c5, + 0xcfadb65a97b85143, + 0x438e57a762973e8f, + 0xb4a3f7e981794dfb, + 0x46b3c2fbaf7e5d69, + 0xe23978adce718bd5, + 0x98431d21fd84ab53, + 0x9a74d6821c65b8af, + 0x78daec643a69c82d, + 0x1b2d9874375ce689, + 0x95abfd39847de6f5, + 0x178f25adc8a42673, + 0x3a1cf2ecb28634cf, + 0xd91a2fcfe189634d, + 0x159f4dafef5c62b9, + 0xefbc92a43f6e9127, + 0x8576cbe54d61af83, + 0xb3f72ae54a539cdf, + 0x1d953ca87946bc5d, + 0xeb35f4d98647ebc9, + 0xc62913bba65cfb37, + 0x437f95aed56f1ba3, + 0xc386a1d1f6845a21, + 0xe8b6c9a21265487d, + 0xbf712984314856e9, + 0x71e352b54f3c9657, + 0xcfdb54887d4e95c3, + 0x67c934ebad72c541, + 0x67ef1cacba54c29d, + 0xa8392cbed957e21b, + 0x295ef67ed539ef67, + 0x96ad41c3275b1fd3, + 0x3f7869e5476f3e51, + 0x1b8f4ce873524cad, + 0x3a1e7bca91456c2b, + 0xe8752c9baf286b97, + 0xdb71649bad2b89f3, + 0x584e7afedc3eb971, + 0x792b5e31f931b6cd, + 0xf6ed4ab21a23e64b, + 0x289ebd643926f4b7, + 0x4e3a2c99894b1625, + 0x3b81fd5ba75d3491, + 0x43c75aba953e42fd, + 0x9e7ba18ed243716b, + 0x16285dfcbe146fc7, + 0xa154ed21fd189e35, + 0x96a84c743e2b9da1, + 0xfe19ba55492dab1f, + 0x398ec6d65921ea7b, + 0x9e784a176813f9e7, + 0x75ea1f2dc9281a65, + 0x92f84e7ed62a38c1, + 0x52648c3ed51c473f, + 0x1742d9bfe21f459b, + 0x8c592eb764238519, + 0x7e634df32ef4a385, + 0xc763e2f65cf7a3e1, + 0x3e8bd1776ae9b15f, + 0x91ba423656e9cfab, + 0xae75c34986cfde29, + 0x842f953dc7f31e95, + 0x7b38a6ced5e63cf1, + 0xd28f4c7214e83b6f, + 0x92e67d1432fa49db, + 0xf1b37c8651fe6a49, + 0xb95c83d76fe198b5, + 0xc7234b1a9de5b823, + 0x52b3714a9ad6b58f, + 0x9de8cb2ba7d8c4fb, + 0x172839c1f7dce369, + 0x8d9a3c7217bef2d5, + 0xa32bd6f879e64253, + 0x58cfea3875d641af, + 0x6359ad4873c85f1d, + 0xa37962d981db5e79, + 0x425936f98fad7ce5, + 0xae74d51cbed1ac63, + 0x7a8bc13fe8c3a9bf, + 0xd4f27a821ab6c93d, + 0x4763ea8326c8e7a9, + 0x6cd73b9546bcf817, + 0xa573d24a96cf1783, + 0x72468eba96b235df, + 0x82a71f4cb2c7645d, + 0xbf2a6c5fe1d863c9, + 0xb624c35fefbc9237, + 0x6a8d74532fbe91a3, + 0xf491d8e43b819def, + 0x981e57a54a93be6d, + 0x9bf8a7154785ecd9, + 0x7ed1a45986a9fc47, + 0x74e192bba69d1cb3, + 0x496c31aed6af4b31, + 0x3876db11f3b2498d, + 0xb74235a212b457f9, + 0x1f4a9b7431ca9867, + 0xf2e361854f8b96d3, + 0x245abcd87d9eb651, + 0x4e9136c87b81c3ad, + 0xa9fe2b5dca95e32b, + 0x9f72563ed8a6f197, + 0x53bc148fe79a21f3, + 0x81a3cb73279c3f61, + 0xe598b673247f3ebd, + 0x2edb1f8874926d3b, + 0xbd3271c981946ca7, + 0x8f16bdcbaf789b15, + 0xf16e8dca9e6cba81, + 0x1d5963ccb95ca7ed, + 0x896c21a1fa81e75b, + 0xa73de8621a83f5c7, + 0x9dcbea754ba91735, + 0x7ab84f37678b35a1, + 0x37c68baa968c541f, + 0x6df8c54ba38f527b, + 0x4b2e675dc29381e7, + 0xe2f4ab6dce769f45, + 0x473ec121fd579eb1, + 0x6543f7921d59ac2f, + 0x85df71a3294edc8b, + 0x9af2bde54951eaf7, + 0xb31d68fa9a841b75, + 0xc821ef3cb86739d1, + 0x6d781eadc56a384f, + 0xa8d17f9fe25d46ab, + 0xf71bd36fe15f7629, + 0x97eacd243172a495, + 0xcd56b2943e56a4f1, + 0xafd2ec665d48b26f, + 0x5cd7eb976a49c1db, + 0xb312dca8784cdf39, + 0x16b7d83dc9621fa5, + 0x2e68f19ed9764e13, + 0x36b9cd1fe5463c7f, + 0x2ba3496215384aeb, + 0x1e86d2c5423d6b59, + 0x2b3ef757613f79c5, + 0xed5fa2498f52b943, + 0x9c1e4b598d24b69f, + 0x2d7983fbab38c61d, + 0x16b497feda2be479, + 0xa64ef9ced82cf3e5, + 0x3defcab65b712463, + 0x5a9d8c47683542bf, + 0x12dafe6a9748613d, + 0xceb15368732a5f89, + 0x5f7b6d3a912b7df5, + 0x92d645ebae1f9d73, + 0x2c76d3ecbd129acf, + 0x5d1e8a61fb15ca4d, + 0x37fe15932c16e8b9, + 0x1bdc93854a1bf927, + 0x9c7e12a76a2e1893, + 0x6e87df5a982136ef, + 0xa19dfe3cb813456d, + 0x1b74ef6dc31764d9, + 0xd67342cfe21b9347, + 0xe43c268edefc92b3, + 0xb37569254dfeb231, + 0xbfe729143ae1bf7d, + 0x65c13fd548f3cde9, + 0x3e6f219549e6fd57, + 0x93efdc1987f91dc3, + 0xef514b8ba7fd3c41, + 0xcd7f528cb4ef3a9d, + 0x39f6a2bfe4f3691b, + 0xe934f2d212f46987, + 0xd12fe85541f897e3, + 0xcb1985f54fecb761, + 0x12a8467659cea4bd, + 0x5dc37eb98ad1e43b, + 0x3ade547cb9d4f2a7, + 0xf8315bcedae92315, + 0x5ec842a1f7eb4281, + 0x3dfc24e215ba3fcd, + 0xab4d687323cf5e4b, + 0x48a37bf653e26db7, + 0x5d3276c981e69c25, + 0x1837ad276fd7ab91, + 0x4eb239876cb9a8fd, + 0x6eb7543dc9aed86b, + 0xfbca327fe9b1f6d7, + 0xd6f45ec32bd61845, + 0x52ce9a1549d836b1, + 0x23a98db767ca452f, + 0xb3481ad874cd538b, + 0x34db5fca93be62f7, + 0x137a84bdc2d3a175, + 0x35e49f6cbea59fc1, + 0x1b329cdfec97ad3f, + 0xa6bc53921e78cd9b, + 0xb12769543a8dec19, + 0x4fc7e2d76ab21c85, + 0x5b826fe878b53ae1, + 0xb649d25ba6b7395f, + 0xa37b219ed3a947cb, + 0x1abd945fe2bd6739, + 0x13f4798fe1bf86a5, + 0xd734c29652c4b613, + 0x6bfca5732e95b37f, + 0xac1b76354d87c2eb, + 0xcab39d776c8be159, + 0x14d2bf37687cefb5, + 0x31db2a8dc9a14f23, + 0x497d35bdc6943d8f, + 0x5b4c8d9fe3864cfb, + 0xb3e47592138a5c69, + 0xf1ab4d84328c7ad5, + 0x7c31f8d7618f9a53, + 0x2793f1c65e62b7af, + 0xead4218a9e85c72d, + 0x46e5c97cbc67e589, + 0xa51934edc97ae4f5, + 0xb3c26971fa9e1573, + 0xcb4fe193298143cf, + 0x154962b43895624d, + 0x27d6a486548761b9, + 0xb5423fca936a8f17, + 0x23ec745ba16c9e83, + 0x9d3ab6c87c4e8bdf, + 0x614f589bae62cb5d, + 0xb85aec91fb54eac9, + 0x946deb721c58fa37, + 0xe673df954b6c19a3, + 0x2bc9e3176a7e4921, + 0x1cd2845ba981467d, + 0x294ef81cb47365e9, + 0x4b39a1ced2689457, + 0xd89c631fe16a94c3, + 0x9f35d26fef6db341, + 0x1e3f4ad32e4fb19d, + 0x9e571db43b42cef9, + 0xdb6e39765b34fe67, + 0x54fc6b287a581ed3, + 0x4bf2139ba96b3d51, + 0x4c87b13a964e3bad, + 0x1c943dafe7516a2b, + 0xc79ad1b1f2436a97, + 0xda27e842124698f3, + 0xf8624136524ab871, + 0xa378d6c54f2ba5cd, + 0x8b9145f87c2fd54b, + 0xcdea7b1a9c42f3b7, + 0x56a29f1edc681425, + 0x3c6bfd9feb5a4391, + 0xa3d7815fe73a41fd, + 0xd59346f2172d4f5b, + 0xe63d51c545316ec7, + 0xc53a6bd986249d35, + 0x5af327e982369ca1, + 0xfed4c1887e28ba1f, + 0xd9e5bc698e1cd97b, + 0x5a18e4ccba1fd8e7, + 0xbd7162c1fc231965, + 0xf3de7a554b2637c1, + 0xda8f97665a19463f, + 0x4b7c98f7671c549b, + 0x1d4273cba62e7419, + 0xa8fed6bdc631a285, + 0x5b23d47dc435a2e1, + 0x1da6b4fa9cd5ae4f, + 0xf2753eaed9f6ceab, + 0xbd4965821bfaed29, + 0x6e4abc7328edfc95, + 0xb9c832f769e23bf1, + 0xa8fd15e878e43a6f, + 0xc168edfa95f648db, + 0x6135afedc3fb6849, + 0x897b523dc2fd87b5, + 0x53472fbed1efa723, + 0xf47e1d6431e2b48f, + 0xfe456c732ed5c3fb, + 0xa63c21f54cd8e269, + 0x7edc12b769caf1d5, + 0x843dbcfa9ade2153, + 0x3b41f58ba7c13e9f, + 0x3c98f16cb7c45e1d, + 0x57ecb461f3e65d79, + 0xf256bda213d97be5, + 0x3a8217c542ed9b63, + 0x819e273541ce98bf, + 0x75148d276fb2c83d, + 0x9fb6d1487dc4e6a9, + 0x952b7efbabc9f617, + 0x9a45d1ffeadc1683, + 0x2954d68fe7ac24df, + 0xfcd8eba329c1635d, + 0xb245f6a437d462c9, + 0x5bfe397765d89137, + 0xe34587b762ca8f93, + 0xa975f1e7619a8cef, + 0xa5691f287e8fac6d, + 0xc5249f8bac82ebd9, + 0xb9873adfeca5fb47, + 0xdc94ea532dc81ab3, + 0xa3e2f6b659bc4a31, + 0x578f3be546ae378d, + 0x91ceb7d987b156f9, + 0x2ae17cfcb4c39567, + 0x6f9b83ddc2b795d3, + 0xa91726bfe2cab451, + 0xf9d7cbafef7cb2ad, + 0x42e7ba943e8fd12b, + 0xafe97cb43c92ef87, + 0x6cfeb3465b961fe3, + 0xfadb83c87ba93e61, + 0xe27b534986793cbd, + 0xde1749fba68e5c3b, + 0xcf964b2fe4916ba7, + 0xcba69d41f3b49a15, + 0x834bfac323a6b981, + 0xae51f7d43178a6ed, + 0xeaf85c243f7cd65b, + 0x4d8f2bc65b6fe4c7, + 0x98c2d4fcbda41635, + 0x4c1bea8edc9734a1, + 0x432a5cfeda89531f, + 0x541328e1f68c517b, + 0x3b9d46c2146c5fd7, + 0xf1279a4436819e45, + 0x2ef548b763749db1, + 0xe1c2d7998176ab2f, + 0xcbe854d76f47da8b, + 0x295d76b98c4bd9f7, + 0x69a7482dcb4ef975, + 0x3bae9761fb7438d1, + 0xab4963f21b86374f, + 0xa8143c73296845ab, + 0x56d1bf35486c7529, + 0xe159bf3ba46e8395, + 0x15e68d9cb572a3f1, + 0xd53b917dc274b16f, + 0x34f1827a9e35afcb, + 0xb678ed51fc48de39, + 0x3875daf21c3bfda5, + 0x7a389d265b6f2d13, + 0x37492b576a523b7f, + 0x5ebdf898783549eb, + 0xfdb6185dc7386a59, + 0xf7c3a94ed43b78c5, + 0x264f375ed25ea843, + 0x2574fcdfe241b59f, + 0x48e2bcf43264c51d, + 0x985acfd54f26e379, + 0x5e97b1d76c39f2e5, + 0xcad5126a9c5d1263, + 0xda5932e9894e31bf, + 0x917238acb9435f2d, + 0x4ea237ced7245e89, + 0x7c3196dfe4287cf5, + 0xb3ef9272152b9c73, + 0x31e97fd5432d89cf, + 0xd14fe3287231c94d, + 0x2ea9f4776f13e7b9, + 0xb6ef573bad16f827, + 0xb42a657dcd2b1793, + 0x98d15a4dc91b25ef, + 0x4f2da51fe91f346d, + 0xb8c6f7d54a1263d9, + 0xb7613a965a169247, + 0xdae4b938762891b3, + 0x6ae9dfc9853baf21, + 0xa1f697c9821cae7d, + 0xf9a53b276adfbce9, + 0x2cbf6e1babe2fc57, + 0x5dfa314feaf61bc3, + 0x5176c4832cf93b41, + 0x8391ed5327fb389d, + 0x315c6be547fe581b, + 0xc27f8e5ba5f19687, + 0xf317b8cba5f496e3, + 0xfbd1673dc3f8b561, + 0xe524136dc1f8a3bd, + 0xf21376bbafecd23b, + 0x3fcab4e32dcfe1a7, + 0x5e96d2487de63215, + 0x8c94adf65bd63f71, + 0xd816472658b73ecd, + 0x3ebc1fa987ea5d4b, + 0x1a85dc6a94de5cb7, + 0x23456b8ed6e19b25, + 0x196a2e51f3e4ba91, + 0xa95cb72212c5a7fd, + 0xe24b9c5431e9d76b, + 0x9dc416843fabe5d7, + 0x851c69e87cbef645, + 0xda81f7ba9cd435b1, + 0xafe3c95cbac7542f, + 0xfc85426fe7d9528b, + 0x8345c17fe5cb61f7, + 0x8f9d34e214bd8f65, + 0x35c1b29545b29ec1, + 0xcf49213762b4ac3f, + 0x8febd59761a5dc9b, + 0x3721d9e76fa8eb19, + 0xcab81ef87d9cfa85, + 0x643b75edcbaf29e1, + 0x8f24da6feab2385f, + 0xebac23d219a546cb, + 0xf7c9438328ca7639, + 0x8e2d47a436bc84a5, + 0xe31cd96986bea513, + 0x6c3b4a2a94a1b27f, + 0xd4829b6ba294c1eb, + 0x68af2d9cbe86df49, + 0xa384c1eedc78feb5, + 0x78cb2f954d9c1e23, + 0xac5948f43a7e2c8f, + 0x1ae9db2659824afb, + 0xaf249dc878a45b69, + 0xca981f2cb4a879d5, + 0xb8ef275ed48ca953, + 0xd5a7b6edc27d96af, + 0x61b75941f391c62d, + 0xdcba91f321a3e489, + 0x398e16b32d87e3f5, + 0x47189ca76e9b1473, + 0x829bcae76a7b32cf, + 0x61fde58a9a8f514d, + 0x1d52b84dc8725fa9, + 0x3275869ed6958e17, + 0x2d9183e1f4679d83, + 0x872c4f5213598adf, + 0xfbe61d74326eba5d, + 0x126f7b965261e8c9, + 0xeb53fd198e64f937, + 0x678adc9cbe6718a3, + 0x47bf89ddcd7b4821, + 0x5d39fa2fea6c357d, + 0xfbc1634ed86f54e9, + 0xc48a39e21b829357, + 0x1c3d85f5487692c3, + 0x6f57d4e98679b241, + 0xd1ca85276249af8d, + 0xdf6e5318714cbdf9, + 0x4d7e39cbae41fd67, + 0x2d31648cbe651cd3, + 0xc8e4b3d1fd683c51, + 0x8d7b29e21c4839ad, + 0x267afe843a4d592b, + 0x31bd62e54a3f5897, + 0xb8dc62fba85297f3, + 0x17fe93ddc845b671, + 0xa8c4f3dcb237a4cd, + 0xfa38b19fe15ad34b, + 0xd14275edcf3de2b7, + 0xf89a4e776f741325, + 0xead248187e564291, + 0x7d369cb65a263fed, + 0xb98d3c287a294e5b, + 0xb8ad713a982b5dc7, + 0x85c2e37cb72f8c35, + 0xf3c764dfe6439ba1, + 0xc5b7f28fe435b91f, + 0x5a2473921326d87b, + 0x362fde75412ad6e7, + 0x9ed13ba54e1df765, + 0xf824db7a9e4236c1, + 0x2c6e973bac16453f, + 0x5a692f1edc17539b, + 0x56dc413fea2b7319, + 0xe8c23961f72d9185, + 0xa1fe4b84362e8fd1, + 0x1af6c8765612ad4f, + 0x543b81a76314cdab, + 0x9a2475398317ec29, + 0x2a971f476de8fb95, + 0x2e4793a98bec2af1, + 0x2941678cbade296f, + 0x45d961afe9f247db, + 0xfa5d34e21bf56749, + 0x34e1796327f986b5, + 0xc1426a7657fca623, + 0x5d72b38764eda38f, + 0x2c1463d984e1c2fb, + 0x7f865adcb2f4e169, + 0x132f7dea9db6efc5, + 0xb7a4968fecda1f43, + 0xcf5d8a721acb2d9f, + 0xdb47f9a439bf4c1d, + 0x719ead354ae25c79, + 0x4879fad768d47ae5, + 0x7f9a3e4cb5e89a63, + 0xc3de1ba983da97bf, + 0xc247d1eba2ceb73d, + 0x5cd14e31f2d1e5a9, + 0xed8214b432d4f517, + 0x126a7bd54fd91583, + 0x249ef7c65cb923df, + 0x63d4e5287abc425d, + 0x9cd43ea878bf51c9, + 0xec98124cb9c38f27, + 0x93b6a27ed6c58e93, + 0xbce23a6ed3a68bef, + 0x9e5c8b3213c9ab6d, + 0xcae1f8d4328ecad9, + 0x8ab4f59762c1fa47, + 0x28164bc87fc519b3, + 0xef58c62baec84931, + 0xfe647ada9cba368d, + 0xb9365e7ed8ac45f9, + 0xdb856f1fe9bf8467, + 0xa5dbf43218b294d3, + 0xa56ce12548c7b351, + 0x4a23f6b65497b1ad, + 0x1fb789c76389cf1b, + 0x57ae9bc7619cde87, + 0x67e9c23baf921de3, + 0x6735a9fdcea53d61, + 0x74c912b1fc863abd, + 0xac72f5821d895a3b, + 0x9a876ce32b8d59a7, + 0xdb9e365547af8915, + 0x7c526f3a96a3b781, + 0x3db6af5a9384a5ed, + 0x9e32b65dc298d45b, + 0x4cb9375ed18ae3c7, + 0x671a395dce8df235, + 0x41cfdb365f9243a1, + 0x38b7ef954d96521f, + 0x4df2e6743c874f6b, + 0xb167c8254a695ed7, + 0xd782bfcba97c8d45, + 0x49b387fba56f8cb1, + 0xea17f96ed573ba2f, + 0x3e86ca91f264d98b, + 0x39b6d7821256d8f7, + 0xe752f4c4316bf875, + 0x179c8d365f6e27d1, + 0xfb682a4a9d81364f, + 0x6c258baa9d7354ab, + 0x74a5b13edc687429, + 0xf1426cdfea6b8295, + 0x1b34c98fe76c92f1, + 0x863eb4d2164d9e5f, + 0x7fce6a943452aecb, + 0x4b839c287265ed39, + 0xe7ab2c598147fca5, + 0x64ed3caa9f6b2c13, + 0xe563fa4a9c4d2a7f, + 0x4537b6aedc5148eb, + 0xae5cd421fc436859, + 0x79df58621b3687c5, + 0x8f9bed73295ba743, + 0x18dfb346563ca49f, + 0xe9527369865fb41d, + 0x97fe36dcb453e279, + 0x5814f62cb246f1e5, + 0x496f735edf5a2163, + 0x1b6f3eaedc392eaf, + 0xc7264fe21b3c4e2d, + 0x831f52b54c315d89, + 0x4fe1d8b76a237bf5, + 0x59ead6298a269b73, + 0x2743618ba52798cf, + 0x96de78bba52cb84d, + 0x965f3a8dc32fd6b9, + 0xaf253c6fe143f627, + 0xd2fa39e652471693, + 0xd1f98ea65d1824ef, + 0xc39d86a87e1b436d, + 0x2d6eb9487b1e52d9, + 0xd1659f4cbc329147, + 0x36d9b8edc9148fa3, + 0x7a8f941ed837ae21, + 0xaed798c1f418ac7d, + 0xb9ac8413241acbe9, + 0xf2913675431feb57, + 0xc9fd45b985241ac3, + 0xf3241d798ef63a41, + 0x2a1645b98cf6379d, + 0x5b1cdeaa9cfa571b, + 0x56e812ddcafd6587, + 0xad64bf1dc7df85e3, + 0xc197836329f3b461, + 0x6ab412c436f5a2bd, + 0x298b4fe765f8d13b, + 0x763c19f652eadf97, + 0xc83fbae871cbedf3, + 0x3f68becbafd23e71, + 0xb6fc5d7a9ae43bcd, + 0xa125be41fae75c4b, + 0xc35678f21ce95ab7, + 0x84d5cb7439ed8a25, + 0xecf29a3546dfa891, + 0x2dba95c875c2a6fd, + 0xbc4572ea93e4d56b, + 0x2cb6145ba2c8e4d7, + 0x7f325eddc1dbf345, + 0x4c38fabedfce24b1, + 0xfe7c61954ec1532f, + 0xca98fde43ed4518b, + 0x9cb27e443ab65fe7, + 0x586fb2d549ca8e65, + 0xd1a654b876ab8dc1, + 0xa3b9d75985ae9b3f, + 0x54dc27afe4c2da9b, + 0x65418d21f3c5ea19, + 0xc3bead9212c7f985, + 0xc89f4a2653cb28e1, + 0xf791ab254ead275f, + 0xbd8f69a87ea145cb, + 0xbd82c63badc47539, + 0xc731ba9edbc783a5, + 0x64a21cdfe8cba413, + 0xaf9d15cfe59ca17f, + 0x28bf3592147e9fdb, + 0x2da8c76435a2de49, + 0x2ea174576294fdb5, + 0x432e71d984b91d23, + 0xc8479eb76e7a2b8f, + 0x397c4ad98c7d39fb, + 0xa1547c3fedb15a69, + 0x7c5edb21fba378d5, + 0x3e6daf221cb7a853, + 0x4b81dea3267895af, + 0xaf1269d5468cb52d, + 0xefd8a9b7647fd389, + 0x9e18f35ba493e2f5, + 0x68579cbed4b81273, + 0xe16d952cbe7831cf, + 0x642a1f8fec7a4f3d, + 0x4a879b221c6d4ea9, + 0xf15a67c54c928d17, + 0xbc792a465b749c83, + 0x5db12ca5476589df, + 0x82d54f3ba468b95d, + 0xecb7863ba35bd7c9, + 0xea9d16bdc26fe837, + 0xe6c7ba81f29417a3, + 0x18ad6cf653a84721, + 0x5d84f3732f69347d, + 0x6b8d91254d6b53e9, + 0x615fd73a9c6e8257, + 0x2e17968bab7291c3, + 0xa9bd64edc975af31, + 0x4725d9bdc645ae8d, + 0xfd8c3a4fe347bcf9, + 0xc28957f2134bec67, + 0xc12f7565425efad3, + 0xfae5b63a92843b51, + 0x23cedb587f4538ad, + 0x2e83714bae49582b, + 0xcf2e734cbd3c5697, + 0xa2d3b49dca4d86f3, + 0x4576c811fa62b571, + 0xc5fa6e421854a3cd, + 0x5d4af6843857d24b, + 0x7cb2f3d76549e1b7, + 0xb2913d49834bef15, + 0x8cf461dba35e2f81, + 0xf5a6c83a9f423ced, + 0xa723fb4dce264d5b, + 0x2796ced1fd285bc7, + 0xca834bf21d2c8b35, + 0x5ec29a354b3e89a1, + 0xad1c5f776942b81f, + 0xfb36a8ca9823d67b, + 0x2fb634eba426d5e7, + 0x7a519bfdc32af465, + 0xbc7ad18fe34d25c1, + 0x165e2a8dcd1e243f, + 0xdb193c854f13529b, + 0x9278a3c65e367219, + 0x3d5621854c198f75, + 0x94bc12d7692a8ed1, + 0xac639419871d9c4f, + 0x7a523e1a9621dcab, + 0xe23749aed614eb29, + 0xf8ac3b2fe316fa95, + 0x63de7af5453a29f1, + 0xfb29a166531c286f, + 0x36d812954cfe36db, + 0xae5c34298df17649, + 0x7cdf3a4a9cf384b5, + 0x1e6df53dcbf8a523, + 0xe784ba2dc6e9a28f, + 0x5cf6a41ed5eca1fb, + 0x56dcfe2214decf59, + 0xbe5fca8434d2fec5, + 0x7f2b3da985f71e43, + 0x7fe4153761e72c9f, + 0xe38c59d87fea4b1d, + 0x71645ac98cde4b79, + 0xa89e5f6dcbd179e5, + 0xe49ca7d1fbe4a963, + 0xce5d4bf218d596bf, + 0xc6d531e327e9b63d, + 0x41758d2435ecd4a9, + 0x43c9fed985cfe417, + 0x48ea3d2cb6e51483, + 0x378bf12ba1c632df, + 0xa9752e6cbfc9415d, + 0xd8165abfedca4fb9, + 0x92647f821cbd6e27, + 0x2cbd7a854bc18d93, + 0xba3d6e8547b38aef, + 0xfa9715d547c5ba6d, + 0xd8439c1764b7c8d9, + 0x8e1cb7fba3bce947, + 0x731652ddc2aef7b3, + 0xd219bca1f2d54831, + 0xbf674e1321c6358d, + 0xdb36c8732eb854f9, + 0x9e1baf254ebc8367, + 0x3fb128576bae82d3, + 0x1ae3485a9ac3b251, + 0xedc2a97cb683af9d, + 0x638c2f4ed596ce1b, + 0x2a983571f3a9ed87, + 0x86754392148afbe3, + 0x6b3de9c654af2c61, + 0x1ab459c761a239bd, + 0x1de398a87fa6593b, + 0xe9a735176eb958a7, + 0x2538c1fcbdac9815, + 0x931ba84edb9ea681, + 0xceb56171f781a4ed, + 0x28ca9f721894d35b, + 0x62e15f843596e2c7, + 0x6a1ed238769af135, + 0x2bef9d49859d32a1, + 0x73614b99817c2efd, + 0x1cb6897baf824e6b, + 0xce3971acbe845cd7, + 0x4936e171fd798c45, + 0x9a681c532d6c8ab1, + 0xd8e941a4386da92f, + 0xade2cb854961d78b, + 0xc5483a1a9583d6f7, + 0x16fe28dcb398f675, + 0x12fd78adc48a26d1, + 0x375698fed18c254f, + 0xc7b452eede6f43ab, + 0x792c54f21f847329, + 0x7de91c643e768195, + 0x179a25e54b578fe1, + 0xb132e797684a9d5f, + 0xab42f938764e9dcb, + 0xf53e1accb761ec39, + 0x318f6c7ed463fba5, + 0x34b1a971f5782b13, + 0xe42765d2135a297f, + 0x51efac95415c37eb, + 0xcbd4ae776e3f4759, + 0xac54df3a9e4286c5, + 0x7ac38e5cbd57a643, + 0xa6b5d8edcb47a39f, + 0x6158472fe85ab31d, + 0x7be65c91f64ed179, + 0x754d1fc32741efd5, + 0x1de7936548761f53, + 0x2fe3d4b873462daf, + 0xce651df981594c2d, + 0xe93c24b87f2d4c89, + 0x164a23ea9c2e6af5, + 0xfda251bfed429a73, + 0x92613dafea2497cf, + 0xe9bf86c21a28b74d, + 0xbd857c64372ad5b9, + 0x982ed717683de527, + 0x83d921acb8621593, + 0x8593fbeba64523ef, + 0x47d3f28dc138426d, + 0x815e9a4dcf2a51d9, + 0x876a3f9fed1c6f37, + 0xcae9d1832c1f7ea3, + 0x372cf8576c34ad21, + 0x267e3ba65914ab7d, + 0xd24c69865716cae9, + 0xfa76eb3a961bea57, + 0xec6f135ba51df8c3, + 0x53cb147fe7523941, + 0x391a85b1f214369d, + 0xa51d3e754328561b, + 0x6b71acf32efa6487, + 0xbcd384965cfb84e3, + 0xd3fe98587bfea361, + 0xceb85a6878f2a1bd, + 0x361ae84a97e4cf2b, + 0x52f48e9cb4f5de97, + 0x4de9af1cb4d8ecf3, + 0x61a7db2435fc2d71, + 0x1fc8e32543ef2acd, + 0xefb856c871f25a4b, + 0x21c95fe76fe459b7, + 0xca91e5487dea8925, + 0x5a1d93798beca791, + 0xf239d15ba7bc95fd, + 0x62a5ed71f8e1d46b, + 0x98e6f37218c4e3d7, + 0x4f1bc2e437d8f245, + 0x28c564a876ea23b1, + 0xf2a15cd985dc412f, + 0xb5cae21981ce3f7b, + 0xeb7f4dca9fb25de7, + 0xc68fad4cbec48d65, + 0x4592e871fad78bc1, + 0x5deafc3218cb9a3f, + 0xdfce876326aec89b, + 0x74e6f39657c2e819, + 0xf723e16a96c3f785, + 0x2f6384eba5c827e1, + 0x873fda2cb3ca265f, + 0x4af8951fe1ad34cb, + 0x3c74f1bedebf6439, + 0x69c8e3d21fc382a5, + 0x14873da65ec7a213, + 0x7bdfc5243ba79e6f, + 0xcdb6293546789edb, + 0xd162cea8768ecd49, + 0x1598bd4ba691fcb5, + 0xdab9432fe7b61c23, + 0x14f6853fe3b62a8f, + 0xf2acd97212a938fb, + 0xc78bdef431bd4869, + 0x7e8269443e9f67d5, + 0x4c2e51798eb2a753, + 0xb2496ce87c8594af, + 0xb4fa5d7dca98b42d, + 0xf3762b8fe67bd289, + 0x9a416dffe68cd1f5, + 0x86c27fb659b42173, + 0x7e981bc435842ebf, + 0x75cbef9762974e3d, + 0xa438ce9761784da9, + 0x18f2563a9f8d6c17, + 0x1d479b6bad6f7b83, + 0x7a96fb5dcb6298df, + 0x2d98be61fa74b85d, + 0x8abde9f21a57d6c9, + 0xb98de5a3298be637, + 0x1368f9c5467df5a3, + 0x5f3a841cb8a34621, + 0x69af8c7cb295437d, + 0x925ae14dc18752e9, + 0xc7e58fbedf6b8157, + 0x6a2bd18fed5c7fb3, + 0xdb65a9e32c6f9e31, + 0x16d42c943b52ac8d, + 0x198fd5e43854cbf9, + 0xf2be67365948eb67, + 0x3a1256b9865af9d3, + 0x9e63d5fdc67e2a51, + 0x56f4327fe46137ad, + 0x198acb21f184572b, + 0x98574af321486597, + 0xfe6b95c32e4a85f3, + 0x9f3587176e5da471, + 0xa97e12376a4f92cd, + 0xb78de6aa9a63d14b, + 0x28adc9ecb834dfa7, + 0x78d63fadc748fe15, + 0x46e983a1f65b2e81, + 0xaf7e5d32154c2bed, + 0xb6df8ec873614c5b, + 0xd53ae47981435ac7, + 0x17235dfa9f278a35, + 0x1b63ae287e3b98a1, + 0x4b37c81a9b3ca71f, + 0xf782ea5ed92fc57b, + 0xb48237e1f932d4e7, + 0xa9dc84721a27f365, + 0x71ebc4f7685924c1, + 0x4d73be69875b423f, + 0x5ca31d29853e419b, + 0x86c9f72ba2315ef7, + 0x283e41acbf138e75, + 0xc48d21acbe268cd1, + 0x15f9437fec189b4f, + 0x46e9c833281dc9ab, + 0x81ed3b55481fda29, + 0x12a3eb876a12f895, + 0xf5e2986ba93628f1, + 0xc72d543cb519276f, + 0xe43f852dc41a35db, + 0xa53ec82ed21e6549, + 0x4fb31d8dcdef73b5, + 0xe42bda621ef5a423, + 0xb6798ed43ce5a18f, + 0x25dbc91438d69feb, + 0xcfed26a547face59, + 0x2afe546876fbedc5, + 0x8a4f967cb8f21d43, + 0x7fea35ddc5e42b9f, + 0xf47165dfe3f74a1d, + 0x4562dfc212fb4a79, + 0x76d295c431fc68e5, + 0x7583ad654edf9863, + 0x15cfa4276cd295bf, + 0xb35ea7298ae6b53d, + 0x6397ed2cb8e7d3a9, + 0x5d728efdc8dbe317, + 0x5689bfdfe6cdf183, + 0xcd3f586547c231df, + 0xcf719a6326c53f4d, + 0xe396c8b652d64eb9, + 0x6bd74c9981ea6d27, + 0xf1cd29a76fbd7c93, + 0x38e724176bad79ef, + 0xb928a64feac2b96d, + 0x124938b1f8b4c7d9, + 0xec9756a21ac9e847, + 0x1b4a6e9327caf6b3, + 0x85cbd49768ce2731, + 0xb56fe34a96c1348d, + 0x419e2d5ba2c453f9, + 0x6ef9b8adc1d98267, + 0xb1af8e2dcfba81d3, + 0x5fd7268fedac9f41, + 0x54d867921b7f8e9d, + 0x3af1b2754a93cd1b, + 0xb74c689439a4ec87, + 0x6b8f9cd65697fae3, + 0x2df4378a97ac2b61, + 0x427369cba49e28bd, + 0xd128365fe4c1583b, + 0xabd72411f1c356a7, + 0xfc4e5d7432c89715, + 0x482abdc43f9ba581, + 0xfe6718a54c7b93ed, + 0x24def8376a8fc25b, + 0xf4a216798a93e1c7, + 0xe2a9381cb896ef25, + 0x43c27b5ed6a82f91, + 0xb951d67fe4792cfd, + 0x2f695742148e3d6b, + 0x125d3f7543915bd7, + 0xc92b3a4871a38b45, + 0xa631b4c65f7689b1, + 0xf26bc4987d69a82f, + 0xe53bfd7a9a5dc68b, + 0x67145e9cb96ec5f7, + 0x62fab4dfea92f475, + 0x7194b6843a9725d1, + 0x9c461b365789234f, + 0x38d24197657c42ab, + 0xb2138fdba48e6129, + 0x7f23915cb2917f85, + 0xf89eb14baf648de1, + 0x78a52decbd469c5f, + 0x65813ad1fd479acb, + 0x83acd9221a5cdb39, + 0x7f835463284fe9a5, + 0xd6c5a1287b852a13, + 0xf8dc2e1ba965287f, + 0xe25f67dba45836eb, + 0xe9f7bcaed27c4659, + 0x51f69aeed16e74c5, + 0x732df89fef71a543, + 0x8b725c621e54a29f, + 0x23c5eaf54e57b21d, + 0xc19357854b38cf69, + 0x147bf937683aced5, + 0x14c257ea984efd53, + 0xae584cdcb7532caf, + 0xb2a6459fe7564b2d, + 0x526b8d71f2374b89, + 0x3c9f2ea2123b69f5, + 0x9326cb16514e8973, + 0x24cb7fe65e3196cf, + 0xc96ab4198e23b64d, + 0x3b976a298c26d4b9, + 0x7a35169dcb3ae427, + 0x4ec1296ed84cf293, + 0xae21834dc74d12ef, + 0x3fc9ead32953416d, + 0x29cbf86436254fc9, + 0x6d251cb984296e37, + 0xe59436f9812b7da3, + 0x7c914d598f3e9c21, + 0x85d746fa9e21ba7d, + 0xbcf3567edb13c8e9, + 0x16dca971fb16e957, + 0xbd9ae4f32a19f7c3, + 0xf92adce76a3d2841, + 0x8d5b9327671f259d, + 0x7b1846dba823651b, + 0xd14673bdc4156387, + 0x647b13adc41982e3, + 0xd28f46adcefba261, + 0xafb176ddc9eb8fad, + 0xc83def5219dfae2b, + 0xc168db943af2ed97, + 0x21c936f548d5ebf3, + 0x54b9238768f92c71, + 0x2ba4e6f875fa29cd, + 0x6871bf9ba5fe394b, + 0x43612bfed3f158b7, + 0x26134f7fe1f49825, + 0xfdec978432f7a691, + 0x371ad9c32ec894fd, + 0xc12e97554aedc36b, + 0x8c16742659bfc2d7, + 0xc472d1ea9ad3f145, + 0x9e7385ddc9e732b1, + 0x76d1a28cb6c83e1f, + 0x2aec5171f4da3e7b, + 0x9d7f8eb213bd4ce7, + 0xbe5263d543e18c65, + 0x32a5974762e48ac1, + 0xfc6d31a65ec6a93f, + 0x94ce23f65ed8c79b, + 0xf6e975498abcd719, + 0xfb7e619dc9bfe685, + 0x98572b61f9c426e1, + 0x6bed532219c7245f, + 0x6375fbe326d843cb, + 0xa4f69d1875dc6239, + 0x6b2f7ea983ce71a5, + 0xfa3b4c2a93b28ef1, + 0x4eac5d998ea39d6f, + 0xde8b65cbae859cdb, + 0xae1b8521fba8dc49, + 0xbe376d92198ceab5, + 0x39d187e5489efa23, + 0x38cd4f9657b3298f, + 0x4abc637986a537fb, + 0x9e34d58cb3ca4769, + 0xa78b62fdc2ab76d5, + 0x1b28c53ed1be9653, + 0x725e1bcede8193af, + 0x2a8657421f95b32d, + 0xf4d51c643ea6d189, + 0xe81c76443a78cfe5, + 0xbfe6c416598bfe63, + 0xa15d97b9867e1dbf, + 0x136c5afcb7924c3d, + 0x23fad49fe3854ca9, + 0x76823cd1f3a96b17, + 0x84f3d562129c7a83, + 0xb4c9f584316c87df, + 0xb9f56d354f81b75d, + 0xda3859476e73d5c9, + 0x9ce642dbac98e537, + 0xdb2fe96dcb79f4a3, + 0xfd32ca7fea9d3521, + 0xd254c67fe68f327d, + 0xd7abe983278351e9, + 0x9d1c3ea323956f47, + 0x486e21c652687eb3, + 0xea341679827b9d31, + 0x3127f9c76f4e9b8d, + 0x4bfe91598d51caf9, + 0x3e58726edc53ea67, + 0x7531f94fea56f8d3, + 0xc46e59d43c7b2951, + 0xe8a19644385c26ad, + 0x8eb3f4d6587f462b, + 0xe79c561cb5826497, + 0xedf7a5ccb27684f3, + 0x3854efbed269a371, + 0x3ac2516cbf4a91cd, + 0xfc361b9fec4daf3b, + 0x6791ad332c41dea7, + 0xdae976843b64fd15, + 0x27f8be576b572d81, + 0xf3429e8767482aed, + 0xf12e4cda974d3a5b, + 0xe5f1c47cb53f49c7, + 0xf74b628fe4628935, + 0x1bd74321f24597a1, + 0x1cae49f43248a61f, + 0x54c172643f2ac47b, + 0x2fd8a1e65b2dc3e7, + 0xdb7af14a9c41f265, + 0x7b51e86bab5623c1, + 0x95f62e8dca58413f, + 0xa8c9734ed6293f8b, + 0x893276cfe52b4df7, + 0x59b673a2142f6d75, + 0x8d759ea765438bd1, + 0x196edba871259a4f, + 0x632987465f16c8ab, + 0xf849e1c87e1bd829, + 0x71932e6bab1de795, + 0x9f715a2edb4327f1, + 0xbaf7168fea14256f, + 0xe4c5f163291734db, + 0x1e3a97b6581b6349, + 0x12c9ba79861d72b5, + 0x41cdef7ba64f9123, + 0xd4271ecba3129e7f, + 0x5ceb64387cf39deb, + 0x281569fbabf6cd59, + 0x3a7124bed9f8ebc5, + 0x46dc2e5219ecfb43, + 0xdeb2698437de1a9f, + 0x5c1a978768f3491d, + 0xec624b7ba6f54879, + 0xc2d6745ba3f967e5, + 0xa5d3f6ecb2fc9763, + 0x895f7d2ba1ed84bf, + 0x49ba1f6dcfe1b43d, + 0xac5836b21fe4d2a9, + 0xc8faeb654cd8e217, + 0x15fce7254ac9ef73, + 0x4ef7a2d657ba1ecf, + 0x3d7154a987bf2e4d, + 0x5bdf632ba6e24db9, + 0x9bf41c6ed4e56c27, + 0xbc5a6381f2e87b93, + 0xd297e4c212ca78ef, + 0xa7148cd431cea86d, + 0x7189ec654fb1c6d9, + 0x49523f698dc3e647, + 0xef2679a98ac7f5b3, + 0xa37ed95dcadb2631, + 0x4c5d92bfe7bc238d, + 0x7ef2c65ed6be42f9, + 0x6f81a4d329d38167, + 0xef16783324b57fc3, + 0xc49e7fb763c89e41, + 0xe2a6df9651ba8c9d, + 0x9bc3d5a76f8eac1b, + 0x27f5bd4a9da1eb87, + 0x469385ddcba4f9e3, + 0x85369711fbc82a61, + 0xda5ef3c218a927bd, + 0xf1d359a328ad473b, + 0x624ed71436bf45a7, + 0x67c98deba7c39615, + 0x6c3d47fcb3c6a481, + 0xa678493cb1a792ed, + 0xebf491aedf8ac15b, + 0x981423ffea6dcfb7, + 0x7db25fc43c91fe25, + 0x1e9b3af54ca52e91, + 0xc5af61e549862bfd, + 0xc8d31ef657893c6b, + 0xc6df84ea958c4ad7, + 0x613279ddc39f7a45, + 0x8fa6c15fe4a398b1, + 0x54196f8fe195a72f, + 0xad6435c32197c58b, + 0x3a68c5e32e6ac4f7, + 0x791523f54c8de375, + 0x5a73c2998c9324d1, + 0xe183cf7bab96324f, + 0xb7e16a4ed98741ab, + 0x15a43c9ed67a5f19, + 0xea426c91f37c6e85, + 0x4ba63853246f7ce1, + 0x1ced2ba543729b5f, + 0x34e2a8965164a9cb, + 0xf38eb4a76f57da39, + 0xf41d8eb87d4be8a5, + 0x716df45bab6df813, + 0x3684eb9edb81267f, + 0x8c752ba1f97435eb, + 0x3ec6f4221b786459, + 0x147f3583286a73c5, + 0x9aed12b9867d9243, + 0xa56bf988735e819f, + 0x731fe5c981529efb, + 0xeb74cf9baf34ce69, + 0xb31d6c8bab37ecd5, + 0x91d485ffeb4afc53, + 0x8ab735f3294d1baf, + 0x19ed63765b614a2d, + 0xf943b7276b534a89, + 0xbf9d854ba93768f5, + 0x9ae574bdc54b9873, + 0xf3e9162ba23b85cf, + 0xa162d57dc13fa54d, + 0xb95a184fef42d3b9, + 0xe32749c21f46e327, + 0x4a6fc2e65d48f193, + 0x43895a776b4a21ef, + 0xaef9b148793c2f5d, + 0x7c3e465ba8314ec9, + 0x7a541dbdc9246d37, + 0x8b1ad7cfe5267ca3, + 0x8eab3591f54a9b21, + 0xa926ed32132ca97d, + 0xfc935db5412fb7e9, + 0x83dae1276f12e857, + 0x5e946cb98d15f6c3, + 0x264fe97cbd3a2741, + 0xb16ef39dca1b249d, + 0x564f2ceed92e541b, + 0x5846aed1fa316287, + 0x8cbfa7e5492581e3, + 0x37afd98546279f51, + 0x4dc3a8b653178ead, + 0xc8a1e5f8731cad2b, + 0xce47fb265bfedc97, + 0x7a321de98bd1eaf3, + 0xfac4eb1edcf52b71, + 0xda65192fe9f628cd, + 0xdae89b7219fa384b, + 0xd1567a3328fd46b7, + 0xa3961cf546ef8725, + 0xa37195f986f3a591, + 0x9e3f2a6982e593fd, + 0x2ed5fb4ba1f8c26b, + 0x276c154a9feac1d7, + 0x267f51cfeabcdf35, + 0xef76a8954cd32fa1, + 0x7cf19a354ac53d1f, + 0x2f38ad6549e63d7b, + 0xb964a7f656d94be7, + 0xc6a3271a94ed7b65, + 0x31647cdba4df79c1, + 0x9d68e32dc4d2a83f, + 0x2647a3c1f1e4c69b, + 0x7df581a432e8d619, + 0x496f3c532fcbe485, + 0x6cef79a65bacf4e1, + 0xf517c6298bc1235f, + 0x729536a989d542cb, + 0xe52936adcad86139, + 0x2fbe154ed4ca6f95, + 0x12a9745fe4ab7df1, + 0x874cd93213ae8c6f, + 0xd9eb278543c29adb, + 0xe21f37d761c5db49, + 0xc892d5654fa7e9b5, + 0x46189eb87dabf923, + 0xa4b1732a9bad178f, + 0x546ca7bed9a136fb, + 0xc1792db1fac34569, + 0xb6a5d84219b874d5, + 0xef7c9b4327cb9453, + 0x3df719c6549c82af, + 0xf8ca63e8749fa12d, + 0x5bd2ce6981a2cf79, + 0xd4f8a23a9f84cde5, + 0xd931c6fcbc98fd63, + 0xf871d92fea791cbf, + 0xbd5c9f421a8e2b3d, + 0x2c7f64e43c814ba9, + 0xa13b72e659b46a17, + 0x48257c6ba5b67983, + 0xd17fe45ba37986df, + 0xd5684a3cb28ca65d, + 0x1386297ed17fb4c9, + 0xc9e2b47edf92e437, + 0x5d3ef8a21e86f2a3, + 0x83759e176e9a3421, + 0x961cbe765c8b317d, + 0x83dae1f6586c3fd9, + 0x4a98fe6cba916e47, + 0x2a1e459dc6847db3, + 0xa8132c7fe5879c31, + 0x213e57b1f2579a8d, + 0x83ba9d72125cb8f9, + 0x5a1768c4315fd967, + 0xa2b7d6f65e62f7d3, + 0x64e8712bae972851, + 0x163fdcaa9c6825ad, + 0xc48f25eeda7c452b, + 0x3b895caeda6e5397, + 0x4d5c6fafe97182f3, + 0xb8c1ea943985a271, + 0x73ce5bf323458fbd, + 0x94351e876258ae3b, + 0x4a5cd287614bcda7, + 0x6f15cb398d4fec15, + 0x614e3a2cbe642c81, + 0x274b35edcb4529ed, + 0xe84db361fc48395b, + 0xc98ad7621a3b48c7, + 0x456891b32a4e7835, + 0x1368bc28785296a1, + 0x62bfa78a9764a51f, + 0x7e8c642ba246c37b, + 0x71d9a3ecb149c2e7, + 0xe61d85ccbf3ce165, + 0xb683a9fdca3defb1, + 0xb93875621c543e2f, + 0x67dfb1254c253e8b, + 0x7c914df65a284cf7, + 0xe2df5739892b6c75, + 0x476bfe5a963e7ad1, + 0x7e15a2bdc631a94f, + 0xb2f3dc6fe423c7ab, + 0x395cab71f136d729, + 0xcd125894312ae695, + 0x5fe7a9d54d2be5f1, + 0x4dfc5e287c2e146f, + 0x52e6cf198c1243db, + 0x472a3fccbc176249, + 0x375219aeda2971b5, + 0xf248b37ed72b8f13, + 0x6431f52fe41c8d7f, + 0xa6c7158435219ceb, + 0xd14728576413dc59, + 0xd1b52cf87216eac5, + 0x4e28c7a76de8fa43, + 0xafd285176ceb189f, + 0xe4b5ac8a9afe381d, + 0xc731e48edbf14679, + 0x13f9b54ed9f376e5, + 0x94df85621af89563, + 0xd8a5e9b325e983bf, + 0x137c92e765fca23d, + 0xd7a913e763efc1a9, + 0x47b2c6a981d2cef5, + 0x2d8cb31a9dc5fe73, + 0xba1583ca9ab71dcf, + 0xeba84c31f9ea2c4d, + 0xa65bf97218de3cb9, + 0xba7385f54ae16b27, + 0x89b41ca658e47a93, + 0x297fba5764c587ef, + 0xc6da132983e9a76d, + 0x4ab7259982ecb5d9, + 0xde6ac39cb1cfd547, + 0x3b15a94edec2f4b3, + 0x7c69e5b54fd82531, + 0x7b63ec854ec9328d, + 0xac8496265acb41f9, + 0x92dfe83769bd4f57, + 0x6875ceda98b17ec3, + 0xd178f64cb7c59d41, + 0xb16d42cfe3c58b9d, + 0x8d5cbe41f3d8ca1b, + 0x4efd2ba212bcda87, + 0x2bd189a541afd8e3, + 0xa1b2e9487fc42961, + 0xce9245187ea526bd, + 0xf4a197d98dc9463b, + 0x18732a9ed9bc54a7, + 0x78f241bed9be8415, + 0xa2b38571f7c2a381, + 0xdcf5948326a491ed, + 0x8ac15f632396af4b, + 0x279ad3154298ceb7, + 0x32519fd8719bed25, + 0xe25f47a76d7efc91, + 0x15c47dea9c832afd, + 0x6c2d917fed953a6b, + 0x7a328ed1fba849d7, + 0x493e7f221bac7945, + 0x7da14824369e87b1, + 0x2b7a4fd65791a62f, + 0x984b31e87593c48b, + 0xfe9cb76ba296c3f7, + 0x4bf372edc19ae275, + 0x732dc81bae7bf2d1, + 0x4bfe625edc8e214f, + 0x245a8c921d723f9b, + 0x1c6df5b43c865e19, + 0x2cf419b43b796d85, + 0xf3da8676586a7be1, + 0xf21d568a946d8a5f, + 0x9461f75ed461a8cb, + 0x2c13b4ffe274d839, + 0x52b8c961f186e7a5, + 0x19d57cb5428af713, + 0x16baed543e6c157f, + 0x8afc3d765c6f24eb, + 0x28f3e9bbad826359, + 0x7b15d2ebab8672c5, + 0x7f58361edb7a9143, + 0x93f528bdc54a7e8f, + 0x94d65b1fe34c8dfb, + 0xa469ed532451cd69, + 0xb5376c254263ebd5, + 0x2caefd998167fb53, + 0xd94ca7276e4819af, + 0xdba256e98e5c392d, + 0x416ea25cbc4f3789, + 0xe1a546bedb4267f5, + 0xe64c1b51fb459673, + 0x8e74ba62193784cf, + 0x5c8eba33275ba34d, + 0xceb19d57654ec2b9, + 0x89631e4ba563e127, + 0x341f8c5ba154ef83, + 0x2caed75a9c361edf, + 0xa49786fcbc392e5d, + 0x5479c381fa2b3dc9, + 0xaed8b4921b2f5c37, + 0x916a2b365c427ba3, + 0xafe3b4187b469a21, + 0xf62b8e5a9526a87d, + 0xe9d42519842ab6e9, + 0x95af23ccb32ed657, + 0x19a8647ed241f5c3, + 0x4a321bffef372641, + 0xe7d2f1654f17239d, + 0x2e74c3b76e2a531b, + 0x275a1de76c2d5187, + 0xd34be858791e6fd3, + 0x7a8e6f4cba239e51, + 0xa31927fcb6148cad, + 0xdc89af2fe517ac2b, + 0x718eb2d1f31adb97, + 0xa65d9483241cd9f3, + 0x25d4f91985432a71, + 0x67a93fd65ef327cd, + 0xf3e4b1998df6374b, + 0xb4e961798cf945b7, + 0x54f7826cbafc8625, + 0xf3e79dbdc7fe8491, + 0x72dafebdc6e192fd, + 0x9fa857e327f4c16b, + 0x5d3e7bc323e5bfc7, + 0x9135def762f9de35, + 0x2c1f95a762ebfda1, + 0xbd9456287dbe2c1f, + 0x5462acfa9de23c7b, + 0x81479f5dcbd54ae7, + 0x3bce2d71fbe97a65, + 0x493f6dc329eb78c1, + 0xb1f3654326cd973f, + 0xc2aed5f546e1c59b, + 0x1b92ef5986e4d519, + 0x57c98b2ba2d7e385, + 0x95637ecba2c9f3e1, + 0x64cd83ebaebc125f, + 0x26c951afedaf31cb, + 0x8eaf35721dc35f29, + 0xb4ac87f32bc46e95, + 0x128defa549b87cf1, + 0xcf1e873545ca8b6f, + 0xaf195d3764ae89db, + 0xa35d162cb5c1da49, + 0x54b9286ed2c3e8b5, + 0x9478231fe1c7f823, + 0xc86a94d432ca168f, + 0xe2b4dfc43e9c25fb, + 0xd2cf31865dbf3469, + 0x2a3bc9f98cb273d5, + 0xf73c2d8babc79253, + 0xa728513dc6b781af, + 0xa47516ddc58a9f1d, + 0x5938da41f38dbe79, + 0xdb3a8e132491dce5, + 0xfd3e9b4652a4fc63, + 0x247ad36652961abf, + 0x3bcea4976f892a3d, + 0x8aec97476e7d38a9, + 0x15c6de2cbcaf5917, + 0x68b14fdfecb29783, + 0x56db87afe79485df, + 0xf7da8e621798a45d, + 0x1d9bfe53257ab3c9, + 0xbc1d4f97659ed237, + 0x723cb5d98592f1a3, + 0x8135de2dc5b74321, + 0xb8cd72fbae872f6d, + 0x3a9c426cbc683ed9, + 0x614ba851fb8c5d47, + 0x9e542da21a7f6cb3, + 0x3498bfc65c849b31, + 0xe7641c243764a98d, + 0xe6fbc2a98456b7f9, + 0xce163b9ba35bd867, + 0x2645c71ba27ce6d3, + 0x64acf53fe4a32751, + 0xb25c14ffef7524ad, + 0xa297f3c21f78542b, + 0x6ef5a9143e6b5297, + 0x8f3e61a65b6c71f3, + 0x68af39b87a5e8f61, + 0xfa187d3a97528ebd, + 0x4f2657ddc765ad3b, + 0x79fb46afe346dca7, + 0x825173e1f36aeb15, + 0xa1c489b3235dfa81, + 0x61a734f6536128ed, + 0xe51cdb687f64385b, + 0x5d6f4baa9e3846c7, + 0x14b3ec9bad4b8735, + 0xe435f92dcb4d85a1, + 0x34f2e95dc85e941f, + 0xd142be81f853c27b, + 0x91dea4532845c1e7, + 0x5a376e932638df45, + 0xc2f9d7576349feb1, + 0x5917c4e9835c1d2f, + 0xef17c62a9f413d8b, + 0xb64e1fcbad234bf7, + 0xdf14596fed286b75, + 0xbac58671fb3a79d1, + 0xd8c927621a2c984f, + 0xd418ec24372f96ab, + 0x5e6cf3987843d629, + 0xf59be6dba726e495, + 0x174d6cfba538e4f1, + 0x1dfeba5dc24b136f, + 0xb68e729baf1e32db, + 0x9c13de51fe326149, + 0xca78d1432d136fa5, + 0x614739865c278e13, + 0x8da691c54a198c7f, + 0x2d6b8736561c8aeb, + 0x61bf4ec9861fcb59, + 0xc571ae2cb612e9c5, + 0xa745639ed516f943, + 0xcfb87a1fe328179f, + 0xad247bc6542b371d, + 0x4fe3c6132efd3579, + 0x471e68943bdf64e5, + 0xb6afe4d98cf29463, + 0x6b5dea4879e582bf, + 0xc623e5fcb7f8a13d, + 0xf461dbadc4eabf89, + 0x296bdc1ba3ecbdf5, + 0x1c698af325e1fd73, + 0x468ace2653e41bcf, + 0x32b14da761f72b4d, + 0xae42bd665fe83ab9, + 0x3af5c2798ced5a27, + 0x21e6c78babdf6893, + 0x397aec4cb9c286ef, + 0x619a7381f8e4a56d, + 0xcfa2be4216e7b4d9, + 0xde95a7c326ebd347, + 0x945fcd3765cde2b3, + 0xd9685f2ba7e52431, + 0xec29b18ba2e5318d, + 0xc2d196498db63fe9, + 0x136c592cbdca4e57, + 0xc7521631f9ab6dc3, + 0x3e7a5d432abf8c41, + 0x6a72ce8437c28a9d, + 0x87eb1d5547d5c91b, + 0xae612bd654c6d987, + 0x45ea96d984bad7e3, + 0x1bc67e5ba3bdf761, + 0xf8c2b97fe3c125bd, + 0x39a6b5ffefc6453b, + 0xa57463c21fc853a7, + 0x53afe2854ecb8315, + 0x9268bce65cbd9281, + 0x9c7ed265468e7fcd, + 0x2eca15d98792ae4b, + 0x618324bba594cdb7, + 0xc84e9b1ed4a8ec25, + 0xa416357fe38afb91, + 0x1879ec33238c19fd, + 0x2caf1d8652c1396b, + 0xa4bfd8e65fa348d7, + 0xe389adb76eb97845, + 0x9a2de8b87d9a86b1, + 0xf91e36acba8c952f, + 0xf46592bed67fa38b, + 0xa19cdb2fe693c2f7, + 0x719e6a8328a6e175, + 0x168fe4743487efc1, + 0x9ea25717648a1e3f, + 0xb4a39df7617d2e9b, + 0x24ed5c1baf825d19, + 0xc3de841cbe936c85, + 0x8f29e4cedc867ae1, + 0x47289cafeb6a895f, + 0x5c9f38b2185d97cb, + 0x6dc75e83286fc739, + 0x71856fb54782e6a5, + 0xdbf1c83ba597f613, + 0x273dea6cb389147f, + 0x372e194dc17a23eb, + 0xf7db36adcf7e4259, + 0xcd6a28b1fe8271c5, + 0xc4ea9b821d758f23, + 0x816df4332b457d8f, + 0x568e94a439478cfb, + 0xcb98a3f6574dbc69, + 0xed5a1679864fcad5, + 0x89df27edc672fa53, + 0xa839c2fed36518af, + 0x72ac8561f169382d, + 0xaf4cde13215c3689, + 0xf389c4a32e3d46f5, + 0x45d6fa298e619573, + 0x9a256fb87b5483cf, + 0x387acfba9b57a24d, + 0x8937ec6ed748c1b9, + 0x12ab75ced64bcf17, + 0x7d46a23dc54fde83, + 0x143d5fc326531cdf, + 0x1a8eb94873462c5d, + 0x92cd578761473bc9, + 0x64f9ae398f2c5b37, + 0x6c92e7498d2e69a3, + 0xef58374dcd53a921, + 0x4f35bd7feb23a67d, + 0x2ad7ec91f826b5e9, + 0x84e7f5c2192ad457, + 0xf4cb63d6572be4c3, + 0x1cb2e479875ef341, + 0xd5b7213ba654329d, + 0x41f5326dc347521b, + 0x53d7c92cbe194f67, + 0x68f13c2cbc1a6ed3, + 0x83db25a1fb2e8d51, + 0xb7a45e943c218bad, + 0x7621ae465914ca2b, + 0x6f3ec1d54815da97, + 0xf24183a87619d8f3, + 0xb92e645ba52cf871, + 0xbc8213fba42f16cd, + 0xb17493cfe512364b, + 0x4379b26edef354b7, + 0x3bac7ef21ef98425, + 0xd956a2c54dfb8391, + 0x138d2ab549eb81fd, + 0x6aecb93547de9f5b, + 0xc45129e986f2bec7, + 0xfb9714eba7f6ed35, + 0x3526df9cb4e7fca1, + 0x54c78e2ed4ea2b1f, + 0x8c9546e213fe2a7b, + 0x43d6b1f652f149e7, + 0x5b38a7654fe37965, + 0xb2ed8af65de687c1, + 0x5c42e9187bda963f, + 0xb2f65a7987eda49b, + 0xa892e63cb7dfc419, + 0x9752ed11f7d3e285, + 0xce859ab437c6f2e1, + 0x63582f1546d9215f, + 0x8eab671653d92fab, + 0xb86dfa9871cd4e29, + 0x7a34e9698fc16d95, + 0xae18dcba9dc47bf1, + 0x7968fa4edbc58a6f, + 0x21db5c81f6c798db, + 0x8da4eb7217bdc849, + 0xba38cd1326afd7b5, + 0x8dfc953768c4f723, + 0x81b6437a94c6158f, + 0x1a6f258a93c824fb, + 0x5c1d83acb1dc4369, + 0x8cd13f7cbfae62d5, + 0x62974ec1fec29153, + 0xde3579421ca37e9f, + 0x94dc8fa43ba69e1d, + 0xe6af825436a8bd79, + 0x21fa5685468acbe5, + 0x2c45e6b9859feb63, + 0x753e628dc5a319bf, + 0x97a2bc8fe4b6293d, + 0x728ac1e1f1c837a9, + 0xa64d951432bc5817, + 0xf4e8c9532fae7683, + 0x8f79ed165c9184df, + 0xf6c823987c94a35d, + 0x265be9187a86b2c9, + 0x86593f2dc89ad137, + 0x6feb482dc57bdf93, + 0xf8d25c1ba36bdcef, + 0x3958f26215932e6d, + 0x8f59e67542853cd9, + 0x59271ba761a95c47, + 0x371ace465f7c6ab3, + 0xb5718dca9d7e8a31, + 0x6ed9a78cbc61a78d, + 0x6215fb8eda73b6f9, + 0x2a468de1fa98d567, + 0xc92b3af21879e5d3, + 0xcd1e2794378cf451, + 0x2eab4d37657f13ad, + 0x8e24b35ba694532b, + 0xbd357e1dc2a65197, + 0xf2cd9e4bad586fe3, + 0x543a9efdcd5b8e61, + 0xe16db591f94e7cbd, + 0x957a4de32d61ac3b, + 0x3fa845932953dba7, + 0x13f956854967ea15, + 0x8dc6f2e8765af981, + 0xb4563c8a945b17ed, + 0x4a857b3dc36f275b, + 0x3d46821fe18245c7, + 0xfc147dafef478635, + 0xa3dfe5632f5984a1, + 0x97dc3f654d5b931f, + 0x2c8b4e665c4ea17b, + 0x372519476941bfd7, + 0x1c7b652ba963de45, + 0x6849d3cba746fdb1, + 0x431bc7fed6591c2f, + 0xb25d39e1f34d2c8b, + 0xb7ac49e2124e3af7, + 0x25ed73f981426a75, + 0x759ae1b76f3578d1, + 0x9c1f2d576d28974f, + 0xf1d56e387d2c95ab, + 0xec78935cba3ec529, + 0x4a2687ceda41e395, + 0x6a179e2ed845e3f1, + 0x1ebfc2943948126f, + 0x2dc34a16564931db, + 0x94fcabe8752c4f39, + 0xe1bda499812f4ea5, + 0x756ebc8baf248d13, + 0x1395e8cbad148b7f, + 0xb52e638edc1689eb, + 0xb4cd6a21f81bca59, + 0x3791ab43291ed8c5, + 0x937fbdc76a21f843, + 0x4fc3e9d87824169f, + 0x327c4fbba728361d, + 0xd5f8b17dc51b3479, + 0x6ae29d1cb21c63e5, + 0xcf1425ecbdfe8263, + 0xa74c2f1edce281bf, + 0x728bf4921be49f2d, + 0xb7f68dc32af5be89, + 0x542e8a1437e8bcf5, + 0xc3f42d8656fbec73, + 0xa3c5e24764bde9cf, + 0x83a176ecb6f32a4d, + 0x6b15497ed2f538b9, + 0x2519f38fe1fa5927, + 0x398bf16321fc6793, + 0xc8f39e432dbc75ef, + 0x129dab365ce1a46d, + 0xb2afc7976ae4b3d9, + 0xd562437a9ae8d247, + 0xdecf7b3ba7d9e1b3, + 0x4b87d31ba6cbef21, + 0xb28fe54dc4be1f7d, + 0x7945c3b215c23de9, + 0xd8a41e6432e64d57, + 0x7cd34b2651e86bc3, + 0x14f289b76fdc8b41, + 0xbf73ea865cbe789d, + 0x61e28fba9ad2c81b, + 0xd586321feac3d687, + 0x7b8ec351f8b7d6e3, + 0x7359a8d328caf561, + 0xec975b2436ac14bd, + 0x18c639b876cf243b, + 0x287ae53a94d352a7, + 0x57942d3cb3d78215, + 0x9d1427bbaeb98f71, + 0xf23791cbab897ecd, + 0xdb798261fa8e9d4b, + 0x6389c7f32a91dcb7, + 0xc425a1e439a4eb25, + 0x95f6721547b6fa91, + 0xce3dfb4765a918fd, + 0x15cd84ba94ad286b, + 0xdc172aecb2af36d7, + 0x4a2985cfe1c28745, + 0xc6d7b82fefa685b1, + 0xcd87be921ea8942f, + 0xb4d268143e7ca28b, + 0x1a9c2e654a8db1f7, + 0xc631f9887a91df65, + 0x16afd4ca9784fec1, + 0x5c48d7acb6971d3f, + 0xfa49b71fe4782d9b, + 0x5c8d76e1f38d4c19, + 0x2943ce82129f4b85, + 0x47dfcbe652a379e1, + 0xe98c5b743e74985f, + 0x692eb8554e5796cb, + 0x6fe2cb998d7bc639, + 0xde51a98cb97ed4a5, + 0xfbca549eda92f513, + 0x74b8a19fe895137f, + 0xd4f67282168732eb, + 0xa512fb94368b4159, + 0xd35ae497627c4fb5, + 0xaebd763a918f7e23, + 0x6da5bf8a9e527c8f, + 0xfc6b2e5a9d548afb, + 0x5a7c483fed47cb69, + 0xb28c1761f84ac9d5, + 0x2fc874521a6de953, + 0xe35ba865496217af, + 0xae7c95876985372d, + 0xf75286ccb4673589, + 0xfd2a163cb27a64f5, + 0x2eb87f6dc16d8473, + 0x693eb8fbad4e72cf, + 0x3a287141fe63a14d, + 0x8fc35d221d34bfa9, + 0x276ae4c43b48ce17, + 0x12fc8b66594aed83, + 0x7de39a16563beadf, + 0xc7685b3ba8612b5d, + 0x69a54f3ed6543ac9, + 0x3c52419fe2485a37, + 0x6d2957e1f14b68a3, + 0x18ab3525435d9821, + 0xb914f8543e2f957d, + 0x5ab19fd76d32b4e9, + 0x462f5bda9c26d357, + 0xb43625aa9a48e2c3, + 0x4296dbedc95bf241, + 0x79ef41bdc74e219d, + 0x95aef4ced6413ef9, + 0xec7a58f218234e67, + 0xa3bdf64654276cd3, + 0x2b8da358723a8c51, + 0x7dc9b1a65f1c79ad, + 0x86b5a3287d1fa92b, + 0xfe45823cbc12d897, + 0xab7f368dca15d7f3, + 0xac5f3b8fea29f671, + 0xfda1e724382a15cd, + 0x3f514ae7681e254b, + 0x2dc5a1ba982153b7, + 0x5813749cb7168325, + 0xe28461fdc4378291, + 0x79142dc98bc67fed, + 0x94e1c3798cfa9e5b, + 0x496dcfecb8feadc7, + 0xfb58d6432af1ec35, + 0xba947f8438e4fba1, + 0xea9b48d658e72a1f, + 0x5b4831c765fa297b, + 0x5fe4682a94fc38e7, + 0x9341825cb2ef4865, + 0x4a73526ed2f386c1, + 0x5fad49bdced6953f, + 0xbd7e52421fe7a39b, + 0xc729f1a54debc319, + 0x2cae98f54aced185, + 0x9d7a31c768b2efd1, + 0xb14a8eca98c51e4f, + 0xb7f864aa95d62eab, + 0x945d6f1dc5ea4d29, + 0xb3948a61f2ed4c95, + 0xc5b8da6323ce6af1, + 0x7a9d28b541d2896f, + 0x2f1bdc443fc497db, + 0x24e9d3165ed8c749, + 0x3d586c2879cad6b5, + 0x54b96deba9bde623, + 0x81ba5f9ed9c2148f, + 0x7c15642fe7c523fb, + 0xe359a24217d84269, + 0x29da1bc434ca61d5, + 0x7e2918c762bc7f43, + 0xac12f3e651ae6d9f, + 0x39a2bf887fa39c1d, + 0x3d96a4298ea4bc79, + 0xc98aef1edb97cae5, + 0x3b912761f89bea63, + 0xb6825472168ce7bf, + 0xa9e31c2659b1283d, + 0x123ab74657c436a9, + 0xd972346ba4c95617, + 0x1cf3e2bba2cb7583, + 0xfdb4356ba19b73df, + 0xa2cde53cbe8f925d, + 0xb8d729a1fe83b1c9, + 0xb847a3d21d95cf27, + 0x38fe4a132b87de93, + 0x7df6e9443768dbef, + 0x79ac1366578e1c6d, + 0xced6b24ba6813bd9, + 0xe2f745ced6a35b47, + 0x1bca492fe2a769b3, + 0xb79e2c11f2ab8931, + 0xfa97c543217c968d, + 0xcbf569732d6ea5f9, + 0xaed923c65e92d467, + 0xe2fc56987b86e4d3, + 0x2759ce1bab89f351, + 0xa9687eddc87b12ad, + 0x3e5426aed78e412b, + 0x9b8fc46fe5914f87, + 0x96e38cf215846de3, + 0xa2cf673543978d61, + 0x92f56de541587abd, + 0x5a7e1cf76f5d9a3b, + 0xd5a28e376d4fc9a7, + 0xa9c7defcbc73e915, + 0x7491a3cedb65f781, + 0x384697d1f95816ed, + 0xb8fdec72197c265b, + 0x7b5cd8e3286e34c7, + 0x7c963f2ba7918435, + 0x4692acecb47583a1, + 0x847d29ecb367921f, + 0x51cfdb9bae389f6b, + 0xc5bed32a9c3baed7, + 0x6b73925fea3fcd45, + 0xa83167d32a53fcb1, + 0x8cdab1754a561b2f, + 0x3c926fd659472a8b, + 0x37b5ca19864b39f7, + 0x41c73e6cb63e4975, + 0xbd4861fdc45287d1, + 0x5e8a749ed153964f, + 0x742f189fef2694ab, + 0xbe59fc321f3ac429, + 0x68ceab754e3cd295, + 0xc5743a276a4ed2f1, + 0x5e71ab3a9b54216f, + 0x5721bd4a98352fcb, + 0x47a6915dc7284e39, + 0xd5c46b9fe62b4da5, + 0xe735b981f54e7c13, + 0xfe9b5d1324318a7f, + 0x984fad26512398eb, + 0xce8a9bd54f16c859, + 0x429c31876e19d7c5, + 0xa4216e7a9b1ce743, + 0x9c4fb2eba81de49f, + 0x69a45c8fea24351d, + 0xdc93b411fa164379, + 0x26c147d4381962e5, + 0x491f6736572c8163, + 0x4de39166531c6eaf, + 0x47e3fa2984319e2d, + 0xdf1723a76ef2bd89, + 0x5afd23c98ae4cbf5, + 0x178b46edcaf8eb73, + 0xd7382aecb6d9e8cf, + 0xd8feb61328fe194d, + 0x61297b8548f137b9, + 0xa853df1769f45827, + 0xec8f9b1ba4f87693, + 0xa1654f2982d974ef, + 0xe482d53ba1fc936d, + 0x1d92bc798ecfa2d9, + 0x12bc5481fce3d147, + 0x49a3f6521bc5dfa3, + 0x65bea3f54ac8fe21, + 0x13f586c548ca1e7d, + 0x6ecadf3656bd2ce9, + 0x9d6c5efba8e14c57, + 0xf1976c3cb5e46ac3, + 0xcf263a1ed3e78a41, + 0x62b183d1f1ea879d, + 0x518caeb432eda71b, + 0x16495ce32ebfc587, + 0x32c89fe76cb2d5e3, + 0xeba6dc198bc7f461, + 0xe8b2346879c813bd, + 0x3591e7bba8dc423b, + 0x3412beaed6ce41a7, + 0x5492acbed5b16ef3, + 0x468fcb5325c48e71, + 0x142b9cd432a57bcd, + 0x19b4d78651d89c4b, + 0x2a1d79c54f8dcab7, + 0x24eb69f87c9fda25, + 0x5643f1dbacb3f891, + 0x17e4bd5dc9a517fd, + 0x5874c1b1f8c9276b, + 0xa7b932c218ab35d7, + 0x19b683d328be7645, + 0xea2846f876c284b1, + 0x4721c93984b5932f, + 0x287b465a92c6a18b, + 0x26fd8a7a9d68afe7, + 0xfe26813bad8bce65, + 0xe432815cb97fedc1, + 0xc18e3f932b941c3f, + 0x26cab7543a852c9b, + 0x2871fec657a84b19, + 0xa1de8438769c4a85, + 0xc926b31ba49d68e1, + 0x9e6b387dc3a1975f, + 0x749fa62fe18395cb, + 0x6527831fef87c539, + 0x8fa7d2b21f79d3a5, + 0x3c648b265d8ce413, + 0xd216ac754a6de17f, + 0x14ae86c87a8431eb, + 0x32598e1cba863f49, + 0x637f8e4dc6784eb5, + 0x2fa1763fe58b7d23, + 0x2b6d95afe25d6b8f, + 0x1aefd873236189fb, + 0x2aed79654173ca69, + 0xa7f184943f46c8d5, + 0xb519a6287d6ae853, + 0xcd35e218794be5af, + 0xf92eca5cba7f162d, + 0xb5acf32feb723489, + 0x1a8b3f4fe98763f5, + 0x82e36a42196a8273, + 0xb94a6e84345a71cf, + 0xb5ed28c7625c8f3d, + 0x498a3c187251bea9, + 0x76bd41ca9f54cd17, + 0xe348dc9bad46ec83, + 0xa4f8d69cba37e9df, + 0xd12c6eb1f94c1a5d, + 0x4857ce921a4f28c9, + 0xcd628a954b625937, + 0xf5de7b19894567a3, + 0x4fa6c39cb65a9721, + 0x839d41bba23b947d, + 0x7625f1dcb14da3e9, + 0x729f546dcf41d257, + 0x6a92d451fd45e1c3, + 0xe91d73f32c47ef31, + 0xf5e276b54b391f8d, + 0xc96b2346583b2df9, + 0xe51473f9892f3d67, + 0xc874152ba8426bd3, + 0x546218aed7368b51, + 0x716c5d4fe32678ad, + 0xda649171f13ca82b, + 0x7912eda4312ec697, + 0x2fcabd165e21d6f3, + 0x73a914c98d24f571, + 0x954cfa798b2714cd, + 0x1e4856ca9c1a234b, + 0x416fa7edc91d42b7, + 0x53e419bed93f7125, + 0x74826f3fe6237f81, + 0xe98fdc7325147ced, + 0xde59a68543179d5b, + 0xa31b26c65219abc7, + 0xbad513776efcdb35, + 0xed4a5cb76bdfe9a1, + 0x352c4e7babe4291f, + 0x2a7cf9bedaf5287b, + 0x2673ef4ed8f936e7, + 0xf5b8349219fc4765, + 0x678ecba436fe75c1, + 0xa48291e876e1943f, + 0x391a4c8873f4a29b, + 0x27f83ceba3f7c219, + 0xe2dc14998ed9cf75, + 0xfea261c989baced1, + 0xaf21c37cb8adec4f, + 0xa2d4e95219e32dab, + 0x2c79d5843ae64c29, + 0xb164ce5437e84b95, + 0x6f34bda875db69f1, + 0xf7136baa93cd786f, + 0x398415dba3e196db, + 0x1c679f2ed1e3c649, + 0x4b97f25fefc7d4b5, + 0x7b4fac321fcae523, + 0xb147fe643cabe28f, + 0xe824c1d659ae12fb, + 0xdbe31fa98bd34169, + 0x5c1ef48a98b64fc5, + 0x9c8ead6cb6c97e43, + 0xacebf61ed3ba6c9f, + 0x916d8b41f3ae8b1d, + 0x7514e9b323d1cb79, + 0x5d3f78a541b3c9e5, + 0xad3cb2554fb7e963, + 0x6fe125c54c98e6bf, + 0x249631a98bac173d, + 0x752af6bdc8bf25a9, + 0xcda92b6feac36517, + 0x758c3491f9c67483, + 0xad83f65215a872df, + 0x9a176fc434ab915d, + 0x7e6b3ad5427d8fb9, + 0x5cfeb91983a1ce27, + 0x369e1bf87f84ed93, + 0x1f5e2cb98b75daef, + 0x3cbd12ffec891b6d, + 0x74b25311f87c2ad9, + 0x3f9d4a221b9f3a47, + 0x678e5c1549a268b3, + 0x78b6ce3657b69831, + 0xaf73285763a7958d, + 0x641ed359827ba4f9, + 0x9761defcb19ec367, + 0xf517926cbf81e2d3, + 0x841329ffed96f251, + 0xa9865df43e8721ad, + 0xd18562354c793f1b, + 0xec2a17854a6c3e87, + 0xf5d8a937687f5ce3, + 0xcf3e172cb7938c61, + 0xe8ba1d4dc36479bd, + 0x4c3b71afe267a93b, + 0x6d5c7e91f15bc8a7, + 0xbf8a9e14327ed815, + 0xfa967c254e72f681, + 0x342edf776c7415ed, + 0xc43d712a9d78245b, + 0x782fd3ea9b6a43c7, + 0x4f1973ddca8d7235, + 0xb2937eced86f72a1, + 0x7ba2e54dc4527efd, + 0x8b327c9213549e6b, + 0x17fa94643246acd7, + 0x4a93d8b8716adc45, + 0xd139f5e76f4deab1, + 0x6d25a81a9d631a2f, + 0xd238e67dcd54298b, + 0x172a46fedb4638f7, + 0x165e3a21fa3b4875, + 0x9eb64c33294c76d1, + 0xaf693c43273e854f, + 0x9b6e4ad8765293ab, + 0xdf45b31ba456c329, + 0x3c4e2a5cb248d195, + 0xb597d2698d39cfe1, + 0xc58afe6a9a2bed5f, + 0x175be6c1fa412ecb, + 0x5864df721c254d39, + 0xe2cbdf443b274ca5, + 0xd52c3817694a7b13, + 0x2d1c7ea9852c697f, + 0x732c5b6a942f87eb, + 0x78952e3ed432c759, + 0xfd61324fe124d6c5, + 0x582a6f4edf19e643, + 0x38a59fb32d1ae39f, + 0xba24cf976c3e241d, + 0x5cef26d98d314279, + 0x852a14ba9b2461e5, + 0x362a85ecba187f53, + 0x8c2f49acb5186daf, + 0xa546193fe51b8c2d, + 0x849b1d2fe31fac89, + 0x4657abe43412caf5, + 0xb1f549a76215ea73, + 0x1fbc62d43bd5e7cf, + 0x4af23be76cfa184d, + 0x49fa65c87afd26b9, + 0x135f94acbaef4627, + 0xb5e23a1edaf27593, + 0x38af79ddc6d573ef, + 0xa9b3c46215f8926d, + 0xb52f4d1434fba1d9, + 0x68c21e4652edbf37, + 0x4a631fe872f1dea3, + 0x361957e98ec5fd21, + 0xf83eda6a9be61c7d, + 0xb92fd54dcad82be9, + 0xdc1b6781f9ed3b57, + 0x2f8397b218df59c3, + 0x2a319d865ae38941, + 0xd8c79f4435e4869d, + 0xd49c8e3874e8a61b, + 0xa278cf4a92ebc487, + 0x34d1b52a91bdc4e3, + 0xd928f53cbec2f361, + 0xb3497561fec512bd, + 0xcaf389632ed8413b, + 0xf1bce3932bca3f97, + 0x738951e548ab5df3, + 0xd831a7b658bf6d71, + 0x9a5d214985b27acd, + 0x6871bd9dc3d59a4b, + 0x359af24fe2d6c9b7, + 0x3948cba1f1cbd925, + 0x81a6ef9432bde791, + 0x5189cf754ea216fd, + 0x4b3c6fa87ec4256b, + 0xb1985ae76cb834d7, + 0x68b475aa9acb7345, + 0xf9147a3dc8ad73b1, + 0xf3a18b9dc6ae812f, + 0x7945f36fe4a29f7b, + 0xfc9423521394ade7, + 0xc7b594e432a8cd65, + 0x12ca9df65289ebc1, + 0xfbad41865d7cea3f, + 0x839a4cd87e812a9b, + 0x1784efddcdb54a19, + 0x7f5b4c9fecb74985, + 0x148792d1f89a67e1, + 0xcfab2562179c865f, + 0xd39f7413257f84cb, + 0xc86e425876a2c439, + 0xf67d45b98396d2a5, + 0x398e254cb4a9e213, + 0x32c6d5798c59de6f, + 0xe324a17a9a6c1fdb, + 0x16c5abe1fc813e49, + 0xec7698521c834db5, + 0xab8651754b987c23, + 0x2ca61b9437596a8f, + 0xbc728397645c78fb, + 0x1f962e8ba35fb869, + 0x738ecdacb382c7d5, + 0xcef97baed196e753, + 0x2483b9fdcd57e4af, + 0x12bd59843f7b152d, + 0xac71be254d6e2389, + 0xc6b198a87c8162f5, + 0x613984cbac958173, + 0xe8ba564a98456ebf, + 0x52e67facb6598e3d, + 0xf4a7d1bfe34c8da9, + 0x61bf79dfe35fbc17, + 0xb98aec421462eb83, + 0xc4d951743154e8df, + 0x145b2e376f48195d, + 0xb48271c76e4b27c9, + 0x2b1e648bac5e4837, + 0xeb4c987edc5176a3, + 0x2139687feb759621, + 0xae589731f846937d, + 0xcfb2d6321648a2e9, + 0x4a21b5f4364dc157, + 0xe478dc37624ecfb3, + 0xb6d2cf8a9264fe31, + 0x6d457c3a9f351e8d, + 0x2854db3bad372cf9, + 0xb67d389fed2b3c67, + 0xe32d6bc1f92e5ad3, + 0x157f98643c428a51, + 0xd9236b85492387ad, + 0x296b81365836a72b, + 0xe295c7b9842ac597, + 0x145d8cba942bc5f3, + 0x47ac86dcb23fe471, + 0xfa5c691cbf2413cd, + 0x9653b4a1fe17324b, + 0x74c6e9143e2941b7, + 0x7bd18fa54c2b6f15, + 0xf4be36c65a2d6e81, + 0xf3d281a768217bed, + 0x1e68bd3ba7139c5b, + 0xe12b647ed415bac7, + 0x84c29d6fe419da35, + 0xa1c7e351f32ce8a1, + 0x92f67de5432de71f, + 0xe7a38fc54ef1267b, + 0x4ae1fc576cf435e7, + 0x6ae59cf98cf97465, + 0xd53b7f1989fa74c1, + 0x196b784ba7ec823f, + 0x37fd425dc5ef819b, + 0x746d83fdc4d2aef7, + 0xc72ae53213f4ce75, + 0xc7df5a6543f7ecd1, + 0xa9b2f71651d9eb4f, + 0xb4a63e865fde1cab, + 0xd5c7b6198de14b29, + 0x51c8729cbce34a95, + 0xa12b683dcad768f1, + 0xfd6512afe5da876f, + 0xbef5a37216ec85db, + 0x875d43e326dfb549, + 0xa3e269f876e2d3b5, + 0x37c452aa95d7e423, + 0x4d72cf8a92c7e18f, + 0x5c24d1e98eca21fb, + 0x84e6135bacbd2f59, + 0xa9452ec1fab14ec5, + 0x9b4628721bc57d43, + 0x7c98f3a328c56b9f, + 0xda1f28c546c98a1d, + 0x8673d2a654cdba79, + 0x18f3e59873afb8e5, + 0x95de64fcb4c2e863, + 0x7bd9fa8dc1a4e5bf, + 0x2f1c586fefb9163d, + 0xb8cf6d721fbc24a9, + 0x5feb4a743dbe5417, + 0xdb92ca876dc17283, + 0x9f2bda4769a471df, + 0x2a3854da97a68f4d, + 0x3f56d4adc4a78eb9, + 0x43f7d51fe49cbd27, + 0x71fc6dafe28fdc93, + 0x5e6da7421382d9ef, + 0x576e32f542b51a6d, + 0x7ebdc5f54fa728d9, + 0x3f8bd5776eac3947, + 0x7d15f3b98c9e57b3, + 0x58fb6a2edcb29731, + 0xf41c792fe7a3948d, + 0x192f7bcfe586a3f9, + 0xb4cf52e2159ac267, + 0x6521fd35458bc1d3, + 0x724ade87638edf41, + 0x8ca4291872831f9d, + 0xe6cb718a9f863e1b, + 0xad32ce8cbe693d87, + 0x7ef16a4edc7a5be3, + 0x7a1bc531fa8e7b61, + 0x95d4fa332a6178bd, + 0x94b3ce832974a83b, + 0xe58f97143485c6a7, + 0x7f42e56a948ad715, + 0xc2bd387ba37ce581, + 0xb186fd4a916cf3ed, + 0x493ac6eedf84235b, + 0xaedb5311fe8642c7, + 0x1695fe732e8a7135, + 0x1a2f98743c5b6f91, + 0xb9f57a24384b6cfd, + 0xca4b896878519d6b, + 0x15ec7a6a9653abd7, + 0xfe2ab45dc367db45, + 0x94c3a87ed358e9b1, + 0x3eca9f5ed15be82f, + 0x8bcfd674325f178b, + 0x5136fed54e5236f7, + 0x6573824a9e384675, + 0x47bfea998c4975d1, + 0xe384b65a9a5b834f, + 0x15f3d48dc74e82ab, + 0x4927586fe863c129, + 0x8da9623fe643cf85, + 0xd34a7fb32546cde1, + 0xd15a8f954238ec5f, + 0xc8d41727624a1dcb, + 0x9da135487e4f2c39, + 0xd3e765aa9e324ba5, + 0xa879d51dcd467a13, + 0x6152cf4edb29687f, + 0xed38c4b1f72a86eb, + 0xbe83a472182eb659, + 0x859f4d376831d4c5, + 0x7c435fda9826e543, + 0x16fab5e98436e29f, + 0x4968fc2cb45a231d, + 0xe1f75a2cbf2d3179, + 0x2ed8c54bab1e3fd5, + 0xd96c7b31fc127e53, + 0xbf985e632b146caf, + 0x97fc5b854a178b2d, + 0x3682ad55461cab89, + 0xbf852ac8761db9f5, + 0x26e8759cb621e973, + 0x8271efcba413e6cf, + 0xd597836fe328174d, + 0x37fec82edef825b9, + 0xbf9236a21efc4527, + 0x38d19c732cfe6493, + 0xb84c6a165ad172ef, + 0x64acf5e87af4916d, + 0xe941fd2876e58fc9, + 0x79425e6ba5f9be37, + 0x72af185a94fbcda3, + 0xf27ea1dcb4dfec21, + 0xafcb761324f31b7d, + 0x582e9ab541f52ae9, + 0x693f1b254fe93a57, + 0xe5f847976deb58c3, + 0x61d83caa9bde7841, + 0x74516c3cbae1859d, + 0xc69e123ed8e4a51b, + 0x1b36cae1f5e6c387, + 0x543cb6a216d9c2e3, + 0x2f85eb6545dce261, + 0x9c7f6e15429cefad, + 0xefadc62981d43f2b, + 0x7c4db5f98fc53e97, + 0x48f3a2ba9db85cf3, + 0x639f8bafeadb6c71, + 0xbc6749a1f7ae69cd, + 0x98561df328d1a94b, + 0xe91648a326d3c8b7, + 0xdba82f1546c7d825, + 0x9f3bdea874cae691, + 0xf92c13b8729ae4fd, + 0x5ef78d3ba2cf146b, + 0xf34e1dbdcfb243d7, + 0xc841a3b1fec87245, + 0x495bc2643ec972b1, + 0xc891b5a43b9a7e1f, + 0xab4197f4369d8e7b, + 0x3b6dfc265691ace7, + 0x75613daa97a3dc65, + 0xdec2873cb496eac1, + 0x9a6b857dc2a8e93f, + 0x23418ca1f2ad189b, + 0xc9851fd542bf3819, + 0xb72416a43fb24785, + 0x57982c654da576e1, + 0x1c34abe76ca9845f, + 0x25a4e187697a83cb, + 0x9a3e571dc78eb239, + 0x1b9c3d8fe792d1a5, + 0xc6a32b8ed584cef1, + 0xec265bd21385ed6f, + 0x759ed31543781edb, + 0xdce48397618c2d49, + 0x7e84a5176e7f3cb5, + 0xbd38e9fbae947b23, + 0xa348ce1cbc74698f, + 0xaf61bc5eda5687fb, + 0x87b4c131f85cb769, + 0xe972d4f2187eb6d5, + 0xe2689b754891e653, + 0x8591ac476574e3af, + 0xcb958d2ba598142d, + 0x8652beddc17b3289, + 0xe132f94bae7c41f5, + 0x8e715dfcbc7e5f63, + 0x413d957fea526dbf, + 0x34f7db921b658c3d, + 0x8af9c4e32b468ca9, + 0xfca31985485acb17, + 0x241faeb8765eda83, + 0x485fc61a9451e7df, + 0x1b8df73dc374185d, + 0x761a4c3fe15726c9, + 0x85f29d1fef5b4637, + 0x2e37b6421f4d65a3, + 0x2e671a554d6f8521, + 0xf37c81476c53927d, + 0x3c1f62587b45a1e9, + 0xc17529bba938bf47, + 0x34be967ba649ceb3, + 0x517a6d4cb65ced31, + 0xdc875141f4521c8d, + 0xa8746b3213542bf9, + 0x79be3cd651483b67, + 0xda4e21376f2a59d3, + 0x793261c98e3d7951, + 0xab19c3e98b2f76ad, + 0xb35efa7edc43a62b, + 0xba9152ffea25c497, + 0x6f1254bfe728c4f3, + 0xf8673153284be371, + 0x579a61f5453bf1cd, + 0x86ce723a9762314b, + 0x1b632a4a91243fa7, + 0x53ef1b8baf286e15, + 0x396ced2cbe2a6d81, + 0xea96d38dc91b6aed, + 0xc4da98bfe91f8a5b, + 0xeaf614d43a12b9c7, + 0x8b5a63254a16d935, + 0x1d8e64365628e7a1, + 0x4a162dc9852ae61f, + 0x7e43c6bba42e157b, + 0xab7f1e4dc52134e7, + 0x519f6eddcef27365, + 0x86a3579fedf673c1, + 0x657ec9f32ce9813f, + 0x53fa849329ea7f8b, + 0xf1546de436ec9df7, + 0xa83f52c768f1cd75, + 0x3badc57986f4ebd1, + 0x13acbeda93d6ea4f, + 0x42a8671ed3f819ab, + 0x9683c15fe1fd3a29, + 0x345fbae321ef3895, + 0xbcf65d354ed367f1, + 0x9afc21743cd4856f, + 0x2341ef865ae784db, + 0xec93a14878ecb349, + 0x8735eaca97dec2b5, + 0xe9216abdc8d4e123, + 0x1824be7dc4b3de7f, + 0xe78c9fd324c61feb, + 0xda56321543da2e59, + 0xce3a4d7761eb3dc5, + 0xae38d4f87ebf6c43, + 0xe9612fd87dc26a9f, + 0x1c8d956babc5891d, + 0x6b72a8ffead6b879, + 0x5db632c1f6cab7e5, + 0xb54cd79218bed763, + 0xda617e4436a1e4bf, + 0x542cf1b987c6153d, + 0x9a47b6c984d723a9, + 0x7c86e3bba2db5317, + 0x21bef36bafbd6183, + 0xa4286d1a9a8d5ecf, + 0x5eb18921fba28e4d, + 0x927eb4821ca48db9, + 0x465e8fa439a8bc27, + 0x3ae95715468adb93, + 0xd6347e16547bc8ef, + 0xdf83615ba5b2196d, + 0x15b9dfedc3b427d9, + 0x1b3c45afe1c93847, + 0x1423f8cfef9a56b3, + 0x3d187f632fad8631, + 0x4eac65332c9f738d, + 0x791c6e365c83a2f9, + 0x61fcad798ba5c167, + 0x5364a7ca9687bfc3, + 0xd5f9e38cb68ade41, + 0xbcf35d2ba36bfc9d, + 0x147b2361f5923d1b, + 0xa572b49212a43c87, + 0x376efb1541975ae3, + 0x3527e9154f8b7a61, + 0x9c2b71e54e5c67bd, + 0x4db57e198c6f973b, + 0x95abc38edb82c5a7, + 0x4f96c1dfea97d615, + 0xd749be61f679e481, + 0x479ba2f21569f2ed, + 0xea51c8b5468e125b, + 0xe35a29d9859241c7, + 0x5984cb3ba1946f25, + 0x9278eb6baf576e91, + 0xca6b357a9c486bfd, + 0x25bfd48fea4d8c6b, + 0xf53d1c9fe84f9ad7, + 0xf4dbae221b72da45, + 0xcbf812743965e8b1, + 0x5679cba54658e72f, + 0x81ad546a945c168b, + 0xd92fe16ba36d25f7, + 0xe7a2416ed2916475, + 0x2fb513adcf6574d1, + 0x38f5d42fed57824f, + 0xc69ebfa32e4981ab, + 0x8fbdce743b4caf19, + 0x8791ad25493fbe85, + 0xb31d6ac87853dce1, + 0xda61347a9734eb5f, + 0xc891f27ed5471acb, + 0x3b4762ffe45c2b39, + 0xe219dcb1f14e39a5, + 0x1b92fa8654627913, + 0xbc17e3954e23867f, + 0xd51c36254d2685eb, + 0xa2d3f8e87d2ab459, + 0x3db26f49892db3c5, + 0xa3e72f5cb95fd243, + 0x3f576a8dc743e19f, + 0x5a236c11f857321d, + 0x9c4abf6215382f69, + 0x5e74f1a7642a3ed5, + 0xfba96dc9812e6d53, + 0xc85423f87e216baf, + 0x4a76f82a9e148a2d, + 0xf48b132dcd15ba89, + 0x3ef1478eda19b8f5, + 0x3ea148b1f91cd873, + 0x539b1f43271ed5cf, + 0x9a5c68487923164d, + 0x4269ea19871624b9, + 0x42e8c1acb61a5427, + 0x361a298cb41c6293, + 0x543b69a98cdb61ef, + 0xfba47c5a9ace7f5d, + 0x39a5ec1edaf28ec9, + 0xf297b8321af5bd37, + 0x63db871328f7dca3, + 0x7632dab657faeb21, + 0xec69df8654ecf97d, + 0x9b12cf5ba5f128e9, + 0x78a3f4ddc2f43957, + 0xf13b862ed1f857c3, + 0x4a18fecedfeb8741, + 0xdf4eac221fec749d, + 0x92486af43cdf941b, + 0x4e6fd2865be3c287, + 0xab8f3e5879d6c1e3, + 0xb8a7d5ea97c8df51, + 0xda4819b874b8fead, + 0x1625d3bba5cd1e2b, + 0x85edab91f4e13d97, + 0xe489fc7212d45bf3, + 0x98ed36a542e86b71, + 0x984e17c43fb968cd, + 0x18abcd965ecd984b, + 0xb2fe87c659cfa6b7, + 0x58f42c6cbac3d725, + 0x9f65e13ed8c6e591, + 0xba34e78dc5a7e3fd, + 0x578143a327dc136b, + 0x81cd2ae545be32d7, + 0x57cdaf8a96d27145, + 0xacf1936982c46fa1, + 0x7d1a2ce98ea67d1f, + 0xe7adfb176ea98d7b, + 0x96a3428eda8c9be7, + 0x4cb2f97fe89fcb65, + 0xbd86359328a3e9c1, + 0x3f9b6e8327a5e83f, + 0x2eb3dc8545c8179b, + 0x7a39b26985bc3719, + 0x3e6fb2dba2be3685, + 0x9b678e1dc3b275e1, + 0xf86a514dcea4835f, + 0xc76b3151fe9682cb, + 0x4786fdb32e8ab139, + 0x4e895f332a7cbf95, + 0x913b5da5487ebdf1, + 0xf863b2765782ec6f, + 0x75fad8ca96851cdb, + 0xafc3429ed5a82c49, + 0x2dc9f4bfe28c3ab5, + 0x5cd689e1f19e6a23, + 0xa51f248432a1678f, + 0x4c5f81632e7386fb, + 0x9ef857a43e87b569, + 0x9a2fe8576c79b4d5, + 0x8fa5d1ca9a8cd453, + 0x3cef765a976ed2af, + 0xd479a15fe895132d, + 0xde4cb251f5a63189, + 0x65f94ca214783fe5, + 0xe6d15875428b5e63, + 0x59cf7bd5416d5cbf, + 0xeb3f89687f618b3d, + 0xc1e32fd87e538ba9, + 0x8a2c34fcbd56ca17, + 0x478a329feb5ad983, + 0x897a51cfe74ac6df, + 0xb5af2382184ef65d, + 0x19fd85c5487325c9, + 0xdceb98fba6984537, + 0x8a5fd41cb27964a3, + 0x3846ad7cb37c8421, + 0xf3684e2baf4e817d, + 0xf9d2a57cbc418fd9, + 0xeda1bc61fc53be47, + 0x4327ebd21a46cdb3, + 0x7bd192354a59ec31, + 0x29c76155463bfa8d, + 0x2d931ea8764e1af9, + 0x426f987dc8523a67, + 0x75abd49dc24658d3, + 0x85caf37fe24a7851, + 0x53b8f71fef2b75ad, + 0xd6a843521f3e952b, + 0xbead28365e41c397, + 0x52439c887b45c2f3, + 0x862bec1a9b48e271, + 0x5b43da998627efbd, + 0xf395b2eba74c1f3b, + 0x7156da3dc53f2ea7, + 0x4cdbe311f7436d15, + 0x1dfb934324356c81, + 0x15ce7285412769ed, + 0xa2538d654f1c895b, + 0x64938fc65d1ea8c7, + 0x1e6bf93bac21d835, + 0xf67b89adcb24e6a1, + 0x138945adc927e51f, + 0xdb237181f82a147b, + 0xc963fad5481c23e7, + 0xc951e6f8781f4265, + 0xadebc13a963472c1, + 0x34c5b87a93157e2f, + 0x4ea79c176df57e8b, + 0x125d3c876be89cf7, + 0x56e1289ba9fdbc75, + 0x5d41837cb7efcad1, + 0x6974f5a218d2e94f, + 0x9e84db7437f518ab, + 0xdb69f47656fa3829, + 0x76c9b2a984fc3795, + 0x72bdac1a93ed56f1, + 0xe49af5dcb2e1846f, + 0xde14385bafe483db, + 0xb3768e51fde7b249, + 0xbe7af6d32de9c1b5, + 0x2a3df8b549dbcf13, + 0x4bad576436aecd7f, + 0x8543179767c31deb, + 0x9c31d52ba7e62d59, + 0xdcf73b6ba4e83bc5, + 0xa2637f5ed2ec6b43, + 0x42ad738fe1cd589f, + 0xda2b7c3543e2981d, + 0x65713e932fd3b679, + 0x58429d643dc7b6e5, + 0x1498d6b87bcad563, + 0xf9edb787679ad3bf, + 0x42e5d67a97aef23d, + 0x8f17362fe7d432a9, + 0x5e8a64d1f6d85217, + 0xb5293fc214c95f73, + 0xe1a4986432a95dcf, + 0xc39b8f7651ae7c4d, + 0xfa2e6b465fa18cb9, + 0x35f17ad98ea4cb27, + 0xe65ac7398cb6da93, + 0xdc41253cb698c7ef, + 0xb4cd253fe59bf76d, + 0x683517c327af16d9, + 0x2c8af16659c23647, + 0x26c759a984c765b3, + 0x2cad361a94ca8531, + 0x3862ab7a91ab728d, + 0xf39b162bae7d81f9, + 0x81a4e65dcd91bf57, + 0x15be3821fa84bec3, + 0xcd49bf832b97ed41, + 0x8b49f6132867fb9d, + 0x38ac9be6578d2c1b, + 0x4c1fb2a7659f2b87, + 0xf5ac768cb6a259e3, + 0x768ebafed3b57961, + 0x8bfa179fe19876bd, + 0x5d78b26fef7c963b, + 0x4853e7d21f6eb4a7, + 0x1c79b8a76e92d415, + 0xc1e358276c95e381, + 0x3962dea65976f1ed, + 0x572861bdc98a215b, + 0x69cf48dba56c2fb7, + 0x274eb16dc68f4e25, + 0x4513b971f4836d91, + 0x4a59f68212746afd, + 0xea652b4431578a6b, + 0xd5e9c8a43f4ba9d7, + 0xb43d59287d6ec945, + 0xa18c547a9c62e7b1, + 0xe3d9a87cba74e62f, + 0xb2c3f54fea67158b, + 0xc968475fe86a24f7, + 0x9265cde2198d4375, + 0x7e2d9f65457f63d1, + 0xb86df14a9573814f, + 0xafbc764981547f9b, + 0x5f2e3a698f47ae19, + 0x4358efda9e3abd85, + 0x284de56ba94dcbe1, + 0xe2165a3ed941ea5f, + 0x68f7de432a5419cb, + 0xcdb52f854b572a39, + 0x9483c1b7674b38a5, + 0xfd685b4ba75d6813, + 0xf4b6d9eba23e657f, + 0x172f58bdc15284eb, + 0xce517b8edf26b359, + 0x38b27591fe38b2c5, + 0xce5d4b732e5bd143, + 0xa2c5b744392bce8f, + 0xcf2794a769421efb, + 0x26b49df98a342e69, + 0xd6c53b4ba8273cd5, + 0xf8c356eed72a6c53, + 0xb534279ed32c59af, + 0x7f685cafe13f792d, + 0xa68e91f54132b789, + 0x85e1dc943e14b7f5, + 0x327cfbd65e19d673, + 0x25e4dc776a19d4cf, + 0x3794bf19891cf34d, + 0xaceb9f1eda4123b9, + 0xad7fb89fea165327, + 0x6e9a7d41f7286193, + 0x3de7894324185edf, + 0xedcf1a65431b7e5d, + 0x3c472966521f7dc9, + 0xb592e8f76ef1bc37, + 0x59f42d187cf4dba3, + 0x46c5eb3a9bf7ea21, + 0x3925d46cb6e9f87d, + 0xb7cf2e4ed6fc17e9, + 0x79e2f68219ef2857, + 0x36bdec9548f256c3, + 0xab3e7c4a95f78641, + 0xfe14b97762f8739d, + 0x94fe367982fc931b, + 0x71c8d24a9fdeb187, + 0x58cfd74a9ac1bfd3, + 0x93ac71d1fac4de51, + 0x765928f218b5fcad, + 0x89cbd61548e91d2b, + 0xd853196546ed2c97, + 0x41e35d6876ce4af3, + 0x856f137cb5e36a71, + 0x154e29dba2e467cd, + 0xbe91f78ed1e8974b, + 0xb956a4ffefdca5b7, + 0x4b6ed5821fbec625, + 0x2618bc365dc2e491, + 0xd12b478659a4e2fd, + 0xb35861f87ad8126b, + 0xaf3ec71a98ca31d7, + 0x278f134ba7bc4f35, + 0xa1623eddc4bf5ea1, + 0x3d96748fe4b37c1f, + 0x2ea3f86212d48c7b, + 0xcb1892a431c69ae7, + 0x98517f443f9bca65, + 0x123f67b65b9ed8c1, + 0x53fe46998ba1e73f, + 0xb416a89edac4169b, + 0x718a492feac83619, + 0x674c5e11f7cb3485, + 0x36f7a4b327ac64e1, + 0xd51ef29434ae725f, + 0x4da8eb9764a381cb, + 0x2365bac871b5af29, + 0x5cbf87a76f87be95, + 0xd647cfb98d79bcf1, + 0xf15e263ba97cdb6f, + 0x3495ead1f9821adb, + 0x879354c21ca52b49, + 0x3f4189c328a739b5, + 0x8ac6243657ab6923, + 0xbd9ef838739c568f, + 0x86d7be5a928e75fb, + 0xf46b832ed1a2b469, + 0x218d4afdcf86b3d5, + 0x4d93c851fe89d253, + 0xafe46bc32c69d1af, + 0x1f74b654396bef1d, + 0x81b4d6765b812f79, + 0x239cb5d879843de5, + 0x5ac71decb7985d63, + 0xf89be54dc3685abf, + 0x9af1468fe26c7a3d, + 0x5bd6278fe15f78a9, + 0x8621d7554283c917, + 0x9e4acf132f65d783, + 0xd756cb843b47c5df, + 0xe32b96887b6af45d, + 0x9e1cfab98a6e14c9, + 0x873aeb1edb915437, + 0x271fc58fe98562a3, + 0x79b136a1f6798321, + 0x79e5ca6213497f6d, + 0x472dcf94324b7ed9, + 0x537ecfb7615fad47, + 0x49ce31b87f52dcb3, + 0xe3af714a9d56eb31, + 0x1e632b8bab36f98d, + 0x76f2345eda4b18f9, + 0x8d6179e1fa4e2967, + 0x9d6be4832a6157d3, + 0xc62b79f43a648751, + 0xc217e659853674ad, + 0xec591bf9835a942b, + 0x4e6dc5fba14db297, + 0xdf68531a9d4eb1f3, + 0x43a2e7dcbc43df61, + 0x7815394dc924febd, + 0x31e74cb32c481e3b, + 0x89237fe5493b2da7, + 0x4b31a288793e4c15, + 0xf21c837ba9426b81, + 0x4f9658bba52368ed, + 0xae2bf85ed326985b, + 0x4c31d86fe129a6c7, + 0xc6a927dfef1dc735, + 0x17da4b243e2fd5a1, + 0xce7439a76c23e41f, + 0xfb6415d98d26137b, + 0x762d43998b1932e7, + 0x3c2f697cba2c4165, + 0x6be3f29ba72d5fb1, + 0x384d167dc6317d2f, + 0x465ed791f4137d8b, + 0x9716ef8323159bf7, + 0x5dbc7a654219cb75, + 0x8edc13954efac9d1, + 0x42e698d65aecd84f, + 0xa416f2c98cf217ab, + 0x179fae8dcbf53729, + 0x184567aedaf83695, + 0x28a59e4ed7ea65f1, + 0xa69b354215ec736f, + 0x8aed765434ef72db, + 0x64cedf9875f3b149, + 0x8a9c3f2871e4bfa5, + 0xac2df6b87fd8ce13, + 0x371ecdb76ab9dc7f, + 0x46732b59879cfaeb, + 0x269e14b1fae12c59, + 0x3274ecd219e43ac5, + 0x6ced581329e86a43, + 0xfe1498c434da579f, + 0x73cd2af764ec871d, + 0x7a1f42b982dfa579, + 0xd47efbcba1d2b4e5, + 0x9264d8ecbfc7d463, + 0xa85b7d2feca7d2bf, + 0x5b6418e32cbaf13d, + 0x32cf6e854bce21a9, + 0x78cdb39769b13ef5, + 0xd9e1c2f989c45e73, + 0xdc35694984a65bcf, + 0xbd539c1ba3c97b4d, + 0x5764dbafe2cd7ab9, + 0xf1b6c57fe1cfba27, + 0xa9cebd1541c2d893, + 0xa1b536932d94c6ef, + 0x87ab2cd43ca8f56d, + 0xa428bf776cab15d9, + 0xe45ad82a9abe2547, + 0x6f185c2ed9c164b3, + 0x58439dafe9c68431, + 0x5e1639c1f4b6718d, + 0xd2af3b5213a87fe9, + 0xb27aef44329cae57, + 0x7b9d8fc6518fadc3, + 0x638eadb87f93ec41, + 0xb319e2a76c74fa9d, + 0x73286ebdcd982a1b, + 0xc7846b3feb9c2a87, + 0xe68acd31f79d48e3, + 0x5d8146a43ab27861, + 0x5df4e873269375bd, + 0x1d359ef764a7953b, + 0x9d52bc376289b3a7, + 0x91fd64bba29dc315, + 0xc537f6ebae7fd281, + 0x5afe73ba9a62efcd, + 0x861fbc7fec861f4b, + 0xbd5679821c682eb7, + 0xd8f21a643a8b4d25, + 0xa1e5b685487e5c91, + 0x32c75f69857169fd, + 0x1a24d7bdc473896b, + 0xda56f98dc265a8d7, + 0xc915bd6fe17ac845, + 0x5ac31f7fef5cd6b1, + 0xae54b3921c6ed52f, + 0x34bc8e665e73148b, + 0x8f7ad4165c8623f7, + 0xfe8c5b3a9c8a4275, + 0x618fc7dba97b62d1, + 0x5263b14ba75c6e3f, + 0x8e1b4f6ed4517e9b, + 0x6c2a9db1f364ad19, + 0xf24735621246bc85, + 0xb36ac1254258cae1, + 0xb36fc2954e3bd95f, + 0xcb47e8f65a3ef7cb, + 0x7a68513cbd642839, + 0xf49aec7edc4637a5, + 0xf2b196dfeb5a6713, + 0xf6c8271fe83b647f, + 0x984e2fa2164d73eb, + 0x86f3b2554761b259, + 0xd9175f698364b1c5, + 0x8a4d32ca9157cf23, + 0xb41c29576e27cd8f, + 0xe53c48987a29ecfb, + 0x1a7e523dcb3f1d69, + 0x23ed1851fa423bd5, + 0xe9f38c421c276b53, + 0xda271e94392758af, + 0x4fec76a6563b782d, + 0x4c258bd8742ea689, + 0xd2e9647ba431b6f5, + 0x619f872dc124d573, + 0xf9841b3bae16d3cf, + 0xc46a281fec19f24d, + 0x756ac9d54e3d12b9, + 0xd9c352b76c3f4127, + 0xd685e4987b125f83, + 0x3ef24cd878145cdf, + 0x7c152d3ba6187c5d, + 0x27495a6ed41a7bc9, + 0x7164c3fed41eab37, + 0x5e1b4621f421d9a3, + 0x928c3a776435e921, + 0x1ba8f9532ce4f67d, + 0xc52396d54cf816e9, + 0xbaf9ed298bfc2657, + 0x7a35e1f989fe45c3, + 0x37baf84dcaf28541, + 0x3a6d8efdc6f4729d, + 0x631c52bfe5f7921b, + 0xe2b6fc8213e9af67, + 0x7ad1689542fbaed3, + 0x9e4df75762efcd51, + 0xc76efd265ec2fbad, + 0xb3ef7d998de61c2b, + 0x6dce97fbace82b97, + 0x4965bdedc8db49f3, + 0x4a6b5dc1f8de5971, + 0xe37d8ca328e176cd, + 0x4ade735327e3964b, + 0xc8d167e653e6a4b7, + 0xac624fe983eac425, + 0x3d7baf4982ecd391, + 0x3159f4887b9ec1fd, + 0xf3e485adced4216b, + 0x3fd84acfeab52fc7, + 0xb52afd621bc94e35, + 0x2a19865438cb5da1, + 0xb1af59d547ad6b1f, + 0x7e2dcf3765d18a7b, + 0x315af76984c3a9e7, + 0x2a8fc61cb2d7c965, + 0x1ba4853fe2b9d7c1, + 0x67e43dbdce9bd63f, + 0x2789ecb21d8ef49b, + 0xbac21d776ec43519, + 0x4a31fb776dc74385, + 0xe85a19387ab963e1, + 0xbd7163fa98ab715f, + 0x6b1c28ea948d6fab, + 0x167c82aed5b1ae29, + 0x9451de71f2a3bd95, + 0x7ba6ef132396cbf1, + 0x7a4d15b43198da6f, + 0xa472d9643e6af8db, + 0xb91cd2a76d8f1a49, + 0xdfb16cea9da238b5, + 0xb59a7f2edcb76823, + 0xe7b1c56ed7a9658f, + 0x15fbcd8fe58a74fb, + 0x784cd362158ea369, + 0x35c6def54691b2d5, + 0xbe7195d984a6d153, + 0xc7e129476175ce9f, + 0xc8d1e2687c68fe1d, + 0x6b3e579bad6c1e79, + 0x6843572cba7f2ce5, + 0x9d528b71fb925c63, + 0x7c5e96d21a7459bf, + 0xe4d93fc32a68793d, + 0x4e5f6b24345c87a9, + 0x3d8cfb6a946eb817, + 0x4c52a7ecb491d683, + 0xe96d3c2ba173c4df, + 0x52146e9cbe67f35d, + 0x954267c1fe6a13c9, + 0x6534dac21e8d4237, + 0x3fd1e5c54c7f51a3, + 0x7eb2c3a549625def, + 0x2f67519989547e6d, + 0xe53c78bba5467cd9, + 0xba26573ed35bac47, + 0x795a2beed25ecab3, + 0x572839c1f472ea31, + 0xb4635de32153f78d, + 0xae8b2f543e4617f9, + 0xebf928165e4b2867, + 0x9bfc71e98b5c46d3, + 0xf93862dbab4f7651, + 0xd6a843fdc95273ad, + 0x2b83719fe856932b, + 0x17d6b521f548b197, + 0x6f543d721549afe3, + 0x1ae32d76534dce61, + 0x531a42f76241fcbd, + 0x56fa1be98f451d3b, + 0x3abde1ca9e362ca7, + 0x4725da9dcd3a4b15, + 0x1fdc295feb3d5a81, + 0xbe41723dc82f57ed, + 0xa43275621a32975b, + 0xe2d96f143824a5c7, + 0xb95c1f398729c635, + 0x9653c4e9853bd4a1, + 0x2e61c83a924cd31f, + 0x8ab754edcf43127b, + 0xd768f32dcd2531e7, + 0x9cb5fd1fec183f45, + 0xdc7e9a543c295eb1, + 0x2f958b75491b6c2f, + 0x87ce5d15471f6c8b, + 0x762fd1b986129af7, + 0xc71634dcb614ca75, + 0xea3f96dcb427c8d1, + 0xbde7243dc21ad74f, + 0x16f3e47a9decf5ab, + 0xd96841543def1629, + 0x7ea5b1f76df23495, + 0xd21fbce65be764f1, + 0x2a7893f65ae9726f, + 0x95234b1986fa71db, + 0x47f386bba5ed8f39, + 0x732d64fdc4f1bea5, + 0xa92d8b1fe4f5cd13, + 0xe3859da212e5db7f, + 0xf8ba617431d7f9eb, + 0x3f719a854fed1b59, + 0xca3147576bdf29c5, + 0x6175398bace26943, + 0x963f8c7cbad4569f, + 0x76892f3dc7e9861d, + 0x76814eb1f5eca479, + 0x78ba24c216cda3e5, + 0x8ba146d657e1d263, + 0x9ebfa15763c4d1bf, + 0xec52f1a871b6ef2d, + 0xb354acd76eca1f89, + 0x5ab192c98cab2df5, + 0x5b43d2edcabf4d73, + 0x46d8bfcfe8b25acf, + 0x9dc7385219c57a4d, + 0x7c5eab4325d678b9, + 0xf9c16b5545dcb927, + 0x1a2b95f764bec793, + 0x453b219983a1c5ef, + 0x8cb631eba1b3f46d, + 0xb87e94ddcfb714d9, + 0x5e783a91fecb2347, + 0xd69e74f21ead52b3, + 0xfc2371465cbf7231, + 0x3e2cb67549a26f7d, + 0xa21b9cd656a47de9, + 0xf8de374a94b8ad57, + 0xb1952aced489abc3, + 0x1ad68e5dc39edb41, + 0x4fc2b97fe2a1f89d, + 0xf51de6c543c5291b, + 0xe76bfcd43fb62987, + 0xf4d6b8265d9a47e3, + 0x21ea3cb98cad5761, + 0x2546ea98798f64bd, + 0x9b6231fed8a2943b, + 0x8a24d5ffe695b2a7, + 0x578b3d11f6a9c215, + 0xc8e1b393248acf71, + 0x8cd5e6a4326abecd, + 0xf25bcd8873921e4b, + 0x85b72da76f842db7, + 0xb271c84bae984c25, + 0xe295d6adcd7a5b91, + 0x2b34e59dc96b58fd, + 0x483c269fe95f786b, + 0x83bf25721982a6d7, + 0xd416e5b32896c745, + 0xe1c4a9876478d5b1, + 0xd6b91739837ad42f, + 0x1548c7da916df28b, + 0xf9c2674cbe8132f7, + 0x1357469ede964175, + 0x48b2c51feb675fc1, + 0xd49ca6321b596d3f, + 0xfb379ca3284c6d9b, + 0x1b785e35475f8c19, + 0xe8651a7a9762cb85, + 0xfb5418eba465c9e1, + 0x74e1cfacb247d85f, + 0xb271e5fed149f6cb, + 0x85cae26edf5e1739, + 0xf46d7eb32f7136a5, + 0xefc6a8354e857613, + 0xf439eb265c48637f, + 0x4fd59e176a4972eb, + 0xd1af52ccb84da159, + 0x15b26dfba63e9fb5, + 0x9658bf1ed764ce23, + 0xda56738fe234dc8f, + 0xefd8bc321236eafb, + 0xedf846a6524b1c69, + 0xd3a84fc76f3e2ad5, + 0x513842aa9e416a53, + 0x1b82acda9c2357af, + 0xbf94e16dcb36872d, + 0x9345fa8fe72ba589, + 0x5d13a8cfe72ca4f5, + 0xbdc542e2182fc473, + 0xef17d3965643d2cf, + 0xbd79eac98536f14d, + 0x73d94fcba34821b9, + 0x482536aa9e2b3f17, + 0x254b38fbac1d4e83, + 0x6b7981fdca215bdf, + 0x4ce8b571fa137b5d, + 0x64fdba532b157ac9, + 0x5ec7f3654819ba37, + 0x1ace3676561dc8a3, + 0x54b683ea963fd821, + 0xcf6e953ba412f57d, + 0xe963182dc32615e9, + 0x1e56fa2dcef92457, + 0xb3a2847fedfa54c3, + 0x96eba1832cfd7341, + 0xb2e716543aef619d, + 0x613a2d9548d27ef9, + 0x2c8d3a1658f4ae67, + 0xda94e53985f7acd3, + 0x2aedf48a94fadc51, + 0xe73c69b982fce9ad, + 0xd764f8cfe4f31a2b, + 0x5ea4c61431f42a97, + 0x5dec7b132ed748f3, + 0x783519a54deb5871, + 0x83a126d549eb65cd, + 0xc2ab6e1879df854b, + 0xb5496fddc8e2a3b7, + 0xecf9b42ed8e7c325, + 0xc637b121f5e8d291, + 0xd7c2a86213a8bfed, + 0xac7586f432acfe5b, + 0xeb48712763d12ec7, + 0x2c1b54798fc64d35, + 0xa97253498ed75ca1, + 0xfca4d1b98bc96a1f, + 0x81ac436fe8cd697b, + 0xa82735eed5bf98e7, + 0xdb2c794219d2c865, + 0xafc45d1437b5d6c1, + 0x453b97f764b8d53f, + 0x7e3af58762caf39b, + 0x8fe7b46ba3ce2419, + 0x1c2a764cbfc14285, + 0x29d3b71dcdb562e1, + 0xe2843cbedba76e4f, + 0x6d9475a21c986eab, + 0xcd695fe437ac8d29, + 0x41657fa4368fac95, + 0x36c52b487693caf1, + 0x3ecf2da983a4d96f, + 0x7edf4c2ba296f7db, + 0xc3d2495fe2bc1849, + 0xc29f416edf9e27b5, + 0xa7359ed54fb16723, + 0xe3d41a932da3648f, + 0x129df8754c9673fb, + 0x823746f65c8ba269, + 0x86cead7a978ca1d5, + 0x149253eba68ebf43, + 0x1e6275ccb472cd9f, + 0x6adc497fe385fc1d, + 0x4316f5d323a81d79, + 0xd953b2f5418a2be5, + 0xbcf47ed65f8e4b63, + 0x87c39f276d7158bf, + 0x479d1fbbac94783d, + 0x2f76853edc7586a9, + 0xc462358fe98ab617, + 0x8bd21e61f67dc583, + 0xf24c79a2156eb3df, + 0x8f5a7cd54683f25d, + 0x28ba9438748612c9, + 0xc81a973cb29a4137, + 0x5ba126498e6b4f93, + 0x2965fc398a5b4cef, + 0xc659384feb517c6d, + 0xeb3d9861fa537bd9, + 0x2da46b821c56ab47, + 0x8653edc32758c9b3, + 0x913a7626576cd931, + 0x1fd9c8e8734fe68d, + 0x2c86497cb47316f9, + 0x7e2a136ed1982567, + 0x719de48dcf6945d3, + 0xc7a25e31fe6c7451, + 0x48cebf721c4e62ad, + 0xa76e42165d63912b, + 0xda7621865b43af87, + 0x14dcf5387846ade3, + 0x9c273ebba749cd61, + 0x6b759d198439eabd, + 0x78b136ddc24efa3b, + 0x451b69d1f1532ba7, + 0xf1584cb432674a15, + 0x8a5f96d54f3a5981, + 0xed683af54c2a56ed, + 0x6984f3287c2e865b, + 0x3a5f67ba9b31a4c7, + 0x97134abeda26c435, + 0xd837bcffe847d3a1, + 0x63c2a8ffe649d21f, + 0xa5d2b942142aef6b, + 0xb27189c6543e1fd7, + 0xabfd186a91623e45, + 0xe43a5f698f265db1, + 0xd1cb6f4a9d186b2f, + 0x53ed218a9d1c6a8b, + 0xaf16527dca1d89f7, + 0xd3c14ea1fa21c975, + 0xb2a48f143924c7d1, + 0xb5d782e43817d64f, + 0x8efb24c76518f4ab, + 0x37be649ba63d1529, + 0x472a5c9cb41f2395, + 0xd2834ecbade263f1, + 0x261daf9cbce4716f, + 0x3a92e4fed9e56fcb, + 0xa29465321bfa8e39, + 0xfd39ec7327fc9da5, + 0xecb7186657efbc13, + 0xfa19c48765e2da7f, + 0x6c32e89873d4f8eb, + 0x83d9572dc3f81a59, + 0xc48e56fed1fb28c5, + 0x12b9584dcfde5843, + 0xbe46c1a32ed1659f, + 0x51ab46243ce4851d, + 0xd6ace7254ce6a379, + 0xb97de13768d9a2e5, + 0x51bf6dea98edc163, + 0x2d896a38749dbeaf, + 0x18e73d6ba5b3fe2d, + 0xb15d2481f3d51e89, + 0xba27f56213d82cf5, + 0x971b38c651eb4c73, + 0x7e2a69c43ead49cf, + 0xfd37e4876ec1794d, + 0x7df491276cd387b9, + 0x5f4ed81dcad6b827, + 0x3f478c5fe7dac693, + 0x1c56e82ed59ab4ef, + 0x2768d54215afe36d, + 0x3db6789656c413d9, + 0x8be1d6ca95d83247, + 0xed3cab1982d951b3, + 0xcfd14b398eab6f21, + 0xda9bfe198b9c5e7d, + 0x5a7329eedba17ce9, + 0xbc139851f9b3ac57, + 0x75b236e21896bac3, + 0xc2bd841437b9da41, + 0x6dbcfea4348be79d, + 0xf5cb7a87649ef71b, + 0x25e4389cb4c32687, + 0xa65943ddc1b746e3, + 0xf4ec5a1edfba7561, + 0x45c28611fe8a63bd, + 0xc9be8d421d9e823b, + 0x85b3fa654d92b1a7, + 0x863b9df65984aef3, + 0xe983a1765896ce71, + 0xe9fb5da98467ebcd, + 0x3ed8ca7a937afc4b, + 0x486ef2aed38f1cb7, + 0x9826d5a1f1a34b25, + 0x54e6da8432b65a91, + 0xca59f7132e6857fd, + 0xb416e2f43e5c876b, + 0xae5619854b6e95d7, + 0xbec9453bab91c645, + 0xe9842b3dc985d4b1, + 0xd9375e8dc687d32f, + 0xa9cb2d6fe469f18b, + 0x1ba9f684358c21f7, + 0xd9873b15438e2f65, + 0x95146eb872835ec1, + 0xc7539ab98e756c3f, + 0x7c293fd98e476c9b, + 0x69fd5e7bad5c8b19, + 0x238bae4ed94eba85, + 0x5de937b1f962c8e1, + 0xe9ba4fc21963d75f, + 0x4acfb5732746f5cb, + 0x4c2fb739857b1639, + 0x78c5a1da937d24a5, + 0xcf247d1cb28f6513, + 0x264e89dcbe53627f, + 0x19428a5dcd4571eb, + 0xfc87b4dfec378f49, + 0xa652c9821c3a9eb5, + 0xc75f2935495ebd23, + 0xd679ab865741db8f, + 0xabc5ed387643e9fb, + 0xae9f743dc5471b69, + 0xd1a3e7bdc34a29d5, + 0x96bf537fe16d4953, + 0x45f6ad2dcd2e46af, + 0x92a7bfe21f43862d, + 0x96eb82143e25a489, + 0x4a8df3776c28a3f5, + 0x41c7ea398a4bc273, + 0xecb35619873db1cf, + 0xe51f96dba741ef3d, + 0x986c4e3ed6341fa9, + 0xb958d341f5483e17, + 0x5768fcb2152a4d83, + 0x72c34f66512b4adf, + 0xe5c37ab54e1f6a5d, + 0x952caf476e1278c9, + 0xe9c7361bad15b937, + 0xa9512c8edb18c7a3, + 0xa71c98ffe93bd721, + 0x95b6ced1f61ce47d, + 0xa9876d26583214e9, + 0x1e264d5989162357, + 0xbd782faa961852c3, + 0xf781624ba53b7241, + 0x28f13bd76cea5f8d, + 0x15834ae87aec6df9, + 0xafd4592dcbf1ad67, + 0x93f2a16fe8f4abd3, + 0xf156ac4329f7db51, + 0xfe5b319325f7e8ad, + 0x798ed26545ecf82b, + 0x8f9a5c2764ef1897, + 0x4ef8cb6ba5e247f3, + 0xf5b23a1dc2f85671, + 0xe23cfb4bafe864cd, + 0x16e2d4a1fdec834b, + 0x8f6d5c721cde92b7, + 0xc849eaf76be3c125, + 0xec8ba49659d4cf81, + 0xd6a175c546a5bced, + 0xca4ed81874c8fd5b, + 0x5ab4dcea94eb1dc7, + 0x97af58ccb4df2c35, + 0x2c1d9481f2e35ba1, + 0x54da218432d5691f, + 0x8a9467132fd9687b, + 0x96fecd843dcb96e7, + 0xc391e8f54aceb765, + 0x1cd5fb2989b2d5c1, + 0xcb23759ba8b5d43f, + 0x5b28f9ced5c6f29b, + 0x3dab2ec1f6db2319, + 0x74b6a1c326cd3185, + 0x97c6deb653ae4fd1, + 0xd5ce149871b26d4f, + 0xc6bfd8e65f946dab, + 0x7fd48a176eb78c29, + 0x8b6ad3987d8cab95, + 0xf786b5edc78db9f1, + 0xba371f8fe7a1d86f, + 0x72e4a5b21793f6db, + 0xbdc68e2436c81749, + 0x2f6815e874ca26b5, + 0xa5dc48ba94bd5623, + 0x7f1e48da91ae538f, + 0x3b61d92bae9372fb, + 0x6384f7aedeb5a169, + 0x9ca15fdfeb879fc5, + 0xb4ac87221c8abe43, + 0xd5f63e73276dbc9f, + 0x2c36b7865782fb1d, + 0x5e9bad1986a41c79, + 0x93a21e5cb4972ae5, + 0xe9ba823ed29b4a63, + 0x95bef2ced18c47bf, + 0xb54f31adce8f673d, + 0x47da25f21f7285a9, + 0x9a47fc143e96b517, + 0xb9f137a65d79c483, + 0xcfe4b2165869b2df, + 0xa6825bda987ce15d, + 0xb2c1976ed78321c9, + 0x987cfe4ed6953f27, + 0xbe63d1c1f2874e93, + 0x4a732e5212684bef, + 0x486ad9c4317c5b6d, + 0xdfe641543e4f6ad9, + 0xa5d4cbe98e62ba47, + 0x5ca36bda9d65c8b3, + 0x478f3d9dcb69d831, + 0x8673ae1dc74ae58d, + 0x724a5f9ed65ce4f9, + 0xc24e57643a912467, + 0x8efd46a3278654d3, + 0x73594dbba4897351, + 0xfa5ebc69825961ad, + 0x4ae5d7398e4c7f1b, + 0x16d5493bac3f9e87, + 0x17bca6fedb52ace3, + 0x61ba3ce1fa45dc61, + 0xa26fc9e21836e9bd, + 0x51fd6c83274af93b, + 0x213ebd46564e19a7, + 0xe8a9f3ccb8724915, + 0x87d29afdc3645781, + 0x6849172cb13765ed, + 0x56bc328edf2a845b, + 0x7e51da41fe2d93c7, + 0x65af2cd21d4fb235, + 0x21fc95d76c54d2a1, + 0x8cf3d1265824befd, + 0x8c9176465827fe6b, + 0xbf3ea57a963a1ed7, + 0x289765ccb73e2d45, + 0x13fc698fe6425cb1, + 0xd84cfa1fe1346a2f, + 0x8ec716f43125698b, + 0x58a47be43e1a98f7, + 0x7e8263c54e1db875, + 0x1c96eb487a2fb6d1, + 0xfb7386aa9a12d54f, + 0x38bd65adc815f3ab, + 0xab768d1fe83a1429, + 0xa195e721f71c3295, + 0x619e5bf5473d52f1, + 0xbf8ac9e874216e5f, + 0x5e916c8872136ecb, + 0xacf53d876ef58d39, + 0xf95a8cb76df79ca5, + 0xe5c7f49989facb13, + 0x84c195eba6edc97f, + 0xae54126dc6d1f7eb, + 0x86ba79e32af41859, + 0x2a6584d436f827c5, + 0xa67cde1986fb5743, + 0x65312cf872ec549f, + 0x81245aba92ef741d, + 0xe539d7ccbfe3a279, + 0x3da127fcbcd6a1e5, + 0xf85946bfead8bf53, + 0x5fe86ba217c8bdaf, + 0xeb294da437abec2d, + 0x2bd7369657e21d89, + 0xcaf5e93987d42bf5, + 0x45fbd12ba5e84b73, + 0xf379148ba2d948cf, + 0xc72653dcb1ec684d, + 0x12c5634edecf76b9, + 0x82eac9321fd3b627, + 0xdb459c832ed6c593, + 0xe1b5ac7549a7b3ef, + 0x12f94bd658bae26d, + 0xc5ae4b3876acf1d9, + 0xb3421d7dc9d23147, + 0x6184c75ed6c54fa3, + 0xc795e611f4c86e21, + 0xcdb93e8212b95c7d, + 0xf1957e4431ac6be9, + 0x4b7a9c643eaf9b57, + 0x92b1a8e76ea2b9c3, + 0xed43b1298cb6d941, + 0xa9c7483cb8a7e69d, + 0xb4c56f8ed79af61b, + 0x156b3d81f6be1587, + 0xbd3917a328b145e3, + 0x1bdac54438c57461, + 0x3ab9ec4653a762bd, + 0xfd2a19c872ca813b, + 0x26183cf65e6c8f97, + 0x3467a9e98b7e9df3, + 0x8ac67f9feb93cd71, + 0xc2a6d7e1f874eacd, + 0xcd4b98721987fa4b, + 0x5a276dc4368c1ab7, + 0x715debc7679e3a25, + 0x63fce75ba6b25891, + 0x7be5284ba29356fd, + 0x46e89baed1a7856b, + 0xf436de1dcf6a94d7, + 0x8964e711fe8db345, + 0xfbc931632d7fc3b1, + 0xae9c72665b84d12f, + 0x24a815b43964ef7b, + 0x8cd2479659681fe7, + 0xc25b9e3ba78b2e65, + 0xbe46d87ba57e4dc1, + 0xafec596ed4816b3f, + 0xb2749a81f1736a9b, + 0x57f4e2a432768a19, + 0xda8c53432f4ab985, + 0x83abd5e54d5cb7e1, + 0xd28b6fa87a4ec65f, + 0x42c56d398962f4cb, + 0xbc42983edb871539, + 0xc46a238fe87923a5, + 0x1a87ed21f78c6413, + 0xdae98f63246d517f, + 0xc2e6b73543516fdb, + 0x35bac19871638e49, + 0xecabf8287f369db5, + 0x1ad267c98e59bc23, + 0x6c185ae8793bca8f, + 0xeb6c2d3ba73ed8fb, + 0x153d72b1fb531a69, + 0xd3f894721a4628d5, + 0x4b381963296a4853, + 0xf5483d28763b45af, + 0x71a648ba934e752d, + 0x6d3be7adc251a389, + 0x9e75634cbe34a2f5, + 0x471c2beede48c173, + 0x72ba831ed927aebf, + 0xf4375bd2192ace3d, + 0xfbd6a4c4372efda9, + 0xadce39798a543d17, + 0xe1943c6ba9264c83, + 0x9bd74f2ba52749df, + 0x7f854a2dc32b695d, + 0xa25f6beed12e67c9, + 0x91db864fef21b837, + 0x61e35a732f14c6a3, + 0x39d287165e38d621, + 0x24879fd65b19e37d, + 0x75c9dba7681bf2e9, + 0x2341aedcba3f1257, + 0xcf29ab7ed92451c3, + 0xc36921bed8276f31, + 0x134dc6b1f3175e8d, + 0x15ec9763231a6cf9, + 0xc5792a85421e9c67, + 0x8eb92ad54cef9ad3, + 0x6afbcde87cf3da51, + 0xe438a1c769f4e7ad, + 0xc1fbd32ba9e8f72b, + 0xc978e4aed8fc1697, + 0xbe3a5f6dc7ed26f3, + 0xf25671a439f26571, + 0xf1369cd325f463cd, + 0x7ae195b763f7824b, + 0xa317fe5762fa91b7, + 0x6ba2e5887edcaf15, + 0x326f5c887acfbe81, + 0xb182c3aa98a2cbed, + 0x5fa19b3fe8d4fc5b, + 0x1ecd4b8329e81bc7, + 0x2f9e5b6548ec2b35, + 0x2fde791656de49a1, + 0x5b6f1e8a95d2681f, + 0xbf741c8ba2e3867b, + 0x16ac83dcb1d695e7, + 0xa47891fdcfdab465, + 0xd31c2561feadb4c1, + 0xce78df521baec23f, + 0x8f25b9a54ac3f19b, + 0x85ca7ed76bd73219, + 0xd59ebf8768c92f75, + 0x7194bcd986ba4ed1, + 0x628ae1da93ad5c4f, + 0xdc23a71fe3d16cab, + 0x6cb53d41f1d48b29, + 0xad35741321d6ba95, + 0x1a452bd43ea9b8f1, + 0x8cfeb1543d9bc76f, + 0xd79ec235498fe5db, + 0xf63ced7babc31649, + 0x216f975ed9c724b5, + 0x39f12d8fe8ca6523, + 0xf8c6423fe4ab528f, + 0xdf1ba893249d61fb, + 0xeba982f543b18f59, + 0xb59e347761a39ec5, + 0x4819bd276f97bd43, + 0x28bed7665d67cb9f, + 0xfbae2c39897bea1d, + 0x346f195dc86efa79, + 0x1235da91f8a329e5, + 0xf695b2c21ab74963, + 0xbdeaf6c3259846bf, + 0x238efcd6549b763d, + 0xabdfc157628e74a9, + 0x31d2a67dc3a2b417, + 0x36fda2ecbf95c283, + 0x6e3bd54bac76b1df, + 0x3c5b9d8fea68cf4d, + 0xb4ec29a2185afeb9, + 0x9f31d6c54a8f1e27, + 0x9ca57b376a824d93, + 0x32fd475986754aef, + 0x2814af7cb3785a6d, + 0x728d1a6dc25b68d9, + 0x685b371ed16ea947, + 0x5649183fef61c7b3, + 0xb59837d32f85d731, + 0xbfea9d432c56e48d, + 0x986f1c554b58e3f9, + 0x835d216a9b8d1367, + 0x8fcd9e1ba97f42d3, + 0x35f7a12eda947251, + 0xae81692dc3645f9d, + 0x1347b5d1f3587e1b, + 0xb273d6e2124b9d87, + 0x21bf7955415d9be3, + 0xd65b8ea87f52db61, + 0x2ea375c76c43e8bd, + 0x7e281f3a9c46f83b, + 0x685fc2aedc4b18a7, + 0x75b892afea6d3815, + 0x9fd714cfe95f4681, + 0x6c4da9f2185264ed, + 0xe734afd32746835b, + 0x23c45787634892c7, + 0x54d1bfea926cb135, + 0xc25e8bd87e3dbf91, + 0xeb3cd7598a31bcfd, + 0xfde3b42dca23fd6b, + 0x46d89ba1fa361cd7, + 0x495e6ad21b3a2c45, + 0xbf91e366583d4ab1, + 0xd5c3b147673e592f, + 0x5bd4e73ba532678b, + 0x51389d4cb32496f7, + 0x6184c2aed129b675, + 0x62f1be7dcf2ab5d1, + 0xd64a85cfeb1dc34f, + 0xf87ec3254d31f2ab, + 0x239ea4d87d461329, + 0xfb63ed287c283195, + 0xed53416878294fe1, + 0x21ca873a971b4d5f, + 0x576fceba941f5dcb, + 0x7469d2bfe5128c39, + 0xb8a67231f2149ba5, + 0x73e61c465428ca13, + 0xe7c5d4932de9c87f, + 0xa695f14439fad6eb, + 0x9b8e3a254adef659, + 0xd758326a9af326c5, + 0xd94e175dcaf85643, + 0x45a68d9dc6e8539f, + 0xcf75284fe5fb731d, + 0x619a3fe324fe8179, + 0x5e28a73543e19fd5, + 0xdf54be6871f4be53, + 0x6c3852b54ed5bcaf, + 0x32145cd76ac8eb2d, + 0x542ab38767dcfb89, + 0x29d3175cb8ce1af5, + 0x72b468a1f9e24a73, + 0x7ba46e8218d547cf, + 0x85f9d47325e9674d, + 0x7e1c38a543ec75b9, + 0xea1cb9f983dea527, + 0x29d4c86ba2e1c493, + 0xf61274b98da4b2ef, + 0x95f3be7bacb7e16d, + 0xfe93ac8ed8a7efc9, + 0x7fd4a1c32abc1f37, + 0xe2b5da9548bf2ea3, + 0xd2caf81879c46d21, + 0x39eb4f1986c45b7d, + 0x21f73e5983c76ae9, + 0x63f9148cb2dc9a57, + 0xb2f169ced1bea8c3, + 0x5bda649fefb2d841, + 0x294a5ec21fa3e59d, + 0x6d71e9c43da7f51b, + 0xbf7361a65dcb1487, + 0x32dba19879ac24e3, + 0xe4d39c6ba9bf5361, + 0xda5b63fdc7a361bd, + 0x37218f6ed4a57f2b, + 0xa263b891f2b68e97, + 0x2da483f2128a9cf3, + 0x9fb3ae15429ebc71, + 0x529a67154f71e9cd, + 0xa934f1276d83f94b, + 0x4e39ad698da619b7, + 0x689a7ecedcab3925, + 0x1c78ad5fe8ad4791, + 0x571a96fdc68e45fd, + 0x6a823f7217a2846b, + 0xf415dce324a593d7, + 0x6cb84a9873a9b245, + 0xe615d3c8738ac2b1, + 0x4918af587d6cbe1f, + 0xb853671a9c61fe7b, + 0x4857b9edcb841de7, + 0x7346d911fb982d65, + 0xc5f917432a794bc1, + 0xd8a9be33287c5a3f, + 0x156c7ed4346f589b, + 0x975a86dcb573a819, + 0x32e7f6ddc294b785, + 0xf48913adc278b6e1, + 0x6ae8397cbe6ac45f, + 0xb9352861fa5de3cb, + 0xe4c762965e821439, + 0x2dce3b654d8632a5, + 0xfb4eca887c896213, + 0x5dc91a2878594e6f, + 0xd421e9b9864a5edb, + 0x45c97f2cb35f7d49, + 0xdc68a42fe3629cb5, + 0xe53a12d1f176cb23, + 0x5fe19d832146c98f, + 0x85f493732e39d7fb, + 0x19e8bd354c3df769, + 0xdc183afa9c6127d5, + 0x3e25c14cbc864753, + 0x67b8921dc93754af, + 0x934fb76fe85a742d, + 0x134d9e51f54d7289, + 0xdc75afe3264e91f5, + 0xc14fb6887452bf63, + 0x1c9b58f76134adbf, + 0x254c71a76f27ec3d, + 0xfda172c76d28fca9, + 0xb7ce3f1bab4e2c17, + 0xbf2a54dfec514b83, + 0x35fb681fe92348df, + 0x32eb98f21a27685d, + 0xa2756cb4352a76c9, + 0x91c625d9852da637, + 0x49a53279842fb5a3, + 0xfa582c4cb364d521, + 0xc8f9d72baf15e27d, + 0x9cef13acbc27f1e9, + 0x9168b3a1fd3c2157, + 0x2a6759854a1d2fb3, + 0x2a1f4de87b426e31, + 0x2c4f153769135c8d, + 0x1e5caf7987156bf9, + 0xd4713f6dc41a9b67, + 0xc1e4857cb41ca9d3, + 0x91e458aed32fc951, + 0x346eac8cbcf1e6ad, + 0x9a3f2d821de4f62b, + 0x7fb968243df81597, + 0x4d57f8276bea25f3, + 0xc1e47f598afd5471, + 0xc57a6ef987ef52cd, + 0xfe3bd89dc7f3814b, + 0x3d814a2dc3e48fa7, + 0x9be1273ed3f8ae15, + 0xdf39c4e323fabd81, + 0x9be64ca431fcbaed, + 0x8235b1954ed1fa5b, + 0xa8342f176de41ac7, + 0x7854f21a9ce82a35, + 0x75924d8dc9eb48a1, + 0x8d921f6cb8dc571f, + 0xf7b1c2afe4df657b, + 0xfdb32c5216d294e7, + 0xf67c48e324e7b365, + 0x5f94a12764e8b3c1, + 0x62fab19872dac13f, + 0x2ba6cf765e9cdf8b, + 0x58427fca9cb21ef7, + 0xeaf5128edbc42e75, + 0x62dab491f9b74cd1, + 0xa65d472218c95b4f, + 0x7f8db53326cd59ab, + 0xce86f29545cf7a29, + 0x41a58f6874d2b895, + 0x8d54fbea93c5b7f1, + 0x45f138dba1b8c56f, + 0x9cb7ef5baf89e4db, + 0xa6bc3f5fecadf349, + 0xdbc2f5354ec123b5, + 0x63aebc965dc76423, + 0xe2d16f954ab7518f, + 0x86fb9c5546985feb, + 0x71cdafb984ac7e59, + 0x834fe2cba39f8dc5, + 0x649bda3fe5a2bc43, + 0xabc9712fe184ca9f, + 0x1e4ba5f432a7e91d, + 0xc5a1de432e6bf879, + 0xefd1a3554c9d18e5, + 0x31daf28a9db14863, + 0xcb3aef598a9345bf, + 0x864bfe3dc9a8753d, + 0x5f967c4fe58b73a9, + 0x53b671e1f59da317, + 0x67a5bd43259fb183, + 0x5937af254372aecf, + 0x3dfb2a876185ce4d, + 0x913257654e56fdb9, + 0x8ec24d6a9e8b1d27, + 0xc695d2fbab7e2c93, + 0x8ad4fe7dca7149ef, + 0xc581b491fa83596d, + 0x5e73d6421a8567d9, + 0xcf85ad63256ba847, + 0xa896f376547da6b3, + 0x2c41ebda948fc631, + 0x893c26eba172e38d, + 0x82341b5bad65e2f9, + 0x4758631ede8a1267, + 0x97a48651fc7b41d3, + 0x94d17fb32b7d5f41, + 0x86fb52143a615e9d, + 0xb27f34c659647d1b, + 0x8b92c7fba6459c87, + 0x9ea4c6dcb4589ae3, + 0xea14d62cb35dca61, + 0x5962d48ba14fc7bd, + 0x63fe784ede52f73b, + 0x815c39f32f4516a7, + 0x63ae82b54e6a3715, + 0xcda95f887d6c4581, + 0xb56834c8794c53ed, + 0xbd256e7dca61825b, + 0x568237eed85491c7, + 0x2f56738ed647af25, + 0x368adc41f348be91, + 0x3e568cf21239abfd, + 0x5df8b295413fec6b, + 0x73c18e276f431bd7, + 0xef3675da9e372b45, + 0x8b4612dbad3849b1, + 0xd72358adca3b582f, + 0x41b2e97ed92e568b, + 0xf8c17a6fe83195f7, + 0x9bd378e21923b475, + 0x9fda38765637b4d1, + 0xc123be487539c24f, + 0xac21fe38723ce1ab, + 0xcd859e187c2def19, + 0xa3291e7cbd132f85, + 0xf854aebdcb264de1, + 0xd74f9a1fea184c5f, + 0x1bf3ad9328195acb, + 0xe78f1bc5481e7b39, + 0x5c9248176721b9a5, + 0x25c7e84ba725c913, + 0x524e138ba315c67f, + 0x38dc945ba218d5eb, + 0xfe457d9badebf459, + 0xf4327e5edbfe14c5, + 0xa1e643932df16543, + 0x7e256ac43be4529f, + 0x9af3ed765af8721d, + 0xd9ec163545ea7f69, + 0xda96354874fb8ed5, + 0x5746f1aa94efad53, + 0xd4ec352a93e2cbaf, + 0x9568a71dc1f5ea2d, + 0x8bad4f3321e6fa89, + 0x4b27f8543edb19f5, + 0x2afd14b65cde2973, + 0xf49a82687ad146cf, + 0x62fe8d4a9ae3764d, + 0x5dfa872dc8e674b9, + 0xa376c49ed6eba427, + 0x83d64c11f5edb293, + 0xf597c48324bda1ef, + 0x65e39cd543b2cf5d, + 0xf3821cd651b4fec9, + 0x37fae2b76fc91e37, + 0x61fb5ac87ecb2da3, + 0x8fb134da9abe5c21, + 0xac47913fe9c15a7d, + 0xb5173c61f7c368e9, + 0xab25948218d6a957, + 0xd81ef9b325d9a7c3, + 0xe47b89c765bdc741, + 0x1298e73762afc49d, + 0x36a2fcba92c3f41b, + 0x3df6291cbfc61387, + 0xef143a2dcdb942e3, + 0x9742aeb1fdbc5261, + 0x92ba45c2198c4fad, + 0x8c9b2ea549a17e2b, + 0x95dfae3546b38d97, + 0x3a4921c875a69bf3, + 0xc62df97984a9cb71, + 0xab6fd2ea927ab8cd, + 0xfdb8746dc19fe84b, + 0xa1c879dfefa318b7, + 0x7a4b29c21fb73825, + 0x6298ec543eba4691, + 0xa765f4d43b8a54fd, + 0xc42fe7a65a9e736b, + 0xf4e3d5acb8a192d7, + 0x4e612b8ed8a6b145, + 0x367b892ed486bfa1, + 0x9f1c5b6fe378bd1f, + 0x2795da82126aed7b, + 0xa19d6eb4316dfbe7, + 0x4b8df9c87f932c65, + 0xe96adb487e864ac1, + 0xb17d238bac78593f, + 0xcf6a187eda6c579b, + 0x9fc65e4eda6e8719, + 0x48b17da1f791b685, + 0xf36a4d132784b5e1, + 0xdca81e532487c35f, + 0xa7d498b65368e2cb, + 0xcd436259827cf139, + 0xd8234aca9e7f21a5, + 0xc8524dfbac734ef1, + 0xb9d815fdcb754d6f, + 0x6d927e11f9475cdb, + 0xeb5fad721a5b7c49, + 0xafb157e3274e8ab5, + 0x928bea776871ca23, + 0xc7b6815a9453c78f, + 0x7163425a9245d6fb, + 0x4e6d581dc14af569, + 0xc3a415dcbf4c16d5, + 0xbf34a95fed7f2653, + 0x5cef86221d6253af, + 0xca8537154c56732d, + 0x4d31cf965c4a7189, + 0x4e3d9877673a8fe5, + 0x36127f8a974dae63, + 0xfeb3278a9541acbf, + 0x69a2f87dc254eb3d, + 0x1fd6a58fe135fba9, + 0xa96b7ef5435a2b17, + 0xa9cf84765f4d2a83, + 0x16ecaf365b2e37df, + 0xca3e78ba9c32675d, + 0xb491623bab2475c9, + 0x92f3657edb29a537, + 0xa28bd67fe72cb4a3, + 0xa46e5281f75ec421, + 0x1fd847943642e17d, + 0xc4713df65423efd9, + 0x178b35ca92381f47, + 0xa95f26b87f192eb3, + 0xcf4b861a9e2c5d31, + 0xd36c425a9a1f4b8d, + 0x85bc12eedb126af9, + 0x347a5181fb149a67, + 0x86bad4932917a8d3, + 0x2e7985f5472bc851, + 0xb8f3e7d7641ec5ad, + 0x275bca8a9631f52b, + 0xbd9a6f4dc3251497, + 0x187f49bbade724f3, + 0xae68bdfdcdfa5371, + 0xd45fa29fe9fa51cd, + 0x25e4b97219ed6f3b, + 0xf5d86ae439f18ea7, + 0x92bd5ec768f4ad15, + 0x359edb4875f6bc81, + 0x42fa9ce763f7b9ed, + 0xb251d7e982fce95b, + 0xe659d74ba1def8c7, + 0x4198bc5edfe42935, + 0x8c13e6432fe647a1, + 0x6b152fa43cd9561f, + 0xfbc4a7d43aec647b, + 0x78ac2e6659cd83e7, + 0x7314f9cba9e1b265, + 0x619c235ba7e5b2c1, + 0x4165bd2ba4c6be2f, + 0xd6eb5741f2c7de8b, + 0x84e9756212baecf7, + 0x53ce189542cf1d75, + 0x83214df76fc34bd1, + 0xdc4e5a987dc65a4f, + 0x74eb3a276cd758ab, + 0x5ce7312cbadc7829, + 0xf1ba587ed6cea795, + 0x43f682afe7c2b6f1, + 0x8236bc4217b3c46f, + 0x14fbea9324a6e3db, + 0xe3af275763caf249, + 0x7d46bc5983cd12b5, + 0x48ce2b3a9ebf5123, + 0x4a53bf2a9ca24e7f, + 0x4158fb9dca945deb, + 0x37d59e11fab87d59, + 0xc2564392179a8bc5, + 0x76819c43279eab43, + 0x17c2f9d545a1c89f, + 0xde6528a875a4e81d, + 0x816be53ba2b5f679, + 0x7da12fbdc2ba17e5, + 0xe38647fdcfad2763, + 0xe258a1bedc8e34bf, + 0x43fcd7821ea2743d, + 0x15c64ae43db572a9, + 0x6a4291865cb9a217, + 0x2784ade6568baf73, + 0xe18acb28746b9dcf, + 0x9d537e6ba581ec4d, + 0xba76f43ed273fcb9, + 0xc4b16981f3a81c27, + 0x5d7861e5418a2b93, + 0xc6934fd32d6b38ef, + 0x6e481ad43c7f486d, + 0x671f4e365c8276d9, + 0xad84321cbc95a647, + 0x4758a92ed978a5b3, + 0x183fd5afe78bc531, + 0x1b8265a1f46ec28d, + 0x26cf71543572e1f9, + 0xf6a572b984a52167, + 0x9f412b7761872fc3, + 0x461a53298f7a5e41, + 0x85a4dbf87e5b4c9d, + 0xa271dcba9a5f6c1b, + 0x839c21bfec529b87, + 0x9e532b41f865a9e3, + 0x639fdec32a58c961, + 0x6c3784e32549c6bd, + 0x1ab946c8745de63b, + 0xf95cea6cb48215a7, + 0x5aed372dc2973615, + 0x7a8bf23dcf695481, + 0xeda4567cbc4952ed, + 0xe4982161fc4d715b, + 0x52f9eca21a3e6fb7, + 0x7caeb1354b63ae25, + 0xc841d7276845bd91, + 0xb5c129e87536bafd, + 0xfe531ac98439ea6b, + 0xd2e6b9fba23cf9d7, + 0x57c1b23fe3712a45, + 0x7492c56fef3548b1, + 0x327fc4d21e38572f, + 0xe6fb71a43e2a658b, + 0x49783a165b2c84f7, + 0x3617fed98b2fa375, + 0x52ec7b3ba954b3d1, + 0xcde3295cb836c14f, + 0x9fe165ddc426df9b, + 0x3abf85ced43afe19, + 0x4bfd1e63243d1e85, + 0x5de9642873524ce1, + 0xe14983b87e134b5f, + 0xbfac39887e1659cb, + 0x9bcd1e398d1b7a39, + 0x9d6e8a5dcb1d98a5, + 0xeb731c2ed92fb813, + 0x5b37148fe812c57f, + 0x71965fe32715d4eb, + 0xa2639c854618f359, + 0x6df7acb9862b13c5, + 0x239bd78ba61e5243, + 0xefa145b87cde419f, + 0x5d2943198ad25efb, + 0x93246d8dcbf47e69, + 0x18fa246fe9f78cd5, + 0x65f7ced218fbac53, + 0xa68b157325edb9af, + 0x8bfd124656f1e92d, + 0x481932a764e3f789, + 0x5db4126ba3e718f5, + 0xe412763dc1fb2873, + 0x1f4365da9edb35cf, + 0xbd6f5a1febcf654d, + 0xf9ae76c21de273b9, + 0xd269e8b54ce6a327, + 0xa7b43fd65ae8b193, + 0x567ea28545b89edf, + 0xc62de51874acbe5d, + 0xde1afb9984b1fdc9, + 0x6bdaf14dc4e51d37, + 0x981275d1f1e72ca3, + 0x615cda7543ea5b21, + 0x3471a9532fbc497d, + 0x649cb1743cbf57e9, + 0x3572cd176cd2a857, + 0x7cabefd989d5a6c3, + 0x7a1d856cb8d9c641, + 0xb3c15f8fe5bac39d, + 0x731dc8e1f5ade31b, + 0x6dcafb1546d31287, + 0xa1965df875c641e3, + 0xd1b38fa872c84f51, + 0x8b6a9ce65f984ead, + 0xce598ad87e9c6d2b, + 0x59ec6fb98baf6c97, + 0xc4912a6ed8b29af3, + 0xa3d819c1f8b5ca71, + 0xb3afc7d21596b7cd, + 0x9ef74533259ae74b, + 0xea39cb25439df5b7, + 0x169cfbdba6c13725, + 0xe9c2418cb2c64591, + 0x365c87fbae9753fd, + 0xfec4896ede9a726b, + 0x47cb3191fb9c81d7, + 0xfec52b821b8e9f35, + 0xed71fbc54983bea1, + 0x6c3f5ea54785bc1f, + 0xb64d8fe65486ec7b, + 0xa4c5d9698369fae7, + 0x3d168efdc39e1b65, + 0xc927d43fe3a249c1, + 0x91a6cb8ede94583f, + 0x5ae24b821f87569b, + 0x759e8b143e7b8619, + 0x7c826ed43c7da485, + 0xac4b9d37697fa4e1, + 0x9b63712ba983c25f, + 0x3c168d9ba675e1cb, + 0x12fdb83dc467ef29, + 0x7caf4b9fe37b1f95, + 0xce56f4b3247c3df1, + 0xe3b78a1652814c6f, + 0x65fab9354f635adb, + 0x9c23df698e567b49, + 0x1b9a34c87d4a89b5, + 0xe8d2374dca6db923, + 0x5192fa4dc74eb68f, + 0xc2f154afe762d5fb, + 0x6f3459d21875f469, + 0xfa27b414367914d5, + 0x21caf68a968c2453, + 0xd9217eb9816d42af, + 0xc796bd2baf63712d, + 0x4361f7dcbd436f79, + 0x21d7b43dcb368de5, + 0xe2d1b581fb49ad63, + 0x6a8f5b92173c9abf, + 0x1bcd67f3274fca3d, + 0x68e941265642f8a9, + 0x16924c3cb8562a17, + 0x4abf583dc45a2983, + 0xfc7642dcb14a36df, + 0x15ce83dcbf2e465d, + 0x56d34b11fe3174c9, + 0xd2948e521e25a437, + 0x8f6a12c65d47b2a3, + 0x4c963ef87b5ac321, + 0xef23d8a6572abf6d, + 0x4e3c86d8752fced9, + 0x328a567dc8531e47, + 0x689137ffe5462db3, + 0x3bce1d71f2495c31, + 0x18b942c4312b4a8d, + 0x2c5e1f843e1d58f9, + 0xfde629165e21a967, + 0xa2d643798c14a7d3, + 0x7dfe438bab28c751, + 0x853ad2ecb718c4ad, + 0xb56c89aed71ce42b, + 0xaf59eb2ed51ef297, + 0x12bafc57681542f3, + 0x4eadc35a96385271, + 0xf2cd1ae762174fbd, + 0xebf837c65df96e3b, + 0x8d2f3ca65bfc6da7, + 0x6195fed98aef9c15, + 0x68327c5ed9f3cb81, + 0x2e56374dc6f4b8ed, + 0xf8cb24e216f7e85b, + 0x6fad83e324eaf6c7, + 0xcf2186d876fe1835, + 0x7ca14dea95f246a1, + 0xb86e2d3ba2e4651f, + 0xcfb4825bafe8637b, + 0x7cf1d95cbcda82e7, + 0xaced7831fbeda165, + 0xe487dc3328ce9fb1, + 0x16f3de8548c3bd2f, + 0xb8f5a1c436c4ed8b, + 0x1496ca8654c6ebf7, + 0x1e54c7aa94eb1c75, + 0x512ad4ca94ce3ad1, + 0xda174e9dc2d1594f, + 0x576ac24fefd357ab, + 0x5823e6d21fd68729, + 0x419a8d732edba695, + 0x1db6738549bca5f1, + 0xa82c46f658aeb36f, + 0xe3dc2bf987a3e2db, + 0x6a73cfecb7c6f149, + 0xb79df53fe6d921b5, + 0x15683dcfe5cb4f13, + 0x2a859bd212ac3d7f, + 0xcfe7389542a15ceb, + 0x1a286be54fb37c59, + 0x6fa9ce254eb68ac5, + 0xb13f5a487dc9ba43, + 0xbdfc397ba68cb79f, + 0xf6a7e85cb69fc71d, + 0x28765bffe6b2f579, + 0x6389fac328b716e5, + 0x87532bc547ca2563, + 0x14db2797629a43bf, + 0xe39a1fb981ae623d, + 0x3baf4c698fb271a9, + 0x591438bbac938ef5, + 0x3869baeedc96ae73, + 0xd391b67fe8679bcf, + 0xbac475e2187acb4d, + 0x64a37dc3256feab9, + 0x4185da7768a41b27, + 0x59d1eaf985b62a93, + 0xd215cbfba29837ef, + 0x41a2df6dc19b476d, + 0x239761acbf7e65d9, + 0x7ec8b6d1fe91a547, + 0x5ec6b8a21e85a4b3, + 0x83ec1fd65d98c431, + 0xbd2561e54a69c18d, + 0xb967adc5465acfe9, + 0xf723d4ca946dfe57, + 0x349251ecb6842ec3, + 0x2178af3fe3975d41, + 0x76d59a41f1674b9d, + 0x825db414327c6a1b, + 0x5974acf32f4e6a87, + 0x46ab9c765d61a8e3, + 0x647cf3ea9d74c861, + 0x925eb6398946c5bd, + 0x5e2dab4dc869e53b, + 0x658217eed65cf3a7, + 0x941abd6fe78f2415, + 0xc8f6974327945381, + 0x3e18a655437651ed, + 0xfec58a2871586f4b, + 0xc8d4f3e65f3a6eb7, + 0x3d2c41998c4e9d25, + 0x18c7d5fbad52bc91, + 0x3b9852fdc843b9fd, + 0xc6a127d1f835e96b, + 0x7fc9b3d21639f8d7, + 0x7b2e64c4386d1945, + 0xd2c974a9865f37b1, + 0x6c23f57ba473562f, + 0x8f5b2e4dc135648b, + 0x82a7e45cbe2983f7, + 0xf1c275eede3ca275, + 0x86712c41fb4ea2d1, + 0x1965fcb32a41be3f, + 0x982afc154823de9b, + 0x2ab918f65836fd19, + 0x865fa2ca973a1d85, + 0x8e23a1ca964c3be1, + 0xa4d3ef5cb42e3a5f, + 0x8295cdafe13258cb, + 0x496b831fef157839, + 0xe1754fc32f1897a5, + 0x62b98a165e2cb713, + 0x81def3265a1db47f, + 0x1a4d26987921d3eb, + 0xe792f4acba14f259, + 0x53b4f12ed93812c5, + 0xfb7d458fe82b5143, + 0x59f137eed41b3e8f, + 0x3ea75b63231e4dfb, + 0xafd4b29653127d69, + 0x61f8edb54ef38bd5, + 0x274c91d76df7ab53, + 0x4387eb1659e7b8af, + 0x21a7e35a97fbc82d, + 0x8f13ae9cb5dfe689, + 0xc1768b2ed8e317f5, + 0xc473d95219f82673, + 0x5fa4ceb325e834cf, + 0xe3f815b872fb634d, + 0x9c46b2a871fe62b9, + 0xaf5e73ba9fe3a127, + 0xa713ceba9cd4af83, + 0xb96437dba8b59cdf, + 0x6c5281d1f7e8bc5d, + 0x83f2ea6216daebc9, + 0x57d91ab326cefb37, + 0x758cb2f767e42ba3, + 0x4ef8b36a96e75a21, + 0xfb3d482ba2e9487d, + 0xf81b973ba1db56e9, + 0xdf76953cbfce9657, + 0x43ebd291fed1a5c3, + 0x3157bd932ed6c541, + 0x8af96c443ab6c29d, + 0x1dfa8b4658c9e21b, + 0xe7d3698545abef67, + 0xa9cd2b3986ae1fd3, + 0xc32a47dcb7c34e51, + 0x8ba9712fe2b54cad, + 0x54169721f1d86c2b, + 0x1a48d3f321dc6b97, + 0x634cf9b32ead89f3, + 0x1f8da6c65eb2c971, + 0xf739cb465a93b6cd, + 0x93bd7e2989a7e64b, + 0x875d1f3dc6a9f4b7, + 0xda78b43fe8bd1625, + 0x493fa16fe6bf3491, + 0xab96d4e216a352fd, + 0xfdcb692543c5716b, + 0xea7dc1b541a86fc7, + 0x48fe5ba76f8b9e35, + 0xc5e734f76c7e9da1, + 0xb2d7a31a9a82cb1f, + 0xacf3648ed983ea7b, + 0x769c231ed685f9e7, + 0x47dc8933289b1a65, + 0xfead8b65469d38c1, + 0x857e32c7659e473f, + 0xc32e54f983a2659b, + 0x8a16b54dc2b68519, + 0xab19273dcf79a385, + 0xb13ed56dcd7ba3e1, + 0xa6b89f3fea7db15f, + 0xa37159632961dfab, + 0xd98741b43a74fe29, + 0xe61cf9a54a871e95, + 0x6d72b95986793cf1, + 0x38a652ca947c3b6f, + 0x7d5f124ba26f49db, + 0xfc85613fe1827a49, + 0x129a346fef6498b5, + 0x5cdf27421f69b823, + 0x67e8fa532d4ab58f, + 0x6714fc24395dc4fb, + 0xb4fd92e98b71f369, + 0x5f791e2cba8613d5, + 0xe42bf31eda894253, + 0x623e791ed56941af, + 0x218369dfe36b5f1d, + 0xb4ce7962124f5e79, + 0x8e35f76541628ce5, + 0xb296a4f87f45ac63, + 0xfb37d2e65d36a9bf, + 0x9e6b53887b4ac93d, + 0x142dc3fcb83de7a9, + 0x915adf7feb632917, + 0xa97c82b1fa652783, + 0x7ae9f842184735df, + 0x6bcade73273a645d, + 0x236a1ef8724d63c9, + 0x8475e26ba15f9237, + 0x7ab5286a9f54b1a3, + 0x9cd512398b249def, + 0x25d4e16dca27be6d, + 0x2e98b7a1f728ecd9, + 0x4a52f982192dfc47, + 0x53b197f769512cb3, + 0x6139c2b989465b31, + 0x71cb68dba526498d, + 0x9c1e4a7cb32a57f9, + 0xb6d3f95dc12d9867, + 0xa671cd2cbe1f96d3, + 0x5bd391a1fe23c651, + 0x5bd7fc332e15c3ad, + 0x2ad8ec365c18e32b, + 0x49fe63165a2bf197, + 0xfad36519894d21f3, + 0xe974f1acb9324f61, + 0xd1b73e5ba6134ebd, + 0x58df2b4fe4176d3b, + 0x3c1729e1f2196ca7, + 0xb56c1e35432d9b15, + 0x64eac2d43dfeba81, + 0xc673dbf54af1b7ed, + 0xeba13f276af3e75b, + 0x7ade29f989e6f5c7, + 0x41eb637dc9fb1735, + 0xeb4a879dc7fd35a1, + 0xe2d4ab3dc6de541f, + 0x49d7e83215f3627b, + 0x23ab56f543f581e7, + 0x2754dec761e89f45, + 0x8ef726365fda9eb1, + 0xdfbca54769bdac2f, + 0x69e3df1879d1ec8b, + 0xa1c85d3cb8c3eaf7, + 0x382a9dc1f9e81b75, + 0xe4ab91f327ea39d1, + 0x713658e326dc384f, + 0xad8f9ce653df46ab, + 0x184b79dba4e38629, + 0xd7c9e51cb1e6a495, + 0x8cba6f5a9ec8a4f1, + 0x1a6bc5ea9dcab26f, + 0x1ebd2841f89ec1db, + 0x54876b332ab1ef39, + 0xb84a6c9439c41fa5, + 0x2b15de9769c84e13, + 0x291eb7c765b93c7f, + 0x48d1e698739c4aeb, + 0x371548dba2cf6b59, + 0xd971fb3fe1d289c5, + 0xc2b1da8fefc6b943, + 0xe2d648321ea7b69f, + 0x264cfad43e9ac61d, + 0xe5cd8a943bade479, + 0x95b137498ab214e5, + 0x9d467c2cbac72463, + 0x1396f72dc6a742bf, + 0xb1c6ad8fe5ba613d, + 0xb563f1dfe2ac5f89, + 0xf6d3a2c2129e7df5, + 0xf8ab72e651b2ad73, + 0x4dc5b1943e749acf, + 0x3b964ac65e87ca4d, + 0x1ca26db65c6ae8b9, + 0x7f4658dcba8df927, + 0x7f41a98feab12893, + 0x971e684ed79436ef, + 0x3ae927d217a8456d, + 0xe94815a3238a64d9, + 0xf13db29762ad9347, + 0xcf8a51b8718f92b3, + 0x4b58de1baf95c231, + 0x2c1d67ea9c64bf7d, + 0xae96d78cba56cde9, + 0x695f1c7fe96afd57, + 0xb14a96d3297e1dc3, + 0x4ad7e1c76a925c41, + 0x26d98a1656734a9d, + 0xb85d693ba487691b, + 0x8b7e69adc25b6987, + 0x7f1c6e3cb16c97e3, + 0xdf47abedce5fb761, + 0x9c435a81fe62c4bd, + 0xdb9354e21d76e43b, + 0xb192da443c58f2a7, + 0xa81e24687b8c2315, + 0xf6b83c5a9a7e4281, + 0x2318a74a97614fcd, + 0xe789324dc5736e4b, + 0xf89ca56fe2456db7, + 0x869357a1f16a9c25, + 0x18f259b4325dab91, + 0x641feb332c3ea8fd, + 0x6d4e31865d42e86b, + 0x1e93bad98b34f6d7, + 0x7853149cbc6a1845, + 0x7be4652ed95c36b1, + 0x8594631dc86d452f, + 0x478cb6d1f751638b, + 0x4fc285b2165482f7, + 0xafc9b2d76348a175, + 0x915d73a762489fc1, + 0x43d197876e2bad3f, + 0x8457a3276a2fcd9b, + 0x49376bfbab43fc19, + 0x27cfba6feb361c85, + 0xd8a53471f9483ae1, + 0x324f85c2182b395f, + 0x15dca424362e47cb, + 0x1893bf5ba6418739, + 0x947a538cb42396a5, + 0x4e61b2adc248b613, + 0x1378de5bae19b37f, + 0xa461dfca9d1ac2eb, + 0x9fce61bedb2fe159, + 0xf3ac15276d3421c5, + 0x9c3eab176b174f23, + 0x23a879d659173d8f, + 0xfd346a9876194cfb, + 0x2f756bdba41e5c69, + 0x16d79f5dc4218ad5, + 0x95d2fc3fe214ba53, + 0x9ae728ddcde4b7af, + 0x268de9b21ef8c72d, + 0xe9d837c32cfbe589, + 0x48b1cd6439dce4f5, + 0xc18e564a9bf12573, + 0x172e53ba98e543cf, + 0x6a4289ccb7f8624d, + 0x1ec48b3ed4fa61b9, + 0x2f43ac9ed3ec8f17, + 0x7debac6212df9e83, + 0x6d1be92541e29bdf, + 0x7b1aec443fe4cb5d, + 0xafbce8654bd6eac9, + 0x13dc4af769dbfa37, + 0x1a6d2f4cb8de19a3, + 0xe491762edae35921, + 0x613275c1f8e3467d, + 0x79dc582214d765e9, + 0x65478ac323eb9457, + 0x5fb17a9762ed94c3, + 0xf13b576982dfb341, + 0x82d465f87fb3c19d, + 0xbe548f287ba4cef9, + 0xbd5e826dcab8fe67, + 0xa2563e81f8ba1ed3, + 0x5638fac329be3d51, + 0x7adf692437c14bad, + 0xd27abef657d46a2b, + 0x72c1f3b983d56a97, + 0x1becd38872ca98f3, + 0xe671283ba2cdb871, + 0x2a6835fa9e8fa5cd, + 0xed9218a1fda2e54b, + 0x285ce9a21da5f3b7, + 0x7fe9b8176dca1425, + 0x5bdcf7876abc4391, + 0x1dfeb837679c41fd, + 0x25f18c7a97a16f5b, + 0x62f1d38cb4a36ec7, + 0x7531a8bfe2b79d35, + 0xecd49761f2b89ca1, + 0xb4da8574328cba1f, + 0x163ab9f32e6fd97b, + 0x5d86bc254c92f8e7, + 0xad9416c98db71965, + 0x7314ed698ba937c1, + 0xa9b4715dc89b463f, + 0xfcb9681ed68e549b, + 0x5984c761f6b28419, + 0xa7b45fd216b4a285, + 0xad9164f65497a2e1, + 0x9e7a8f165178ae4f, + 0x65cd8eb54f59ceab, + 0x89d345687b6fed29, + 0x1d26fc9cbc831d95, + 0x637cf24eda863bf1, + 0xf84d751fe9783a6f, + 0x2fe348a2176a48db, + 0x4e75b1f3257e6849, + 0xd3eba5f7648197b5, + 0x8256c79ba495b723, + 0x6b83417ba176b48f, + 0x16d7ec5a9e58c3fb, + 0xd651493cbd5ce269, + 0x836e7dfdca6ef1d5, + 0x45e319632d964153, + 0x9a65cbf32a653e9f, + 0xe9c381b549685e1d, + 0x6c751239864b5d79, + 0x452c3a1a934d7be5, + 0xeb82759ed471ab63, + 0x162397bed153a8bf, + 0xb7a1695fef46c83d, + 0xd34e6a521f38e6a9, + 0x9c75e6443d4cf617, + 0x49c8df187c5f1683, + 0x63d24c198a6234df, + 0x48391a6cba47635d, + 0x2ae785bed74862c9, + 0x23157c8fe65c9137, + 0x5b83facfe24d8f93, + 0x9e415f3323419cef, + 0xdfbe8a965143bc6d, + 0xb8d31f654f25ebd9, + 0xf48aeb176d29fb47, + 0x2cfd75e98c4d1ab3, + 0x79421d8dcb5f4a31, + 0xf95bd21fea32478d, + 0x6cfb17dfe82456f9, + 0x3d4cae82182a9567, + 0xc9d86315462b95d3, + 0xf4723be9863eb451, + 0x13a52f998341c2ad, + 0x16cfa5da9f35e12b, + 0x8d32576bac15ef87, + 0x2f78196dcb291fe3, + 0xe569cd31fa2c3e61, + 0x1cfd48e3281f3cbd, + 0xd68c3a7659126c3b, + 0x472de81658146ba7, + 0x691782dcb6289a15, + 0x5e6b87dba42cb981, + 0x2b763e8a921ca6ed, + 0x5a628fea9cefd65b, + 0xb926e53edbe2f4c7, + 0x7698d5c32df81635, + 0xfc64d9b65cf934a1, + 0x1fa3ce9769eb531f, + 0xd31b749768fe517b, + 0xf471b25a95e16fd7, + 0x8473dcfcb6f39e45, + 0xfd64958dc3f69db1, + 0xbc965eaed1e8ab2f, + 0x583de6c321fcda8b, + 0x6b8341e32cbed9f7, + 0x3ebf5d176de31a75, + 0xc3941db87be638d1, + 0xfcd1a9398ad9374f, + 0x7b14da3a97ec45ab, + 0x94b1ae8dc6de7529, + 0x985cd411f6e1a395, + 0xc751db6326d5a3f1, + 0xe196a7f543d7b16f, + 0xcb791d3541d7afcb, + 0x4bc26d165fabde39, + 0x4587e9a76b9efda5, + 0x9efb3d7babc54d13, + 0xa1e724ced9c53b7f, + 0x32dc1791f6c749eb, + 0x8bd7ea3217dc6a59, + 0x7bd1f8c324be78c5, + 0x6a13dfc876d1b843, + 0xa3fe491872c3b59f, + 0x4ec3df7a92b7c51d, + 0x419cf7b98fbae379, + 0xcf41ed6bac9bf2e5, + 0x1a82c5bfecbf1263, + 0x1ba6c5932ca341bf, + 0x9ce7b42439a65f2d, + 0x4ce7269436b75e89, + 0xdba13497649a7cf5, + 0x12b6de4984ae9c73, + 0xfc2de41cb381a9cf, + 0x5c8f927fe1a3c94d, + 0x13efb65edf85e7b9, + 0x4c6bd7921e9af827, + 0x637b2a954ead1793, + 0x8de67a954a8d25ef, + 0xf5c9a1498ba2546d, + 0x68ae451cb8a563d9, + 0x561e39fed6ba9247, + 0xca64fb2fe58c91b3, + 0x89a4c5dfe48daf21, + 0xb9f3d5832381be7d, + 0xf1a68c254173dce9, + 0x96e2d4543e86fc57, + 0xc7d5e3176e791bc3, + 0x631475da9c8d3b41, + 0x3615ea2cba6f389d, + 0x75c84a3fea93681b, + 0x354a27c1f5a49687, + 0xbf7c4622157896e3, + 0xe5c97824348cb561, + 0x28de74f6526ea3bd, + 0xbf6e5caa9481e23b, + 0x5ca46efa9e64f1a7, + 0xfb671a3dce893215, + 0x375e491edc6a3f71, + 0xdb2c45a1f85a3ecd, + 0x93dae682196f5d4b, + 0xda6917e439526cb7, + 0xed9bfca548769b25, + 0x9b172c598457ba91, + 0x67f5a2398249a7fd, + 0x2d56791ba14ed76b, + 0xf6e95d2cbe41f5d7, + 0x3d1a68c1fe861745, + 0x3c1eb9a32e6835b1, + 0x1c4afe243c6a542f, + 0x98b73c576a4d528b, + 0xa9e5fdc9894e61f7, + 0x5ced914cb8429f65, + 0x9c372f1cb6459ec1, + 0xe95b427ed247ac3f, + 0x5a3d8e61f138dc9b, + 0x914da654324deb19, + 0xd3e1a7f76f421b85, + 0x528ecd187d4539e1, + 0x23c714fa9c27385f, + 0x6e57af398a2946cb, + 0xb794f6ddca2d7639, + 0x5684cb3ed72f84a5, + 0x92daec71f864b513, + 0x432e8a921635b27f, + 0x2786acd65437c1eb, + 0x3c21edf7612adf49, + 0x725cbef76d1cfeb5, + 0x9c53fd7bad514e23, + 0xf6c159bbab143c8f, + 0x429c53eed9164afb, + 0x7e8a1421f81a5b69, + 0x1a35c6e3281c79d5, + 0x1db25975471fa953, + 0xd4f1be887512b6af, + 0x1af3764a9415c62d, + 0xe7365facb217e489, + 0xac7f95698cd9e3f5, + 0xad8f25ecbcfd1473, + 0x6857ec3cb9de32cf, + 0xfe54ac932bf3614d, + 0x163ec8b328e45fa9, + 0xe6b29ca546f98e17, + 0x13b9fd7765fb9d83, + 0x78945a1763ec8adf, + 0xa6d254ea93f1ca5d, + 0x6a5ef24cb1f3e8c9, + 0x3e19b78dced6f937, + 0x9e3dac732feb18a3, + 0xce3a2b865ced4821, + 0xb17659e54acf357d, + 0x9a3db8f87ad264e9, + 0x3f78e6dcbae69357, + 0xdae2148cb6e892c3, + 0x8392f61ed6ecb241, + 0xd8c1495fe2bcaf8d, + 0xd5ec14f323b1cdf9, + 0x978fabc541c3fd67, + 0xe4f817965fb71cd3, + 0xae365c887eda3c51, + 0xa381954768bc39ad, + 0xd674be9ba8cf592b, + 0xd946f83fead26897, + 0xa2bd5c6fe6c597f3, + 0x3b76a48325d9b671, + 0xb4e6517323b9a4cd, + 0x5eb4831762aed34b, + 0x62e74ab983c1f2b7, + 0x7fb4918bafc71325, + 0x48a1f5dcbec84291, + 0xf18ec92cba983fed, + 0xc92de451f89c4e5b, + 0x43a72ec2189f5dc7, + 0xbda5187548b29c35, + 0xd5c2be9546c59ba1, + 0x1d3b5f7764a7b91f, + 0x23951df7629ad87b, + 0xbd1256eba19cd6e7, + 0xa64938bedfb21865, + 0xdb9ea3c1fea536c1, + 0x93dcfa221da8453f, + 0x64a3d8e32d8a539b, + 0x7bae9c165bad7319, + 0x47dbacf767af9185, + 0xf5d72ebba6839fd1, + 0x2c84167cb385ad4f, + 0x15793fafe276cdab, + 0x1b94d8c1f17aec29, + 0xe519ad83217dfb95, + 0x746de3165e823af1, + 0x427e1bc65d84396f, + 0xc319e2f65c8647db, + 0x71f842cbac8b6749, + 0x93fa127dc97d86b5, + 0x2b4e71aed78fa623, + 0xbcd7f31fe572b38f, + 0x7b8526321475c2fb, + 0x8a6f39c54378e169, + 0x63cf87e54169efc5, + 0xbef6c1998e7d1f43, + 0x715ed2998c613d9f, + 0xb68925cbab745c1d, + 0xf3a498dfeb465c79, + 0xb917da51f8497ae5, + 0xf7b98562185d9a63, + 0x9a45dec3254e97bf, + 0x56c124e98562c73d, + 0x67ce29598264e5a9, + 0x7de6a84cb269f517, + 0x8274e36cbf6c1583, + 0xfe95c17bab5c23df, + 0x7359a6b1fc71625d, + 0x4bce39832d5461c9, + 0xe1d9b5f43b468f27, + 0x69c718e6574a8e93, + 0xf39bd2e7653a8bef, + 0xf23eba69843fab6d, + 0x47fadc1cb342ead9, + 0x2ae9637ed135fa47, + 0xd3a7f51fef4819b3, + 0xa35148b32f5c4931, + 0xe85319d54c2e368d, + 0x24a9dcf87c3165f9, + 0x32176d5bac239467, + 0x16f4935cba2794d3, + 0xa21843fed84ab351, + 0xa7f6948fe53cb1ad, + 0xeaf8261ed43ecf1b, + 0x92cef6721432fe87, + 0x32ef6b9872461de3, + 0x3c92ab587f293d61, + 0x9d5afe876e193abd, + 0xf4a596798c1e5a3b, + 0x4531b8cedc2169a7, + 0x4783612feb24a915, + 0x95d74be1f926b781, + 0x59af48d32618a5ed, + 0x74dfeb94361cd45b, + 0xde854ba7641fe3c7, + 0x3425fd6cb7261435, + 0x7d1e653a9ef643a1, + 0x8b26f9dbace8521f, + 0x935b8d2dcae94f6b, + 0xba8129fdc8fb5ed7, + 0xb4c2fe9219ef8d45, + 0x95387dc547f39cb1, + 0xf1d8c6b546e5ba2f, + 0x427e6b1653f6d98b, + 0x2ae5f9d762ead8f7, + 0x42bc3e5ba1edf875, + 0x27f436ccbfe237d1, + 0x2c581d3fecd5364f, + 0xc3a2ef921de754ab, + 0xea75f4243ceb7429, + 0x96b235d54aed8295, + 0xcdfb839767ce92f1, + 0xbe31675986c2ae5f, + 0xa54d73f983d4aecb, + 0x3fc9178cb2c7ed39, + 0xd9cf513fe1d9fca5, + 0x9e74f13654de2c13, + 0x8c1b96754ec13a7f, + 0xd3e724165dc348eb, + 0xfce81bd54cd76859, + 0x4c739af769da87c5, + 0x9785edccb8cda743, + 0x5462bf9dc5bea49f, + 0xe614ba91f6b3c41d, + 0xd9e6fb4214c5e279, + 0x631bc5d543b8f1e5, + 0xe913657984dc2163, + 0x2cd46b965d8c2eaf, + 0x9c16a3298ca15e2d, + 0xb193c2dbacb35d89, + 0xc54e381ed9a67bf5, + 0x576a31d1f6ca9b73, + 0xa4ed3952157b98cf, + 0x8cfd43e3259fb84d, + 0xc7e1649654a2e6b9, + 0xec127aba93b5f627, + 0x69745a8cb2ca1693, + 0xaf234d1a9d8a24ef, + 0x47281a3cbc9e436d, + 0x5248ca61fca162d9, + 0x87d1ab432db59147, + 0x135ed9432b968fa3, + 0x7edc41b65789ae21, + 0x93bd42e6546bac7d, + 0xf48ebc58736fcbe9, + 0x17f4bd6dc392fb57, + 0xc473819fe2961ac3, + 0xa3d5c76fef893a41, + 0xea9c36521f6b379d, + 0x58bace143d8e571b, + 0x1fbed6554da19587, + 0x3d2ca4b87b8495e3, + 0x7dbe348dca98b461, + 0xeb4392adc568a2bd, + 0x6c5347afe57cd13b, + 0x8a92b63dc25edf97, + 0x14bde3f325841ef3, + 0xd7f6ac9652963e71, + 0x2cd739554f573bcd, + 0xb4d65c987e6a5c4b, + 0x14c629e98c4e5ab7, + 0xcabe478edc719a25, + 0x23f754afea64b891, + 0x3b79a21fe745a6fd, + 0x594f2c621749d56b, + 0x5d184b73235be4d7, + 0xbd7e6f29827ef345, + 0x635e84fba28534b1, + 0x9e5c4d3bae67532f, + 0x5128ef4dce49518b, + 0xa91b84fdcb3a5fe7, + 0x8dea3541fa3d8e65, + 0x1875d6b43a529dc1, + 0xbfa9e8d32854ab3f, + 0x26df9c154635da9b, + 0xbd1a6c287548ea19, + 0x14257bcba23cf985, + 0x176a398cb35f28e1, + 0xd7e82f9dce42375f, + 0x7ea845c1fe2645cb, + 0x743fdbc21e2a7539, + 0x95d8b6c54d2c83a5, + 0x3c864b587b5ea413, + 0x3954c6298942b17f, + 0x7a523bf98623afdb, + 0x91765e4cb526de49, + 0x623d81bdc328fdb5, + 0x13e94671f45c1d23, + 0x3e826af5413e2b8f, + 0x9cd36ab65e1249fb, + 0x23a159d87e145a69, + 0x43f59b776c1978d5, + 0xcd735b8a9b1ca853, + 0x5367efccb71d95af, + 0x67238a5fe831c52d, + 0x694ea7b1f614e389, + 0x8de4a5c43617e2f5, + 0xc49bfad9864b1273, + 0xcd5f9638742b31cf, + 0xe19f54a76bec4f3d, + 0xe8a92d587cf15ea9, + 0x253c4f1babf48d17, + 0xef1c2b8edaf69c83, + 0xae4d275dc5e789df, + 0x7b9362d216fcb95d, + 0xd63419e324efd7c9, + 0xf5c397b765e2f837, + 0x64ce27ba94f617a3, + 0xd185942cb3fa4721, + 0x52138cfa9feb347d, + 0x24d6f9bbabcd53e9, + 0x187d9341fce19257, + 0x149b75632be591c3, + 0x9c1ad8e549d7af31, + 0xc9da281435c7ae8d, + 0x743e1d9654dabcf9, + 0xd2a5be4983bfec67, + 0x914623bba5e41bd3, + 0x975e8faed2e73b51, + 0x1dc479afefc738ad, + 0x6fadebc21fdc582b, + 0xc31eba632dce5697, + 0x2ad4b8765bc196f3, + 0x3f417ed98ad4b571, + 0x3ba74cf987b6a3cd, + 0x8fe1b6dba6c9d24b, + 0xea52f74ed4ace1b7, + 0xb7da569dc3adef15, + 0xaefdc15325c43f81, + 0xe38d791541a53ced, + 0x4c5a17243fa84d5b, + 0x765def154e9a5bc7, + 0xb8acd3287cae8b35, + 0x3b2ae78ed8c2b9a1, + 0x27a638eed7a4b81f, + 0x5c437281f4a5d67b, + 0x2ae754c214a9d5e7, + 0xc9e846b323acf465, + 0xe3c8bfd874af25c1, + 0x7da3e1ca91b2543f, + 0x364f95198fa6529b, + 0x18da97bdceba7219, + 0x3fbc65eedc9b8f75, + 0xe3bcd671f97c8ed1, + 0xeaf84d532981ac4f, + 0x8ce567f32673dcab, + 0xe7b319554586eb29, + 0x21b8c4976378fa95, + 0xd27165eba48c29f1, + 0x37a6145cb19e286f, + 0x8dfb7e2dcf8246db, + 0xd2815471fea57649, + 0xfe95b8721e7984b5, + 0x9672c5d54d8ca523, + 0x3162b955496da28f, + 0xf5a148276872c1fb, + 0xfd537e6ba673df59, + 0xc318d47ba376fec5, + 0x4c21a97ed58a1e43, + 0xd4619c3fe16b2c9f, + 0x47258ba4327f4b1d, + 0x428c67f43f625b79, + 0x79fbc4143d6479e5, + 0x6d2ca8387d58a963, + 0x5a26b1f8784a96bf, + 0xcb43d17ba85eb63d, + 0x2976fb1ed761e4a9, + 0x47fd961fe685f417, + 0x648adef326791483, + 0xac9827d6546932df, + 0x3dca9549827c415d, + 0xdce73f576d3e4fb9, + 0x65bd481bad538e27, + 0x6d2c95acbc458d93, + 0x19e5d34dc9368aef, + 0x3c54e721f739ba6d, + 0xc5db7e92163ec8d9, + 0xa5e6b9443851f947, + 0xaec8763a976518b3, + 0xf26139acb5694831, + 0x64597c3cb14a358d, + 0x8cb9e4fbae2c54f9, + 0x97f62b8dcd2f8367, + 0x76a8c491fc5492d3, + 0xd8af64943d47b251, + 0x7da16ce43826af9d, + 0xaedf83c65739ce1b, + 0x598423f7652ced87, + 0xf6bd247ba7521ce3, + 0x7193ea8ed7453c61, + 0xfbc9283fe12639bd, + 0xda3b69ffef1a593b, + 0xb41375a32f1d58a7, + 0x3f82ebd54d2f9815, + 0xc3859bd87d23b681, + 0xc4d52f187915a4ed, + 0xe718253ba918d35b, + 0x437ae1ccb61ae2c7, + 0x64759bddc72df135, + 0x3eb8ad61f75342a1, + 0xd514a6f325143efd, + 0x48be6d2652174e6b, + 0xe5c6d4843ef85cd7, + 0xa2b359f76dfb8c45, + 0x954db12769fe8ab1, + 0xd4126efba8e1b92f, + 0xe934d87dc6f3d78b, + 0xa6e352ddc4e5d6f7, + 0x5723ec9214eaf675, + 0x2b89e51545fc26d1, + 0x6c358fd873de254f, + 0xea4d197981f253ab, + 0x5718d42bafe67329, + 0x6974defcbdea8195, + 0x89ac627cb9ca8fe1, + 0x54cd721fe7bc9d5f, + 0x4ec681f327e1adcb, + 0xae54cf3327d4ec39, + 0xacf218b434d6fba5, + 0x6f45c9a986ea2b13, + 0x163e9da983dc297f, + 0xd482a6ca91cf37eb, + 0x5ed4f83dcfd26759, + 0x2bd85711fed486c5, + 0xb74639821ed9a643, + 0xfd398e6328cba39f, + 0x362e91b658aeb31d, + 0xadcb358768c2e179, + 0x1da2345986a3efd5, + 0x9283c75cb6c81f53, + 0xa2b9147dc3b82daf, + 0x2953be41f1ab4c2d, + 0xdc74a5f321bf4c89, + 0x1c8ebfd43eb27af5, + 0xf817dac54ec59a73, + 0xbe5afd754ba697cf, + 0x12e834d7689ab74d, + 0x16db847ba68ed5b9, + 0x41f976ced8b1f527, + 0x6d3784e1f7c61593, + 0x436e5c8215a723ef, + 0x6e8af74653ba426d, + 0xfe9d8cb762ac51d9, + 0xb461fdc65d9e6f37, + 0x9c8e36287d928ea3, + 0x63182cdcbc96ad21, + 0xc726b8ffe986ab7d, + 0x3c59b211f568cae9, + 0xb74f8c62168dea57, + 0x9b623c4657a219c3, + 0x9375da4987b63941, + 0xe91cdf2982a7369d, + 0x94576eadc29a561b, + 0x49a8dcfcbf9d6487, + 0x5364219cbc7f84e3, + 0x3169ac71fd94b361, + 0x6fa3bde32c75a1bd, + 0xc2fa9e543967cf2b, + 0x7d9fcb14365ade97, + 0x19b8f468756becf3, + 0xa7d586fcb6923d71, + 0xe59134acb2743acd, + 0x2358fc7fe1875a4b, + 0xd214fabfef4a59b7, + 0x2b637fa21f6d8925, + 0x926e14f43d5fa791, + 0x5c7963254b62a5fd, + 0x2153dbc98a75d46b, + 0x729814cba958e3d7, + 0x9a45e1bdc87bf245, + 0xea75196ed67e23b1, + 0xa95df71fe683512f, + 0xdfe6a5c212634f7b, + 0x918c2a7431465de7, + 0x31f625b54f3a8d65, + 0xd4751af76e4d8bc1, + 0xcba928187b4e9a3f, + 0x2d963e1dca42d89b, + 0x9542f3beda45e819, + 0x721d893fe639f785, + 0xaf59b744385b27e1, + 0x5246ef74374d265f, + 0x9672d419836154cb, + 0x24c9de7cb1657439, + 0xf9ce153cbf3782a5, + 0x74f1ba9dce5ba213, + 0xd5ab6fedca2b9e6f, + 0x1bd5e78dc72f9edb, + 0x9e6bfa321a32ed49, + 0xd8baf2743824fcb5, + 0x98cb413878591c23, + 0x1c453f88753b2a8f, + 0x34e75bda942d38fb, + 0xc72f3b8ed2315869, + 0x4f85e72dcf1387d5, + 0x512eba71fe18a753, + 0x37641c932d1894af, + 0xf6438e965a1cb42d, + 0x483fb6e65a1fd289, + 0x47c562398923e1f5, + 0xea516d2dca482173, + 0x925d7f4ba5172ebf, + 0x3586b1ddc51a4e3d, + 0xd9183b41f21e4da9, + 0x2bd79ef654328c17, + 0x3ad871554ef29b83, + 0xdcab41743be498df, + 0x8f3126e54af7b85d, + 0x8becd14657fad6c9, + 0x145c6deba8fde637, + 0x39fac75ed8f216a3, + 0x4b7f295fe8f74621, + 0x9efdb2a215f8437d, + 0xe5c1a87543fa52e9, + 0x2179f3d762fd8157, + 0xa318f7c65dce7fb3, + 0x5947a3698cd4ae31, + 0xfb28d45879e4ac8d, + 0x5c42817ba7d6cbf9, + 0x17a58e61f5daeb67, + 0xde2f369216bcf9d3, + 0x5cd97e4768e23a51, + 0xb15d483765e437ad, + 0x312f784a93e8572b, + 0x38dc4b6ba1eb6597, + 0xa8e46d3a9ebc85f3, + 0x45f8eadcbdcfa471, + 0x9ceadb81f9b3a2cd, + 0x5a46d1f32ac6d14b, + 0x4c8a79f328b6dfa7, + 0xfb5632c547bafe15, + 0x6fb985a876bd2e81, + 0x54de16a985a13bed, + 0xc1329edba2d34c5b, + 0x5f89a17fe1d65ac7, + 0x49ab12cfefcb8a35, + 0xf531e6b32fbd98a1, + 0xdba5c7f43c9ea71f, + 0xe8af72d54ca2d57b, + 0x42d7f81769a5d4e7, + 0x8735fb4ba8b9f365, + 0x591a74ced7ab24c1, + 0xb8513fedc6ad423f, + 0xd17946a1f4c2519b, + 0x4f62e3a212a35ef7, + 0x4ab8f9d431b68e75, + 0x8651a2e54f798cd1, + 0xe46cd9a65d7c9b4f, + 0xc7b963f6586fc9ab, + 0x92d6f7bdcb83ea29, + 0x526e4bfed7a4f895, + 0xcbd9624fe6a928f1, + 0x9d65a282159b276f, + 0xfdb7e183248e35db, + 0xfd9746b983b17549, + 0xd8cf463a91a483b5, + 0x78d149ecbf98a423, + 0xfce2683cbd69a18f, + 0x18e6a5fdc85a9feb, + 0x3e589aced86fce59, + 0x936cb5e21972fdc5, + 0xc94e37865a971d43, + 0xad87feb545672b9f, + 0x1cda2b79857b4a1d, + 0xaf98e65cb26e4a79, + 0xf97da61dc29178e5, + 0xf834e51edf74a863, + 0x3295f1dfed4695bf, + 0x58d9fc721e69b53d, + 0xacf41b832b5cd3a9, + 0xc69f31465a6fe317, + 0xec7f691bab951283, + 0x29d3458ba87631df, + 0x8ad1f3ccb5683f4d, + 0x6542739ed25a4eb9, + 0x38ae1d21f15e6d27, + 0xa1659fe542618c93, + 0x46abe7332d4389ef, + 0xd1cfe8654e35b96d, + 0x94ad1fb65b38c7d9, + 0x435b126a9a3ce847, + 0x187d2b3ba84ef6b3, + 0x12b8d43fea854731, + 0xe452c191f756348d, + 0xe2a87dc2164853f9, + 0xebc64a86534c8267, + 0x1adebf38725e81d3, + 0x3f7a56998e52af41, + 0x6e1bf4987c23ae9d, + 0x3edb267a9a36cd1b, + 0x9e2a4bfeda29ec87, + 0x1e6c825ed72bfae3, + 0x12bea954394f2b61, + 0xb7f23186574238bd, + 0x6fcb13da9726583b, + 0x54d1238cb32956a7, + 0xe1d57accb23c9715, + 0x47dac8ecbf2ea581, + 0x738e59ccbc21a3ed, + 0xaed83471fc14d25b, + 0x1894fe743b26e1c7, + 0x69ade1554a19ef25, + 0x5284bfd7683c2f91, + 0x8c46d958761e2cfd, + 0x2e3d41bba7124d6b, + 0x16ab23fdc3145bd7, + 0xda2f576fe2198b45, + 0x1762fc5edefa89b1, + 0xfd25e4921deca82f, + 0x4a5983e32aefc68b, + 0x6de97f154ae2d5f7, + 0x461cd3298ae6f475, + 0x91f672eba8f925d1, + 0x75b846dba7eb234f, + 0x5318e97dc5fe42ab, + 0xf396b1cfe5f37129, + 0x7c56fa8212e37f85, + 0xfe8db27542f68de1, + 0x5e687f943ed89c5f, + 0xe98d675548ed9acb, + 0x89f374c768cfdb39, + 0x52cde93cb8d2f9a5, + 0xa182c64ed9e72a13, + 0xdb15649fe5d9287f, + 0xda2f6ec215da36eb, + 0x7dc6fea323de4659, + 0xf8d496a873e184c5, + 0xc5f8b32a91e6a543, + 0xea84d5c87ec6a29f, + 0xd3ef74c98ec9b21d, + 0x235afc9ed8abcf69, + 0x71a32efcb79fced5, + 0xa6cd8bf32ac41e53, + 0x2154bdf437b52caf, + 0x384c1d7656c84b2d, + 0x924b831763dc4b89, + 0xe1347c6982bd69f5, + 0x631bae5dc2d1a973, + 0x54f3167cbea396cf, + 0x4c9e8a11fea7b64d, + 0xc5f249321ea8d4b9, + 0x2d841fc43bace427, + 0x984ab7c658aef293, + 0xa6f41e3878a432ef, + 0x9356e2fba8b7416d, + 0x54f8376cb3a74fc9, + 0xb71c3afed2ab6e37, + 0xd8e71241f19e7da3, + 0x4ed8b7f654b3ac21, + 0x471be8532f83ba7d, + 0xc7dbe1f43d75c8e9, + 0x857f19b54c8ae957, + 0x418b9237698bf7c3, + 0xf75d92adc9af2841, + 0x7f6a428fe7a2359d, + 0xa9e23411f4a7651b, + 0xc9ad85b214ba6387, + 0x8c931b46549b82e3, + 0x8bc35f98739ea261, + 0x39b28f765e619fad, + 0x1b7e62498d74ce2b, + 0x35219b4bab65ed97, + 0x7dfe643dc968ebf3, + 0x7835b611f98d2c71, + 0x4c92f852176f29cd, + 0x276495143782594b, + 0x3d157e87639458b7, + 0x765fe43cb37a9825, + 0x78ce543cb27ca691, + 0x9afb26c98e5c94fd, + 0x6d9b1e2dce71d36b, + 0xe1569c81fb64e2d7, + 0xec197f632c78f145, + 0xa4179e265c7a32b1, + 0x7dcfbe26586b3e1f, + 0x13fd4a79865f3e7b, + 0xc5e13b6ba4625ce7, + 0x568a472ed2748c65, + 0x85acd64fe2578ac1, + 0xf576a81ede4ba93f, + 0x635794b21f3ec79b, + 0x78cd61954d52e719, + 0x1ce2b6d87c43f685, + 0x8e345a1a9b5826e1, + 0x9572ac4cb96a245f, + 0x92bd76cba75d43cb, + 0x6bf1c53ed75f6239, + 0x9863adb1f46381a5, + 0xbd8a73c323458ef1, + 0x32689a5541379d6f, + 0x387f2a654f289cdb, + 0x2739eb876b2edc49, + 0x297ad4698c31fab5, + 0x62be54aedc561b23, + 0xb14ef89eda36298f, + 0xd58431bfe62937fb, + 0x4c27ad62182d4769, + 0x5ce96fd4342f76d5, + 0x356fba8a9742a653, + 0x14a5cb79812593af, + 0x64a23dea9f18b32d, + 0x2f489cbbae2bd189, + 0x532918bba91bcfe5, + 0x1245d38feb421f63, + 0xc5a2b96439142dbf, + 0x7f6ac32659174c3d, + 0xdb8ea3c656184ca9, + 0x76fae48a952d6b17, + 0x184e3accb41f7a83, + 0x1cf234ecb31297df, + 0xbf25841baef3b75d, + 0x65f9b73febf6d5c9, + 0xe45783621cfae537, + 0xdf1bc3e329ecf4a3, + 0x932f18687aef3521, + 0x14ace5d989f3427d, + 0xe79fbd6ba7f651e9, + 0x926a748cb3e96f47, + 0xebf2a54dc2fa7eb3, + 0x3f987eddc2fe9d31, + 0x6f2491a432f1ab8d, + 0xd85c3e432ed3caf9, + 0xa94bd7643cd5ea67, + 0x2becd8f65ac9f8d3, + 0x247a3bd98aed2951, + 0x4efd672a97cf26ad, + 0x71658feed8e3562b, + 0xa8c694b1f3e56497, + 0x3efd946215d984f3, + 0x378164d654eca371, + 0x1b36278652be91cd, + 0x34281cb76ea1cf3b, + 0x89ac4f276cb3dea7, + 0xf512d7aa9ab7fd15, + 0x2b51c94fe9ca2d81, + 0xc8469231f69b2aed, + 0x356a78e217cf3a5b, + 0xf986a15436d259c7, + 0xf5269d4874d68935, + 0xd3f8e41763d897a1, + 0x1962e7d982cba61f, + 0x1d2e3af98f9ec47b, + 0xdaf567ccbca1d3e7, + 0xfb4635afecb4f265, + 0xf16c29354db823c1, + 0x182f39d659ba413f, + 0x829cf6b5469c3f8b, + 0x51ab9437659e4df7, + 0x8efc376ba4b28d75, + 0x5a176fedc3a58bd1, + 0x674f3baed1b79a4f, + 0xf5c1d9bfef69c8ab, + 0xb7564f921f7ed829, + 0x728a4ed43da1f795, + 0xe354b8976ca527f1, + 0xbe21c4a87ba8256f, + 0xfde2714ba78934db, + 0x3147a29dc7ad6349, + 0xcef23baed49f72b5, + 0xd63abc21f6b5a123, + 0xc8e6ab7212849e7f, + 0x615efad431769deb, + 0x29c4f1d43f6acd59, + 0x5fd136c54a6debc5, + 0xe9b87cfbad921c43, + 0x3b4751ddcb742a9f, + 0x592ba64fea87491d, + 0x2de8ca41f56b4879, + 0x59fd6ec2148c67e5, + 0x6dc83a53248f9763, + 0x23487df7637294bf, + 0x2fd43a8a9186b43d, + 0xbe41a3798f57d2a9, + 0xe31985dbad6be217, + 0xe124cf3cba5cef73, + 0x1c92564ed9612ecf, + 0x7eb52af21a753e4d, + 0xdbc8134328564db9, + 0x7e6ad525485a6c27, + 0xb3fda519845d7b93, + 0x67ca143a924d78ef, + 0xd281795dc152b86d, + 0xf316594cbf34c6d9, + 0x743e9a51fd39e647, + 0xbd6a94f21d4af5b3, + 0xe837d1a65c7e2631, + 0x1265ea387b61438d, + 0x53cb97a98a6452f9, + 0xdb14a73dca498167, + 0x235d41acb5497fc3, + 0xeb5f641ed35c9e41, + 0xb84a932fe13f8c9d, + 0x9312db754253dc1b, + 0x8f59db643f24eb87, + 0xefc79ab65c27f9e3, + 0xdb391ec98d4c2a61, + 0xd62349a9893e27bd, + 0xb6a5791eda41573b, + 0x32164c5fe92365a7, + 0xbd683211f7389615, + 0xe1a64d53263ba481, + 0x61ed9fa6543b92ed, + 0xb2f41968723fc15b, + 0xfe3c41a76e12dfb7, + 0xb37c46fa9c16fe25, + 0xe1d7a8ccbc382e91, + 0x463a79edc8192bfd, + 0xc6a34851f81e3c6b, + 0x65784fe439215ad7, + 0x315bd97769138a45, + 0x4bcf3518752698b1, + 0x649bc5398419a72f, + 0x3da1c5ba921dc58b, + 0x2d3f59698bedc4f7, + 0x2c9e764cbce1f375, + 0x17b5362febf624d1, + 0x4cd692721be8324f, + 0xd5967c4438f941ab, + 0x1c358d6547ec5f19, + 0x3ed5968874df6e85, + 0x6fc5b8ea95f38ce1, + 0x9d3c815ba2e49b5f, + 0x521b439ed1f6a9cb, + 0x9b584efdcfebda39, + 0xd3b7a2521fcde8a5, + 0xc9412bf76de42913, + 0x4c6d89e65bd4267f, + 0xdeb437f769d735eb, + 0xc1bf6e8ba8eb6459, + 0xc7b35e9ba6ed73c5, + 0x43e8f1ddc6df9243, + 0x3126fd7fe4d3a19f, + 0x23b4ed8212c49efb, + 0xa46f7c5431d7ce69, + 0xde25a9743fa9ecd5, + 0x28acbe376badfc53, + 0xb124ae8879c12baf, + 0x5ce1a34cb9c54a2d, + 0xbca7f62fe7d64a89, + 0x42c78b1fe4ca68f5, + 0xb38a79d215cd9873, + 0x69b8eda323ae85cf, + 0xa96345f873c2b54d, + 0x5af481c871c5d3b9, + 0x7eba16398fb9e327, + 0x9dbc21e98dabf193, + 0x8956ec1cba9c21ef, + 0x74d98a6fe9a13f5d, + 0x29f863b218a34ec9, + 0x715a39e329b86d37, + 0x7c3851a545b97ca3, + 0xd91f28b875ad9b21, + 0xeaf7b187628fa97d, + 0xc64a8d3cb1a2c7e9, + 0x374df19dcfa4e857, + 0x72459acfed98f6c3, + 0xfd9cba443eac2741, + 0x9c7284543b8e249d, + 0xf8a9e1c87ca2641b, + 0xa7124e8a9ab46287, + 0x15694a7cb6a781e3, + 0x561892ddc48a9f51, + 0x79aef15dc26b8ead, + 0x159f732fe17fad2b, + 0xaf1476d43182ec97, + 0xdcb53a432d75eaf3, + 0x367b8c465e892b71, + 0x2c4fad365b6a28cd, + 0x45f7b2da9a7e384b, + 0xc85b1f6eda9156b7, + 0xa325f74fe8a49725, + 0xd7453621f487a591, + 0xbc82fa62146893fd, + 0x3caf1be5437dc26b, + 0x269b8d16526fc1d7, + 0xea2dc9198d72ef35, + 0x2c63415a9d762fa1, + 0x7e461cdbab683d1f, + 0xacd569ffe95a3d7b, + 0x289d4671f85d4be7, + 0x6a7db4332a718b65, + 0x824f6c94376489c1, + 0x46fc95887456a83f, + 0x6b89a5387248c69b, + 0x8e43f9cba25cd619, + 0xb3d87c9bad3fe485, + 0x49d6e71dcd7425e1, + 0xa1b4293fec67235f, + 0xba74d9521d5842cb, + 0x3ae159f54b5c6139, + 0xc987dfe5483d6f95, + 0x84adefba97528df1, + 0x1823b59ba5439c6f, + 0x6fa8d3edc2359adb, + 0x85c69adfe138db49, + 0x16ab25cedf2ce9b5, + 0xda48f7621d4ef923, + 0xb796ad465d43278f, + 0x4c5d62987c2536fb, + 0x475b1f998c2a4569, + 0xebd9745ba92b74d5, + 0x8b75931dc82e9453, + 0x572ea13ed64192af, + 0x12356b71f645b12d, + 0x35bda4921325cf79, + 0xba917c354128cde5, + 0x94c783265e1bfd63, + 0x4c82e1f76a2e1cbf, + 0xcf6813aa9c124b3d, + 0x5ce6984edc154ba9, + 0x4bd9a15feb296a17, + 0xae8d4621f61c7983, + 0x8fd37ae3251c86df, + 0xe6387fa54721b65d, + 0x6be598c87513d4c9, + 0x396fd4cba218e437, + 0x39f8eac87de8f2a3, + 0xfe2b943badfc3421, + 0xd6f73c1cbafe317d, + 0xda63875dc8e14fd9, + 0x57286d421af36e47, + 0xac94d8b328f67db3, + 0xd71239a656fa9c31, + 0xfa98d36653fc9a8d, + 0x2d871b4762deb8f9, + 0x4219857cb1f2e967, + 0x15627f8baec5f7d3, + 0x2ba71ed1fdea2851, + 0x67cde9321ceb25ad, + 0x2af8ed643ade452b, + 0x3b2ac4165be16397, + 0xb1d8f95879d582f3, + 0x3c49781cb6e8a271, + 0x45687bca93c78fbd, + 0x82e3b67a92dcae3b, + 0x14c79d5fe1bfcda7, + 0xec82761542d3fc15, + 0xfa7e26d54fd62c81, + 0x56e1b2754cb729ed, + 0x7b91ca876adc395b, + 0x12bfcda769be48c7, + 0xef4b8addcad19835, + 0x1af9453fe7d496a1, + 0xa925f7dfe4c7a51f, + 0x4c738df214d9c37b, + 0x9a7cbf1543abc2e7, + 0xea968d4872bfe165, + 0x9fe54d198fb532c1, + 0x6cf5b4798ca63e2f, + 0xc8f2ae5a9ca73e8b, + 0x9b2534fed89a4cf7, + 0x3cb18a71f8ae6c75, + 0xdb524ef437b28ad1, + 0xcf14b7e326b3a94f, + 0x817efdc54395c7ab, + 0x3c1857a763bad729, + 0x64fc795981ace695, + 0xd267e3aa9c8de5f1, + 0x8e29a37dcda3246f, + 0x8ad51621fc9643db, + 0xd4293f821dba6249, + 0x68cf24b43a9c71b5, + 0xf9decb76579d8f13, + 0xea7315c765819d7f, + 0x972bf4a984739ceb, + 0x972f83ecb286dc59, + 0xc1bf367ed178eac5, + 0xb2e91a5ede7cfa43, + 0x4a3c76b32d6e189f, + 0xfca763465e93481d, + 0x1eda74f43da54679, + 0xf1bc9a754b8976e5, + 0x172d49ecba8c9563, + 0xbe7938dba56d83bf, + 0x6cd32a5fe681b23d, + 0xc72b6ad1f374d1a9, + 0x4592ecf21276cef5, + 0xa1829e654169fe73, + 0x93facde54e5a1dcf, + 0xa5cf9e287b6f2c4d, + 0x4eab26398d624cb9, + 0xa975421edc856b27, + 0x2af14d3feb587a93, + 0xf8b4215ed54a87ef, + 0x8ad6e2b2154ea76d, + 0xab8172f43461c5d9, + 0xa3efcbda9283e547, + 0x743f5d8a9167f4b3, + 0x95d74efbaf7b2531, + 0x834e725bae5c328d, + 0xe4b62a5dcb5e41f9, + 0xd3c48a2feb426f57, + 0x4ba983221a457ec3, + 0x8edfc7643a589d41, + 0xc3159d25453a8b9d, + 0xbac5f348754eca1b, + 0xc6a4e2dcb341ea87, + 0x51a3829cb154f8e3, + 0x932568aedf482961, + 0x83dba271fe3926bd, + 0x837ce9b21e2d463b, + 0xd68c14f43c2f54a7, + 0x1d2b6e398c639415, + 0xe156d3fa9b46a381, + 0xf9e47bcba63791ed, + 0xe6a975fdc529af4b, + 0x5678bd1ba32dceb7, + 0xb4adf98fe341fd25, + 0xb7e23f4763452d91, + 0xde2173c54e162afd, + 0xdfae18965e193a6b, + 0x8fa912776b1c49d7, + 0x7198fecbab1f7945, + 0xa6b3e29eda2397b1, + 0x6593cabed815a62f, + 0xba45c191f517c48b, + 0x3f416ce3251ac3f7, + 0xf759a147641de275, + 0x426bac5a965423d1, + 0x5316e9d98de5314f, + 0x6124ce387ce53f9b, + 0xf2d5163babf85e19, + 0x47d961adc9fb6d85, + 0x1edbaf8dc6fd7be1, + 0xb73c89a327e19a5f, + 0x63bad4e325f3a8cb, + 0x14ce7d9654f6d839, + 0x7c2d145762f9e7a5, + 0x7d123a5a92ecf713, + 0xc86e54fa9dce157f, + 0xedf1463bacd234eb, + 0xc36758a1fce76359, + 0x5437de821be972c5, + 0xb34f2ea65aec9143, + 0xe952b76435bc7e8f, + 0x49378b5765c19dfb, + 0xc7be29f984e3cd69, + 0x68afe54a92c6ebd5, + 0x9fae172dc1d9fb53, + 0xb1428f6edebc19af, + 0x26bd83c21ebf392d, + 0x5d8bcf943ed24789, + 0x5dbfe8943bc467f5, + 0xb2fdc8165bda9673, + 0x836dbca876ba84cf, + 0x354be1fa96bea34d, + 0xbfdc243fe5c1d2b9, + 0x613b74a1f4c5e127, + 0x8d473a2212b6ef83, + 0xf7eb26a542a81edf, + 0x2e761df54f9b2e5d, + 0xc8af61265b8f3dc9, + 0x43c7befa9db26c37, + 0x1984a7ced9c57ba3, + 0xf9d425cfe7c89a21, + 0x3d54ba81f49ba87d, + 0x42695b82148db6e9, + 0x18d9fa5434b1e657, + 0xb35d2e1872a4f5c3, + 0x6215d83ba3c92641, + 0x5df4b2c87f8a239d, + 0x4f9e371bae9d531b, + 0x3bcef86edcaf5187, + 0xb2d438ffea927fd3, + 0x89cabe132ba69e51, + 0x8df76a5325768cad, + 0xf7b385c54579ac2b, + 0x3fd746e6536edb97, + 0xd9216efba481e9f3, + 0xca64be9ed3b52a71, + 0x1e27c6fcbf8627cd, + 0xd5a874c1fe8a374b, + 0x69cd83a21e8d45b7, + 0x9671f4a43c9f8625, + 0x5c84bad76c83a491, + 0x1fe23b47687592fd, + 0xfe25bd1ba578c16b, + 0x376d459ba359bfc7, + 0x231e47dcb27cde35, + 0x54c29b71f4832ea1, + 0x93e6b5f542853c1f, + 0x19a3f7832f563c7b, + 0x69284fe43d594ae7, + 0x54fa69298c4d7a65, + 0xb347d21a9a5f78c1, + 0xdf128eadc962a73f, + 0x76b42dcfe764c59b, + 0x136b45d1f468d519, + 0x7cfbda92146be385, + 0xfd829316546cf3e1, + 0xdf1846ba9481325f, + 0xac59edf98f6541cb, + 0x32479f8bad475f29, + 0xe187da2cbc3a6e95, + 0x21574f8ed94b7cf1, + 0xabe623fed73e8b6f, + 0xd2e359b21742a9db, + 0xd169bc532735da49, + 0xf182cba76437e8b5, + 0xa5264d8a945bf823, + 0x798f3c1ba24d168f, + 0x237c168bae4135fb, + 0x12a4f8bede235469, + 0x6cb217e1fc2873d5, + 0x684bc9a21d4b9253, + 0x3e9d25a5493c81af, + 0xfdc713a6573e9f1d, + 0x143e6d598632ce79, + 0x2e18a7fa9624dce5, + 0x315cf2acb428fc63, + 0x54a6378ed2391abf, + 0x8a724e3dcf1e2a3d, + 0xc27854a43f2148a9, + 0x87314ac65e246917, + 0xd32ec8b65d169783, + 0x2ea937176a1985df, + 0x81a7f2ba981ca45d, + 0xd539472ba61fb3c9, + 0x6413c75ed814e237, + 0x19a4c37fe526f1a3, + 0x4718ba57675a4321, + 0xbf43cd96531a2f6d, + 0xe7bd3a654cfb3ed9, + 0x3184e9a76bef5d47, + 0x6fbd2a598af27cb3, + 0x8f7e952dcaf69b31, + 0xa7e8f25dc5f6a98d, + 0x7e6c1afed4eab7f9, + 0x3c9a4fd214fed867, + 0xbf6235d545e1f6d3, + 0x5e6a3dfa94f62751, + 0x5cb96fd981f724ad, + 0x4a95c1798fea542b, + 0x842bdf7baced5297, + 0x456f97acbace71f3, + 0x763cb28fead39f61, + 0xd948be2217c48ebd, + 0xea734cd326e7ad3b, + 0x25b84a1434e9dca7, + 0xae6f94b874cdeb15, + 0xe5c3bf8ba5e32b81, + 0x48316fbba1c428ed, + 0xaed7354dcfd7385b, + 0x4ad5e181feda46c7, + 0x543a8d221ecd8735, + 0xce92a7543bcf85a1, + 0xc851e92769c3a41f, + 0xde9cb8a768d5c27b, + 0x325bfc4a95b8c1e7, + 0xb14e3f6a93badf45, + 0x6bcd742ba39cfeb1, + 0x687943dfe4b13d2f, + 0x9f86bd4321c43d8b, + 0x693517d32ea64bf7, + 0xe1cf56443eca6b75, + 0xd8324af65bac79d1, + 0x4eb9f31767ae984f, + 0xb352879ed792c6ab, + 0x49135b7fe7b5d629, + 0x7ac6e481f3b8e495, + 0xe5387a93259ae4f1, + 0xb9e4adc654ad136f, + 0xc1e8a9b873a142db, + 0x3c457bd98fb56149, + 0x2643a9798d976fa5, + 0x2961dafcbc9a8e13, + 0x9428abfed96b8c7f, + 0x354c1e6ed56f8aeb, + 0x2368e4d21782db59, + 0xb4d158c32684e9c5, + 0xa5cd2f8765a8f943, + 0x952143b7638b179f, + 0x452d689ba29e371d, + 0xd9fa167dcfa14579, + 0xf7d3468dcd9374e5, + 0x9e26d1b1fda89463, + 0xd8ce36421c6982bf, + 0x93fb2d15497ca13d, + 0x6e7c4bd4365ebf89, + 0xb39612f98672cdf5, + 0x6d8c9f1ba485fd73, + 0x8fb9613ba3671bcf, + 0x928dc17fe17a2b4d, + 0x6c2fe19edf5e3ab9, + 0x87e4acb43f816a27, + 0xa19368f32e647893, + 0x67af15e43b4586ef, + 0x59e42b187b49a56d, + 0x1d762f99875cb4d9, + 0xd92ef15cb86fd347, + 0x13b58e6ed674f2b3, + 0x27b415a1f6982431, + 0xfbc647932469318d, + 0x3f617b25415a3fe9, + 0xc7d3a9e76f3d4e57, + 0xdf37e2b98e517dc3, + 0x7dfce32bad659c41, + 0x621df98dcb358a9d, + 0x8731b92fe748c91b, + 0xacb9e351f53cd987, + 0x5384f962164fd7e3, + 0x643cdf1659742861, + 0x3b9e5719834625bd, + 0xc9163b4ba169453b, + 0x87a3bc4a9f2c53a7, + 0x87f6c34cbd4e8315, + 0x4f638d5fed53a281, + 0x63817d2fe9238fcd, + 0x4f8ab2321926ae4b, + 0x81c927b43628cdb7, + 0x93fa7b47673bec25, + 0xf9ad32e8753efb91, + 0x579d82fba54329fd, + 0xe2b8a75ed125396b, + 0x92a413edcf1948d7, + 0x1857c421fe1c7845, + 0x5f6e19443d2e86b1, + 0x53421bc76c31a52f, + 0xe3df8b476a14c38b, + 0xc192d6598916c2f7, + 0xf73d915cb82ae175, + 0x57b48fea952aefc1, + 0xc4817e2cb52d1e3f, + 0x7824d391f4123e9b, + 0x132d5e7543265d19, + 0x9356adc32ef76c85, + 0x3c61e5f54cf97ae1, + 0xf2b5e6754aec895f, + 0x6a2d984656ef97cb, + 0xa15e246cb8f2d739, + 0x68e193bdc7f4e6a5, + 0xf75b1e6ed5e9f613, + 0x3a46c1f325eb147f, + 0xd637be8654fd23eb, + 0x64a2937983f16259, + 0x6b419c298fe471c5, + 0x213eca5a9cd78f23, + 0xbd7c3e976ac97d8f, + 0xa71b5d8a96da8cfb, + 0x1b5d627fe5dfbc69, + 0xe8d9f37217c2ead5, + 0x946ef8d327d6fa53, + 0x4acb689654d718af, + 0xefb4839874eb382d, + 0x2e9576cba1de3689, + 0x8fb3e12baec176f5, + 0x21baed8dced49573, + 0x1c8b4f2feab683cf, + 0xa2673c521bc9a24d, + 0x69b5f21437adc1b9, + 0xecb8a32546aecf17, + 0xdcabe26876b2fe83, + 0xc6bfa5e984a51cdf, + 0x834f1c5ba3b82c5d, + 0x2dfb491fe1da3bc9, + 0x7feb3a9edfae5b37, + 0x5dc8f1332fc179a3, + 0xe3fb59c54ec5a921, + 0x59a7dc843cb5a67d, + 0xa95fec1547a8b5e9, + 0x3cae287a98acd457, + 0xc4fe572ba69fe4c3, + 0x958c3dbfe8c62541, + 0x745ce2d1f4b6329d, + 0xf2d5ba6434c9521b, + 0xb7512ea431ab4f67, + 0xfc687b254f8c6ed3, + 0x1f843a687ea29d51, + 0x38cf9ad76c738bad, + 0xa36b51ced986ca2b, + 0x63279c1fe568da97, + 0x9c5a3f7fe57bd8f3, + 0xa1fbe583259ef871, + 0x7a6d1e35459326cd, + 0xd42c1ea982a7364b, + 0xb1273fe981a954b7, + 0xb9d6238baf9c8425, + 0x89ce567cbd7e8391, + 0x6a54e1fdcb7291fd, + 0x192fd7afe973af5b, + 0xad6be9721965bec7, + 0xa8739dc32879ed35, + 0x58e9af65456bfca1, + 0x4ecd3179857e2b1f, + 0x52b68a1dc4823a7b, + 0x5764fbddc18549e7, + 0x73c21a5edf4a7965, + 0x57c8a6e1fe5b87c1, + 0xca9342e21c5d963f, + 0x1c72b9643d61c49b, + 0x94fb25c76b75d419, + 0x7e2dc83a9a67e285, + 0x2148b95ba769f2e1, + 0xd7896c4cb67c215f, + 0xba37d46dc35e2fab, + 0x23a98be1f1735e29, + 0x79d6a45321746d95, + 0xd4f965e43e487bf1, + 0xe5b831c54d3b8a6f, + 0x986b3fd65a3e98db, + 0xf63d1b9bab51d849, + 0x9e4b1d8dc943e7b5, + 0xe14c658ed958f723, + 0x1738f2dfe64a158f, + 0xcbf892d2165c24fb, + 0xbea2d1c8725f4369, + 0x1578e46a916372d5, + 0x14c5362baf479153, + 0x9a235b798c267e9f, + 0x1e6ba3498b3a9e1d, + 0x1792f4ddc82ebd79, + 0x15ea4d61f831dbe5, + 0xb6279e521924fb63, + 0xa7f1d835473619bf, + 0x63b41c98764a293d, + 0x7e4ac6f9842d37a9, + 0x8cd4fe9cb23f5817, + 0x97f28e4dcf129683, + 0xd85afe9cbc1584df, + 0x8e1c29b1fc18a35d, + 0x47f912e43d1ab2c9, + 0x7d4bcfa65a2ed137, + 0xec2498776821ef93, + 0xf5cb412987241def, + 0x57cbd82ba5172e6d, + 0xc452137cb4183cd9, + 0x4871a2ffe21d5c47, + 0xdf32a51dcdfe6ab3, + 0xf28ad1c54ef29a31, + 0x8a5ed3732cf3a78d, + 0xe46b95843ae5b6f9, + 0x169bdfe549fad567, + 0xa16e75d987fbe5d3, + 0x4bd2e81ba7def451, + 0x4b1893ddc6f423ad, + 0xf7d1836fe4f7532b, + 0xf9d147b323fa5197, + 0x8bc19f5541da6fe3, + 0x379f85654fcd8e61, + 0x4c3f87965ae18cbd, + 0x26fe5c1879e4ac3b, + 0x6f7b234a98e5dba7, + 0x81534dfdc7d9ea15, + 0xc1465f8fe5dcf981, + 0xc6534ef325bf17ed, + 0xe8592ad546e2375b, + 0xfde3157982e645c7, + 0x84fc23aa91ea8635, + 0x8c1f5a487fdc84a1, + 0x9a45bcd98cbd931f, + 0x45bc678fead2c17b, + 0x576b3fdfe8a3bfd7, + 0xf48a652219b7de45, + 0x5dc8e67436a8fdb1, + 0x38af426656ab1c2f, + 0xfa8d5e1764af2c8b, + 0x4e6dab7a93c24af7, + 0x7d36aefdc1d46a75, + 0x915dab7dcfb978d1, + 0x7b8693afedab974f, + 0xbc8a93221d8e95ab, + 0x6315a9854cb1d529, + 0x97e83cd76ab4e395, + 0x75cf8ba768a7e3f1, + 0x478cbfaa97ba126f, + 0x2c9b5dfba59c31db, + 0x82153e4dc2ae4f39, + 0x39a45861f1b26ea5, + 0xe1c6d9f542b68d13, + 0xf54eba632e968b7f, + 0xf769cd443d6a89eb, + 0xef6a9b554b7eca59, + 0x5f4ab2887a91e8c5, + 0xd65faebdc9a5f843, + 0xf1b4e39ed5a7169f, + 0x25c76d31f59a361d, + 0xe7c8a65215ad3479, + 0xa8976b25429f63e5, + 0x3fe6d42981b49263, + 0xfa7982b76e7581bf, + 0xf169e7b98c679f2d, + 0xe24931d87c5abe89, + 0xedc4562ba86dbcf5, + 0xfb654d8fe981fc73, + 0xb4d6f79328741acf, + 0xd7c29ef436872a4d, + 0x1682fe46546a38b9, + 0xb7f41e9ba38d5927, + 0x8d39e7acb18f6793, + 0xf9e5347bad6285ef, + 0x16f57aedce75a46d, + 0xe34b56c1fc57b3d9, + 0x87cab5d21c6bd247, + 0xde3cabf5496de1b3, + 0xe7d164c98b954231, + 0x1be6573a98642f7d, + 0x43b5cd8ba4563de9, + 0x4daef31dc26a4d57, + 0x4fd123bfe15d6bc3, + 0x397abceede5f8b41, + 0x6b9a52e21f42a89d, + 0x68ae91c43e45c81b, + 0xf38adc954c39d687, + 0x51bd9868794ad6e3, + 0x8237145ba94df561, + 0x2a14df6dc86124bd, + 0x1765bd9fe876543b, + 0x74c62381f34852a7, + 0xfab65124346b8215, + 0x43de6a76524c8f71, + 0xf2d975e54b2f7ecd, + 0xe8f21db87e32ad4b, + 0xf691a2d98a24dcb7, + 0x6ab7f13dca38eb25, + 0x1e95a37ed73bfa91, + 0x63a5f9dfe63c18fd, + 0x78d61f432941386b, + 0x3916ba26582346d7, + 0x132bedfba3298745, + 0xeb368a1a923a85b1, + 0x3e5c1f998e1c942f, + 0xcfd285aa9d1fa28b, + 0xe5f239cedb23c1f7, + 0x9b21ad6fea14df65, + 0x2c4f9be43927fec1, + 0x3eac69b6582a1d3f, + 0x37fa8c46561e2d9b, + 0xe74d19fba7325c19, + 0xb4fd628dc4136b85, + 0x7da9b83dc32679e1, + 0xa273f16cbde7985f, + 0x43d591ffedfa96cb, + 0xa493bce21bfec639, + 0x7b2f81d43bf1e4a5, + 0x452df3687ae6f513, + 0xad85f29769e8137f, + 0x4d925c3986f932eb, + 0x4f1239ccb6fd4159, + 0x9d241f7ba2de4fb5, + 0x21a95f3ed1f48e23, + 0xd1fe5ca321e47c8f, + 0x34ec7b932ed68afb, + 0x6ac7f5243deacb69, + 0x1e526c7548bec9d5, + 0x26ac3fd98ad1f953, + 0x7e3c9f2cb8d417af, + 0x4398d61dc6e8372d, + 0x1d94b8c1f4eb3589, + 0x5a92cbd213dc64f5, + 0x2a369cb652df8473, + 0xc58943d761d382cf, + 0xdeb864987fc6a14d, + 0xe8cd92b65dc6bfa9, + 0x6a2e9d1989bace17, + 0xda935e1cb7aced83, + 0xa4f2b86fe7a21bdf, + 0xc534df8218c42b5d, + 0x458fcd7325d63ac9, + 0xa9b8f24764db5a37, + 0xcbfa613872cd68a3, + 0xe6c458dba3cf9821, + 0xdf8eb47a9fb2a57d, + 0xfa3b846dcda5b4e9, + 0x731a8e51fcb9d357, + 0xba4932c21b9ae2c3, + 0xf63478e659adf241, + 0x91dab5e768b2319d, + 0x6cd39e8876a43ef9, + 0xb183f65ba3b84e67, + 0xd986214cb2a96cd3, + 0x1c5b894fe2ad8c51, + 0x4eda87fdce6f79ad, + 0x572bc3421f83c92b, + 0xe6793f832ea4d897, + 0x7126a3554b98d7f3, + 0x8f7d69165a9bf671, + 0xe541fada978e15cd, + 0x152e3b7ed8a1354b, + 0x16d8fb7fe6a453b7, + 0x859d7411f4b98325, + 0x5f1e647434ab8291, + 0x9671b8c4316a7fed, + 0x92c6b1443d6f9e5b, + 0x6e1924765e62bdc7, + 0x7cae6b5a9b86ec35, + 0x56d39b4dc967fba1, + 0x7a6b589ed87b2a1f, + 0x93a7b851f56e297b, + 0xea748533269148e7, + 0x6cde518324a37865, + 0x3c42f6e6539786c1, + 0xc4b53df9817a953f, + 0xd523aeb87f5da39b, + 0x826379ebad6fc319, + 0x37fa5ebedc73e185, + 0xbe45fd2dc965efd1, + 0x6a51ced32a681e4f, + 0x9e6b712437592eab, + 0x34c89fb6576e4d29, + 0x973cfd6ba4716c95, + 0xd5ca783cb3647af1, + 0x5b6419edc145896f, + 0x8b9e26adcf3897db, + 0xade62941fe3dc749, + 0x8d43f2c21c3fd6b5, + 0x7d8ce1465c74f623, + 0xe1fc38587b56148f, + 0x9f1c6428795823fb, + 0x95dfec2cb85c4269, + 0x5379dc2cb74e61d5, + 0x95cbe6aed5618f43, + 0x3b1f2cdfe1437d9f, + 0xbf85a6e432469c1d, + 0xd2fa7b943f28bc79, + 0x2a1db8f54d2bcae5, + 0xeb56d1f87b2fea63, + 0x8b3e7a1a9a4318bf, + 0x34f8b62dca46283d, + 0xa65b1c2fe72836a9, + 0x3b92a571f83c5617, + 0xd3457922162e7583, + 0x2a5bed87654183df, + 0x91d4fbc98134a25d, + 0x246ed3887f26b1c9, + 0xad65b7398d19cf27, + 0x239dacb98a1bde93, + 0x478c5b6a971cdbef, + 0xc9e67521f9132c6d, + 0xf358e1d328153bd9, + 0xaf146c2438195b47, + 0x83ce5618751c69b3, + 0x495731dba52e8931, + 0xc5fa346cb321a68d, + 0x63b219c98de2b5f9, + 0xac68f5dcbcf5d467, + 0x2f35d1edcaf8e4d3, + 0x8a1c69e32aebf351, + 0x6e932c7548fe12ad, + 0x42fa8db879f3512b, + 0x1a3d78ba96e34f87, + 0x6ef5371a94f76de3, + 0x5d847a9cb3fa8d61, + 0xdb6c4f5a91fc7abd, + 0x6f7b48edcedf9a3b, + 0x7a236bf21fe2d9a7, + 0x7d1a8ce43cd6e915, + 0x3e6b81a54bd9f781, + 0xfc72a48658ca16ed, + 0x1e4f583a98de265b, + 0x45c21e6cb8e154c7, + 0x421f8eaed7e68435, + 0xae5d2481f4e783a1, + 0xae6917f434da921f, + 0x158976f431dc9f6b, + 0x8fdb56a43c9faed7, + 0x2c58fde87cb2ed45, + 0x815694f879a5fcb1, + 0xd9c1864ba9c81b2f, + 0x57b8a6cfe6dc2a8b, + 0xd832169fe5bd39f7, + 0x83dcf91328d16975, + 0xb1d856e435c487d1, + 0xd47cf69652c7964f, + 0xe74d9f2761d894ab, + 0x6b9e54f87fadc429, + 0xc7eb4ad98cafd295, + 0x2346f1ddcba4e2f1, + 0x6d73bf5feab7216f, + 0xed92837218972fcb, + 0x41efd35327ab4e39, + 0x4bc85a74369e4da5, + 0x8e547a6a96b28c13, + 0x5e6a2c3a92b38a7f, + 0x8e16b92dc1a598eb, + 0xea2b64cedf7ac859, + 0xec6a7421fe8bd7c5, + 0x2bac78e21c9fe743, + 0x7d93e6f54ca3159f, + 0xf5c2b7176ba7351d, + 0x41d5f7a768ba4379, + 0xb3fe729ba79b62e5, + 0x8be3961dc5ae8163, + 0xe2af597dc3817eaf, + 0x39e2bc11f1849e2d, + 0xf4e3dab32175bd89, + 0x9d1e8c632e68cbf5, + 0x73d598e54d6ceb73, + 0x17eac6d5495de8cf, + 0xe3154fcbab83294d, + 0x742f531eda8537b9, + 0xc513629fe69a5827, + 0x98b6ca21f48c7693, + 0xe5fc67d2136c74ef, + 0x4187fb965481a36d, + 0x452fe7c76174b2d9, + 0xa7dc2b6a9f68d147, + 0x18fd3b687c58dfa3, + 0x21d74c8a9a6bfe21, + 0x4532798cb95f1e7d, + 0x2ae438d1f8623ce9, + 0x3ec9b5421a864c57, + 0xb3158ed327586ac3, + 0xce85f1a8756c8a41, + 0xcda53e77624e879d, + 0xd12be47ba362c71b, + 0xe5213dccbf43d587, + 0x27e8a64cbc47d5e3, + 0x7afd468fec5af461, + 0x719c63b32a5c13bd, + 0x17692a465a6f423b, + 0xb47a1e998b6351a7, + 0xc4823a1a98456ef3, + 0xf137a6ecb5498e71, + 0x2e9bdc6ba2397bcd, + 0x458f37aed13e9c4b, + 0xa8235f7fef31dab7, + 0x58dfc4a21f34ea25, + 0x162e39d54d36f891, + 0xdc3824965b3917fd, + 0x214bea398a3d276b, + 0x378e1c5ba92f35d7, + 0x27ec5f6eda328645, + 0x8b5c213fe73684b1, + 0x12f94dafe548932f, + 0xa57f8c13243ca18b, + 0xf278d655412cafe7, + 0x83e16da87f21de65, + 0x4dbe53887b24fdc1, + 0x83db25ea9b271c3f, + 0xe9bca57eda182c9b, + 0x18a6bf3fe82d4b19, + 0x9362547fe71f4a85, + 0xf21acb95492378e1, + 0x1c79abe43614975f, + 0xeda42877631795cb, + 0xf4c762e9821bc539, + 0x9be13ad87efcd3a5, + 0x7e6f43aa9bdfe413, + 0x8de251fdcbe4127f, + 0x39efb76ed9f631eb, + 0xd978efb21ae83f49, + 0x87f46b1327fa4eb5, + 0x89cbe3a656fe7d23, + 0x39e872f764e17b8f, + 0x91538bc872e389fb, + 0xfea85c7cb1f5ca69, + 0xe62cf31bafe9c8d5, + 0x9a5163b1fbdce853, + 0x3bca872219bde5af, + 0xc6f3ea765be4362d, + 0x9871e4665be63489, + 0x83fc9db878d963f5, + 0x15c9763ba6ec8273, + 0x68ae541a94bd71cf, + 0x24da839cb4c19f3d, + 0x13db8c71f1d3bea9, + 0xf1de298432e6cd17, + 0x64c871b32fb9ec83, + 0x6b2f51743b8ae9df, + 0xf59c32b769bf1a5d, + 0x9c4821f87ad238c9, + 0xe4b586ddcad65937, + 0xbcf1684fe5d967a3, + 0x4ab89261f5dc9721, + 0xb4d7236213be947d, + 0x39e1f4a654c1b3e9, + 0x9345dbc981c4d257, + 0xbfcd53e76fa7e1c3, + 0x3eb162887ca9ef31, + 0xeacf9d487a9b1f8d, + 0x1468ca2cb78e2df9, + 0xed826b91f9b24d67, + 0x3f69c52218a56bd3, + 0x678e4ac436c98b51, + 0x273eba55439b78ad, + 0x1ebc2987639ea82b, + 0xc71f4beba2b1d697, + 0x7134d9bbae94d6f3, + 0xea1b748dcda8f571, + 0x39a1e571fb8914cd, + 0xe5c2fa421c9d234b, + 0xe81579b43a9f42b7, + 0x8f6315487ab48125, + 0xca2fe1da96a57f81, + 0xb82d47aa93867ced, + 0x9f1d274dc27a9d5b, + 0x72e54f6ed16eabc7, + 0x4f86ca9edf81eb35, + 0x6de9fab32e74f9a1, + 0xe67213a54d87291f, + 0x81b3aec54d6a287b, + 0x1dca6f765a8c36e7, + 0x2d37149cba9f4765, + 0x581b4a6ed79385c1, + 0x49c2635ed586943f, + 0x4738a6c1f367a29b, + 0xb9c57244347bc219, + 0x275fbc44316dcf75, + 0x6724ecd65c62fed1, + 0xba3f4c198c751d4f, + 0xb34ea1698c562dab, + 0x7e9fba2edb6a4c29, + 0xf84d521fe86d4b95, + 0xcb6e9a5ed75e69f1, + 0x65f834221752986f, + 0x71b84f93235496db, + 0xaf21ebd87258c649, + 0x61ab53c9816ad4b5, + 0xfe28a53a9f6de523, + 0x58a71c2cbd62138f, + 0x4f2ec98edc6532fb, + 0x3e57ab21fc584169, + 0x9f34ce621a394fc5, + 0xecf8a133295c7e43, + 0xb7ca5df5453e6c9f, + 0xe27934d986539b1d, + 0x746f38dba234cb79, + 0xc69d8a1cb137c9e5, + 0x268bf1ddcf2be963, + 0x12ba7c8eda2ce6bf, + 0x9312b7e54e51273d, + 0x7c1adb476d2435a9, + 0x3e2b56198c396517, + 0xc1b37d5a9a2b7483, + 0xf265b14a963b72df, + 0x4ae671ccb63f915d, + 0xf6a7c81ed432afb9, + 0xd79be351f135ce27, + 0x18d573954127ed93, + 0x7de8fc243c18daef, + 0x7b8a92e65c2e1b6d, + 0xe938f4187c213ad9, + 0xed73c16cbc135a47, + 0x19e8cb5eda1768b3, + 0x92da516fe72b9831, + 0x394e17c1f41c958d, + 0x1d3c5af3251ea4f9, + 0x532db9498512d367, + 0xea3275f98416e2d3, + 0x4c69dfb87de8f251, + 0xf68d23a87cf921ad, + 0x6deca95989ec3f1b, + 0x7fac965cb9df3e87, + 0x31ab697ed8f26ce3, + 0x7a5cd43329f58c61, + 0xa8fc3eb324f679bd, + 0xcd4193a654fca93b, + 0xcd82796652fec8a7, + 0xec13476ba3f2e815, + 0x591ef8bbaed4f681, + 0xc69517bbabc715ed, + 0x15c74d81fcea245b, + 0xe586c7d21aed43c7, + 0x51c62bf54adf7235, + 0x4ef2a37769e482a1, + 0xca81574765b47efd, + 0x63fca97983d79e6b, + 0x5b36972982e9acd7, + 0xb5e83cfba1bedc45, + 0xaf453beedec2fab1, + 0xfc91e6743ec51a2f, + 0xc9e124543ed6298b, + 0x3dac7ef54bca38f7, + 0x7fc4d2b76acd4875, + 0xec3f482a98bf76d1, + 0x37c8426cb7c2954f, + 0x1d7bc24fe4d593ab, + 0xe4cb21d1f4d8c329, + 0x3945cfe323cbd195, + 0x82a5fe75429bcfe1, + 0xad8521776da21e5f, + 0xe9fb2d476d942ecb, + 0x1c4357e98cb74d39, + 0x54987c1ed8b94ca5, + 0xc519b6dfe8ad7b13, + 0x523cfbeed4ae697f, + 0xca34765215a297eb, + 0xa46c7fb323b4c759, + 0xf83abe1542a8d6c5, + 0xda4f6c5981abe643, + 0x9b8d45c76d7ce39f, + 0xd894e3ccbea2341d, + 0x591cd74fedb54279, + 0x98c371b1fba861e5, + 0x25c9e7421b9a7f53, + 0xf4c98b73257b6daf, + 0x653b2ed5457f8c2d, + 0xc8a79d276472bc89, + 0x38f6d5aa9284caf5, + 0x25fe348dc198ea73, + 0xf45239dbad59e7cf, + 0xa389ec21fc7e184d, + 0x58a7feb32e8136b9, + 0xcbe598143da45627, + 0x1d26c7554ca87593, + 0x38bc19e6586973ef, + 0xb3c41f9ba57c926d, + 0x9418c3dcb46fa1d9, + 0x98e146ced482cf37, + 0xba587d31f175dea3, + 0x52fa3ec54378fd21, + 0xdbc8f9e43f5a1c7d, + 0x78c6f2354c5d2be9, + 0xba6ef42a9d814b57, + 0x89625d3bab7469c3, + 0xb815a26edb678941, + 0xa56cf37fe54a869d, + 0x148c7db1f45da61b, + 0x9c623ae2135fc487, + 0xc32b9d176572d4e3, + 0xbea8526a9287f361, + 0x9f168e287f5812bd, + 0x5a27ecfa9e6c413b, + 0x861fe29bab4d3f97, + 0x83e7fbddca516df3, + 0x379d5c11fa548d71, + 0xc936bd7218357acd, + 0xd9bf13a326389a4b, + 0x3e9c76d6543dc9b7, + 0x47f1d259834fd925, + 0xc1e589acb253f791, + 0xf84d725bae3516fd, + 0xa947ef6ede39256b, + 0x23e41571fc2b34d7, + 0xf564db921c2e7345, + 0x2839bed76c5283b1, + 0x3fc651d87a45912f, + 0xc49aefb986259f7b, + 0x65e3214a9428ade7, + 0x746d392ba32bcd65, + 0xc5bd681ba23febc1, + 0xf721456ede241b3f, + 0x741d9ea43f152a9b, + 0x697b4f365e284a19, + 0x71b3df876d1c4985, + 0xfe91b3698a2d67e1, + 0x1a6354fcba21965f, + 0x19b45e6ed71394cb, + 0x187ca35fe617c439, + 0xc2985d71f419d2a5, + 0xa64d1e36564ce213, + 0xf63182b5421cde6f, + 0x2bf7dc965ce12fdb, + 0xf431ed587cf53e49, + 0x24d3e7a98af74db5, + 0xe738ac2cb9fa7c23, + 0xc29a6e7cb5ec6a8f, + 0xbdf5367dc4de78fb, + 0x5fa736b215f2c869, + 0x5bfca87323f4c7d5, + 0x452db38762f9e753, + 0xda48bf5761d9e4af, + 0x4fac31d98fce152d, + 0xefcd945cbde14389, + 0x19f4b28dcbd462f5, + 0xc731b581fbe98173, + 0xdab4257217c86ebf, + 0x6f95843326cb8e3d, + 0xa5efc24434cf8da9, + 0x9cb51e2985e3dc17, + 0xb3f87cda92d5eb83, + 0x74de853a91b6e8df, + 0x7ec46f8bafcb195d, + 0xd679e8a1fdbe27c9, + 0x8d5e6bf32ed15837, + 0x95b634732cd476a3, + 0xedf219365bd89621, + 0x6279fcb656ca937d, + 0xab3e49c875bca2e9, + 0x45c178bba4bfc157, + 0xd84b672dc4a2dfb3, + 0x8253794ed2b6fe31, + 0x718d2af432b71e8d, + 0x6f458e943e8a2cf9, + 0xc78f26954dae3c67, + 0x94afdeb87cb16ad3, + 0x43c6fd5a9bc48a51, + 0x1a57f24dc6b587ad, + 0x582491cfe5c9a72b, + 0xe98ca361f3adc597, + 0xa6f78bd2149ec5f3, + 0xfd7a245765b3f471, + 0x93d821f872a613cd, + 0x958e62a87fa9324b, + 0x45f372698e9c41b7, + 0x8e7931fbab9d6f15, + 0x5f2eb3cedba27e81, + 0xb4629c71f6837bed, + 0x485c6ae217869c5b, + 0xf81d3ec32468bac7, + 0x27bdcf97648cda35, + 0x789d31e7637fe8a1, + 0x6d5347acb3a4281f, + 0xbf6d387dcf95267b, + 0x3189ae4dcd8935e7, + 0x1b87e421fd9c7465, + 0xc91e38432b8e74c1, + 0xbdf621e65b81923f, + 0x7c3d98f65874a19b, + 0x24b7a9598465aef7, + 0x8c6f4edba369ce75, + 0x521b3c8a936aecd1, + 0xb9e1f5cba16deb4f, + 0x867f42cfef632cab, + 0x8f43a5d21f764b29, + 0x145cea632e684a95, + 0xbcf179e54c5b68f1, + 0x86fad2965a4d876f, + 0xe425f9bba86195db, + 0xc97f458ed873c549, + 0xd5ca84bfe467d3b5, + 0x79a3c811f57ae423, + 0x7b31c4a3235be18f, + 0x64ba9df6536e21fb, + 0x8f9c4de87e623f59, + 0x5cbe6a998d364ec5, + 0xe894c35bac597d43, + 0x7839a41dc83a6b9f, + 0x51ab3e2dc74e8a1d, + 0x1938c641f641ca79, + 0x935c62d21743c8e5, + 0xf59b3a832547e863, + 0x3db97e176238e5bf, + 0x26ef145a925c163d, + 0x4fe512698e3f24a9, + 0x62b9348dce536417, + 0x5f2a7c6fed467283, + 0x4371fa9fea3871df, + 0xce82f432192a8f4d, + 0xcf9275d4362d8eb9, + 0x5df783276841cd27, + 0xda4329c98624ec93, + 0xab75e2198325d9ef, + 0xb3ef614dc2391a6d, + 0x261794ecbf1c28d9, + 0x91adfc3fed1f3947, + 0xa197b2e54e1267b3, + 0x19fdbe365d269731, + 0x827aed665b17948d, + 0xbf2ce957671ba3f9, + 0x65ce741ba81ec267, + 0x8a7c6d1cb742e1d3, + 0x81d7963dc625ef41, + 0x7f8c639fe3261f9d, + 0x289ad7c654293e1b, + 0x16aedf832efb3d87, + 0x58d123b54afd5be3, + 0xacdb1f987cf28b61, + 0xf95cb7a769f378bd, + 0xf39e41ddc7f6a83b, + 0x6f7c9b2ed4f9c6a7, + 0x12b5a6cfe4fcd715, + 0xd3ea958324dfe581, + 0x3b94da8765f314ed, + 0xd2a13e6981f7235b, + 0x15ceaf376fe942c7, + 0x6ce8b21a9dec7135, + 0x376ebf298acd6f91, + 0xb29d714ba8b17cfd, + 0x581d34b1f7e39d6b, + 0x6c75d48216e5abd7, + 0xc68df1b326e9db45, + 0xe861cf9654dce9b1, + 0xec45b92763bde82f, + 0xed46239ba1e3278b, + 0xdf13e8bbaec536f7, + 0x53ab8dedceda4675, + 0x5471ac61facb75d1, + 0xc4b382e21abd834f, + 0xa12b7e8548d192ab, + 0xd83ce74768d5c129, + 0x296d4a3874b6cf85, + 0x8394bf1874a8cde1, + 0xdc6a4919829aec5f, + 0x5cb936eba29f1dcb, + 0xbad5271fefb24c39, + 0x3b5c64a21fc64ba5, + 0x1c7d62e54ec97a13, + 0xdac9b2843cab687f, + 0x7a6f3e25479d86eb, + 0x45d1bceba8b1c659, + 0x246cda5cb7a3d4c5, + 0xc14b876ed6b8e543, + 0xa274e53ed3a8e29f, + 0xb2d15e7545ac231d, + 0xe3fa6b1652bf3179, + 0xbe7fd9c76e924fd5, + 0x7af6d4298da67e53, + 0x3bd4c9165b876caf, + 0x756fd42dc97a8b2d, + 0x6b84251ed56eab89, + 0x4bca753fe681c9f5, + 0x24ef95b216a4e973, + 0xf3c591b32385e6cf, + 0x79534187639a174d, + 0x3d61c2a8718d25b9, + 0xe762bc4bae9f4527, + 0x7d6b482dcea27493, + 0x3b62e7ddcb8572ef, + 0x281c6b51fb78916d, + 0x2c6573d2175a8fc9, + 0xa93b5f63286dbe37, + 0xde9c71f65671eda3, + 0x3f542d1a9685fc21, + 0x68c74fbba3861b7d, + 0x95d638edc1682ae9, + 0x12a589bdcf6d3a57, + 0xfdb15a7fed6f58c3, + 0xe38a5c932e739841, + 0x563efd932c64859d, + 0xbe8f5c254c68a51b, + 0xa27319d7695bc387, + 0xa824f71a976dc2e3, + 0xa93fd52dc783f261, + 0x46d52bafe47521bd, + 0xd2f4715fe1673f2b, + 0xcd54b7f3215a3e97, + 0xd4537b932e4b5cf3, + 0xc7b986465d4f6c71, + 0xbc9714276b4279cd, + 0x9f4176a98c35a94b, + 0xaf59428ed936c8b7, + 0x3ac5819fe74bd825, + 0x1beadc71f54de691, + 0x92c8fd44376215fd, + 0xbf563c798375246b, + 0xd35ec84a915843d7, + 0xde2871aa9f3b7245, + 0xf3e28d1a9e4d72b1, + 0x71b8c42a9a3d7e1f, + 0xc8ef64beda329e7b, + 0x1ac67d51f824ace7, + 0x275ad4921928dc65, + 0xb81e6c754639eac1, + 0xd47ce1a7652ce93f, + 0x96d2178ba541289b, + 0x537e18ddc2354819, + 0xb58ed16dcf194785, + 0xf752d41dcd2a76e1, + 0x648b7a9feb1c845f, + 0x15f7b8432a1f83cb, + 0x8db1ef376b14c239, + 0xc1fb82587926d1a5, + 0xf359b6d98627cef1, + 0x4a2d31998419ed6f, + 0x7a41f23a942c1edb, + 0x75a283cfe5213d49, + 0xe853f94edef24cb5, + 0xd72369c21ef67b23, + 0x1495eda32ce7698f, + 0x5c2b718439ea87fb, + 0xd831be7548feb769, + 0x6f1c8d5a98f1c6d5, + 0x4d53a96cb8f4e653, + 0x961a34ccb4d6e3af, + 0x267a3cdfe5fa142d, + 0x49786ec214fd3289, + 0x98cd2ba762de41f5, + 0x7aebd6365ed27f63, + 0x32f8a1b65ac46dbf, + 0xbefc84576ae78c3d, + 0x469f3eb876eb8ca9, + 0x2fc1b7dba6decb17, + 0x74ceb1d1f6d1ea83, + 0x4a857ed215b3e7df, + 0x6e19daf434e7185d, + 0x9ba3f8c653ea26c9, + 0x4c1357fa91ed4637, + 0x19ab7d698ecf65a3, + 0x32e176dcbed49521, + 0x2b86fa5febc5927d, + 0x17bd6951f8c7a1e9, + 0xe5c49a8218cabf47, + 0x1986fab3269dceb3, + 0xab9c2df767b2fd31, + 0x4ce9a23875b41c8d, + 0xa41537d983c62bf9, + 0x79218b5dc1da3b67, + 0x16f4893cbfac59d3, + 0x693facdfedbf7951, + 0x97c5fe321eb286ad, + 0x5e6f9ba43dc5a62b, + 0xfca419743ab8c497, + 0xb94f37e7679ac4f3, + 0x485de61a96ade371, + 0x3168dc4cb6a312cd, + 0x5c47f29fe5c6314b, + 0x239c48ffe1b63fa7, + 0xc26b149432ba6e15, + 0xf19a57443f9c6d81, + 0xb178d4243b7f6aed, + 0xb4aef2376d829a5b, + 0x7b913ef76a84b9c7, + 0xe168972dc7a8d935, + 0x1ce5ab7ed58be7a1, + 0xc387152ed48ce61f, + 0xd6e542b436a1257b, + 0x2ecfad1762a534e7, + 0x3e12fc4981b97365, + 0x39f87c476f8a73c1, + 0xb56847da9d7c813f, + 0xf456cbaa9a5e7f8b, + 0xde54781dc962adf7, + 0x9847cad1f984cd75, + 0xb6cda5332867ebd1, + 0x58c7fdb32569ea4f, + 0xca3b8616546e19ab, + 0x1dcf739cb5814a29, + 0x65dfeabdc1a34895, + 0xc254893cbe5867f1, + 0x7b18e6adcd4a856f, + 0x93746121fa5c84db, + 0xe2c584b21c6fb349, + 0xdf2a1b854a73d2b5, + 0xdb4a7f576a87e123, + 0xdc37ef298546de7f, + 0xdec6213984591feb, + 0xe2f3548cb36d2e59, + 0xab56134fe2714dc5, + 0x2a57f1cfef657c43, + 0xe76d3c921e356a9f, + 0xd8e54bf43e4a891d, + 0x185ca7354c3db879, + 0x8b3592a7693fb7e5, + 0x6291adecba52e763, + 0x4516d2cba735e4bf, + 0xa9c8456fe769153d, + 0x5eba1d61f45c23a9, + 0xe458a6b3246e5317, + 0xa4387e6a94627183, + 0xb8cae3965d236ecf, + 0x412a58c87c268e4d, + 0xc1fe28d76c278db9, + 0x6b2e4f1ba93dbc27, + 0x8e6d2a7dc72fdb93, + 0xa63285edc632d8ef, + 0x1a7ed5c32835196d, + 0x3657de15453827d9, + 0x5827ec4a952c3847, + 0x24ac8eda912e56b3, + 0xc385f29cbf429631, + 0xda215cecbe14938d, + 0x19527f3edc16a2f9, + 0xc61be841fb2ac167, + 0xed1538b3281abfc3, + 0x8713b2f6582fde41, + 0xf813ab4767231e9d, + 0xa721e8fa97263d1b, + 0x24ad165cb4193c87, + 0x67d432fdc21b5ae3, + 0x125dfa9cbefd7a61, + 0x3947d12dcaef67bd, + 0xfa6235b21df2a73b, + 0x859617f32bf4c5a7, + 0xe63a7d554af9d615, + 0x9753bd1767fbe481, + 0xd8a69fe875cbf2ed, + 0xf32de6adc7f1325b, + 0x2a19c75ed3f541c7, + 0x7c39b28ed1e86f25, + 0xeb49fd2432fa6e91, + 0x3a18cb532eca6bfd, + 0xc9d156243adf8c6b, + 0xc64b12d659e2bad7, + 0x29adc6f989e6da45, + 0x35e49bcba6d7e8b1, + 0x23e1974cb5cae72f, + 0x321645a1f4de168b, + 0xd3658e1326d135f7, + 0xc72e954982e36475, + 0x795cdf1762e874d1, + 0x537e92c76eca824f, + 0x3d5ea4976ecd81ab, + 0x28a6f41878beaf19, + 0x9a6274fed9b2ce85, + 0xd7c3aeb1f7a5dce1, + 0x52bcf49216a7eb5f, + 0x4b25e9f435d91acb, + 0x3f17459765ce2b39, + 0xf7d3ea4983d149a5, + 0x29ce863cb2d57913, + 0x41b8e75baeb5867f, + 0x3afe56bdcda985eb, + 0xc156db41fcadb459, + 0xb6c9d8a21a9fb3c5, + 0xdb15e7876ab5e243, + 0xb6d8731547a5e19f, + 0xa76b219987b9321d, + 0x643917a984ab2f69, + 0xfe854c3ba29c3ed5, + 0xa139bf2fe2b17d53, + 0x8a37cb5ede836baf, + 0xf32be5921f968a2d, + 0x745cd8b32e67ba89, + 0x81f695243a7cb8f5, + 0xa3ce1f665a9fd873, + 0xe41b5a2a9782e5cf, + 0xd12abe5dc8a7164d, + 0x2ab89c3fe5a824b9, + 0xc596b2d1f3ac5427, + 0xa4f5d9b214ae6293, + 0x8c9d6716539271ef, + 0xf5316d254e738f5d, + 0x91ad6e554d658ec9, + 0xfda954298c69bd37, + 0xd15bc4ea986bdca3, + 0x8e732d9dc87feb21, + 0xe5d81341f6831a7d, + 0x76f89a42167528e9, + 0x9e174dc3248a3957, + 0x8b492f37628b57c3, + 0x58e3627ba29e8741, + 0x2fb38dcbaf61849d, + 0xdb432aedce75a41b, + 0x784fc9bfed56c287, + 0xae57cd41fa69c1e3, + 0x83c596a3296bdf51, + 0x79d46b33264cfead, + 0x9acfd41768743e2b, + 0x789f61bba4653d97, + 0x5d29147ba2685bf3, + 0xafb27eced25c6b71, + 0x1d9538fbaf3e68cd, + 0x93d67541fe51a84b, + 0xbfc629521e43c6b7, + 0xc945d6b43c48d725, + 0x5bcf78a76b4ae591, + 0x8192d5c7674ae3fd, + 0x9f6ce21ba85f136b, + 0xb5e943adc86342d7, + 0x9cd5a21fe3687145, + 0x1a23bf8fe2486fa1, + 0x24c97fe4324a7d1f, + 0x27d81e443f2e8d7b, + 0x3f1cea465d31abe7, + 0x1ecd49298c23db65, + 0x41bd69298a36e9c1, + 0x8d6e419cb729e83f, + 0x542381ffe63d179b, + 0xa92fd63fe64f3719, + 0xa3ebf89219324685, + 0xd53a27e9843675e1, + 0xfe8943187129835f, + 0xb4ea2fd76f1a82cb, + 0x62e74c398d2eb139, + 0x5c78fd1bab21cf95, + 0x71cf543cb924cdf1, + 0x3e764abed815ec6f, + 0x8a5ec6f437281cdb, + 0x136847a6571d2c49, + 0x2a19edb8761f3ab5, + 0xc5d4638cb6147a23, + 0x7adef36cb214678f, + 0x4d1a2e5a9de586fb, + 0x59e1b87dcdfab569, + 0x54ac8f3fe9fcb4d5, + 0x879a6e421aefd453, + 0xead26cf548d3e2af, + 0xe49d35b769f7132d, + 0xaf21d64876fa3189, + 0xd457cfe984da3fe5, + 0xd7481feba2fd5e63, + 0xb931dc6ba2e16cbf, + 0x5af748edcfe48b3d, + 0xb35cfe421fe58ba9, + 0xb28591643de9ca17, + 0xd9581bf54aecd983, + 0x16ca7ed547aec6df, + 0x473ec8bba9e3175d, + 0xc64193fcb7e625c9, + 0x27e84f1ed6ea4537, + 0xa6279541f2ec64a3, + 0x18d2546435de8421, + 0xe9462d1653e2917d, + 0x3d9bf8154eb38fd9, + 0x81b37c965dc6be47, + 0x2a7d935769a8cdb3, + 0xb3712cda98abec31, + 0x236c4d7cb59efa8d, + 0xc3426d8fe6c32af9, + 0xa937e2f218d53a67, + 0x1f6ce79324c958d3, + 0x2a5b841763dc7851, + 0x2bdcf87761be75ad, + 0x4fabde798fc1a52b, + 0x2d38c4fbaeb4c397, + 0x462581eedba7c2f3, + 0xaed85b61f9bae271, + 0x5de97cb21679efbd, + 0x9c716d35479e1f3b, + 0xb41f97d656b23ea7, + 0x85e61bfa94b76d15, + 0x97fe365ba3b96c81, + 0x1cd7a96cb18a69ed, + 0x89b14fddcf7e895b, + 0xa62b5cd1fe91b8c7, + 0xcabe98721ea4d835, + 0x9d5e74243c97e6a1, + 0x837de6b54a89e51f, + 0x83cd4ef7689d147b, + 0xc67f281ba69f23e7, + 0x85fb1c7ed8b37265, + 0xf624519fe4a672c1, + 0xcab16efed1987e2f, + 0x8cd594f3216a7e8b, + 0x9d46ca132e5d9cf7, + 0xa3b8f2d54e81dc75, + 0x1ce357976b74ead1, + 0x362e5db98a76e94f, + 0x8c532b9ed76918ab, + 0xad568bffe67d3829, + 0x436a295fe48f3795, + 0xbd98fe53259376f1, + 0x41ae67f43295846f, + 0xaf4ce3d6516783db, + 0xc89635e87f6cb249, + 0x5e9c43d98d6ec1b5, + 0x718596ebab72df13, + 0xd1af459cb953ed7f, + 0x41c2ba71f8561deb, + 0x684a5eb2186a2d59, + 0xb8c96a73276d3bc5, + 0xedc41579857f6b43, + 0xbdc6f75ba352689f, + 0x72df8c6cb265981d, + 0x315e9d8dcf38b679, + 0xfe38a4ddcd3ab6e5, + 0x86e3da71fb4ed563, + 0x75d3fec32a51e3bf, + 0xc48adf265b76143d, + 0x14beafc76b5732a9, + 0x31ed594ba96b5217, + 0x26e9b53ba64c5f73, + 0x38dbe7aa923e5dcf, + 0x38f9214fe1528c4d, + 0x5bc2374fef248cb9, + 0x6ba53c221f38cb27, + 0x718beac54e2bda93, + 0xfc2a7585492bc7ef, + 0x2a473b5a9b42186d, + 0x9d2c348cba3426d9, + 0xc14753aeda293647, + 0x64afc83fe72a65b3, + 0x1936bd21f64d8531, + 0x654df9c2143f728d, + 0x2a9c3de76243a1f9, + 0x25db39476e14bf57, + 0x4df81b276d17bec3, + 0xeda942698b2aed41, + 0xdc271bf9871cfb9d, + 0x3ad5687fe9423c1b, + 0xce261781f9143b87, + 0x89cda1f3281759e3, + 0x13f82cd5452b7961, + 0x7ea39686531c76bd, + 0xce7a4b59821f963b, + 0xc429e6b98ef1c4a7, + 0x213bfd7bacf6d415, + 0x32b1e57dcbf7e381, + 0x167f932cb7c8f1ed, + 0xdc9a786439fd215b, + 0xd79eca8436de2fb7, + 0x8b613ac878f36e25, + 0xa736421984f56d91, + 0xd5b4691982e76afd, + 0x21aefb6a91fc8a6b, + 0xfe965b498fcea9d7, + 0x51496eb1fce1d945, + 0x7e5168f32cd4e7b1, + 0xcd7b61943ac7e62f, + 0x6579eb1549ea158b, + 0xa31be49768dc24f7, + 0x2ce894fba8df4375, + 0x8cea394cb6e473d1, + 0x5fb7e34dc3d6814f, + 0x56b8fc7fe1d67f9b, + 0x9de2874432dbae19, + 0x51f734c32faebd85, + 0xdf2be8365ca2dbe1, + 0xf7d4c89769b3ea5f, + 0x2583a4e878d619cb, + 0xfe87d49dc7db2a39, + 0x25fca86fe6cd38a5, + 0x62a9dc4fe5cf6813, + 0x2349d56214c2857f, + 0x895f612432c584eb, + 0x23bf8c7761d8b359, + 0xca3fd4876f9ab2c5, + 0xbce742398caed143, + 0x4afc89587a91de8f, + 0x9a17586dc8941efb, + 0x4ac16b51f8b72e69, + 0xbd89635217a93cd5, + 0x946adc8327ad6c53, + 0x9df351b5438e59af, + 0x854acdb874b3892d, + 0xe718c5bba1c4b789, + 0x34198edbae98b7f5, + 0x4e3ad98dce9bd673, + 0x3a9f742fe97bd4cf, + 0xf2d8b1643ca2154d, + 0xe59218f54ca523b9, + 0x439ed5f76ab95327, + 0x9d3612e987ab6193, + 0x6534f1e9837a5edf, + 0x639bf72ba28f7e5d, + 0xd1369a5fe1728dc9, + 0xc369f1dfef85bc37, + 0xbd86a5c21f67dba3, + 0x3d9e57b54d7bea21, + 0x45cdeab43a5cf87d, + 0x57a4e1876b8127e9, + 0x98b6ae5dcba43857, + 0x2685937ed79856c3, + 0x957fc21fe59b8641, + 0xb5729d11f26c739d, + 0xd7364b13247f931b, + 0x38c9ef165293c187, + 0xe69ab8354e65bfd3, + 0xb8f14d687c68de51, + 0x1f2358e76948fcad, + 0x8e394fdba96e1d2b, + 0xbdcf4a5fea613c97, + 0x452a96ffe8745af3, + 0x93547fc329586a71, + 0x971dbc43234967cd, + 0xcb2fea47625d974b, + 0x2df53769814fa5b7, + 0x435f92ebaf73d625, + 0xfe76a91cbd56e491, + 0x4a2ce63cba47e2fd, + 0xb5694d81fa5c126b, + 0x15836af32a5e31d7, + 0xefb986a54a716f35, + 0xfa38e61878546ea1, + 0xa173fd4a95467c1f, + 0x694f7c5ba2398c7b, + 0x42a1e7fcb13c9ae7, + 0x63ac421cbe2fca65, + 0x3164b7c1fd43e8c1, + 0x6db38ac21c25e73f, + 0xbfad79554d38169b, + 0xacd126b87b4c3619, + 0xd7a18b2a9a2e3485, + 0xc57498fcb95274e1, + 0x6a8e5b1dc734825f, + 0x4c26819fe43681cb, + 0x4531c62fe138af29, + 0xa2748e14312cbe95, + 0x785e91f54d2ebcf1, + 0x9fd13ba65c12eb6f, + 0x6a1f29887c251adb, + 0x15b9e8cbac182b49, + 0x357ba21ed81c39b5, + 0xae7964fed81e6923, + 0x8ad3f41fe521768f, + 0x46bcd353261385fb, + 0xd98fbe465317b469, + 0xf5ca9e187219b3d5, + 0x195f6db87efbd253, + 0xac7495e769ecd1af, + 0x9216e47babf4312d, + 0x4abd2efdcae42f79, + 0xae4b29fdc8f73de5, + 0xf27d5a3218fa5d63, + 0xf4e7396324ec5abf, + 0x1a6fd89654ef7a3d, + 0x897ef42763f2b8a9, + 0xfc168e3ba2f5c917, + 0x86729fcbafe9d783, + 0xbfc5d6498ab9c5df, + 0x651b783fe9bcf45d, + 0x892fcd543be124c9, + 0xe61a53432be65437, + 0x2e9834f659e862a3, + 0xb2ea465a97eb8321, + 0x1a264c3983cb7f6d, + 0x3471deb982bf7ed9, + 0x6d9fa21dc1e2bd47, + 0x173ac65fefa5dcb3, + 0xd86be3932fc8eb31, + 0x9c4e76d32cbaf98d, + 0x126ab7e54abd18f9, + 0xf73429198bd13967, + 0x13dc28bba9c457d3, + 0xdf3e685dc6d98751, + 0x71b23dafe3c974ad, + 0x8ca5e2d1f3cd942b, + 0xf8b2567213cfb297, + 0x81379fb762b4c1f3, + 0x5f9d3ea54ea5df61, + 0x86e19cf54a86febd, + 0x2634d5a87c9a1e3b, + 0xc261af7cb89e2da7, + 0x1275dacfe9b26c15, + 0xc64951b1f7c46b81, + 0xcfb5348214a568ed, + 0x69b34ec323ca985b, + 0xd97f6ca5429da6c7, + 0xc71a46b981afc735, + 0x79e31c498f93e5a1, + 0xe87b2d6bac96e41f, + 0x86917a2feda9137b, + 0x54b271d1fa9b32e7, + 0xab4d81932bae4165, + 0x9562c31548926fb1, + 0x19387ef656947d2f, + 0x4a95e3d763957d8b, + 0x92648e3ba2689bf7, + 0xc84fd51ba18dcb75, + 0x478fe1bbae6fc9d1, + 0x4298ce5edc72e84f, + 0xfbe8a9432e8517ab, + 0xa29563e54d8a3729, + 0xbaf685754b8c3695, + 0x815bcd68798d65f1, + 0xfd12c7ecb791836f, + 0xda5164edc57482db, + 0x257693afe387b149, + 0xf932c1afe168bfa5, + 0xfa5b8235427bce13, + 0xb459ac332b4edc7f, + 0x69ce37865d631ceb, + 0x9c5b17e98d762c59, + 0xd258c41a9b683ac5, + 0xf8257a9ed97c6a43, + 0x1afbd78dc64d579f, + 0x632bd9e1f562971d, + 0x9452f7b21463b579, + 0x5b2694d43267b4e5, + 0xbc2d5139817ad463, + 0xd2e3cfb76e4ad2bf, + 0x15e7af498b5ef13d, + 0x82dfa97dcd6431a9, + 0x2fa6754dca463ef5, + 0xc1239d61fa495e73, + 0x6a42c87217395bcf, + 0xef9863c3263e7b4d, + 0x3f8957e765418ab9, + 0x3bad458a9354ca27, + 0x9fc2567cb146d893, + 0x7a2c6d1a9d28c6ef, + 0x4f7b29dbac2bf56d, + 0xdb49fc7feb3f15d9, + 0x5c4837921d623547, + 0x826df4365c2764b3, + 0x9563d2f87b5a8431, + 0x85b216da963b718d, + 0x1d4b7f69842c7fe9, + 0x124f763dc431be57, + 0x8149d2bfe124bdc3, + 0xbe45182edf27ec41, + 0x3bd91a532e17fa9d, + 0xad82c1e65e3d2a1b, + 0xe9c376b65c1f2a87, + 0xc852e7fa9b1258e3, + 0x14bda62dcb257861, + 0x6d4e29bdc61875bd, + 0x46935fafe61c953b, + 0xba123c81f41eb3a7, + 0xc42379f76742d315, + 0x692bda187435e281, + 0xc6f1bd843ab4efcd, + 0xe5a3c7876ce81f4b, + 0xb13ed7f769fa2eb7, + 0x2b9143fba9fe4d25, + 0x2baf567ed8f26c91, + 0xfe162b9dc5e369fd, + 0xe379c48214f5896b, + 0xba1475f323f9a8d7, + 0xfc5138a762fdc845, + 0xe163d58872efd6b1, + 0x4e97a3f98dc3e52f, + 0xb358dcebade6148b, + 0x3f574dedcbd923f7, + 0x3b9a4261faec4275, + 0x68f42c9439ce62d1, + 0xc2dba35548c17e3f, + 0xedb2376545d37e9b, + 0xa3d1bf2874e6ad19, + 0x53e829b872e9bc85, + 0x4c179b3982dbcae1, + 0xb1ae73d98caed95f, + 0x8267dcb1fed318cb, + 0x6e2cb8d21ed62839, + 0xb1cae7432cd937a5, + 0x9febd1865adc6713, + 0xedca47b658bd647f, + 0xe483d6ca96c183eb, + 0xfb9513ddc6d4b259, + 0xbc53782fe3d7b1c5, + 0x7145ac6fe1b9cf23, + 0x98c571b3219acd8f, + 0x469e5cf32a7decfb, + 0x8bad91465eb32d69, + 0x6319b4f87ca63bd5, + 0xfe95dac98ac96b53, + 0x6b4d1afdc69b58af, + 0x24983e1dc5ae782d, + 0xdab192e1f4c1b689, + 0x89d3564214a3b6f5, + 0xfe5b291542b8d573, + 0x4c7de3b65198d3cf, + 0xb5e392c76e8bf24d, + 0x4facb2d87d8f12b9, + 0xfa43b15dcdb45127, + 0x4f36a25edba65f83, + 0x13df472fe6875cdf, + 0x7d56f3c2168a7c5d, + 0xd75f1c93246e7bc9, + 0x79a8c5176591cb37, + 0xf9c318687284d9a3, + 0x921f5d7cb3a7e921, + 0xd1feb38bae59f67d, + 0x7ae1538cbd7c16e9, + 0x7a4f59bfec9f2657, + 0x586b9ed21d9265c3, + 0xf5eb8ca43ca78541, + 0xc153bf254a68729d, + 0xf7d62e99867c921b, + 0xb576d48a935daf67, + 0xe83b426ba471bed3, + 0xbed56a4dc284ed51, + 0x73bf465dce45fbad, + 0xa2758c943f691c2b, + 0xf9b651743e5d2b97, + 0x81db3f465b6e49f3, + 0xe4cb532bac836971, + 0xf8d4691ba95476cd, + 0x7682ea9ed758964b, + 0xa9143c8fe35ca4b7, + 0xd6b47ce1f37ec425, + 0x9e3c5f854572e391, + 0x7ebd13965264e1fd, + 0xd2a4e5187f58216b, + 0xf8bc71276d492fc7, + 0x4f2d8a5a9b6c4e35, + 0xacd4517cb94f5da1, + 0xe5723f9ed9537b1f, + 0x286e7ab1f6348a7b, + 0x39cde7f21536a9e7, + 0xbf479313243bc965, + 0x532179c7634ed7c1, + 0x24bfed6a9251e63f, + 0xb3c4925baf34159b, + 0x3b6e941dce483519, + 0x71d3295fed2b4385, + 0x84271ce1fa4c63e1, + 0x34b8cf132a3e715f, + 0xcbf6931548327fab, + 0xe89573c76735ae29, + 0xe75a4df98427bd95, + 0xb6a521398439cbf1, + 0xb8251c4a912cda6f, + 0x7e4a39ddcf3219db, + 0x53c914a1fe152a49, + 0xb813f4a32e1738b5, + 0xdb84ecf65d1b6823, + 0x61b532854a1c658f, + 0x5714cbe7681e74fb, + 0x72a69d8dc812b369, + 0xedb1af3dc716b2d5, + 0x52ab184fe629d153, + 0x8a2bf7ced218ce9f, + 0x2fe3d8c5432bfe1d, + 0x9fe1d8743cdf1e79, + 0x2571e3f76bf23ce5, + 0x19fe6cb98bf75c63, + 0xfb18c7a768e759bf, + 0x39b81fdba6fb793d, + 0x2af8513dc4fe87a9, + 0xa84176cfe5f2c817, + 0xe38d2a6215f4d683, + 0x79642f5432e6c4df, + 0x8bd97c5761e9f35d, + 0xcadb14976fed13c9, + 0x51dae7ca9cdf4237, + 0xca5781dcbce461a3, + 0x9825cfeba8b45def, + 0x7235a6b1f5c87e6d, + 0xdfbe274215ea7cd9, + 0x3a6718c325deac47, + 0xa5ecf73765e1dab3, + 0xd6f1495984d5ea31, + 0xa816befa91c5f78d, + 0xe3cf97b98eca17f9, + 0xa619f53cbecd2867, + 0xb5c283dfeabf46d3, + 0x345afe632cd38651, + 0xb8d1ecf329c573ad, + 0x378c4ef657d8932b, + 0x72184ce765dcb197, + 0x9523fc48749cafe3, + 0xb86c5d7ba4b2de61, + 0x8f6e592ba193fcbd, + 0x13d46b5fefa71d3b, + 0x679a35f21fb92ca7, + 0xd4fc19e43ead4b15, + 0x963a7ce54cbf5a81, + 0xfb619d7659a267ed, + 0x8cd3e67ba8c4975b, + 0x1c9835aed4b8a5c7, + 0x9bc6f17fe4abc635, + 0x18e5c231f39ed4a1, + 0x53bce86545a2e31f, + 0x75fe2cd763c5127b, + 0x6adb93f65fa831e7, + 0xab925d687d9a3f45, + 0x6bc8ad987a8c5eb1, + 0xc9ebd45ba98e6c2f, + 0x684ad97fe6927c8b, + 0x8f4da93fe5849af7, + 0xafe38d921498ca75, + 0xfc4ae194347ac8d1, + 0xacdb8276528cd74f, + 0x79db64f9839216ab, + 0xd9528fecbfa53629, + 0xa1dbfe5dcea83495, + 0xf5e4c96edc8a64f1, + 0xcbf3578fea8c726f, + 0x78f643c3296f71db, + 0xbf9ae8554872af39, + 0x9da457b43674bea5, + 0x1a24bc7a9578cd13, + 0xcd463f998259db7f, + 0x96b23c49815cf9eb, + 0xc64179bedf712b59, + 0x5c6b3e21fe7439c5, + 0x643df9a21e786943, + 0x93e8adc32c4a569f, + 0xb7321cf54a5c861d, + 0x183ef5b7685fa479, + 0x29d6814ba872b3e5, + 0x4bd9a51dc587d263, + 0x3d47f68dc357d1bf, + 0x74ef932dc159ef2d, + 0x6d28ae44325d1f89, + 0x7ef6b3554e613df5, + 0xd36ea4c98e645d73, + 0x25b813c87b365acf, + 0x7b23a6f98b397a4d, + 0xa7fe821dc63d78b9, + 0x24f6ca9ed64fb927, + 0x56ac4b91f652d793, + 0xe936fcb21634c5ef, + 0x863ead965238f46d, + 0x341ab6d8725b14d9, + 0xe27fd5ba9f5e2347, + 0x68b4c17bae5162b3, + 0x1db3254dcd568231, + 0xeb287addca256f7d, + 0x3628dac1f6287de9, + 0x5634d2b2182cad57, + 0xcb712d55462fabc3, + 0xfe135dc98753eb41, + 0xc5da98b87324f89d, + 0x98e531bdc348291b, + 0x1a62ed3cbf1c2987, + 0x3af8724cbc1d47e3, + 0x814eb631fd328761, + 0x86b9c1432c1374bd, + 0xc7b189f65c17943b, + 0xf9cb13265819b2a7, + 0x45ade71a983dc215, + 0x463db81a952ecf71, + 0xb6c38e5a9412fecd, + 0x1658f7eed3261e4b, + 0xa28451ddcef62db7, + 0xedb625721efa4c25, + 0xe5941f643cfd5b91, + 0x768acbd439ce58fd, + 0x4e83f1d65af2986b, + 0x57a1b3fa98f4a6d7, + 0xf758319cb6f9c745, + 0x8b1da59dc4fad5b1, + 0x2d957a4cb3ecd42f, + 0xfb7513c545f2138b, + 0x53af412761e532f7, + 0x34fe17276fe94175, + 0xb327f1e76bd95fc1, + 0x28593cb879cb6d3f, + 0xd734b51987cf6d9b, + 0x8f74b61ed7e3ac19, + 0x7ec936b1f6e4cb85, + 0x3fea19d325d7c9e1, + 0x3ad71b6323cad85f, + 0x83b5dc2542adf6cb, + 0x8f761d4ba4e12739, + 0xc7ebd24a9fd436a5, + 0xe8f1a79cbed97613, + 0x41c9387edbca637f, + 0x14b582c1f8ac72eb, + 0x95fd47a328cfa159, + 0xc85ab24437c2afb5, + 0xbe6c824657b6ce23, + 0xc4a8e63653a6dc8f, + 0x37d92e876298eafb, + 0xcdb7821ba2be1c69, + 0xa149563dcfb13ad5, + 0xcd6a3571fec46a53, + 0x62cd4a721db657af, + 0x296ce7443cba872d, + 0xd1f7962437bda589, + 0x34952ac7679ea4f5, + 0xf592478ba8b2d473, + 0x9d1be65ba495d2cf, + 0x39a6428dc3a8f14d, + 0xbe85dc71f3ac21b9, + 0xa76d89e542ad3f17, + 0xe51afd954fa15e83, + 0xfb56a9354c835bdf, + 0xf23159854c967b5d, + 0x13aebf865b687ac9, + 0x9257bf8dc68dba37, + 0x9f648c3ed57fc8a3, + 0x1ba4c951f6a4e821, + 0xb38e76f21394f57d, + 0x5ca6d73543a815e9, + 0x62fe9a5981ac2457, + 0xefd943c87f8e54c3, + 0x13c2789cbea28341, + 0x329154fcbc84719d, + 0x586b4d9dca657ef9, + 0xb78d4211f859ae67, + 0x78364ab2176bacd3, + 0x8ce5f9d4367fdc51, + 0xa4738fe65462f9ad, + 0xef5c641a94861a2b, + 0x57db4f2dc1682a97, + 0xf281e53bae6b48f3, + 0x97fd568dcd6e5871, + 0xdb415ec1fb6175cd, + 0x2485fe321d73954b, + 0x47d1f9332c56a3b7, + 0x3ef57927697ac325, + 0x54372d99876cd291, + 0xc5b612a8734cbfed, + 0xa653db8dc4731f5b, + 0x96b8a21ed1652ec7, + 0x47d1a83fef694d35, + 0xb541d9732f4b5ca1, + 0x4b81d6e43c4d6a1f, + 0xbd2674165d41897b, + 0xa2e958476b43a8e7, + 0x475d829cba37c865, + 0xeac7192cb749d6c1, + 0x6f24b1edc64bd53f, + 0x4ae1cf6ed24ef39b, + 0x6a473f5326753419, + 0x415d378a91674285, + 0x9562f3b87f4962e1, + 0x31cbd8487c2a6e4f, + 0x2ead8948792d6eab, + 0xe8d42a6dcb41ad29, + 0x6fa71c9fe823bc95, + 0x5264bc1fe736caf1, + 0x75adcfb21528d96f, + 0xe61248b4342af7db, + 0x26ba89c8753f1849, + 0xc38d4e5ba14237b5, + 0x9154cd7cbf186723, + 0x5f2a471cbd19648f, + 0x274513bedc1a73fb, + 0xc43b6571fb1ea269, + 0x7dcbe8154a32b1d5, + 0x21da5f776915cf43, + 0xade5f1854615cd9f, + 0x3c8195f87528fc1d, + 0x6c439dbba42c1d79, + 0x42db3c7ba31f2be5, + 0xa27fd58dcef15b63, + 0xe598ab4edce358bf, + 0xb5f328c21cf6783d, + 0x784c9f632cfb86a9, + 0x921a68f549fdb617, + 0x52c7da8767efc583, + 0xf1bd529986e2c3df, + 0xd4c7f38ba4e6f25d, + 0xa6713f4ed4f812c9, + 0xa4f912dfe2fc4137, + 0x178cfe4321ed4f93, + 0xf9ebd1243db15cef, + 0xda7e93154be37c6d, + 0x3fc682754ae57bd9, + 0xd4ae537768e9ab47, + 0x421b36d986edc9b3, + 0xd9fe73ccb6cfd931, + 0xf918db5fe4c2f68d, + 0x3869de4324d516f9, + 0x96fd81e543ea2567, + 0xadb9285871eb45d3, + 0xfa4652198fce7451, + 0xacf591d98ec172ad, + 0x4d32be5bacd5912b, + 0x4b57f89ed9c5af87, + 0xca274d61f6b8ade3, + 0xb15cd68327abcd61, + 0xd931c5f3248feabd, + 0x531ba48876d41c3b, + 0x1bcda4e983d52ba7, + 0x4d739fecb2d94a15, + 0xf6432cbbafbc5981, + 0xbf4853cbab9c56ed, + 0xb92a8d31fdc1965b, + 0x9658b7a21db3a4c7, + 0x43698ef32ab8c435, + 0xde1a72f657b9d3a1, + 0xb89ce318769bd21f, + 0xd68915e8738def6b, + 0xd756a18cb4a32fd7, + 0x19b542fed1b73e45, + 0x59c1b2afef985db1, + 0x427f89b21e8a6b2f, + 0xa3fb74532d7e6a8b, + 0xa8fbecd54c81a9f7, + 0x49d1a8f76ba3c975, + 0x7f645c3ba896c7d1, + 0xf2e37d6cb589d64f, + 0x93ab1cfed37cf4ab, + 0xd91b27cfe4af1529, + 0x78ce9d5216b24395, + 0x4d7b182652a763f1, + 0x671893c54e89716f, + 0xea682c354d596fcb, + 0x936abd887b6d8e39, + 0x168db25dc971bda5, + 0x37cd814fe985dc13, + 0x6a94d28fe465da7f, + 0x5476b8e21457f8eb, + 0xd9641f24347d1a59, + 0xe5f92ac7637f28c5, + 0x425ca3dcb1a26843, + 0x83ed6f1bae74659f, + 0xef31a76cbe69851d, + 0xa2b59f4fed5ca379, + 0x46829c31f96da2e5, + 0x53ace1d54b82d163, + 0x1d5fc7a32753ceaf, + 0xab63d2e54756fe2d, + 0xa9cd4838745a1e89, + 0xce53ad2a936b2cf5, + 0x9c6f847cb16f4c73, + 0x5df1624cbe4259cf, + 0x3b81e9c1fe35794d, + 0xd654ab821e3687b9, + 0xbe87d5a43d4cb827, + 0xa473fe165a4ec693, + 0xd6efcb187851c4ef, + 0x943bfe1ba854f36d, + 0x2af8134dc65713d9, + 0x13f47c6fe56b3247, + 0x85ce1361f26d51b3, + 0x81cb2375435e6f21, + 0xd8c7b1f54f326e7d, + 0x47ebaf165d247ce9, + 0xb27f49e76d28ac57, + 0xe65c41f87829bac3, + 0xe4172afcb83eda41, + 0x3d84916dc631f79d, + 0x75c413a1f745281b, + 0x352bd96215392687, + 0x3f854ec8752a46e3, + 0xd26185fa923d7561, + 0xe4d58ac87e1f63bd, + 0xbef5243bae14923b, + 0x27db481dcd25b1a7, + 0xae3f287dc917aef3, + 0xe235a811f82ace71, + 0x81bf9d43261aebcd, + 0xa7b39e2768321d4b, + 0x39fca57986142cb7, + 0x6fd4918ba6184b25, + 0x71a5328dc32b5a91, + 0xebf6a4998cea57fd, + 0xed85b7fbacfe876b, + 0x6a9c523febf1a5d7, + 0x5c2a6e321bf3c645, + 0xe81b2a7439f7d4b1, + 0x84327fe657e9d32f, + 0xba5f793765ecf18b, + 0x1ca5487a95de21f7, + 0x248af79cb4e23f65, + 0xed63af5cb2f65ec1, + 0x751496fcbed86c3f, + 0xe8b273421fea6c9b, + 0xc482af943cde8b19, + 0x8d91bce54be1ca85, + 0xae95723769d4c8e1, + 0xa4ec538a98c6d75f, + 0x8623a7fa94d8f5cb, + 0x7bd863adc5ed1639, + 0xa4b3926fe3df24a5, + 0xcf936ae326e47513, + 0x6ad1e7c541d5627f, + 0x6583cde54fc871eb, + 0xa7d8cf665dcb8f49, + 0xb745831768ad9eb5, + 0x4529e38ba9b1cd23, + 0xb2561d8dc6a3db8f, + 0x589bf31ed4a5e9fb, + 0xcf5bad4325da1b69, + 0x4df8765434bc29d5, + 0xf8c4a53872cf4953, + 0x7d9ceb2981c256af, + 0x46d8ce2a9fb5862d, + 0x92a678fcbec7a489, + 0x437e812edc9ba3f5, + 0x7a2ce5d1f9aec273, + 0x9b8e5c443892d1cf, + 0x3ad17f432794ef3d, + 0x5ecf68a545b61fa9, + 0xd9b1c6f985ba3e17, + 0x4adf2eba92ac4d83, + 0x23e1a45a918e4adf, + 0x4f97b26dcf927a5d, + 0x674ae291fea478c9, + 0x456d72f21ea8b937, + 0xea5d46332d8bc7a3, + 0xb2614df65a9ed721, + 0x3d2974b76891f47d, + 0xa8fce41cb7a514e9, + 0x7e45bc8ed6b92357, + 0x8fb74c5fe49a52c3, + 0xb7246581f3ad7241, + 0x7b98ac53217e5f8d, + 0xd6f754843e627df9, + 0x46ecd7f43e84ad67, + 0xfbed68465c67abd3, + 0xfa945e29897adb51, + 0x61735daa965ce8ad, + 0x3c1b865fe783192b, + 0x25ae1891f5a42897, + 0xa7bd54f2159847f3, + 0xa2db8c35439b5671, + 0xfb8639e6517b64cd, + 0xa8b342f87e6f834b, + 0x61af82da9e63a2b7, + 0xf96e4c1cbd87c125, + 0x74ceb18eda57cf81, + 0xc2eb78d1f648bced, + 0x67345a82174cfd5b, + 0x8f75dba548612dc7, + 0x53f726da97864c35, + 0xaed5c43a93675ba1, + 0x52c6fe9cb25a691f, + 0xf8376ecbaf3d687b, + 0x354fce8cbc3f96e7, + 0xb2197ac1fd42c765, + 0x81dbc3732b46d5c1, + 0xc6f3e1732a58d43f, + 0xa46c92d6574af29b, + 0x581924fba86e2319, + 0xe943562dc9724185, + 0x691f753cb3645fd1, + 0x82751badc1376d4f, + 0xd9b5fa8fef286dab, + 0xabd27e521f3d8c29, + 0x8abe96d43d2fab95, + 0x42fb7a876b43c9f1, + 0x135d2af87a24d86f, + 0xbe6724da9827f6db, + 0x43caef2ed83c1749, + 0x6b19afeed73e26b5, + 0xcad83171f8517623, + 0x2cab35f21524638f, + 0xe1874da6513672fb, + 0xafde2c765f2ba169, + 0x7b14f9e76d1b9fc5, + 0x759e41398a1fbe43, + 0x5c9287bba812dc9f, + 0xbf1e49adc825fb1d, + 0x8749c5a1f6281c79, + 0xbaf149e4371b2ae5, + 0xcd12ab76571e4a63, + 0x6314fc99842157bf, + 0x7b289fcba214873d, + 0x8cd1be387ef485a9, + 0x15e7f23badf9b517, + 0x2a76efcedafbc483, + 0x8fe1b25ba7ecb2df, + 0xb7fc2d9439e2f15d, + 0x8ab1e36548f521c9, + 0x14bd23f656e83f27, + 0xad5b91f875fa4e93, + 0xe964bd3872da4bef, + 0x234adc1a91ef5b6d, + 0x9d82a5fcbfe27ad9, + 0x1c784de1fde5ba47, + 0x4839adf21de7c8b3, + 0x1f628ac54aebd831, + 0x4a5ec1d437bce58d, + 0xc2d6f19878d215f9, + 0x5634c2ecb9e52467, + 0xfa49c27cb6e854d3, + 0xb134ae8ed4eb7351, + 0xc8d79a51f2ec61ad, + 0x9176ef8432ce7f1b, + 0x28b156c43fc2ae87, + 0xb36572a54db5ace3, + 0xc4ed78265ab8dc61, + 0x1cfe7a3656a8e9bd, + 0x91b45f3986adf93b, + 0x32d58cffe6d129a7, + 0x85c23ad1f7d64915, + 0x8b7641d324d95781, + 0x2e6c98d432b965ed, + 0x85e12ac761cd845b, + 0xa18b93e65eaf93c7, + 0xfe1dc8ba9eb4c235, + 0x85b21f4a9cb6d2a1, + 0x25791cbba786befd, + 0xa871f92ed589fe6b, + 0xf9745ac3269c1ed7, + 0x32fead9768b13d45, + 0xb24f136876a45cb1, + 0xbf32ed4983b76a2f, + 0x5312b9c871ca698b, + 0x75394c1bae6c98f7, + 0x92367eddcd9fb875, + 0xc2986751fb93c6d1, + 0x9b43a8f21b96d54f, + 0x53ca47932987f3ab, + 0x1b3aec2768ac1429, + 0x6729baf987ae3295, + 0xd947352cb7a362f1, + 0x7a158fecb2936e5f, + 0xe359164ed1856ecb, + 0x63945d1fef6a8d39, + 0xae583d621f6d9ca5, + 0xf12b5d354d7fcb13, + 0x32e18c554b62d97f, + 0xe3fdcb465964f7eb, + 0x32ab574dcb7a1859, + 0x76843eaed68b27c5, + 0xa276ef5ed69e5743, + 0xf19a357fe381649f, + 0xe9586af32395841d, + 0x57fe91c54186a279, + 0xefd789354f69a1e5, + 0x5a481ce87d6cbf53, + 0x39bf28e7684ebdaf, + 0xd1c4f6bba963fc2d, + 0x5846ac1fea651d89, + 0x3da7518fe7682bf5, + 0xad4fe682186c4b73, + 0xcd3986b3235d48cf, + 0xebf6712a9361784d, + 0xdcf7865ba15386b9, + 0x39cb7e5baf48b627, + 0xa713d6ecbe4ac593, + 0x72635dedc94ab3ef, + 0xf5d684edc94fe26d, + 0x9dfe15a43b6412d9, + 0x87b341665b683147, + 0xe3d4975767584fa3, + 0x5fdab2ca975b6e21, + 0xf26b1d7a923e5c7d, + 0xad1658bdc2417be9, + 0x1b538c9edf23ab57, + 0x49b75321fe26b9c3, + 0x361cbe732e3ad941, + 0xb7a28dc43a2be69d, + 0xcf68a2b6593ef61b, + 0xc7bd589bab432587, + 0xf5462e8cb92745e3, + 0x2bf6458ed83a7461, + 0xa92c47dfe43a62bd, + 0x936457c1f24e813b, + 0x2ea835f54231af97, + 0x819b3d265e14adf3, + 0xf276a8365e26cd71, + 0xce987df65917eacd, + 0x64dfb8a8781cfa4b, + 0xf4e579bdc82f1ab7, + 0x3df4a76fe9134a25, + 0xa89b1431f7265891, + 0x95acd843241856fd, + 0x19ace3f5431c856b, + 0x4f53a9e7621e94d7, + 0xb2ae38187defb345, + 0xd56b72c98cf4d3b1, + 0x7fd342ea9ae6d12f, + 0xc52694eba8d6ef7b, + 0xe3254f9dc6da1fe7, + 0x7cb93e6218fd2e65, + 0x1be98a7547f25dc1, + 0x8ea53f1875e46b3f, + 0xce38dab872f56a9b, + 0xc8b1396872fb8a19, + 0xb3162ed87fedb985, + 0xf37a64ca9acfb7e1, + 0x46fb8cafeac2d65f, + 0xf48725b219d5f4cb, + 0x95ca82f54bea1539, + 0xadb597c768ec23a5, + 0xfd14b5ea98de6413, + 0xbe287c6ba5d2617f, + 0x78bd1e4a92c36fdb, + 0x2d5ef94dc1d68e49, + 0x1d37958fefc89db5, + 0x76ac4f321fadbc23, + 0x1b9da4532b9eca8f, + 0xe58bd2a549a2e8fb, + 0x14edfb687bd51a69, + 0x214e59dba7c928d5, + 0x796341fcb7dc4853, + 0x2db7481dc3bd45af, + 0x25843a91f4c1852d, + 0x7fc389d212d4a389, + 0x3c56bf2541c7a2f5, + 0x6d42f9e65fbac173, + 0xf39eb1754c79aebf, + 0x8bd7f417698fce3d, + 0x1fb645ddc8b31ea9, + 0x184fc7afe9b63d17, + 0x235bc9e1f6b94c83, + 0xf93a4272158a49df, + 0x41b9736323ae695d, + 0xe8f9db1653b187c9, + 0xb842ea1a91c4b837, + 0xea5df1798f97c6a3, + 0xfd6c718cbe9ad621, + 0xa28ed53dca8be37d, + 0x731f452dc87df2e9, + 0xcb659de21cb43257, + 0xa5f1367549a751c3, + 0x7b9cdae657a96f31, + 0x4f32ae77637a5e8d, + 0xc9d6f149827d6cf9, + 0xa321498ed291ac67, + 0xa8d7e63dcf74bad3, + 0xda73c821fe87da51, + 0xf539b7221c58e7ad, + 0xc5817fd43a6cf72b, + 0x682715354b8f1697, + 0xba2f61c98a9246f3, + 0xef41a83dc9a86571, + 0xd2fa693cb47863cd, + 0x6132485fe37c824b, + 0xdc8abe51f26e91b7, + 0xf658b3a54382bf15, + 0x9f4ac5843f64ce81, + 0x2c4af9d43a45cbed, + 0x27f45bc76a48fc5b, + 0x5694aed9895d1bc7, + 0x378b641dc97f2b35, + 0x541d63cfe87359a1, + 0xd7c89b3fe475681f, + 0x2b583ea21349867b, + 0x64d257e4324b95e7, + 0xb2136e79817eb465, + 0x9576e4d98f62d4c1, + 0xcd7841ba9c65d23f, + 0x719e2f5bac46f19b, + 0x315a4b9fec6b3219, + 0x68429adfe94c2f75, + 0x1d6a4f73285f4ed1, + 0xba946c5438526c4f, + 0x61bd9ef875346cab, + 0x419b875ba3478b29, + 0x15a2b739813cba95, + 0x8f13ba4a9e3db8f1, + 0x7a93546cbc31d76f, + 0x5fb8c2afea23f5db, + 0xbad94e332d381649, + 0x47a5ebf76c3a24b5, + 0xc5dfa3b98a4d6523, + 0x1c42afda973e528f, + 0x87e6d9bba64371fb, + 0xa3b9ed6dc3248f59, + 0x436ab2fed1279ec5, + 0x9c51af8fef1abd43, + 0xba39f4632e1dcb9f, + 0xe8ab67d65c32fa1d, + 0x921c5ae76d241b79, + 0x6a132de98b1729e5, + 0xdae814fdca1b4963, + 0x761e54dba71c46bf, + 0x38b9a5ddc51f763d, + 0xa3692781f51284a9, + 0xb75f24e43526b417, + 0xfc423a976419c283, + 0x179cf6d54ce8b1df, + 0xe6f27b9659eacf4d, + 0x6fa4721657cdfeb9, + 0xe3dfc2acbaf43e27, + 0xb9dea65dc8f64d93, + 0xa7f5839dc5d74aef, + 0x6e94fb5214fb5a6d, + 0x91ae6b3323fe68d9, + 0x25e8b3c763f1b947, + 0x6d357eb981f4c7b3, + 0x54387a6a9fe8d731, + 0xa4316f887bc9e48d, + 0x694ec37ba8cbe3f9, + 0x2f41bc9feadf1367, + 0xcb2f76321ae452d3, + 0xdc62a1b54ae87251, + 0xb8c197d434c75f9d, + 0x54e71ba764da7e1b, + 0x1ad4b83762ce9d87, + 0xb286fe7a92d1abe3, + 0x918cf3bbafc4db61, + 0x8cb2ed41fca5e8bd, + 0x76f924e21dc9f83b, + 0xab4c91743bcd18a7, + 0x13e98af76acf3815, + 0x1fb2354a9ad35681, + 0xab4fe3ca97b564ed, + 0x67ad48edc4d9835b, + 0x3db6c1ffe3db92c7, + 0x2a684ec1f2ceb135, + 0xe153d76543b2cf91, + 0xbd687ce32e83bcfd, + 0x8614f5e43c95fd6b, + 0x8269eca65ba91cd7, + 0x963e214989ad2c45, + 0x73d2485dc79f4ab1, + 0x79cf2baed7b3692f, + 0x689b7411f3c4678b, + 0xadc736f213b896f7, + 0x9518da7432acb675, + 0x7cbd9e57629eb5d1, + 0xebf924587e91d34f, + 0xb2f936c87d84f2ab, + 0xb129f5adcdb81329, + 0xf3c4b5dfecab3195, + 0xb425e93ed78b4fe1, + 0xeb2a57d2178e4d5f, + 0x68b9ae5435826dcb, + 0xf1eb527764a58c39, + 0x5e9f47a762879ba5, + 0xfc826d5a928bca13, + 0x43da728a9e5dc87f, + 0xe7f14b8bac71f6eb, + 0x5c9432a1fda41759, + 0x4e3a9d221d9826c5, + 0x69ae5dc32c9b5643, + 0xeb3df795487c539f, + 0x7f3e628a968f731d, + 0xb937681dc583a179, + 0x68ce3fdcb2749fd5, + 0xeb7691aed178be53, + 0xfea8547ede48bcaf, + 0x3f48b6921f5ceb2d, + 0xbed752954e621c89, + 0xa87cfeb76c742af5, + 0x6e4d37aa9c684a73, + 0xc3267b4ba85947cf, + 0xe3c629dcb85c674d, + 0x3a49ef2ed34f75b9, + 0xd351eba1f483b527, + 0x5a8f94321276c493, + 0xf95ca3254157b2ef, + 0x4d6f93865f4ae16d, + 0xcf847d365a3befc9, + 0x21d9754bac612f37, + 0x1724b6ddcb654ea3, + 0x96a2bfdfea586d21, + 0x9e4a8351f6395b7d, + 0x856a9322153c6ae9, + 0x7cead163243f9a57, + 0x51f9a4387452b8c3, + 0xecf1b56ba256d841, + 0x957fc6a98f27e59d, + 0x83a42e6a9d3af51b, + 0x648a539edc3e1487, + 0xac5e9831fb6154e3, + 0x18d9e6a32c457361, + 0xb36c97d5493761bd, + 0x291c467656397f2b, + 0xa1b254c7642c8e97, + 0x49c65bf9842e9cf3, + 0xa4dc287cb243dc71, + 0xd173854baf14e9cd, + 0xd3a25b1fed17f94b, + 0x62fb45743e2c19b7, + 0xd12453f76c1e3925, + 0x95d1ef698c325791, + 0xa7b25c19891365fd, + 0xdb6f31adc917846b, + 0x8daf143dc51a93d7, + 0x97a6d43fe61db245, + 0x1db23c9fe43fc2b1, + 0x8324ca665423ce1f, + 0x7af893532cd3fe7b, + 0xcd83b1554bf61de7, + 0x5dcfa8687bfa2d65, + 0x4a5c3be878fd4bc1, + 0x45adb27a97de5a3f, + 0x983ea7ced5f2689b, + 0x34578a9fe4f5a819, + 0xb68d932213f9b785, + 0x976abc2543fab6e1, + 0x412a87e761edc45f, + 0x12c537f76ed1f3cb, + 0xe6b9d48bade61439, + 0xca17546cbce832a5, + 0x9e64281edaeb6213, + 0x538b974ed7cb4e6f, + 0x7df5982216af5edb, + 0xb956f27436e28d49, + 0x873bcef763e49cb5, + 0x8dca421874e8cb23, + 0x283b74a761dac98f, + 0x5d83ce776e9cd7fb, + 0xa479123dced21869, + 0x3cad1791fbc427d5, + 0x793e68521cd94753, + 0xdb1683c328c954af, + 0x92af17d658bc742d, + 0x5bed324765cf7289, + 0xa846c25a96c3a1f5, + 0x21ce674ba2c5bf63, + 0xd68f2a4dc196adbf, + 0x8ed5f34cbf89ec3d, + 0x936b2fd21e7dfca9, + 0x2da8ec765eb23c17, + 0xfc9a28176dc54b83, + 0xe41f768659a648df, + 0xcdf34e6a97ba685d, + 0xd1ace63cb4ad76c9, + 0x3b98715ed4bfa637, + 0x537b4ed1f4b2c5a3, + 0x947f5ba434b7d521, + 0xcbf5739541a8e27d, + 0x783ae6554d7af1e9, + 0xe3d721f98dae2157, + 0xd54f1cb98c914fb3, + 0xaf17b8ddcba56e31, + 0x7df453bfe7965c8d, + 0x891d374fe4786bf9, + 0x739db652148d9b67, + 0x3d89b1a3247fa9d3, + 0xc315d24874a3d951, + 0xeda6cf187184e6ad, + 0xc3ae165a9e78f62b, + 0x2a7e985cbe8c1597, + 0x2eb1873dcb8d25f3, + 0x15e369a1fca26471, + 0x2659cfd21a8462cd, + 0xbf6791a43a97814b, + 0x7da815f434598fa7, + 0xadbc3629847cae15, + 0x4c75f36a936fbd81, + 0xa1e85b4a9162caed, + 0x3175d69dce64fa5b, + 0x67a951d1fe581ac7, + 0xdb523a421e7c2a35, + 0x5ce4fd243c6e48a1, + 0xfc37a1465b82671f, + 0x8e6bc14a9a63857b, + 0x4295d31cb85694e7, + 0xb863e9fed47ab365, + 0xcb795a1fe46db3c1, + 0xf4c9b73ed26ec13f, + 0xad954f843152ef8b, + 0x2491d8f43d451ef7, + 0x417bfa976d492e75, + 0xd6235b887b5a4cd1, + 0x2aebc519893d5b4f, + 0x958f6baed84169ab, + 0x9b2863ffe7548a29, + 0xbe3d9621f436b895, + 0x4fb1ce632549b7f1, + 0xfce9b325423bc56f, + 0x4a7b5cd7613fe4db, + 0x32e4fc7baf631549, + 0x34c2659bae4723b5, + 0xf418a67dcd5a6423, + 0x82faec4eda3b518f, + 0x1ef857bed72c5feb, + 0xd8b7f3e32a318e59, + 0xfb5e369547239dc5, + 0x59af42698627bc43, + 0xbc2f17e76327ca9f, + 0xdc4ab399823be91d, + 0x5fc924ebad1ef879, + 0x96eb4a2dcd1328e5, + 0x19426ca1fd174863, + 0xc9e64b332c1845bf, + 0x6b895fe54a1b753d, + 0x43f9c286581e73a9, + 0x5968be3ba942b317, + 0xa9d7c38cb725c183, + 0xfca6274a9315aecf, + 0x5e87f1acb218ce4d, + 0x3e4982cbace8fdb9, + 0xd9e15a243cfe1d27, + 0x14ecb9d65df14c93, + 0x8697cbf65ad349ef, + 0xad9b68e54af7596d, + 0x7bd9c24985fa67d9, + 0xf35d8e4cb5fda847, + 0x86abfeddc4efa6b3, + 0x379168afe5f4d631, + 0xa5647b2212f5e38d, + 0xb6c21ed541d7e2f9, + 0xba842e365fec1267, + 0x914e35687bce41d3, + 0xe734ab1a9bd26f41, + 0x241bec9ba8c35e9d, + 0x325de7fdc8e67d1b, + 0x391c8ed1f4ea9c87, + 0x9b85e4c215dc9ae3, + 0xc4f57be434dfca61, + 0xc19f832653c2e7bd, + 0xb735ef4981d5f73b, + 0xa591fbd98fd916a7, + 0xc46e5f9baedc3715, + 0x541b78eedbce4581, + 0x32a1b971f9b163ed, + 0x9cfb64321ad4825b, + 0xc4be67f438d691c7, + 0xca587d9546c9af25, + 0xc29f1b8764acbe91, + 0xb9c72f87628eabfd, + 0x2d415e3a91a2fc6b, + 0x27f93b5dcfa51bd7, + 0x3712ba41fec92b45, + 0x14ab9d332eac49b1, + 0x958baf143bad582f, + 0x39726f554ac1768b, + 0x7ae9b38768b395f7, + 0x5fb4891ba6c8b475, + 0xaebd6f3dc5a9b4d1, + 0x95a3e1ced39bc24f, + 0xa192c35ed28fe1ab, + 0x4c2f59d764c53129, + 0xbdf81ca43ea62f85, + 0xd76ebf865c984de1, + 0x3d9ae8c76b8a4c5f, + 0x8bd21397687e5acb, + 0xb9af36ced7a18b39, + 0xbdca756fe683b9a5, + 0x6d4e3521f5a7c913, + 0x3bced8a21389c67f, + 0xdb896ca4327ad5eb, + 0x941bef27618ef459, + 0xec7136298f9324c5, + 0x573c89fcbea86543, + 0x14a9285cbc78529f, + 0x9318ab6fea8b721d, + 0xfd4ca82fe85d7f69, + 0x5ecb3fa328719ed5, + 0xebd9c7332784bd53, + 0xbef861254365cbaf, + 0x816dae987368ea2d, + 0x31e54fc8715cfa89, + 0x5fb23debad6e19f5, + 0xe158973ede824973, + 0x19a467ffeb7546cf, + 0xc75a9e421c59764d, + 0x978e5d432a5c74b9, + 0x2b9c1ed6596ea427, + 0x87ef164ba871c293, + 0x45ea862a9564b1ef, + 0xfe9d573ba246cf5d, + 0xd23a874cb147fec9, + 0xa1863efedf5c1e37, + 0x69ed3ac21e5f2da3, + 0xbe186a965e746c21, + 0xfab827376c345a7d, + 0x18a324665b3768e9, + 0xfe985d7cb83ca957, + 0xf68392ecb64ea7c3, + 0xf1b4693fe862d741, + 0xd1536b41f253e49d, + 0x65e7b4c32357f41b, + 0xdc29e457625b1387, + 0xac3b8e587f5c42e3, + 0x8ef614ba9d4f5261, + 0x2c96ae398b325fad, + 0x275ebf4dca357e2b, + 0x5cd817afea268d97, + 0x97f6a13fe62a9bf3, + 0x84fca3b3263ecb71, + 0x172dfac54531e8cd, + 0x256bcfd87523f84b, + 0xe8c621dba23618b7, + 0x86593bfbaf1b3825, + 0xd1a458ecbe2d4691, + 0x1d47c26cba1e54fd, + 0x19658be1fc12836b, + 0x2b5ca4943b1592d7, + 0xef4591a76a29b145, + 0xcdb134865629bfa1, + 0xdc63ea58752cbd1f, + 0x3a718b2a9421fd7b, + 0x48aec79cb3241ce7, + 0x12f7e5acbef72c65, + 0x6cd35f2fedf84ac1, + 0x95b2cef21ceb593f, + 0xd46853a32afe579b, + 0xfadc94265bf2a719, + 0x45c96bd879f3b685, + 0x652b471a96f7b5e1, + 0xc8475b3ba4e9c35f, + 0x7ecfda3a93fae2cb, + 0x42e9d3adc2def139, + 0x943bdc2762f431a5, + 0x87de52643dc64ef1, + 0xf876d5943bc84d6f, + 0xc1af9de548e95cdb, + 0xaf42de9768de7c49, + 0x8d56217dc7e19ab5, + 0x73fca65ed7e5ca23, + 0x526b31cfe3d5c78f, + 0xa8d536b213c8d6fb, + 0xa78d5b4432dcf569, + 0x8b6ec24872cf16d5, + 0x2b83df7a9fd24653, + 0xb15e46d98dc653af, + 0x2345e71babc9732d, + 0xf26c714feadc7189, + 0x2875693ed6ac8fe5, + 0x3c6dbf4328c1be63, + 0xd49a3e632593acbf, + 0x7418629654a6eb3d, + 0xc931ed4652c7fba9, + 0x2385d76a93cd2b17, + 0xe634258a9ebf2a83, + 0xec2f473cbca247df, + 0x5c481a31fcb4675d, + 0xfba67d521db875c9, + 0x364f57b329bca537, + 0x4a279ed6579eb4a3, + 0xf7a4bc1a98b3d421, + 0x6573ce1a95a4e17d, + 0x38bd496ba285efd9, + 0xb7afe21ed2ba1f47, + 0x872c1f9edf8c2eb3, + 0x48e96d532e9f5d31, + 0xbae87c443e925b8d, + 0xe5f71bd43c846af9, + 0x53879ad54cb89a67, + 0x4ae2d71a967ba8d3, + 0x67afec8cb69ec851, + 0xbe172dfdc481e5ad, + 0xcf92748fe394f52b, + 0x697f4ae323b81497, + 0x2ad97ef7619a24f3, + 0xbd58c7e76f9d5371, + 0x72ed83176b7f51cd, + 0x2abc58da9c827f3b, + 0x89e2734dcb648ea7, + 0xd179246fe978ad15, + 0x6912d7a1f56abc81, + 0xcf64bd32145cb9ed, + 0xbe5d76843471f95b, + 0xb4ea3d17638419c7, + 0x428ef3ccb1a82935, + 0x2d5784aa9f6b47a1, + 0xf2417cebad7c561f, + 0x758b4fcedc5f647b, + 0x38e65cb1fb6293e7, + 0x7e235c621c87b265, + 0x7cbe68a54968b2c1, + 0x7f58bde54659be2f, + 0xac739bd7634cde8b, + 0x7b3d618ba4621df7, + 0xad4fe68dc1842d75, + 0xdb259e6dcf574bd1, + 0x6c93824fed395a4f, + 0xa59b32421e3d58ab, + 0xac961df43c4f7829, + 0xa1bd9fc76c42b795, + 0x7f359ad98945b6f1, + 0x3e4f9d5ba738c46f, + 0x28be54cba549e3db, + 0x65d9efbdc35df249, + 0xc1b6a8d1f47132b5, + 0xdf279c6654876123, + 0xf295adc43d264e7f, + 0x7efc59254c285deb, + 0x1a784cd76b2c7d59, + 0x863fd1a8792f8bc5, + 0xac149e3ed952cb43, + 0x3e564f7ed624c89f, + 0xae8d7411f537e81d, + 0x25b3d462142bf679, + 0xef428c77643d17e5, + 0x689d3c5ba2514763, + 0xbcd3f5998e1354bf, + 0x97c238fbae18743d, + 0xeb9358ddcd1b72a9, + 0xdaf8734feb3da217, + 0x16c724bed81eaf73, + 0x589641243712adcf, + 0xcad1b4e43715ec4d, + 0x21cab9d65416fcb9, + 0x4126dfaa953b1c27, + 0x59e4bfcba41e2b93, + 0x8f634b987bcd38ef, + 0x5a8d946cbcf2586d, + 0x51ba4d9febf476d9, + 0xcb2ed4f21cf9a647, + 0xf3647d8328fca5b3, + 0x3d8c7ae768fec531, + 0xfe3c4db876f1e28d, + 0x43d2abc985d4e1f9, + 0xdf67e38dc4f92167, + 0xa524e69cb1e92fc3, + 0x31c2a56cbfdc5e41, + 0x8d9e46521ebf4c9d, + 0x91db25c54de37c1b, + 0xcb9ef8543ce49b87, + 0x2b7c849658d7a9e3, + 0xd69534e987ebc961, + 0x2a7ec5b984aec6bd, + 0xf5b1ea2dc5d1f63b, + 0x4b5d27a1f3e415a7, + 0xef31ab9324e93615, + 0x4c9ed8a762eb5481, + 0xbe51ad254fab52ed, + 0xb7f35ae76dcf715b, + 0x89f12e576ac28fb7, + 0x4719dcfcb9c6ae25, + 0x56bd721fe6c7bd91, + 0xa87df54fe498bafd, + 0x3587cf22149dea6b, + 0x7ef8a51545c21ad7, + 0xace675f983d62a45, + 0xf62cb3aa92d748b1, + 0x6a3c54f98eba572f, + 0x1d723f5a9ead658b, + 0x61b87dfdcbae84f7, + 0x7d4e1391fac2b375, + 0x5d4e7fa329a6b3d1, + 0x9b15842437a8c14f, + 0x14d825c43478df9b, + 0x2b39d1c7648cfe19, + 0xdb46cf8ba4b12e85, + 0x574c983cb2a54ce1, + 0x2eab5fddce974b5f, + 0xb461a8e1fe7859cb, + 0x7a9fd8521e8d7a39, + 0x1d7b3f632c7f98a5, + 0xac5782b76ba4c813, + 0xd8a794e76894c57f, + 0x5bac324a9587d4eb, + 0xf9273d1dc48bf359, + 0xe96ab1ced49e13c5, + 0x62ce48d1f5b16243, + 0x74862c1432a4519f, + 0xe5fb46c32d765efb, + 0x24fcb1943d5a7e69, + 0xa35c79154a6b8cd5, + 0x56c9def9897fac53, + 0x69cf28ecb762c9af, + 0xaf5362bdc675e92d, + 0x87d51a9fe356f789, + 0xdc9ef683247b18f5, + 0xa367dfb6549e2873, + 0x849b35a8728145cf, + 0x5cba4e1a9f83754d, + 0x897462bbae5673b9, + 0xd962fe7dcd6ba327, + 0x7d6b91cfea6db193, + 0x847efd5cb64c9edf, + 0x8eb9f5321862ce5d, + 0xa17dc6f32654fdc9, + 0xa6d791c985691d37, + 0x92b57c19846b2ca3, + 0xf56ce1dba37e5b21, + 0xe532761cbf41597d, + 0x43df72adcd4367e9, + 0xcd528911fd36a857, + 0xfe5274621d49a6c3, + 0xcb816d743a5dc641, + 0xc91f67a6574fc39d, + 0xfd6e32aa9864f31b, + 0xfed9763dc9561287, + 0xab93ef6dc56941e3, + 0x9b2e5a4ed26b4f51, + 0x7e25d83cbf2c4ead, + 0xa52946d43f417d2b, + 0xc5b8d9e54e238c97, + 0xad1b84265c269af3, + 0x1a2be3d76b39ca71, + 0x3adceb59862ab7cd, + 0xc215de3ba62fe74b, + 0xd451239fe84316b7, + 0x2c3ea7d1f6483725, + 0xcd6ba513263a4591, + 0x8b4952f7612a53fd, + 0xab9126f65f1e726b, + 0x6952b1c98e3291d7, + 0x3275e8ca9c14af35, + 0xd79e32bdc926bea1, + 0xe957f26ed728bc1f, + 0xe2b3c861f51aec7b, + 0xf7965d43251dfae7, + 0xc1b9f4d878132b65, + 0xf97a65d9852649c1, + 0x52e34cfba219583f, + 0x8fcb96a87efa569b, + 0x437f58cbacfd8619, + 0x4f9e5a8dcbefa485, + 0xebc9a74ed9f3b4e1, + 0xd82c5b3219e6c25f, + 0x1ab8cd5436f7e1cb, + 0x8c12965545daef29, + 0x8c5d3ea874ed1f95, + 0x7d4b1afa95e24df1, + 0xb39fd52ba1e34c6f, + 0x7c318daa9fe65adb, + 0x32b58a71fdea7b49, + 0x7a9246821ced89b5, + 0xc2a6d7f54adfb923, + 0x82615ed549d2c68f, + 0xbcd841e767c4d5fb, + 0x6b8e42cba5d8f469, + 0xe479bd8ba6eb14d5, + 0x186b47edc6de2453, + 0xcfb2d41fe3d152af, + 0x37a562f543e5712d, + 0xbf517c332ec56f79, + 0xb9cf51d43cb98de5, + 0xf8e2943659bcad63, + 0xab231e96568e9abf, + 0xfa531dea97b2ea3d, + 0x6ba1295ed5c4f8a9, + 0xeab6c411f5d92a17, + 0x9b7326a215dc2983, + 0x53c1df7542ac36df, + 0x1ce7f6d982c1765d, + 0x7c1d89276fb374c9, + 0x68275c1a9ec8a437, + 0x15d4f9a98dc9b2a3, + 0xf26ac37fe9adc321, + 0x74b9da2dc58ebf6d, + 0xcdb26f421682fed9, + 0x7ab59e8438b61e47, + 0xcf359d2765a82db3, + 0xda613c5984ab5c31, + 0xf6edb3c8719e4a8d, + 0x146aed2cbea168f9, + 0xa3524bfedeb3a967, + 0xc4d738a1fc96a7d3, + 0x8d96ef532d9ac751, + 0xb6dce593287bc4ad, + 0xa362c4e6578fe42b, + 0xe5b62d3ba8b41397, + 0x47adfc1cb6a742f3, + 0xf12e98ced4ba5271, + 0x5f2eb9adc1794fbd, + 0x15378e4dcf7d6e3b, + 0x1be678d32f618da7, + 0xde9417543e84ac15, + 0x8b9a57d54d76cb81, + 0x8761cd954957b8ed, + 0x5bca421a976ce85b, + 0x4de18f6ba45ef6c7, + 0xa734d29fe7a42835, + 0xa9c56141f39746a1, + 0xd4f35ca32389651f, + 0xdb8c3fe5418c637b, + 0x8b219d354f5d82e7, + 0xa3517cba9e82b165, + 0xec32da698c64afb1, + 0xe32f58dba956bd2f, + 0xef1495adc647ed8b, + 0x3cb5496ed54aebf7, + 0x14d59ae3286f1c75, + 0x684d1c9656734ad1, + 0x3ba7f2d98276594f, + 0x6e35c41a914857ab, + 0x84bd6f9baf4c8729, + 0xcfa6d41cbd3ea695, + 0x291c834edc62b5f1, + 0x95a8bfdfea54c36f, + 0x64a539821946e2db, + 0x947f58c4385af149, + 0x41fe3bd8786d21b5, + 0x17e38d6a976e4f13, + 0xc82d154ba3524d7f, + 0x1e2f358ba1345ceb, + 0xb45f6caedf287c59, + 0x4e186251fe2b8ac5, + 0x32f59de21d2eba43, + 0xcb361ea54b31c79f, + 0x3d2e84776a34e71d, + 0x36fb4e198a26f579, + 0x9d73ac1cb83a16e5, + 0xb71526ddc84d2563, + 0x1f73269dc52e43bf, + 0x8da57b61f154723d, + 0xf63715a5423571a9, + 0x14e867b43d178ef5, + 0xce624af65d1bae73, + 0x1fc89d76581d9bcf, + 0x437ab9c98921eb4d, + 0x3659a42dc713fab9, + 0x8c936bffe9381b27, + 0xa9816c71f61b2a93, + 0x3efd14b3251b37ef, + 0xd3fb1626531f476d, + 0x9eab6c79831275d9, + 0x4b75fe998ef3a547, + 0xaf534bc98df7a4b3, + 0x5bd28a7a9bfac431, + 0x8d5f7c6ba7fbc18d, + 0x1e49623ba5bdcfe9, + 0xa3df481329e31f57, + 0x5de621a547f62ec3, + 0xa438c62876f95d41, + 0x1235c8a762fa4b9d, + 0xcb3fd41982fe6a1b, + 0x9e14cfdcbfe19a87, + 0xfa749c2cbcd4a8e3, + 0xed9617b1fbe7c861, + 0x4bac6f7219e8c5bd, + 0xe385d14328dce53b, + 0x3c8d769546cef3a7, + 0xc95d8bfba9e63415, + 0x687cae3cb6e75381, + 0xd73852eba3c851ed, + 0x3ab1547dc1da6f4b, + 0x85fa726dcfad6eb7, + 0xc7261a843fc1ad25, + 0x5942dec43ed4bc91, + 0x6aef2d7438a5b9fd, + 0x65cbe23547c8e96b, + 0xf341db9765abf8d7, + 0xdf872accb7cf1945, + 0x1629bc7fe6d347b1, + 0xf48627dfe3c7562f, + 0x5cad4e7212d9648b, + 0xeab5836541cb83f7, + 0x71de6f854fbea275, + 0x1a593d287ea3b2d1, + 0xce8346187a94be3f, + 0x587f64eba785de9b, + 0x38db614dc6a8fd19, + 0xa63d2b81f6ac1d85, + 0xd7ac1b83269f3be1, + 0xa42c597436b24a5f, + 0xc42f587762a458cb, + 0x8a4bc92761ca7839, + 0x7825cfe76f8c97a5, + 0x12c3fb4bad9eb713, + 0x68e31abedb91c47f, + 0x52b34181f984d3eb, + 0x24b9dce21ba7f259, + 0x19a7c525489a12c5, + 0xc5946f3878ad5143, + 0x7f2dc897647d3e8f, + 0xfae18dca93825dfb, + 0x179f8bedc1a47d69, + 0x3b7d42adcf678bd5, + 0xc682a511fe7cab53, + 0xd7a658c21c5db8af, + 0xad1678354b71e82d, + 0x2b5186e54b73f689, + 0x3da52fc76a9817f5, + 0xa31948edc89b2673, + 0x21bce93ba57b34cf, + 0x64937aedc28f634d, + 0xb19c3ad1f18372b9, + 0xfb8153654396a127, + 0xe1f573432e57af83, + 0x752ef1a43b489cdf, + 0xf2b1e837694ebc5d, + 0xdc6f98587851fbc9, + 0x5318e24eda851c37, + 0x35821f4fe8672ba3, + 0x1e43d2b1f67b5a21, + 0xe2953d42135c487d, + 0x7f4cb164324f56e9, + 0x38d5efba9182a657, + 0x42fac5998f46a5c3, + 0x39c7e1bbae69c541, + 0x9d642ea98b4ac29d, + 0xe9532d1dc95de21b, + 0x24c59de1fb632187, + 0x6745ca8219652fd3, + 0xa9b84e1439684e51, + 0xcfb5e29765384cad, + 0x673b5af9834d6c2b, + 0xd3c652fba13f6b97, + 0x4ac8e59cbe42a9f3, + 0x14f732eede35c971, + 0x1e735dc1fa27b6cd, + 0xa37c56b21c2ae64b, + 0x85a6c414392df4b7, + 0x8a37cd2a9b713625, + 0x85f42a6cba365491, + 0x167c935ba63752fd, + 0xe91c267ed43a716b, + 0x1f93a24ed12b6fc7, + 0x169a8f7dcd1f9e35, + 0x598a2ed54f23bda1, + 0xf2cdbe554d25cb1f, + 0xcf597a254c16ea7b, + 0xf9b8ae76581af9e7, + 0x932f845cb92e1a65, + 0x3e2914aed93248c1, + 0x3c5a8b4ed814573f, + 0xe249a7b1f317659b, + 0x152ca864342b8519, + 0xd3285f47621da385, + 0x269317b65cfda3e1, + 0xdec96b187be2c15f, + 0x53bc1ed768e3dfab, + 0xc465389ba8d6fe29, + 0x36de7fbdc7fa1e95, + 0x5e473caed6eb3cf1, + 0x8a96735215de3b6f, + 0xae7bd65434f259db, + 0x4a53f1e762f57a49, + 0x9dc3f54761f798b5, + 0x9d4bfca87fecb823, + 0x14e5bf687acdb58f, + 0xc5d3b74ba9c1d4fb, + 0xc7a8f92fead4f369, + 0x57a4e9d32ae813d5, + 0x3f24be7769eb4253, + 0x738c1b6656dc41af, + 0xc368aef874be5f1d, + 0x5c84de9ba3d26e79, + 0x78b51edba1d48ce5, + 0xce8a4f6cbfd8ac63, + 0x7c86134fedc8a9bf, + 0xfec9d7521baec93d, + 0x5f92e7a43bc1f7a9, + 0xd31e5b776bd52917, + 0xa73fe5876ad92783, + 0xaefc623986b935df, + 0x5c4917eba3bc645d, + 0x98a34e2ed2bf63c9, + 0xed421a61f1d4a237, + 0x271e8cf542d6b1a3, + 0xf59e8c432c869def, + 0x8dc271543c89be6d, + 0xcdf76985487becd9, + 0x3674cfea9ab21d47, + 0xab9384eed8a52cb3, + 0x2b5937afe7c85b31, + 0x5c82e3b1f3ba498d, + 0x3bc7d2e213ac57f9, + 0x2f17e6d432bf9867, + 0xfd281ec871b2a6d3, + 0x7dce39b98fa7c651, + 0xcbd8f4576e87c3ad, + 0x153cf62a9c8ae32b, + 0x4b2f57ddca8df197, + 0x15c8ba6fe9a241f3, + 0x35a4697329a54f61, + 0xa5de869325864ebd, + 0xadc284f654896d3b, + 0x368d14f6528d6ca7, + 0x8f432d1ba28f9b15, + 0x12738facbf73ca81, + 0xdb7f6e9bac64b7ed, + 0x8e7ca4d1fc68e75b, + 0xa6ce25b21b6af5c7, + 0x2af78d154b9e1735, + 0x318c4b987b9245a1, + 0x17d6953ba895641f, + 0xb8d495adc498627b, + 0xe5a3b2fdc36a81e7, + 0x5b8a4eced17c9f45, + 0xef73958dcd5f9eb1, + 0xef2a45921e63bc2f, + 0x6d1b7ae32d54ec8b, + 0x4a689ce43b46eaf7, + 0x5fa124d98a6c1b75, + 0xb3512ecba86e39d1, + 0x19738b2dc971584f, + 0xd8f25a7fe47356ab, + 0x283d7ab1f3578629, + 0x68f2b7c2126ba495, + 0xa92d8bf6526ca4f1, + 0xe8643d165d4eb26f, + 0xcf85ea987c53e1db, + 0x2a94c3e98b45ef39, + 0xdb2148adcb481fa5, + 0x2b9e536ed96b4e13, + 0x15468a2fe64d3c7f, + 0xf7e51b6327415aeb, + 0xba519c6326437b59, + 0x1358df28723689c5, + 0xc926df19815ab943, + 0xc84e53187e2cb69f, + 0xcab1d82a9b3fc61d, + 0x7615a94edc32f479, + 0xbe3dc611fb3714e5, + 0xc7fa3d621c5a2463, + 0xdfbac846583a42bf, + 0x86ae3f58784e613d, + 0xb65214fba5316f89, + 0x8b63d27ba4238df5, + 0xde5b91fdc126ad73, + 0x67f254ecbe179acf, + 0xa1c52691fe1bca4d, + 0x96ae35f32c1fe8b9, + 0x325bd9776d341a27, + 0x36982df87c162893, + 0x46c5da98791836ef, + 0x9f475d2ba81b456d, + 0xd29f815cb51e64d9, + 0xb5c8a67fe621a347, + 0x918b6ed1f415a2b3, + 0xf8253ae76548c231, + 0xe197a6f32ce6bf7d, + 0x49b56f843af8cde9, + 0x9f135da549ecfd57, + 0x9d5c6b4989f12dc3, + 0x39d825fcb9f65c41, + 0x8392f5adc5f64a9d, + 0x12f895bfe4fa691b, + 0xc7a932e213fd6987, + 0x97efc85542df97e3, + 0xda62493982f3c761, + 0x24edb9876fe5c4bd, + 0x538cead87cd8e43b, + 0x96b517e989dbf2a7, + 0x56a94f1dcade2315, + 0xa5cbe481fae35281, + 0xd64a879217b34fcd, + 0xacb4816325d76e4b, + 0xc9fbd3a543e96db7, + 0xed2b4a3873ed9c25, + 0xfedb8ac872dfab91, + 0x1f4a53e87ea2b8fd, + 0xb625c18badc4e86b, + 0xd578f1bfeab8f6d7, + 0xd34f9a732bdc1845, + 0xd7ec935549ce36b1, + 0xdc26a49879c1652f, + 0x864a52da97d4638b, + 0x17f24e3ba4c682f7, + 0x8f1ab94dc3dba175, + 0x4a257beed2ab9fc1, + 0xa73dce2cbc8ead3f, + 0xc7f6b2321f82ed9b, + 0x1a4dc9e43da5fc19, + 0xb196cfa54db91c85, + 0x82be1f97689b3ae1, + 0x354cf7a987ad395f, + 0xf91843eed6a157cb, + 0x679d821fe5c48739, + 0x84e692d1f2c796a5, + 0xb5fe943324cab613, + 0xc67db835419cb37f, + 0xc7513fe54d7fc2eb, + 0x32a564b87da3f159, + 0x8eb263aa9da721c5, + 0xa1963e2dcba94f23, + 0x874e6bddc67a3d8f, + 0xd374698fe57d4cfb, + 0x1365ca7325a17c69, + 0xde3519c324938ad5, + 0x43c9e7576297ba53, + 0x24a39fc65168b7af, + 0x6b9fae498f6bc72d, + 0xe834bd5bac6fe589, + 0x23f4658edc9316f5, + 0x86d39e71fca82573, + 0x9d84cfa21a7843cf, + 0x541f8be4398b624d, + 0x6187fca5457e61b9, + 0xe3461cdba5829f17, + 0xfc812decb274ae83, + 0xe436985ba1659bdf, + 0xdb23971baf48cb5d, + 0x48b2ed91fd4beac9, + 0xd342bfe21c5efa37, + 0x78396c465d7429a3, + 0x13987b276c875921, + 0x473fb5e98a59467d, + 0x864cbe3ba74b65e9, + 0xa67fe83dc36e9457, + 0xd8b4672fe571a4c3, + 0x9e48bc21f286c341, + 0x4781a5d43256c19d, + 0x415d9ce32d37cef9, + 0xb25613e54c3bfe67, + 0x6ac23de87a5f1ed3, + 0xdfb4967bab734d51, + 0x87941addc8354bad, + 0x97bfd61fe7486a2b, + 0x5d483ba1f43c6a97, + 0xaf863eb2154d98f3, + 0xf432c5e76452c871, + 0x98bec3d87143b5cd, + 0x9adb47398f27e54b, + 0xf321d9b98d29f3b7, + 0xd6e218fcbc6d1425, + 0x8597b31edb5f4391, + 0xf483c62fe94351fd, + 0xacdb87f219246f5b, + 0x814eb6f435286ec7, + 0x831ce658762b9d35, + 0xe394df58743e9ca1, + 0x3ab5e14a9342ca1f, + 0x7164debbaf13e97b, + 0xd852c97cbc15f8e7, + 0x98154bd1fd2b1965, + 0xcb3a8d954b2d37c1, + 0x814ed3f65a1e463f, + 0xf8943bd87a12649b, + 0x7e6f54acba268419, + 0xfb43a98dc619a285, + 0xe73ab65dc53ba2e1, + 0xe57923ccb21cae4f, + 0x569c13d989dfceab, + 0xcb7368d21ce3fd29, + 0x78fd5be43cf61d95, + 0xca2e74165ae83bf1, + 0x694fed2658eb3a6f, + 0x3f25bd6876fe48db, + 0xbed5a71dc6f17849, + 0x831ef29ed4f397b5, + 0x8249ac3fe4f8b723, + 0x8cf7e29212e9b48f, + 0xbcda8f9541eac3fb, + 0xb165c2354dcfe269, + 0x67b125d98ce412d5, + 0x35c7e2bbace84153, + 0x27b3f54ba8c73e9f, + 0xf961425cb7ca5e1d, + 0x62a549d1f4ce5d79, + 0x987ce4d326d18be5, + 0x67ac1b5325e4ab63, + 0xdec7168542d5a8bf, + 0xf1d3aec761e9c83d, + 0xd8e9f3265fbce6a9, + 0x742afd3a9cbef617, + 0xa369157fecd42683, + 0xb982f46fe9b634df, + 0xbef36ad21ac9635d, + 0x152fcea437db62c9, + 0xa319ef6656ce9137, + 0x5694831875c1af93, + 0xa2f9c63872a39cef, + 0xe137bf6a91a5bc6d, + 0xb3479ecbaf87ebd9, + 0xf482169fed9cfb47, + 0x9d54e7f32d9f1ab3, + 0xd81429376dc45a31, + 0x9d81c5a43ab5478d, + 0xae59237547b856f9, + 0x769ebc3ba4bc9567, + 0xe736af5cb4ae95d3, + 0x41bfd95fe6b2c451, + 0x215bc471f194c2ad, + 0x8e2cb59543a7e12b, + 0x659c3d132d69ef87, + 0x46bda3965c8b1fe3, + 0xbaf294e87b9f3e61, + 0x95821bd879824cbd, + 0xe631a9ced8956c3b, + 0x5216cd7fe4986ba7, + 0xae64b591f48c9a15, + 0x6be53da3247eb981, + 0x62ef3c554381b6ed, + 0xd65f89b87193e65b, + 0xd9fab6165e86f4c7, + 0xcdf4e67bae9b1635, + 0x2cd341ecbc8d34a1, + 0x7f89132dca8e531f, + 0xdc25eb71fa93617b, + 0xba8dcf2219846fd7, + 0xfdca43e326789e45, + 0x62b19fa6546a9db1, + 0xf3c416a8736dab2f, + 0x8512f6da9261ea8b, + 0x76d132cbad53e9f7, + 0x162e8acede681a75, + 0x8c13a421fc6a38d1, + 0xe32f8b421b6c374f, + 0x1b9c5e83296f45ab, + 0x4dfae5876b738529, + 0xd6e158ccb876a395, + 0x9f46173cb568a3f1, + 0x3ed81b5dc35ab16f, + 0xcb8f17aa914dafcb, + 0xa5143fedcd51fe39, + 0x4c59df832f641ea5, + 0x816b7e365e684d13, + 0x829bc1f65c493b7f, + 0x7af981e7683c49eb, + 0x97f46cdcb83f6a59, + 0x5971b64ed74298c5, + 0x31c5fd4fe756b843, + 0x35db9a1fe237b59f, + 0xe9348563234ac51d, + 0x391fbc86514de379, + 0x9e2f65798f6213e5, + 0x7319bc5bae574263, + 0xea25b74a9c3741bf, + 0xce9a1f2cba395f2d, + 0xaf4ec98ed72c5e89, + 0x86e9351ed62e7cf5, + 0x6ab8ec921842ac73, + 0x67a1fbe43524a9cf, + 0x841297b76327c94d, + 0x23dbf7e7612ae7b9, + 0x81f3a4ca9e1df827, + 0x9f6ad87dce412793, + 0x39d8e52dcb1435ef, + 0x43be7561fb18546d, + 0x14579de32b1a63d9, + 0x4f726ea65a1d9247, + 0x51bc8e27672f91b3, + 0x3d84e72a9734bf21, + 0x38c5afba9314be7d, + 0xce8d3f1ba216dce9, + 0x5b93f7dbade9fc57, + 0xfd496a1feafd1bc3, + 0x3ead1b932cef3b41, + 0x92ae1f743bf2489d, + 0x1de63af54af5681b, + 0x32fe8c1545fa9687, + 0xf41a3c5985fb96e3, + 0xdbfc649ba4feb561, + 0xce4b367ba4f1c3bd, + 0x71bfea3ed1f5e23b, + 0xb129a84432e6f1a7, + 0x1c9d74e76feb3215, + 0x4d8913b65bdc3f71, + 0xe1f9a43658af3ecd, + 0x96d7f3e989e26d4b, + 0x7613f4bba8e46cb7, + 0xcb315eaed6e89b25, + 0x28a1ebd1f4ecba91, + 0x7c89def213bca7fd, + 0xb358d1a543d1e76b, + 0xabf42c1761c3f5d7, + 0xae7d3bc98fd91745, + 0xc9d2fe598eda35b1, + 0x7a286bea9abc542f, + 0x6398e5ced9cf528b, + 0xca8f1b4fe9c381f7, + 0x365ef78218c49f65, + 0xb8e2c56435b79ec1, + 0x8cbde6f654b9ac3f, + 0xefa869d6528edc9b, + 0xcb49fd5983c2fb19, + 0x4d61f85bafc41b85, + 0x62f9387dcdb739e1, + 0xd59482afecba385f, + 0xdb7e3ac21a9d46cb, + 0xc637fbd32abf7639, + 0x2458fec768c294a5, + 0xdab865ea98c7b513, + 0xb147c3ea94a8b27f, + 0x387ef9bba389c1eb, + 0x53dfea8cb18cdf49, + 0x78e4f39ede921fb5, + 0x97d5ca821fa64e23, + 0x5673c8a32d963c8f, + 0x5ef719443c784afb, + 0xcba76e354a8d5b69, + 0x2f86397ba68f79d5, + 0x2fa57c4ed7a2b953, + 0x5c1a47eed384b6af, + 0x4ed129b1f398c62d, + 0x923e8d42127be489, + 0x8c512b75418ce3f5, + 0x3fae2c998fa12473, + 0x3f9164e87d8542cf, + 0x28c753dbac98614d, + 0x35e47bddcb685fa9, + 0x9aec137ed96c8e17, + 0xf23149bfe56f9d83, + 0x4769ca5215629adf, + 0xe8a1c4d32374ca5d, + 0x937ae8654256e8c9, + 0xbc473699816bf937, + 0xdf81b24a9f6e18a3, + 0x391b854dce935821, + 0xfb1cad7fec83457d, + 0xd5a14e91fb5764e9, + 0x6cbe47f21c6b9357, + 0x72a56195486d92c3, + 0x32f74ca7687fb241, + 0x92eb34a87452bf8d, + 0xbf4735298254cdf9, + 0xac4de7fcb148fd67, + 0x234f68acbf5a1cd3, + 0x59b278d1fd6e3c51, + 0x978bc3532e5149ad, + 0x84fd75b43d54692b, + 0xe258ac954c356897, + 0xe82cf4d7684a97f3, + 0xc9753deba84db671, + 0x5fc1a7ea953fa4cd, + 0x4f6187bed562e34b, + 0xda7cb94fe145f2b7, + 0xa34921b7647a1325, + 0xe8d34b276f5c4291, + 0x96d3ae865a2b3fed, + 0xf92a16d98c316e5b, + 0x46ad5b2a9a236dc7, + 0x58f169ceda279c35, + 0xa26cf3bfe6389ba1, + 0x2815364fe53cb91f, + 0x5684afc2142fd87b, + 0xa1b796865432f6e7, + 0xc85726fba2371865, + 0x63e2f9a98f2936c1, + 0xe1df34ca9d1b453f, + 0x42f6d9cbac1e539b, + 0xca4b193fec428319, + 0x169b5e81fb24a185, + 0xa12ced6438269fd1, + 0x81e647c43618ad4f, + 0xf94b7cd65419cdab, + 0x415832c8741fec29, + 0xefd57a8cb4231c95, + 0x1c8e462a9de53af1, + 0x8ca265ecbce7396f, + 0x17f36adfeaf947db, + 0x753ce2621bfd6749, + 0x8a1496b329ef86b5, + 0xfb4dec9879f4b623, + 0x21b356e876e5b38f, + 0x179f54a984e7c2fb, + 0x684bef3ba3fbe169, + 0x34acd8fa91dbefc5, + 0x42fe81adced12f43, + 0xc9567f221ec43d9f, + 0x5167f2843be75c1d, + 0xdce96f143bea5c79, + 0x51a78f2548dc7ae5, + 0xe2fa571987df9a63, + 0x5cd31b4a95d2a7bf, + 0xc879ea3cb4e5c73d, + 0x6843b1c1f2d7e5a9, + 0x18ac9e5323dbf517, + 0x251d7b9762de1583, + 0x81a9e4f76eb143df, + 0x63a5dfe98ec4625d, + 0xc19ba6598bd761c9, + 0xe8a7d26cb9ca8f27, + 0xcb36a27ed6bc8e93, + 0xd54be32dc49d8bef, + 0x63b4259215a2cb6d, + 0xcf87649323b4ead9, + 0xa71ec2d652c8fa47, + 0x9bf3614872dc19b3, + 0x51ec36798fbe4931, + 0x73ce952baeb1468d, + 0x7b3f89eedcb365f9, + 0xc36d5721fbc89467, + 0x6de8a3b218ba94d3, + 0x5d69c31548adb351, + 0xc7abd6e5458fb1ad, + 0x9df231c87593df1b, + 0xdce6a78a92a4fe87, + 0x937c85ecb2a81de3, + 0xb673d51dcf9b3d61, + 0x3e29a811fc7e3abd, + 0x758d91332e916a3b, + 0xc5af19632db369a7, + 0x8baf35654cb7a915, + 0x9c1dbe26569ab781, + 0xe21cfa49847ba5ed, + 0x6e175cbba38fd45b, + 0x7fc3861ed492f3c7, + 0x574cb281f2b81435, + 0x436ea97652b943a1, + 0x716eb9854e8b521f, + 0xe48762143c7d4f6b, + 0x2416abe65b816ed7, + 0x14fd837bab839d45, + 0x827f35bed8769cb1, + 0x32b9f1ced568ba2f, + 0x854c27e1f35cd98b, + 0x7623cf92135ed8f7, + 0x5a7c3ed764a31975, + 0x7b543ca9829637d1, + 0x67f321498e79364f, + 0x2f51bd398e6c54ab, + 0x9c7856acbc6e7429, + 0xf5bd294fec71a295, + 0x265c3b1fe975a2f1, + 0xd59cba321846ae5f, + 0x8cdb96432547aecb, + 0x5d9baf47645bed39, + 0xfda35988724efca5, + 0x3afe2d4cb2854c13, + 0xc9f27d1cbe453a7f, + 0x4d65e21dcd3748eb, + 0x15b3cd91fd3c6859, + 0x594cdea21b3e87c5, + 0xa9f1d3c65c61b743, + 0x57cd19376853b49f, + 0x376f41ba9857c41d, + 0xae9f5c1cb54ae279, + 0x6fcd328ba34bf1e5, + 0x52f7ec9ed47f2163, + 0x48abf3ddcd423eaf, + 0xec8b53621f365e2d, + 0x169ed5443e275d89, + 0x9651db354c2a7bf5, + 0x918dc5376a2e9b73, + 0xd1e84bca9731a8cf, + 0x9af34c5cb723c84d, + 0x4f8b769ed425e6b9, + 0xd6c472afe43af627, + 0xb17def93254d1693, + 0x4cd7e357613d24ef, + 0x7d35a4198f12536d, + 0x3e4f12698e1562d9, + 0x4fe9a76cbd2a9147, + 0x89e4afbdc91b8fa3, + 0x2f7361bdc83dae21, + 0x9264b5c1f621bc7d, + 0xfc347d132613dbe9, + 0xe5fd18c43416fb57, + 0xfeb2c83875291ac3, + 0x632e184a952d3a41, + 0xf94be1d76cfe379d, + 0xceb3d89badf2671b, + 0x79561feedcf39587, + 0xeb76f1aedaf795e3, + 0xbc83f16329fab461, + 0x7f9856e436fca2bd, + 0x9a218bd656efd13b, + 0xf5be2a1764d2ef97, + 0xace5f3ba94d61ef3, + 0x6493825cb2f93e71, + 0x215af4398fe93bcd, + 0x178e9d51fade5c4b, + 0xe1d56a732de16ab7, + 0x47cb61243ce49a25, + 0xd197e3854ae6b891, + 0xf587dbc545c8a6fd, + 0xcb5f14e984ecd56b, + 0x27c35afa93bfe4d7, + 0x2af915bed7e31645, + 0xd1865741f2e734b1, + 0x2f7cbe5541d9532f, + 0x214d5ac43fdc518b, + 0x792f5d143bac5fe7, + 0xcd2be4687bc19e65, + 0xc63af2e878b49dc1, + 0xea351c4a97c6ab3f, + 0x3da8269fe4c7da9b, + 0x53c869d1f4bcea19, + 0x984a5cd213bef985, + 0x7b8e35d765c438e1, + 0xa657123981c6375f, + 0xce974b876fa845cb, + 0x2e3d91f98ebc7539, + 0xafde721a9cbe83a5, + 0x2f398a7feac2b413, + 0xbd86713fe8a4b17f, + 0x89f36dc21685afdb, + 0xcd3b748325a8de49, + 0x8a571fc5438afdb5, + 0x537d69a985af1d23, + 0x6712ea4a91a23b8f, + 0x7183c6dbae8549fb, + 0xa817e34edeb85a69, + 0xa4657d11fc9b78d5, + 0xf42d89b21c9ea853, + 0xbe98fd443981b5af, + 0xc348d2a76894c52d, + 0x5c1342e875a6e389, + 0x19dfe2cba489e2f5, + 0xa39bd5edc5ad1273, + 0xd142537cb28e31cf, + 0xf69e3d1dce825f3d, + 0x6e9fbc821f745ea9, + 0x9148ebc43e698d17, + 0xdb1ce2f54d6b9c83, + 0xbc9df215475c89df, + 0x14ef523ba871c95d, + 0xfc6a852cb563e7c9, + 0xc2f8693ed496f837, + 0xb9845c71f48b17a3, + 0xd584b194359d4721, + 0xf268ae96518f347d, + 0xad4826765f7263e9, + 0x952137bbae869257, + 0xe8b762dbad6891c3, + 0xd93ae2fdc96baf31, + 0x58f6d79cb64cae8d, + 0xc9fb341fe651dcf9, + 0x4a7b59d21853fc67, + 0x6b528df545671bd3, + 0xfb491da9847a3b51, + 0x2d5ac648715c38ad, + 0x7ea3b4da9e4f582b, + 0x58f2d34dce428697, + 0x65e392cedc4596f3, + 0xb243cd51fc49b571, + 0xd5b6fa821849a3cd, + 0x49f7e164385ed24b, + 0xfc1938576852f1b7, + 0xdae951fcb9873125, + 0xe36d159cb4573f81, + 0x57c4f89ba1483ced, + 0x25bf6dcbaf2c4d5b, + 0x64a8b59fed2f5bc7, + 0xea2947521e429b35, + 0xc8e7ab554d35b9a1, + 0xd8c3be765a37b81f, + 0xc317ed86582ad67b, + 0x143cf82a962cd5e7, + 0x437659ced9421765, + 0x8391bc6fe74635c1, + 0xbd62a3cfe128543f, + 0x713a56c5413a529b, + 0x8b4ca1f65f3d7219, + 0x736ce9d54c1e8f75, + 0x2d54f9187b239ed1, + 0x762193e98915ac4f, + 0xb2d185aa9716dcab, + 0x92f6bc8ed61aeb29, + 0xf9436dbfe41dfa95, + 0x6c28b316574239f1, + 0x59c6b1387514386f, + 0x1be45d99821746db, + 0x7dc26bf65efa7649, + 0xef5ba1687dfc84b5, + 0x5621f7ea9bfea523, + 0x387b9d4dc9e1b28f, + 0x6f3a4c9ed7e4c1fb, + 0x49c7fd3217e6df59, + 0xa41ce8d324d8fec5, + 0x63bae8c876fc1e43, + 0xb74d15f763de2c9f, + 0x3562e1ba92f35b1d, + 0x9564b2cbafe45b79, + 0xe532864cbcd879e5, + 0x8b3a9611fbeca963, + 0x4b85da6218cd96bf, + 0xdb8ac52549e1c63d, + 0x14ba28f657d3e4a9, + 0xad132b7a96d8f417, + 0x25d749cba6eb1483, + 0xd2c64e3a94cb32df, + 0x7f1c6d4cb2cf415d, + 0x3829eb4edec25fb9, + 0x2b769a421fc58e27, + 0xcf79ab632ec78d93, + 0x6e41852437b98aef, + 0x7f95bde5479eba6d, + 0xa21c9fd876b1e8d9, + 0xd8e2931cb6c3f947, + 0x347c561fe5d718b3, + 0x359bd8a1f5db4831, + 0xaf386dc212bc358d, + 0xb98a15f431be54f9, + 0x18a9bec65fc29367, + 0x5e1d3fb87eb692d3, + 0x76325dc98dc9b251, + 0xd6c5782cb678af9d, + 0x42e8fdbba68dce1b, + 0xa391472fe5a1fd87, + 0xa8b47ed327a51ce3, + 0x8c5eda3545b83c61, + 0x2c73e18652a839bd, + 0x439ed86871ad593b, + 0x19382ab76e9f58a7, + 0xb98a651dceb3a815, + 0x41a9d68feda5b681, + 0xe6b38751f987a4ed, + 0xef4ba282198ad35b, + 0x78b1f6d4368de2c7, + 0x62f31ac989b41235, + 0x2f1ac5da97b642a1, + 0x46c8fa3a92863efd, + 0x8e41392dc1894e6b, + 0x537261dbaf6b5cd7, + 0xcd12f35fed7f8c45, + 0x1d47fec32e739ab1, + 0x62eb48f43c75b92f, + 0x4a6571843a56d78b, + 0xb71c8695485ad6f7, + 0x1e52b73ba48df675, + 0x9fb42d7dc79236d1, + 0x765b213ed296354f, + 0x392bac71f18753ab, + 0xa7c3e9f5418b7329, + 0x58647ce43f6d8195, + 0xc7f5d3a54b5d8fe1, + 0x946bfe587b62ad5f, + 0xb8d95f687854adcb, + 0x76f2e41cb857ec39, + 0xf4b1e3ced649fba5, + 0x9763b4d1f67e2b13, + 0xc39b7ef32561397f, + 0xd9c8e626526347eb, + 0xbe876fdba1486759, + 0xf69213487f3a86c5, + 0xd4217a8a9e5da643, + 0x1d3c64a98b4ea39f, + 0xf3685d1fea64c31d, + 0x9b8d4121fa45e179, + 0x8a4ce6f21837efd5, + 0x1e73bd85486b1f53, + 0x7c3bd597654c2daf, + 0xc837edaa94615c2d, + 0x98aedf5cb1435c89, + 0x61a8297cbe267af5, + 0x51823a4ede2b9a73, + 0xc9ad128fea2b97cf, + 0xca3b54621a2fb74d, + 0x2dcabf654a32e5b9, + 0xc21e73498a36f527, + 0x821c473cb84a1593, + 0xd581bc4a964a23ef, + 0xfa3dce6cb53e426d, + 0xf94a5d6fe34261d9, + 0x43b287fede148f37, + 0x9c1b56732f168ea3, + 0x72bfae665e39ad21, + 0x85e93b65491cab7d, + 0xc98eab36571fcae9, + 0x346c7adcb912fa57, + 0x8145632ed82619c3, + 0x5b97d1cfe72a3941, + 0xb843d651f41b369d, + 0x91f56a74342e561b, + 0x249b1fc763219487, + 0x8e45d1776df294e3, + 0xc9a172398df7b361, + 0xc541dae769f7a1bd, + 0xc4716af987e9cf2b, + 0x4c6358bba5fcde97, + 0xd264e91dc7e21df3, + 0x5dceb4f328f53d71, + 0xf9ce8d3324f63acd, + 0xd1fa492762f95a4b, + 0x8a14395761fd59b7, + 0x8f692ea87edf8925, + 0xe57b6f8bade3b791, + 0x96fa32dcb9c4a5fd, + 0xe7a62591f9e8d46b, + 0x3597b8c218cae3d7, + 0xde2418a438cdf245, + 0x54fc962878e243b1, + 0x3ab24cfa97d6512f, + 0xfd431eca92d64f7b, + 0x4b6d157ba1c95de7, + 0xcbed312bafbc8d65, + 0x9c163f2fedaf8bc1, + 0x4fd7a3521dc2ba3f, + 0xe69134832ac4d89b, + 0x1c28abe54ac7e819, + 0x259fc68546cbf785, + 0x82b7cf5a96bd27e1, + 0x1af2e79cb7c1365f, + 0xcda357ffe2d354cb, + 0xb264e931f1d87439, + 0xe1897a4431db82a5, + 0x3267a4c65fbda213, + 0x957e1cb43b8d9e6f, + 0x16e4d8a65982aedb, + 0xd4c23b6878a5ed49, + 0xb15d4e9ba697fcb5, + 0xa7c24f9fe7ab1c23, + 0xac9542ffe49d2a8f, + 0x4dc3a6e325a148fb, + 0x26f17db542c35869, + 0xd73e128541b687d5, + 0xad5f27b76f9ba753, + 0x57f192d76d7c94af, + 0xe6f732da9a8fb42d, + 0xc2a38f4edba3e289, + 0x8ef46c5ed896e1f5, + 0x1f593d8549ba2173, + 0x457fe69435792ebf, + 0xc28adf47658c4e3d, + 0xe583642873815da9, + 0xe296357cb2a48c17, + 0xed513f4dcf769b83, + 0xcdf4a52cbc5798df, + 0x46a91c71fa6cb85d, + 0x268cb3721a5fd6c9, + 0xfdc752b54b92f637, + 0x1a4cfd865b9716a3, + 0xac24381cb89a4621, + 0x9f2c61bba58b437d, + 0x5834edccb37d52e9, + 0xfdc4635fe3a29157, + 0x9c5173fede648fb3, + 0xb9af75832f67ae31, + 0x74f61dc32e47ac8d, + 0x8561b244384acbf9, + 0x92ab3cf6594feb67, + 0xdec5a71cb9741ad3, + 0xc46e581ed9873a51, + 0xaf63d7cfe45837ad, + 0xb152a961f36c572b, + 0xea564822124e6597, + 0x28bcfa37627195f3, + 0xa672e4d98f65b471, + 0x85d4fb287e46a2cd, + 0xcadf41698c59d14b, + 0xd56a137a983bdfa7, + 0xd29853ccb84dfe15, + 0xbd5e3791f9643e81, + 0xde8bf3a217453bed, + 0xb8ae6f7326384c5b, + 0x27b1a537623b5ac7, + 0x2f8547ca914e8a35, + 0x3c12f76a9f42b8a1, + 0x2ce4531bad34b71f, + 0x47b12dffec26d57b, + 0x9a5c18d1fa29d4e7, + 0x8657fde21a2cf365, + 0xf8e7a237695f24c1, + 0x2cba5f798964523f, + 0xb4d1e97ba736519b, + 0x9b3dfe2ba3285ef7, + 0xb6e4f75dc12b8e75, + 0xfe2d967baf2e8cd1, + 0x65a8c49fed21ab4f, + 0xf4a615b32e13d9ab, + 0x3ae169d54c16ea29, + 0x5f9db3c54b1af895, + 0x426319a8793c28f1, + 0x6312ecdba81e276f, + 0x7e2dba4dc71245db, + 0x4821f73fe3167549, + 0xba862391f21983b5, + 0xaf192877651ca423, + 0x41b7a8643deca18f, + 0x16a5dc2438cd9feb, + 0xf91b38476af2de59, + 0x2b4e6fc878e4fdc5, + 0x91d48c3cb8f91d43, + 0xf4d8159dc5ea2b9f, + 0x815ab4fdc5fe4a1d, + 0x849e51d324f15a79, + 0x9e18357542f378e5, + 0x2b9e7f3651f7a863, + 0xdf56e7854ed895bf, + 0xbc135ef87aecb53d, + 0x8c3f192878cfd3a9, + 0x63197abdcad4f317, + 0x95e1ab71fae71283, + 0x1c8f7b4327c831df, + 0x6cba35d326ca3f4d, + 0x4bde13a653cd4eb9, + 0x13657bca94e18d27, + 0x64eb387ba1e48c93, + 0x36ea9cb87db589ef, + 0x9f61c45baec8b96d, + 0x4867c5b1f8abc7d9, + 0x86f3dbc21abfe847, + 0xcf748db65ad417b3, + 0x935bd7a76ad84731, + 0x125ce4a876c9348d, + 0xcd1fab6984cb53f9, + 0x12fe86dcb3ce8267, + 0xc8d7a21fe4c291d3, + 0xb6f831cedeb5af41, + 0x69ca5e421f85ae9d, + 0x17fd62843e98cd1b, + 0x7cd8e4643a9bec87, + 0x1ca6e296578dfae3, + 0xfe82639ba9c43b61, + 0xe3496addc6a538bd, + 0x392fb56fe4c9583b, + 0x91ec42b1f2bc56a7, + 0x58b43df323be9715, + 0xd8c3e45763c2b581, + 0x9e1f8ab65f84a3ed, + 0xe8472c976e97d25b, + 0xe58b9d476b89e1c7, + 0x3718d64ba98bef25, + 0x58fda17dc78e2f91, + 0x4a1cf75fe6823cfd, + 0xde8cb94217954d6b, + 0x6d3af41323985bd7, + 0xa8c1bd47629c8b45, + 0x8a1bd757627e89b1, + 0xbac5fd4a9e71b82f, + 0x7e4316cbae73d68b, + 0x6be923fdcb86d5f7, + 0x75b128dfeb8af475, + 0x26c89b543a8c25d1, + 0xe97b1c36598e234f, + 0x58e9fd47678352ab, + 0x1482a3ccb5a67129, + 0x62e1385cb2697f85, + 0x95cfa76cb26a8de1, + 0x8c4e69dbae4d9c5f, + 0xe543a721fe51dacb, + 0x963ab8421d64eb39, + 0xda594c832c46f9a5, + 0x1a23d8c76c7b2a13, + 0xbd74f1e7695c287f, + 0xc472aefa975f36eb, + 0x38e5cb7ed4827659, + 0x6d8a95ffe27684c5, + 0xa564e7d1f179a543, + 0xdaf78214315ba29f, + 0x15627dc54f5eb21d, + 0xf41dae665c41df69, + 0x1385ce687a43fed5, + 0xb7c3129bab681e53, + 0xa139edfcb7482caf, + 0x26d7193fe75c4b2d, + 0x7d94c35fe53f4b89, + 0xc34f2762164279f5, + 0x193e4c276245a973, + 0xc6ad23b6513796cf, + 0xc8ad19487f2ab64d, + 0xa92681f87c2ed4b9, + 0xa7c4e38cbc51f427, + 0x687d4bffec561493, + 0xab16f95ed94732ef, + 0x5e8ac7b3293a416d, + 0x6ed2f944362b4fc9, + 0xacd45be9852f6e37, + 0xcea465ba95428da3, + 0xe5263a9cb346ac21, + 0x271f48ca9f16ba7d, + 0xc67d58acbd1ac8e9, + 0x8729c531fb1de957, + 0xd1f786365d4218c3, + 0x5fbd18a87c263841, + 0x9f435c776a17359d, + 0x4a7d6c5a982a651b, + 0x21845dfcb51d6387, + 0xda4f168cb51f82e3, + 0x8fb7324fe534b261, + 0x7198da3cbce39fad, + 0x63f2e8a21df6ce2b, + 0x4f6b85e32bf8ed97, + 0xb7a93de548daebf3, + 0x87fade1769ef2c71, + 0xb2a9c56987f239cd, + 0xaf13e9bdc7f6594b, + 0x7ef61caed3f958b7, + 0x5478fd9fe3fc9825, + 0x54abd37323fea691, + 0x8fd9264652e1a4fd, + 0x1c82be965fe4d36b, + 0xbfce31265bc6e2d7, + 0x3b71d2c98bdaf145, + 0x2be376dba9ed32b1, + 0x32e6458ba7bd3e1f, + 0x4d38a7c1f6d24e7b, + 0x5b7c293216d45ce7, + 0x4f9e7da323e98c65, + 0x2f8e1cb653eb8ac1, + 0xfb97523761cda93f, + 0xc5f1b9e76fc1d79b, + 0xb4e2c36badc4e719, + 0xc471fa6edbc7f685, + 0x4673e2a1f9ca26e1, + 0xf4c7d29219bc245f, + 0x7a31968327af43cb, + 0x7ab4293768d47239, + 0xd8431a6a94d681a5, + 0xa8db625a93b78ef1, + 0x2bc451f981ba9d6f, + 0xf29a7c398f7e9cdb, + 0x8e31b2a1fda1ec49, + 0x7a8c34521d93fab5, + 0xe8a196765dc81b23, + 0x61f38eb547ba298f, + 0xfd643e16569c37fb, + 0xf71238eba5bf4769, + 0x5d8e741dc4b286d5, + 0x49c8db1fe2c7a653, + 0x2b4cd36fe1b793af, + 0xb83162c5419ab32d, + 0xefad12643f7ed189, + 0x18cf39754b81dfe5, + 0xfe6934798ca51f63, + 0x2e5a8b6879862dbf, + 0xa7d5e48cb7894c3d, + 0xdabfc48fe57d4ca9, + 0x439d7c1fe49f6b17, + 0x7456bda215b29a83, + 0x8ced42f4328497df, + 0x67fd2a854198b75d, + 0x1da2cb954f6ad5c9, + 0xbed25a6a9c8de537, + 0x175a29edcd9215a3, + 0xdb2a351feca74521, + 0x19e38a21fa98427d, + 0x963e7a13287a51e9, + 0x4dae19b3258c6f47, + 0xd9f718e6546f7eb3, + 0x3a4c21da9584ad31, + 0xdbf451ca9164ab8d, + 0x91c7f2e98e46caf9, + 0x31b875ddcd4bea67, + 0xa1c984bfea5cf8d3, + 0xbf57ec254d823951, + 0x5bd7e3a32b7436ad, + 0x5fe732b54a78562b, + 0x1ed67fcba85b6497, + 0xd2be486ba56c84f3, + 0x5b28fe7dc46fa371, + 0x8f4b72cfe263a1cd, + 0x547e9bfede45cf3b, + 0x8dfa74621f36dea7, + 0x6519ab743c4afd15, + 0xed3c71b76b5e2d81, + 0x8fda539879513aed, + 0xefdb7a8dc9634a5b, + 0xc4319b7ed83659c7, + 0x16b793ffe64b8935, + 0xa3627191f34d97a1, + 0xd865fb73234ea61f, + 0x48b5ea376152d47b, + 0x2bae4d376f25d3e7, + 0x465b9e298d39f265, + 0x7b243e5a9d5b23c1, + 0x46e891ccba5d413f, + 0x269ce1aed9314f8b, + 0x3f1cb76fe8235df7, + 0xf4523d9219268d75, + 0xbd71e65545398bd1, + 0x895cda27632c9a4f, + 0x72bde347612fc8ab, + 0x75c924fbaf13e829, + 0x862ec45cbd14f795, + 0xc267fb3edc3927f1, + 0xf734c9dfea1b256f, + 0xf18bc973291e34db, + 0x31985ba76b217349, + 0xe3184b58791482b5, + 0xed68925cb748a123, + 0x3789d2cba3189e7f, + 0xdc1ab3f9821a9deb, + 0x65ab72f98bfecd59, + 0xc23e847edae1fbc5, + 0xf6c957832df61c43, + 0x9f1b2ce43be62a9f, + 0xcdb497f658fa491d, + 0x82b1ea4656fd4879, + 0xce78f3aa94df67e5, + 0xa8247d1dc5f2a763, + 0x7df1a6bdc2e594bf, + 0x5917c82fe1f8b43d, + 0x1b9254d431fbd2a9, + 0x86d12b954fcde217, + 0xa9fc85d87de42183, + 0x18abd2e769b42ecf, + 0x4ceb57a989c73e4d, + 0x318cde6ba6e84db9, + 0xfd42573cb5ed6c27, + 0x3bf4279fe4df7b93, + 0xca43d65214c298ef, + 0xd15a849432e4b86d, + 0xd76b823541e7c6d9, + 0x7dc316a65fcbe647, + 0xce96dab87cadf5b3, + 0x69e3f7acbcd24631, + 0x19f5c78feac5438d, + 0xaf2d854fe8c752f9, + 0x64315da329db8167, + 0xc95a136325ab7fc3, + 0xe14cf93765bf9e41, + 0x4cfba7e763b2ac9d, + 0x714eba9982a5dc1b, + 0x4bce6a2a9fa6eb87, + 0x7fd16e8cbc8af9e3, + 0xb4195721fcbe2a61, + 0x8a7495332ca137bd, + 0x1e549d832ac4573b, + 0x8c7a6ef439c865a7, + 0xf61d3c2987cb9615, + 0x3d248a5a95bda481, + 0x8c9de62ba38f92ed, + 0x79a1f8bfe2a3d15b, + 0xdfa2be5dce84dfb7, + 0xe926bcf21d98fe25, + 0xef816d754d8b2e91, + 0x127f3ac5497c2bfd, + 0xcf4e39b87a914c6b, + 0xc64e187cb8935ad7, + 0x52f97c4ed6b78a45, + 0xd73a6c1fe47a98b1, + 0xc8bd426fe38ca72f, + 0x38ec6542127fc58b, + 0xda1b82365192d4f7, + 0x812f9c654e96f375, + 0xa32c58987e8924d1, + 0x2af468da9c8b324f, + 0xb274f3edc97e41ab, + 0x9feba26eda826f19, + 0xdeb29451f6937e85, + 0x7c3ba19325768ce1, + 0x98d5f76323689b5f, + 0xf73da9b5425da9cb, + 0x3562d8a8716fda39, + 0xc78d6fba9e62f8a5, + 0x842563edce872913, + 0xfa513b8edc59267f, + 0x7d43ae51f96a35eb, + 0x23ba5d621b7e6459, + 0x6dca9b854a7183c5, + 0x8325f6187986a243, + 0x2af51e798456a19f, + 0xc7269b4982479efb, + 0x9174c32ba14bce69, + 0x4f75d18a9b3fecd5, + 0x36bdc2a1fe741d53, + 0x93cf4ed21d452baf, + 0x76a412543c584a2d, + 0x6fae48365b3c4a89, + 0x548d9f18793d68f5, + 0xf36e4d8dc951a873, + 0x76c4581cb64395cf, + 0x91cf52afe237b54d, + 0xce2b4811f148d3b9, + 0x6bc21d95415ce327, + 0x4763a2b65d4ef193, + 0x9cf412e87c5431ef, + 0x2e75ab398b263f5d, + 0xa3fdc4b98a274ec9, + 0x16eab48dc92b6d37, + 0x293cb58ed62e7ca3, + 0x38479db1f753ab21, + 0xcbd628e21523b97d, + 0xbd98c1654325c7e9, + 0xbfae8347612ae857, + 0xa8ce4d687e1bf6c3, + 0x3874fdebad3f2741, + 0x8ed4f23cbc12349d, + 0x476bd83fec27641b, + 0x76c592d1fb1a6287, + 0xf5b98ae5492b81e3, + 0x39f57c15472d9f51, + 0x3be5a1c765219ead, + 0xbe62ac398514cd2b, + 0xc7fe568ba215ec97, + 0x73c415f98cd7eaf3, + 0xb7d5f36badfc2b71, + 0x218fe69cb9fe28cd, + 0xcf8645a32cf1584b, + 0x6c93fe432af356b7, + 0xced527154af89725, + 0x8cd35b6876fba591, + 0x31abc94874eb93fd, + 0x7ea6314a93efc26b, + 0x546c9a1cb2f3e1d7, + 0xfd5814acbdc6ef35, + 0x165c82b43ed82fa1, + 0xb6af3e854bca3d1f, + 0x3a9edb8549ce3d7b, + 0xc4d87ef769d15be7, + 0xe674dc2ba9e38b65, + 0xc9f384acb5e689c1, + 0xa697bf1dc4d9a83f, + 0xcad5be91f2edc69b, + 0x8f5a9ce323cfd619, + 0x52ab3dc761d2f485, + 0xaeb572476fc725e1, + 0x851bc4987dc9235f, + 0xa421e68879da42cb, + 0x5dca219cbace6139, + 0xb12c493ed8c17f95, + 0x14c72dafe6b48df1, + 0x7e82fb4214b59c6f, + 0x58ad639323c79adb, + 0x8e1739b652acdb49, + 0x51f4bc3761afe9b5, + 0x2decbf3a9fc51a23, + 0xf981b53badb5278f, + 0x9f65b32edca836fb, + 0x4d6b38e1fabc4569, + 0xc38bef5219ae74d5, + 0xc94d7af769c1a453, + 0x29bc8d4656b492af, + 0xbc1fe59985a7b12d, + 0xd5fb9a1762a8cf79, + 0x1fd3587a918acde5, + 0x2ed7483bac8efd63, + 0x193f5c7fed832cbf, + 0xc9e28a721e964b3d, + 0xb31a7e932d874ba9, + 0x36719af54b9c6a17, + 0xc64a218656ae7983, + 0x8947dc3ba58196df, + 0x457f38bdc493b65d, + 0x91a26c7fe286d4c9, + 0xa5b91c61f19ae437, + 0xf15697b5418cf2a3, + 0xc32d8b476e9f3421, + 0x8bdc4fe76e93417d, + 0x94bc72e76b754fd9, + 0x4978b25bab896e47, + 0x27b1934dc86a7db3, + 0x3c7e5f2ed67e9c31, + 0x83e2acb1f461ba8d, + 0x4dbae6921463c8f9, + 0xf5c7b6d43285e967, + 0xdf82ab365169f7d3, + 0x8fdc315a9f7d2851, + 0x5bcf6d398c6f25ad, + 0x4316ba7dcd83652b, + 0xa853c62fec856397, + 0x4ac672ffea6982f3, + 0x41defb74396ca271, + 0xcf743b13254c8fbd, + 0x895c1a287561ce3b, + 0xe6b9c3198253eda7, + 0x8472fb1ba267fc15, + 0x2e97d4ccbf5a2c81, + 0x4627c9ebac4b29ed, + 0x6952fa3fec4f395b, + 0xc8695bd21d4258c7, + 0xe67b81f32c469835, + 0x218476c65b4896a1, + 0xfbc463d9874ba51f, + 0xadbe723a954ec37b, + 0x3a2596dcb451d2e7, + 0x49a3b1ced274f165, + 0x83625c1fef5832c1, + 0x78bcf3521d493e2f, + 0x85daefb54d2c3e8b, + 0x6e4afc165a2e4cf7, + 0x1d8e6f5a9b328c75, + 0x7f41ed9cb9358ad1, + 0x19e37d6dc627a94f, + 0x2f75c81fe429c7ab, + 0x968ad2b1f43ed729, + 0x8d9ac7132431f695, + 0xeba47269834526f1, + 0x4298fc587e18246f, + 0x9acf3d687e1943db, + 0x25d617ebac1d6249, + 0xe2f64b1dca2f71b5, + 0x81e976aeda249f13, + 0x25c8ab6fe6149d7f, + 0xd6fab85325169ceb, + 0x8b4152c4341adc59, + 0x5ca4e8d7631deac5, + 0xd38f71eba6521b43, + 0xd82a69487de3289f, + 0x81e94c7bacf6481d, + 0xe4bc187edcfa4679, + 0x4c372e8ed9fb76e5, + 0xf5267b421afe9563, + 0xe586dca547e193bf, + 0x1b3d4ea767f5b23d, + 0x16c4e58874f6d1a9, + 0x8cd943a872d8cef5, + 0xc7a843fa91dbfe73, + 0xc52a46f98bae1dcf, + 0xeb516981fbe23c4d, + 0xd94bfac21de54cb9, + 0xdfe928743ce96b27, + 0x39278d6548ec7a93, + 0x3fbe9c1545bc87ef, + 0x67dce2fa95e1b76d, + 0x5829e7bba4e3c5d9, + 0x87d41a3dc2d8e547, + 0x48236c1fe1d9f4b3, + 0x38d491e764ed2531, + 0xd3b98c754ebf328d, + 0x458b7d376dc351f9, + 0x56e9cfa98bc46f57, + 0x9d3c128769b87ec3, + 0x652de97ba7cb9d41, + 0x974d68fdc4ae8b9d, + 0x14b25781f5c2da1b, + 0xc523be4214c3ea87, + 0xf79cd2b542b6f8e3, + 0xdc92ae3873db2961, + 0x2eb786c65f9c26bd, + 0xf1a65b798daf463b, + 0x7d352f4cbdc264a7, + 0xf7a4592febc79415, + 0xd96a3411f7c9a381, + 0x859da613268a91ed, + 0xab614373258daf4b, + 0x326fbdc65491deb7, + 0x5de74bf983a4fd25, + 0xb96cd1eba3b72d91, + 0x23d184ba9e782afd, + 0x685241fdce8d3a6b, + 0x5da36c4feb8f49d7, + 0x6df849a21db28945, + 0xb1cafd743ca597b1, + 0x89e5a1d54798a62f, + 0xc5ea9837657ac48b, + 0x851ecd4a948dc3f7, + 0x17d8af2dc4a1f275, + 0xd842fa5fe4a623d1, + 0x6139a27ede98314f, + 0x635b2ca21e683f9b, + 0x691478f43d7c5e19, + 0xd69b21f43b7f6d85, + 0x52ec1f476a738be1, + 0xafd576ccb8749a5f, + 0xe47a3bfed456a8cb, + 0xdf5c193fe46bd839, + 0xdbe481a1f26de7a5, + 0x8a13f46656a42813, + 0xc3fe7d576194257f, + 0x34fac2965f6734eb, + 0x56e9da298e7b6359, + 0x83b21d6a9b6d72c5, + 0xd42879bdcb7f9143, + 0xe7d613adc7529e8f, + 0x789f2b4fe6549dfb, + 0xacb97ed21547cd69, + 0xa65c87f32349ebd5, + 0x6e5fd1a8726dfb53, + 0xa9c17259836129af, + 0xc7298bfbaf65492d, + 0x89f5371dce364789, + 0x68a5473edc3a67f5, + 0x5b12cde1fb4d9673, + 0x2589f762193e84cf, + 0xd7ec13865962b34d, + 0xf8b94e376745d2b9, + 0x1c5f9d7ba659e127, + 0x17d4aeca924aef83, + 0x6cde345a924b1edf, + 0x56a2347cbf413e5d, + 0x9b456ea1fe234dc9, + 0x7948cba21e286c37, + 0xdabc2f154d297ba3, + 0x8ba51ed76b4d9a21, + 0x7f892e46562fa87d, + 0xcf4596eba732c6e9, + 0xfa1be93dc824e657, + 0x175ef82ed428f5c3, + 0x8931c2b1f35c2641, + 0x12a3cdb6514e239d, + 0x3841f2a87f42631b, + 0x6afb7c2a9e246187, + 0x4153fac98b167fd3, + 0xda762eb98b2a9e51, + 0x8631da4a961b8cad, + 0x4fb185ced61fac2b, + 0xc123db71f512eb97, + 0x4fbad9632615e9f3, + 0xfd132a9765392a71, + 0xe1c7b597631a27cd, + 0x2bcfd3176efd374b, + 0xec61f7b98cef45b7, + 0x6247edfcbcf39625, + 0x31a5869edbf6a491, + 0xe64b1fddc6e792fd, + 0xc1d86a4327fac16b, + 0xf49c7ae324edbfc7, + 0x263afcb876d1fe35, + 0x935e7b2984f52ea1, + 0x3c7ab8ea92e73c1f, + 0x4e6ca7398fe93c7b, + 0x2bd41aca9bdc4ae7, + 0xf73a4c6febdf7a65, + 0x17d5e9a32be398c1, + 0xb8f739e329d5a73f, + 0x4b98c76436e7c59b, + 0x481ad5e876ebd519, + 0x23d5ab1a94cde385, + 0x459d61ecb6d324e1, + 0xa5d879bdc1d6325f, + 0x714563dfefd741cb, + 0xfd5978621eca5f29, + 0xc453a6832dbc6e95, + 0xedf2b9c549ae7cf1, + 0x1ed3caf658c29b6f, + 0x2ca8e96876c4a9db, + 0x5dc186ecb5c7da49, + 0x529f6baed3cae8b5, + 0xc9862a7fe4bdf823, + 0x75b9fe1434c1268f, + 0x2e4d371761c435fb, + 0xa9e615243fc85469, + 0x23fbde176eba73d5, + 0x3471bdc98cbd9253, + 0xd342a67cb79e81af, + 0x8a67b23dc793af1d, + 0x57cde461f5a4ce79, + 0xfe8d25921497dce5, + 0x469b75e3249afc63, + 0x8ec31df6538d1abf, + 0x65c1e9d982b14a3d, + 0xc34be8a87fb348a9, + 0xe28465bdceb86917, + 0x7b82c14fedab9783, + 0x1432d79fe97b85df, + 0x9f867cb2198fa45d, + 0xa6bfe3c54782d3c9, + 0xde17b3a658a6e237, + 0x914a53c87598f1a3, + 0xd49a5f6cb6ac4321, + 0x376b512ba18c2f6d, + 0xa2d78c5cbf714ed9, + 0x97836d11fe936d47, + 0x3b62a4e21e867cb3, + 0xef965d154d7a9b31, + 0x6e852b14375ca98d, + 0x18b26f95465eb7f9, + 0x31e9cf4cb592e867, + 0x65da91ecb485f6d3, + 0xf38d916fe49a2751, + 0x1c8d72a1f17b24ad, + 0xcdb9ea74318e542b, + 0x259ba7c54f816297, + 0x29f1c5776d7581f3, + 0xde47c9a98c579f61, + 0x2d184fb769478ebd, + 0xb4ad5c3a975cad3b, + 0x5186c4acb54fdca7, + 0x382649afe673fb15, + 0xfae154b435762b81, + 0x369187c5435728ed, + 0xcfeb2188716c385b, + 0xb7fe26498f3e46c7, + 0x3c71f85cbe619735, + 0x952347edcd6495a1, + 0x81a7c6eedb57a41f, + 0x5e3d6a41f849c27b, + 0x9f1d48c3284bc1e7, + 0xf597ce63273edf45, + 0x94b3dae987642fb1, + 0x84aefd2a94563d2f, + 0xb539c2dba1473d8b, + 0xcae826fa9e2a4bf7, + 0x6b57da4dcd2e6b75, + 0xa54c96e1fc4289d1, + 0xc5b432621c23a84f, + 0x4cde12743925c6ab, + 0x1c389266583ad629, + 0xcb512369872ce495, + 0xd34cbe8a963de4f1, + 0x9b6f238dc754236f, + 0xb7234adfe13642db, + 0x58f3297fef2a6149, + 0x86f75b132e1b6fa5, + 0x1ae94d365c2d8e13, + 0x81dace365b219c7f, + 0x8bc53da768139aeb, + 0xd5e13b9ba816db59, + 0x13c62aecb618e9c5, + 0x6f2713bed61cf943, + 0x192e453ed42e179f, + 0x367bc1865623471d, + 0xb14e92c982164579, + 0xba1c64d43df874e5, + 0xb4ced1587dfb9463, + 0xd485129769ec82bf, + 0x13bfd57a98efa13d, + 0x4fe8759cb6e2cf89, + 0xdca5f34cb6e4cdf5, + 0xe6bd53f215e8fd73, + 0xef5c6a7434e91bcf, + 0x3deab25763fe2b4d, + 0x4b91afd872f14ab9, + 0x16d254aa9fe46a27, + 0x79ec542cbde67893, + 0x1f47936cbac986ef, + 0x6ab98e11f8eca56d, + 0xfbce978217cfb4d9, + 0x89721b3659d2e347, + 0xcd6b879657d6f2b3, + 0xecd3b76a97ea2431, + 0xd5b31cfa94eb318d, + 0x4637da1981bc3fe9, + 0x96f1a34cbfc16e57, + 0x6da5e891feb47dc3, + 0xdf38e5632ed79c41, + 0x937fe6432bc78a9d, + 0xf32bc6e547adc91b, + 0x63c9be7545bfd987, + 0xa6e3215a96b2f7e3, + 0xd65ae82dc5d72861, + 0x698a14cfe3c825bd, + 0x24cae8b1f1dc453b, + 0x8d69b7e321ce53a7, + 0x8ce7bfa76fc29315, + 0xad1b9c776ec5a281, + 0xb936fca54a958fcd, + 0xf75ca4e76798ae4b, + 0x341e28aa958acdb7, + 0x7d4e5f6cb69fec25, + 0xc3ea65b1f6b42c91, + 0xf54e9d7214a529fd, + 0x138d9b2542c8396b, + 0xfeb8c61651ab48d7, + 0x7328eab76fae7845, + 0x31a6d5e98ea296b1, + 0x973e845cbc94a52f, + 0xc79a845fea96c38b, + 0xfab2319fe689c2f7, + 0x4e16bc73289ce175, + 0x5bacf144357defc1, + 0xf12e43c876942e3f, + 0xcf583ba872853e9b, + 0xfe8d152cb2a85d19, + 0xb7c412fbaf7b6c85, + 0x271c49dcbc6d7ae1, + 0x4c63db8fec71a95f, + 0x528ed7621d63a7cb, + 0xc86b49332b86d739, + 0x4f1c76a43879e6a5, + 0x423f57ba978cf613, + 0xb86135cba58e147f, + 0x914afe8dc58243eb, + 0xa8271d3fe1a76259, + 0x8729d6afef6971c5, + 0x54b72cf21e6b8f23, + 0xbf59c1332b4c7d8f, + 0x8127ce354a519cfb, + 0xde9c5af87a53dc69, + 0x41e6b28a9846ead5, + 0x74268f9dc769fa53, + 0x38e6c25ed45c18af, + 0xd72b8c5fe46f382d, + 0x2cea38b213724689, + 0x615cb784318476f5, + 0xd85c17a76f4a9573, + 0x8e7b29376d4a83cf, + 0xa132c7f98b5ea24d, + 0x36a7b4edca52d1b9, + 0x57e314adc954df17, + 0xf918a45ed746fe83, + 0x1d8347c326481cdf, + 0xba47dc24364b2c5d, + 0xfd92ce37624f3bc9, + 0x1d576fbba1526b37, + 0x8cfd927cbf2579a3, + 0xe9ba675dce48a921, + 0x13576cffec2ba67d, + 0x873ce491f82db5e9, + 0x1ef674932b31e457, + 0xd37548e76925f4c3, + 0x3e2f1a998a692541, + 0x3e67c1f9864a329d, + 0x9be12f4ba64d521b, + 0x527489ecb12e4f67, + 0xea17296cbf127ed3, + 0x75bcde61fe269d51, + 0x63f194a32e168bad, + 0xef658a954d19ca2b, + 0xebf61275481eda97, + 0xd1bf65387921e8f3, + 0x7d19b52dca352971, + 0x29d36afcb51726cd, + 0x189cd64fe51a364b, + 0xb982e5a1f21d54b7, + 0x1d8b3457631f8425, + 0xd8f36ab65ef2a391, + 0xfce963d65be491fd, + 0x9a5861e549e6af5b, + 0xca2be43656f8bec7, + 0xa7c24f1a97fbed35, + 0xe7f435aa95defca1, + 0xfba2c41ed6e43b1f, + 0x56ac48e214f53a7b, + 0xdb96eac432f849e7, + 0x96ad8fe541fc7965, + 0xc4937eb65fde87c1, + 0xe52fb7198cd1a63f, + 0xfe6a57298ae3c49b, + 0xa5349fbdcae7d419, + 0x378d4ac1f7dae285, + 0xe526d87437cbf2e1, + 0x2f9d7ec547ce215f, + 0x8c3549a765d23fab, + 0x2a4b761983d65e29, + 0x6941fe5ba1e86d95, + 0xfeac13998eca7bf1, + 0x41d72c6a9cbd8a6f, + 0x13cd2841f9c1a8db, + 0x4f9eb6521bc3d849, + 0x3ae7f69329c6e7b5, + 0x1d3798e658caf723, + 0x1d498ce876bc158f, + 0x9a6cfe3985ae24fb, + 0xf1574e9dc4d25369, + 0xf47b52afe1c672d5, + 0x1524ca6fefca9153, + 0x65df2e321d8a7e9f, + 0x42d6acf43b8c9e1d, + 0x27c813d54ba1cd79, + 0x5a783c476893dbe5, + 0x6e2d538a98a7fb63, + 0x7f86ea5dc5a819bf, + 0xd3c4fb1fe5ac293d, + 0x5934cf6fe2bf37a9, + 0x8e6b73a324c36817, + 0x8ce61d5541c59683, + 0xf187a9c43e9784df, + 0x812fb7476e8ba35d, + 0x937eda476a7eb2c9, + 0xde92b31dcba2e137, + 0x87e2fdadc784ef93, + 0xe13486adc5861def, + 0x863da7c215892e6d, + 0xe36894f3247b3cd9, + 0x1cf784e7629f5c47, + 0xf95b246981927ab3, + 0x693e17acbf869a31, + 0x5c6891acbe56a78d, + 0x571a846edc5ab6f9, + 0xa5d34611fa8ed567, + 0xc85afd132a81f5d3, + 0xa1657e354ba72651, + 0x3e9f1a26568723ad, + 0x4c2aebda968a532b, + 0xa9658d1cb38d5197, + 0x18dbe32ba17d6fe3, + 0xd3fa927dcf739e61, + 0x94e83a71fe548cbd, + 0x8ae9b5f21e57ac3b, + 0xfce6d4132c49dba7, + 0xdf81b235496dea15, + 0x6dbc854a9b732a81, + 0xfe52c74ba86427ed, + 0xf2ba465ed468375b, + 0x7264ad9fe26a45c7, + 0xe35d1cb1f17d8635, + 0x7a12de44326f84a1, + 0xf69d21465e64a31f, + 0x25ab97d76e45c17b, + 0xe37f9a865a36bfd7, + 0x91fc4e59893ade45, + 0xde8b721a974cfdb1, + 0x9c42a17ed8613c2f, + 0x35d76ec1f6543c8b, + 0x582f7e3215364af7, + 0x368bd255423b6a75, + 0x12ac78b7624c78d1, + 0x3fc1b5876d2e974f, + 0x97d5fc498e32c5ab, + 0x185f7d3cbc36d529, + 0x5e81b62edb28e395, + 0xca87ef2ed84ae3f1, + 0x469fc514394d126f, + 0x5f798347685241db, + 0x12bf5d3987245f39, + 0x145edfba93276ea5, + 0x641289dcb24a8d13, + 0xa8e371ca9e1c8b7f, + 0x9c14f2ebac1f89eb, + 0x41c37261fc12da59, + 0xa53cef432b14e8c5, + 0xef2b93d65b19f843, + 0xc87de396582b169f, + 0x46dc1b5a982e361d, + 0xd1467fadc8215479, + 0x5629834dc61473e5, + 0x51c4fdbfe4189263, + 0x74de86fdcde781bf, + 0xe4f97ac21cea9f2d, + 0x3d58b1f32afdbe89, + 0x9371dfc549e1dcf5, + 0x9ab5fd1769e4fc73, + 0x465f279987e61acf, + 0x5c29768cb6f92a4d, + 0xa95836fdc4fd38b9, + 0xfc91a4bed3ef5927, + 0xa5ecd86214f28793, + 0x64bd1ef431d485ef, + 0xc486ae143fe8a46d, + 0x12dea4865ceab3d9, + 0xc5a431298aced247, + 0x5b61d4eba9d2f1b3, + 0xe8c6a24edae74231, + 0xdc94b53fe5c62f7d, + 0xac357d6215c83de9, + 0xa5931db323ec4d57, + 0x3f41bd7652df6bc3, + 0x71bf2da982e39b41, + 0xd1c427f76fc4a89d, + 0xbef5628a9ed7c81b, + 0x291c75bfeacbd687, + 0xda3541e1f8acd6e3, + 0x9dac3eb54bd32761, + 0xdb91c42438c524bd, + 0xef5b87d767d8543b, + 0x3a9521d984db52a7, + 0x3ce726dba4cd8215, + 0x4268e9fba2be8f71, + 0xdf5ce87baf928ecd, + 0x194b3261fe95ad4b, + 0x642acef21e96dcb7, + 0x8acb69e43c9aeb25, + 0x5da89fe5478dfa91, + 0x1ef8bac767a128fd, + 0x2357bfeba7c4386b, + 0x71b68afdc3b846d7, + 0xd6a1b52fe2cb8745, + 0x674923b1f2ad85b1, + 0xd549ab1431ae942f, + 0xe1f5da754f93c28b, + 0xcb37f1254d95c1f7, + 0xab3d6f854b98df65, + 0xdbf94e176879fec1, + 0x856329fba78c1d3f, + 0xcdb482afe6813d9b, + 0x29e37b61f6a45c19, + 0x6b32df5213a76b85, + 0x79153ad5438a79e1, + 0x6b3582e5417c985f, + 0x19627d354e5f96cb, + 0x671b9febae82d639, + 0xa57d43ccbc86e4a5, + 0xb67c584edb89f513, + 0x8b197c2fe98b137f, + 0x2dca8572187d32eb, + 0x7c96da8548a26159, + 0xb8e3419874836fb5, + 0x4cdf351ba4978e23, + 0x2b617e9ba1597c8f, + 0x6f29b1d87e4c8afb, + 0x6be8f3cbad4fcb69, + 0x85297cd1fb62e9d5, + 0xc3f845a21c76f953, + 0xbaf267943b5817af, + 0xf96a4726596b372d, + 0x347e5c2ba76e3589, + 0x3c92a8fcb68174f5, + 0x67a3b5eed2859473, + 0x1869ca3ed15682cf, + 0xbc38f52fef59a14d, + 0x872b6d921e3cbfa9, + 0x71289b443b4fce17, + 0xa4cf7be76b52fd83, + 0x59b241f879451bdf, + 0x2bed356ba9482b5d, + 0x4139cabed64b3ac9, + 0xf754182ed64e5a37, + 0x9cb74e61f45178a3, + 0x9c7bfde43465a821, + 0x3b9265754136a57d, + 0xef129c665f28b4e9, + 0x23fe16798e2cd357, + 0x92317ef98a4fe2c3, + 0x2ef736cedc762341, + 0xc8592affea46319d, + 0x1f84ae5ed6273ef9, + 0xda58b942182b4e67, + 0x7ae51fb5452e6cd3, + 0xc79ae65986429c51, + 0x9a25d148712389ad, + 0xf32dc5198f16c92b, + 0x312fad4cbe1ad897, + 0x6d52187dca1bd7f3, + 0x4a5f7c9eda2ef671, + 0x139e5cd54a1325cd, + 0x89da45c76a17354b, + 0xc1d37247681953b7, + 0xfd2c698ba71c8325, + 0x9e8d3c2cb53e8291, + 0xd6bc8f3ba3218fed, + 0x2a458eda9df2ae5b, + 0x136bc98feaf4bdc7, + 0x48fe5ac21bf8ec35, + 0x56fdec4438e9fba1, + 0x762af34658ed2a1f, + 0x89feadb768f1397b, + 0x2f548ebba6f348e7, + 0x3827ef6dc3f97865, + 0x19a276ced3fa86c1, + 0x39274baed1ec953f, + 0x61cbe98321efa39b, + 0x978ac2b65fe4d319, + 0x5a1237c54cd6e185, + 0x7a8216e659b7efd1, + 0xade3c96878ca1e4f, + 0xe219fdb986cd2eab, + 0x6aef815dc7e15d29, + 0xb87dc161f4e36c95, + 0xbe4cfda324d67af1, + 0x9d2ec7b432da896f, + 0x351d6ca541ec97db, + 0x61d849365ebfc749, + 0x1d25c3f98dc2e6b5, + 0xdf457e2babc7f623, + 0x31b2ce9edac9148f, + 0xbdf3417fe7ca23fb, + 0xe968325218ce4269, + 0xeac28db548c271d5, + 0xa92ce4f876c58f43, + 0x31b9f5e762b57d9f, + 0xbdfe3c5872b89c1d, + 0x1b7d2a976f8dbc79, + 0xd2ab473a9b8fcae5, + 0xd26b4c7fecb2fa63, + 0x4b61a8d32ca518bf, + 0x8a5b7cf54ab9283d, + 0x6c8f3a9547bc36a9, + 0xb7dca4ea98be5617, + 0x8ac7ef6cb6c19583, + 0x913c87acb2a483df, + 0x9251fa6fe1b7a25d, + 0x6dca312fef78b1c9, + 0x8d5e7ac21e8bcf27, + 0xd5c4b1f32b7fde93, + 0xdc347b865a831cef, + 0xd6394c887a952c6d, + 0xc1967e5ba6873bd9, + 0xa573f69ed69c5b47, + 0xa49782eed48e69b3, + 0xa589e631f5b2a931, + 0x2dcaf8921293a68d, + 0xb61c8ef43186b5f9, + 0xab5e49143f8ad467, + 0xbc3829a76c7be4d3, + 0xca3bd21a9b8ef351, + 0x72f3a61dcb8432ad, + 0x93d6cfafea97512b, + 0x368b4f7fe5694f87, + 0x62c8d5f2157a6de3, + 0xf41e6754347e8d61, + 0x39bdac1653618abd, + 0xb7365c298174ca3b, + 0x2e15f3798f45d9a7, + 0x248ef53cbd6ae915, + 0x9bef6a4edb5cf781, + 0xdf6b952dc95f16ed, + 0xe9f5b4721c82365b, + 0xc36d17432a8654c7, + 0x4cd9f257697a8435, + 0xf163a45a956c83a1, + 0x6ce2718ba46d921f, + 0x493f512dc251af6b, + 0x76f2de3baf43bed7, + 0x4da81231fc37ed45, + 0xf39dc7b32d48fcb1, + 0xda1c27b54a5c1b2f, + 0x3f64b876594f2a8b, + 0x145d62f98a5249f7, + 0xa234b17dca346975, + 0x8bd6fe5dc54987d1, + 0x7e6fc93ed23b964f, + 0x6485a3e1f13e94ab, + 0x9bad26e65361d429, + 0xa14db9376f34e295, + 0xda49eb376c47e2f1, + 0x4c5bd3a98c4a216f, + 0x9f5a46e8783a2fcb, + 0xf69c752cb82f4e39, + 0x65b19cdfe8326da5, + 0xec716831f7468c13, + 0x58c367e214268a7f, + 0xb1c253f5432a98eb, + 0x5e9ba787612ec859, + 0xeb5fcd498f21e7c5, + 0x214cb69bad15f743, + 0x67a95f1cbc27159f, + 0x58d71c2feb2a351d, + 0x37954811fa1d4379, + 0x64cb2d74391f62e5, + 0x6849a2c87a249163, + 0x7ec8da1765147eaf, + 0x53de491984179e2d, + 0x1f3a94d8721abd89, + 0x42d1ce687deacbf5, + 0x13ad748a9adfeb73, + 0x465bf28edae319cf, + 0x8a3d7c621bf6294d, + 0x56a714c32af837b9, + 0x2bf9ced549fc5827, + 0x75a1fb6985fe7693, + 0x6f3ed8aa95d184ef, + 0xd987265cb2f4a36d, + 0xe45382adc1f6b2d9, + 0x26fe7badcfead147, + 0x6e427fd21ecbdfa3, + 0x86d792154abdfe21, + 0x1c3e6b965ac32e7d, + 0x38e4f52768d53ce9, + 0xe4f3b16ba8e94c57, + 0xfb15876a95eb6ac3, + 0x315f864dc5de8a41, + 0x23145ce1f3e1a79d, + 0x37d859f323e4c71b, + 0xef5a2cd431e6d587, + 0x83f1d2554fb9d5e3, + 0x51a89de87dbcf461, + 0x4aebfd6879af13bd, + 0x4be2d68dcad4523b, + 0xa1f49cbfe9d651a7, + 0xfe7a248ed5b86ef3, + 0xd568971325cb8e71, + 0x3de4f593239e7bcd, + 0xfa8b514763d1ac4b, + 0x9d4ae72761c3dab7, + 0xa3dc21e98fb7ea25, + 0xa1f342d87dbaf891, + 0x517fbe2dca9b17fd, + 0x9ca876ffe9af276b, + 0x674ea2c21ab245d7, + 0xe7a6bd132ac78645, + 0x4c6afe7656c984b1, + 0x1845b6c875ab932f, + 0xd58bc318739ea18b, + 0x48eb5d3ba291bfe7, + 0x46f3c28cbf93de65, + 0x4db23f8feb86fdc1, + 0x47b8cea32d891c3f, + 0x2c97d5b43a7d2c9b, + 0xc6e8ad165a8f4b19, + 0xf3c1ea2879b26a85, + 0xd32e8c4cb6a578e1, + 0x3a2eb9fdc3a8975f, + 0xc1482b3fe27a95cb, + 0xde7c6a91f18ec539, + 0xdb3c7f654291e3a5, + 0x2683a9c65e96f413, + 0x312a9b765d98127f, + 0x341f28a76c7931eb, + 0x14fc53e98a7c3f49, + 0xc57f4bdba87f4eb5, + 0xdc83726fe7948d23, + 0x571dac6fe3647b8f, + 0xbd4fe792135689fb, + 0x679d8cb4325bca69, + 0xde82b5c5416ec8d5, + 0x164af35a9e71f853, + 0xa2d7f15a9d7416af, + 0x21a34e9cbc78362d, + 0x659a3d7fec6b3489, + 0x5cab9f2fe97c63f5, + 0xf35247b21a6f8273, + 0x6937cdb5476381cf, + 0x6be51d2874659f3d, + 0x359b2f887246bea9, + 0xe57c1d3a925acd17, + 0xbe36dc8a9f4dec83, + 0x97ae8cdcbc521adf, + 0x63a17241fc642a5d, + 0x856c2b921d4638c9, + 0xfaec1d632c4b5937, + 0xe81caf26594d67a3, + 0x54fc7beba85f9721, + 0xd359ce7cb652a47d, + 0x7a4b316dc245b3e9, + 0x8142ba6fe149d257, + 0x73f2684edf4ae1c3, + 0xf3a659732d4cef31, + 0x9db3ca265c412f8d, + 0xac43f1876b243df9, + 0x8ebd4afa9b284d67, + 0x8c3bf57ba8296bd3, + 0x12a853fdc73d8b51, + 0x3ae48b1dc42f78ad, + 0xeb126d81f543c82b, + 0xaf45d6b21324d697, + 0x6dcea1b65128d6f3, + 0x52e8df976e2bf571, + 0x29ead5b87b2e14cd, + 0x658c1b3bad21534b, + 0x284a91fedc1452b7, + 0xaf4b675feb398125, + 0x54f2da1fe62a7f81, + 0xab318e53251a7ced, + 0xdb548a24341f9d5b, + 0x19fb43576412dbc7, + 0x712e38ca9216eb35, + 0xafb63d587de6f9a1, + 0x9c5eadb98cea291f, + 0x6f95a14dcafd287b, + 0x7a3f561dc9df36e7, + 0x4fa5c8621bf28765, + 0x5fd8a46439f685c1, + 0xb49d136656e8943f, + 0x13724e5764fca29b, + 0x5ae7213984fec219, + 0xf489c7dba2e1df75, + 0xe7b162aa9cb4fed1, + 0x14a35c2febc71d4f, + 0x27deac421ce82dab, + 0x5b96d7243aed4c29, + 0x1ac967d438df4b95, + 0xaf2d5b4768d379f1, + 0x9bcfe87ba5d4986f, + 0x2594df7ba3e796db, + 0x8ba2763ed2ebc649, + 0x48e63cd1f1ced4b5, + 0x3d1c7f2764d1f523, + 0xe9b17d354ec5138f, + 0x3be46d765dc732fb, + 0xe91863b87cdb4169, + 0xbcf12d9878ab4fc5, + 0x3fd5cb1ba8bf7e43, + 0x8f742a6ed5b27c9f, + 0x92ac7d31f4c59b1d, + 0x5b3e9f7213d6cb79, + 0x5179fa4432bac9e5, + 0x29fad6e651bde963, + 0x5472d3e76ea217bf, + 0x7c28635a9eb5273d, + 0xf92d6a1cbdc735a9, + 0x87ac63ffeacb6517, + 0xc182a571f9bd7483, + 0x4e6b83f2169e72df, + 0x51fc328547b3a15d, + 0x1e326c965384afb9, + 0x713cb28763a8ce27, + 0xfeb146a8718aed93, + 0xa28fb5387c6bdaef, + 0xe5b4f93dce912b6d, + 0xe68dc431fc843ad9, + 0x8d2b5c421db85a47, + 0xdb5169432c9a68b3, + 0x91cd7fe657ad9831, + 0x81493577647f958d, + 0xf5d4b97ba582b4f9, + 0x398d7b5dc2a5d367, + 0xb3e8654dc198e2d3, + 0x63418ebede8bf251, + 0x9546cea43f7e21ad, + 0xa824c7e65d824f1b, + 0xa7f8d3465c934e87, + 0x8abc76965a876ce3, + 0x8fe129acb97a8c61, + 0x6298b4eba45c79bd, + 0x591c72eed46fa93b, + 0xb8c659e1f362d8a7, + 0x713bced32396e815, + 0x85f2b6a54279f681, + 0x3158a7d54f6a15ed, + 0xd4172cf98d7e245b, + 0xeb8c936bad8153c7, + 0xf38ce24edc968235, + 0x2bc8d9afeb6782a1, + 0x3d815badc5487efd, + 0x7a284592154c9e6b, + 0xc43deba3234facd7, + 0xbc3eaf198372ec45, + 0x6a2c71398265fab1, + 0xa28f54ca9e581a2f, + 0x972e3fbbae4c298b, + 0x84936a5dcb4d38f7, + 0x63e29c51fc416875, + 0x159d4b632b5486d1, + 0xab397c832a37954f, + 0x13eadc66564893ab, + 0x197543f9865dc329, + 0x72e438dba34fd195, + 0x73fcd89ba253dfe1, + 0xa4d8691cbd361e5f, + 0x8b7e69a1fd372ecb, + 0xeac935421e2b4d39, + 0xb962d8c43b2e4ca5, + 0x3b2a14887c528b13, + 0xd3c4e7276a23897f, + 0x1b53478ba62597eb, + 0x958cba4ed42ac759, + 0x9f826cafe32bd6c5, + 0x612acb7ed12fe643, + 0xec8329b76253149f, + 0xbd17e5a76f27341d, + 0x2f4379b76e1a4279, + 0x9c264fb98c2b61e5, + 0x74c1d65a9a1d7f53, + 0x3caf725cb8217daf, + 0xc45d239fe7149c2d, + 0xca182b91f415bc89, + 0xf8b1da332418caf5, + 0x1e7f8c66541cea73, + 0x94a2db66521de7cf, + 0x982eb5c87ef1284d, + 0x2d35f1a98df436b9, + 0xcd685e4cbcf95627, + 0x92b5167edafb7593, + 0x28793b5dc6db73ef, + 0xf2ac9bd217ef926d, + 0xd8923bc546f3b1d9, + 0xfb13942764e5cf37, + 0xf4cd297762f7dea3, + 0xd27a13e983eafd21, + 0x17fad9c98fbe1c7d, + 0xd7126bebacd13be9, + 0xb175e9c1fce34b57, + 0xac3b4ef21be769c3, + 0x514ad6843aeb8941, + 0x8c61294435ec869d, + 0x869d2a4875dfa61b, + 0x2fe367cba5e2d487, + 0x4f1d3e6ba2c6d4e3, + 0x3d81ebfdc2d9f361, + 0x5f1b746fefca12bd, + 0xf95a3d732fce413b, + 0x7df186243dc14f97, + 0x4d3fbec65ab46df3, + 0x1dab3e965ac68d71, + 0xa278ce1765b87acd, + 0x3e26b7f985cd9a4b, + 0x2697a3eed3afc9b7, + 0xeb13d941f4c3e925, + 0xe48b1a9323c5f791, + 0x9f235ae542b816fd, + 0xf821b3654fac256b, + 0x4adcb1576cae34d7, + 0xe325df9badc18345, + 0xa7e8529edac583b1, + 0x28694faed8b7912f, + 0x635b9c8fe4a89f7b, + 0x72b38a42148bade7, + 0x1bfa48d3239fcd65, + 0xe9b21df76493fbc1, + 0x415cdb7982a61b3f, + 0x479d52876f872a9b, + 0xa93c61ecbe8c4a19, + 0xb5943c8edcae4985, + 0xd43b5a21fba287e1, + 0xb82f35e21ba3965f, + 0xfda14733278694cb, + 0xb83724d6568ac439, + 0xb25adc88748cd2a5, + 0x7849d32ba59fe213, + 0xa6d3f94dc3a4217f, + 0x689fd2ebae752fdb, + 0xb4cd1a61fd783e49, + 0xb8d953a21e7a4db5, + 0x92d17f854b8e7c23, + 0xf72189354b617a8f, + 0x4f32cba6576398fb, + 0x9f85acecb475c869, + 0x5d19c37cb369c7d5, + 0x14c729eed28ce753, + 0xe13f859dc16de4af, + 0x1e453cf76194352d, + 0x1ac8bd932f764389, + 0x7be91df54d7962f5, + 0x316a782a9d6c8173, + 0x3a412bc8784c6ebf, + 0x25f6ed4cb8619e3d, + 0x74f286bfe653bda9, + 0x8c926e51f456dc17, + 0x7d89a5e21459eb83, + 0x41fb9284324ae8df, + 0x3b426fc8726f195d, + 0xe951bca98f5237c9, + 0x7aec19fcbe465837, + 0x6e58273dcd4976a3, + 0xa9452c6feb5c9621, + 0xdc62e341f84e937d, + 0x84be6d943851b2e9, + 0x7fb6d4c43964d157, + 0xbe831a587546dfb3, + 0xc2d6bf998459fe31, + 0x5ea7db4a924b1e8d, + 0x4ce17f398d3e2cf9, + 0xc7a49f2ede324c67, + 0x7d8e6941fc256ad3, + 0xe1f785432d398a51, + 0xeb92f5a4392b87ad, + 0x49cdf3a6583ea72b, + 0xfe69547ba831d597, + 0x167bde2ba724d5f3, + 0x153498edc538f471, + 0xa17935cfe24913cd, + 0xf324a97fef1d324b, + 0xa84d65b43e2f41b7, + 0x32ed91876d237f15, + 0x7bd4ce276c257e81, + 0xfcbd92e659167bed, + 0xd4731a29871a9c5b, + 0xef82d65a951ebac7, + 0xb7a98f3ed721ea35, + 0x491f2c5fe524f8a1, + 0x8c791b254537281f, + 0xf1786d36531a267b, + 0xfdca35154dfb35e7, + 0x3712dca98cfe7465, + 0xf12eb46a9bf284c1, + 0x7fa3469cbae5923f, + 0xe628f93ed7f6a19b, + 0x3d68a9bdc4d8aef7, + 0xb9726c4214fbce75, + 0x8f6dace434bfecd1, + 0x6a9528d875e31c4f, + 0xfbe38a6871f52cab, + 0x2396eb487fe84b29, + 0x67a15c398dec4a95, + 0x6fad8e1cbacd68f1, + 0x86dac92fead1976f, + 0xc35de8f218e395db, + 0xa4169be328e7c549, + 0x53d1b8c546e9d3b5, + 0xb76cd9e986dce423, + 0xb2e56ad873bde18f, + 0xfd5768eba2d431fb, + 0x76d2c3fcbec63f59, + 0x7a589431fdb84ec5, + 0x83b29fd21ecb7d43, + 0x15e3a9f328ad6b9f, + 0xea7df84658c29a1d, + 0xbe24c9d656d3ca79, + 0xc21f68aa94b6c8e5, + 0x2a35916cb4cae863, + 0xf7ab318dc29ae5bf, + 0xb9a4326fe2bf163d, + 0xe4a7fc2651d234a9, + 0x721948e43fc86417, + 0x9738f2e65eca7283, + 0xef7ba2165b9a71df, + 0x197eba27679c8f4d, + 0x649a715dc681aeb9, + 0xa729b45fe6a4cd27, + 0xe4c532a1f4a6ec93, + 0xfe643bd21387d9ef, + 0x391fb675439c1a6d, + 0xe6849c2651af28d9, + 0xa7d946f98fb25947, + 0x578bc6da9ea567b3, + 0xa492315dcdba9731, + 0xf1784bafea7b948d, + 0x6a287b1fe67da3f9, + 0x27c86b5439a1d267, + 0x7b8d5e354795e1d3, + 0x154c9b776597ef41, + 0x5b2eca8763781f9d, + 0xb8364a5a928c3e1b, + 0xed2c853bae6f3d87, + 0x7e24b35dcd826be3, + 0x93cd51e1fd958b61, + 0xe5b93f721c5678bd, + 0xc91fa533296ca83b, + 0x9c418fd4385ec6a7, + 0x579fd18ba892e715, + 0xac6e542cb694f581, + 0xc84576dcb38714ed, + 0xb1c8f4afe18a235b, + 0xc31afd5fef6d42c7, + 0xb9846cd32e8f7135, + 0xd3e2ab954d637f91, + 0x9d1f7b643a547cfd, + 0xa67d3bf65a479d6b, + 0x1a534b798649abd7, + 0x27ed956ba76edb45, + 0xbaf3682ed562f9b1, + 0x5d4f27cfe475192f, + 0xb3e24fa21356278b, + 0x83f5a275415a36f7, + 0x3e7d65998f3d4675, + 0x925e71698c4f75d1, + 0xd12c549bac62934f, + 0x2c69a4fedc4592ab, + 0x95cb1f3fea58c129, + 0x215384ffe63acf85, + 0xeba5f683264bcde1, + 0x67a9f5e547621d5f, + 0x4feb6d5873542dcb, + 0x7c2596fba1574c39, + 0xe56ca7d98f294ba5, + 0xfc17234cbe4d7a13, + 0x29da568dcb2e687f, + 0xad952831fa3296eb, + 0x3b65fa821b24c659, + 0xc7624ae43928d4c5, + 0xceb3f1a8782be543, + 0xf69dc3b8753ce29f, + 0xa3615f7cb762431d, + 0x79e1c5fed2354179, + 0x58df349cbe174fd5, + 0x1e36a851fd1a7e53, + 0x514369f32d1b6caf, + 0x3cb12ef54a1f8b2d, + 0x6e32d9165a12cb89, + 0x8163de587814c9f5, + 0xe685c71cb618e973, + 0x97cf31dba419e6cf, + 0x962b71adc52e174d, + 0x479dab11f42135b9, + 0xbfae563983146527, + 0xce741bd32ef67493, + 0x983b21554bd872ef, + 0x87bda4265afb916d, + 0x7c12683656ed8fc9, + 0xcf7de82ba8f1ce37, + 0xca4895fcb6f4eda3, + 0x1562bfeed5e7fc21, + 0x74edacf324f91b7d, + 0xd857e92543fc2ae9, + 0x485d29e761ef3a57, + 0x9f2e1bd87fe268c3, + 0xd817f9ebade69841, + 0x85de961babe7859d, + 0x7bc683aed8eca51b, + 0x9c1edb61f6dec387, + 0x6eb251d548c1d2e3, + 0x869e57d548d5f261, + 0xb7f9d15765e721bd, + 0xb45c132874d93f2b, + 0xaed92f6981dc3e97, + 0x47a652c98dae5cf3, + 0x6d4a359cbed38c71, + 0x52849cd1fab479cd, + 0x872cde321cd7a94b, + 0x548abe7326dac8b7, + 0xb1736a9547bed825, + 0xac2e34d987c2f691, + 0x6184fdaa96b415fd, + 0xb6a3194dc3d8246b, + 0xc3674f9fe1ca43d7, + 0x5b8a21cfefbd7245, + 0xc69e7da43eaf72b1, + 0xca27e9154ca38e1f, + 0xfe5b86443ca49e7b, + 0xe7286da54896ace7, + 0x47baf219879adc65, + 0x8abf542a958deac1, + 0x37629f4ed6b21a3f, + 0x1ed5a891f3c4289b, + 0xc38fd49323c74819, + 0xbe581a4431cb4785, + 0x5b1e62f54f9c76e1, + 0x1c53d4e76c9e845f, + 0x84bdfc187d8293cb, + 0xb89acf2edba6c239, + 0x56baf78fe798d1a5, + 0x9ef78b5ed579cef1, + 0x7a5f2ce2147bed6f, + 0x518ecaf545812edb, + 0xcd1ea32872a53d49, + 0x3419fd7981974cb5, + 0x7648ad5a9f8a7b23, + 0x2c79febbad5c698f, + 0x9a8fb36dca5e87fb, + 0x7c426851fb82c769, + 0x9dbfa2c21a84c6d5, + 0x57e193832a89e653, + 0x93e26da54569e3af, + 0x65a7124a968e142d, + 0xd6e175fdc5a14289, + 0x6953e4bdc29461f5, + 0x851a934dce587f63, + 0xb675934fec486dbf, + 0x98de2c421e5b8c3d, + 0x95fdb1332b4f8ca9, + 0xca4fed765a63db17, + 0xba8e1d487965ea83, + 0x5bd6e4fa9546e7df, + 0x2af8675dc46b185d, + 0xb2fac58ed35e26c9, + 0x38756b91f2915637, + 0x5c38b763218475a3, + 0x265bc3d54f689521, + 0x48c32ae65e4a927d, + 0xd51b32a76b4ca1e9, + 0xfe569439893ebf47, + 0x74b9e2fba852deb3, + 0xe8a4625dc856fd31, + 0x5193cde1f5471c8d, + 0xc375fb42154a2bf9, + 0x4a879fe6524e3b67, + 0x76fb2949825169d3, + 0x192e368baf348951, + 0x43a6857a9e2586ad, + 0xba614fedcd39a62b, + 0x165f384fea2dc497, + 0x85eb63ced82ec4f3, + 0xcfe986532a54f371, + 0xed86b4c6584612cd, + 0x4cdae2198759314b, + 0xfe1bad59842b3fa7, + 0x67de39cba23d6e15, + 0x54c6ea8cbf327d81, + 0x45f6371cbc137aed, + 0xc6349da1fd169a5b, + 0x8b16e5732d18b9c7, + 0xb9a5f1c54a1cd935, + 0xca36d7e6582fe7a1, + 0xe62b53fba934271f, + 0xbd8a573dc816257b, + 0xd35ef74dc51934e7, + 0xb57c469fe21c7365, + 0xd4ec726cbefd73c1, + 0xa1b835d32cde813f, + 0xd8fca9e43ce29f8b, + 0xf875a1c439e4adf7, + 0x6237dba549f8cd75, + 0xb1e98c6876f9ebd1, + 0xd57f3e9985dcea4f, + 0x851e7b3ed5f129ab, + 0x16975dafe3f54a29, + 0x36a859f212f74895, + 0x1723b56542ea67f1, + 0x1c9875d43edc856f, + 0x63a18d765acf84db, + 0x372f5ea98be2c349, + 0xf78951dba9e6d2b5, + 0xba96df7dc8d9e123, + 0x5819e4ddc4b9de7f, + 0x6c3e94f325ac1feb, + 0xae8b37d546d13e59, + 0x2ecb134872e34dc5, + 0xe321645a91e87c43, + 0xdc9617265ec86a9f, + 0x21f6ce487ebc891d, + 0x1fb278aedacfb879, + 0x1d4bac71f9b2c7e5, + 0x4cb39de21ac5e763, + 0xbae6c15326a7e4bf, + 0x41dea93767cb153d, + 0x859c2a3875ce23a9, + 0x91e34c2cb5d26317, + 0x69a3f15dc2d57183, + 0x72cd9b5bad956ecf, + 0xc754b9e1fca98e4d, + 0xdf68c4221e7c8db9, + 0xbfc219843a9fbc27, + 0x8b4fae2658a2eb93, + 0x67ecd1a65694d8ef, + 0x2b3e65dba5b8196d, + 0x5419bd8dc4ab27d9, + 0x284e35ced2be3847, + 0x6c183941f2c176b3, + 0x83be6af542c59631, + 0x1af64c332fa6938d, + 0x9fec57d54d78a2f9, + 0xbf16cd265b9dc167, + 0xef5a3d47687ebfc3, + 0x81d297acb893fe41, + 0xf342e87dc6851e9d, + 0xc17d43b1f5983d1b, + 0x9be386c2149b3c87, + 0xead36c95428d5ae3, + 0xac1df95873b28a61, + 0xd9f32e765f6387bd, + 0xa285b6ea9e86a73b, + 0x1e73496cbd69c5a7, + 0xcd3a641fea8cd615, + 0x3c524f9ed97fe481, + 0x453918e3298413ed, + 0x2596cd354897325b, + 0x95cf3877658941c7, + 0x5437a8fa938b6f25, + 0x249f751ba27d6e91, + 0xbf3ca5ea9e517bfd, + 0x938a2ceede539c6b, + 0x6c5eba11fc45bad7, + 0x89b25a621c69da45, + 0x4b19e8c4395ce8b1, + 0xb8ca3125485de72f, + 0x5b4d621ba973268b, + 0x8d5c314cb48635f7, + 0x542396eed28a6475, + 0x43bf2dafe26b74d1, + 0xe61f435dce5d824f, + 0x8ae6c7143f5291ab, + 0x4fdb12e43d54bf19, + 0x5eb197654b36ce85, + 0x4d315ca76948dce1, + 0x5a7bc399873aeb5f, + 0x17854e3a964f1acb, + 0xb836fcdfe7624b39, + 0xd362b1e1f23649a5, + 0xae6b9783245a7913, + 0xa7158fe5413b867f, + 0xcd6198554f2d85eb, + 0xd76a42c98e31c459, + 0xbc6f41aa9b24d3c5, + 0x35eba27dcb58e243, + 0x2b59d67dc738e19f, + 0xa2c59741f85c321d, + 0xfd82c952173e2f69, + 0x8cbad97767324ed5, + 0x52cb7a8a94267d53, + 0x49efbc6981276baf, + 0xe5d86fb87f1b8a2d, + 0x5813e6487d1eba89, + 0xf6b7823edb21c8f5, + 0x23da98b1fb14e873, + 0xf6b14ce32916e5cf, + 0x7a132bc6592a164d, + 0xb4d785a7671d24b9, + 0x83be924ba81f5427, + 0xe46813ddc6147293, + 0xf615729cb32571ef, + 0x463d51ebace68f5d, + 0xf624a31edbf78ec9, + 0x9675da221afcbd37, + 0xe4dfa35328efdca3, + 0x2438cde769e4fb21, + 0xc9e3f82768f51a7d, + 0xd832f97ba5f728e9, + 0xf6d4c8ecb4fc3957, + 0xa561427cb2fe57c3, + 0x14698cafe3f29741, + 0x84c5fde321f3849d, + 0x2a98c4543fe7a41b, + 0xb9dfec554deac287, + 0x2bfc4e5769dbc1e3, + 0xab64f8c878bedf51, + 0xfa32c74a97c31fad, + 0x5fa6d43dc7d63e2b, + 0x89a5e1d1f4e83d97, + 0xef39d78214da5bf3, + 0x28e5b1a543de6b71, + 0x6cf329a652e178cd, + 0xbdafe2876fd3a84b, + 0xe276d3198ed5c6b7, + 0xc25f1bea9bcad725, + 0x9852a6bed8bce591, + 0xfe69a81cb69ce3fd, + 0xf8e53cd219d4236b, + 0x894d521438c642d7, + 0x59d7a32986da7145, + 0x6ae2f81873cb6fa1, + 0xa37691c982ac7d1f, + 0x2cd64f398fa19d7b, + 0x8a31de7dcd93abe7, + 0x28417ba1fca7db65, + 0xc7b513632ba8e9c1, + 0x64e89cd3279be83f, + 0x5768f2c546af179b, + 0xb658ecfba8c34719, + 0xe367fcacb3c74685, + 0x35b86e4dc3b975e1, + 0x7ac968bed1ab835f, + 0xc4f5a67edf7e82cb, + 0xd5f92cb54fa2c139, + 0x47e169b32d83cf95, + 0xf2d19be54a86cdf1, + 0xf95162354978ec6f, + 0x25bf7ce9867a1cdb, + 0x3cd7f81cb68f2c49, + 0xd815642fe6924ab5, + 0x23c5dae1f4b67a23, + 0x9e6f58d212a9678f, + 0xa9125c44317a86fb, + 0x72be85d43f7eb569, + 0xad586b387e81c4d5, + 0x5dcb763bac96e453, + 0xd14a926cb976e2af, + 0x53bdc41fe98a132d, + 0xae641d21f67d3189, + 0x459b78c2167d3fe5, + 0xeb16f79545927e63, + 0x91f73ec652746cbf, + 0xde8b3faa91678b3d, + 0xe5c879d76f4c8ba9, + 0xd2b85a4a9d5eca17, + 0xf8e7b15edc61e983, + 0x26317a5dc953e6df, + 0xc65b7a132b68175d, + 0xcaf71894386a25c9, + 0xdbc25177698d4537, + 0x63a1d84a957f64a3, + 0x75dfb86dc6859421, + 0x97df6eadc265917d, + 0x29f84c6cbe368fd9, + 0x742e83b1fd3abe47, + 0x4e2753a21a4ecdb3, + 0xdfb28a365b62fc31, + 0xa4f8ce776a541b8d, + 0x2eda4fb878462af9, + 0x84e3927dc84b3a67, + 0xac734e9cb64c58d3, + 0xac21765ed34f7851, + 0x79ea5d61f14285ad, + 0x6e2958c43146a52b, + 0x92b15ce54f28c397, + 0x5e7c19876d4ac2f3, + 0x26dcbf498b4de271, + 0xc6a528da9a5321cd, + 0xe78d5b9dc9452f3b, + 0x543b129ed8263ea7, + 0x3cb51de1f73a6d15, + 0x7cf846d3253d6c81, + 0x6da7eb95432f69ed, + 0xb48239c87132a95b, + 0x452713976f14b8c7, + 0xb15493fbae19d835, + 0x42af731a9c2be6a1, + 0xc79351ecb92ce51f, + 0x6532c8e1fa31247b, + 0x39d81f632a1543e7, + 0x861f3d254a197265, + 0x9f6cdb39863a72c1, + 0xb96dea49841b7e2f, + 0xb8c41d6a921f7e8b, + 0x95a436d98de1acf7, + 0x1d76452babf3dc75, + 0x4a79158dc9f6ead1, + 0xd6f39a221ad8e94f, + 0xfc57198437fd18ab, + 0x87e34a9657ef3829, + 0x63dec74ba8f24795, + 0x8719b54ba4e576f1, + 0x437ad62cb2e9846f, + 0x3d76145dc1fa83db, + 0xfd378ebdcfdeb249, + 0x8241bdc43fe2d1b5, + 0x6ef13b954bc5df13, + 0x4825da7439b5ed7f, + 0x46f13bd657c81deb, + 0x1f346a2987ec2d59, + 0xbc2f154a96df3bc5, + 0x852f91ced6e27b43, + 0xd95a6b7fe2d4689f, + 0xfdae93b323e7981d, + 0x5d8249a431ecb679, + 0x6c2b1a743fadb6e5, + 0x7c1e69598dc1e563, + 0x6ea9813879a4e3bf, + 0xe4723c8cbac8143d, + 0x53dfc82fe7db32a9, + 0xd3a29b81f8cd5217, + 0xa289bcf216be5f73, + 0x4d9bf7a434a26dcf, + 0x9dc5fa2762b58c4d, + 0x7e61d4a651d68cb9, + 0xf3278eb76f9acb27, + 0x39d564a87c8eda93, + 0xadfc4e9cba91d7ef, + 0x5a9c7341fab4186d, + 0x783f52b21ab726d9, + 0x6c5184b329cb3647, + 0x7dc9bf8547ad65b3, + 0x8edf432a96bf8531, + 0x6bd2e93ba4b3928d, + 0x51a8649dc2b5a1f9, + 0x6b8fa39dce98bf57, + 0x46c1e751fd79bec3, + 0x843b9e132b8ced41, + 0x8a126c354b821c9d, + 0x82a437c76a953c1b, + 0x3869aed659a63b87, + 0xef23947cb68a59e3, + 0x2dbf1e8dc4ad7961, + 0xe5294d7dc28f76bd, + 0xc139dea1f192a63b, + 0x3b764ed32195c4a7, + 0x75cb8fd43f89d415, + 0x2e9fab865d7be381, + 0x7dc64196596bf1ed, + 0x1e5b62fbac92315b, + 0xb632d75dc9843fb7, + 0x13e2a58ed7986e25, + 0xcd45e9b1f47a6d91, + 0x549a8bc2135b6afd, + 0x9bd2a484325f8a6b, + 0xa67f31b65162b9d7, + 0x71fd36298f76d945, + 0x4817cb3a9d58e7b1, + 0xdc5e4baa9b5ae62f, + 0x187953aeda6e158b, + 0xd9243acfea8134f7, + 0x63254ca21b946375, + 0x2791e585496873d1, + 0xadb68398756a814f, + 0xd1cb2977624c7f9b, + 0x1df4c3e9825fae19, + 0x986e17dbaf42cd85, + 0x519f6b3bac45dbe1, + 0x947c1e6edb37ea5f, + 0x7bfd4e332d4a19cb, + 0x82e59fc54b5e2a39, + 0x3adb89487b6148a5, + 0x413fdc9cba657813, + 0xe98c1f6cb436857f, + 0x53ea876dc23984eb, + 0x835269afe14db359, + 0x7bf19aeede3fb2c5, + 0x5a4c78132f65e143, + 0x26d157a43b24de8f, + 0xc38f94d65a371efb, + 0xe345c1d87a3b2e69, + 0x67b4e2fa982e3cd5, + 0x19a8e7ced9417c53, + 0x7a29e4fed52369af, + 0x316cbe71f436892d, + 0x9643c5b2132ab789, + 0x36f79a85412cb7f5, + 0x129ae3b65e1fd673, + 0x4c51e8a87b12e4cf, + 0x6b3e829bac27154d, + 0x6aef43cedc1823b9, + 0xdf7946afea1c5327, + 0xb1946731f82e6193, + 0xec192f5437216edf, + 0xd39ef61546138e5d, + 0xb85724f763158dc9, + 0x3e6cd4a98219bc37, + 0x235eac476ef9dba3, + 0xed1c32f98bfdea21, + 0x315bd84dcbf2197d, + 0xa53b7f2edaf427e9, + 0x348d25a21bf93857, + 0x9eafb16328fa56c3, + 0x24f3b1e657fd8641, + 0xc9fab13764ef739d, + 0x8e17d32a95f4a31b, + 0xa295167cb2f5c187, + 0xf4be8cda9ec7bfd3, + 0xab547361fbcade51, + 0xdabe7c92189bfcad, + 0xca2b41d65ae13d2b, + 0xaf1c4b965ae43c97, + 0xba58e43768d75af3, + 0x8c4dbe3a95eb6a71, + 0x16d23cba93eb67cd, + 0xeb58716dc2df974b, + 0xca5b16d1f1e2c5b7, + 0xa59d81c431e7d625, + 0x261e8bf43fc8e491, + 0xa2fb5d154ba9e2fd, + 0x9dca34b87ace126b, + 0xc7415a3a9ac241d7, + 0xc8723e4cb9c46f35, + 0x45bf9a1ed5c76ea1, + 0x763d9b2fe4b97c1f, + 0xb58fe74213ad8c7b, + 0xb85da9e432bf9ae7, + 0x6253abd871c2da65, + 0x51247bf76fa5e8c1, + 0xb9a5f7e76ca8e73f, + 0xc6f4d2998dac169b, + 0x341e69aedabe3619, + 0xc53ead71fac16485, + 0x6f3a845329b574e1, + 0x4f9a1d2436b7825f, + 0xd82a719654a981cb, + 0x219ca877638caf29, + 0x6ecf8418718fbe95, + 0x82b31c5a9e83dcf1, + 0xef36852bac84eb6f, + 0xed481b51fc871adb, + 0x3f2ca9621d8c2b49, + 0x4db6ae832a8e39b5, + 0x45e2bac76ab17923, + 0x2acd64ba95a3768f, + 0x4bcd259ba39685fb, + 0x98ab54eed28ab469, + 0x5b31f7afe18cb3d5, + 0x2965be8dce8fd253, + 0x13f4dbe32d73e1af, + 0xdbf843165e97312d, + 0x7a58e2c54c682f79, + 0xfa312eb7697a3de5, + 0x521cf96ba98e5d63, + 0x97e13a2dc5716abf, + 0xad5fbc4fe5748a3d, + 0x8c3e92a1f265b8a9, + 0x4679f1e3236ac917, + 0xf2567985416cd783, + 0xcb7d15e43b4ec5df, + 0xb7dace3a9e83165d, + 0xc2fe184bad7624c9, + 0xb37c941edc8a5437, + 0x86a49dbfe97c62a3, + 0x5d1ba271f97e8321, + 0x68ac319327518f6d, + 0x9c7deb6324538ed9, + 0x613d5ac98256bd47, + 0xdbf168487158dcb3, + 0xd51e62998f5ceb31, + 0x8b5decf87b3ef98d, + 0x4789a2cedc5328f9, + 0xc7b1ad21fc453967, + 0xcf5d87e21b4957d3, + 0x684791f43a4c8751, + 0x2bf861a6563e74ad, + 0x8a3c614a9761a42b, + 0x3e1c8a2cb354c297, + 0xe8915afcb257c1f3, + 0x27698e4cbe39df61, + 0xfb865a1dca29febd, + 0x371e85f32c4f1e3b, + 0x9a7ce1b65c423da7, + 0xde4532698b376c15, + 0xf15c4ba87a396b81, + 0x3f675d4a952a68ed, + 0xfa48d96dc42e985b, + 0x49518b3fe431b6c7, + 0xac726e81f124d735, + 0xa9b5e3754237e5a1, + 0x46a12f765d29e41f, + 0xb15d49e76e2d137b, + 0x35fb29d98b1f32e7, + 0xe715329cbc237165, + 0x6a84359dc9256fb1, + 0x53e2678dc6187d2f, + 0x9de87421f41a7d8b, + 0x5c9f4de3241d9bf7, + 0x8edca9f76421db75, + 0x96fcd4587324e9d1, + 0xba1c9f876cd5e84f, + 0x5e4a29876df817ab, + 0x3f9524bbabfc3729, + 0x295a68bdcafe3695, + 0xb6f23c9ed9e275f1, + 0x78bc645219e4836f, + 0x694fce2435f682db, + 0xedf893c765fab149, + 0x832dab7762ecbfa5, + 0xd2b4eaf982dfce13, + 0xf3e16bc98db2ec7f, + 0x6abc21da9ad51ceb, + 0xd97a8141fbe82c59, + 0x43c6fa7219eb3ac5, + 0x9f15c67329de6a43, + 0x8c5273b548d1679f, + 0x9d15423986e4971d, + 0xc5b3298ba3e6b579, + 0xd284165ba2d9b4e5, + 0x6a38795cb1ecd463, + 0xc9f1b32bac9ed2bf, + 0x71edbc654fc5123d, + 0xe7d581b54ed631a9, + 0xb1fca2954ab83ef5, + 0xc52d749769cb5e73, + 0xf53b4ad8769d5bcf, + 0x2bd3ec7ba6c18b4d, + 0x57f94c2fe4d38ab9, + 0xae4db9c1f3d6ca27, + 0x2d4a396212cad893, + 0xec4126b4319ac6ef, + 0x6ef2c7b43c9ef56d, + 0x6c8bfd287eb325d9, + 0x83b6d5cbadc83547, + 0x1fac835edac964b3, + 0x27468d3fe9bc8431, + 0x8a1472b1f5ae718d, + 0x5e743b8325a18fe9, + 0xc79351a324a3be57, + 0xf9e6b1d65296bdc3, + 0x6d82ae1872a9ec41, + 0xf6b378d65e6bfa9d, + 0xfa48c61a9d8f2a1b, + 0x28f6a37fedb23a87, + 0x25684d91fba658e3, + 0x583ea4b32cba7861, + 0xad5b4373268a75bd, + 0x93bdefc5468e953b, + 0x45126fc98591c3a7, + 0x3c15f7acb4a6d315, + 0xf5b18d3dc3a7e281, + 0xdc2f13ba9b57efcd, + 0xdf73bc4fed7c1f4b, + 0xea2543b21c6f2eb7, + 0x3e2adb854c936d25, + 0xd79cb3854b856c91, + 0xce135a95485769fd, + 0x184f963ba45c896b, + 0x8e6f43acb35ea8d7, + 0x431acf2fe391d845, + 0xd75824e1f284e6b1, + 0xc48dba243187e52f, + 0x6e4c5a943f6a148b, + 0xf8b4c7265d6c23f7, + 0x28cd736a9c8f4275, + 0x6e53f84bab8472d1, + 0x46591f8cb9657e3f, + 0x97ac825ed5467e9b, + 0xd58a71b1f45bad19, + 0x5a8bf322134ebc85, + 0xfbad7c865462dae1, + 0xa35b6f187163e95f, + 0xd2cf18587f4618cb, + 0x62c8d9bbae5b2839, + 0x3178f92cbc4d37a5, + 0xa3b68e5edb5f6713, + 0xab49f12fea52847f, + 0xfd58cab2194583eb, + 0xfe82d9443748b259, + 0x36ce8d18764ab1c5, + 0x6392ac79845dcf23, + 0xa472b13a9241ed8f, + 0x3ef48d2a9e341dfb, + 0xdbea495dce372d69, + 0x6d594eb1fc293bd5, + 0x478965221c2d6b53, + 0xecda5674392e58af, + 0x8ed2fa576a43982d, + 0x32f571dba724b689, + 0x5f937d8ba428b6f5, + 0x9846f15dc42bd573, + 0xfe6423dba12bd3cf, + 0x162ac47fef52134d, + 0x98beaf654f1532b9, + 0x43a8d1f76e395127, + 0x7c15e9a76c1a5f83, + 0xb7198527681a5cdf, + 0x4a5cf23a981f7c5d, + 0x7f3219bed6128bc9, + 0xfa2c3b6fe615cb37, + 0x751c3241f417d9a3, + 0x8b19efc5453be921, + 0x7a396d15421cf67d, + 0xf2b387a54cdf16e9, + 0x8345da1a9df23657, + 0x857f63da9bf765c3, + 0xdf79e65dcbfa8541, + 0x1f5ade9dc6fb729d, + 0xe53a76bed6fe921b, + 0x874cf53325e1bf67, + 0x96e7da1325f4bed3, + 0x17c524e763f7ed51, + 0x39d2671651e7fbad, + 0xa238e4987fed1c2b, + 0x963742e98cdf2b97, + 0xa2d3fb1dcbd259f3, + 0x51a2c861fbe56971, + 0x3475bc9219e876cd, + 0xadfe347327ec964b, + 0xaf5c819435dea4b7, + 0x83251efa97e1d425, + 0x8c56b92ba4d5e391, + 0x8fb2d34a92b6e1fd, + 0x268f4eadcfda216b, + 0xdab1247fedab2fc7, + 0xd675a4e21cbf4e35, + 0x39b7ca254bc36da1, + 0x1bcef82549c57b1f, + 0x87baf23545d68a7b, + 0xe4c35d9764cba9e7, + 0xe5df39cba3bec965, + 0x57e2689ed4b2e7c1, + 0x6789aeced1b4e63f, + 0xcbe5f42432d7159b, + 0x32e8ab754fcb3519, + 0x5daec9b76ebd4385, + 0xa1cd23f87baf63e1, + 0xe67243ca9ab3815f, + 0x319aeb8dc6947fab, + 0x2bc618aed5b7ae29, + 0x93c4eb21f38abd95, + 0xf76b4833248dcbf1, + 0xd7f21c354391ea6f, + 0x317b8e2762a419db, + 0x7ae149b76fb72a49, + 0xfe29c4d87e9a38b5, + 0xe94c2a8cbcad6823, + 0xfd27ab5dca9e658f, + 0xa72f589fe79284fb, + 0xacbef9d218a5b369, + 0x51ed9a743698b2d5, + 0x2f581ac8769bd153, + 0x2d3694a6526bce9f, + 0x6f5412bba4932f1d, + 0x7132fc5cbf842e79, + 0x6371ef8cbd873ce5, + 0xd2591b31fd8a5c63, + 0x7fa6dc521a6c59bf, + 0x395dbc632a6f793d, + 0x21a3e8b54862b7a9, + 0xe487c2bba695c817, + 0x654ac19cb479d683, + 0x6f51dbeba269c4df, + 0x1e289f5cb17cf35d, + 0x286bda5fef7123c9, + 0xed783c521f965237, + 0x96bfe7d54e7861a3, + 0xc8bf26743a485def, + 0xd9e68ba6594b7e6d, + 0xb9254de9864f7cd9, + 0x87fe5a1ed862bc47, + 0xc574d12fe465dab3, + 0x1ae2c691f468ea31, + 0xf463dba2124af78d, + 0x89bfec25425d17f9, + 0x6cf4ed5a9f513867, + 0xe17f6baa9e7456d3, + 0xe6c4928cbd498651, + 0xef3b164dcb4973ad, + 0x64cfb82fe85d932b, + 0x15bac96fe64fb197, + 0xebc796521752bfe3, + 0xd916e2843745de61, + 0x974bdc665236fcbd, + 0xd437cfe9825a1d3b, + 0x934aed598f3e2ca7, + 0x24173eddce426b15, + 0xba39d7ffed346a81, + 0x7dbc64a1fa2567ed, + 0x5f3ed2b21c2a975b, + 0x87cfa2b4382da5c7, + 0x892e3b68782fc635, + 0x76e5d2ca9753e4a1, + 0xcb561e7ba546e31f, + 0x3f65c94ed349127b, + 0x2d459e1dcf2b31e7, + 0xf2cad9bfec1d3f45, + 0x3b569e854d326eb1, + 0x7bc634265b147c2f, + 0xadb8e7354a157c8b, + 0xd1a4b32656189af7, + 0xd8fe1a6a961dca75, + 0xdc517fbba52fc8d1, + 0x1a5472ddc512e74f, + 0xdea46151f32516ab, + 0xaecb37d6541a3629, + 0x4c3ba6932efb3495, + 0x21f7b3465bec64f1, + 0x62341dc65ade726f, + 0xbc5ea3d879f381db, + 0xfa2e51ccb7e5af39, + 0xd894f3bdc4f7bea5, + 0x518ab2ffe5facd13, + 0x9f5eb6d213ecdb7f, + 0x1d2c3a9654f21aeb, + 0x9842fe6871f42b59, + 0x1cd258a76fe739c5, + 0x63d1fa498deb6943, + 0xea7619598adc569f, + 0xa82569dcb9cf861d, + 0xe3bc9a41f8e2b479, + 0xf8c956e218d6b3e5, + 0xd37815f547e9d263, + 0x7d2eac3654c9d1bf, + 0xf1a5b2c763abef2d, + 0xbf82617ba3d12f89, + 0xde64528a9eb43df5, + 0x3d96a74cbec85d73, + 0x843ba2ffe9b85acf, + 0x7f8e534219bc7a4d, + 0x13b65f8326cf78b9, + 0x1f9387b658d3c927, + 0x576fbce986c5d793, + 0x7d3ba4f983a7c5ef, + 0x12c7bf3a92baf46d, + 0x37b9154dc2be14d9, + 0x2d9fa86fefc15347, + 0xa4e7bf221fc562b3, + 0x24c7deb65ec98231, + 0x8f65a9443ba96f7d, + 0xf5b83ac5468b7de9, + 0x92c1d3b9869fad57, + 0x96715f8ba692dbc3, + 0x83ef95bed5a6eb41, + 0xd467a9ffe2a6f89d, + 0xc2b867a434ac291b, + 0x875c263541be2987, + 0x4baf1d576fa157e3, + 0x7db82f1a9eb48761, + 0xc39147d98c9674bd, + 0x28ce617edc8a943b, + 0x9c47315fe68db2a7, + 0x3dca582fe79fc215, + 0xde7153432693df71, + 0x6be378132374fecd, + 0xf4b3ce5763981e4b, + 0x9da2ebc7618a2db7, + 0x46d1ebaa9f8e4c25, + 0x582d43adce826b91, + 0x24df9e5dcb7368fd, + 0x126ed351fc75986b, + 0x2b968c521b59a6d7, + 0x17ab8343298dc745, + 0x19ac23d5467fd5b1, + 0xcae528da9683e42f, + 0x1a27e46dc496138b, + 0x1f9e48bdc18932f7, + 0xc543be8edf8c4175, + 0x268573ffeb6d5fc1, + 0x5a73c8b32c617d3f, + 0xe47fd1632c537d9b, + 0x27d3ecb54b56ac19, + 0x453bf2776749cb85, + 0x692de459865bc9e1, + 0x9e12bd3ba34ed85f, + 0xcad43f7fe46317cb, + 0xb582a471f1862739, + 0x96e5cdf3217936a5, + 0x269e1cb54f5c7613, + 0x7b624cf65c4d637f, + 0x6f429a587c5182eb, + 0x7eb5394bac64b159, + 0x6d35794dc836afb5, + 0x9fae3c6ed759ce23, + 0x1ac6f9dfe43adc8f, + 0x79be63a2143deafb, + 0x3d61ba8874532c69, + 0xb6e45f2981463ad5, + 0xed562c198f296a53, + 0x16e4cfb98d2b57af, + 0x982e7bdbab3e872d, + 0x5b18d64fec31b589, + 0xfb71269fe923b4f5, + 0xe9f582721a28d473, + 0xc1edf7254638d2cf, + 0x35ab6c48763bf14d, + 0x5439e7a9854f21b9, + 0x9d6e54fcb2534f17, + 0xf268d7ecbf165e83, + 0xef65c82bac175bdf, + 0x3a281561fc1a7b5d, + 0x9de1f4c32b1e7ac9, + 0x6719cd465b21ca37, + 0x24af3e176914d8a3, + 0xb74e8c2ba937e821, + 0x6b542f1ba419f57d, + 0xd8ca476cb42c15e9, + 0x6a3fc4eed31f2457, + 0x7e46c31edef164c3, + 0xa6d3ef432ef68341, + 0xec651d943cf6719d, + 0xa51efcd43ad87ef9, + 0xc6a8fbe548fcae67, + 0x6bf3cd5876efacd3, + 0x2d738c6ba7f3ec51, + 0x3589ca1cb3e4f9ad, + 0x1598b76fe4f81a2b, + 0x794acfb213fc2a97, + 0xfea871c651ed48f3, + 0x7eb81a265fe26871, + 0xe15b79d76be375cd, + 0xe723db498ce7954b, + 0xead89f5dc8e9a3b7, + 0x7392465cb8edc325, + 0xa3bcf5dfe6cfd291, + 0xde29546215a2cfed, + 0xf56be28434d61f5b, + 0x49871c3653d82ec7, + 0xf9c5bd4981eb4d35, + 0x689defb87fbe5ca1, + 0x4d6c72ba9dc27a1f, + 0x1fd729cfecd3897b, + 0x16dc7ab1f9c5a8e7, + 0xf75b9cd219dac865, + 0x6518cbf437abd6c1, + 0x87ba2e1546aed53f, + 0x3bf156c986d3149b, + 0x7ed8159cb5d73419, + 0x743b529dc1da4285, + 0x6128b9fdcfab62e1, + 0x241fb7aedb9c6e4f, + 0x5843dfb32d917eab, + 0xc9f684543cb4ad29, + 0xcbf2419438a6bc95, + 0xb1392ae65698caf1, + 0xb513e8f8748bd96f, + 0xd5c8614a938ef7db, + 0xf361587fe5c32849, + 0x936c2d71f1c637b5, + 0x9e53ad2541ca6723, + 0x7c4f63b32e9b648f, + 0x6325aef54c8d73fb, + 0x5ed1f4a87da1b269, + 0x2916ed598a94b1d5, + 0xec6ad7fcb897cf43, + 0xad58279cb467cd9f, + 0x2d87951fe47afc1d, + 0xe4bd6c73248f1d79, + 0x8492d53764923be5, + 0xa291e6d981a75b63, + 0x8d5671e54e6758bf, + 0x124dfa5a9e6b783d, + 0xfe17d26cbc5e86a9, + 0x8ad5279feb92c617, + 0x82693741fa94d583, + 0xc79a62b21876c3df, + 0x427b6fe43679f25d, + 0x9f7a5c27657d12c9, + 0x6197cfeba59f4137, + 0x912ed87cb1825f93, + 0xb84fd7ca9d645cef, + 0xe567d39cbe487c6d, + 0xbeda8941fc4a7bd9, + 0xd89b6ce21c5eab47, + 0xe59762854a61d9b3, + 0xea83cd176a75e931, + 0x6fde83aa9745f68d, + 0x84c5d3ecb45a16f9, + 0xdbf1586dc38d2567, + 0x6ba2e4fdc17f45d3, + 0xf8cba13fef738451, + 0x3ad257921f4572ad, + 0x7839fed54e58912b, + 0x2dc8ef554c3baf87, + 0xe87f2ad7684cade3, + 0x573cb9dba952ed61, + 0xa2c1fe8a9643fabd, + 0x3965a27fe6571c3b, + 0xb685dc21f3492ba7, + 0x369f8bd3236d4a15, + 0x49f21837624f5981, + 0x6aefcb365f3276ed, + 0xb379c2a98e24965b, + 0xefda7c3a9d28a4c7, + 0xb1afe32eda2bc435, + 0x6e42b1fdc84ed3a1, + 0x2b94537ed853e21f, + 0x792148543945217b, + 0x2f8dc63545362fd7, + 0x792c45f9862a3e45, + 0x6ab35f49823c5db1, + 0xe57fb4a98d1e6b2f, + 0xb4591addce127a8b, + 0x6b3f829edc14a9f7, + 0x4369a851fb18c975, + 0xae762414392ac7d1, + 0x7a5cd844381cd64f, + 0x2a5e6d38783215ab, + 0xe463129cb8163529, + 0x7fa2635dc6184395, + 0x2a61953dc42a63f1, + 0x31f9d82badeb716f, + 0xc4f612bba9ed6fcb, + 0x7aefdb832cf1ae39, + 0xad948fe329f3bda5, + 0xd4b3fa9659f7dc13, + 0x786c9be545e8da7f, + 0x124b37a764daf8eb, + 0x46d193ecb4ef1a59, + 0x94352abed4f238c5, + 0x4d3815afe1f76843, + 0x98a5e3d321e8659f, + 0x19a685d43feb851d, + 0x26f1a7954cdea379, + 0x38b5dec87ad1b2e5, + 0xe83b61fa9ae5d163, + 0x4f3e7b1986b5ceaf, + 0x27eb934ba5b8fe2d, + 0x35a9bc81f4dc1e89, + 0x5a74938214be2cf5, + 0xb39ea47764e25c73, + 0x5d2afe3761d459cf, + 0xb2f14da65fc8794d, + 0x16372eb65edc87b9, + 0xa6fdb58a9aceb827, + 0x2fc849bfeac1d693, + 0x625ce48ed7a3c4ef, + 0x38f297a218b7f36d, + 0x168ac39546ca13d9, + 0x31674dc986cd3247, + 0x714eb52984cf51b3, + 0x7fd5462ba3c47f21, + 0x1f82567a9fa46e7d, + 0x79fd13ccbda67ce9, + 0x8ab94251fd9bac57, + 0x7c964a22198ebac3, + 0xe83f426659b2ea41, + 0x8df3152546a3f79d, + 0x264371ca96c7281b, + 0xc8794ebba4cb2687, + 0xae39d86cb2ac46e3, + 0x37c625eed2bf7561, + 0x37a816bfef9273bd, + 0x4bed35621fa6923b, + 0x7e6a8bc43e98b1a7, + 0xc7e253854b79aef3, + 0xb9a3d6e6598dce71, + 0x63ca52b98671fbcd, + 0xf1b7de8dc7951d4b, + 0x8d96b72fe4962cb7, + 0x5d6e4821f39a4b25, + 0x7d9abc53238d5a91, + 0x2cbe8164318e57fd, + 0xb376e5a54f82976b, + 0xefb591876e84a5d7, + 0x6372b19bad89c645, + 0x9d346a8dc97ad4b1, + 0xd83c1fecb87cd32f, + 0xa87291c1f793128b, + 0xce185bd3289531f7, + 0x46e3b8d324983f65, + 0x47d3a19763795ec1, + 0x6be2c199817b6c3f, + 0xe5968b287e4f6c9b, + 0xe735d9fdce63ab19, + 0xb158a79fed64ca85, + 0xa486c9b1fa57c8e1, + 0xc7bf9562194ad75f, + 0x4b398f63274df5cb, + 0x65fc28987a812639, + 0xcfa5d74cb78634a5, + 0x36715efdc4897513, + 0x7e2dfa4dc15a627f, + 0x962c54bbaf4c71eb, + 0x2f58934edc3e8f49, + 0x5c8d2a721d42aeb5, + 0xb12df6854b56cd23, + 0x2d5e87b54936db8f, + 0x4ebc3a165638e9fb, + 0xe8621bcba74e1b69, + 0x69478d3dc76139d5, + 0x2f7ab84fe2746953, + 0xcf341d6fe13756af, + 0x9ae4dc24314a862d, + 0x69b472143f2da489, + 0x149db2e76c2ea3f5, + 0x14c8a6ba9c54d273, + 0xa3e47bc98935d1cf, + 0xcb57836ba827ef3d, + 0xe16c39aed63b1fa9, + 0x71ba3561f64d3e17, + 0x174d369327415d83, + 0xcd7239a764235adf, + 0x6af9c5b981267a5d, + 0x92efd8a65f1a78c9, + 0xc9b5a2198e1db937, + 0x827a36ca9b1fc7a3, + 0xa5169b8edb34e721, + 0xb56319dfe915f47d, + 0x7db1f5843a2814e9, + 0x8bd7c957691c2357, + 0x3ae746f9871e52c3, + 0x1c284e5cb7538241, + 0xe568c92ba2136f8d, + 0xf231e7a98ce47df9, + 0xf5a2719cbcf8ad67, + 0x2a691fcfe8f9abd3, + 0x7ca9583329fedb51, + 0x2c6a851437e1f8ad, + 0x981a5f2768f5192b, + 0x2e58cd1ba5f62897, + 0xed25146a95ea47f3, + 0xea7f918cb3fd5671, + 0xb168e7fba1ef64cd, + 0x479235eedfe2934b, + 0x4e2b69c21fe5a2b7, + 0x9fa6cb154de9c125, + 0x2e81963549dacf81, + 0x563d9c85469abced, + 0x4128cd5a98d21e5b, + 0x5e9d1bfba6e42dc7, + 0xec8bf79ed6e84c35, + 0x45c62d91f3e95ba1, + 0xef1cab8323dc691f, + 0x42acf7d431df687b, + 0x9e2f83154fc2a6e7, + 0x74d12f398ed4c765, + 0xe254baf87ab8d5c1, + 0xf4ba2d5a98bad43f, + 0xe5fd8a7dc6adf29b, + 0xb7e94121f8d24319, + 0x7ced941329d64185, + 0x2b8c614434b75fd1, + 0x1edf4b7652b96d4f, + 0x6ba289e6519c6dab, + 0x18e4dc276eaf8c29, + 0x325f47698ea2cb95, + 0x6bf7c81edba5c9f1, + 0x74ab6d9fe9a7d86f, + 0xaef54cd21789f6db, + 0x98f2a75438be1749, + 0x1f46e58878c136b5, + 0x6eb38fcba8c57623, + 0xed69f84ba2b7638f, + 0x468729edc1a972fb, + 0x9f7d1eadcf8da169, + 0xb574f96edb7e9fc5, + 0x95a4bf221d92ce43, + 0xe71b8fd32a74dc9f, + 0xa2d19bc54987fb1d, + 0x3627a4f6568b1c79, + 0x21d6aefa968d2ae5, + 0xb659823ed7b15a63, + 0x8549f72ed29357bf, + 0x9ce53161f1a6873d, + 0x1cad9483217b85a9, + 0x1294a6743f8db517, + 0x23b86df65d7fc483, + 0x374ec2f76a73c2df, + 0xb853e6da9a86f15d, + 0xfc42836eda7821c9, + 0xe34685aed68b3f27, + 0x41ca3921f57d4e93, + 0xca1f4de324715bef, + 0x5b8adef542837b6d, + 0xdfba97e541657ad9, + 0x13d2bf876f59ba47, + 0x2ab859c87e5dc8b3, + 0xbf7194cbab6fd831, + 0xa5f8d13dca62f58d, + 0xf5b47a3fea7615f9, + 0xf8b75c221b8a2467, + 0x4ab817f3287b54d3, + 0xde34b1fa968e7351, + 0x1a65d87a946271ad, + 0x8fb1d93ba2648f1b, + 0x4f32e78cbf35ae87, + 0x4926d5fcbd48ace3, + 0x9624e8a1fa4bdc61, + 0xa63bf2c2183fe9bd, + 0x218a39665c641a3b, + 0x2ae578176b4529a7, + 0x1a582f4cb86a4915, + 0x1356fd7cb64c5781, + 0x9bc1524ba23c65ed, + 0x7928af3fe261945b, + 0x1a75983fef24a3c7, + 0xb57e2fc21f48c235, + 0xa13df8465e49d2a1, + 0x8edf61354829befd, + 0x741b6cf6582dfe6b, + 0x9cf26bdba9432ed7, + 0xf69e4badc9273d45, + 0x91876a4fe6385cb1, + 0x53ad826fe43b6a2f, + 0xeafc4562132e698b, + 0xafbe13965231a8f7, + 0xd8ae1c376f13c875, + 0x7e9b2fa98e27c6d1, + 0x1963b7598b19d54f, + 0xe14fd5ca981cf3ab, + 0xae9645feda3f1429, + 0xae753141fa134295, + 0x3f278da5493762f1, + 0xd2cb76a434186e5f, + 0x4e3a268653196ecb, + 0x6c1582a8721e8d39, + 0xb4ca5f376def9ca5, + 0xf5a4328a9cf4db13, + 0x47d9e5acbae4d97f, + 0xfd538eadc8d6f7eb, + 0x3ad9b6432afc1859, + 0xa97d5b1438fe27c5, + 0xd42c763989f16743, + 0x1cb3f6a985e3649f, + 0x9f38e1bba3f7841d, + 0x3294a8ddc1fba279, + 0xf21d5baa9fdca1e5, + 0x42f79b5edacebf53, + 0x6b7c235219b2cdaf, + 0x5fd8ac7439b5fc2d, + 0x6f3d9a854ae71d89, + 0x5e3adf1767da2bf5, + 0xcf3d857a96de4b73, + 0xc53f264ba4d158cf, + 0x1e3a9fbdc2e3784d, + 0xa2365be1f1e586b9, + 0xb2e1695431eab627, + 0xdb1f9a732fbdc593, + 0xdb3982a54a9db3ef, + 0x19b6edf87ab3f26d, + 0xf162e5d98ac612d9, + 0x6b254d3dc9da3147, + 0xa7169bced6cb4fa3, + 0xbe14c5d1f5bd6e21, + 0xe68ba41324b16c7d, + 0xe65a297542c37be9, + 0x61fde73541d6ab57, + 0x38acb1d65fa8b9c3, + 0xc61b32a87eacd941, + 0x5ca2d4887a8fe69d, + 0x52c7d16feac4271b, + 0x4e5631c1fac62587, + 0xd78c6a2218b945e3, + 0x278945d438bc7461, + 0x9fb2ea16549e62bd, + 0xb96d532985c2913b, + 0xcd596e3981b3af97, + 0xdf6713ea9e86adf3, + 0x61c83fecbe89cd71, + 0xedb95481f869eacd, + 0xf32c5b42197efa4b, + 0x87f6bad54c932ab7, + 0x23e1c8b769b74a25, + 0x5a3f48d876ba5891, + 0xf7b1cd8a938a56fd, + 0xde81694dc29e856b, + 0xaf4c9d1fe291a4d7, + 0x8c9d7f1fef96c345, + 0x6e5791c32f87d3b1, + 0xa952cfd54c79d12f, + 0x65ed9a24395aef7b, + 0xb8f93ec6596d1fe7, + 0x4cf367acba923e65, + 0x1453c9acb7865dc1, + 0xf3ec1b9ed4786b3f, + 0x3e849d51f25c6a9b, + 0x5e9dafc3236e8a19, + 0xa528cf654271c985, + 0x2b14af865f64c7e1, + 0xf6ced1598c47d65f, + 0x9d58e4287a58f4cb, + 0x9372da4dcb7d1539, + 0x96b845ced97f23a5, + 0xa43b7c61fa957413, + 0xa7bf81c32985617f, + 0x5b7fa6e323476fdb, + 0xc8241757625b8e49, + 0x2e5db898714e9db5, + 0xbd65f84a9f61dc23, + 0xfe5c328a9c43da8f, + 0xa7fe125dca35e8fb, + 0x3b46ed91fc4b1a69, + 0x6739c4d21a4c28d5, + 0xb31a68432a6f4853, + 0x215f34c8784265af, + 0x8f5de36ba746852d, + 0x63185eddc247a389, + 0x3ba895edc14ba2f5, + 0x64d7eafcbf4ec173, + 0x4659af3eda31cebf, + 0x264b3df21b24fe3d, + 0x917b32854c361ea9, + 0x3d987eb76b4a3d17, + 0xc32a84b8792d4c83, + 0xf41c59d9862e49df, + 0x1b29754dc632795d, + 0xd57c382fe32487c9, + 0x864e93c1f129b837, + 0x1953cd65412bc6a3, + 0xb39cdf265f3ed621, + 0x1a8f4ec76c21f37d, + 0x2976fd398c2513e9, + 0x45321d7cbc193257, + 0xe5afb96ed92a51c3, + 0x52ce981ed82c6f31, + 0x43987fedc41f5e8d, + 0x2c5aef6435127cf9, + 0xf23e6d765314ac67, + 0x38c1b4576217bad3, + 0x94c5dfb76ef9da51, + 0xd6e1724659fbe7ad, + 0xcbd245a989def72b, + 0x9f26e5bedbf32697, + 0x5a13f4bed9e746f3, + 0xe591bda329fa6571, + 0xe31549a325fa63cd, + 0xef982d4765fe824b, + 0x916ab3d984f2a1b7, + 0xc86f2daa92e4bf15, + 0x5ec7fb4a9fd6ce81, + 0xf5e2b13989a7cbed, + 0x169b5a4fe8dafc5b, + 0x786b94d329df1bc7, + 0x523bd7176ae24b35, + 0xf6859ec548e659a1, + 0x4de568b875d9681f, + 0x84cd32ba93ec867b, + 0x7d4163cba2cd95e7, + 0x2816759ed2e1c465, + 0xc65ba9ffefb5d4c1, + 0xeb4876921eb7d23f, + 0xe26bd7a43dc8f19b, + 0xa15efc776bcd3219, + 0x4cf8957769be2f75, + 0x26dfe3ba98b35ed1, + 0x3b67f49ba7b56c4f, + 0x6d2f35afe3d76cab, + 0x6843e791f3dc8b29, + 0x59e7fc2212ceba95, + 0xc8f61ab653b2c8f1, + 0xdb53c9154ea3d76f, + 0x798623c54c96f5db, + 0x96da7fc98dcb1649, + 0xd8231efdc9ad24b5, + 0x57ef8b3ed9bf6523, + 0xf391278fe7b3628f, + 0x394fc87326a571fb, + 0x1eb459c323b78f59, + 0xb3fe79a5428a9ec5, + 0xbf41e968719ebd43, + 0xb7ae89576e71db9f, + 0xf7e354ca9c84fa1d, + 0xc2d4678feda61b79, + 0x7b4361e1fb8a29e5, + 0xf5b398621bad4963, + 0xbe5c49f3278e46bf, + 0x216ecb4657a2863d, + 0xb89e3c4873b584a9, + 0x2938db1dc3a9b417, + 0xf178eb4ed19bc283, + 0x2a6d357a9e6cb1df, + 0x9742defdcb71ef4d, + 0x7d8baf132d741fb9, + 0x5fd63b754c983e27, + 0xbcd874165b7a4d93, + 0xeabf9436576b4aef, + 0x6572ebaa947f5a6d, + 0xf215e36dc46278d9, + 0x562f9bafe285b947, + 0x24a593b1f168c7b3, + 0x715edf25428bd731, + 0x6c8de1332f5ce48d, + 0x73f89ec76d7214f9, + 0xbd7916cbad952367, + 0xe91c5b6bab7852d3, + 0x1b3e942eda8b7251, + 0x49a2d61dc64b5f9d, + 0x4e52f98ed45f7e1b, + 0x6a5fbde21452ad87, + 0x1b3cadf54265abe3, + 0xea8b3d187258db61, + 0xd9c12f365f39e8bd, + 0x492c51f87c4df83b, + 0x6a589e3dcd5128a7, + 0x539a24dfec764815, + 0x84936b11fb495681, + 0x64fe9b32183964ed, + 0xd7a3c613274d835b, + 0x4b2c8a37654f92c7, + 0xce3f297ba674c135, + 0x71b928dba245cf91, + 0x617af4b98e26bcfd, + 0xf8c17bdbac29fd6b, + 0x4329a6e1fa3e1cd7, + 0x8bcf67e32d613c45, + 0xdce1b8776c345ab1, + 0x8fe9c2765a37692f, + 0x41ca83ba952a678b, + 0x1e65b98ba42c96f7, + 0x9b1a27edc32fb675, + 0x7f5b619fe243c5d1, + 0x3d9ef5adce16d34f, + 0x2167a9c43e17f2ab, + 0x7314cd976e4c1329, + 0xdeb985287c2e3195, + 0x291c57698a325fe1, + 0x4269731ba9136d5f, + 0x6cf89deba7156dcb, + 0xf9625c7fe51a8c39, + 0xa4e27511f31d9ba5, + 0xb1e738a5452fca13, + 0xcadf23e65312d87f, + 0x7f25c9d54cd3f6eb, + 0xfbac89176df81759, + 0x7c2ad9498bfa26c5, + 0x98da574cbafd5643, + 0x37d4cf2cb7de539f, + 0x2ba4fc8fe7f4831d, + 0xb69ae3d326f5a179, + 0x7e598cf323e79fd5, + 0x3fe127a762fabe53, + 0x24cb671651edbcaf, + 0x235961887ec1fb2d, + 0xb921d74bade41c89, + 0xeb1653adcbd72af5, + 0x27c16ab1f9eb4a73, + 0x86425df218db47cf, + 0xa87534e328cf674d, + 0x6c1eb23546e285b9, + 0xf8bad3ca94e6b527, + 0xf1e6b24ba2e8c493, + 0x3b6f254981c9b2ef, + 0x7e6adfca9face16d, + 0x985deab1fec321d9, + 0x27d9e6f21dc52f37, + 0x61b4f3932bc74ea3, + 0x179fe4c659ca6d21, + 0x6a3e178546ac5b7d, + 0xbf2d1e3874bf6ae9, + 0x9173d2bdc4d2ba57, + 0x3db56acfe2d5b8c3, + 0x3ac91521f2c9d841, + 0xf1d4967321bae59d, + 0xbf1cea543e9df51b, + 0xd29ceb376ec12487, + 0xae2467598cb654e3, + 0xc4d5f69babc97361, + 0x9f5a378dc7a961bd, + 0x51ac46eed59c7f2b, + 0x475b6e8ed3af8e97, + 0x63c274a21592acf3, + 0x72e1f53543a5dc71, + 0xa391bed54186e9cd, + 0x81b6de465e7af94b, + 0xc31289576d8e19b7, + 0x2f8ae93dcdb14925, + 0x7acb35dfecb45791, + 0xdf79c8afe89765fd, + 0x9cf82532179a846b, + 0xbf375e83258c93d7, + 0x1c82e548769fb245, + 0x93615ad98594d2b1, + 0x8cb31e6a9285ce1f, + 0x72be15aa9d56fe7b, + 0x45a81e9cbc6a1de7, + 0xc7a36591fb8e2d65, + 0x19d2bca43d825bc1, + 0x1687be432b846a3f, + 0x8791fb443a75689b, + 0xe6af5248756ba819, + 0x74e9b26ba36db785, + 0x71b845cba37fb6e1, + 0x9e5d18bdc182d45f, + 0x5e18cf4ede65f3cb, + 0x6e93a7132f7a1439, + 0xb68c7ae54e7c32a5, + 0x35edb6887c8e6213, + 0x35612fa98a715e6f, + 0x6bf7c13a98536edb, + 0x21eabf5dc7568d49, + 0x5c214a6fe3489cb5, + 0xe795ca41f46dcb23, + 0x25b63a42124ec98f, + 0x5e6192b54152e7fb, + 0xd1529b687f451869, + 0xe975d4298e4927d5, + 0x7638fc1bad6c4753, + 0xf861c42cb93d54af, + 0xad25b31fea61842d, + 0xb9136271f754a289, + 0x4edf63132847a1f5, + 0x8b3fdc532549bf63, + 0xabdf28165239adbf, + 0x8f523bd8714fec3d, + 0xfa1569c98f431da9, + 0xf346dcacbe463c17, + 0x6ba8d15fed294b83, + 0x51c68d3fe92a48df, + 0x4d7ca5921a2e685d, + 0xfec3b9d54a3186c9, + 0x45a1bfe98924b637, + 0x4f8b2a7a9627c5a3, + 0xa1dfc86cb64ad521, + 0xb4c5261ba13be27d, + 0xc8471b5bac2df1e9, + 0xb94527a1fe243157, + 0x15ef3b832d164fb3, + 0x3a874dc65c296e31, + 0x5f982ea5491a5c8d, + 0xfa4c9b16571d6bf9, + 0xefa748ddc821ab67, + 0x934e15adc614b9d3, + 0x29ba38dfe427d951, + 0x5d7863b1f218e6ad, + 0xa1bd7655431cf62b, + 0x6cf89d143dfe1597, + 0xd329fcb87ce145f3, + 0xae4b7d3a9cf56471, + 0x45efd29989f762cd, + 0xda6b37edc7fa814b, + 0xe19c275cb4ec8fa7, + 0x438dabfdc4dfae15, + 0xbde5a4f325f3cd81, + 0xa92468d432f4caed, + 0xaf7cb2d541e7fa5b, + 0x39a21d765feb1ac7, + 0xc67f5b298cde2a35, + 0xfd72398cbce258a1, + 0xe4761a8dcad4671f, + 0x71b64a51f9e6857b, + 0x4dfb63e216da94e7, + 0xcf79d48327edb365, + 0x31a9de2765dfb3c1, + 0x7e5f32a985c4d13f, + 0x3bc21a8871c4ef8b, + 0xa42f5cea9db81ef7, + 0x12e547bbadcb2e75, + 0xcb829561f9ae4cd1, + 0x3af78e632ac16b4f, + 0xac73d49328d369ab, + 0xc75d21a547d68a29, + 0x95ae7b4764dab895, + 0xe7159af984acb7f1, + 0x73cad18a92aec56f, + 0x14697dfdc1a2f4db, + 0x3815964fefc71549, + 0xcbe457321fc923b5, + 0x7b9234d65ebc6423, + 0xbd9831254bad518f, + 0xab3742f658916feb, + 0xe3789dbba7b38e59, + 0xac2f564cb4a69dc5, + 0xd42fba9fe5a9bc43, + 0xcab48f1fe27bca9f, + 0x834e5d63238fe91d, + 0x81a4e32652c31a79, + 0xed368f154fa628e5, + 0xb1ed25987eba4863, + 0xd453f1887c8a45bf, + 0x91d7326cba9e753d, + 0xb8793a2fe7b183a9, + 0xb61e9341f8a5b317, + 0xfa175e6326a7c183, + 0xea7bc3f32367aecf, + 0x1a46d826527ace4d, + 0x84cde976516efdb9, + 0x94e3bf1baf943d27, + 0x6edf532cbe864c93, + 0x435d716dcb6749ef, + 0x1a3c8471fa7b596d, + 0x3ed4ab621a5e67d9, + 0x514cbf243a91b847, + 0x723c4a165784c6b3, + 0xe793fbdba598d631, + 0x1379e42ba269e38d, + 0x38fdc9bba16be2f9, + 0xf8a7295dce8f1267, + 0x7168e431fe8451d3, + 0x14a859b32d876f41, + 0x5934c7d32b475e9d, + 0xd956ba25495a7d1b, + 0x4fc7b186564e9c87, + 0xbd3c861a9761bae3, + 0xdea4657dc574da61, + 0xf84d97edc245e7bd, + 0x56f8132fe159f73b, + 0x7d9ac464325d16a7, + 0x29367de54e6f3715, + 0x7f6d43ea9e736581, + 0x94562c198b4563ed, + 0xb5e3129bac49825b, + 0x17ae93fed84b91c7, + 0xeb3a928dc74daf25, + 0xa53c7d21f652ce91, + 0x84a752f21543cbfd, + 0x5d72a8b54235fc6b, + 0x349b281762491bd7, + 0x21ed3f598f3d2b45, + 0xc1aef4698d3f49b1, + 0x98fc354cbc43682f, + 0x937b214fec24768b, + 0xfb8d269fea2895f7, + 0xb4a38652192cb475, + 0xd93c21e6573eb4d1, + 0xfd714a298751d24f, + 0x29157ed98534f1ab, + 0x6971d82dc4583129, + 0x48c37a1cbe1a2f85, + 0xbe65c39bac2b4de1, + 0x926514aeda1e4c5f, + 0x874e69f43d126acb, + 0xe1b7ac654c158b39, + 0xb7f5e9254817b9a5, + 0x69b5a7e9872bc913, + 0xe518dbfa941dc67f, + 0x9274c8bba421f5eb, + 0x7b85ac3fe3241659, + 0x7eab315edef724c5, + 0x54ead3921efa6543, + 0xfe6d71c43ceb529f, + 0xa134dfb65afe721d, + 0x6dce7b465ae18f69, + 0xab5197c987f39ed5, + 0xc89e523ba6f7bd53, + 0x7b1845aa93e7cbaf, + 0x9a85723dc3fbea2d, + 0x26a9345212defa89, + 0x4f759cb761e329f5, + 0x8a731c265fe64973, + 0x9486b1365bd846cf, + 0xaf4739598aeb764d, + 0x31d68f2ba8de74b9, + 0xb148265ed9e1b427, + 0xb8ec5691f7e5c293, + 0x6843cfd325c6b1ef, + 0xc735489323b8cf5d, + 0xbfe1ad2542bafec9, + 0x4c6a13b982cf1e37, + 0x9af315b98fc24da3, + 0x168b749baed76c21, + 0x641f9a2febc85a7d, + 0x3e59b781f7cb68e9, + 0xdf56472218cea957, + 0x61b537f548d1b7c3, + 0xcd59ba8768c5d741, + 0x1ca3d42873b6e49d, + 0xad956fc983c9f41b, + 0x3c5d9a8cb2cd1387, + 0xd53a129cbdaf42e3, + 0x42d15871fec47261, + 0x3f75d8b21c945fad, + 0x6f729d843ca87e2b, + 0x97fcaeb436ab8d97, + 0x3b897166568d9bf3, + 0x6fd3c8aa96a2db71, + 0x7bdce48ba493e8cd, + 0xbe791f2ed2a6f84b, + 0xb93285e1f2ca18b7, + 0x291d56e541bd3825, + 0xa8ed9f643eaf4691, + 0xb8fde2c65c9264fd, + 0xa1f48de87da5836b, + 0x1a429fc76ba892d7, + 0x4f5c821ed89cb145, + 0x6df873adc57dbfa1, + 0xa6b29d8fe582cd1f, + 0x2e74ba321483fd7b, + 0xec2bfa6543961ce7, + 0x6df59428719a2c65, + 0xef3b84c76f7d4ac1, + 0xa45c3d698c7e593f, + 0x75a1d9bdcd82679b, + 0x25d9c43fec85a719, + 0xa2946cb1fa79b685, + 0x1fb97463287ab5e1, + 0x391857f3267dc35f, + 0xcbd724a76571f2cb, + 0x7fc5a93cb5a61239, + 0x1e48fb2dc29831a5, + 0x469857cbad694ef1, + 0x78d3954bac5b4d6f, + 0x8cd4769fe94f5cdb, + 0x6c3ae2f21d628c49, + 0xc18e5d632c649ab5, + 0xe3ad69b65968ca23, + 0xed2583f7654ac78f, + 0xabe59629834cd6fb, + 0x527f146ed4821769, + 0x39ca46bfe18426d5, + 0x364b98ffef794653, + 0x832d96a21e4953af, + 0x3b81c6254e5c732d, + 0xa36b49765c4f7189, + 0x9625a4d87a429fe5, + 0xf27d3b6ba945be63, + 0x512c437a9536acbf, + 0xa8471bedc549eb3d, + 0xb271d89fe23dfba9, + 0xafb93cd545623b17, + 0xd2948c6871654a83, + 0x6319aef65e2647df, + 0x62f53e998e2a675d, + 0xadeb2c998b2d75c9, + 0xa493b87dcb2fa537, + 0x62f4359fe952c4a3, + 0x7c216be1f957d421, + 0x3e1795b32638e17d, + 0xec742f543428efd9, + 0x9deb26c9853d1f47, + 0x6f3d2e5a92514eb3, + 0x8163decbaf256d31, + 0x5d87bfcbae165b8d, + 0x2fab5e4edc186af9, + 0x687e3451fb1d9a67, + 0xbf3d56c3291fa8d3, + 0x213f54876a23d851, + 0x3c1f7ed76714e5ad, + 0x6b57c84a9618f52b, + 0x5c981d3cb52c1497, + 0x93146d7cb51d24f3, + 0x1a437fecbdef5371, + 0x165297ffebf361cd, + 0xe8a423b21ce57f3b, + 0x18be73f32bf68ea7, + 0x2a89c5f548fbad15, + 0xecd37b2656febc81, + 0x28693ad875f1c9ed, + 0x1bf8ed9ba4e3f95b, + 0x64a8b92ed3f619c7, + 0x4d5af31fe1fb2935, + 0xfeb186c432fd47a1, + 0x8e94bfd43dce561f, + 0xc6f78b165de2847b, + 0x7432ae876bd593e7, + 0xb16fca998ae9b265, + 0x54b837ea97eab2c1, + 0x21b68e5a95acbe2f, + 0x8396bfaed4c1fe8b, + 0x1759ce8325c41df7, + 0xb9adf7c543e82d75, + 0x5da183b762e94bd1, + 0xdb78c3276ebc5a4f, + 0xa174f9e76dcf58ab, + 0x8a5192ecbcd3a829, + 0x9d185f2fead4b795, + 0x3dfa1c4fe7c8b6f1, + 0x28b45fa217bac46f, + 0xc537db83259ce3db, + 0x9f217d4987d21349, + 0x67d2feca94d632b5, + 0x8d324f7cb4d96123, + 0xfd1e27b98da94e7f, + 0xd71a63fa9c8a5deb, + 0x6a51b94febaf7d59, + 0x35f24cd21da29bc5, + 0xa1fcd93329a6cb43, + 0xb21a4df435a6c89f, + 0xe295dc17659ae81d, + 0xca321f6983adf679, + 0xba14f7ddc4b127e5, + 0xa132869fe1c54763, + 0xcb6957aede9754bf, + 0x93528bf21f9a743d, + 0xa5efc7943e8d72a9, + 0x631de7f65c9fa217, + 0xdc128e576a92bf73, + 0x45adc6e98674adcf, + 0xcb25864ba587ec4d, + 0xb81f9e5ed368fcb9, + 0xa472db31f49e1c27, + 0xf8a7d53325a14b93, + 0x964ae8f6519348ef, + 0xad1be6943f97586d, + 0x2731e6b54e5a76d9, + 0x3db6fa2a9c8da647, + 0xdab859fdc97fa5b3, + 0x15863d7fea94d531, + 0x549ebc11f675e28d, + 0x4c6e3ad32567e1f9, + 0xa6df2355459c2167, + 0x48732bf7647d2fc3, + 0x95142dbba3926e41, + 0xab7951398f635c9d, + 0xcd15264bae567c1b, + 0x4f37169fed4a9b87, + 0x95ca2611f85ca9e3, + 0x65fe7ca32a5fc961, + 0x267ad9543852e6bd, + 0x86c23e154875f63b, + 0x1382e95cb46915a7, + 0x3a9721fcb48c3615, + 0xbdfa659dc27e5481, + 0x1375f64cbf5162ed, + 0x6e2b1831fe64815b, + 0xa94758221d358fb7, + 0x52ed87143c49ae25, + 0x916a7db6584cbd91, + 0x172d3bc6563ebafd, + 0xe7bc2ada9742fa6b, + 0x3d75a46dc6451ad7, + 0x6f12793fe3692a45, + 0x27bae5d1f25c48b1, + 0xb2d497f4314d572f, + 0x3d18a9654f31758b, + 0xeb41a5776d2394f7, + 0x6125873a9d28b375, + 0x9a5fe1798a49b3d1, + 0xdf71e85ba83bc14f, + 0x425e6cdba52edf9b, + 0x91876acfe7542f19, + 0x538ca6b217362e85, + 0xfb7c184765384ce1, + 0x295436d8712a4b5f, + 0xa4efc7276f1e59cb, + 0xad165f7cbe218a39, + 0x4e3a5b8dcd13b8a5, + 0xfa81594feb27c813, + 0x8f2945cfe819c57f, + 0xfbe1a373271ad4eb, + 0x2983d165471ef359, + 0xb324751a981423c5, + 0xcea9d81cb7186243, + 0x5d7c13ecb328519f, + 0x2f85ea487cd85efb, + 0x342d516babfc7e69, + 0xc29471fcb9ef8cd5, + 0x38a2dc521af2bc53, + 0x8a7961f327e4c9af, + 0x96b5a37546f7e92d, + 0x3b79df4654ebf789, + 0xb5a342da94ed18f5, + 0x7a5ef24dc5f14873, + 0x64f91cecb1e345cf, + 0x97f6458dcfe8754d, + 0x2cba86d21fea73b9, + 0x6b37d8c54ceda327, + 0xd2be6f765adfb193, + 0x6974f1e657b2aedf, + 0x3f2596d987b4ce5d, + 0xbd7e943984b6fdc9, + 0x5d62183dc5eb1d37, + 0x974e1b51f4de2ca3, + 0x6a9fbe3545e36b21, + 0xae951db541e3597d, + 0xc27a4de43fc567e9, + 0xdb7c28954edba857, + 0xc2a46b3879bda6c3, + 0xdc562bfba9bfc641, + 0x7f13ad2dc7b2e39d, + 0xf2a835dfe7c6f31b, + 0xd5b682a436da1287, + 0xc27f1e8656cb41e3, + 0xe82b4d9873bd4f51, + 0xbe21c9d872b15ead, + 0xb314ed698fa47d2b, + 0xc34856ebaeb58c97, + 0x8ab5c31edcb89af3, + 0x35471ce1f89dca71, + 0x5e6b39d2168fb7cd, + 0xf6ac278438a2f74b, + 0xdaf9ec6548c516b7, + 0x8acb742a96ca3725, + 0xe72dfc6ba3bc4591, + 0x93b4c61ba19c53fd, + 0xa76ec49edfa1826b, + 0x16eca4d1fea491d7, + 0x2cd4a6f21d97af35, + 0xd48eb1c43c78bea1, + 0xe238a655487abc1f, + 0xe97cb535456fec7b, + 0x9378ec1ba6931be7, + 0x1b698afed4a72b65, + 0x67dc58afe3a849c1, + 0x4f68513fe19b583f, + 0xd35e47b3218e569b, + 0xc1b953654f82a619, + 0x245a3f776e93b485, + 0xef9c58376c87b4e1, + 0x3275cbd98a79c25f, + 0xf26ba78a976ae1cb, + 0x5e974a8cb56def29, + 0xf73d984fe6832f95, + 0x7cb93fa325864df1, + 0x25e4687432784c6f, + 0x135c67b541695adb, + 0x25e9f7876f5e7b49, + 0xa4d921398e61a9b5, + 0x84369cecbd75c923, + 0x72a861ceda45c68f, + 0x2478b3ffe748d5fb, + 0xf47b2ce2185cf469, + 0xafb1ec54387f14d5, + 0xf57e831ba8926453, + 0xe8b5c47a937652af, + 0x7182e6ccb369712d, + 0xc7b31debae3b6f79, + 0x4bf239ebab3c8de5, + 0xec2684d1fc51bd63, + 0xfdc74e621943cabf, + 0xc4763f932946ea3d, + 0x813cf5254637f8a9, + 0x286ab54a985d2a17, + 0x3c91da5cb65f2983, + 0x23517a4cb35246df, + 0xc31a768fe134765d, + 0x8152d3ffef2874c9, + 0x3e5f26c21f2ca437, + 0xf2d914e65d4eb2a3, + 0xd14ae3298c64d321, + 0x9cd8ab187923cf6d, + 0xefb149398725fed9, + 0x148bfdadc83a1e47, + 0x1329876fe64c2db3, + 0xd48f632fe64f5c31, + 0x6543dbf214325a8d, + 0xe6d983c6512468f9, + 0xde23cf854f18a967, + 0x591a3bf76e1ba7d3, + 0x2c4f5e3a9b2ec751, + 0xfe7cd32cb921e4ad, + 0x3c4eb85ed915f42b, + 0x3574b2a1fa281397, + 0x23b71e86581a42f3, + 0xe283c457683d5271, + 0xe71daf47631e4fbd, + 0x7f4ec52a94127e3b, + 0xe4f725b76ef38da7, + 0xc4813a7a9df7ac15, + 0x85193fbedaf9cb81, + 0x1e34d9adc6fab8ed, + 0x5974b68217dfe85b, + 0x351cbae549f318c7, + 0x2e9f3b1769f72835, + 0xe12356a985f946a1, + 0x6354ed7a93eb651f, + 0x38e9576ba1fe637b, + 0x817fc34cbfd192e7, + 0x647bce11fde4b165, + 0xb4fe67d32cd6afb1, + 0xd97af65439c8bd2f, + 0x4528f69436caed8b, + 0xfb683d5545adebf7, + 0xcf978dbba8e32c75, + 0xc2e1859cb5e64ad1, + 0x3e5a679dc2d8594f, + 0xa3c5eb21f1ec57ab, + 0xcf9a814431de8729, + 0x47b2df943fd1b695, + 0x2491ec876dc4b5f1, + 0xaf392ed65ab7c36f, + 0x3bfd279767a8e2db, + 0x4369b75ba7bcf149, + 0x6917c52ed7cf21b5, + 0x3129a46fe7c45f13, + 0x28f49c3213b54d7f, + 0x4192ad8432a75ceb, + 0x3a265d9541db7c59, + 0xca3d17954f9e8ac5, + 0xa173e5298eb1ca43, + 0xde5cb7a98ba3c79f, + 0xa64123ddc9a6e71d, + 0x2c697f1fe6baf579, + 0xca76db8328ac16e5, + 0x8b12e7c548bf2563, + 0xd86f5a2876a253bf, + 0xe85c2fba94b6723d, + 0x2d59c37cb2c871a9, + 0x57b6348a9d7a8ef5, + 0xd194e82cbc8dae73, + 0x618ac3bfe971abcf, + 0x26ba5f321a83eb4d, + 0xc4685ba32875fab9, + 0x8431af26589a1b27, + 0xd568cae8768d2a93, + 0xf83d726a948d37ef, + 0x847516edc3a2576d, + 0x683219bfe1a475d9, + 0xbac875ffef89a547, + 0x658c73221f7ca4b3, + 0xecb12f365d8ec431, + 0xe7346b865b72e18d, + 0x172cb6865863dfe9, + 0x928fd61cba981f57, + 0xc457e9fcb6792ec3, + 0x71b5f26fe68c5d41, + 0xfcb2461fe26f4b9d, + 0x34cb618324837a1b, + 0x842cda1431649a87, + 0x21be3fd54f57a8e3, + 0xca2384187e5bc861, + 0x4e1a6238794ec5bd, + 0x1be7f6adca71f53b, + 0x72d6a59feb8514a7, + 0x7a1d8961fa893415, + 0x1a95ed83297b5381, + 0x9bef4c24346b51ed, + 0xaf961e48725e6f4b, + 0x1a4e36ca91528eb7, + 0x2d78a5ea9f46ad25, + 0xc274598bae47bc91, + 0x912e6d4dca38b9fd, + 0x9cb647d1f83de96b, + 0x4af126743b5219d7, + 0xb5cda2643b762945, + 0x23c81e77695847b1, + 0x2fa1d34a974a562f, + 0x1432e97ba23d648b, + 0x3a8d196cb14e83f7, + 0x9f8265cedf43b275, + 0xba2d5c41fe46b2d1, + 0x3fbc6e521c27be3f, + 0x82b7efc43a28de9b, + 0xebd7fa66583cfd19, + 0x12fb3caa9a412d85, + 0x25fdb8cba8354be1, + 0x1d2ba93dc6274a5f, + 0x1ba94f5fe32958cb, + 0xe1396241f12d7839, + 0xe2574894312f97a5, + 0x431a87976f24c713, + 0x92cbd8576d15c47f, + 0xb4cf57976a17d3eb, + 0x2f6c57998a1bf259, + 0xced8526cb93e12c5, + 0x8634b72fea526143, + 0x5821e36ed6134e8f, + 0xde69ac3324165dfb, + 0xa9e6b235431a7d69, + 0xde59b847621c8bd5, + 0xcad513476dfeab53, + 0xd35c24f76be1c8af, + 0x421573ca9af4e82d, + 0xd761af4dcae5f689, + 0xc53f914ed8ea17f5, + 0x45f67ab219fd2673, + 0xc37fb64326de34cf, + 0xd3425e7986f2734d, + 0x3162794983f572b9, + 0x3e51862cb3f9a127, + 0x8a1e2bd87edbaf83, + 0x4ca65bd878ab9cdf, + 0xc8e19b31f9b1ec5d, + 0xde246f9218d3fbc9, + 0x9b2dfae54ae81c37, + 0xd9486b2657e92ba3, + 0xeb2f7d3987ed5a21, + 0xab8fd71a93cf487d, + 0x97f4e15cb3d276e9, + 0x36b5479ed1e4a657, + 0xc4f659bfefd8a5c3, + 0x57fb8da32fdbc541, + 0x786492e43baec29d, + 0x3c41e8976ac3f21b, + 0xe3d2b41a9bd52187, + 0x1a382c7a98b72fd3, + 0xe41af78cb7ca4e51, + 0x89b14adfe39b4cad, + 0x82f976dfe3af6c2b, + 0xd4f6a23213d28b97, + 0xb2719e3541c5a9f3, + 0x6a925c754fb8c971, + 0x89b2ca154e89b6cd, + 0xe16d8cb87a9de64b, + 0xa8739fbedac215b7, + 0x4829c35feac73625, + 0xbc2ea9d1f7c85491, + 0xc2b6ed5216a952fd, + 0x52687a1434ad716b, + 0x3d69b515429e6fc7, + 0x69b5f12981b2ae35, + 0x5f36b1e87f85bda1, + 0xb7a48c3a9d87cb1f, + 0xf56183bedc69ea7b, + 0xe59cb68ed86cf9e7, + 0xa8ce1d443cb12a65, + 0xc97d6fb439a548c1, + 0xde92b1c546a8573f, + 0xf36e4858738a659b, + 0x2c658a3cb3ad8519, + 0xd416f28dc19fa385, + 0x35b74f1dcf84b3e1, + 0x64218cdfed86c15f, + 0x9f7462d21c56dfab, + 0xe5cd61243b6afe29, + 0xaf1e58b54a7d1e95, + 0xe86d2c1879824cf1, + 0xeb18672ba7834b6f, + 0x6152bfddc37659db, + 0x716a3f9fe26b7a49, + 0x8b49e5c1f16d98b5, + 0x2dca8f65417fb823, + 0xd65412843e62c58f, + 0xd4fe68c43c65d4fb, + 0x35eb16a87c58f369, + 0x7f16d5ea9a7b13d5, + 0xa584e12dca8e4253, + 0xea65cb4ed87251af, + 0x94b8c31fe5746f1d, + 0xb58cad7213456e79, + 0x4251876432498ce5, + 0x542acfe8715dac63, + 0x4e86c1f65d3ea9bf, + 0x51bf63798c52e93d, + 0x4986cf3cbc34f7a9, + 0xdbc952afec5a2917, + 0x39c87a41fa5c2783, + 0x28f3adb2184c35df, + 0xbe4529f43961745d, + 0xf9ea5319865473c9, + 0x6539ad1cb458a237, + 0x5fa6b48dc259b1a3, + 0xb69d35887c2a9def, + 0x23a6d5ea9a2fbe6d, + 0xc62a5d9fea32fcd9, + 0x17ab38532c361d47, + 0x8efb39c65a482cb3, + 0xdc5843f8794c5b31, + 0x439eb588762e498d, + 0x29e375acb53167f9, + 0x451a93eed423a867, + 0x9adf5b1fe127a6d3, + 0x2465c98fef2ac651, + 0xf38e57632f1bc3ad, + 0xda974cf65c1fe32b, + 0x95b1f7698d341297, + 0x3f5d2bea9b2741f3, + 0xd76ec82cba294f61, + 0x61d2f75ba6194ebd, + 0xf4b867edc51e6d3b, + 0x7d31e421f4218ca7, + 0xcd265e743624ab15, + 0x2e9c71365326ca81, + 0x258bad143cf6b7ed, + 0x7a21d9854cfae75b, + 0xc3f9eb2769edf5c7, + 0x4198f37dcbf12735, + 0xa8b6132ed9f645a1, + 0x83e4a6ced7e8641f, + 0x39b5cfe215fa627b, + 0xa5c49be434fc81e7, + 0xf92a317762de9f45, + 0xc9843da872f3aeb1, + 0x28ed14a87ed5bc2f, + 0x1ae52cb87ad6ec8b, + 0x9165a74cb8c9eaf7, + 0x8c9a6271f9de1b75, + 0x84b621943ae249d1, + 0x3a49bcd329d3584f, + 0x9ed2a1b434e756ab, + 0x51e2df3874eb8629, + 0xcae29d1982eda495, + 0x1843cada92cea4f1, + 0x9521836baeb3c26f, + 0x2bac3671fca5e1db, + 0x483f5a621cb7ef39, + 0x92a5ef7439cb1fa5, + 0x31de249769bd4e13, + 0xfd8a12b768b14c7f, + 0x94cbd35986c35aeb, + 0xb6ad894dc3d67b59, + 0x561a39cfe2da89c5, + 0x1a276c31f1cdb943, + 0xf57bda9321aeb69f, + 0x9fa5b7354fa3e61d, + 0xdb7589f43db5f479, + 0xf3ed15487cb914e5, + 0xd27e581a9abc2463, + 0x839d2e1ba79d42bf, + 0xfd89137fe8b2713d, + 0xa83b21cfe4b36f89, + 0x694cb52213a68df5, + 0x2e3c8b1542b9ad73, + 0x6abe1985417b9acf, + 0x3b8429765e7fca4d, + 0x37bad4876d72f8b9, + 0xf467e18dcdb61a27, + 0xb26dc78fecba2893, + 0x759bcf3ed78a36ef, + 0xca8e4b32189e456d, + 0x2c6fea8436a174d9, + 0x692dc74986b5a347, + 0x6532bce98497a2b3, + 0x87fad32cb49ac231, + 0xefa7c3198e5abf7d, + 0x4d7136f98a5fcde9, + 0xad674b31fc931e57, + 0x4a8c2e721b862dc3, + 0x5d16e4b43b895c41, + 0x419be5a4376b4a9d, + 0xf59463d9857e691b, + 0x29fad14dc461a987, + 0xd7a31b8dc284a7e3, + 0xf34615cfe298c761, + 0xcaf4716fef58c4bd, + 0xf56ce4221f6ce43b, + 0xb7a24c543c5ef2a7, + 0x735e2af98d964315, + 0xe98b457bac975281, + 0x85d26c1a98574fcd, + 0xa735f94dc75a6e4b, + 0x47289e3dc34e6db7, + 0xd94e1871f471ac25, + 0x38de17b32364cb91, + 0xd921e4a43145b8fd, + 0xbe83cf154f39e86b, + 0x6ca478f65c3bf6d7, + 0x8e542bfbac6f1845, + 0xfb4ae36edc7346b1, + 0x5214acfeda47652f, + 0x94d63c21f749638b, + 0x3728c9b2164b82f7, + 0xc94fa754364ea175, + 0x8e3526a87452afc1, + 0xd2753bc98154bd3f, + 0x82fcb4987f25ed9b, + 0x439c752bad38fc19, + 0xf53bd9cfeb3d1c85, + 0x3c8ea76ed94f3ae1, + 0xa2ebc7d21b32495f, + 0xadc7e614392457cb, + 0x796a84f6562a8739, + 0x69bc1f39842c96a5, + 0xbfd4e92ba54eb613, + 0x6e58921cb241c37f, + 0x8f41c7dbaf14d2eb, + 0xd7ba65cfed27f159, + 0x2fa1dbc54e3a21c5, + 0x9fa248e76b1c4f23, + 0x1d8cf2b6591e3d8f, + 0x6ebd185878125cfb, + 0x4635ac2cb8147c69, + 0xf5147d9dc4178ad5, + 0xbc58263fe41cba53, + 0xcd7341ffe21db7af, + 0xefb1c2365431e72d, + 0xab6c2d443de2f589, + 0x312d7ea54ce716f5, + 0xc6b2d4f98cfa2573, + 0xe2f5bd8878ea43cf, + 0x5fdb473ba8fe624d, + 0xb67e859ed6f271b9, + 0xc13a684ed5e49f17, + 0xefdc897214f6ae83, + 0xab92d1f432e79bdf, + 0xe26a731541facb5d, + 0x6ac982d54dbfeac9, + 0x5c81ed4a9de41b37, + 0x75af418cbce629a3, + 0x3fe8ca7edbea5921, + 0x6b8dc311f8eb467d, + 0xd62a8fc217cd65e9, + 0x7c6ad21438e1a457, + 0xc38b2a4876e5a4c3, + 0x5e8713ca95e8c341, + 0xa594c38872e8c19d, + 0xe3a91bf76d8acef9, + 0x8147d5ea9badfe67, + 0x21b95ac1fab42ed3, + 0x81d93c532bc74d51, + 0xf8d6317328c74bad, + 0x5d2679c547dc6a2b, + 0x89a621e654ce6a97, + 0xb5ea316a95c1a8f3, + 0xf39e5accb3d4c871, + 0xac72314fe1a6b5cd, + 0xa48716eedfa9e54b, + 0x4b6d9ac21e9cf3b7, + 0x42b1f5976dbf1425, + 0xa92f4c887dc45391, + 0xab936fc879a651fd, + 0x42b1af3a97a86f5b, + 0xf382ae7cb49a6ec7, + 0xdb3726fdc4ae9d35, + 0xae429c51f492bca1, + 0xad7689332394ca1f, + 0x542ec6d431a5e97b, + 0xad4827143d69f8e7, + 0xa1c85e487ead1965, + 0xef71cb398b9f37c1, + 0x4df2a73dcba2563f, + 0x6abcf47fe8a5649b, + 0x24ca65b1f6ba8419, + 0xd82a7b62169ca285, + 0xb32958c5458da2e1, + 0x1fc8b4e76381be4f, + 0x3fd1b8a76173deab, + 0x1759fa498e76fd29, + 0xd8e5726cbe7a1d95, + 0x18c69a7eda7c3bf1, + 0x58279f3ed97e3a6f, + 0x6bc3e4221a7258db, + 0x1df3b9732ba57849, + 0xde9854f4346897b5, + 0x25cfde3a958cb723, + 0xd63b54ca926db48f, + 0x1fb46dcba271d3fb, + 0x2435b1adce74f269, + 0x7be6d2a1fe7812d5, + 0x9c4638b32e8b4153, + 0xafb598d32a5b3e9f, + 0x5182f3c5496f5e1d, + 0x642dc1b98a526d79, + 0x4791d56ba7648be5, + 0xe3268aced458ab63, + 0xeac9428ed249a8bf, + 0x3ed821b1f15ec83d, + 0x2c648af43251f6a9, + 0x6cbe98254f652817, + 0x2c98fbd87e592683, + 0x8c9f51287b5934df, + 0x8e4d1a7a9a4c635d, + 0xe87f4d6cb84f62c9, + 0xc64792afe964a137, + 0x2d8f143fe645af93, + 0xc67aedf214369cef, + 0x8bcaf1954239bc6d, + 0x6c783fb6513cebd9, + 0x7d4c5e2a9f521c47, + 0xfc467e1a9e452ab3, + 0x8a6b3d1dcd485a31, + 0x271cfa9feb2a478d, + 0x6dc9b75fe82c56f9, + 0x9a2eb3721a2f9567, + 0xb2385de76842a5d3, + 0x4c713e6a9837c451, + 0xd59e6af98437c2ad, + 0xd4e3bc8a934ae12b, + 0xe2a6b75a9d1cef87, + 0xea76d1fcbc412fe3, + 0x3b65e781fc254e61, + 0x5e31b4c32a164cbd, + 0xcb6328954a196c3b, + 0x57693cd5481d6ba7, + 0xe27cad39872f9a15, + 0xef95a67cb623c981, + 0x1b96fc2ba314b6ed, + 0xb1823f7ed218e65b, + 0x68f71c9cbde9f4c7, + 0x639aebf32efd1635, + 0x71e3fa865cef34a1, + 0x2c45ed987be4631f, + 0xfdba41298af5617b, + 0x6ad748ba95e86fd7, + 0x83b4965ba6fb9e45, + 0x5e72df3ba4fe9db1, + 0xae3572ced4e1cb2f, + 0xf59c7d3212f3ea8b, + 0xb5471fd431d5e9f7, + 0xa76198b54feb1a75, + 0x35b9d2876bec38d1, + 0xe5296bd98ace374f, + 0x2437d56dc9e265ab, + 0x1e4a96cedae68529, + 0xab412e71f6e8a395, + 0x3b45a96326dba3f1, + 0xba8d751434cdb16f, + 0xdc4a271653a1dfcb, + 0xef4ac18871c4fe39, + 0xcea62b798fc71ea5, + 0x74cdba3a9eca4d13, + 0xc5fb37eed9ac3b7f, + 0x61e382ced7af49eb, + 0x7d9b4f221bd27a59, + 0xea1f4cd327d498c5, + 0x6bf381e656d9b843, + 0xaec1947763cab59f, + 0xf9e26da983aec51d, + 0x2ed8c1fcb2c1f379, + 0xa75e24ddcfb613e5, + 0x417265c1fec94263, + 0x6b3518932da941bf, + 0xcab217d43a9b5f2d, + 0x72dfc41437af5e89, + 0x7af9eb1767a28cf5, + 0xf45361ea96b5ac73, + 0x8ed54c6cb386a9cf, + 0xc47f5dbfe28ac94d, + 0xc3615ab1f18de7b9, + 0xe94b3d1654c31927, + 0x8a6197254fb52793, + 0xd1f6c8b54c9735ef, + 0x1e68cb487c9a546d, + 0x1f8d24587a8c63d9, + 0xe6482d1dc8af9247, + 0x75b8142fe794a1b3, + 0xc7b389dfe596bf21, + 0xd256cfb21386be7d, + 0x48b952c43268dce9, + 0x7fc32e95418dfc57, + 0x354c18f87f812bc3, + 0x419ed76bae965b41, + 0x57398dccbc76489d, + 0x97d3b86fec7a681b, + 0xac439821fa5d9687, + 0xb8579362187f96e3, + 0xda317c854893c561, + 0xfd4bec376475c3bd, + 0x6c824aba9478e23b, + 0xf73a52ba926bf1a7, + 0x837a9d5cbf8e3215, + 0x12b68d5dcd824f71, + 0x76431291fa634ecd, + 0x5de6bf321c576d4b, + 0xec86a5132a496cb7, + 0x1b876e35486d9b25, + 0x941c8258765fba91, + 0x4b8c1a7a9452b7fd, + 0xe9a27f8dc254e76b, + 0xeba1723dc148f5d7, + 0x58a3469fef6c1745, + 0x47cebf932f6e35b1, + 0x736e9b265d71642f, + 0x84fceb287d54628b, + 0xb137e26a9b4681f7, + 0xfa87613cb83a9f65, + 0x273e658ba64b9ec1, + 0x657c4a2cb54eac3f, + 0x8ebd63a1f342ec9b, + 0x69dbfae32345fb19, + 0x4b7f13e762491b85, + 0xa9e123576f4b39e1, + 0xf9ea31d87c2d385f, + 0x24ce8fba9d3156cb, + 0xc2ef18aedc248639, + 0x16da2c9feb2794a5, + 0x2e8c1631f84ab513, + 0x9ef64532163cb27f, + 0x21bac395453fc1eb, + 0x8fc36d287532ef49, + 0xefac6b5a92361fb5, + 0xd9b7642baf194e23, + 0xcb36714a9d1a3c8f, + 0xb6437d5dc91d4afb, + 0x419a3851fc217b69, + 0x8b43f6e32b1389d5, + 0x87deba654a17b953, + 0xc1b26ed54518b6af, + 0x9cb5f4d9851bc62d, + 0x614d95eba31fe489, + 0x2a6b54fdc62314f5, + 0xe9473d1dcef62473, + 0x132bc6fedbe742cf, + 0x751ced632cfa614d, + 0x54c789d328ec5fa9, + 0xf867ca5549df8e17, + 0x89ad2b1767f2ad83, + 0xa6d3e84875e49adf, + 0xc1e4b5da93f7ca5d, + 0x43dc579cb2fae8c9, + 0x9d6f478dc1edf937, + 0xcaf6d13654f128a3, + 0xe5dfb3954fe65821, + 0xd9e2a7c43ce8457d, + 0x1bdfac865bda64e9, + 0xc34f26198aed9357, + 0xd874ebfba7df92c3, + 0x4fe63c1ed8e5c241, + 0x7f5d8c4fe3c4bf8d, + 0xfb3da72213b6cdf9, + 0x2ba6ec5432cafd67, + 0xde7b258762be1cd3, + 0x93c74f598fd24c51, + 0xf2a5e9487ec349ad, + 0x48f3d62bacd7692b, + 0x85fc691feadb6897, + 0xa76f8d2fe6bc97f3, + 0xd916fba328cfb671, + 0xb517ecf436a2b4cd, + 0x34265fd875c6e34b, + 0x23a8d57763c8f2b7, + 0x27e195fba4dc1325, + 0xd8f6915bafbe4291, + 0xe3dc642bab914fed, + 0x92d3c1e1fca36e5b, + 0x24dc3ba21ba56dc7, + 0xfe49517328ba9c35, + 0xcf957b15468d9ba1, + 0xf7dac487658eb91f, + 0xb5fc8a7a94a2e87b, + 0x2183cd6cb2a4f6e7, + 0x7125fa4fe2ca1865, + 0xa5c3642fef9b36c1, + 0x4b2873e21e9d453f, + 0xf3bae6154ea1639b, + 0xd18ace576db58319, + 0x5b974fc76cb7a185, + 0xf21c983ba6789fd1, + 0xfed2341a957bad4f, + 0x84735eca936fcdab, + 0xa956f2dfe483fc29, + 0x47d8615323a61c95, + 0x7ce48d1652983af1, + 0xac1327d54e7b396f, + 0xc8f31e765c6e47db, + 0x7982f3dcbda18749, + 0x652178aedc8396b5, + 0xbd14c8ffea98b623, + 0x9dc5632fe569b38f, + 0xe934db22156ac2fb, + 0xc18ad5f4347fe169, + 0xda6c1959869421d5, + 0x6c893f2ba1972f43, + 0x4f6c92798e573d9f, + 0x3512bdca9e6a5c1d, + 0xfc1eab4edb4e5c79, + 0xb2c137d1fb618ae5, + 0x4cda3e521c74ba63, + 0xc7df58b32845a7bf, + 0xc1db26a54659c73d, + 0x5d416e98734ce5a9, + 0x2d3b846ba36ef517, + 0xf62c149ed1942583, + 0x2983f4ecbe5643df, + 0xa41d26b1fe49625d, + 0x59b41f732e4b61c9, + 0x74dac6f43b4d8f27, + 0x54a792876b51ae93, + 0x5f82e91767439bef, + 0x7cab1e6a9735cb6d, + 0x29a538ecb437ead9, + 0x371bc59ed23cfa47, + 0x84b7d96fe25f19b3, + 0xbd9f734762745931, + 0x2ba875f43f25468d, + 0xbce718554d2865f9, + 0xf692ebd98d2c9467, + 0x3bdf24798a2e94d3, + 0x4657921eda62c351, + 0x7689fbdfe734c1ad, + 0xfdb2915fe536df1b, + 0xbc2d65921429fe87, + 0xbafe7c57654b1de3, + 0x152bc749824f3d61, + 0x1ec6a8987f124abd, + 0x512e8bda9e156a3b, + 0xb7e8f93dcd1869a7, + 0x2d1a4c6feb2ca915, + 0x1872e5c1f92eb781, + 0xf568ca443821b5ed, + 0xa9e437b76813e45b, + 0xbd7a49398516f3c7, + 0x9cf1d83ba72b1435, + 0xc64597fcb52d43a1, + 0xa8d457ca9ced521f, + 0xc3829d6bace15f6b, + 0x76394bedcaf36ed7, + 0x38692dc21bf79d45, + 0xc721baf437f89cb1, + 0x1ad3f68546ecba2f, + 0xb97ac24654efd98b, + 0xc18bd3fa94d2e8f7, + 0x49d76efdc3f61975, + 0x75ef81adc2f937d1, + 0x14f78a5dcedb364f, + 0x9b8af4621fde54ab, + 0x87a23c665de18429, + 0x873fc9276ce4a295, + 0xf5bae91769d7a2f1, + 0x5e834c2876c8ae5f, + 0x39bf845874d9aecb, + 0xd29bf54ba4bfed39, + 0x179258c1f4e31da5, + 0xea78f31325e74c13, + 0xc1b98e3541d83a7f, + 0xc1d867943fca48eb, + 0x72de3ba54dce6859, + 0xa5d2c6198bd197c5, + 0x5fe9b67dcad5b743, + 0x32e469aed7c6b49f, + 0xc9475bd1f6b9c41d, + 0x5ecf3a2215bce279, + 0xa564e7f434adf1e5, + 0xdc43e58a97d54163, + 0xa359e6b871b53eaf, + 0x84e2bcf87fa85e2d, + 0x4dca12587eab5d89, + 0xd9187aedca9d7bf5, + 0x831b6cd1f9c1ab73, + 0xb93257821793a8cf, + 0xef419a5327a6c84d, + 0x87fa6de434a8e6b9, + 0x5b4e6ca984acf627, + 0xe62db31ba4bf1693, + 0xe258974cb1a234ef, + 0xfead54bdcfa7536d, + 0x4dca2151fea862d9, + 0x4156f3932eac9147, + 0xfdba83932b7d8fa3, + 0xed8c21b76a93be21, + 0xe7ca86f65683bc7d, + 0x37642ae98475dbe9, + 0x6d85b14dc389fb57, + 0x6214bc7fe48d1ac3, + 0xa358926fe29f3a41, + 0xb182fd9431a2479d, + 0xac815f443f95671b, + 0x2f678c443e6a9587, + 0x317b9ae76c7b95e3, + 0x5fa816ba9a8eb461, + 0x439b26fba871c2bd, + 0xc1eb295ed785e13b, + 0x6f2ca43ed365ef97, + 0x45916be325791ef3, + 0x2af46386548c3e71, + 0xa94268f6516f3bcd, + 0xb1476ea98f726c4b, + 0x3d7154ca9e546ab7, + 0xbfd9e25dcd689a25, + 0x63bfc2afea5cb891, + 0x2df41c3fe74ca6fd, + 0xafbd68332971e56b, + 0xc7694df32863f4d7, + 0x64d8f71ba7891645, + 0xba6d5f8a957a34b1, + 0x637e5dfba17c532f, + 0x2bf9d43bae4f518b, + 0x93d7415cbc426fe7, + 0x3d92b8a1fc349e65, + 0x6f54d9b32b479dc1, + 0xd38a46b32849ab3f, + 0xa513f2d5463eda9b, + 0x9e4732a98752fa19, + 0xade6317dc7641a85, + 0x1587ab9dc45738e1, + 0xbe681c4ed14a375f, + 0xb4cda5ffef2d45cb, + 0x8adfe9421e2f7539, + 0xa2598bc76e4293a5, + 0xe4f9c5d98d57b413, + 0xfcda17476a38b17f, + 0x842e51c87628afdb, + 0x9bd68e1ba62cde49, + 0x14856f3ed7421eb5, + 0xd69234a1f7564d23, + 0xd75863e214263b8f, + 0xd3874a66512849fb, + 0xf38d76b54f1d5a69, + 0xde1fab376c1f78d5, + 0x93b8c17bad12b853, + 0xbf9d58edc914b5af, + 0xa81947dfe918c52d, + 0x9c87da61f61be389, + 0xb1e27ca4371ce2f5, + 0x95617fe989514273, + 0xc1da3949862541cf, + 0xef5a637a92175f3d, + 0x5d231b476df75ea9, + 0x34db5f6a9cfb8d17, + 0xa15e27fcbafe9c83, + 0xaf13b48dc7e1a9df, + 0xd6237ea218f3c95d, + 0x543681d326f5e7c9, + 0x35219ba545eaf837, + 0xc49e6bf985fd17a3, + 0x7e2c314ba5ef4721, + 0x983254ccb1f2547d, + 0x7c39f4dcbfd563e9, + 0x6c8b4531fdea9257, + 0xc3586de32deb91c3, + 0x37816fb549cdaf31, + 0x9e6518b547c1be8d, + 0x7d9cf2e656b3dcf9, + 0x7618dc4a94d5fc67, + 0x31795beba5e91bd3, + 0x59e76fbdc4ed3b51, + 0x397b125fe1cf38ad, + 0xa6c9ef7541e3682b, + 0x8b9fd5632fd48697, + 0x176589a54dc896f3, + 0x89bd35476adcb571, + 0xf3adb797679ea3cd, + 0x7e5c61bba8c1e24b, + 0x517af48ed6c4f1b7, + 0x5e8467d1f7d93125, + 0xbdac837325ca3f81, + 0x2adf35b5429a3ced, + 0x92b17f8761af4d5b, + 0xabfec3765fa26bc7, + 0x4295bef98ec69b35, + 0xb61af3598dc7b9a1, + 0xe895a1bed79ab81f, + 0xb2e95841f59ed67b, + 0x498c5ab328a1f5e7, + 0x14fc5e2439c41765, + 0xe921ca8876b835c1, + 0x9b641e3982ba543f, + 0xd35e97b981ad529b, + 0xe796dcacbeaf7219, + 0x5f64b39dcda29f75, + 0x4ca9d681fb859ed1, + 0x3c69a5821b87ac4f, + 0x63abec532768dcab, + 0x7318cd65467deb29, + 0x2a453fc987a21b95, + 0x94257e6cb6a539f1, + 0x5e328d9dc2a7386f, + 0x6547cd3fe18946db, + 0x7f35ba1fef8d7649, + 0xd73e6a821e7f84b5, + 0x2fd431b76e94b523, + 0x12b6e9854c75b28f, + 0x92a376b65967c1fb, + 0xe6321c79876adf59, + 0xad86b25a946bfec5, + 0x46fa152ed7912e43, + 0xd86c1bafe2743c9f, + 0x5187f4d323875b1d, + 0x9c75b1d4316a5b79, + 0xecb86a443f4c79e5, + 0x258b39a87d5fa963, + 0x674efcb98c52a6bf, + 0xc7e941dcba75c63d, + 0x65ef81aed857e4a9, + 0x4812fb6fe86bf417, + 0xbd1e3893297e1483, + 0x6bd13ea6567142df, + 0x63a5be4a9384615d, + 0xbe537f1981465fb9, + 0xc4ed356a9f4a8e27, + 0x63c2f79bae4c8d93, + 0x2daf49ecb93d8aef, + 0x14c5a681f942ca6d, + 0x69a35fd21a34e8d9, + 0xd1fc68a32a38f947, + 0x59c2a317675c18b3, + 0xbdf64e7ba76e4831, + 0x7d3c4e2cb361458d, + 0xe9873d2dc15364f9, + 0x19fab86edf289367, + 0x319a4e21fe4a92d3, + 0x57b981c43e4db251, + 0xfcbd96e4382eaf9d, + 0xfe39a5276943de1b, + 0xf932de476924fd87, + 0x4e2d891ba7481ce3, + 0x25a1f86ed74b3c61, + 0x26b8e7fdc42e39bd, + 0x697823e1f241693b, + 0x1c6e5b95412368a7, + 0x7edbc9354f27a815, + 0xebad16c65e2ab681, + 0xf39e1d57691ba4ed, + 0x56a139f9891fd35b, + 0x1d289eacb913f2c7, + 0xbcfa653fea481235, + 0xec217581f73942a1, + 0xfca9574325193efd, + 0x27dbe686531d4e6b, + 0xb4edf53983216cd7, + 0x8af9cd287ef29c45, + 0x3c4abe587df59ab1, + 0x21d6c7398ae7b92f, + 0x2871a95dc6fad78b, + 0xd485f39cb5ecd6f7, + 0xb85247d43af21875, + 0xa86b5c9548f536d1, + 0x681dc9b876e8354f, + 0xd6c82f1872f953ab, + 0xd9e86b7ba1fd7329, + 0x8e91cb4baedf8195, + 0x7158cefbabc39fe1, + 0xf2b3478fe9c4ad5f, + 0x374295d218e6adcb, + 0xbcd5f64327daec39, + 0xde97a25436cdfba5, + 0xe8dcbf5a98e24b13, + 0x9eb4c1fba5d4397f, + 0x8ebd1c6ba2d647eb, + 0x5916a2fed1eb6759, + 0x98cab2dfefbd86c5, + 0x2bfad8421ecfa643, + 0x13f76ac54dc2b39f, + 0x1dca34e65ab6c31d, + 0x128c64e65ac8e179, + 0x61c4852876a9efd5, + 0x5e41836ba7bd1f53, + 0x8347219dc5b13daf, + 0xae712431f3b45c2d, + 0x9f74ed5212d65c89, + 0x26fd4b7431c97af5, + 0x7cf9a6154fbd9a73, + 0xc3a12ef54b8e97cf, + 0x5d2c9e798ba2c74d, + 0x6529143dc8a4e5b9, + 0x52461e9ed8b9f527, + 0x743a8b51f7bc1593, + 0x5e42d632169c23ef, + 0x5d89be7547b1526d, + 0xcde5396873b461d9, + 0xab13864a91b68f37, + 0x823a7ce76f798ea3, + 0xac65431a9e8cad21, + 0xf91de3adc96fab7d, + 0xb79a6841f872dae9, + 0x43759cd21b94fa57, + 0x8f35da2547a819c3, + 0x9fab825767ac3941, + 0x9a8e2368748e369d, + 0xd3f4ba1dc4a2761b, + 0x731feaced1b39487, + 0x15fa43bdcf8794e3, + 0xd617b5a1fe8ab361, + 0x871ae4532e6ca1bd, + 0x5c4721d4396ecf2b, + 0x189fac554a62fe97, + 0x3eb5c18879861df3, + 0xe425739cb6893d71, + 0x28d15a6cb4693acd, + 0xa746193ed27e5a4b, + 0x97ed6581f28169b7, + 0xde2867443184a925, + 0x9c8e2bf43f56b791, + 0xf5891c243c48a5fd, + 0xe9dbaf587a5cd46b, + 0x5432c969895fe3d7, + 0xcb87e39edb961345, + 0x6f4cab1fe98743b1, + 0xd4c75fbfe679512f, + 0xd92378a2135a4f7b, + 0xac8f2464324c5de7, + 0x6be7352982719d65, + 0x3461ecf87f549bc1, + 0x2e67bda98d46ba3f, + 0x12e7489bac37d89b, + 0x9bcea64eda4ce819, + 0x21f8ec6ed93ef785, + 0x6ab951c32a6437e1, + 0x175a8ef32947365f, + 0xc2d84518763854cb, + 0xb192378ba25c7439, + 0x3fd5841cb14e82a5, + 0x5a86e2bdcf64b213, + 0x5d7c8e2cbc23ae6f, + 0x2db65791f925aedb, + 0xbfe2c7621b28ed49, + 0xc85e6fd4382afcb5, + 0x1f29dec8795f1c23, + 0x1adc547a97423a8f, + 0x5e9f4c8ba62548fb, + 0x56749e1ed32a5869, + 0x9c21548fe12b87d5, + 0xb2834efedf1ea753, + 0xcdf1e6543e21b4af, + 0xb3578fd76e15c42d, + 0xf279d1465c16e289, + 0x53c19de87a29e1f5, + 0x2e615cdcba4d2173, + 0x2a18cd3a961d2ebf, + 0xf3e256ddc7125e3d, + 0xd174ba31f3145da9, + 0x5afbde7434298c17, + 0xd8ae97c6521c9b83, + 0x146d9e543ceb98df, + 0xbef531854aefb85d, + 0x89dfc2187af2e6c9, + 0xe163cf8cbae5f637, + 0xca5fe31ed8f916a3, + 0xb6c58f7fe8fc4621, + 0xf9e4a6c216fe437d, + 0x2b8c1ea545f162e9, + 0x23fdec9983f49157, + 0xc39bf5d871e68fb3, + 0x329fab187fd9ae31, + 0x9e7f1bd769ebac8d, + 0xc2d31f9987aecbf9, + 0x6da14f2fe9d2fb67, + 0xfc8eda3329e61ad3, + 0xa3e9c58548e93a51, + 0xd75e9a2545eb37ad, + 0x2fb49e1984de572b, + 0x3cef274cb3e18597, + 0xd9e37c1cb1d495f3, + 0x261f953dcfd8b471, + 0x75a9b861feb8a2cd, + 0x864e3c732eacd14b, + 0x5b8c9e43289edfa7, + 0xfc52dbe87ac42f15, + 0x28fd5c4879c63e81, + 0xad96f5b985a73bed, + 0xeca2574a93da4c5b, + 0xbc87fa1ed2be5ac7, + 0x2ab3dc71f2d19a35, + 0x74186c2432d4b8a1, + 0x6defb4843ea6b71f, + 0x9edb14643ea9d57b, + 0x61482c765a9bd4e7, + 0x75c13de989aef365, + 0x1586baeed9b534c1, + 0x28ba4c9ed8b7523f, + 0xd27c4831f4c8519b, + 0xe4f3acd2139a5ef7, + 0xca7b521432ad8e75, + 0x82dc43b763a29cd1, + 0xb17dcf376e83ab4f, + 0xb3def8276e75d9ab, + 0xfe5c8d9cbc78ea29, + 0x61829faeda7cf895, + 0x52f86beed79e28f1, + 0x47abcd2219a2376f, + 0x1879e5b3279645db, + 0x2a4d9e7763ba7549, + 0x1e6b32d8729c83b5, + 0xcfd98eacb19ea423, + 0xd942185bae72b18f, + 0x32784bea9c63afeb, + 0x3d526b81fb76de59, + 0x58abfd221a68fdc5, + 0x2379aef65a8c1d43, + 0x5796f1d5476e2b9f, + 0x6e3cfbaa97835a1d, + 0x1fde938dc3845a79, + 0xf3be17ddc26978e5, + 0x3c1a87bfe17ca863, + 0x879e524dce4d95bf, + 0xdb3178432f71c53d, + 0x36bf48132d64e3a9, + 0xc72db1a65c68f317, + 0xdb8cf47a9c7b1283, + 0xa78e235a986b31df, + 0xf74d386ba76e3f4d, + 0xe8b6a34ed4625eb9, + 0x1e46c721f3658d27, + 0x63a4feb212578c93, + 0x81b2adf4314a89ef, + 0x68951dc54f3eb96d, + 0xa1be3dc76c41e7d9, + 0x1236ce9bac53f847, + 0x16ec783edc5817b3, + 0xf1c572afea6b4731, + 0x48b61351f75c348d, + 0xf83be972174e53f9, + 0xe261879548539267, + 0xcd12b739845691d3, + 0x7cb8ef3a9258af41, + 0x57be98276f28ae9d, + 0x3c4fe7298a3ecd1b, + 0xbe574c1edb31fc87, + 0x46b9ed81fa451be3, + 0xc63ef1932c483b61, + 0x187cf6a5472938bd, + 0xfd715b27672d583b, + 0xefbd85aa942f56a7, + 0x5f4832bdc643a715, + 0xc7564b9ed236b581, + 0x9782f5ccbf17a3ed, + 0x56413971fe1ad25b, + 0xdbca61543b2de1c7, + 0x746cafd98d642135, + 0x9d6ce5f87b253f91, + 0x1835db9878163cfd, + 0x574e926ba7194d6b, + 0x1efd728ba41c5bd7, + 0x64b8729ed31f8b45, + 0x69a4d1c1f423a9b1, + 0xc39b25f54315b82f, + 0x51a8d6732ef5d68b, + 0xe1dc84a43be9d5f7, + 0xca2b84f76aecf475, + 0x3ed5ba4989ef25d1, + 0x791ef24cb9e2534f, + 0x83b4cf9ed7f652ab, + 0xdabf142fe5fa7129, + 0xa9bcd86213eb7f85, + 0x6d983e2543fc8de1, + 0x9472bce762e1ac5f, + 0xbaf3ec265fe3dacb, + 0x6c8ed9587cd6eb39, + 0xae692d487bd8f9a5, + 0x825ab64dc9ed2a13, + 0xe472163ed6ce287f, + 0xc7524b8218d246eb, + 0x5ca4f87328e47659, + 0x9e5471b763e984c5, + 0x9fb572d982eca543, + 0xabde612871cda29f, + 0x384762aa9fb3c21d, + 0xf3bce46bacb3df69, + 0x7fb1a2ddc9a6fed5, + 0x71c5ae432bca1e53, + 0xed2a6f14379b2caf, + 0x1b7ef36657af4b2d, + 0xd69cb58876d25b89, + 0x46b531dba3c479f5, + 0xa75643ddc2d8a973, + 0x1b29583ed1ba96cf, + 0x5aeb438dcf9eb64d, + 0x1c365f432fa1e4b9, + 0x2f5c68443db5f427, + 0x1db583f76dc81493, + 0xade29b8768a932ef, + 0xca54f7da98ac416d, + 0xdc6f37bba58e4fc9, + 0x8e95316ed5b28e37, + 0x9276ba51f2b58da3, + 0xcd71256434b8ac21, + 0x9edfcb243189ba7d, + 0x976fac143f6dc8e9, + 0x5cad2b876da1f957, + 0xdf871eba9da518c3, + 0x249e1fcedcb93841, + 0x6cb23f7fe78a359d, + 0xd7234681f79d651b, + 0x29abdec215af6387, + 0x216e478656a492e3, + 0xf6d3e41984a7b261, + 0x6d7423e651769fad, + 0x4ed5fc387f69ce2b, + 0x1c93f2498b5ced97, + 0x978bf4aedb821cf3, + 0x5e398d21fb953c71, + 0x9feca3821a7639cd, + 0xbc86e193287a594b, + 0xb1c76a44346d58b7, + 0xd2b9ef6ba47f9825, + 0xaf762d9dc483b691, + 0x89ec71acb175a4fd, + 0x635924edcf58d36b, + 0x948abcd1fc5ae2d7, + 0x61d59e832c7df145, + 0x1b4729376d8342b1, + 0x1f4e7ad76a754e1f, + 0x354f7db989564e7b, + 0x4685b9fba6495ce7, + 0x4a98251cb34d8c65, + 0xb2173efed35f8ac1, + 0xb9c537dfe162b93f, + 0xc89a64e32154d79b, + 0xfb5c2d943f48e719, + 0xacf179b54d3bf685, + 0xecf31d998b5d26e1, + 0xc614dbebab71345f, + 0x2641cf9ed96453cb, + 0x5c378b2fea587239, + 0xd5486931f64b81a5, + 0xcb7fa6d3254b8ef1, + 0x569a2d85423e9d6f, + 0xb1ca37576142acdb, + 0x184a63587f25ec49, + 0xfcd796a98d27fab5, + 0xe6913c2bad5c1b23, + 0x3ba15e6dca3d298f, + 0x67541fcfe93147fb, + 0x5e4ca2621b235769, + 0x6adeb1c4392786d5, + 0x721349f9872ba653, + 0xb368a5e8742c93af, + 0x46dfc5ba914fb32d, + 0x893adc2cbf23e189, + 0x7265d1cbab14dfe5, + 0xa1fb794fec291f63, + 0xb9ae78543a192dbf, + 0xf9ce78a6591e4c3d, + 0xc7fab94768215ca9, + 0xbf2e384ba9248b17, + 0x18f2ab9dc5169a83, + 0x42f81a5cb31897df, + 0x5ba21d3fe21cb75d, + 0xb8cf954babfed5c9, + 0x3894a5732de1f537, + 0x9fc582d54df615a3, + 0x9e68f1587cf94521, + 0x79bd82e769fa427d, + 0x6cf95d7987fc51e9, + 0x84372bcba5de6f47, + 0xb2d1584dc5f28eb3, + 0xf7534cafe4f6ad31, + 0xefc5dba212f6ab8d, + 0x1aed25b431e8caf9, + 0x598d67143fcdea67, + 0xfd35bec87ce219d3, + 0xd7e458fbace63951, + 0x8df2a15cb9e736ad, + 0x54cb8f6ed8ea562b, + 0xe19b26c1f5ed6497, + 0x6472bf3216ce84f3, + 0x39b7fdc656e4b371, + 0x315d2ea763e5a1cd, + 0x7498e5c761d7cf3b, + 0xc3db19a65fb9dea7, + 0x5bd4a1c98bacfd15, + 0x7f1c536febc23d81, + 0x5e2138d1f8b43aed, + 0x2d46c53219d74a5b, + 0x8f6d19b326da59c7, + 0x8ef5396546cd8935, + 0xf39248c764cf97a1, + 0xc435261a94c3b61f, + 0x2ef9b56ba1c5d47b, + 0x31678d9cbfa8d3e7, + 0xa7c6439fedabf265, + 0x57c38f954dae23c1, + 0x159f73476cb2513f, + 0x9f36d7c659a34f8b, + 0x9c8aed6548a65df7, + 0x132576fa94ba8d75, + 0xd5e7164ba49c8bd1, + 0x57bd493dc28e9a4f, + 0xb63e58d1f192d8ab, + 0xb2af794431b5e829, + 0xd5ac86332ea8f795, + 0x8f1d94665d9b27f1, + 0x31d268a87b9d256f, + 0x4b261fe98a9154db, + 0x6a3b547edab57349, + 0x926c174fe6a782b5, + 0xed62c131f69ba123, + 0x47c32bf2136b9e7f, + 0x926f1eb4326f9deb, + 0x238574c76182ed59, + 0x89cf51e76e74fbc5, + 0x146d25fbae891c43, + 0xbcd5eaf98c6b2a9f, + 0xf385ea1dca7e491d, + 0xb2437611fba15879, + 0x6d892b321a9387e5, + 0x67b3cad32598a763, + 0x26814c76536894bf, + 0x9cad7f29827cb43d, + 0x4be2f959816fd2a9, + 0xc4dfe23cbe84f217, + 0x973fc12ede972183, + 0xb21e784eda572ecf, + 0xbd952e621b6a3e4d, + 0xf18e6a33285e4db9, + 0xa23be6f65a618c27, + 0x43527e9ba7648b93, + 0x84cfeb3ba34598ef, + 0x1da956bdc249b86d, + 0x69371d4fe14bc6d9, + 0xa6b1e3ddcd3fe647, + 0x6e3d45732f7416b3, + 0xe8c9f1a65e784631, + 0x21f94ce76c59438d, + 0x3e9b28a87a4b52f9, + 0xf5ca13dcba4e8167, + 0x235e68fcb7518fc3, + 0x6a29573ed765ae41, + 0xb5468e31f235ac9d, + 0x1d4c8e532348dc1b, + 0xd2c9be75413ceb87, + 0x1273ce865c2df9e3, + 0xa54721da9e543a61, + 0xb3d4172a9c2537bd, + 0xc4572efedc29573b, + 0xa71b2c4fe92c65a7, + 0x5e1bac81f83e9615, + 0xf71956d43952b481, + 0x186423e65634a2ed, + 0x256197398437d15b, + 0xb897fad76128dfb7, + 0xfd4ca5698d1bfe25, + 0x97eb2c1bac3f2e91, + 0x97fe341dca123bfd, + 0x4bd57961fa154c6b, + 0x4ef9a7132b185ad7, + 0x97d25f64391c8a45, + 0xdf37b916562e98b1, + 0x8a5b2dfa9631b72f, + 0xbd39481ba413d58b, + 0x26e7389cb216d4f7, + 0x6798fa3cbde9f375, + 0x68f123afecfb24d1, + 0x53697ab21bed324f, + 0x9fd723b54cf251ab, + 0xe249f6165ae46f19, + 0x5d376f9549f67e85, + 0x56a4ce9875f98ce1, + 0x64d5e2c983ec9b5f, + 0x12ab6e4982efa9cb, + 0x5b9a6e2ed1f2ea39, + 0xc16e35b321e4f8a5, + 0x9baef1365fea2913, + 0x2a7df3154cdb267f, + 0xc2735b9769cd35eb, + 0x49e16b8babe17459, + 0xa29674ccb9e483c5, + 0x56a748ced7e8a243, + 0x3879a54fe4d8a19f, + 0xaed7926213ca9efb, + 0x2eb86f5432bfce69, + 0x9b45238761b2fcd5, + 0xae1d43298fc71d53, + 0x4e8bfa276dc72baf, + 0x63d17a4989cb4a2d, + 0xba4f8c7ed7ce4a89, + 0x5b3af72fe9c178f5, + 0x859cfbe219d4a873, + 0x9ef5cb3324b695cf, + 0x2b7e915763c9b54d, + 0x9a78fd3762acd3b9, + 0xebf56c1a91bfe327, + 0x6782d3ecbfc51293, + 0xe6dac93cbca631ef, + 0x945dc16feba83f5d, + 0x7b63d2521b8a4ec9, + 0xa15be38329ae6d37, + 0x6bca178657b18ca3, + 0xaf74b6c987c5ab21, + 0xcfd4e72983a5b97d, + 0xd182397cb2a8c7e9, + 0x2ca54f8ed1ace857, + 0x7f41d36cbd8ef6c3, + 0xab6134532fb53741, + 0xebcd34f32ea6349d, + 0xfeb4c8165da9641b, + 0xc83e46965bac6287, + 0x1fe734dba79d81e3, + 0xbe85316dc792af51, + 0x4513abddc4739ead, + 0xd61e4291f386cd2b, + 0xeb36f2821268ec97, + 0x6de235a5417beaf3, + 0x18b47ad65e8f2b71, + 0xc4e73ad76e7238cd, + 0x6cde4f8bad96584b, + 0x54b3ae9edc8956b7, + 0x4afb3c1fea8c9725, + 0xedc2a141f67ea591, + 0x187dafc32671a3fd, + 0x68ba1c443584d26b, + 0xca783f965386e1d7, + 0xd6f72be98179ef35, + 0xd5b261e98e6c2fa1, + 0xdb72c8ea9b6e3d1f, + 0x364d1a8fec624d7b, + 0x41d5e281fa645be7, + 0x84f573b21c498b65, + 0xa6f7db14375b89c1, + 0x3ac6e575465da83f, + 0xc15eda498451d69b, + 0x564df83cb374e619, + 0xe73a9fddc167f485, + 0x275b49adcf6a25e1, + 0x1c742dffed6c235f, + 0xc2ab6d721d5f42cb, + 0x3142dfc65d647139, + 0xf973ad276b347f95, + 0x83a2fe5769478df1, + 0x96ed3129853a9c6f, + 0x5fae3499843e9adb, + 0x71ef3a2ed351eb49, + 0x17fc398fe143f9b5, + 0xda6b1f7654681a23, + 0x31bc78654e3a278f, + 0x1c7329865d2c36fb, + 0xc4193de98c2f4569, + 0x13b8fdcbab3284d5, + 0x9bfe563edb27a453, + 0xc81b9e6ed63792af, + 0xa1c45761f64ab12d, + 0x9ed675b2142dcf79, + 0x5b7f98176431fde5, + 0xe2d641ca92451e63, + 0xa8cdf3b87e162cbf, + 0xd23e5c998e194b3d, + 0xa37edc298c1d4ba9, + 0xa4e2f85edb2f6a17, + 0xd62a1e91fb12a983, + 0x4936d1b3281496df, + 0x52ba6f743718b65d, + 0x8f7ecd47651ad4c9, + 0x5f138d4a951de437, + 0xda76e23dc65214a3, + 0xa719e2fcbef65421, + 0x5213498cbcf6417d, + 0x57342b6dcae74fd9, + 0x9de258421afb6e47, + 0x9f163be328fe7db3, + 0xd9b7ae2768f2ac31, + 0xf3daeb7765f3ba8d, + 0x4de592a873e5c8f9, + 0x6f27819cb2fae967, + 0xf58931bba1ebf7d3, + 0x32d6b51dcedf2851, + 0xdba56e321fe235ad, + 0x91c42ef43de7652b, + 0xc795ab354cea6397, + 0x3784acd769db82f3, + 0xfa85321a98dea271, + 0x7ea2654985c19fbd, + 0x12385c6ba5d4ce3b, + 0xe1ca3941f2c5eda7, + 0xe59a43b323d9fc15, + 0xe96dc72653ed2c81, + 0xf389cad54caf29ed, + 0x2e1bdf587ed2495b, + 0x17e34f6a9bd458c7, + 0xfb18d3edcbda9835, + 0xc257bfafe7dc96a1, + 0x4c8bf73fe6bda51f, + 0x85c4de6326c1d37b, + 0x26ea189435b4d2e7, + 0xd1e846b873c8f165, + 0xa7cd35b984da32c1, + 0x28d5c4187d9b3e2f, + 0x2b349a887c9f3e8b, + 0xfb6e49cedba25cf7, + 0x3e78d1c1fab48c75, + 0x9fecd51329b78ad1, + 0xa94dc6b3268ba94f, + 0xa2be6714348ec7ab, + 0xdc1b572985b1e729, + 0x9c24b6fba2b3f695, + 0xae4581bdc3b826f1, + 0x67fb4eadce9a246f, + 0xcb326ed1fe8c43db, + 0xf43cb6a21daf6249, + 0x7c563d254da381b5, + 0xd7e394a65ba69f13, + 0xe289cf5545869d7f, + 0x961f2dc874689ceb, + 0xb13d472ba37edc59, + 0x63ae1cbed381fac5, + 0xde75ab41f2a61b43, + 0xba5798f431a6289f, + 0x48ce26143f7a481d, + 0xe9f584143e8d4679, + 0x6b2cfd554b8f76e5, + 0x2a4813ccbc92a563, + 0x8a613f2dc87593bf, + 0xa4b9d78fe678b23d, + 0x523bde91f46bd1a9, + 0xebf72ca2136bcef5, + 0x34f18c2765921f73, + 0xf37b54e761742dcf, + 0x37e564f98f673c4d, + 0xb39ce4887e584cb9, + 0x725bf84bac5d6b27, + 0x1cf847aedb5f7a93, + 0x784e9f3ed85297ef, + 0xe7c2d6b21954b76d, + 0xefba79532647c5d9, + 0xa1d5e929836be547, + 0xc4127a59826df4b3, + 0xf98a125dc6924531, + 0x46fcd32cbf65428d, + 0x8a6243fdcd4751f9, + 0xdb2179ffec3a6f57, + 0x7524d3621a4b7ec3, + 0x5e8ac7f43a5f9d41, + 0x9416bde65742ab9d, + 0xd523e4f98745da1b, + 0x86fc1e7cb436ea87, + 0x7fc152ecb24af8e3, + 0x15c8e32ed35e2961, + 0x32bdf48fef4136bd, + 0xeabc9d321f24563b, + 0xf578a1243e2864a7, + 0x8bd3e4287d3b9415, + 0xba9dc4387b4da381, + 0x1e6fa479873f91ed, + 0xbd42938ba732cf4b, + 0x4627d8adc524deb7, + 0x2a57fd1fe438fd25, + 0x75f281d4354b2d91, + 0x872d4e36513c2afd, + 0x9cea3d187f214a6b, + 0x1567fd498e1359d7, + 0x3ae91c2cbd178945, + 0x4f5128bedc2a97b1, + 0x5e2bc68ed81ca62f, + 0xf54cbadfe61fc48b, + 0x79c28ef54812d3f7, + 0xc61b5ef54816f275, + 0x2ac4f919864923d1, + 0xb17a426a952b314f, + 0x14c5ba776dec3f9b, + 0x5a9de3f98bdf5e19, + 0x6de493adcbf27d85, + 0x52871b3ed9f58be1, + 0xf9de537218e79a5f, + 0xb519d4a325f9a8cb, + 0x829d51a545fed839, + 0x7ade4b1984e1f7a5, + 0xc685374cb5f62813, + 0x29c137fcb1e8257f, + 0xd8315efbafd934eb, + 0xac27b5e1fced6359, + 0xb567cd821bdf72c5, + 0x345adeb76ce5a143, + 0x245b871437c49e8f, + 0xcaeb35d545c69dfb, + 0xc59b24d874eacd69, + 0xdac52e3983acebd5, + 0xfb39518ed6e21c53, + 0xf5ca8b2fe1d429af, + 0x5ce94fd431e7492d, + 0x56d9bfe32fdb4789, + 0xb76fc4543dbc67f5, + 0x649efb265bcf9673, + 0x24a8bde878b294cf, + 0x63c5124ba8c6b34d, + 0xf735d96fe5c7d2b9, + 0xa35e7b91f5cbe127, + 0x3f29bda214acef83, + 0x47c2b6d654a12edf, + 0x35efc94871b43e5d, + 0xa2b379f65fa64dc9, + 0x1b5a3f498eba6c37, + 0x427fedb98c9d7ba3, + 0xb7fca29ed8bf9a21, + 0x6295e371f6a2b87d, + 0x6b58c9a217a4c6e9, + 0x736c45b324b9e657, + 0xa34bdc77649af5c3, + 0x2ecfb46a95be2641, + 0xb7d345eba2b1439d, + 0x97b3462dcfa5631b, + 0x1376ef5edeb96187, + 0xbf6318cfeb897fd3, + 0x71f8eb332b8c9e51, + 0xc69f4e73276f8cad, + 0x67fd1b265783dc2b, + 0x7c8fe5d76584eb97, + 0x94be618ba487e9f3, + 0xc87ea2bed49c2a71, + 0x1e258d9cb18e27cd, + 0x6d53ba2fef91574b, + 0xb85f7c621f9365b7, + 0x168fbd443ea89625, + 0x4ab328f65d7ba491, + 0x9fe67316586b92fd, + 0xa5edf23a987fc16b, + 0xe4dc893ba562dfc7, + 0x218eb57dc486fe35, + 0x35e6ac11f4782ea1, + 0xda34c873247a3c1f, + 0xac173285416e3c7b, + 0x38d5ea954f615ae7, + 0x1da325ea9e738a65, + 0x342d189bad5698c1, + 0x52b1793dcb59a73f, + 0xda76bf4fe74dc59b, + 0x52b76adfe76fd519, + 0x7dc9e2821972f385, + 0x361bcf46568724e1, + 0xc1d5e9a98479325f, + 0x6a5d3b29826a41cb, + 0xa2f567c98e4d5f29, + 0x2c56819cbd417e95, + 0x92bac47edb548cf1, + 0x3d298b7fea359b6f, + 0x8fe4a6321837a9db, + 0x84f1dcb3273cda49, + 0xd8a293e5463fe8b5, + 0x68597cacb8751923, + 0x3f5e642cb345268f, + 0xad65b82dc14835fb, + 0x42615c9edf2c5469, + 0x7c93e121fc2e73d5, + 0xe53791c54e61a253, + 0x48a92f665c3491af, + 0x18294ea65936af1d, + 0xd8243be65628ce79, + 0xa94f5c29862adce5, + 0x3de62c5ba52efc63, + 0x71f859aed5432abf, + 0xc8496e21f1264a3d, + 0x45a1e264312748a9, + 0x296ed5854f2c6917, + 0x46b9e1765d1e9783, + 0x2968f1d87b2195df, + 0x73c1de4a9a13b45d, + 0x68efda9cb816d3c9, + 0x1a82f74ed81ae237, + 0x9fc1b6afe62cf1a3, + 0x94f71ac7685f4321, + 0xc2d139f875123f6d, + 0x2ae893c872154ed9, + 0x4a12f3965ef86d47, + 0xfc38b4d76df97cb3, + 0xc3df26a98afd9b31, + 0xaf4c912cb6efa98d, + 0x8bf7295ed6e2c7f9, + 0xac87bf6219f4e867, + 0xa1ebcd6325e8f6d3, + 0x1693fcd986fc2751, + 0x3f952cd873fe24ad, + 0x7895b42ba3f1642b, + 0xf7a1ed4cbfe46297, + 0x8da7913cbcd781f3, + 0x8b96f41febda9f61, + 0xa57e3b2217ca8ebd, + 0x5e4d7c3327cfad3b, + 0xe63d5bf546d2eca7, + 0x524df9e987d6fb15, + 0xde7f53cba5e92b81, + 0x5b8a376a93ca28ed, + 0x38eb4fadc1de385b, + 0x9a3c7bffefd156c7, + 0x6e58a4b21fd49735, + 0xe7cd8f543ed795a1, + 0x7e3214d65bc9a41f, + 0x7f8d1b6658adc27b, + 0x4dc3f51986afc1e7, + 0x348d12fba7b2ef45, + 0x7153296ed5c62fb1, + 0x265a79dfe4b83d2f, + 0xf65ca34212ca3d8b, + 0x987cf4a431ad4bf7, + 0xf2bc59d54fc18b75, + 0x37bce5876eb489d1, + 0x4f81d9a87cb6a84f, + 0x2e35fa7ed798c6ab, + 0x9174dcffe7acd629, + 0x4f3ea96ed6afe495, + 0x478569b438b425f1, + 0x7bf921d545b7236f, + 0x85da7c9763a842db, + 0xbadf2e4982bc6149, + 0x9eb318d87e8d6fa5, + 0x6593dc1cbda29e13, + 0x385f7acedb839c7f, + 0x962b7181f8759aeb, + 0x7b4c2ae21a78db59, + 0xd7a3f983267be9c5, + 0x7148cf66568ef943, + 0xf215ae3985a3279f, + 0xc829436cb3a6471d, + 0x21b6cf4ed1ba4579, + 0x2a53b91dcf8b74e5, + 0xc6ea74d1fd8e9463, + 0x62841ab43d7192bf, + 0xda589fc54c85b13d, + 0x8b9ad2543a65cf89, + 0x2958ab154768cdf5, + 0xa64523ba956bfd73, + 0x5f23d7aa946e1bcf, + 0x975d816fe5823b4d, + 0x42d7cba1f1754ab9, + 0xbda28e5431896a27, + 0xfd95ae432f5c7893, + 0x64c1be743b4c86ef, + 0x354a9e798c71b56d, + 0x75d29c698a63c4d9, + 0x746ab53dca68e347, + 0x382c71eed769f2b3, + 0xbe521381f78d2431, + 0x1ace47f3256f318d, + 0xc2d643e653624fe9, + 0x34f72dca91846e57, + 0xdc798f476f487dc3, + 0xdc45b3698e5b9c41, + 0xeda2fc887b3e8a9d, + 0x6a981f4fea52d91b, + 0x296758e1fa43e987, + 0x7f2db8921946f7e3, + 0x68ab13f5495b2861, + 0x658cda18764c25bd, + 0xe8f621aa926f453b, + 0xaf951d8dc15263a7, + 0x83f7a2edcf479315, + 0x26b41c8ede49a281, + 0x76915dbfea298fcd, + 0xa3cde672192dae4b, + 0xb29f83654931edb7, + 0x48a965c87934fc25, + 0x734f528ba8472c91, + 0xfc742edba53829fd, + 0x1a9528bdc42d396b, + 0xb873f64dc12f48d7, + 0x3d64752fef129845, + 0x651fc7e43f2596b1, + 0x9ca765b54d18a52f, + 0xfb67cda65d1ac38b, + 0x82cd7417691dc2f7, + 0x1f23a5dcba32f175, + 0x9532fd4dc94632d1, + 0xa82f4e5dc6172e3f, + 0x8a5b1791f4183e9b, + 0x148c9e74342c5d19, + 0xf16ae975421f6c85, + 0x2f179a865df28ae1, + 0x3cd5be176ce3a95f, + 0xf5d3a14769f5a7cb, + 0x6e4928fcb8fad739, + 0xe178c5fcb7fce6a5, + 0x631f75ddc7def613, + 0x4daf865218e3247f, + 0xf5713ce325f643eb, + 0xd2c9543873fa6259, + 0x9c4613a982fb71c5, + 0x96d5ac887ecd8f23, + 0xa6be18387bc19d8f, + 0x98cb374ba8d39cfb, + 0x8c596131f8e5dc69, + 0x5348fb9217c8ead5, + 0x9eb54f7327dcfa53, + 0x18d279e545ce18af, + 0x71d54caa96e3482d, + 0x5634c1ecb2e54689, + 0x5f94362cb1d976f5, + 0x67f31edcbfdc9573, + 0xcdb24f7febad83cf, + 0xfd7285943ec1b24d, + 0x2b5719a43ac4d1b9, + 0x1be987f549b6df17, + 0x437f8ec656b9fe83, + 0x92864cf8759a1cdf, + 0xe3c1658a94af2c5d, + 0x9caf8d4fe3d24bc9, + 0x128ab5d1f1d56b37, + 0xa41c769321d879a3, + 0x62d79cf54fbca921, + 0x984f21b43c9ea67d, + 0x8e3174a76ba1c5e9, + 0x7af61d3a9ab3e457, + 0xf1dc38acb8a7f4c3, + 0xf9b21d5fe8cb2541, + 0x53b9d2c1f5ac329d, + 0x4cd87bf436af521b, + 0x5e67df8543b25f67, + 0x89cf537761a57ed3, + 0x14b389a76fa89d51, + 0xb6f71d465e698bad, + 0xf1973a59897eca2b, + 0x23eb7f8edb81ea97, + 0xc34a28bed794e8f3, + 0x6df942743ab82971, + 0xf84e9ad4358926cd, + 0x6fc85b38759d364b, + 0x7b13a6e9829f54b7, + 0xb371fdedc1b39425, + 0xdb64a79dcf86a391, + 0x5496a78cbc6791fd, + 0xbd62c45fec69af5b, + 0xdfa98352195dbec7, + 0xec1d23f54a81fd35, + 0xbfde712769852da1, + 0xe73251fa96873b1f, + 0xdfe4763dc4693a7b, + 0x94c5326cb26c49e7, + 0x8625f3ced18f7965, + 0x4ab35c6fef6397c1, + 0x47ab25e21e75a63f, + 0xfcbea8132e57c49b, + 0x81b9af665c6bd419, + 0x5dc6ab487a6de285, + 0x279153ccba8423e1, + 0xd572f93dc986315f, + 0xb541e73ed4563fab, + 0x71e2c4b1f36a5e29, + 0x326d85e2124c6d95, + 0x3b61cd95425e7bf1, + 0xa4b63e165e429a6f, + 0x39b8a2e76e34a8db, + 0x7e65382bac37d849, + 0x984fa36dc93ae7b5, + 0xdfa6958dc95df723, + 0xca3b4d9fe961258f, + 0x57e426b2186534fb, + 0xa9b7e8f327485369, + 0x9d125ce9834a72d5, + 0x715b46fba26d9153, + 0xfd51e4b76c2d7e9f, + 0x1d7a5e2a9c43ae1d, + 0x4d56f98feb24cd79, + 0xb183d2e1f927dbe5, + 0xe8ac9622192afb63, + 0xd5bf9c15473d19bf, + 0x6c294d587851493d, + 0x57962a4cb62347a9, + 0x3f41e7bdc4396817, + 0x8291fc6ed12b9683, + 0x4e8bf56bae1b84df, + 0xc5f7ba6fec1fa35d, + 0xfe63da954e13d2c9, + 0x36af4eb65c26e137, + 0x34ab68965a17ef93, + 0xfe5479c767291def, + 0x6ea48c3a971c2e6d, + 0xf847231cb6214cd9, + 0x53a89d6fe5136c47, + 0x764ac391f2167ab3, + 0x3daefc16542b9a31, + 0xe139f4c32efba78d, + 0x6dc9be543aedb6f9, + 0x2ad7e6498bf1e567, + 0xd3fc4be989e4f5d3, + 0x3b7deafdcaf92651, + 0x13b2e47dc6f923ad, + 0x1f6ca92fe6fd532b, + 0x1ef5c3b324ef5197, + 0x21693b8654d27fe3, + 0xfe13d65872f59e61, + 0x28dac7154fe68cbd, + 0x1e8c73d76de9ac3b, + 0xad2befc768cedba7, + 0x68aed3bdc9d2fa15, + 0xe35198b1f9e52a81, + 0x957ca2b218c627ed, + 0xdc1ea59326ea375b, + 0x281ba4d763ed45c7, + 0xe5d127ba92df8635, + 0x5e386f2cb2e394a1, + 0x42b3df8a9ec6a31f, + 0x7d4f61ebaed8c17b, + 0x6bd47cafe8a9bfd7, + 0xa65482f219acde45, + 0xacde7b9659c32eb1, + 0xd7a83e9768b53c2f, + 0x82d4596875d63c8b, + 0x4e316a9983c94af7, + 0xe4c36dfcb2cd6a75, + 0x58af794dc2bf78d1, + 0xb1cf695edeb2a74f, + 0xb7c86a421f94c5ab, + 0x5276e9f43eb8d529, + 0x9a326d554cabe395, + 0xb4caf8d7689ce3f1, + 0xe1c897fba9b1326f, + 0xe92b35ddc7a541db, + 0xe7cb264ed4b75f39, + 0x4b539a71f2b96ea5, + 0x7adfb6e324ac8d13, + 0x875cb9f4319e8b7f, + 0xa5b2df354f72a9eb, + 0xd5f928e76e84da59, + 0xdea142776b97e8c5, + 0xbfa1784dca9bf843, + 0x4521f9ddc78d169f, + 0xe4635ad1f8a2461d, + 0x5f68c27218b35479, + 0x94be31f324a873e5, + 0xb4e56d1874ab9263, + 0xfe3197d7627c81bf, + 0x45f1eb987c6e9f2d, + 0xcb852f3bad62ce89, + 0x67e19cacba74dcf5, + 0x2af9c58fea68fc73, + 0x93af854328691acf, + 0xd41fb864387e2a4d, + 0xd942c876567148b9, + 0x17f4ed3cb5a46927, + 0x16fe823dc2a68793, + 0x419237fcb16985ef, + 0x14326afcbf5ca46d, + 0x5db1ac2fec5fb3d9, + 0x87ad36b21d83e247, + 0xcd352e754c76f1b3, + 0x98cb46e87c8a4231, + 0x4fceb817685a2f7d, + 0xca4bf3d9865c3de9, + 0xeabf29ddc4816d57, + 0xa7265cffe2647bc3, + 0x137d6ea1f2679b41, + 0xd537ce832147a89d, + 0x2c1795843f4dc81b, + 0x758ba9d54c3fd687, + 0xd7ce43598b52f6e3, + 0x1a4de7fcbc582761, + 0xeda25f6dc95824bd, + 0x49a1df3fe86c543b, + 0x31a75821f64e52a7, + 0x6e87192548739215, + 0x8a4b53e763549f71, + 0xf2cd1a5761358ecd, + 0x83f972476f28ad4b, + 0xf754e2876e2adcb7, + 0x75a3c21a9a3feb25, + 0x5d236b7fec542b91, + 0xabf4829fe93528fd, + 0x3578c9621a29386b, + 0x2b7af8d4382b46d7, + 0x82d143aa962e8745, + 0xf95463bba64295b1, + 0x38d7fa1cb135a42f, + 0x6df287ebaf16c28b, + 0x938a2d6cbd29c1f7, + 0x29f8671fea1bdf65, + 0x8c196db4392dfec1, + 0x1b5d74c76a142d3f, + 0x257b914768153d9b, + 0x29578beba7285c19, + 0x892671eba41c6b85, + 0x56d1782cb42d79e1, + 0x9f1835bed321a85f, + 0x176c952edef2a6cb, + 0x743b56c21ef5d639, + 0x1cd493e32cf8e4a5, + 0x9e7f32876aebf513, + 0x7dab521769ed137f, + 0x7ef8cb1a98f142eb, + 0x743be29dc8f46159, + 0xda79f43dc3e76fb5, + 0x7685b34ed4fa8e23, + 0x7feb243212eb7c8f, + 0x945cde6431de8afb, + 0x5f36a7854fe2db69, + 0x91532cb76bc4e9d5, + 0xfd91a4687bd8f953, + 0xcf18b5aa98db17af, + 0x862da9ecb8ce372d, + 0x87d12c31f7e14589, + 0x23a98b6218d374f5, + 0xc5f1e78325e89473, + 0x92a8b7f653d982cf, + 0x9ba48d2872eca14d, + 0xae9261c65d8ebfa9, + 0x413f5eba9cb3de17, + 0x243a1b8dcab5fd83, + 0x51f736bfe8a71bdf, + 0x78fb359218ca2b5d, + 0xd9fb317326be3ac9, + 0x3f14ae9658d16a37, + 0xc5a2714a95d478a3, + 0xe961235cb4d7a821, + 0xf8e2c94cb1c9a57d, + 0xe6419b5baf8cb4e9, + 0xa8953dcfecafd357, + 0xb64e7fa21da4f2c3, + 0xafb7de376dc82341, + 0xaf9c3e465ab8319d, + 0xdbc61786568a3ef9, + 0xb27df5ca95ad4e67, + 0xa162c45cb5a17cd3, + 0x32647c8fe3b49c51, + 0xb9cde4a1f1b589ad, + 0xe26b4d1431a8c92b, + 0x8ce6f9332f6cd897, + 0x8b5e19d54b8ed7f3, + 0xfbd4ae7a9db42871, + 0x41572ea98a9625cd, + 0x12afbe4ed8a9354b, + 0xf69d42bfe69c53b7, + 0x85eb7ac1f6ae8325, + 0x78d19b2546b3a291, + 0x27e8fb6542738fed, + 0xb31edf654186ae5b, + 0x17bf8e354f58bdc7, + 0x135ba7d98d7bec35, + 0x19fad239896efba1, + 0x4fb9e2aedb843a1f, + 0x7ed5c261fa85397b, + 0x256f87c21a6948e7, + 0x5769f3a3249c7865, + 0xe69f84a6547e86c1, + 0xec7813da9481a53f, + 0xd249b73ba174c39b, + 0x8f26e79cbf67d319, + 0x21935aedcd6ae185, + 0xe93fa72dc95aefd1, + 0x59c3e8432a6d1e4f, + 0x6aebd1c549623eab, + 0x289d15654a765d29, + 0x25cd389ba7486c95, + 0x4e378fda945b7af1, + 0x37ef259cb24d896f, + 0xbfa1c5dfe251a7db, + 0x8c792fdfef53d749, + 0x9ab72c821f37e6b5, + 0xbfa23e954d5af623, + 0x487bdfa76b5c148f, + 0x53c619b8795e23fb, + 0x85ab497dcb735269, + 0xd975e26dc94671d5, + 0x2be5197ed6598f43, + 0xa625fc7fe23a7d9f, + 0xc3869d13234e9c1d, + 0x76f4b8165241dc79, + 0xde295fb76f23dae5, + 0xad6c2e798d27fa63, + 0xfb3694a87c3918bf, + 0xac1762fcba4c283d, + 0xa824567ed82f36a9, + 0xda584be1fa438617, + 0xa79f34521a269583, + 0xc591ad75452783df, + 0xdae56288743ba25d, + 0x8ae13f68723eb1c9, + 0xe5d7186a9e31df27, + 0xb57c849bac14fe93, + 0xf1e2a67cba261cef, + 0xb2da8391fa192c6d, + 0x91bc8a63281c3bd9, + 0x14a57cb4391f5b47, + 0x3ec978f7681279b3, + 0x814cde7cb726a931, + 0x82f73a4cb317a68d, + 0x6bf92d5dc21ab5f9, + 0x4f937bebaefcd467, + 0xcf46d17cbacfe4d3, + 0xb524ef843df62451, + 0xe12958354bf632ad, + 0x834e71f76af9512b, + 0xfa6de38656eb4f87, + 0xf256da9985fc6de3, + 0xf13d4aecb5f29d61, + 0x3298715dc2f38abd, + 0x1c67a8bfe1f6ca3b, + 0x68dec7f321f8d9a7, + 0x59126d443fdce915, + 0xe9b7f3654bcef781, + 0x4d5193a87ac326ed, + 0x4e67cdba9ae7365b, + 0x48d6c31cb8e954c7, + 0x3684e2bed7ec8435, + 0x7b386d51f5de83a1, + 0x63f8cdb546d3a21f, + 0xa62f3de542d3af6b, + 0x9a1b623541c5bed7, + 0x7b4d35e76fb9ed45, + 0x12e37db76d9afcb1, + 0xc176d2a989ae1b2f, + 0xc91a3b6fe9d23a8b, + 0xab3dc87fe8c549f7, + 0xc92a356218da6975, + 0xa2d7fb4435cb87d1, + 0x2a473ec653bd964f, + 0x8bd6cf5873d1c4ab, + 0xf27c6b8ba1c5d429, + 0xbe38674bafb7e295, + 0x2e7c964cbca9e2f1, + 0x253fb1cfebac216f, + 0x246c9b52198e2fcb, + 0x561d73f54ab25e39, + 0x5b8c9d2438b46da5, + 0x5df1983876b98c13, + 0xb2f15397639b8a7f, + 0x4c7e83dba27d98eb, + 0x1f59ba8fe2b1d859, + 0x3b89a24edf93e7c5, + 0xb5847ad21ea8f743, + 0xb81fc9a43d8a159f, + 0x9a5718376b9c351d, + 0x8bd534f76baf4379, + 0x89f63aecb9a372e5, + 0xae45f29ed8b79163, + 0xba149d5dc3867eaf, + 0xae8472c1f37a9e2d, + 0xab5c6342126ebd89, + 0xeb9258a54281dbf5, + 0x4c6ed1365e84fb73, + 0xfb12d3765d7619cf, + 0xef2bda398c7a294d, + 0x19d4efadca6d37b9, + 0x6a28c13eda9f5827, + 0x7d5b4981f7a28693, + 0xcda67592167584ef, + 0xa6b5e7832478a36d, + 0x7b1423f6536ab2d9, + 0xdf28e35a928ed147, + 0xae6d5cb98d61efa3, + 0xc317658cbd863f21, + 0x87e25bddcb562e7d, + 0xe3a84671fa583ce9, + 0x265ba9f21a6d4c57, + 0x35176483285f6ac3, + 0x73c29f4768739a41, + 0x2cdf57e98354a79d, + 0xd1bc5e4ba358c71b, + 0x428516adc14bd587, + 0x57429e8baf4cd5e3, + 0x23754ae1fe832561, + 0xa7892eb21e6523bd, + 0x618bd5a54d68523b, + 0xa32f5be76c4b51a7, + 0x4d85ea18784b6ef3, + 0xfd69c25ba64f8e71, + 0x34b8e26ba5428bcd, + 0x45d7968fe235ac4b, + 0x5842d671f136dab7, + 0x96fe54a4314bea25, + 0x68ca5fb54e3df891, + 0xd2b39f576c4127fd, + 0xd5b8ac3a9d24376b, + 0xe38d5f2bab2845d7, + 0x37e25b1eda2b8645, + 0xd39c158fe73d84b1, + 0xa3b8275ed64e932f, + 0xce3d9ba32643c18b, + 0xc3b7a6965324bfe7, + 0xeb351f987128de65, + 0x32f5be976e29fdc1, + 0xf3247db98b2d1c3f, + 0xfb6951ebad213c9b, + 0x63ac12bfec245b19, + 0x2496c171fb176a85, + 0x5f1c67e4392a78e1, + 0xb42c58f4361c975f, + 0xfe745cd7641f95cb, + 0x914726cba612d539, + 0xd756ce3cb216e3a5, + 0x3be42d6bade8f413, + 0xe523784cbcea127f, + 0x9ba1f25ed9fc31eb, + 0x2bd365421ade3f49, + 0xcaef857439f26eb5, + 0xcde76a4659f68d23, + 0x2f637da654e67b8f, + 0x1ef79a8763ea89fb, + 0x457cdb6982feca69, + 0x9fe7ac4cb2f1e8d5, + 0x18d2bfedced4f853, + 0xdfea89c32ed716af, + 0x3df981b54cea362d, + 0x9cabf6765bed3489, + 0xd2c3584879ce63f5, + 0x71f64a9cbae49273, + 0x5bd6381ba6d581cf, + 0x3c41f58cb4c79f3d, + 0xe42c51b1f2d8bea9, + 0xad348eb323becd17, + 0x14879cb652d1fc83, + 0xeba871d65eb41adf, + 0xf3e928c76ec72a5d, + 0x9d2c7bf76bda38c9, + 0xc3612f5cbacd5937, + 0xac62817ed8cf67a3, + 0x49b36281f8d4a721, + 0x89475d6216c5a47d, + 0x43e17ab324c7b3e9, + 0x1fbe79c763cbd257, + 0x8e1c9bd872ade1c3, + 0x1c7e9d3bafc53241, + 0xf52eab1a9ca42f8d, + 0x2396a8edcba63df9, + 0x7584b1e1f9ba4d67, + 0xfb674822189c6bd3, + 0xa79c86b437af8b51, + 0x31c6d58545b298ad, + 0xeb2dc53874a5c82b, + 0x4217fe8ba2b8d697, + 0xed7345acb19ad6f3, + 0x7e9156ccbe9df571, + 0x17edc431fe9124cd, + 0x9bc8e6a21ea6534b, + 0x9681cfe43da852b7, + 0xfd1853e76cab8125, + 0xa7e43296569c7f81, + 0xd37b5f99846f7ced, + 0x24368b5dc482ad5b, + 0x43d5681fe284dbc7, + 0x6c8ea3d1f198eb35, + 0xf7ad84c4327bf9a1, + 0x235196a54e7d291f, + 0x8f643a965e91387b, + 0xbe735a198c9346e7, + 0x5c914decbca98765, + 0x42ab983ed97a85c1, + 0x93561beed67c943f, + 0x75b891ffe46fa29b, + 0xd647af843684d219, + 0xfcea78b43284df75, + 0xba2ce4865267fed1, + 0x86ef51d87e6a1d4f, + 0xdc6a8f287c5e2dab, + 0xe514f96cbd715c29, + 0x25f4a6dfec736b95, + 0x8ba5d92fea5679f1, + 0x68b4f9c2174a986f, + 0xe8c913d3254c96db, + 0x5f2de6c8735fc649, + 0x1e82b74a9372e4b5, + 0xc86324acb187f523, + 0x1d39f87cbe59138f, + 0x8b46d15dcd5a32fb, + 0xd17465b1fc5e4169, + 0x34c7e8b32b416fc5, + 0x567d4cf32b658e43, + 0xd297eb6548357c9f, + 0x36c45ad876489b1d, + 0xf4dc7219843dcb79, + 0x589147fba23fc9e5, + 0x8492fc3ed152f963, + 0x26318c7ede3517bf, + 0xd392e6421f49273d, + 0xdf1e3a854e2c35a9, + 0xe15364298c3e6517, + 0xe97261fbac519483, + 0x4e6d2b8ba93482df, + 0xd243816dc837a15d, + 0x4279c6aed427afb9, + 0x5617db91f43bce27, + 0x4d8297a2142fed93, + 0x2e1d439762431bef, + 0xae8d6b487f152b6d, + 0x581c7af76e173ad9, + 0x8d372cfa9d1c5a47, + 0x85f196edca1e68b3, + 0xb73dac6feb42a831, + 0xeacb41d1f713a58d, + 0xefc6d8532716b4f9, + 0x38e7d1f5451ad367, + 0x6eacb488751be2d3, + 0x374fc5da943ef251, + 0xcd745f198ef231ad, + 0xc14d6a5a9ce54f1b, + 0x914e723dcbf64e87, + 0x7bf8431ed8f96ce3, + 0xdf789ac329fd8c61, + 0x89fdea7325ef79bd, + 0xe167c38656f2c93b, + 0x48d95a3763f4d8a7, + 0x645e827ba3f9e815, + 0x54eb18cba2ebf681, + 0x127a4f3a9fbc15ed, + 0xb587a361fde1345b, + 0x54a26eb21de453c7, + 0xa653b2d54ce98235, + 0xcaf1bd2659eb82a1, + 0xe5912b6545ba7efd, + 0x9e6d12b874cf9e6b, + 0x4e3517da94e2bcd7, + 0x9528fdacb2d6ec45, + 0x28673fdfe2d7fab1, + 0x7658d9c543db1a2f, + 0x516a9fd43fce298b, + 0x8fb146c65dc148f7, + 0xdf87ac4a9cd36875, + 0x58b7426a9ac786d1, + 0x642e859cb7ca954f, + 0x5f42c1dfe5cd93ab, + 0x275316afe5bfc329, + 0x4f6a731326c3e195, + 0xf1cb8d3543a5dfe1, + 0x9fa5dc7762b81e5f, + 0xf24a3de65f892ecb, + 0x4c2815687cae4d39, + 0xb5126a4a9db16ca5, + 0xa4df8b3feac58b13, + 0x47193bafe6b5897f, + 0xfc7db25215a897eb, + 0xedba58c324adc759, + 0x37c96eb5439fd6c5, + 0xdba846ea95b2f643, + 0x43958dbba2b6149f, + 0x962fea7cbfa9341d, + 0x249ea68edeac4279, + 0xb8a5c371fb9d61e5, + 0xe794dcb32ca18f53, + 0xa87c9fe329837daf, + 0xd369218547869c2d, + 0xe896ad365467bc89, + 0x4ab5fc99837bcaf5, + 0x3729415cb28fea73, + 0x43ec761ed29318cf, + 0x48a75b2fef96284d, + 0xec5839d21f7836b9, + 0x9ad547b43e9c5627, + 0x6f9c12e54c8e7593, + 0xf3a27d876a7183ef, + 0x6817ef2cb984a26d, + 0x8b457eadc576b1d9, + 0x6ae3c85ed469cf37, + 0x93e82141f26bdea3, + 0x56fce174347efd21, + 0x4e972a3651832c7d, + 0xb8af53654f653be9, + 0xb37dfc598e694b57, + 0x54967cd98d5b69c3, + 0x296f15adcb6e8941, + 0x3f71bacfe851a69d, + 0x6ed9b241f874c61b, + 0xfb7ade821956d487, + 0xbd519f832569d4e3, + 0x3c74e129847cf361, + 0x41e6b379836f12bd, + 0x4ed3869baf74513b, + 0x594cea1cbd354f97, + 0x6ef2b7ddcb486df3, + 0x89bad321fa4b8d71, + 0x9cbe7da2183e7acd, + 0xbd172a443851ca4b, + 0x9f34e7a65643d9b7, + 0x62f4e7dba647e925, + 0xd3e97a5cb34af791, + 0xb524f98ba24b16fd, + 0x6e52d71dce3f256b, + 0x9e1543a1fe3254d7, + 0x36e5b7a21e278345, + 0xd68ae9765d4983b1, + 0x4b5de8376a4b912f, + 0x23a9f8d6562d9f7b, + 0x267c5faa9631bde7, + 0x35d81e2cb723ed65, + 0x153c278ed436fbc1, + 0x72da849fe2491b3f, + 0xa59f7635413d2a9b, + 0x62d387a65e2f4a19, + 0x1e68cda87e126985, + 0xbf5713da9c2587e1, + 0xc15743dbab18965f, + 0x2e795a6ed71a94cb, + 0x6b42a8eed71ec439, + 0x17b94ca1f731e2a5, + 0x87f942c65846f213, + 0x23eacf476538217f, + 0xc3417db763182fdb, + 0xf13c74976dfb3e49, + 0x3df542b87afe4db5, + 0x5cd87febabf18c23, + 0xedb85a6dc9e37a8f, + 0xc49f618ed6e598fb, + 0xfc782b4215fac869, + 0x7c1be45324fbc7d5, + 0x89d71fe764dfe753, + 0xc3b426e984e315af, + 0x68f75e3ba1f7352d, + 0x4e168facbfea4389, + 0xf2bc63dbacdb62f5, + 0xe148ba31fbde8173, + 0xdca1e89329c17ebf, + 0x1df9c5e328c49e3d, + 0x2f9765b436e5bda9, + 0x98bf34e765e9dc17, + 0xca5f986874dceb83, + 0xabfed31872ace8df, + 0xe7f45d3dc1e3295d, + 0x7c2fa85fefd537c9, + 0x8ba95ef21fda5837, + 0xbd196ea32edc76a3, + 0xbe83cf465bce9621, + 0x93f25ed769c1a37d, + 0x21e3f97987c4b2e9, + 0x7df2356cb6c8d157, + 0xa967d4edc4a8dfb3, + 0x7c2e41fed4abfe31, + 0xb361dea323af1e8d, + 0xa76e824651b23cf9, + 0xfa457e943fb54c67, + 0xf74d1c265eb86ad3, + 0xa2d4b1687dbc8a51, + 0x1362ca7cb69e87ad, + 0x4a271cffe8a1c72b, + 0x932e6481f6b3d597, + 0xa859e7f216a7d5f3, + 0xb6a12df435baf471, + 0x714bc397649b13cd, + 0x15da439981af324b, + 0x37ea24da9fa351b7, + 0x19e456ccbda67f15, + 0x967825fedca97e81, + 0x261b35c1f8697bed, + 0xaef39dc2187e9c5b, + 0xf9e4b1743681dac7, + 0xd25cb1e76794ea35, + 0x3f482be87496f8a1, + 0xc429fd6cb49a281f, + 0x7e395dfdc19d267b, + 0x83a67decbd8f35e7, + 0x59a4e311fea28465, + 0x4da1e5732e9684c1, + 0x628531954c78923f, + 0x2671c3d5486ca19b, + 0xa68f7125465caef7, + 0x98d2541ba681de75, + 0x91f6eb7ba574fcd1, + 0x1c9765aed3871c4f, + 0x7341edc1f1682cab, + 0x5268abf4317d4b29, + 0xdf7b34632e6f4a95, + 0x46df38165d6378f1, + 0xf6eb2c498c54976f, + 0xc6fb72d98a4795db, + 0xe7f5213ed86bc549, + 0x95b8a27dc76ed3b5, + 0x85ad692fe781f423, + 0xb412f9643675128f, + 0x83c6af76546731fb, + 0x3d8eb268716a3f59, + 0xb3a591487f3b4ec5, + 0xf2beda5a9c5f7d43, + 0x389cb1fbac427b9f, + 0x58bf9c2feb459a1d, + 0x7c64b3d1f836ca79, + 0x56423da2173ac8e5, + 0x6fabc193274de863, + 0xa7d152e9875216bf, + 0x526e3f1ba475263d, + 0x9b46721dc15734a9, + 0xaf47e28dcf3b6417, + 0x23e95fbdce4d7283, + 0x4971ebadca3e71df, + 0x69e583d21b329f4d, + 0x862bda543824aeb9, + 0x3f2ace765938cd27, + 0xcd516988762aec93, + 0x3f51d698742bd9ef, + 0x7de2315dc5412a6d, + 0x2f5a187fe12438d9, + 0x8967abdfef185947, + 0xac781f432f1a67b3, + 0xe1a2c4d65e2d9731, + 0xe2bcf9765b1f948d, + 0xfdbe59687a12b3f9, + 0x36f5412cba15d267, + 0xe76c915cb728e1d3, + 0xb395164dc62aef41, + 0x64c5dfafe42c1f9d, + 0x2cde73a656324e1b, + 0xd24a981762134d87, + 0xbe2c6f854df56be3, + 0x48ac9de65df98b61, + 0x6eafcb1659fa78bd, + 0xd342618a97fea83b, + 0x5ea6df9dc8f1d6a7, + 0x93a84e5ed8f4e715, + 0x617ec53326e7f581, + 0x5b8d6ec435f914ed, + 0x915c38a874fd235b, + 0x5d6e74a981ef42c7, + 0xbd2f456bafe48135, + 0x76ef831bacd57f91, + 0x1ed7952ba9b67cfd, + 0x2945acd1f7ea9d6b, + 0xad4b5e3216ceabd7, + 0xbea5194438d1eb45, + 0xd7e294c656d4f9b1, + 0x5c3a76b985d7192f, + 0xdf854b6a93ea278b, + 0x5cf4d86ba1dc36f7, + 0xce78436cbecf4675, + 0x6e183571fec385d1, + 0xe36a89421dc6934f, + 0x4ebac8143cd792ab, + 0x12d978f658dbc129, + 0xb12fd3a546adcf85, + 0x796ebd5986a2fde1, + 0xdf5b341ba6b41d5f, + 0x9d641cbfe3a62dcb, + 0xa673b421f1da4c39, + 0xdf316b9321cd4ba5, + 0xa275f9c54ebf7a13, + 0x23cbdf954db2987f, + 0x2ba31e465ca496eb, + 0xd51e9fa87ab8c659, + 0x891af52cb79ad4c5, + 0x734eb59dc7ade543, + 0x84ab165fe6b2139f, + 0x4e89fbc327b6431d, + 0x162ab84653c84179, + 0xa7d9314761a94fd5, + 0x8a4b91776f9c7e53, + 0x32694d865b7e6caf, + 0x4216d8bbac839b2d, + 0x46dc835fea74cb89, + 0x694735cfe687c9f5, + 0x6d3a5ce2168be973, + 0x7f349583247be6cf, + 0xc3e972f986a1274d, + 0xc32a975982a435b9, + 0x67f215ddc1b96527, + 0x659de72dcf8b7493, + 0x36d872bbac6b72ef, + 0x6873bdafeb7f916d, + 0x64cfe7821b62afc9, + 0xf3ebc9d32a85ce37, + 0x6fd8ec354867eda3, + 0xcba9df59867afc21, + 0x42b8571a946e1b7d, + 0xa96dbe1dc4713ae9, + 0xf534691fe1934a57, + 0x4832c79fef5768c3, + 0xf7ed31632f6b9841, + 0x93cadb832e4c859d, + 0xb5d8a9654c6fa51b, + 0x731d4e5a9b62d387, + 0xecf95d2ba976d2e3, + 0xa365e7bdc879f261, + 0x538ca9dfe56a21bd, + 0x3ab29dffe46d3f2b, + 0xd97e1a6323614e97, + 0xde6b947651746cf3, + 0x812d3f965f468c71, + 0x9382b1f65e3879cd, + 0x62deb1387c3da94b, + 0x5ef9cb6ba93fc8b7, + 0x1bfe5a9eda63e825, + 0x5f91763fe845f691, + 0xe6a35743274815fd, + 0xbd287694375c246b, + 0x437c12a9825e43d7, + 0x2c8d71acb3718245, + 0x3b7e68cbaf4582b1, + 0x349f27ebac368e1f, + 0x8b4ae57edc289e7b, + 0x36b57ad1f82bace7, + 0xed429532192fdc65, + 0xf142ea765843fac1, + 0xacd1b43878461a3f, + 0x8e5fc71ba537289b, + 0x4263dc7cb53c4819, + 0x8163e59dc12e4785, + 0x5ea8123dcf3286e1, + 0xdc7f968fed13945f, + 0x8b6914532e1693cb, + 0xedb73f965d1ac239, + 0x48b59ca7692cd1a5, + 0xc34b57d7672dcef1, + 0x6f15becba8231e6f, + 0xde5417cba6152edb, + 0x31b96a4fe5183d49, + 0xc1da6341f21a4cb5, + 0x89e2bf66541e7b23, + 0x16ce74932cde698f, + 0x5e9df6b54ce297fb, + 0xe2437d665bf4c769, + 0x281fd46879f8c6d5, + 0x4eb23c1ba8fbe653, + 0x6f57c4da95dce3af, + 0xf7d6c25fe7f1342d, + 0x8ca4b96216f54289, + 0xab89c63543e861f5, + 0x13e6f29651ea7f63, + 0xa832b7954eca6dbf, + 0x4c8e5f276abf8c3d, + 0x91d3ce8878e2bca9, + 0xed213f4dc9e5db17, + 0x7d4193c1f6d7ea83, + 0x6354a8f215b9e7df, + 0x1ba5f26436ce185d, + 0x6bea485875e136c9, + 0x347bdcfba2e45637, + 0xa831d75cb1e875a3, + 0x61cbf3dbafdb9521, + 0x182e4d9baebc927d, + 0xe3f94c7ed8bfa1e9, + 0x653849e21ab2cf47, + 0x3ce168a328a5deb3, + 0x7f69bc2657b8fd31, + 0x4c2ed3b765ba1c8d, + 0xbd4381c874ad2bf9, + 0xfe76513dc3d14b67, + 0x4b68137fe1c469d3, + 0x35a976bfefc78951, + 0x6afb34d21fb986ad, + 0xf2154eb43e9da62b, + 0x972de1543bafc497, + 0xe6a4c3b879a2d4f3, + 0x32c91edba9b6f371, + 0x8c1a4efcb6a812cd, + 0xb4d7865fe6ac314b, + 0x45cab1ffe29d3fa7, + 0xe9d78a6434b27e15, + 0xdb67283652b47d81, + 0xc54297143f857aed, + 0xce9f63254e789a5b, + 0xfed278465a6db9c7, + 0x5a7df6ecba8fd935, + 0xeb59127ed893f7a1, + 0x9f48ca2fe8a6271f, + 0x6274af9216a9257b, + 0x4cb5e8a3259b34e7, + 0x3d9fe6c982ae7365, + 0xdb2f487a94a283c1, + 0x126f94ebae85913f, + 0x6ec1b53bad659f8b, + 0xf6e25addcb58adf7, + 0xd41e7b51f96bcd75, + 0x78d6f9c3286febd1, + 0x8ec74b2659831b4f, + 0x87c3fad5467529ab, + 0x2ac6df4cb5784a29, + 0xe238f7ccb27c4895, + 0x2c8d563cb28d67f1, + 0xe2b6195dce71956f, + 0x931a6c71fe6394db, + 0xc3978a221e67c349, + 0xf21659743c69d2b5, + 0x58e742d76a7ce123, + 0xe83adc16564cde7f, + 0xdb58431a97632feb, + 0xdb24935dc4763e59, + 0x82c175ffe2684dc5, + 0x42abd5e1f16b7c43, + 0xd57ea9c3214d6a9f, + 0x98b5ec654f52a91d, + 0x4e9a37f65e43c879, + 0xb27fa5998b36c7e5, + 0x8e62d45a9b4ae763, + 0xf84c71da973ae4bf, + 0x3b9de67dc86f153d, + 0x29a8b3e1f76243a9, + 0x6fc7a84329586317, + 0x5ce2d787645a7183, + 0x62e89fb651396ecf, + 0x825f97d76f2c8e4d, + 0x42d5fe687e31adb9, + 0x4b53e81bab34dc27, + 0x526a98ceda26eb93, + 0xb948ed5dc627d8ef, + 0x85f4be33283c196d, + 0x2a1bf535463f27d9, + 0xf73d91cba9325847, + 0x23f48d5ba42576b3, + 0xe17d3a5dc24a9631, + 0xf5ce147baf1b938d, + 0xa9fcde1cbc1da2f9, + 0x9641e371fc32d167, + 0x1cd6afe32a14dfc3, + 0x192b8ac65a27fe41, + 0x2fa96b1657281e9d, + 0xcef24d59872c3d1b, + 0x5dfc4e7ba51f3c87, + 0x8e4af17dc5126ae3, + 0xd783b69fe3258a61, + 0x192df3adcef587bd, + 0xcfb92d721ef9a73b, + 0x51ba6dc32bfdc5a7, + 0x87d63ce54aefd615, + 0x1b248e387ae3f481, + 0x6e1f8c3a98f613ed, + 0x784153edc7f9325b, + 0x9eb2c84ed5fb41c7, + 0xd6fe2b1dc3ed6f25, + 0x19b6f7e434f27e91, + 0xb98a2d3541e37bfd, + 0xdeb54ac43fe59c6b, + 0x9e68ac754ce8bad7, + 0x2156fca879ecda45, + 0xfac3457a97cfe8b1, + 0x1d72b9fdc9d4182f, + 0xea6327d1f7e5268b, + 0x452f38b216d935f7, + 0xd1a754f323ec6475, + 0x9a8b4e7763ce74d1, + 0x621953f983d1924f, + 0x54d83ab87fd491ab, + 0x9f2671e98dc6bf19, + 0x5469c8eedab9ce85, + 0x5a9e84c1f79adce1, + 0x2bc573d2179deb5f, + 0x62e3f5d547d32acb, + 0x1a8b64f657d64b39, + 0xecfab2d873d849a5, + 0x35eb12cba4dc7913, + 0xe1c3658ba1bd867f, + 0x5e9b48fdcfa195eb, + 0x62b54191feb3c459, + 0x3cfe9d721ea7d3c5, + 0xb876f4d65cbae243, + 0xc8ea7db5478be19f, + 0x5381f4e878af321d, + 0x3f5b184ba7b23f69, + 0xace3152cb3a64ed5, + 0x5d9fb16fe2b97d53, + 0x53c87b1fe1896baf, + 0x7d29f864319e8a2d, + 0xb42a71643f71ca89, + 0x57bd81354d93c8f5, + 0xf26971365ca6e873, + 0x87b5d2e76978e5cf, + 0x6f8ea24cb89c164d, + 0xb51c62eed68f24b9, + 0x2ed3b781f8b36427, + 0x3e5db86215b67293, + 0x3b6f51a5439871ef, + 0xcbf65a15417a8f5d, + 0x3ef17d554f5d8ec9, + 0x847e65da9e81cd37, + 0xf6e3d2ba9b74eca3, + 0x78a3c46eda87fb21, + 0xc5be6a11f8691a7d, + 0x6394ec82176c28e9, + 0x9436be53268f3957, + 0xa5ebc719859267c3, + 0x9fd8a24cb3a69741, + 0x6cd8f94cb167849d, + 0x3de48caa9f6ca41b, + 0x3c8dea9cbd5ec287, + 0x347692d1fb72d1e3, + 0xade487332b74ef51, + 0xb14edc7439561fad, + 0x248af9b658693e2b, + 0x417f3be9865c3d97, + 0x528a467a946e5bf3, + 0xa735c62ed4638b71, + 0xca6b83dfe15478cd, + 0x6c93b7dfef37a84b, + 0x6e5cd9f21f3ac6b7, + 0x9b4e51843c4ed725, + 0x5e46c2b87c62f591, + 0xdf1249698a6514fd, + 0x249efabdca58236b, + 0x325e976dc85a42d7, + 0x7b95826fe86d7145, + 0x168ef52ed34e6fa1, + 0xb49e37f324538d1f, + 0xc7f6eab651349d7b, + 0xd2b317954f26abe7, + 0xe2941fc87e2adb65, + 0xe58b34687a3de9c1, + 0x8f6a2b7dcb52193f, + 0x42389b5fea34279b, + 0x8c547bd1fa384719, + 0xe792ac62192b4685, + 0xaf21be65463c75e1, + 0xfd541ec8742e835f, + 0x2a47eb59814392cb, + 0x3c657e1baf26c139, + 0xf7519c8bad17cf95, + 0x4ae7519cba29cdf1, + 0xe539462ed81bec6f, + 0xba52971549312cdb, + 0x9bd352f76a153c49, + 0xda19e28768174ab5, + 0xc63ae82a961b7a23, + 0x8932ed7ba31c678f, + 0x46e2358ba21e86fb, + 0xc13ed47cbef1c569, + 0x7c61593febf3c4d5, + 0x5f6e94221cf8e453, + 0x68d495f439d8e2af, + 0x1394a52769fc132d, + 0x9a148bd767ef3189, + 0x36451caa97d24fe5, + 0x156d3a8cb4f57e63, + 0x8b65f34ba2e76cbf, + 0xc63527ffe1fa8b3d, + 0x7d86c51321fe8ba9, + 0xd5819cb54fe2da17, + 0x79a32ef65cd4e983, + 0x173b892549b5e6df, + 0xa9c56d3989ea175d, + 0xe4bc192ba7ed25c9, + 0x179456adc8df4537, + 0x75369ba1f6e274a3, + 0xe65ac12436e79421, + 0x65ae2fd543e8917d, + 0x38af56c541ca8fd9, + 0x49ab8f265fadbe47, + 0x2abd98f87ca1edb3, + 0xa48b6eca9ab5fc31, + 0x9b8d53ffe9c61b8d, + 0xaf61943fe6c82af9, + 0x85bc234218cd3a67, + 0x83f7cde326bf58d3, + 0xdcf35b2876d39851, + 0x2a486ed872c485ad, + 0x165afdca91d8a52b, + 0xf97aebc98fabc397, + 0xb824635bab9dc2f3, + 0x8dfa651fecb3f271, + 0xf12bdae43ba521cd, + 0xd13ebf7549a72f3b, + 0x3fbc962546b93ea7, + 0xf43a926987ac6d15, + 0x2c7d48ba94af6c81, + 0x54ec723cb3a279ed, + 0x58d7c3ffe1c4a95b, + 0x26b85d4fef96b8c7, + 0xd2e795321f9bd835, + 0xa2cd17643c8de6a1, + 0x8b249c187ca3261f, + 0x25eb6a998ca5247b, + 0xce463f7cb9a843e7, + 0x9bf326aed8ab7265, + 0x2d5164cfe59d72c1, + 0xe147a53dc38d7e2f, + 0x4eca9f6213729e8b, + 0xfd8b6a243184acf7, + 0x8f9adb143f68dc75, + 0x9f68c7d65c69ead1, + 0xc259f1687a6ce94f, + 0xf958e67edc7128ab, + 0xbd24617feba54829, + 0x21b4d9a1f6a84795, + 0xd87b13a3258a76f1, + 0x8e91dc43237c846f, + 0x42d7be16526f83db, + 0xc4b5de6ba183c249, + 0x521a687a9f76d1b5, + 0x8ec1f9bbac68df13, + 0xdc82461cba49ed7f, + 0x41aeb291f85c1deb, + 0x854e9d332b713d59, + 0xabf9764329734bc5, + 0xd9f3ac8659687b43, + 0x42dcb398734a689f, + 0x68cb32fba35c981d, + 0xe21f358dc14fb679, + 0xac419f3cbf42c6e5, + 0x6dc8e351fd47e563, + 0x543276c21c47e3bf, + 0x98231ac65c6b143d, + 0xe3dc98576b5e32a9, + 0xe95b1c6bab836217, + 0xe7f8d61cb9546f73, + 0xb1e625cba4356dcf, + 0x23b564afe2398c4d, + 0xbd57e121f13d8cb9, + 0xc4a79284314fcb27, + 0x4d36c7f65f42ea93, + 0x6489a7365b24d7ef, + 0xc146f5e87c39186d, + 0x954b6df98a3b26d9, + 0x28d795fdca2e3647, + 0x69137b2fe94175b3, + 0x4165ab31f8469531, + 0x546eafd21536928d, + 0x7341ca265438a1f9, + 0x4f8ea9b7612cbf57, + 0xdf79ae576d1fbec3, + 0xc5d4a72a9c23fd41, + 0xf39c784bab251c9d, + 0x7b31ca5fea283c1b, + 0x2db84591f91c3b87, + 0x96d5b3a3281d59e3, + 0xc419a8d65a328961, + 0x4bea2358751386bd, + 0xa16c274a9417a63b, + 0x36c92f4cb219c4a7, + 0xa5d8237a9efbd415, + 0x1e58c47babfde381, + 0x26845f7dcaf312ed, + 0x14f6abe32cf6315b, + 0x7d39bf8329e63fb7, + 0x5ead293548fa6e25, + 0xed396af875fc6d91, + 0x5316a89873ce6afd, + 0x5bf18e3dc3f29a6b, + 0x68da23edc1f4b9d7, + 0x127a386dcfe8d945, + 0x4aecbf532fdae7b1, + 0x6bf715e43abce62f, + 0xa93ebf276ce1258b, + 0x2b6de9598ad534f7, + 0x9a6412ccbae96375, + 0xdf9a876cb6ea73d1, + 0x2c61fdecb5dc814f, + 0x654c173ed2ce7f9b, + 0x8fce746324d3be19, + 0x42cf5d9431e4cd85, + 0x29f3ed154fa7dbe1, + 0x2a3f18654cb9ea5f, + 0x9241fad768ae19cb, + 0x6379124dcbd14a39, + 0x845c1bafe9d348a5, + 0x85164a31f6d97813, + 0x857ade3214ca857f, + 0x89b673e323ac84eb, + 0x8d2a31e762cfb359, + 0xd17be3c981b3d2c5, + 0x5e8132da9fb7e143, + 0xd5f69a887b96de8f, + 0x9b8ae17dca891efb, + 0x94e638c1f8ad2e69, + 0x915b47c329a14cd5, + 0x7db5346329b47c53, + 0xf862bdc434b569af, + 0x318e29a764ba892d, + 0x734fdb2762adb789, + 0x6b814e5ba19eb7f5, + 0x63142f7dcfa2e673, + 0xb1a7839edb85e4cf, + 0x43bca9132ea9154d, + 0xc8b712a54d8c23b9, + 0x3efdacb76bae5327, + 0xb3fc71298ab27193, + 0xcab54f3a95836edf, + 0xcd32f97cb3968e5d, + 0x21c3d75fe2678dc9, + 0xcb67a511f18dbc37, + 0x6d1ab473217fdba3, + 0xec4f78d65e84fa21, + 0xabd381554e85197d, + 0x4f9183c65c6827e9, + 0x18d29c5bab9c3857, + 0x46fea79cb98e56c3, + 0x437b58dfe8a29641, + 0x49b178d1f574839d, + 0x4a7fdb532587a31b, + 0xdbc9a575436ac187, + 0xbc936af6516abfd3, + 0xef4cba287c6fde51, + 0xc625fd498c631ead, + 0xfe83c46bac763d2b, + 0xfa235c7feb583c97, + 0xdb68a24fe86b5af3, + 0xac85f9b3295e6a71, + 0xc8571ab4365187cd, + 0xd9fc73698563a74b, + 0x8c1d3aea9246c5b7, + 0x496c7fecb17ad625, + 0x47e62c3baf5ce491, + 0x386adfba9a4ce2fd, + 0x7ac64e21fd74326b, + 0x8fb1e7c32c5641d7, + 0x6b375ef32b496f35, + 0x327d4616584b6ea1, + 0x753db419864d7c1f, + 0xfc93641ba5419c7b, + 0x4b8da5edc243bae7, + 0x48f5a29fe137da65, + 0xf34e692edf39e8c1, + 0xce2395b21d2be73f, + 0xfc1758254d3f169b, + 0xf1a7be698d534619, + 0x82c19d5bac276485, + 0xe25483dcba3974e1, + 0xd5e7f4bdc73b825f, + 0xf7ac41eed53e81cb, + 0xf68d37bfe541bf29, + 0xc7d4eb921423ce95, + 0x4ceb2d965236dcf1, + 0xa731d9e54d18eb6f, + 0xdc1e43f76e2c1adb, + 0x537bde198c1f2b49, + 0xe721386edc1249b5, + 0xc59b7d4feb167923, + 0xa3d6b95fe519768f, + 0x843b9513261a85fb, + 0xd678aec4351eb469, + 0x7c53a1998621c3d5, + 0xd483e1fba416e253, + 0x1cebf4d87cd5e1af, + 0xeb12df7bacf9312d, + 0xd581ab3dcaeb2f79, + 0x8145fe9cb8fc3de5, + 0x198c6e532af17d63, + 0x9ab4f13327e36abf, + 0x651a87c545f68a3d, + 0xec8f1d9653f7b8a9, + 0xeb9576d983fdc917, + 0x7f9c84eba1efd783, + 0x2c1db6aa9cb2e5df, + 0x3486ad21fce7165d, + 0x4afd53821de824c9, + 0xb3f691432bec5437, + 0xa647b1f659de62a3, + 0xcd16e3a98ae49321, + 0xab528f7a95c38f6d, + 0x78b21c4ba3c58ed9, + 0x85ef3addc2e9bd47, + 0xe2475631f1eadcb3, + 0xc8d91f5542cfeb31, + 0xdac381654fc31a8d, + 0x1b93a2d54dc528f9, + 0x47f6eda65cda3967, + 0xbe6c342989cb57d3, + 0x6f2d875cb9ce8751, + 0xb239c8ffe6c184ad, + 0xa2498dc1f6d5a42b, + 0xb46958d214d6c297, + 0x8b49236654b9c1f3, + 0xefbca27652abdf61, + 0x87b6f3d54a7cfebd, + 0x56e91db98da42e3b, + 0x8eb47a5a9cb53da7, + 0xb1c594afeab96c15, + 0xd62eba71f7ac6b81, + 0x6bfd8a32159c68ed, + 0xab97fd6436c1a85b, + 0x16b4aef654a3b6c7, + 0x2af837ca92b8d735, + 0x3f562a4982b9e5a1, + 0xec6d817a9d8be41f, + 0x8a9654edcd9f137b, + 0x219b64a1fca342e7, + 0xbe8a61332db87165, + 0x76eadcb43a986fb1, + 0x3259bc65468a7d2f, + 0x68e2f9b6546e7d8b, + 0x6284d53a9481abf7, + 0x3f69d82dc293db75, + 0xea9d165dc286e9d1, + 0xf4219dbdcd69e84f, + 0x376acb932f6d17ab, + 0xb71d89e54d8f3729, + 0x9b3ec4687da24695, + 0x6ad7e4298b9675f1, + 0x3476d9fcba79836f, + 0xd362a58dc56a82db, + 0x46517baed57eb149, + 0x68a5b27fe371cfa5, + 0x5b98ae632485de13, + 0xf6bc92743165ec7f, + 0x7b53d8c54f581ceb, + 0xae5bf1d87e6d2c59, + 0xa3fec6598b6f3ac5, + 0xa8c29b5edc827a43, + 0x6149b53eda54679f, + 0xd87153c1f658971d, + 0xa87ef952164cb579, + 0x94586ad3236db4e5, + 0x25d7f48a9581e463, + 0xe1439ba98164e2bf, + 0x74b28d5baf68123d, + 0x2a5981ddce5b31a9, + 0x7b856d3dca4b3ef5, + 0x263f157eda4f5e73, + 0xe4dfb39219426bcf, + 0xab7ec19329358b4d, + 0x5931fab545368ab9, + 0xf246a9d9854bca27, + 0x9524edfba24ed893, + 0xf453d17ba241d6ef, + 0x84b971ddcf34176d, + 0xda2c54e1fe3725d9, + 0xab3dfe421e2b3547, + 0x4fd2c3e65c2d64b3, + 0x62c8f4987b5f8431, + 0x29d3b6f87a43918d, + 0xe9d234cba6248fe9, + 0x85362addc428be57, + 0x3b69275fe429bdc3, + 0xe87ca461f23dec41, + 0x2d8b347653421b9d, + 0xfbad83576f253a1b, + 0xe423a6865e163a87, + 0xf23deb887c1a58e3, + 0x5f37d84bab2d7861, + 0x2b4fe18ba81f75bd, + 0xbf31c69fe812a53b, + 0x61cd8731f615c3a7, + 0xb827de354729d315, + 0x23ec17f7653be281, + 0x94b67ae6521aefcd, + 0x47d395a76cde1f4b, + 0x71a459698cf23eb7, + 0xcbd9347babf76d25, + 0xfc6b98eedaf86c91, + 0x2dab943dc5ea69fd, + 0x768d4f9215fe896b, + 0xb7c214e435f1b8d7, + 0x8da93f1876f3d845, + 0xabd2467983f7e6b1, + 0x1563af4981d9e52f, + 0x857621ca9fed148b, + 0xc3d8765babce23f7, + 0x8413dab1fce36275, + 0xd7be1c643be672d1, + 0x1de73f8329c87e3f, + 0x14bfd86435da7e9b, + 0xc54328f765cead19, + 0x6b43f2ea94e1dc85, + 0xd1426bfa93c4dae1, + 0x61a79cdcb1c6e95f, + 0x635ab2dfefd918cb, + 0x9e5dca821fcd2839, + 0x78e514f32dcf37a5, + 0xc39b71f76cd48713, + 0xf45e8c176ac5847f, + 0x81c534da96c783eb, + 0xf2b794cba6dcb259, + 0x4276e8bed4aeb1c5, + 0x16d5a87fe5b1df23, + 0x2c57edf212a3ed8f, + 0xdcae5b9542a61dfb, + 0x36b9cef54fba2d69, + 0x28a4fde76e9c3bd5, + 0xa67db3998caf6b53, + 0x6ed1a34dc9b268af, + 0xdba5239fe7b5982d, + 0xb8a73ec1f4c7b689, + 0x3e824af2149ab6f5, + 0x14bc53a324aed573, + 0x7b2ca9876491e3cf, + 0xc57b6eaa92b6134d, + 0x1e45b9c98fa732b9, + 0xa48b912dceab5127, + 0x5438a26edb9c5f83, + 0xd186a49cb87e5cdf, + 0xe3c27a621a928c5d, + 0xc8e1479326748bc9, + 0xb6279ae54598cb37, + 0x92c43b87647bd9a3, + 0xde5b146ba48de921, + 0x67ab24ddc3a2187d, + 0xf8e42b9dcf8426e9, + 0x67c18d41fea93657, + 0xe9bfdc821e8a65c3, + 0x249e75a43c9d8541, + 0x8267fea54a6f729d, + 0x3cbef4a87984a21b, + 0x2794681ba584bf67, + 0x9264d7eba467bed3, + 0x1b835e6dc37aed51, + 0xd7c9821fe15cfbad, + 0x28b961a654813c2b, + 0x375468a32f643b97, + 0x2e85c1954d6759f3, + 0xd3b645c98d5b6971, + 0x53ecd629894b76cd, + 0x4f97e5ddc85f964b, + 0x4a6b185fe862c4b7, + 0xba561471f687d425, + 0xf64e9da32568e391, + 0x23c7a9b54359e1fd, + 0xb95f67e9837e216b, + 0xe6534a298e513fc7, + 0x5b81e94bad746e35, + 0x6ecf723cbc476da1, + 0xfe14935eda497b1f, + 0xa5813de1f63d8a7b, + 0xaecbfd22163fa9e7, + 0x9d28e5143842d965, + 0x6dce4ba98645e7c1, + 0x8a276b4a9248e63f, + 0x6e387fdba24c159b, + 0xa8945f3cbf4e3519, + 0xf19e63bede416385, + 0x9de87a31fc4573e1, + 0xc3f9a6832c37815f, + 0x812ebf9439287fab, + 0x6983a416573cae29, + 0x5dfab348762fbd95, + 0x84a1cdfa9643dbf1, + 0x8e7d293cb324ea6f, + 0x1349c72fe23719db, + 0x8b1c9f5fef1c2a49, + 0xd139ac432f1e38b5, + 0x482a95b76e417823, + 0xc5ef23a76c13758f, + 0x4fa981d87a1684fb, + 0x29bd3e5dc81ab369, + 0xecd18b3ba71cb2d5, + 0x5b37dafdc72fd153, + 0x5e9436ddc412de9f, + 0xca5721d545362f1d, + 0xf42e61a653182e79, + 0x6d1589354df93ce5, + 0x962da3e87bfd5c63, + 0xdbc48e9768de59bf, + 0x2d4ac69cbaf2893d, + 0x3fc68e2ed6f4b7a9, + 0x143a2f8fe5f9c817, + 0x7de9f86215fbd683, + 0x81c6a3e323ebc4df, + 0x6ce54f3986f2145d, + 0xe24c657981f523c9, + 0x35d621fbafe95237, + 0x1437c6da9deb61a3, + 0xd534c87a98ba5def, + 0x5fd9734dc8bf7e6d, + 0x645fd87217e28cd9, + 0xdfb698a328e5bc47, + 0x9c3d87e545e7dab3, + 0x421a9b6875dbea31, + 0x4589e13762bcf78d, + 0x4218a9fcb3d127f9, + 0x5914beadcfd43867, + 0x6217ad31fec856d3, + 0x7d46b8e32edb8651, + 0xba157c9329bc73ad, + 0x2193abe658cf932b, + 0xe71a49c768d3c197, + 0xcd3216f986a5bfe3, + 0x4dce8b7ba4b8de61, + 0x3b8f1c7ba298fcbd, + 0xe3759281f2ae1d3b, + 0xf2cde87542d13ca7, + 0xedfc6b143fc46b15, + 0x3d6ec2754ec76a81, + 0xe72ad3954ba967ed, + 0xb21a38e768ad975b, + 0x219865acb69fa5c7, + 0x7d81632fe8b2d635, + 0xb9281451f5b6e4a1, + 0x54fa896325a8e31f, + 0xac27689654ac127b, + 0xbf8154d762ad31e7, + 0xa476cf298ea16f45, + 0xc94a1e598d946eb1, + 0xf19b6c8bab967c2f, + 0x94d17cbfea697c8b, + 0x273f459fe56c9af7, + 0xa7c23bd2168fca75, + 0xe76581a54693e8d1, + 0x4c9daf276395e74f, + 0xfe28b6a8739816ab, + 0x782cda1cb1ac3629, + 0x8435d1fcbf8e3495, + 0x6ed4823dcd9274f1, + 0xc68da25fec94826f, + 0x16afc5932c7681db, + 0x13eb46c32b68af39, + 0x61cb2794376cbea5, + 0xb742fda9867fcd13, + 0xd857c2ea9462eb7f, + 0xd4e2a17dc3751aeb, + 0x83c5a47fe1782b59, + 0x7a4d82bfef6b39c5, + 0x84acdfb21f7e6943, + 0x5e879fd43d51769f, + 0xcb6184e65c74961d, + 0xa5be6c498c56b479, + 0x67c28b1ba869b3e5, + 0x7d4c631cb87cd263, + 0x2e17493ba45ed1bf, + 0x871ba651f685213d, + 0x925d87b213652f89, + 0xf1c256e541683df5, + 0xe3bc81776f4b5d73, + 0xa724c1976b3d5acf, + 0x8653ae7a9c518a4d, + 0x63b4ef7edc43a8b9, + 0x3482ac7fea46c927, + 0x834129b1f64ad793, + 0xe9783c42163ac5ef, + 0x5e9dc843253ef46d, + 0x1cdf24b9856324d9, + 0x96f1372cb1685347, + 0x965bd48baf4962b3, + 0x5a2cde7cbe5c8231, + 0x2175fcdcba2c6f7d, + 0x576c49d1fa318de9, + 0xd5927c321a23bd57, + 0xf68d32a54826dbc3, + 0x98f3bce76739eb41, + 0x19db8e57642bf89d, + 0xef93b45ba54f291b, + 0x8649e37ed1423987, + 0xfe3965adcf1657e3, + 0x6a2479d1fe2a8761, + 0xfae637932e1a74bd, + 0x4f2ae9665c1e943b, + 0x4cb91d576b31c2a7, + 0x48b7532a9a36d215, + 0x56d3812ba826df71, + 0x3476fada9417fecd, + 0x38b7af1ed52c1e4b, + 0xc17fd36fe31f2db7, + 0x1c6e84b874136c25, + 0x1b9fac543ef46b91, + 0x849a12e43be568fd, + 0x1f2d95354cfa986b, + 0xf4ad391658fca6d7, + 0xfc56d98ba8efc745, + 0x4362951dc7f3e5b1, + 0x37f24bedc5d6e42f, + 0x3fc648a325f9138b, + 0xcd942b8654eb32f7, + 0xab91647982fe4175, + 0x8af52c687ed26fc1, + 0x9a236bd98bc47d3f, + 0x53f79e698ae57d9b, + 0x5c94be6ed7e8ac19, + 0x24cb7ea1f6edcb85, + 0x84eb653326bfc9e1, + 0x871adb6436c2e85f, + 0xf3bd128764e517cb, + 0x6df3e5a984ea2739, + 0xf26a1dea91ec36a5, + 0xdf6e4b5bafce7613, + 0x13f26d5cbdc1837f, + 0xa18732c1fac482eb, + 0xb738a6932cd7b159, + 0xedc9b3a327c8afb5, + 0x4e9d361657abce23, + 0x36f7b816549edc8f, + 0xb6de5f3985a31cfb, + 0xd13a692cb3d52c69, + 0x5829bfcfe1c83ad5, + 0x367952cfefbc6a53, + 0xdea876421e9d57af, + 0xb27893154eb1972d, + 0x27e51cf54dc3b589, + 0x1c38d4b769a7b4f5, + 0x3c2afdea98bad473, + 0x68f51b7a958ad2cf, + 0x596dfa2cb59ef14d, + 0x2863d151f5c431b9, + 0x3f758c1323b64f17, + 0xba9f8e6541b95e83, + 0x4bdf79643e795bdf, + 0xc5fd1ae54c8e7b5d, + 0xd7eb12376d718ac9, + 0x241c57eedb94ca37, + 0x3972ac6fe796d8a3, + 0x9ab7c581f69ae821, + 0xa2e648c2148bf57d, + 0x76fbe514348f15e9, + 0x38af472a96b23457, + 0x7d832e1a91a764c3, + 0x32de467cbf9a8341, + 0xde92b6cbae6b719d, + 0x2a39de7cba5c7ef9, + 0x8d6a23c1fa81be67, + 0x5832ef721974bcd3, + 0x294fab843987ec51, + 0x527f8b643457f9ad, + 0x23a49df9857d1a2b, + 0x7c3a12fcb36f2a97, + 0x34e6bf7dc19258f3, + 0x26c753eedf956871, + 0x54cbe711fe4875cd, + 0x2a67d8321e6c954b, + 0x76d4feb32c5ea3b7, + 0x12a643f87b81d325, + 0xd25e16798a75e291, + 0xebd45f798645cfed, + 0x175df84dc4691f5b, + 0x123bcfaed35b2ec7, + 0x468cb1ffe17f4d35, + 0xab9765e542736ca1, + 0xce879d643e457a1f, + 0xd7251c654e36897b, + 0x4873deb65c3ba8e7, + 0xbd1236fa9a3ec865, + 0xfde96a5cb952e6c1, + 0x421ba58dc864e53f, + 0x981732b1f657149b, + 0x4a6ed9f3276b3419, + 0x9e2bf188736d4285, + 0x751fd929835f62e1, + 0xe37abc298d327e4f, + 0x3cfb7d198d247eab, + 0x64f923ccbc37ad29, + 0x651f728fe82abc95, + 0xa368c92fe73dcaf1, + 0x417ef6332831e96f, + 0x2e641ab6573418db, + 0x82714c5ba6372849, + 0x1a7e24ba942a37b5, + 0x47d68a1cb14d6723, + 0xe263978bad1e648f, + 0x46f7e32dcd1283fb, + 0xb9d1e381fd15b269, + 0xb8c69fe43c28b1d5, + 0x9dc1e2a6591acf43, + 0xcab3f6e5461bcd9f, + 0xcf5a6e1a98432e1d, + 0xf9e7d14cb6142d79, + 0x5682af1dc4173be5, + 0x498dacffe21a5b63, + 0x8dfe62adcdea58bf, + 0xe2a96fb21cfe783d, + 0x9d715ce43df1b6a9, + 0x92ebdc365bf4c617, + 0x1c248fe76af7d583, + 0x39dc45b876e8c3df, + 0xbc53a76a96ebf25d, + 0xc73e924cb5ef12c9, + 0x498135cfe6f45137, + 0xf2458cd212e65f93, + 0xce869a1431d75cef, + 0x92eb48543fea7c6d, + 0xd6acfe154ace7bd9, + 0xea4f5c798ae1cb47, + 0x3b1c4deba8e4d9b3, + 0xb41e28ddc8d7e931, + 0x54d7afcfe4c9f68d, + 0xdf9875b325dc16f9, + 0x14a7fb6434df2567, + 0xae7126f984e265d3, + 0x9e1b763ba2e78451, + 0xce81a4276fc872ad, + 0x36a4fce98edc912b, + 0x1e896dfdc9bdaf87, + 0x2c6a7151f8a1bde3, + 0xd983fb1329b4ed61, + 0x65bed3a32695fabd, + 0x6f921bd656d91c3b, + 0x1d98b45764cd2ba7, + 0x7de1825a93cf4a15, + 0x7a61b48dc2d36981, + 0xf138ce2cbfa476ed, + 0x9b624ea1fec8965b, + 0xbe72f3421e9ba4c7, + 0x6c195d432baec435, + 0x2d3fca4769b2e3a1, + 0xda4eb82878a5e21f, + 0x2c7e15dba6c8217b, + 0x62c3fe8cb4a92fd7, + 0x5f74eb3ed2ac3e45, + 0x35972fdfe29f5db1, + 0x3a8fdc6541a37b2f, + 0xe4768d132f947a8b, + 0x48d6cf743d86a9f7, + 0x7ba9c5e54d8bc975, + 0xfad82be7698ec7d1, + 0x426c9dfcb891e64f, + 0x54f13c6fe79415ab, + 0x98e73a61f6b83529, + 0xf9e2d43216ab4395, + 0x8b94ed36549c63f1, + 0x78dca346529e716f, + 0x8eb637f65e627fcb, + 0xc56d4f398d75ae39, + 0xba6c5e4a9c67bda5, + 0xb14723ffe97adc13, + 0x2fba579fe65cda7f, + 0x1bf2dea4387219eb, + 0x1ac4958437842a59, + 0x7b4d21f7649738c5, + 0xc4b3561ba29b6843, + 0x534cfdeba17c659f, + 0x68b273dbae6f851d, + 0x2c561a9ede62b379, + 0xb71de951fc76b2e5, + 0x5d4ce9832c79d163, + 0x51ebd9332748ceaf, + 0x9c5db735475bfe2d, + 0x1df3526ba7612e89, + 0x74fbec1ba6743cf5, + 0x46e372ced2685c73, + 0x8eb53c6ed14859cf, + 0xf5ba497fef3c794d, + 0x3b92ae721e3f87b9, + 0x5c3fb7d54e53c827, + 0xdb564f387c45d693, + 0xfc2457b76937c4ef, + 0x1c362f8a984af36d, + 0xfd8ec7acb75e13d9, + 0x9734cf2fe9815247, + 0xd5e81ac1f47561b3, + 0xe489cbd434587f21, + 0xc98fd61541396e7d, + 0xb85fd9354f2b7ce9, + 0x72acd3476d2fac57, + 0x69f13cd98b42dac3, + 0x2e91863dcb36ea41, + 0x4bf6a18dc826f79d, + 0x43de5971f74c281b, + 0x92def542193e2687, + 0xa59f4238784156e3, + 0xb5ced7fba7348561, + 0x32bc4d1a912673bd, + 0x6975fab98f1a923b, + 0xe52c6dba9e2db1a7, + 0xced65f4cb91daef3, + 0x841d7e91fa23de71, + 0x4ae71b332814fbcd, + 0xf6478bd659281d4b, + 0x1ef63946561a2cb7, + 0x32fd48ba971e4b25, + 0x3d296fadc5326a91, + 0xf15ce29cb21367fd, + 0x2de7836dcef4976b, + 0x685241bfecf8a5d7, + 0x65398c721dfbc645, + 0x25f4ea6439fed4b1, + 0x439c8d5769d1e32f, + 0x48f5b2a879f5128b, + 0x8ef5269ba6e831f7, + 0xc7fe4a9cb4ea3f65, + 0x59c8346ba3fb5ec1, + 0x49ca256cb1de6c3f, + 0x71af286431f27c9b, + 0xe96fcd543fe5ab19, + 0xde1c4ba43de7ca85, + 0xaf6ec4d659dac8e1, + 0xc917a4e768bcd75f, + 0xdec4bf6ba8e216cb, + 0x9ae8217ed8e52639, + 0xc45de281f6e834a5, + 0x8b1cd59326eb7513, + 0x8192eac543dc627f, + 0xf3847db652cf71eb, + 0xbf3a78d76ec2af49, + 0x1cfa46587dc4aeb5, + 0x243a6e8a9ab8cd23, + 0x46fd398dc6a9db8f, + 0xa591437ed58ce9fb, + 0x1af46c7438d12b69, + 0x46ed951327c439d5, + 0xf9123ae874d86953, + 0x263418d872c956af, + 0xebd384fa91bc862d, + 0x8ebfa6287ebfa489, + 0xe96317ddcda2b3f5, + 0xead1b851fcb6d273, + 0x6b973d532a97d1cf, + 0xfe154a932789ef3d, + 0xe3acb985468d1fa9, + 0x417ea32a98b24e17, + 0xe65cf1dba6b45d83, + 0x39f781ccb2965adf, + 0xbf96c7afe1b97a5d, + 0x42b8951fef6d78c9, + 0xca7f32e21e8fb937, + 0x63e1a9c54e92d7a3, + 0x364f1dc65ca6e721, + 0xc4ae63b65a98f47d, + 0xe81536dba78b14e9, + 0xd1283a4dc8ae2357, + 0xa37f918fe7a162c3, + 0x6b73e9d1f5b68241, + 0x73ab9d5212956f8d, + 0xc4629d7431687df9, + 0x84e9d7f43f5cad67, + 0xb81ae2965c6fabd3, + 0x73bfc24a9c83eb51, + 0xc697ed1cb964f8ad, + 0x7c8453afea78192b, + 0x1b743521f56c2897, + 0xa29cd462168d47f3, + 0x6f3e98d545a28671, + 0xb352a147628374cd, + 0x8d523fbba187934b, + 0x56c32b998f59a2b7, + 0xdf91264bae7dc125, + 0x1e2ac74cba5ecf81, + 0xe836a51cb852fced, + 0x734bac832a761e5b, + 0xf87425b439582dc7, + 0xf28b3ec7687b4c35, + 0x149cfe39846e5ba1, + 0xe231564cb462791f, + 0x17b8ea3ed153987b, + 0x2471ed5dcf35a6e7, + 0x6a497ed1fe3ac765, + 0x3719a5b32e4bd5c1, + 0xc4b965d32a5ed43f, + 0xa9db3f487c64139b, + 0x64fd7ecbab674319, + 0xe281743dc96a4185, + 0x8d75c39cb64a5fd1, + 0x9e47a36cb23c6d4f, + 0xdb356281f2417dab, + 0x21a7b6e43154ac29, + 0x92465df43f26cb95, + 0xb97d2f165d38c9f1, + 0x23c1f9765a2bd86f, + 0xd64b32f8782ef6db, + 0x7435aefedb532749, + 0xd96c134fe92736b5, + 0x526917d1f84a7623, + 0x6f782a42152b638f, + 0x2d78bc96543d72fb, + 0xf7dbce198342b169, + 0xf19485d87e13afc5, + 0x8d7f62ea9d17ce43, + 0x369db5498a17dc9f, + 0xf3e1a5bdc82afb1d, + 0x5db7132fe82f1c79, + 0x51b2a8f549123ae5, + 0x6b29c7f549175a63, + 0x43e5fab7641857bf, + 0x58126dfa941b873d, + 0x348957ccb21e85a9, + 0x2371b8ca9defb517, + 0x4691dc7cbcf2d483, + 0xa368271cb9e5c2df, + 0xf8156ae32ae8f15d, + 0x6e59c72548fb21c9, + 0x78f32ac658ed3f27, + 0x16e52cd987f15e93, + 0x624eb75984d35bef, + 0x658f3d2ba2f57b6d, + 0x236eab8dc1f87ad9, + 0x17628fedcfedba47, + 0x8f2d67c21edfc8b3, + 0x312a7ce65cd4e831, + 0x7caf68d43ac4f58d, + 0xce81a7f76ad815f9, + 0x51bdf9cba9ec2467, + 0xf2ebd81ba7ce54d3, + 0xc8fa519ed7e28351, + 0xa925d671f3e471ad, + 0x84e5c6d323d68f1b, + 0x5f78642431d9ae87, + 0xd7265cf54f9bace3, + 0x1b834de65bafdc61, + 0x19cd38e768a2f9bd, + 0x27354e1dc9d61a3b, + 0xd6a1982fe6d829a7, + 0x8c157631f7dc4915, + 0x1e75934326ce5781, + 0x65ef79a434b175ed, + 0x96fa5db872d3945b, + 0x6f57bcd981d6a3c7, + 0xdcfeb5198fbac235, + 0x15d746e98e9cd2a1, + 0x6eb4a53a987cbefd, + 0xa478312fe9a31f6b, + 0x3d9eb7a219a52ed7, + 0x7d1fa56328b93d45, + 0x52edc785469a5cb1, + 0x4eadb898749d6a2f, + 0x136c95fba3c1798b, + 0x64795bddc1b3a8f7, + 0xf3c9e62edfa6c875, + 0xa816be91fe89c6d1, + 0x4af6cd821c8bd54f, + 0xbf7d8413297ef3ab, + 0xc23465887cb53429, + 0xe4c2b7698ab74295, + 0xf86a91ecb7a962f1, + 0xf2e4d81cb38a6e5f, + 0xbf394ceba27d6ecb, + 0x173b4681f281ad39, + 0xac1b8e632183bca5, + 0x5a1e96854f87db13, + 0x9d5a24843c58d97f, + 0x7cb8a1d5495af7eb, + 0x7e91c26bab7f1859, + 0x98735bceda9237c5, + 0x61bd237fe9a86743, + 0x926a4cdfe378649f, + 0x1a8b3943257b841d, + 0xb17d5f35436ea279, + 0x362adb987382b1e5, + 0xeaf256d98e74cf53, + 0x8a524c687b45cdaf, + 0x27a136da9a58fc2d, + 0x39ba18ffea5c1d89, + 0x2bc651aed86e2bf5, + 0xa5bf27d21a825b73, + 0xe5d67c13276458cf, + 0xde3f78476359784d, + 0x6dc54a98724c86b9, + 0xd52947eba15eb627, + 0x6e219fdcbf61d593, + 0x3f2189ebab54c3ef, + 0x4fd837cfeb47f26d, + 0x1c456a243c5a12d9, + 0xec23ab465b6d3147, + 0xf74c21e7685e4fa3, + 0x1965cebba9647e21, + 0x5912748ba5346c7d, + 0x64289dbdc2367be9, + 0xcf4251bfe13cab57, + 0x87c169fedf2eb9c3, + 0x89fbdc243f52e941, + 0x297b5a354c23f69d, + 0xfd438c976d48271b, + 0xcf7d5aba9c3b2587, + 0x19863ceba92c45e3, + 0x8d2315adc93f7461, + 0x458f12cfe64372bd, + 0x283c56a1f546913b, + 0x52c973621326af97, + 0xd89a27c65129adf3, + 0x82ba91365f2ecd71, + 0x25e89c476b21facd, + 0x54eaf82a9d251c4b, + 0xc574b32edc162ab7, + 0xbfd39a8fe91b4a25, + 0x37ed4281f72d5891, + 0xa9783c63271e56fd, + 0x2bf9eca54712956b, + 0xb62e7d998315a4d7, + 0xcb7f92eba219c345, + 0xebd842c87ef9d3b1, + 0xba214e998aebd12f, + 0xc4f7a83a98cdef7b, + 0x379f5b2dc9d32fe7, + 0x3fbd49521af73e65, + 0x81d2e4b437f85dc1, + 0xcd56b39545ea6b3f, + 0xa4e28f6653fe6a9b, + 0xc61249f984f2ba19, + 0x2f9d8c3cb1f3c985, + 0xe73fd85bafd6c7e1, + 0x7da34f1febc9d65f, + 0xeb54693219daf4cb, + 0xa593cb654bdf1539, + 0x214c63587be243a5, + 0x3fd6ce1a9ae87413, + 0xb1ed456ba5d9617f, + 0x59267bd983c96fdb, + 0x5d13a2ccb2cd8e49, + 0x91c453e1f2e1adb5, + 0x16dfe75541e5dc23, + 0x8d7b4ef32eb5da8f, + 0x9176fcd43ca7e8fb, + 0x8f19ed465bcd1a69, + 0x93f561e879bf28d5, + 0x9264bf1dcad26853, + 0x4e21acbed7c465af, + 0x2d7bc811f4c9852d, + 0x5b7f943214dca389, + 0x271a3fe543bda2f5, + 0xeb5176f984c2d173, + 0x9fd63c165d83cebf, + 0xa81e4fb87b96fe3d, + 0x6ea8b2387cb81ea9, + 0x984d215fe9ac3d17, + 0xd9a81b5fe7af4c83, + 0x3927afb217a259df, + 0xcb43f5a326b4795d, + 0x5d3fb2e543b687c9, + 0xf8ba39d762acb837, + 0x1a9f5769819ec6a3, + 0x832d1fccbfa3e621, + 0x76fc3e2cbc94f37d, + 0x856d7b11fca713e9, + 0x89de53b21dab3257, + 0xa97e38f54a9d51c3, + 0x6f8e31a6589e6f31, + 0xd41659e875926e8d, + 0x4395bfdba3847cf9, + 0x9cf65eaed298ac67, + 0x164cbf9fe179bad3, + 0x483ad6fdcf7eda51, + 0xa31e9f532e61f7ad, + 0xca79eb354e95182b, + 0xb87ef6c54da82697, + 0x483d62e87b8a46f3, + 0x68ca1fdcba9d6571, + 0x86b3475ba57f63cd, + 0xcb35d29fe683924b, + 0x41ed9721f385a1b7, + 0xa5d1e9b32378bf15, + 0x385c12f5426ace81, + 0x64d2e5f43f4acbed, + 0x15f3ca798e721d5b, + 0xefc183da9d642bc7, + 0xb463251edc784b35, + 0xcd13256fe86b59a1, + 0xb937cf6fe75c681f, + 0x6cb35d82154f867b, + 0x5f8b17643462a5e7, + 0xd8153f7a9287c465, + 0x436a751a9268d4c1, + 0xc9476b398e5ad23f, + 0x4f72d6598c4df19b, + 0x9236af5fed734219, + 0xbc9d7f2feb643f75, + 0xefb19d432a475ed1, + 0xbf9531d328396c4f, + 0xf2e9adb5453d6cab, + 0x9da18bf8754f8b29, + 0x528efc7cb342ca95, + 0x8d4ea92cb245c8f1, + 0x1fc49dacbe28d76f, + 0x495c37dfec29f5db, + 0x1c5a74f32d3e1649, + 0x5de8b6f87d6134b5, + 0xe834bfca9c467523, + 0x7c52a36a9a37628f, + 0xd41ef78ba63971fb, + 0x48c62dfcb42c8f59, + 0x76dafe2cb32f9ec5, + 0x359cd6a1f152cd43, + 0xdca259643124db9f, + 0xdb93e5154e27fa1d, + 0xc8bfa9765e2c1b79, + 0xea95b4187b1d29e5, + 0xcae61f7cbc215963, + 0xb4532fadc91356bf, + 0xf1827cbfe917863d, + 0xba648971f51b84a9, + 0x95a61e74362db417, + 0x7ef52cb7651fc283, + 0x682eafc87423c1df, + 0x9fb78c276bc3ef4d, + 0x8921ceb87ce61fb9, + 0x2ce1f57a9bfa3e27, + 0x3c792f5cb8fc4d93, + 0x45f178acb6cd4aef, + 0x8a5cb6e218f27a6d, + 0x5a798bc325f478d9, + 0xd7394f2653f8b947, + 0xa3dc294762fac7b3, + 0xfc67da4a92fed731, + 0xe8da15fa9ec1f48d, + 0xd937fe2cbcd514f9, + 0xeca3d161fce92367, + 0xe26d9b321bea52d3, + 0xc87125954aed7251, + 0x5c96872436be5f9d, + 0xae596d8876d38e1b, + 0x3ac85fda93e4ad87, + 0x3a745d6a92d7abe3, + 0x897e3f5dc2eadb61, + 0x3e2b165baf9ce8bd, + 0xdcf357e54fd2193b, + 0x1498adc43ed428a7, + 0x83af2c476cd94815, + 0xc5ae4b387adb5681, + 0x15f64b2987ab64ed, + 0xd126c5fba6cf835b, + 0x7b3ad25fe5d3a2c7, + 0x14adb9c1f4d7c135, + 0x61a5fc3323b7cf91, + 0x1b7ef4243198bcfd, + 0xf4e1dc943e8cfd6b, + 0xde897f276ea12cd7, + 0xd4fa317a9db63c45, + 0xfc56e9bed9c75ab1, + 0xa423e9ced7ba692f, + 0x75c932d1f4ad678b, + 0x8a73fd6214ae96f7, + 0x1459ca6434b2c675, + 0xaeb5182873a6c5d1, + 0xc624d31871a8d34f, + 0x35849b776e79f2ab, + 0x71ce289cbdae1329, + 0xf496b87fedb24195, + 0x41679f8eda945fe1, + 0x792a63c21a976d5f, + 0x34fab8e325786dcb, + 0x95cb6a75457d8c39, + 0xc9dbe327637f9ba5, + 0x587cf29cb594da13, + 0x87e13afcb194d87f, + 0x9cbe158bad57f6eb, + 0x7ed23cb1fe8c1759, + 0xf3e2d9421d8e26c5, + 0x9e1dafb65da17643, + 0xc397ba665b84639f, + 0x145ade276a97831d, + 0xaf329bddc56ba179, + 0x8ed5b34ba36b9fd5, + 0x6f89214dc27fbe53, + 0x8943caffe162dcaf, + 0xc54b86f43175fb2d, + 0xca258e143f571c89, + 0x758efad54d6b2af5, + 0xe74391698c6e4a73, + 0x3a57d4ca9a6157cf, + 0xa23d64bdca63874d, + 0x7bd6859fe74685b9, + 0x358a76b1f46ab527, + 0x45b92632156dc493, + 0xe2159a65435db2ef, + 0x241fac698273f16d, + 0xef9b27598f5621d9, + 0xb3c81e5bad592f37, + 0x57a364ea9c5b4ea3, + 0xfda2413dca5e6d21, + 0x3856e191f9416b7d, + 0x657d92e218437ae9, + 0xcd19af732836ba57, + 0x3aeb49176549b8c3, + 0xd26f5aea935cd841, + 0xd1579cb9813fe59d, + 0xa923457dcf54261b, + 0xef3586bede362487, + 0xd2eb6131fc2954e3, + 0xe9df6b432d4c7361, + 0xd5cab825493e61bd, + 0xd5f1c43769418f2b, + 0x5eb7fa698623ae97, + 0x52a83f4a9526acf3, + 0xf6ae782cb439dc71, + 0x1e56c97cb12ae9cd, + 0x5a86d43dcd1ef94b, + 0x79326bd54f1329b7, + 0x5d283a176e174925, + 0xe4a3f9c76d2a5791, + 0xad8e9318791a65fd, + 0xb2d5167ba91e846b, + 0x23b7598dc821a3d7, + 0xa825419fe816c245, + 0x692d75b1f537d2b1, + 0x259dfb443428ce1f, + 0x6978cdf5421afe7b, + 0xfd597c354bfc1de7, + 0xbd1cf4698cf13d65, + 0x375d42698af45bc1, + 0x24a65cdcb9e76a3f, + 0x14c8e5aed5fa689b, + 0xfdb3c78fe5fda819, + 0x3b8f49d214efb785, + 0xbf16eac545f3c6e1, + 0x5e4d1cb872e6d45f, + 0xd348e7b761e7f3cb, + 0xd215c6498fec1439, + 0x6ecaf78a9cde32a5, + 0x1eba263edce47213, + 0x5e81ba9ed9c35e6f, + 0xef4376a218c56edb, + 0x79f5c4e326ea8d49, + 0x61472fd434ed9cb5, + 0xe594bfd875dfcb23, + 0xc129e38873c2d98f, + 0x17df28ca91c4e7fb, + 0x87249ebdcfda1869, + 0xb41385d1fecb27d5, + 0xedf3a9421dce4753, + 0xefb196a43bc164af, + 0x19a4d8276ac5842d, + 0x18dc726657d6a289, + 0xf7ec42d986c9a1f5, + 0x7234cd6a94acbf63, + 0xa476b12a928eadbf, + 0x4517c8dfe1a2fc3d, + 0xa14f928432c51da9, + 0x826f5e154fb93c17, + 0xed67ca965eac4b83, + 0xa8b43f965a9c48df, + 0xdae6154a9ab1785d, + 0xec7ab64ed7b386c9, + 0xc742d18fe5c8b637, + 0x14b9c7d1f4b9c5a3, + 0x5f17928436acd521, + 0x78fb1935439fe27d, + 0x912ab3c873b412e9, + 0x57b8c31a9fb83157, + 0xd4b6e8187d984fb3, + 0xd3b7c9ebac9b6e31, + 0x43a8d51cb97e5c8d, + 0x3f9a475fe6817bf9, + 0xf768eb221893ab67, + 0xb8dc19632586b9d3, + 0xd418b9f7648ad951, + 0xbf978416527be6ad, + 0x7d8c5e3a918ef62b, + 0x9ea164fdcfa32597, + 0x8f15b36dcd9745f3, + 0xab254681fd9a6471, + 0xc7fe32921b7a62cd, + 0xbc19f8443a7e814b, + 0x2769be5548619fa7, + 0x1e524c8a9784be15, + 0xcfbd65eba476cd81, + 0xb3e4158a9257caed, + 0x867c52fed16cfa5b, + 0x43eb259ede5f1ac7, + 0xf327d8521f824a35, + 0x2cf41e743e7658a1, + 0x5d21c9f54c59671f, + 0x94b52fa76a4c857b, + 0x74b9df1ba85d94e7, + 0xbf8e576ed981c365, + 0x8cfd3b6fe675d3c1, + 0x7a3c985fe467d13f, + 0xf594cb321247ef8b, + 0xcfe15b75425b1ef7, + 0x58a2bd976d4f2e75, + 0x6cab9ed98e635cd1, + 0x1724deca9c356b4f, + 0x264cae5edc3769ab, + 0xdf9a82bfe74c8a29, + 0xc3a5e941f63eb895, + 0xc62a54d43852c7f1, + 0x6fba84c32743d56f, + 0x4fb165387236f4db, + 0xb45e31cba26b1549, + 0xd4ba6c2a9f4d23b5, + 0xf561daccbd5f6423, + 0x8327bfcedc43618f, + 0x3e9174bed9246feb, + 0x4e2da8621b278e59, + 0x475dbe14372a9dc5, + 0xd9847a17672ebc43, + 0xf24b5c987531da9f, + 0xd192e76ba534f91d, + 0x26e7bc9ed2361a79, + 0xe345a9ddcf1a28e5, + 0x9742ab31fe1d4863, + 0x4f359c832c1e45bf, + 0x5fb34ca76c12853d, + 0xed5c71876c1583a9, + 0x41d6cfa98a29b317, + 0x1b956ceba72bc183, + 0x6d5f3179841baecf, + 0xd1785e9cb521fe4d, + 0xcdb28971f3241eb9, + 0xb93f41a654183d27, + 0x5891ceb32ef84c93, + 0xae71fb643bda49ef, + 0x36ba2d554afe596d, + 0x873bcd276af187d9, + 0x928f514dc9f3b847, + 0x3f594aeed5f7c6b3, + 0x94db31ffe5fad631, + 0x682ae57214fbe38d, + 0xa7cb918543cde2f9, + 0xb6de347a91f43267, + 0x7231ace98fe751d3, + 0x9436c2198cd96f41, + 0x4f693e1878ca5e9d, + 0xe1b827dba8ce7d1b, + 0x9e5c4231f6e1ac87, + 0xfb6ce59217d4bae3, + 0x7cebfa9435e7da61, + 0xebc72d9543c8e7bd, + 0xc5f741a762dcf73b, + 0x74fcabea92df16a7, + 0x659e834cbfd34715, + 0x195f64ddced76581, + 0x184c5921fab863ed, + 0xc5f683721adc825b, + 0x1c4e97a438be91c7, + 0x4b1e8fa768c1bf25, + 0xc432a5e876b4ce91, + 0x69da3f887395cbfd, + 0xc76feb8a92a8fc6b, + 0x4bc6a15fe2ac1bd7, + 0xc6f513eedeaf2b45, + 0xd96a35432fc359b1, + 0x46751f243db5682f, + 0x1d2754a43dc9768b, + 0xf15ec9d548ab95f7, + 0x712ef8aa98aeb475, + 0xe834561cb7a2c4d1, + 0x451ef82dc6a5d24f, + 0xd836a7bfe396f1ab, + 0x36157b2545cb3129, + 0xb6d1c8f541ac2f85, + 0xcae762465c8f4de1, + 0xfa561bc87d926c5f, + 0xd86391487d846acb, + 0xe1f65caedca78b39, + 0x42bdc5afe67cb9a5, + 0xa64dc731f68ec913, + 0x367481e32591d67f, + 0x3ac65bf32483f5eb, + 0x5a1d28e873b81659, + 0x62ac47f9819a24c5, + 0x1befc42baf9d6543, + 0x639b428bac7e529f, + 0xfba8625fec94821d, + 0xfc2391dfeb748f69, + 0xe6d9a5221a679ed5, + 0x1534bce3287abd53, + 0xa8f19b24345dcbaf, + 0xedc46b398571fa2d, + 0xb7a4f96dc3741b89, + 0x246753adc18729f5, + 0x187ea5bedf6b4973, + 0xd826435fed5b46cf, + 0xe9a5f8b21c5f764d, + 0x6ce57df43d6284b9, + 0xfb438e965c86b427, + 0x854a3d987a68c293, + 0xb461c3298659b1ef, + 0xb4c1a7ea934bcf5d, + 0x1a45f79ed4621fc9, + 0x41ad7c51f1852e37, + 0xa53d476321674da3, + 0xf3e261b54f5a6c21, + 0xb6d7f9354e3c5a7d, + 0x9b4ae6f65b3f68e9, + 0xb475e2fbac42b957, + 0xca3951bed945b7c3, + 0x5b4f827fe859d741, + 0x9d1ab471f53ae49d, + 0x8375fd43265df41b, + 0x764d1caa95612387, + 0x1a4b326a917652e3, + 0x376ebc1baf497261, + 0x12d94fe87c285fad, + 0xd53f1b7a9a3c7e2b, + 0x694d1f8dca2f8d97, + 0xb5d96f8fe842abf3, + 0x469f8d732935db71, + 0xf6a1d8e43526e8cd, + 0xd82e7547652af84b, + 0xabf3248a943e18b7, + 0xf2d5173dc3614825, + 0x6975f8bdcf245691, + 0xa231687cbc1764fd, + 0x1ebd57a1fd1a836b, + 0x59b1c7843b1c92d7, + 0xe3d217976a2fb145, + 0x75fd13c76823cfa1, + 0x17ce4b998725cd1f, + 0xdf16382a9416fd7b, + 0x5a7e382cb42a1ce7, + 0x9aeb475ed31e2c65, + 0x84cd25fcbdef4ac1, + 0xce9748a21de2693f, + 0x639afec32df4679b, + 0xd5679c354cf8a719, + 0xe79128f549fcb685, + 0xf4e53b1987fdb5e1, + 0x9b7efcdba7e1d35f, + 0x61ced98ba5e4f2cb, + 0xc27ba38fe5f81239, + 0xdf54be9324fb31a5, + 0xeba782f652db4ef1, + 0x48f61ec43cbe4d6f, + 0xc63917265ae26cdb, + 0xec485a187be58c49, + 0x54f92abdc8e79ab5, + 0x735e1cbed7ebca23, + 0x38f247bfe4bdc78f, + 0x37c4ab9325c1e6fb, + 0xda17e62435e41769, + 0xc3bf291873e826d5, + 0x4ed157ca91eb4653, + 0x29cb5a887ebc53af, + 0x3f7e6baa9cbf732d, + 0x98f65d4fecd3a189, + 0x79b6ca5ed8b49fe5, + 0xed25f68219c8be63, + 0x17b9ea832598acbf, + 0x2b6f3d15459ceb3d, + 0x5c6df4a875d21ca9, + 0xbf8ed71ba4d53b17, + 0x52a348fdc1d74a83, + 0x7c5df81cbea947df, + 0x7d4c16a1feac675d, + 0x835b9ad21daf75c9, + 0x2fc1b5354dc2b537, + 0xcdbe3a4659b6c4a3, + 0xfe14c62878b9d421, + 0x67ef94a9859ae17d, + 0x3dcba269837befd9, + 0x4386c72ed5b12f47, + 0x367e21c1f1a54eb3, + 0x83e2bda542b86d31, + 0xefab1d532f795b8d, + 0xa2e95c443d7c6af9, + 0x16d528754c8f9a67, + 0x98f345287a92b8d3, + 0x87b96a3dc9a6d851, + 0xd5467abdc487e5ad, + 0x81b54d6fe48af52b, + 0x6e9b4f7325ae1497, + 0x9fe16a2876a154f3, + 0xd83feb7a92b56371, + 0x6d3e1b865f8761cd, + 0x7291cea98d697f3b, + 0x64583efa9b5c8ea7, + 0x2e69f73dc97fad15, + 0x6ec728d1f973dc81, + 0x3f8946721764c9ed, + 0xe1db36732467f95b, + 0xa9de7b36546b19c7, + 0x51eb3c4ba48e2935, + 0x8e67d4bdc39257a1, + 0xa476d51cbe84761f, + 0x71fc4a3ede56847b, + 0x48c1b5a1fc5a93e7, + 0x3afde7621c7db265, + 0x918dc2e5496fb2c1, + 0x28efad765863ce2f, + 0xf85ab2687654fe8b, + 0x5cfb138ba4581df7, + 0x5e19df2dc36b2d75, + 0x3af62d1dc26e4bd1, + 0x68bfa27ede516a4f, + 0xb86da4521f4368ab, + 0xa7bc8e143e46a829, + 0xc29a8ed54d3ab795, + 0x8f3591c8794cb6f1, + 0x168a45fa983ec46f, + 0xd58be41ba752f3db, + 0xd1b4892fe8671349, + 0x387c1a51f46932b5, + 0xa3fec725457c6123, + 0xb9317a26513c4e7f, + 0x2f7b1ae65f316deb, + 0x83ce2a987e238d59, + 0x1e7539498d269bc5, + 0x291b648eda29cb43, + 0x7b18e5aed62bc89f, + 0xfda87b6dc63fe81d, + 0x74fcaeb32a431879, + 0x297a5185483627e5, + 0x8fda5b4a952a4763, + 0x43daf699812a54bf, + 0x71dfb35a9f1e743d, + 0xf876d12dce3182a9, + 0xb89d671fed35b217, + 0x9c6dbf8fea16bf73, + 0x31e7a6b32817adcf, + 0x956f7de4371aec4d, + 0xdc1b8265451efcb9, + 0x14dfeb9ba8143c27, + 0x1ef973adc5164b93, + 0xd38eaf5cb21748ef, + 0x27c4ae6cbefa586d, + 0x4b3d85cfebfc76d9, + 0x9c6f5ed21cefa647, + 0x9eb76a854af2c5b3, + 0xafce9d276af7d531, + 0x863ec19656f7e28d, + 0x3c1e49d875dae1f9, + 0xa95431ccb5fe2167, + 0x9e328facb5e14fc3, + 0xae2b917ed2f56e41, + 0x7abec16321f65c9d, + 0x84297e643fe97c1b, + 0x6f7adeb43ced9b87, + 0xfabd374658cfa9e3, + 0xd2964a598ae3d961, + 0xae6f247a97c4e6bd, + 0xfad7e13dc5d8f63b, + 0x13b57a91f4ec15a7, + 0x8531d74327de3615, + 0xfb348ce875e26481, + 0xb49a61c871c462ed, + 0xb18ec4976fd7815b, + 0x34dc6e765dc98fb7, + 0xeb6573f989bcae25, + 0xe173b94dc7afbd91, + 0x5619a37fe692cafd, + 0x4378b95217c4fa6b, + 0xaed27f4435c81ad7, + 0x83ead2f876dc2a45, + 0xfde23a6873ce48b1, + 0xcb3d819ba3c1672f, + 0x8673ebfbafc3758b, + 0x14b9e27dcdb694f7, + 0x3d25ac71fdcab375, + 0x6d8954f32a9cb3d1, + 0xd615f7c4389ec14f, + 0x2dc89bf54682ef9b, + 0x2e9a76f987b62f19, + 0x874bce6ba4b92e85, + 0x79fa26ecb39a4ce1, + 0x3fa4beddc19d4b5f, + 0x317cab2fef8169cb, + 0x7b2d8a321fb48a39, + 0x374895d32e96b8a5, + 0xf19bd7865d9ac813, + 0x253b8a75498bc57f, + 0xa63cd759867fd4eb, + 0x678a2e3ed8b31459, + 0x4d6f871fe6a723c5, + 0x43e6a781f5ba6243, + 0x5e9b8343238b519f, + 0x49e67c24317c5efb, + 0x7bad62f54f718e69, + 0xb13a54876e739cd5, + 0xa468b53a9d87bc53, + 0x56ac971cb857c9af, + 0x319587fdc76be92d, + 0xfc1ab97ed45ef789, + 0x8c9d5342179328f5, + 0x1df7a8b325a64873, + 0x819b7ae7627845cf, + 0x87e3d61a918b754d, + 0xa32cd1e98f5e73b9, + 0xf6b5149dce81b327, + 0xc3d7529fed75c193, + 0x38a9bd2dc845aedf, + 0xa78c56921948ce5d, + 0x8f14e793264afdc9, + 0x7a823ce6586f1d37, + 0xdc21aefa96724ca3, + 0x697a3b4dc4876b21, + 0xd6fa128dc148597d, + 0x7a21645dcf3b67e9, + 0x3d52bac1fd3ea857, + 0x6b937cd32e51b6c3, + 0xe975d6843c75d641, + 0x16fe92365a46e39d, + 0x914d26887859f31b, + 0x8e3427dcb95d1287, + 0x4893cefcb76f41e3, + 0x47b923eed4736f51, + 0xbc296ea1f1345ead, + 0x97af51b431487d2b, + 0xce41f7843f2b8c97, + 0xa1b73ec65c2d9af3, + 0x3452fbd98c42da71, + 0xa5973c298923e7cd, + 0x3d7a819dc926f74b, + 0x574cdb9fe83a16b7, + 0x72349b51f84d3725, + 0xbc1375d3273f4591, + 0xafc21698754263fd, + 0x6c851fba9135826b, + 0x9e8374576f2891d7, + 0x24b6ed798d1baf35, + 0x963cfe19892dbea1, + 0xa15e29dcb932dc1f, + 0x3ca14dbfe813fc7b, + 0x6a1597b439261be7, + 0x52e79315481a2b65, + 0xaf1b28e8762d49c1, + 0xed53628a941e583f, + 0xebd7891dc312769b, + 0xfa5e16dcbef4a619, + 0x9e1b5f3dcdf7b485, + 0x1ec2843edaf9b4e1, + 0xcd85694219ebc25f, + 0x15f2a49437dfe1cb, + 0x2845ce387af52139, + 0xf2d39a1987e62f95, + 0x1cf7845a95e84df1, + 0xce62534a92ea4c6f, + 0xb23f56aa91fe5adb, + 0x78c369fedfe18b49, + 0x54da8e621fe3a9b5, + 0x3256c8a54de7c923, + 0xfc5718243ad9c68f, + 0xfb89376547cad5fb, + 0x461c9b3987cef469, + 0xe837645cb8e324d5, + 0x1fc9348ed7e86453, + 0x28435cdfe3d852af, + 0xe9d6178434eb712d, + 0x497fdac431cd6f79, + 0x2681c5b54fb19de5, + 0x83d1c9587ec4bd63, + 0x93c47a276895cabf, + 0xbd2ae56a97b8ea3d, + 0x549cea7ed5bcf8a9, + 0x4a89367fe6cf2a17, + 0xac78942217d24983, + 0x7eba418323b546df, + 0x281d9e7542c9765d, + 0x1f857c9761db74c9, + 0xd9c41fe98fbea437, + 0xd8e2a4fa9eb1c2a3, + 0x6df4753fecb6d321, + 0xb328a7cfe895cf6d, + 0xf7ed23821687fed9, + 0xe4269da438ac1e47, + 0xd89c2fe6569f2db3, + 0x27fac4ba97b46c31, + 0x264f7eba92b45a8d, + 0xbfda145dc1b768f9, + 0xaef6812edf8ca967, + 0xd2b967c1fc8ea7d3, + 0x46cb7ef43ea2d751, + 0xe518b4c32b83e4ad, + 0xc98716b65a97f42b, + 0x4e7dc5f768ab1397, + 0x4c8e351ba79c42f3, + 0x5adf197dc6af5271, + 0xf791653dc3825fbd, + 0xcbe91321f1957e3b, + 0xefba386321968da7, + 0x184e2dc43f7bac15, + 0xdb7e3ca54d6ecb81, + 0xe9dfc7665a61c8ed, + 0xc457e38a9a73f85b, + 0x3694af1eda9618c7, + 0x54a16c3fe79b2835, + 0xad328b71f58d46a1, + 0xd34761c3248e651f, + 0xac2de1465492837b, + 0x7485fc17618592e7, + 0x357ace198f79b165, + 0xdefb43687d59afb1, + 0xa62f9e19895cbd2f, + 0x3a17ef9dc951fd8b, + 0x1c8f952fe9641cf7, + 0xf6ac4d921a682c75, + 0xbf7ac46437694ad1, + 0xc86edf98736c594f, + 0xbfd23ce9824f57ab, + 0xd3ba589dc163a729, + 0x23d5a7edcf34b695, + 0x51789b3dcd48b5f1, + 0x2a897f4feb4ac36f, + 0x3fe52782194ce2db, + 0x847251976c731249, + 0xab4637d98a7631b5, + 0xbc138dfba9685f13, + 0x1f47c82ba5394d7f, + 0x81a32d6a923a5ceb, + 0x96c258eed13f7c59, + 0xdb74c13fef329ac5, + 0x57fea3921f26ca43, + 0xc25879e43d26c79f, + 0x42cfed865b3ae71d, + 0x41295cf76a2df579, + 0xefa2869cba4126e5, + 0xf2a89c5eda274563, + 0xa8e3b24ed62753bf, + 0x2c97de81f54a723d, + 0x5deb8f63243d71a9, + 0x8a32de75412d8ef5, + 0x59b8a4e76f12be73, + 0xda8f42576d14abcf, + 0xefd167998a17eb4d, + 0x7b983a2dc718fab9, + 0x9b627e4ed93e1b27, + 0x482b5d61f8214a93, + 0x48651b93281347ef, + 0x7afd68943418576d, + 0xe21fc9b7631a75d9, + 0x385e7baa921da547, + 0x34ce8a187dfea4b3, + 0x78945fbbacf2d431, + 0x419ecf2cbaf4e18d, + 0x65c7f29cb7c5dfe9, + 0x17d59c3329ea1f57, + 0x729c6e5547fb2ec3, + 0x9f4be8a767ef5d41, + 0xec942b6874f25b9d, + 0x86352a4a93f57a1b, + 0x59bf61adc1f69a87, + 0x4ed3c8fa9fdba8e3, + 0x58d21c91fbdec861, + 0x5fab73c32ac1e5bd, + 0x6cde84b32ad4f53b, + 0x796b3e465be814a7, + 0x37cfb45989eb3415, + 0x5138cd7ba7ed5381, + 0x54db276a94bf51ed, + 0x84971fedc3d27f4b, + 0x89d46731f1d48eb7, + 0xaf91672431e8ad25, + 0x1f8769a43fdabc91, + 0xd269fe143a8cb9fd, + 0x386eb4265ac1f96b, + 0xf69ce1b98ac419d7, + 0x4b69dfadcad82945, + 0x6fc73b8fe6da47b1, + 0x57d1ca6fe4bc562f, + 0xf93b548213cf648b, + 0xa6f3291654c293f7, + 0x2561f4c981d6b275, + 0xc4fe5ad76fa8b2d1, + 0x8ab1f3276c89be3f, + 0xa8fc3d27687cde9b, + 0xc28ef6bedab32e19, + 0x15479ea1f9b42d85, + 0x891357a328a74be1, + 0xb7d15f3326b94a5f, + 0x89e5f375439d58cb, + 0x23a41f7762bf7839, + 0x4a72d53a91c2b7a5, + 0xe925df8cbfa6c713, + 0x76eca94cbd98c47f, + 0xe8d1c621fa79d3eb, + 0x8e7c4f621b8df259, + 0x3b5f28e76ba132c5, + 0x2b6931e98ab76143, + 0x5134d28875964e8f, + 0xd6afe71a93785dfb, + 0x85cd316cb28c7d69, + 0xfda1b2edc17f8bd5, + 0x4bca5d1fef82cb53, + 0x2f5476821e64c8af, + 0xdc7846a43c67e82d, + 0xc2ab15743c5bf689, + 0x92d14ac76a8d17f5, + 0xfd15be9dcba14673, + 0x7a129e8cb78354cf, + 0xda67813fe598734d, + 0x2743da51f36a72b9, + 0x678eb2c4348da127, + 0xda9587e5416eaf83, + 0xc16a52f54e52acdf, + 0xd59e8ca87b64ec5d, + 0x54c638d87a46fbc9, + 0xc5314f9eda6b1c37, + 0xfb59637ed86e2ba3, + 0x7d42cb31f9836a21, + 0x736bcea21963587d, + 0xdb856393234576e9, + 0xc2a975e9824ba657, + 0xa261f979816da5c3, + 0x1c35f24a9e6fc541, + 0x2743f56bac53e29d, + 0x1af3c46edc56f21b, + 0xa6c59711fc5a2187, + 0xce73a4f2195a2fd3, + 0x16a9fed4396d4e51, + 0xe7b8a5f767415cad, + 0x34bc87ea96547c2b, + 0x7a4ed32dc2358b97, + 0xa6b59d2dc148a9f3, + 0xa9516e3cbf3dc971, + 0xc84fa37fea2fb6cd, + 0xe735f6a21d32f64b, + 0x792eab554d3615b7, + 0x6249dfc98c4a3625, + 0xbde971498a3c5491, + 0x5bd3f46a973c52fd, + 0x3f629b5ed742816b, + 0x5872b4fed4238fc7, + 0xb476a951f127ae35, + 0xd5f7ca654238bda1, + 0x2b3ec7654e2acb1f, + 0x68153f754c1fea7b, + 0xbc74f3998c231ae7, + 0xe8c514fcbc172a65, + 0xf7c48beeda2948c1, + 0x2b5438aed81b573f, + 0x4ce87921f41e659b, + 0x5ae82cf54732a519, + 0xd23a6fb87614b385, + 0x3b14e5998427b3e1, + 0x1d73bac76de8c15f, + 0x82ec6af659e8dfab, + 0xe2a6835878dcfe29, + 0x275d46edcaf12e95, + 0x396cfaeed8e54cf1, + 0x7f6cad5218e74b6f, + 0xdea9f51324f859db, + 0xc8bf437653fd7a49, + 0xc312af7762ef98b5, + 0x932def5ba1f4c823, + 0x4fe57a8a9ed4c58f, + 0xc57ad4ea9ac7d4fb, + 0x856f971feadbf369, + 0x1c5984732ace13d5, + 0xfa1ec5387be16253, + 0x4783ed2768d451af, + 0xf3dcea4985c76f1d, + 0x6d195eb983da6e79, + 0x684d71ea92db8ce5, + 0x42d7f63cb1dfac63, + 0xc98e367edea2c9bf, + 0xdea2c5721fb5e93d, + 0x5f4867d32dc6f7a9, + 0x721ac3d65bdc2917, + 0x95ec3bf76ace2783, + 0xa8d23c7a98b145df, + 0xf5ad324cb8c3745d, + 0xb74c1dffe4d673c9, + 0xd25ea141f4dba237, + 0xc4d8763324cdb1a3, + 0x51abc284318c9def, + 0x8cb6e7a54f92ce6d, + 0x92bde3665b84fcd9, + 0xcdef5ab98cb91d47, + 0x84bf361ed89a2cb3, + 0x3af2bc6ed8ae5b31, + 0xbc763411f6b1598d, + 0x7f852bc215b367f9, + 0x49cfb61323c5a867, + 0xfe489cd652b9a6d3, + 0xbde7c91982adc651, + 0xfc89ad276e7fc3ad, + 0x96f3ebdbad94f32b, + 0xc9846abfedb61297, + 0xa523871feba941f3, + 0x4639f5132a9b4f61, + 0xfae8bd33267c4ebd, + 0xe96b7d1656917d3b, + 0xd54e9ab764938ca7, + 0x5df328adc397ab15, + 0x2c9afe4ed279ca81, + 0xa6c3bf2a9f5ab7ed, + 0x72b36a4edc6fe75b, + 0xe43671d32e9316c7, + 0x83d952a54da82735, + 0x49b8d2f76c8945a1, + 0x62b5aed8798b641f, + 0x9c1d23fba58e627b, + 0xfead64bdc58291e7, + 0xb2c4871ed283af45, + 0x63197cb1f276aeb1, + 0x5bc4af243168bc2f, + 0xb9a843132f4aec8b, + 0x4a6f5d943b4deaf7, + 0xfd653b7a9d832b75, + 0x17e2fc6bab7649d1, + 0x64a2f71dca69584f, + 0x8d57b29fe74c56ab, + 0x8e1a2541f45e8629, + 0x5f7e6c132671b495, + 0x78cb39276375b4f1, + 0x7dbce3498157c26f, + 0x5e8d2c776f48e1db, + 0x6d342ca87c4bef39, + 0x715efbda9b4e1fa5, + 0xb2856ecedb745e13, + 0x9ba6cdffe9354c7f, + 0x623fc9e218375aeb, + 0x8c3416b3263c7b59, + 0x87da4517643e89c5, + 0x3e186c7ba561c943, + 0x8fcdb17ba143c69f, + 0x49fbe38baf37e61d, + 0x2537e48dcd2af479, + 0x628d7451fb3c14e5, + 0x684daf221c5f2463, + 0xd5f4b8376a4352bf, + 0x3dba12998a46713d, + 0x9eb43cfba5276f89, + 0xf715246a942a8df5, + 0xfd786a4cb42ead73, + 0x3fce496ed231bacf, + 0x13e4895dcf13ea4d, + 0xe96fc4332e15f8b9, + 0xf87ea9b65e3b1a27, + 0xd7f1c4976c1d2893, + 0x8a946dc8791d36ef, + 0x26f8e54cba12756d, + 0x6d12958dc81574d9, + 0xa5c1b7dfe619a347, + 0x971d4b21f51ca2b3, + 0xdfa89366564ec231, + 0x47cbaf165321cf7d, + 0x8b7ae1d54bc2fde9, + 0x24edfc798cf61e57, + 0x2ed6a9b87af82dc3, + 0x7863f51ba9fb5c41, + 0x91ad283cb6fe4a9d, + 0x7569bf1fe6f2791b, + 0xd6e3482215f3a987, + 0xbe65371324f6a7e3, + 0x4b6fa17653fac761, + 0xbd3c47a761fac4bd, + 0xc5231b987dcfe43b, + 0xd2a4e1fcbde413a7, + 0x823ba69edce84315, + 0x19782ba1fbea5281, + 0xd96bfa8217b94fcd, + 0x34675df327cd6e4b, + 0xcb6a259545e18db7, + 0x3b1ad6e986e4ac25, + 0xc36db79983e6cb91, + 0x71c52a4a91c7b8fd, + 0xb86ac35a9face86b, + 0x7a6298fdcbaef6d7, + 0x84976a321ed32845, + 0x4d8cf5943cd746b1, + 0xb86953a54ac9652f, + 0x7cbe8a1657dc638b, + 0xb658c32a95bd82f7, + 0x267bedadc6d2b175, + 0xf67241eed3b4afc1, + 0xa1d5c94fe1a6bd3f, + 0x179fa3c321a7ed9b, + 0x81e2b9543e8bfc19, + 0xc9f5bd854daf1c85, + 0x4b3ef8c87cb34ae1, + 0xd3c69a298ab6495f, + 0x846c1abed6a857cb, + 0xc9b6a5dfe5bc8739, + 0xe86751a1f3be96a5, + 0xca81b53547b2c613, + 0xebd1437652a4c37f, + 0x71ad98665196d2eb, + 0x52137d976e8af159, + 0x17ae49698e9d21c5, + 0xfd614b2bab9e4f23, + 0xa18563fdca924d8f, + 0xa1975d2fe7845cfb, + 0x73be2f6215a87c69, + 0x3146e5d3247b8ad5, + 0xaf1b7297648eba53, + 0x43bafde76381c7af, + 0x51c2d43ba194e72d, + 0x54218fccbe76f589, + 0x6eb1879dcd8a16f5, + 0xc8a5d361fc9d2573, + 0x45ab7c921a7e43cf, + 0x16d4b8f65b93724d, + 0x68efd5b54a8571b9, + 0x4e9b8d5ba5689f17, + 0x673b4fca946bae83, + 0x4c3f92a9825c9bdf, + 0x71b25d9dc271eb5d, + 0x8e4a5c2ede53fac9, + 0xab7631932f681b37, + 0xd76fba854e6b29a3, + 0xf3b74a976c7d5921, + 0xefbd17c98a5f467d, + 0x2618d35cba6275e9, + 0xf4e5128ed986a457, + 0x2dca51bfe568a4c3, + 0xb4ed83c1f57bc341, + 0x69ca3b43235ec19d, + 0xcdab38e54251def9, + 0x9a2be6198e541f67, + 0x63f2ce798c572ed3, + 0x61eda23a9c6a4d51, + 0xe736a84a983c4bad, + 0x69e52b4ed84f6a2b, + 0x2a8c9eb1f6428a97, + 0xb3ae87921745a8f3, + 0xb27c6e943549c871, + 0x831b5cd76239b5cd, + 0x495cb139813de54b, + 0xc971b2fbaf5214b7, + 0x254bd17dce673425, + 0xf15a926fed485391, + 0xdf12ab3fea3951fd, + 0xdbf3ac42192c6f5b, + 0x6718cd24382f6ec7, + 0x1ca265387842ad35, + 0xfbe239698635bca1, + 0xd571be2a9437ca1f, + 0x4395dafdc12ae97b, + 0xd4bef81bad1cf8e7, + 0x3aec1d71fe312965, + 0x768f4e543e2547c1, + 0xf1d3c5654c18563f, + 0xcf9b17265c1a649b, + 0x38a45f987a2d8419, + 0xa847ef5cb71fa285, + 0xb547d6fdc734b2e1, + 0x265e93bdc315be4f, + 0x7695e381f216deab, + 0xf596ad35431afd29, + 0xc96e48d43efc1d95, + 0x712fc4d65ade3bf1, + 0x21b3a9887be24a6f, + 0xfd49b26879f458db, + 0xa78d436dc6fa7849, + 0xcf5a134ed4fc97b5, + 0x218ac96ed5feb723, + 0x84acd75325e1c48f, + 0xdea34b8652e4d3fb, + 0x2b6dfa1651e7f269, + 0xaf13c4887fea12d5, + 0x6f273c1a9ced4153, + 0xdac9486878bd3e9f, + 0x1c7296acb9c36e1d, + 0x2da13eb1f8e46d79, + 0xcad3b7f216d78be5, + 0xf46d3ea325ecab63, + 0x3fd1b95543cda8bf, + 0x1548fba874c1e83d, + 0xbaf97c5981d3f6a9, + 0x6a12893cbfd92817, + 0x7b39d84dcedb2683, + 0x5c69fb1fe9ab34df, + 0xd9ab56f21abf635d, + 0x31e2f5a54ad372c9, + 0xb8cd27e659d6a137, + 0x4238f9d765c7af93, + 0xacbf58e763a89cef, + 0x647eb9f9829ebc6d, + 0x54abe2ddc2a1fbd9, + 0x1692cbafefb51c47, + 0x926c7fa21fc72ab3, + 0x936b18254ecb5a31, + 0x12ab87e43bac478d, + 0x58a6937548ae56f9, + 0xdfe1428cb9c2a567, + 0x13fad89dc7b6a5d3, + 0x51df2c4fe6b9c451, + 0x3c269ed1f389c2ad, + 0x9426c7d4349de12b, + 0x4c15879764c32197, + 0xc218f4e76d952fe3, + 0x8a54be387da84e61, + 0xbfd987576a784cbd, + 0xc7bd512ba98d6c3b, + 0x6cfba95ed58f6ba7, + 0xe21957c1f793ba15, + 0xb96ad57326a5c981, + 0xa15ef4b32387b6ed, + 0x72d39b15428ae65b, + 0x589347b7618df4c7, + 0x1d8af34cbfa12635, + 0x8a37eb6dce9654a1, + 0x3f4e612edc98631f, + 0xab534c91fc8a617b, + 0x5d4ce972195b6fd7, + 0x63d159e3287f9e45, + 0x8b6fc9365673adb1, + 0xd691eaf98475cb2f, + 0x43ad6e1a9256ea8b, + 0xda576e9cb15ae9f7, + 0x61b58f2dcf6e1a75, + 0x72b49d31fe7248d1, + 0x42dfc6721d83574f, + 0xcab8d3632d4765ab, + 0xf5a692154c6b8529, + 0x38abc5d8786da395, + 0xea8bfd2a976ea3f1, + 0x1dcae58cb573c16f, + 0x859e736ba254dfcb, + 0xec354f6ed157fe39, + 0x4b6af924326b1ea5, + 0x8b9fec365f6e4d13, + 0xc91f8a476d514b7f, + 0x25d1bac87c4359eb, + 0xd564c8acbc367a59, + 0xf15a397ed73a98c5, + 0x82d73fafe75db843, + 0x5c8f214ed43eb59f, + 0xe789fc132763e51d, + 0x95421f876245f379, + 0xd96cb329826913e5, + 0xc65e241a9f5c4263, + 0xf5c364998c3d41bf, + 0xce89352bab416f2d, + 0x9be87f4edb236e89, + 0x1235ba9fe9268cf5, + 0xe6c3a2b21829ac73, + 0x7d45cf94352ba9cf, + 0x8b54ad97652fc94d, + 0x61bfdac98432f7b9, + 0x83f4eb1dc3461927, + 0x7395a14dcf1a2793, + 0xc32f567cbc1a35ef, + 0xdb9c5211fb1e546d, + 0xb167f8c54c2173d9, + 0xf34219876c15a247, + 0xf7d42c576927a1b3, + 0xef64d5b98739bf21, + 0xd41ceb99841abe7d, + 0x795e6d29831fdce9, + 0xbdf9735fe4231d57, + 0x59c87f4edef52bc3, + 0xa74f89332ef85b41, + 0x9487ce532cfa489d, + 0x38fbcd154afd681b, + 0xbda62c854aef9687, + 0xd28bf43a98f2a6e3, + 0xc1a9e26cb8f7c561, + 0x615fe7bba4f7c3bd, + 0x7a6f253ed4fae23b, + 0x9a17e3b323edf1a7, + 0xe2b9154986f34215, + 0x1c4b72876ed54f71, + 0x1dba3ec65ab64ecd, + 0x864d53b87ae96d4b, + 0xadeb716a98ed6cb7, + 0x2df5a4edc7df9b25, + 0x2c1b5631f6e3ca91, + 0x54f876e215c4b7fd, + 0x1f8943e323d8e76b, + 0x26a93eb542caf5d7, + 0x231dc68a92de1745, + 0xb3a758fa9fd245b1, + 0x1483b52badc5642f, + 0x6f7d548fecd7628b, + 0x548263afe9ca81f7, + 0x3c6978d218bc9f65, + 0xb29ade1436af9ec1, + 0xd79bf61656a2bc3f, + 0x5427ca9763a4ec9b, + 0xc3b96f1983c7fb19, + 0x47b8c3eba2dc1b85, + 0xc432fd7cbfad39e1, + 0x54f3b6dfedb1485f, + 0x8df7ca621ea356cb, + 0x756f1d332dc78639, + 0xf9b6281438cb94a5, + 0x5b2acd6878adb513, + 0x6fe3cad9859eb27f, + 0xd531e4bba593d1eb, + 0x51267eadc2a5ef49, + 0x234761cfe2a81fb5, + 0xba2179c651ab4e23, + 0x841acf732e7d3c8f, + 0x7c6faeb54d815afb, + 0xcb1698d65da37b69, + 0x59c3a8e87ba689d5, + 0x1c867a9ed78ab953, + 0x3fb28ceed47cb6af, + 0xb13c752fe48fc62d, + 0x72cb4fd215a2f489, + 0xd7b9af2763a714f5, + 0xd14ef62981ba2473, + 0xe42a3b176e7a42cf, + 0x174d5efa9c8e614d, + 0x1c2fa47cbc716fa9, + 0x7b926c4edb849e17, + 0x13758c41f976ad83, + 0xc8d5964216579adf, + 0xecf968a3246bca5d, + 0xeb2cf975435fe8c9, + 0x9d2c567cb5941a37, + 0xd74a6e1dc19628a3, + 0xae2617bdcf7a5821, + 0xe379b2ddce6b457d, + 0x98ab4371fb5d64e9, + 0x5917fc332d81a357, + 0x3eb752f54b75a2c3, + 0x5f72ce376a78c241, + 0x27e458b76547bf8d, + 0xa83b2648734acdf9, + 0x61e487cba24efd67, + 0x2d9c4f6fe1742cd3, + 0x3d15b89fef674c51, + 0xebac92d21f3749ad, + 0x271e6c843e4c692b, + 0x7218dba54c3e6897, + 0xe4f73b198b51a7f3, + 0x3da846fcba54c671, + 0xe986241ba736b4cd, + 0x4fbca96ed659e34b, + 0x63a854ffe34cf2b7, + 0xfa1927b5467f1325, + 0x6f32c51983745291, + 0xd7345c876c254fed, + 0x1825dc687d286e5b, + 0x73e51b298b2a6dc7, + 0xf635cd1cba2e9c35, + 0x968acd7fe842cba1, + 0xc346fdbfe734c91f, + 0x48d9b7621625e87b, + 0x29cd7b843429f6e7, + 0xd2fa716a943d1865, + 0x32c48aea924f36c1, + 0x4ef5cdbbae12653f, + 0xa143f56dce15639b, + 0x8c1f9dbfed2a8319, + 0xd5496211fb2ca185, + 0x985b1644382c9fd1, + 0xe3694a765821bd4f, + 0xb9ac61e65613edab, + 0xac2671b98516fc29, + 0x7ef49d3cb42a1c95, + 0xd8459c2cb42c3af1, + 0xd2bc3e9baced396f, + 0x3c542dffecf157db, + 0x95c8e4b21df38749, + 0xf938c6b32cf796b5, + 0xa9c4837659fab623, + 0xb641ec8656ecb38f, + 0x284ba36875dec2fb, + 0xd2ca657cb5e3f169, + 0x8b1a467dc4f721d5, + 0x42cfb6aed1e92f43, + 0xb176489321ea3d9f, + 0x485b21743fbe5c1d, + 0x5e68bdc54de16c79, + 0xa2be7c976bd38ae5, + 0xfda1637989e7ba63, + 0x5f3c74ea95d8a7bf, + 0x1e248fcba5ebc73d, + 0x9275cebed3cfe5a9, + 0x794ba85438e42617, + 0xd52b917764e72583, + 0xe81c92b761c843df, + 0xb8c26f387fcb625d, + 0x42ced3987dbe61c9, + 0x46371debabc19f27, + 0x4b82c39ed8c4ae93, + 0xa25ec63ed6a59bef, + 0x68cb37e215a8cb6d, + 0xadfe7c13248bead9, + 0x13fedca653befa47, + 0x425c1fa985d429b3, + 0xce4f968cb2d75931, + 0x8fe9245bafb9468d, + 0xd6b9718dcdab65f9, + 0xb8ae49c1fcbe9467, + 0xf6ae31532cb1a4d3, + 0x7c2af6e54ab6c351, + 0x1ebf6c854796c1ad, + 0x951e8b776598df1b, + 0x7bafd357639bfe87, + 0x84e657cba49f1de3, + 0x4d91f6afe2b34d61, + 0xa138725fef854abd, + 0x7e5cb4221f986a3b, + 0x87abd3132e8c69a7, + 0xdcfe53754c8ea915, + 0x1d47ef976ba2c781, + 0xcb2f4ada9783b5ed, + 0x1aeb37fdc697e45b, + 0x85e2614ed489f3c7, + 0xc794d251f6ad1435, + 0xd93ae583259f43a1, + 0xa9d263b873a4621f, + 0xcb26e4a43e845f6b, + 0xa31fbe554c586ed7, + 0xb9d214798c7b9d45, + 0xeb9d765ba86e9cb1, + 0x734be96ed871ca2f, + 0x6cb497d1f563e98b, + 0x2d4a35921465e8f7, + 0xd76efa54348b1975, + 0xb1283c97648c37d1, + 0xbf3a15ea918e364f, + 0xf813d62a9f7264ab, + 0xb2f6a84dce768429, + 0x27cfd39fed68a295, + 0x235179ffe96ba2f1, + 0x5cf947e2184cae5f, + 0xe8a47c543751decb, + 0x7a128ed65764fd39, + 0x8ec61f4a94671da5, + 0x6951d7acb57a4c13, + 0x946fd3ccb15c3a7f, + 0xc65e4bdbad3f48eb, + 0x149a62b1fe427859, + 0xcb9e7af21e3497c5, + 0x3759a1f32d59b743, + 0x2db9e3c6583ab49f, + 0xc93a62f8785ec41d, + 0xcfd9248cb851f279, + 0xd7bf8a1dc87612e5, + 0x1a56cdffe5794163, + 0x9e6834fed1483eaf, + 0xa4896e74314b5e2d, + 0x7f6d14843e2f5d89, + 0xcf2793876d328bf5, + 0x6db531998d25ab73, + 0x685b4f387926a8cf, + 0x5971ca4cb72ac84d, + 0xdbe7a93dc52de6b9, + 0xca3b4861f9531827, + 0x829cd5b218452693, + 0xae4cd317652734ef, + 0x56ecf7b9812a536d, + 0xa1264bd87f1c62d9, + 0x368efb5bad2f9147, + 0x458daf2cbc129fa3, + 0x4378cb2eda36be21, + 0x2b8e9751f816bc7d, + 0xd7c3b4832618dbe9, + 0x5d19f684361dfb57, + 0xa31b9fe987412ac3, + 0xa7648c1cb7265a41, + 0xf5872d1cb216479d, + 0x53978cdbaef9671b, + 0x62a1e73cbdfc9587, + 0x4a5d8e9dcafd95e3, + 0xf9d172a43bf2c461, + 0x81da7bc438f4c2bd, + 0x18b27d4658f7e13b, + 0xdfa1b36654d8ef97, + 0xb51c974985db1ef3, + 0x3b529fcba4df3e71, + 0x1dec589ba1f24bcd, + 0xce1f6b2edfe56c4b, + 0x5a3def221fe86ab7, + 0xe47d8f243dec9a25, + 0x5c6db2954adeb891, + 0x21ae3b6658c1b6fd, + 0x1dc8e36a98d3e56b, + 0x3472d91ba5c6f4d7, + 0x2c86b59ed7eb1645, + 0xdc397e51f5ed34b1, + 0xd369ae7214ce532f, + 0x4af6edc652e3618b, + 0x51fed2c43db46fe7, + 0x139d8fe54dc89e65, + 0xbeda928768ba9dc1, + 0x64b5ca99879dab3f, + 0xaf26153ed6c1ea9b, + 0x5d468acfe6c4fa19, + 0x8ef491a326d71a85, + 0xf87c25b545ca38e1, + 0xa24b9c8762bc375f, + 0x1b95463871af45cb, + 0x8924f73bafc28539, + 0x8e23a54cbec693a5, + 0x75fa3d4fedc9b413, + 0x564387afe89ab17f, + 0xab286472167cafdb, + 0x1d5a869437a1fe49, + 0xe3cda89767a41eb5, + 0xac24318a96b84d23, + 0xad492e5872a93b8f, + 0x2e8c435ba18c49fb, + 0x4a7698fdce8f5a69, + 0x49b62a31fea298d5, + 0xa29fbe821ea6b853, + 0xeab5c6d32c87b5af, + 0xf3d98eb5498ac52d, + 0x623abc96567de389, + 0x3df15a7cb8a213f5, + 0x1c95384ed8b64273, + 0x76e982bed39741cf, + 0x9537b8dfe1895f3d, + 0xc98d3743217c5ea9, + 0xbae5d2c43e6f8d17, + 0x4a69df265e72ac83, + 0xe7fa49865b64a9df, + 0x2c754b398a67c95d, + 0xce97264cb65ae7c9, + 0x72d4af1dc56df837, + 0xd324b791f69127a3, + 0xb17dfc5438a65721, + 0xb18c95743298547d, + 0x4a1f3276517a63e9, + 0xed76fc398f6d9257, + 0xb9ed61f98d6f91c3, + 0xbc981d3bac74bf31, + 0x4bf571edc954be8d, + 0x925af76fe746dcf9, + 0xd73865c2184afc67, + 0xf2e871b5476e1bd3, + 0x724c31ea97824b51, + 0xbf3cd5ea926348ad, + 0x379d468dc157682b, + 0xd2859b4dcf3b8697, + 0x81a5692cbd4c96f3, + 0x126b597fec4fb571, + 0xba429e821a52b3cd, + 0x8adcef443a56e24b, + 0xbd724ec65948f1b7, + 0x8dc21e4ba97c3125, + 0xef6b91dba65d3f81, + 0x5c8d632ba3514ced, + 0x6dba895fe1436d5b, + 0x85c7a94fef256bc7, + 0xda59c4f21f2a9b35, + 0x61795f254e3db9a1, + 0x8d364c965a3eb81f, + 0xd65713b98a32e67b, + 0x634bd1cba924f5e7, + 0xf3e8129ed93a1765, + 0x598ac67fe74b35c1, + 0xf21dcb8fe62d543f, + 0x5adcb1843541629b, + 0x83a54d9873458219, + 0x51b6c7e54e169f75, + 0x473f1a976c289ed1, + 0x5861e2d8791bac4f, + 0xfe3b5619871fdcab, + 0xbc32481ed813fb29, + 0x968e27c1f8261b95, + 0xd5bafc65472839f1, + 0x1bdfa565451b386f, + 0x86dcfab8731e46db, + 0xc6175d3cb3218649, + 0x2d764f198ef294b5, + 0x948b1d3badf7b523, + 0x71a3568dcae7b28f, + 0x97b26e8ed7e9c1fb, + 0x62ec3d5217ecdf59, + 0x8fdb67e548e21fc5, + 0x532f8cb878f62e43, + 0xbea28dc874e63c9f, + 0xb75f36c983f95b1d, + 0x2e31f96ba1fd5b79, + 0x6f7bd13badcf79e5, + 0xba32e671fde2b963, + 0xa8294ed21cd4a6bf, + 0xe539a6d32ae8c63d, + 0x8fceb67437dbe4a9, + 0xbc21f4d768cdf417, + 0x14fce89cb9e12483, + 0x5ecd391ba6c542df, + 0x3f8e2a4dc3e8615d, + 0x651b279fe1d85fb9, + 0xda18e6b431dc8e27, + 0x956d4fb32ebf8d93, + 0xd15b62c54cb29aef, + 0xb92da3f659b4ca6d, + 0xce692f8657b6e8d9, + 0xe174569ba6cbf947, + 0x1bc2a96ed6ce18b3, + 0x36cd2141f7d25831, + 0xdae5479216c3458d, + 0x1dcb9e5432c764f9, + 0x9a7b2c6651db9367, + 0x25473f976fac92d3, + 0xb49571f98dafb251, + 0x9ec13bf87a82bf9d, + 0x6492371dc895de1b, + 0x53c2ab1fe5a6fd87, + 0xa6b45193279a1ce3, + 0x67a5e3f547ae3c61, + 0xabd819c765a149bd, + 0x51da762982c4693b, + 0x4d1fe9acb1c568a7, + 0xbfa8372dcf9ba815, + 0xe3d7f81dce9db681, + 0x1eb5692dc97fa4ed, + 0x7523ac421c92e35b, + 0x92a54e843a95f2c7, + 0x9ca2813879ba1235, + 0xe2915ab9879c42a1, + 0x3bc9ae69847b3efd, + 0xe62d75fdc3915e6b, + 0xb6489affe1936cd7, + 0xb643571fef879c45, + 0x68c719d32f689ab1, + 0x598de7643d6cb92f, + 0x5c4791243a5fd78b, + 0xe8c7b9165a82e6f7, + 0x2394ef8dcba61875, + 0x28fe547dc78936d1, + 0xe739b5ced68b354f, + 0x26349de1f27e53ab, + 0xcf72581545a18329, + 0x59e8d2c76284a195, + 0x875d9b354d569fe1, + 0x34fb5ea76c48ad5f, + 0x34f795b76849adcb, + 0x5f3cb48ba85fec39, + 0x2b37c4ffe9731ca5, + 0xe863bda1f9874b13, + 0x3bc9ed421658397f, + 0xf19de573235a47eb, + 0x4ba2fc19824e6759, + 0xc27d8e4ba27196c5, + 0x65329cfbaf75b643, + 0x51b3f6cbad46b39f, + 0x68dc714feb59c31d, + 0x489d6271fa4ce179, + 0xac8dfb72183cefd5, + 0x9b87de176a742f53, + 0x3194752767453daf, + 0xcba2157a96485c2d, + 0xe8d3f29ba23b5c89, + 0x86df9c1cb13d7af5, + 0xa71c6b5edf41ba73, + 0x7f5dca1fed23a7cf, + 0x53bf72621e26c74d, + 0xc61afd843c28e5b9, + 0xf3c479176a3cf527, + 0xd4ce6b298a4f1593, + 0x4e8c9b5ba85243ef, + 0x1ed74f5dc837526d, + 0x87c46b1fe43861d9, + 0xb57ad28fe12b8f37, + 0x6975e8d5412d8ea3, + 0x8cbed4f76f43bd21, + 0xa7b39dc65e13cb7d, + 0xbfc7e1a76b15dae9, + 0xed4fc2b98b19fa57, + 0xd7895e1cb82d19c3, + 0x1692538ed82f3941, + 0x37d52ec1f712469d, + 0x4ab157843825761b, + 0xb4961ad6531a9487, + 0x5fbe4c68721b94e3, + 0x482edba87efdb361, + 0xac3bf95769efa1bd, + 0xa5d1492989e3df2b, + 0x2d49f7ecb8d4fe97, + 0xd8f94a5dc7e81df3, + 0xb1e6598328fb3d71, + 0xebd379f325fe3acd, + 0x62c85df875f16a4b, + 0xc9a543e982f369b7, + 0x2c46ea3cb1f7a925, + 0x26ce1bd98feab791, + 0xd34ce76989cba5fd, + 0xc268fb9fe9cfd46b, + 0x5df7ae421ac2f3d7, + 0x93c81da76be81345, + 0xfc8d7b2768e943b1, + 0x1fa9dc4987db512f, + 0xec5f942983cd4f7b, + 0x72b3f4cba3c16de7, + 0xeb8d641dc1e39d65, + 0xfc184d7fefd69bc1, + 0x9b45e3821ec8ba3f, + 0xd7cb43632eacd89b, + 0xc765b8f54abfe819, + 0xe2f451b87bd31985, + 0xc9e1b3dba9c637e1, + 0x52a76c8cb7c9365f, + 0x3a7df96fe3da54cb, + 0x5d3e84b1f2ce7439, + 0x4d7c6eb434d192a5, + 0x86e3952874d6b213, + 0x82f91ea43d95ae6f, + 0x5f9163d54c87aedb, + 0x42fce5d76a8bed49, + 0xfca25e4a978efcb5, + 0x4b36d89fe9b54c23, + 0x26ab815fe6b53a8f, + 0x723bc49215a748fb, + 0xb1edc6a323bc5869, + 0xdfe6372542ae87d5, + 0x41da86ba92c1b753, + 0x9e238cd87e83b4af, + 0x92315f6bae97c42d, + 0x6b41fc8edc7ae289, + 0xf8b39e2ed98be1f5, + 0xceb7da354baf2173, + 0xd32bec6547823ebf, + 0xe2865bf547965e3d, + 0xbd9caf7763875da9, + 0xc349581ba39b8c17, + 0xb418e92dc17e9b83, + 0x7fa614ecbe61a8df, + 0x851bde91fe73c85d, + 0xd325ce421d75e6c9, + 0x4dab61932c8af637, + 0x3f6128965b8d16a3, + 0x29dba7398a9f4621, + 0x1c642d8cb892537d, + 0xfe192b8dc48562e9, + 0x1fb4539fe38a9157, + 0xd2596c8fe16a8fb3, + 0xe675dc15427dae31, + 0x25ef1cb43f51bc8d, + 0x5ca871654c53dbf9, + 0x3d7bc9698c45fb67, + 0xacb134598b691ad3, + 0x5e16f93dc97d3a51, + 0x42a6b3ddc65f37ad, + 0x24dcab51f583672b, + 0x4be9a6f213648597, + 0x7fcd1965426895f3, + 0x3a4d9f79826cb471, + 0x739d5e276f4ea2cd, + 0x1fe674aa9d62e14b, + 0xb86321fa9b43efa7, + 0x21fe3a6edb682f15, + 0xe5142931f95a3e81, + 0xc86534a2174a3bed, + 0x4ec31df3273f4c5b, + 0x23ae7b9985426ac7, + 0x17ef249cb2469a35, + 0x3674f8edc247b8a1, + 0x17e2f53a9e3ab71f, + 0x753f6d2bac2ed57b, + 0x8ce49b7edb31f4e7, + 0xf819b7e32d371465, + 0xa2e195376b5834c1, + 0xc3489f18794a523f, + 0x2a5ce499873d519b, + 0x6d73b2fa942d5ef7, + 0x49316a5dc4329e75, + 0xfdb8176fe2359cd1, + 0x1a63fc5ede17ab4f, + 0xbd9851a32f18d9ab, + 0xd15f8ab54c1dea29, + 0xa4f125687d321a95, + 0x52b67a8a9b2538f1, + 0xe492568cba18376f, + 0x1762fbddc71945db, + 0x3198ca6fe61d7549, + 0x14637abfe41f83b5, + 0x41a5e3776715b423, + 0x7152bc976325b18f, + 0xe7abc6843cd5afeb, + 0x2c6a87d54bf8de59, + 0x42d835a768eafdc5, + 0xf4295d1ba9ef1d43, + 0xeb49163dc7e23b9f, + 0x1a57328fe7f65a1d, + 0xe58639f214f85a79, + 0xd1e3c7f323fb78e5, + 0xef196a2652fea863, + 0x5d1eac6872e1a5bf, + 0x2fe745198fe4c53d, + 0xfc6219598cd6e3a9, + 0x8f9ab56dcbdaf317, + 0xe57b9461faed1283, + 0xda1764f328be31df, + 0x7416a8b438c25f4d, + 0xd4eba62436d45eb9, + 0x17a8eb2764e98d27, + 0x35b9cf6872eb8c93, + 0xb23865c871bc89ef, + 0x7d2bc96bafb1c96d, + 0x43918cb1fcb3e7d9, + 0x2bc5d9f21dc6f847, + 0x63195cb54cda17b3, + 0x153ef7476acd4731, + 0x235e1bd767bf348d, + 0x6547f83ba7c263f9, + 0x2847f91dc4d59267, + 0xc251a73fe4c891d3, + 0x769f3d4fe2cbaf41, + 0x6b9fdc43218cae9d, + 0x7d1a28354f92ed1b, + 0xc1d26eb54da3fc87, + 0xd3fe45776ca71be3, + 0x6facd97989ca3b61, + 0x37b51d8ba69c38bd, + 0x61389ebed6af583b, + 0xb32c9571f4c286a7, + 0x8f56b43324c6a715, + 0x5ba8ecf543c9b581, + 0xfe4871d65189a3ed, + 0x2fa159e76f8ed25b, + 0x6db394198d92f1c7, + 0xfe8a975dcdb72135, + 0x4925b1aedba73f91, + 0xb9358c7fe6783cfd, + 0x84a5f7b2178c4d6b, + 0x483c5a73248f5bd7, + 0x9b3e4d6876a29b45, + 0xc485bf987385a9b1, + 0xc34b519ba197b82f, + 0xdac682ea9f5ad68b, + 0x9b45fdcbab6cd5f7, + 0x1e8965d1fda21675, + 0x8c7d14b32c9635d1, + 0x8dfe1a332b98534f, + 0xcadb52f5487952ab, + 0x6b793c2ba68d7129, + 0xfbc2d39ba36e7f85, + 0xce4f831cb4739de1, + 0xe91cb67ed174ac5f, + 0x496d821fef46dacb, + 0x356b97421f5aeb39, + 0xeba5dc832c4df9a5, + 0xd38cf5287d824a13, + 0x3ef4cb8a9b64387f, + 0x6123b47ba95746eb, + 0xef4781ced84b7659, + 0xd3b4815fe36d84c5, + 0xfd3a815fe27fa543, + 0x9e38db721463b29f, + 0xcb6417f65376c21d, + 0x7a21cde54e37df69, + 0xd57932e76b39fed5, + 0xda87632a9b6d1e53, + 0x32ad795cb9513caf, + 0x3b85df4fe9645b2d, + 0x463c1a51f7365b89, + 0xe6b48272163a79f5, + 0x4b16ce93254da973, + 0x3681ca26523e96cf, + 0xc1b7f23a9152c64d, + 0x7c2b1fa98f25e4b9, + 0xa5e78f9cbd39f427, + 0xc7fd43bfed5c1493, + 0x4a128c9ed94c32ef, + 0xfd89b6e43b42516d, + 0xd172be5548235fc9, + 0xafb13d2659268e37, + 0x5e61b29875298da3, + 0x351a4f8a954dac21, + 0xe153c67a912fba7d, + 0x7f8465ccbf12d8e9, + 0xfd81456fed14f957, + 0x927ca1e54e2918c3, + 0x9834ad176d2c3841, + 0xac9e42b76a1e359d, + 0xd1e4f5ca9a32751b, + 0xf8916a7dca149387, + 0x4ea2d8bdc61792e3, + 0xfc8769afe53ab261, + 0x251f49cfe21b9fad, + 0xd286b7c5431fce2b, + 0x1a287e443ce1fd97, + 0x1c7948376be51cf3, + 0x351e7f976bf83c71, + 0x9d5b4a1767f839cd, + 0xf4379b5ba7fd594b, + 0xb7984f1dc4ef58b7, + 0x4312fa6fe6f3a825, + 0xa81bd46324f5b691, + 0xc4f9a52432e7a4fd, + 0x79e8fc1651fad36b, + 0x4acfd6b65fbce2d7, + 0x326fe5dbade31245, + 0x52bfc71bace642b1, + 0xa796e4dcb9c74e1f, + 0x4765ab11f6d94e7b, + 0x945fa6c216db5ce7, + 0x78e91f4324df8c65, + 0x84eb2f3765e39ac1, + 0xe5c9a36872d5b93f, + 0x39bc2ea981e6d79b, + 0x5496fea98fcbe719, + 0x4b6edfcbacbdf685, + 0xc7916231fbc236e1, + 0xc796da221bc6345f, + 0xe9568d7329d753cb, + 0x1e93cf4658db7239, + 0x35cbf6e876cd81a5, + 0xe2f456c874ad8ef1, + 0x847f62ba93b2ad6f, + 0x8d9f1c6fe194acdb, + 0xa541327edfa7ec49, + 0xedbf86421e89fab5, + 0x38964e165dae1b23, + 0x83da2f465cb1398f, + 0xeb19d52769a347fb, + 0xe81f924cbac85769, + 0x5427f1edc4ba86d5, + 0x8df61acfe4bda653, + 0x219b3e5ed28e93af, + 0xd36c8fb215a4c32d, + 0xd631eb9542b5e189, + 0xb41c6d743c87dfe5, + 0xcb436e187d9b1f63, + 0x23fa8be7697c2dbf, + 0x7e56a43cba915c3d, + 0x95d837ffe7835ca9, + 0x4d638191f5a68b17, + 0x3527ed42157b9a83, + 0xe6bf43a3236b97df, + 0xb2ed5175428fb75d, + 0x96e4ab387182e5c9, + 0x48f3d75bae96f537, + 0x1b7fe82dce8915a3, + 0x543d78bfed9c4521, + 0x32b56cd1fa8e427d, + 0xd16fe2443b8261e9, + 0x48c65fa32a938f47, + 0xf82cb7d545768eb3, + 0xfb7a16598579ad31, + 0x143e5ac8725cab8d, + 0x7db49539815ecaf9, + 0xa216e73dce52fa67, + 0x78ade141fe7619d3, + 0x8cd94bf32e7a3951, + 0xf8cd3ae32c5b36ad, + 0xae913d554a7e562b, + 0xc8f5be3bab618497, + 0xfe93847cb87594f3, + 0x159ac2eed568b371, + 0xb2fad36fe358a1cd, + 0x49ac2bffe15acf3b, + 0xcaf84db3214fdea7, + 0x52d4a8176f742e15, + 0xea91f8587e563d81, + 0x51ef8a976b473aed, + 0x76d945a9893c4a5b, + 0xa314d78cb83e59c7, + 0xcf14286fe861a935, + 0xe5823461f654b7a1, + 0x97fcdeb32547b61f, + 0x1bedac365239d47b, + 0x5ef9c1b7614bd3e7, + 0xe3a12fd98d3ef265, + 0xcb54728bae6543c1, + 0xa7894edcbc47513f, + 0x64f9e7beda274f8b, + 0x24d371bfe82a5df7, + 0x8e76acf2192e8d75, + 0xc18a7f6657429bd1, + 0x95c2b4f87623ba4f, + 0xf8eb56287325d8ab, + 0xdf436eccb13ae829, + 0x34c9de6bae1cf795, + 0x69a543ecbc3e27f1, + 0xd468a5ffec12356f, + 0x6a41edb32c1654db, + 0xcb49a7365c1a7349, + 0x5e398f17691c82b5, + 0x63a78c4a984ea123, + 0x7651e8ca9521ae7f, + 0xd2673eba9413adeb, + 0x75a2896dc216ed59, + 0xc9417b3bade7fbc5, + 0xdb7f18532efb1c43, + 0xfe59d2b43bed2a9f, + 0xdac9be576bf2591d, + 0xf7d4e1a76bf35879, + 0x1495fb2ba9f687e5, + 0xb762a48dc5fba763, + 0x6e542f8ba3ec94bf, + 0x1fe4527dc2efb43d, + 0xa45978c214f3e2a9, + 0x4789e1f653e6f217, + 0x8a95fcd76fea2183, + 0xbaef69265ab92ecf, + 0x34c289a879bc3e4d, + 0x2dbef36ba8e15db9, + 0x3ef85cbed9e48c27, + 0x4591e861f5e68b93, + 0x728dcae214c798ef, + 0xfac18db323ecb86d, + 0x872feb3542bfc6d9, + 0x62c3dafa91d2f647, + 0x26b471da9fd716b3, + 0x35d94a1cbeda4631, + 0x257c3adfeacb438d, + 0x2584691fe8bd52f9, + 0xcb826fa43bd29167, + 0x7b1c6f4327b48fc3, + 0x27dcb14656c7ae41, + 0x28f4d9c653b7ac9d, + 0xeba581d8739adc1b, + 0x2ab8d14a91afeb87, + 0x5a349dbdcfb41ae3, + 0x86bc7431fec73a61, + 0x59bf32821ea837bd, + 0xe4835fd32dac573b, + 0xcfd1e29439be65a7, + 0xf4752be989c2a615, + 0x671492dba7c5b481, + 0xfe15927cb496a2ed, + 0xc6b58a9fe3a9d15b, + 0xa16d243fe18adfb7, + 0xc72b6ad4319dfe25, + 0x8fb2d3765fa43e91, + 0x1a7e9b354c853bfd, + 0x28a3f6465d984c6b, + 0x849bd5f7698b5ad7, + 0x514bd8adc79e8a45, + 0x61248a5fe692a8b1, + 0x1a2b396fe594b72f, + 0x5da634221396d58b, + 0xcfad45643289d4f7, + 0x2b5f31a7619cf375, + 0x6a9bd1387e8f24d1, + 0x96eb578bad93524f, + 0x1a9d354dcd8651ab, + 0x8ce4f59edb786f19, + 0x67a3c481f96b7e85, + 0x7ea36413276d8ce1, + 0x8ed214643671ab5f, + 0x13c96a865463d9cb, + 0x165c3eb98276ea39, + 0x83a7251cb169f8a5, + 0x9ec2af3cbf7d2913, + 0x136ed87cbc5e267f, + 0xb4a957e1fc7245eb, + 0x6fbae3521d867459, + 0x35cbd1f32b6983c5, + 0x4ebd8f97697ca243, + 0x451da688765da19f, + 0xf9e315c98451aefb, + 0x253a7f6cb253de69, + 0xdc7ef54cb146fcd5, + 0xc8b9a51fef6a1d53, + 0x8c3dbf521e4c2baf, + 0xb7e8f9243c5f4a2d, + 0x137b48d76d425a89, + 0x8765bfaa9b3478f5, + 0x8451fbadcb49a873, + 0x839e4cfcb63a95cf, + 0x97e4b6ddc63eb54d, + 0x62b38c51f451e3b9, + 0x47b69a821465f327, + 0x3c28fb1874681293, + 0x3274bde76d4931ef, + 0x6d195cb87c2b3f5d, + 0xdf1a38c87a2f4ec9, + 0xfe5ba68dcb428d37, + 0xdf45a79fe9258ca3, + 0xda9ce381f748ab21, + 0x43b58f92152ab97d, + 0xf7b24d94342dc7e9, + 0xe81b465a9431f857, + 0xec9d612ba24517c3, + 0xa675324cbf293741, + 0x421d3f5cbe1a349d, + 0xf4b5193fec2d641b, + 0x5768b12feb1f6287, + 0x17adb6265b2491e3, + 0x1df25e854926af51, + 0x5f976e1545169ead, + 0xa39f5c487519cd2b, + 0x576ae129831dec97, + 0xe4197abdc5421bf3, + 0x8b13a25dcef43b71, + 0x46c3f29febf538cd, + 0x26bcaf821df9584b, + 0xd7e59ca32afc56b7, + 0xfedb96254afe9725, + 0xd6f9245878f2b591, + 0xbc59a2f986e4a3fd, + 0x65b1df8ba4f7d26b, + 0x68cf391cb3f9e1d7, + 0x719f8b2dc1dbef35, + 0x8962def543de2fa1, + 0xa34d8be65ec34d1f, + 0x4d8e6a943ce54d7b, + 0x658f72e54ad85be7, + 0xafe83d9879ec8b65, + 0x435fde1ba6de89c1, + 0x1d536e7dc6d1b83f, + 0x4a2e36c1f4e3d69b, + 0xd93fc51324d7e619, + 0xb9cefa4432daf485, + 0xe812ad4873dc25e1, + 0x2b68ac587dbe235f, + 0xd269bac98ed352cb, + 0x38dea49cbcd67139, + 0x8f65a4cedac87f95, + 0x4f753acfe6ba8df1, + 0x8b759e4215ad9c6f, + 0xa5fdcbe43591cadb, + 0x3cb7fa8765c3eb49, + 0xb94a28c872c6f9b5, + 0xc8d5432a94db1a23, + 0x456137ca9eac278f, + 0xf139db5bac9e36fb, + 0x9b128e31fdc27569, + 0xeba6c5221cb684d5, + 0xb49f5dc32bc9a453, + 0x1dc3a295468b92af, + 0xd519bce8769eb12d, + 0x437acb9984a1df79, + 0xdbec619ba293fde5, + 0x18f95ebed2b81e63, + 0x84b796fede782cbf, + 0xeb9a25721f8c4b3d, + 0xd5eb7fa32d7f4ba9, + 0x6d14ac965db38a17, + 0xadf349776cb5a983, + 0xb17f825ba58796df, + 0xb21d6a8dc48ab65d, + 0xa8df293cb37ed4c9, + 0xb31f628fe5a1f437, + 0x9a4b7e6325b614a3, + 0xd59321b873b95421, + 0x3f2467965f8a417d, + 0xabfec6265c6b4fd9, + 0xd813642a9b8f6e47, + 0x3fda7b8dca728db3, + 0x52bafd7fe986ac31, + 0x82abd7e1f456ba8d, + 0xbdf96272145ac8f9, + 0xeaf356b3235de967, + 0xe16db828759218d3, + 0xd47f981cb2a63851, + 0x51dec83a9f6735ad, + 0xb6a8957dce7a652b, + 0xd2fb14cfec5d6397, + 0x918aec7eda6e82f3, + 0x4192d6b43c84b271, + 0x98fb154327549fbd, + 0xd15abc854657ce3b, + 0x73dc28176349eda7, + 0x17e2bc5a936dfc15, + 0xa8e7246ed4723c81, + 0xe3129dacbf5439ed, + 0x8de2b391fe37495b, + 0x62c3a7d21e3a58c7, + 0xb47f96e32c4d9835, + 0xd4a61f265b4f96a1, + 0x453a2f698963b51f, + 0x1f5be94ba845d37b, + 0x15aed73cb548d2e7, + 0x34a9c71ed34bf165, + 0x93ad6451f46e32c1, + 0xf13e942653614e2f, + 0x8fae19b65f234e8b, + 0x8c1f97554d265cf7, + 0xb39c2da76d2a8c75, + 0xf254e9a8793c8ad1, + 0xd8576eccb72ea94f, + 0xb496d3ffe632d7ab, + 0x57aed121f635e729, + 0xd9cf25b21428f695, + 0xc5f428a8754b26f1, + 0x32d576e9813d246f, + 0x64a139b98f2153db, + 0x37d6251cbe157249, + 0xd4f37b8dcd2781b5, + 0x2f34a6bedb2a9f13, + 0x1db4a82fe61b9d7f, + 0x1b46c373261f9ceb, + 0xa235e9d54712ec59, + 0x81bf9da87614fac5, + 0x4ef8531ba6291b43, + 0xceb3692ba31b289f, + 0xac152d6a9efc481d, + 0xc849a5ecbcef4679, + 0xecb8964edbf286e5, + 0xf9c8b6221cf7a563, + 0xde1f593328e793bf, + 0xef8ad39657fab23d, + 0x4e23afd765fed1a9, + 0x4fd6bca984c1def5, + 0xa157436cb4e51f73, + 0xdc625f4ba1e62dcf, + 0xf98672dcbfe93c4d, + 0x2ef6bdc21fed4cb9, + 0xf65d82743cdf6b27, + 0x2fcd6b365ce28a93, + 0x6cfb4e2658c497ef, + 0xaec78b1a95e8b76d, + 0x2eb57d3984eac5d9, + 0x3e8c17fcb3cde547, + 0x53cad1e1f6e215b3, + 0x7b1ecf4326e74531, + 0xc14bf28651e7428d, + 0x1ac6ed854eca51f9, + 0xc87d1e654dbc6f57, + 0x8a29c5f769af7ec3, + 0x1942e7acb9c3ad41, + 0xcd51968fe6c4ab9d, + 0xbc52e7d1f5c7da1b, + 0x675fa8e214cbea87, + 0x4157bcf324acf8e3, + 0x2a7639e985d23961, + 0x2974f31981c436bd, + 0xa257b38a9fc8563b, + 0x5f4dc2aa9ecb64a7, + 0x743c289fecbd9415, + 0xb67d241fe9bfa381, + 0x59361a432893a1ed, + 0xeb3c49d32795cf4b, + 0xf8692ca43496deb7, + 0xfb8ea468749afd25, + 0x4d5cb32984ae2d91, + 0x6a1e2c4cb2913afd, + 0x3289e17edf934a6b, + 0x8dac7231fea659d7, + 0xfb92e6d21eab8945, + 0xce7598443c8d97b1, + 0xcf53b215498ea62f, + 0xb5edf7876792d48b, + 0x18b92efba695d3f7, + 0xb71643fdc4a9f275, + 0xc2d1f34fe59b23d1, + 0x8d53917fe29d314f, + 0xb42981c432814f9b, + 0xbdea48c43f846e19, + 0xea5487b43e967d85, + 0xc7e93a465c698be1, + 0x43c16bf8786c9a5f, + 0x426d7f8a965fa8cb, + 0x4a1965fed672e839, + 0xd5fb278fe384f7a5, + 0xa92ed815469a2813, + 0xed9b31a5438b257f, + 0x93fc45e7617d34eb, + 0x965c7f2baf817359, + 0x824be96bae7482c5, + 0x853efb6dcd78a143, + 0x2f5b84edca479e8f, + 0x9453a1dfe64a9dfb, + 0x2f4ce3d2174fcd69, + 0x9ced2f743762fbd5, + 0x64d27a3a96871c53, + 0x6db91cf9835729af, + 0x86def93ba16b492d, + 0x8176c35cbf3e4789, + 0xf2e935bdcd4187f5, + 0x26b85791fd54a673, + 0x8ba9ec721b3694cf, + 0xd561b8732a59b34d, + 0x941e6236574cd2b9, + 0x4eac168a985fe127, + 0x3f728e6dc8752193, + 0xb379f68ba3452edf, + 0x69458efdc1483e5d, + 0x9f6814afef2a4dc9, + 0x92a6c5321f2e6c37, + 0x4ce2bd765e418ba3, + 0x4ba9dc887d45ba21, + 0x3bf1a2876a25b87d, + 0x3b79c41ba728c6e9, + 0xd3a7268cb82ce657, + 0xe371689cb62ef5c3, + 0x437e5ba1f8753641, + 0x528e76a21526439d, + 0xca3f6bd87249631b, + 0x83bde6765f2c6187, + 0x12d9f8376b1c7fd3, + 0x135aedca9c32ae51, + 0x7c245e6cb8139cad, + 0xcb9fa2dfe816dc2b, + 0xeb7925a1f518eb97, + 0x15bed633261be9f3, + 0x3c4eb696563f2a71, + 0xb35da7e9851237cd, + 0x7b4c583ba216574b, + 0x57af62ba9ef865b7, + 0x9eb3415badfb9625, + 0x3dab589dcbfda491, + 0x9d62e73cb7ce92fd, + 0xdf47c81329f3d16b, + 0xa146d89326e4dfc7, + 0xb86329d546d8fe35, + 0x96afd81875fb2ea1, + 0x91dba7c984ed3c1f, + 0xc58916dba2f14c7b, + 0x123fca9cbfd35ae7, + 0x382e61a1fde78a65, + 0x1c5dbae32dea98c1, + 0x831c57f329dca73f, + 0x2758649437dfc59b, + 0x4c1832a878d3e519, + 0xc182654ba7d6f385, + 0x6d5e1f8cb6d924e1, + 0xa4e9f23dc4db325f, + 0x17e9ad21f2de41cb, + 0xcedf215543d16f29, + 0x456fc3832fc37e95, + 0xa29e8fd54db68cf1, + 0xf719db654ac89b6f, + 0xe7cb3a96568ca9db, + 0x6bef749986bfda49, + 0xc73e25bed6c2f8b5, + 0x7db82411f6d71923, + 0xe9c2457214c9268f, + 0xba7c892542ca35fb, + 0xae3df56871ce5469, + 0x21bade587fb183d5, + 0x621fcaea9ec6a253, + 0xacf59d198cb691af, + 0xda52361dc798af1d, + 0xa26c7511f58bce79, + 0xe7d8a542168fdce5, + 0x6c98e7b658b41d63, + 0x7ad4b5c764952abf, + 0x4831b59872b84a3d, + 0xedc64f8871bc48a9, + 0x2f39d64cbfae6917, + 0x6175cbeedeb1a783, + 0x319f7bdfeb8395df, + 0x5ed4fb721c97b45d, + 0x8c1564b32a78d3c9, + 0x73e9b816589ce237, + 0xa13d4b98768ef1a3, + 0x3a65dfbdc8b65321, + 0x865f372cb2953f6d, + 0x9ad675fdc1874ed9, + 0x859134dfef8b6d47, + 0xd59c32a21f6e7cb3, + 0x483da1765e82ab31, + 0x378caf954c63b98d, + 0x61a3deb54a65c7f9, + 0xc95413fcb95ae867, + 0xef972bcba57bf6d3, + 0x5ab27e1ed69f2751, + 0x45c3d711f58234ad, + 0xd359cb621397642b, + 0x197f6cb5418a6297, + 0x726cf8465e6b81f3, + 0x45ecf9d87c5d9f61, + 0x38db1e587a519ebd, + 0x4831bdfba964cd3b, + 0x8ea415fed845eca7, + 0x4b5ac87fe769fb15, + 0x7e4f1894376d2b81, + 0x8592fdb4345f28ed, + 0xd543e6ca9372485b, + 0xb6e71f8ba18456c7, + 0x5fa782ecbf4a9735, + 0x3f7c5edcbe4c95a1, + 0x58914f7dcb5da41f, + 0xb4ec3251fa51d27b, + 0x3f7cb4832a54d1e7, + 0x9bdafce32937ef45, + 0x1845be3767592fb1, + 0x3d46a2e9865b3d2f, + 0xac3deb1a924f3d8b, + 0x5493d2adc1425bf7, + 0x15f37aeedf248b75, + 0x7e31a651fe3789d1, + 0xb9c56d821d2ba84f, + 0x18924e74392ec6ab, + 0x3c296eb87b41e629, + 0x47213c698a23f495, + 0xfead312cb94825f1, + 0x728a65bdc74a236f, + 0x2dba175fe53c42db, + 0xf89b32cfe23f6149, + 0xb675d13541327fa5, + 0x8ea913b65f269e13, + 0xe62f83d54d169c7f, + 0x76b89e265c189aeb, + 0x15c42ad8781edb59, + 0x1937a28cb821f9c5, + 0x5346a19fe9261a43, + 0x429fb71fe516279f, + 0x6be21cf4362a471d, + 0x81a79357631d4579, + 0x5ea92b39821f74e5, + 0x436b79a98ef1a463, + 0xe9cd41387ce492bf, + 0x28f53eba9af7b13d, + 0xd28fc4acb6e7cf89, + 0xc5a6e37cb6eacdf5, + 0x4e52c86216cefd73, + 0x153e962546e32bcf, + 0xbad16cf875f63b4d, + 0xd7af4ce762f74ab9, + 0x7a2fbc5a91fc6a27, + 0xb47d8efbafde7893, + 0x72f8ec3babc196ef, + 0x92c63b51fae3b56d, + 0x6bae73d21ae6c4d9, + 0xc31e4db329dae347, + 0x47dcb86657dcf2b3, + 0xa5fc42da98df2431, + 0xdb27ce1ba6e3418d, + 0x89c4f3dba2c54fe9, + 0x5fe3d27dc1d96e57, + 0x4cb1862fefba7dc3, + 0x5b79ca132fbe9c41, + 0x7a5926143ec1ba9d, + 0xfad394b65ac4d91b, + 0x61c825d54ac5e987, + 0x96df45c986b9f7e3, + 0x7ac64fdcb7cd2861, + 0xd71e834dc4af25bd, + 0x39c182e1f4d2653b, + 0x2acebf7212d563a7, + 0x9f7bd12762da9315, + 0xfe9a21c65fbca281, + 0x8f2a67354a7b8fcd, + 0xacd53fb87a91ce4b, + 0x51846bcba893edb7, + 0x752e389ed8a7fc25, + 0x4e37c581f6ba2c91, + 0xc79a8652158b29fd, + 0xd8e7153324af396b, + 0xac7258b763b258d7, + 0xcb74f26ba1c69845, + 0xb964e1d87fa896b1, + 0xa3fd785a9d8ba52f, + 0x68c3279eda7ec38b, + 0xab6d7f4fea91d2f7, + 0xda6b37432ba4f175, + 0xbc6da79659a832d1, + 0x8f2bd6c656892e3f, + 0xdb2983c7647c3e9b, + 0x3e58b42ba38f5d19, + 0x34125eaed1a27c85, + 0xe1f869ddcf758ae1, + 0xfd19c28fed67a95f, + 0xdc5239721e59a7cb, + 0x73f5d6a32b6ed739, + 0x18b9dc354b81f6a5, + 0x4a56fd3a9ba62713, + 0xe5f4783cb698247f, + 0xf37e9a8dc57943eb, + 0x9a1b843fe38d6259, + 0xcb93781fe28f71c5, + 0x936cdeb651849f23, + 0x59a7ef632e549d8f, + 0xc28f9eb43d469cfb, + 0x942c3a765b4adc69, + 0xef48b918784cead5, + 0x1328b65eda821b53, + 0x76934eced76428af, + 0xe7684ac1f567482d, + 0xce5d7a82135b4689, + 0x79cd6e24324c76f5, + 0xe73bd959816f9573, + 0x23f1dc687e5293cf, + 0xec362f7a9e56b24d, + 0x9d61f2ebac47d1b9, + 0xb7d8fa2dc94adf17, + 0x69cbf7aed74cfe83, + 0x7ac6e51438512cdf, + 0x9137da8328643c5d, + 0xcdab853875364bc9, + 0xf23d4eca924a6b37, + 0x19fa758cb14d79a3, + 0x794c325cbe4fa921, + 0x853bd76dce32b67d, + 0xd3c17b61fb24c5e9, + 0x5e672b421c29e457, + 0x12cd3b86592af4c3, + 0x4c7961598a6e2541, + 0xb514cdeba851429d, + 0x54db3e9dc845621b, + 0x629e3afdc3285f67, + 0xdebf635dc1297ed3, + 0x185d6c7fef2c9d51, + 0x5f3491e32e1f8bad, + 0x82d396465e13da2b, + 0xcb6478265c14ea97, + 0x41bf83976a17e8f3, + 0xa1f9348cba3c2971, + 0xfc4ed8bba71e26cd, + 0x57c826bfe821564b, + 0xe48bd371f51364b7, + 0x58c269a436189425, + 0x1adecb37642ba391, + 0x123d78c54cea91fd, + 0x628fbc7549edaf5b, + 0x43f29dc769f1dec7, + 0x27d954cba9e4fd35, + 0x2f517d8dc8f72da1, + 0x85a4f6ced6e93b1f, + 0x7c536fe215fd3a7b, + 0xcaf6b93323df49e7, + 0x9db2a5c873f28965, + 0x1c54f3d982f597c1, + 0xab14c5687ed8a63f, + 0x632b8c487deac49b, + 0x516e9d3cbaced419, + 0x4a295d3fead1f285, + 0x5e6179254ad623e1, + 0xfeba78c549d8315f, + 0xd82c7fa545d83fab, + 0x6f2ce85874dc5e29, + 0xea4132d982cf6d95, + 0xf914b58ba2d38bf1, + 0xa9d5341cbec49a6f, + 0xdc9683e1fec6a8db, + 0x5d74e3c21ecbd849, + 0xb39e4c7329ade7b5, + 0x1f69d4587bd41823, + 0xd34e68c879c4258f, + 0x8bfa76ca96c734fb, + 0x4127af3dc4db5369, + 0xa9b63d7fe3bc72d5, + 0xc186a52fe2cf9153, + 0xc58167a431b28e9f, + 0x56ba12e43f95ae1d, + 0xe617b4a43ea6cd79, + 0xfabe2d754a89dbe5, + 0x2b316a88789dfb63, + 0x64f8bdedc7a129bf, + 0xf6d41c7fe7b5493d, + 0xad3ce911f3c647a9, + 0x5cf749b324cb6817, + 0x86d73e5542bd9683, + 0x9834b6f6519e84df, + 0x59ca8e287f92b35d, + 0x8e23b1a87e85d2c9, + 0x6a2e87dcbca9e137, + 0x42f1ba7dc87aef93, + 0x9682ba5dc67b1def, + 0xf18a3cd328913e6d, + 0x9615fdc326834cd9, + 0xe6fb7dc653a86c47, + 0xd9218fb762897ab3, + 0x91274cecb28d9a31, + 0xba1f54ea9e5fa78d, + 0x49ea583cbd72c6f9, + 0xec435611fc94e567, + 0x9f42ac821b78f5d3, + 0x3d8efcb54b9c2651, + 0x976fe8d6587e23ad, + 0xd953c14ba891632b, + 0xbf58697dc5a46197, + 0x7196a54cb2867fe3, + 0x49158fbed27a9e61, + 0x3975a6ffef4a8cbd, + 0x59de3b621e5fac3b, + 0x6dc5f7943d52eba7, + 0x2e5693b54c76fa15, + 0x91e6c4287c692a81, + 0xf28e746a985a27ed, + 0xb93de68dc86e375b, + 0xc642f83fe48165c7, + 0x435978e1f2849635, + 0x4dc96573236794a1, + 0xd6c8f3b65269a31f, + 0x48b6d3a65f4dc17b, + 0x2143a8d65a3ebfd7, + 0xc345bfea9b62fe45, + 0x89a7bd6dca562eb1, + 0x194af83ed9583c2f, + 0x96d7c1b1f64a3c8b, + 0xf9dc8672163d4af7, + 0xc74ea28436418a75, + 0x54b96c18735498d1, + 0x8e71faca9136a74f, + 0x4d31eb887f28c5ab, + 0xe28f451bae3cd529, + 0xa941d38dcb2fe395, + 0xd13c9bffeb6524f1, + 0xc459de321b47326f, + 0xa74bc196593841db, + 0x15f824b7672b5f39, + 0x7fd9ec39842d6ea5, + 0x87625efcb6529d13, + 0xbf4863adc1239b7f, + 0xe29fa57dcf15a9eb, + 0x7943ce61fe18da59, + 0xcad63e932d1be8c5, + 0xda39f1465b1ef843, + 0xbd8416987b13269f, + 0xb2f48e7a9a27461d, + 0x68a3fe9dc81a5479, + 0x6bd4527dc61b73e5, + 0xbf52ae7ed51e9263, + 0x37fc5dbfe43291bf, + 0x24f738665314af2d, + 0x1b3adcf32df4ce89, + 0x7589bed43ae7dcf5, + 0xca1d7fe659eafc73, + 0xdc71b84767ed1acf, + 0x4253dcecb8f13a4d, + 0x5e2739ced6f348b9, + 0x56da127fe4f86927, + 0x8edc497214fb8793, + 0xb54e168432db85ef, + 0x172c6af651efa46d, + 0xda2c19f76fe2c3d9, + 0x3dac2bfa9cd6e247, + 0x1c38457a9ad8f1b3, + 0xc8f51a7edaec4231, + 0xb5783adfe6bc2f7d, + 0xeba47f3327c14de9, + 0xa5346b1328e36d57, + 0xf6d13e2654e67bc3, + 0x1d2fca9873ea9b41, + 0xe29854c761eca89d, + 0xd189ec587eafc81b, + 0x5a3842ecbdc2e687, + 0x4cb5e73edab5f6e3, + 0x9c8b71a43cda2761, + 0xdc2948f438ca24bd, + 0xa523b74768ce543b, + 0xa841d3ea98d162a7, + 0xd3f1895cb7d69215, + 0xcaf6543cb3c69f71, + 0x95841f2cb1a78ecd, + 0xc8bda31fef8cad4b, + 0xa37d86b21e8fdcb7, + 0xbc6d1fa54da3fb25, + 0xb2f1a7865dc62b91, + 0xb86da7c659a728fd, + 0xcd4238ea97ac386b, + 0x83e1d9ccb5ae46d7, + 0x3c59b86fe6c19745, + 0x2631bd91f3c495b1, + 0xbc6349f213b7a42f, + 0xdfb28ea541a9c28b, + 0xbf37d1854e8bc1f7, + 0x21d389554b8edf65, + 0xc4ef37598b942fc1, + 0x6ca2ef7cba962d3f, + 0x864f751fe6873d9b, + 0xb783e461f68b5c19, + 0x826bf4d2149e6b85, + 0x6d7ac39545a289e1, + 0xe2c357176293a85f, + 0x8ad3c4687185a6cb, + 0xd315a4698f7ad639, + 0xcbe8a4da9d7ce4a5, + 0x168347adcb8ef513, + 0x8395cfbfeb94237f, + 0x4c7ead521a8642eb, + 0x452cbe843b8a6159, + 0x7dc9a1f4347a6fb5, + 0x23edaf6a957d8e23, + 0x1de5c4fba3619c8f, + 0x8512e47dc1639afb, + 0xb8495fadcf45db69, + 0xa76e3121fc48e9d5, + 0xd52349721d6cf953, + 0xe6f591c43b5e17af, + 0x579ed4876b83472d, + 0x73dc2fbbab764589, + 0xcefda49cb86974f5, + 0xbe91a3fed56c9473, + 0xf5c7394cb35d82cf, + 0x61cb2a51f372b14d, + 0x4c873d932153cfa9, + 0x46ca21843f46de17, + 0xeb2f4ca65c49fd83, + 0xedf152b7694a1bdf, + 0xcb9f3429894f2b5d, + 0x728f13ced8524ac9, + 0x61bfd38fe9456a37, + 0xe96bc241f54978a3, + 0xf29a18c4365ca821, + 0x7cb65e35423ea57d, + 0xa1d589287251c4e9, + 0x5317c6ba9f24e357, + 0xb71ce8da9d47f2c3, + 0x719ed63dcd6b2341, + 0x8da3479fea4c319d, + 0xb9a8273dc72d3ef9, + 0x5ba876d21a325e67, + 0xe1b39cf548257cd3, + 0xba892c5876389c51, + 0x4de398f7632b89ad, + 0xf3524bd9813ec92b, + 0x1a46e7dcbf21e897, + 0x147def3cbc14e7f3, + 0x7d32cba1fd392871, + 0xb5dfc7443b1925cd, + 0x784ef2b76a1d354b, + 0x853e9a27691f53b7, + 0x2c5d47acba149325, + 0x3fb1de8dc736a291, + 0xd2f36c9ba3168fed, + 0x15a749eed219ae5b, + 0x65f1d2ea9efabdc7, + 0xd72e94521bdfec35, + 0x37d6c8e65df42ca1, + 0xb7e82d165be63a1f, + 0x138d2c465af8397b, + 0x67f8214a96fb48e7, + 0x412367fcb4fe7865, + 0x52f91e7ed5f296c1, + 0x84e7512ed2e4a53f, + 0xcb579a4212f6c39b, + 0xd8c29fa652fad319, + 0xd28ca6e54fdce185, + 0x2b39e6d659acefd1, + 0xe17f54298ac32e4f, + 0x1d72c65a98d53eab, + 0x7ebda62dc7e85d29, + 0xa298e141f4eb6c95, + 0x693fc57325cd7af1, + 0xce2bd69434d1a96f, + 0xe47b2d3652e3a7db, + 0x15d2ab7981e6d749, + 0x4afbde887fc9e6b5, + 0xaf3e17ca9dbcf623, + 0x79842dfdcabe148f, + 0xc9762a4fe9c243fb, + 0xcfe426a21bd75269, + 0xf189c42438c971d5, + 0x91af6c8656cb8f43, + 0xa9387fc653ac7d9f, + 0x4f1dc79984b2ac1d, + 0xf5b376cba1b3dc79, + 0x6c59831cbf96dae5, + 0x75a9fb3fedb9fa63, + 0xb8f35d432d9c18bf, + 0xe2361cd54baf283d, + 0xed7ba2165bc246a9, + 0x473fd8aa9ac58617, + 0x6ad7419cb6ca9583, + 0x1537289cb49a83df, + 0x951248adc39ea25d, + 0x57426d91f3a2d1c9, + 0x1b85e7d431a4df27, + 0xfa1ec6332d86fe93, + 0xe79fb1654b781cef, + 0xa7becd265a8b2c6d, + 0x837bd1e7687f3bd9, + 0x694e12aed9a26b47, + 0xa96b571fe6a579b3, + 0xb5d7c4e1f5b8a931, + 0xad4b53f2137ba68d, + 0xac58f4e4327db5f9, + 0xe421a9b982a1e467, + 0x2cf96e887e85f4d3, + 0x29145edcbea92451, + 0x18375c4cbc7932ad, + 0xd5f3426fea8d512b, + 0x4123ac6ed96e4f87, + 0xdb7f8a3219827de3, + 0x2f819d7437859d61, + 0x75af86d543568abd, + 0xab5214d87269ca3b, + 0x53a4cb29815ed9a7, + 0xa2e758ccbe72f915, + 0xcf4eb98ede752981, + 0xce16b871fb5726ed, + 0xa67294d21d7a365b, + 0xe3794ad32a6d54c7, + 0xf73cd9b76a7f8435, + 0x6c73e24cb87493a1, + 0x1fd2a79cb576a21f, + 0x6712bd3dc247af6b, + 0x2f36a8bdc149bed7, + 0xe2453c9cbf3ced45, + 0x956abe254f632db1, + 0xdf5b81e54d653b2f, + 0xf32e91765d463a8b, + 0x73de1f976b3a49f7, + 0xa4c7e31cba3d6975, + 0xdc925a6cb64f87d1, + 0x13bf8e9ed752a64f, + 0xba2e47d1f235c4ab, + 0x72c3e9421358d429, + 0x482bcf37614be295, + 0x9f57dce76d4ce2f1, + 0xa1f4d72a9d52316f, + 0x2dfca6998a243fcb, + 0x61a9785dcb275e39, + 0x165b9d4fe8296da5, + 0x7c621d31f74d8c13, + 0x5a48b962152e8a7f, + 0xacd986f54532a8eb, + 0x9ec4b5d87324d859, + 0xdc84a35a9128e7c5, + 0x12f436da9e1bf743, + 0xf82db57bac2d159f, + 0xad624c7fec32451d, + 0x374e95b1fc145379, + 0xdf29cb443b1872e5, + 0xeab32d865a2b9163, + 0x3789a1e5451b7eaf, + 0x9125fba8751f9e2d, + 0x86d34c1ba412cd89, + 0x1937426ba214dbf5, + 0xe345bcfbade6fb73, + 0x1b9f584edbe819cf, + 0x945e36721bfc294d, + 0xfd34eb632aef37b9, + 0xab418fc65bf36827, + 0x3124ea687af58693, + 0x43eba7fa95d784ef, + 0x4a7dc18a94fba36d, + 0xbc1d876ba3feb2d9, + 0xc4ab895ed3f2e147, + 0x746bde5321d4efa3, + 0xad7c8b965ed83f21, + 0x7c28d9654bc92e7d, + 0x8b41f67658db3ce9, + 0x43ec61d989df4c57, + 0x28f7ac3cb8e27ac3, + 0x1ac5673ed7e69a41, + 0x875d6a31f3e6a79d, + 0x1bfa7e9324eac71b, + 0x76b8c1f432ced587, + 0xb4dca13872c1f5e3, + 0xf236e5da9fd72561, + 0x1b2fd6e98ec723bd, + 0x8bae7f4a9cda523b, + 0x2bc867afe9cd51a7, + 0xb7356f8dc7ad6ef3, + 0xa149c5b328c39e71, + 0x543dbe1325a48bcd, + 0x6bea1f7653d7ac4b, + 0xacedbf1652c9dab7, + 0x2bed149981bdea25, + 0x75e86facbfc32a91, + 0x2d9658fcbca427fd, + 0xd1e9a371fdc8376b, + 0x4acb85721cba45d7, + 0x84cb61a32abd8645, + 0xc17bf83657af84b1, + 0xd72b4cf987b4a32f, + 0xdb8a15ea94a5c18b, + 0x5fb2794ba296bfe7, + 0xadb372fdc19ade65, + 0xcdb9f45bae7bfdc1, + 0xf876ec354e912c3f, + 0x3fed6a432e843c9b, + 0xcea81b254da75b19, + 0x86b15f954c9b6a85, + 0xf9ce74bba69c78e1, + 0x8947a61cb48e975f, + 0x7d1fc56fe482a5cb, + 0x5dc92a31f2a6d539, + 0x94fcbd221298e3a5, + 0x5eb98717629bf413, + 0xc87941e65e8d127f, + 0x4513b8c87d8241eb, + 0xdf2e473bac835f49, + 0xa8ef57ddca876eb5, + 0x692481afe97a8d23, + 0x563bda4fe45c7b8f, + 0x3e79cf82145e89fb, + 0x6c2f57d43472da69, + 0x153fbde76274e8d5, + 0x731b9feba179f853, + 0x567e24998e5b16af, + 0x72cd83fbac7e362d, + 0x93fa8d5fed715489, + 0x932c45ffeb8473f5, + 0x3ca7d8e21c689273, + 0x729db1f4375981cf, + 0x2ae736f5465b9f3d, + 0x9751ad47634fbea9, + 0xef297c5ba463ed17, + 0x37fad2ecb165fc83, + 0x29d145acbe471adf, + 0xb3c8d911fe4b2a5d, + 0x84ae57c21d4e38c9, + 0x857ed6154d516937, + 0xf25ea7c76c5487a3, + 0xc8fa71da9b58a721, + 0xad61847cb639a47d, + 0xb4df256ba54cb3e9, + 0x8f2b65adc34fd257, + 0x92d3c47fe264f1c3, + 0xde745af765783241, + 0x3f5719d54e372f8d, + 0xa87fecb65c2a3df9, + 0x62d415a98b2e4d67, + 0xcd437b1a9a417bd3, + 0x6437b2ceda349b51, + 0x31b28f9fe62598ad, + 0xe58a31d1f539c82b, + 0xb348ea72142cd697, + 0xfa493dc6542ed6f3, + 0xe5432dfba3542671, + 0x5bc932698f1624cd, + 0x48e5b37bae19534b, + 0xd37c821bad1c52b7, + 0xc37165eedb3e8125, + 0xf87264cfea329f81, + 0x7b6e59c327138ced, + 0xc5972ba43716ad5b, + 0x718baed65418dbc7, + 0xf7ce29d9841ceb35, + 0x3bdfe5a9832ef9a1, + 0xb3d4186bade2391f, + 0x34fb52edcdf4387b, + 0x6f4b921edbf846e7, + 0x645f82321cfb8765, + 0x6cd2a49439fd85c1, + 0x7da41e3657de943f, + 0xa4c3e2b876f3c29b, + 0x8349de1ba5f6d219, + 0x78159e3ba2e8df75, + 0x274651dba2c9fed1, + 0x54f16b3baebc1d4f, + 0x6f9be5132fe13dab, + 0x6ac521943de45c29, + 0x1b7d9e843ce76b95, + 0x782d693658da79f1, + 0x1fa3ceb875dc986f, + 0x61b329e984cf96db, + 0xf358b6ddc5e2d649, + 0x538129d1f2d6e4b5, + 0x4357ea2214d9f523, + 0xf829e13652db138f, + 0xb8ed32165ead32fb, + 0xb52693498ed25169, + 0x623a49598ab36fc5, + 0x82935eacbac78e43, + 0x8361ca7ed5b87c9f, + 0x4d38c971f5ac9b1d, + 0x3564d8c214afcb79, + 0xfce8a56434b2d9e5, + 0xeca632b872c5f963, + 0x52c918e762c817bf, + 0x75a12df98fab273d, + 0x7fe59b498dbe35a9, + 0x5c71b2ffedc28517, + 0xd8e3c9a1fbc59483, + 0xe4c56a8219a682df, + 0xac5fd94437b9a15d, + 0xe7a4c6d4347cafb9, + 0x3f547217649fce27, + 0xd5a9267984a2fd93, + 0xf56c24eba2951bef, + 0xdb3186fdcf982b6d, + 0x381e7421fe7b3ad9, + 0xb4ce39a21d9e5a47, + 0x3f6b27954da178b3, + 0x5afb97c76cb5a831, + 0x97b8f2154796a58d, + 0xe567b24ba578b4f9, + 0x46829e5cb49cd367, + 0xfc89765cb48fe2d3, + 0xce746581f4b62351, + 0x5f8a1dc5429631ad, + 0xfb459dc43e784f1b, + 0x7fa1dbc43d6b4e87, + 0xb2cd6ef65a7d6ce3, + 0xb45319ebab829c61, + 0x15aed64dc76389bd, + 0x857abd2fe576c93b, + 0x35a1d6e1f359d8a7, + 0xf34b8c93247ce815, + 0xa2cf1935437ef681, + 0xcde9fa18718325ed, + 0xf1e5827a9f87345b, + 0xf7db365bae6953c7, + 0xf15637acbd7c8235, + 0x832c1b5edb6e82a1, + 0x9f2a74bdc7518efd, + 0xf3cb6e421853ae6b, + 0xdaeb81432645bcd7, + 0xb14e6df87369ec45, + 0x58ea3c18735cfab1, + 0x7f3c65aa936e1a2f, + 0x16a7ed9dcf52398b, + 0x91e438ddcd3548f7, + 0x18b79431fd3a6875, + 0xa8be95132c4b86d1, + 0xd7b3e6432a3d954f, + 0xd179f8c76851c3ab, + 0x6dbefc8ba865d329, + 0x62c78efcb647e195, + 0x7cdbf85ba348dfe1, + 0x64b91e8dc24b1e5f, + 0x7c63e52bad3f2ecb, + 0xc75d83b21f425d39, + 0x8b97c2a43e246ca5, + 0xf5c9db876d498b13, + 0x2bfeda765a2b897f, + 0xf23c7a99862d97eb, + 0xfe4b13ddc831d759, + 0x812796bed723e6c5, + 0xd7b9481fe528f643, + 0xe743a863253a149f, + 0xf2d84318725c341d, + 0x4fd2a9776e1f4279, + 0x237bce5a9d2371e5, + 0x784ceb5bac168f53, + 0x297513dcb9167daf, + 0xa43568ffe71a9c2d, + 0xb67153e1f51ebc89, + 0xce28f1743721daf5, + 0x34da6e965614fa73, + 0x23b86ad8742618cf, + 0x4bfde23a931a284d, + 0xe1b49d387efc36b9, + 0x7c8635dbacfe5627, + 0x84b6e32edcf18593, + 0x9b746d3dc9d483ef, + 0x3678ecf219f7a26d, + 0x57da426436f8b1d9, + 0xa98fd2e545ebcf37, + 0xed9f23b764cfdea3, + 0x384fc6dba6f53e21, + 0x2e83975ba1f52c7d, + 0x413e9c8bafd73be9, + 0xe1a637b1fdec4b57, + 0x85763be21bde69c3, + 0x637d4ce65ce2a941, + 0x56e98dc548e3a69d, + 0xe821da9658e7c61b, + 0xdcf8e45a95ead487, + 0xd184f35a95cbd4e3, + 0x827a3fccb4cef361, + 0x7c5e8ba1f1e432bd, + 0xebc9da5542e7513b, + 0xea79f1332ec84f97, + 0xe6a52cf54cba6df3, + 0xe83f7ca65abe8d71, + 0x1c2f4ea767b18acd, + 0x15e286aa97d3ca4b, + 0xb3d1527fe4c5d9b7, + 0x94e826d1f4cae925, + 0x5f467de324bcf791, + 0x15e2b96543ae16fd, + 0xb94efa3981d2356b, + 0x46f21dc98fb654d7, + 0x8ca521da9eca8345, + 0xb2e48f7a9dac83b1, + 0x61432a8dc8ad912f, + 0x5a61c98fe691af7b, + 0x92c3eb521693bde7, + 0xfe8c47a324a7ed65, + 0xd9c4e3b65498fbc1, + 0x3248e5b8749c1b3f, + 0x8659e4b8718f2a9b, + 0xab29176dcfb35a19, + 0x7fb519eedeb46985, + 0x6a89d721fca987e1, + 0x8ce5f6321c8b965f, + 0x893b54d3287e94cb, + 0x4d73285768a1d439, + 0x6c9b23198794e2a5, + 0x59ae7cfcb6a8f213, + 0x175dae9dc49a217f, + 0xbd562f9dc17a2fdb, + 0x6b95fe4dcd7f3e49, + 0x39867fd21f826db5, + 0xe736cb254e968c23, + 0xf9da48643c567a8f, + 0x2bd79fc5475a98fb, + 0xd2eb678ba75ec869, + 0x7a5e194cb681e7d5, + 0xb1ec842ed694f753, + 0x26df154fe38715af, + 0x72c6ea82148a352d, + 0x2d6f79b6517d4389, + 0xda6b38954d7e62f5, + 0xf89b514bae849173, + 0xeb6912f98a547ebf, + 0x451df87cba579e3d, + 0x2d6cb7afe648bda9, + 0x597e8b61f65edc17, + 0xae6f5cb32761fb83, + 0xfec1b274356419df, + 0xbe57d2198367295d, + 0x261a4399815a37c9, + 0x96257b4baf4d5837, + 0xd264c91cbd4f76a3, + 0x485263bfed74a621, + 0xed82a761fb45a37d, + 0xe4d596b21a47b2e9, + 0x1af9e764394bd157, + 0x18de23b6564cdfb3, + 0x4691783ba8742f31, + 0x4b2fcd3ba3542e8d, + 0x697ef4acb1463cf9, + 0xf567ba1edf2a4c67, + 0x4de937c1fe2c6ad3, + 0xb71d94c32d3f8a51, + 0x85bad3f54c3297ad, + 0x4dc5f2876a35c72b, + 0x7d8e2fc76a28d597, + 0x6ecd7aba972ad5f3, + 0x81f637ccb63df471, + 0x83fb614fe65123cd, + 0x169ca7d1f136524b, + 0x93e72f85423851b7, + 0xcad39b854e2a7f15, + 0xe92da4665d2c7e81, + 0xb2946c86591f7bed, + 0xf257b6e98912ac5b, + 0x87dc932cb814dac7, + 0xeb9af67ed718ea35, + 0x7ba6d8ffe52bf8a1, + 0xf6bc5985463d281f, + 0xfd561e798521367b, + 0x8abc617a921345e7, + 0x7dac6fea9ef78465, + 0xe2341dc87df984c1, + 0x24a31de98aeb923f, + 0xd345e89dc7fea19b, + 0x9427abedc6d1bef7, + 0x6fc849a218f3de75, + 0xaed4617435e6fcd1, + 0x8efd7bc765e91c4f, + 0x7b4c59e763fd2cab, + 0x94efd75981ef4b29, + 0x928e537cbfe26a95, + 0x534ec9fcbcd578f1, + 0x4f25619febd8976f, + 0xce94f27218ea95db, + 0x69b1ae5328dec549, + 0xb1485d9768d1e3b5, + 0x17c4b8aa98d6f423, + 0xbcf6429ba5d7128f, + 0x539d281ba4d931fb, + 0x41d39cacb1dc3f59, + 0xe648c39cbdaf4ec5, + 0x95fb38e21fc28d43, + 0xd96135732dc47b9f, + 0xe326a9554bc79a1d, + 0x72ba619546dbca79, + 0x129a364876adc8e5, + 0x8a42fd1cb7c1f863, + 0x34b7169ed5c416bf, + 0xd2ab6191f4c8263d, + 0x649e832212db34a9, + 0x34b1869652cd6417, + 0xdc78bf965ebf7283, + 0x4fe892d76ca381df, + 0x8b3d5ce87ba59f4d, + 0x682d5b3dc786aeb9, + 0xbf417dafe69acd27, + 0x371cdb81f58dec93, + 0x8f9257a436921aef, + 0xa12ef48435b42a6d, + 0x83e791c652b638d9, + 0x6d1af72981cb5947, + 0x963ed7298f9d67b3, + 0x2c63fe8cbdaf9731, + 0xcdf897afec92a48d, + 0x82b9f3cfea85b3f9, + 0x9bdc48a21ba9d267, + 0xbae7c2f5478ae1d3, + 0x139ade46568cef41, + 0x695fa13875812f9d, + 0x17f8e34ba3954e1b, + 0xfab6875dc1a64d87, + 0x4e2985adcf796be3, + 0xbd49e171fe7d8b61, + 0x35d8b9e21c5f78bd, + 0xd3c986754d72c83b, + 0x7bd5e8643b84d6a7, + 0x2dcb13876a89e715, + 0xd2763e4ba67bf581, + 0x319b265ba57c14ed, + 0x24f5371fe691435b, + 0x65a27b91f19452c7, + 0x385cd21542a98135, + 0xd642f1743e5a7f91, + 0xc2e697143b4a7cfd, + 0x8b63daf65a4f9d6b, + 0x742ef6998952cbd7, + 0x1ba5493dc976eb45, + 0x3ebfc8aed657f9b1, + 0x9cb3f85fe56b192f, + 0x3268b942145e278b, + 0x4fa8dec6538146f7, + 0x1c3b7f9ba1938675, + 0xd2a58fea9f4785d1, + 0x4fe75b698d5a934f, + 0xbc5d23498c4d92ab, + 0x58b917eeda5fc129, + 0x6dc9f35fe942df85, + 0x518cadb32845fde1, + 0xc7a6fe1437481d5f, + 0xb74825a765492dcb, + 0x15d3fc29825e4c39, + 0xa29763edc2416ba5, + 0x637dfabdcf458a13, + 0xd1fea39dcd25987f, + 0x3b7a5891fc2896eb, + 0x65b37fa21b2dc659, + 0x678fb5c4392fd4c5, + 0xe4917cb98a62f543, + 0x49b7cdeba846139f, + 0x83dcf72cb759431d, + 0x39ba781ed53c4179, + 0x8af6d51cb12c4fd5, + 0x4a3612cedf218e53, + 0x743a6db32e137caf, + 0x7586d2c54e169b2d, + 0xd6b7ef354d17cb89, + 0xea482d77681bc9f5, + 0x3467bd2ba81fe973, + 0x3159fadcb82317cf, + 0x92fd4b1fe816274d, + 0xc4189231f41835b9, + 0x6d548ea4341c6527, + 0xf1eb2597621e7493, + 0x1b9f2c754bcd72ef, + 0x1fed2a887cf3a16d, + 0x8c1a57b768e4afc9, + 0x7ef3812ba9f8ce37, + 0x2dea861cb6f9eda3, + 0x2a56cfdcb6edfc21, + 0x12af7c5436f12b7d, + 0xcf615a7325f43ae9, + 0x9a2f34d762f84a57, + 0x543ab8e871fa68c3, + 0xd18c4af87fed9841, + 0xca941ef87bcf859d, + 0xf465e71edae3c51b, + 0x6d248b51fae5d387, + 0x6e32adf219c8d2e3, + 0xb15e639548dbf261, + 0xc6deb87656ce21bd, + 0xa4e3b2d986d14f2b, + 0x286db73ba2d34e97, + 0x691f42dba1d76cf3, + 0x9ea1234cbfda8c71, + 0xc7894151feab79cd, + 0x427b39e21dcfa94b, + 0x542efab43ac2d8b7, + 0x9fcba3254ac6e825, + 0x7dfc246657c8f691, + 0xbf29c4d986ba15fd, + 0xb86e2c7ba5ce246b, + 0xdc56214fe4c153d7, + 0x61283da1f1d68245, + 0xeadc716543d782b1, + 0x7cf541243da98e1f, + 0xae81fb543d8c9e7b, + 0x135ec9d5498face7, + 0x46da25f989a2ec65, + 0x427dc6ecb795fac1, + 0xf6a8193ed6b81a3f, + 0x439ec5a1f4ac289b, + 0x6bd7c3f325be4819, + 0x359cfeb543c16785, + 0xa31e84b872b486e1, + 0xb2e3cd776ea7945f, + 0x47e91df76e7893cb, + 0xef41dc5bab8dc239, + 0x38bef27dc98fd1a5, + 0x14297fadc783def1, + 0xb6d4af7328951e6f, + 0x462f98e435872edb, + 0x4132fa87658b3d49, + 0x4def6b38728e4cb5, + 0x42519abdc4a18b23, + 0xdac9548cbe63798f, + 0xf6dbea7dcd6597fb, + 0x169db481fd5ac769, + 0x57d9fe621a7bc6d5, + 0xfd75ce432a8fe653, + 0xf431ce27698314af, + 0x8fd62c3ba897342d, + 0xa6378e1dc57a4289, + 0x79e8db2dc38b61f5, + 0x25349e6dc18d7f63, + 0xdb2f765dce517dbf, + 0x3f4de8921f649c3d, + 0x6bfa43132e45bca9, + 0xf318d6c54c59db17, + 0x23a49877695cea83, + 0xb6d314e9864ce7df, + 0x256ea47dc973285d, + 0x2b6fc9dfe47536c9, + 0x15e26431f28a5637, + 0xa96fe8d2126c75a3, + 0x7c34bf87637e9521, + 0x2a597e476f51a27d, + 0x89eb5a287d54b1e9, + 0x85bf3c1a9b36cf47, + 0x193678bba948deb3, + 0xb97e621dc85bfd31, + 0x75ba31ffe64f1c8d, + 0x4be53fc217523bf9, + 0xd8473fa328354b67, + 0x5be614a8724869d3, + 0x8716d59ba24c8951, + 0x8de192387f2e86ad, + 0x546f1cebae41c62b, + 0x2b8547ffec23d497, + 0x1265934fea27d4f3, + 0xb615a7f32b4af371, + 0x7f29c6b6584b12cd, + 0x9daef828785f314b, + 0x235b67ea96324fa7, + 0x976a1c5cb4367e15, + 0x86d3125dc2397d81, + 0x95f4871cbf197aed, + 0x8dce1461fd1e9a5b, + 0x4d27c1e43e21d9c7, + 0x1c8fb2476c14e935, + 0x9c4d38a65b26f7a1, + 0xa6c73de9893a271f, + 0x35879dcba81d257b, + 0x3581e7acb61f34e7, + 0xf3d9578fe7128365, + 0x1e9348b1f42683c1, + 0x4c26b8d65428913f, + 0x956ba7432de79f8b, + 0x7e4cdf2439ebadf7, + 0x261f7a3549efcd75, + 0x4beac26878e3fbd1, + 0x56fcb3eba8e61b4f, + 0xf52369eed5f729ab, + 0x3154c76fe5fc4a29, + 0xc236d5a213fe4895, + 0x743e98b654e287f1, + 0x863dc45871e3956f, + 0xa64d8f965fe694db, + 0x8ac52f187deac349, + 0xa352efb989ecd2b5, + 0x73cf29dcb9cfe123, + 0xcbf9d62fe9d4218f, + 0xc2b36d4217c52feb, + 0x948a3fd326d83e59, + 0x9eb231a763ea4dc5, + 0x1b9dc3a982de7c43, + 0x614279f982d17a9f, + 0x6d7cfe998fc4a91d, + 0x16a24cdcbed5c879, + 0x418dc2e1fab9c7e5, + 0x946d73a21abce763, + 0x59c3ab73279de4bf, + 0x9c52631879c4253d, + 0xf635c9a987d643a9, + 0x5dfa2cecb5da6317, + 0xaf63417cb4dc7183, + 0xb9cf846ba19b6ecf, + 0xb9356e4dcfa19e4d, + 0xa59ed4321f83adb9, + 0x5dcbfae43ea6dc27, + 0xa291e7854ca8eb93, + 0x62c9a755467ad8ef, + 0x32547be987af196d, + 0x5e68f37dc6b237d9, + 0xabc3152fe3c65847, + 0x3c6248e1f2c976b3, + 0xefa3c4d324bc9631, + 0xb26e7df541ae938d, + 0x873cad465e81b2f9, + 0xe153d7c98ea4d167, + 0x64c93d587a86dfc3, + 0x3ec5862cba89fe41, + 0xe49f7a1dc67b1e9d, + 0xb198a36fe68f3d1b, + 0xbd32968216a24c87, + 0x1e38ab4324956ae3, + 0x4c9fbe1653b98a61, + 0x4f98ab76516a87bd, + 0xc6df24598f6ea73b, + 0x94fcda1cbe81d5a7, + 0x752f1acedc94e615, + 0xa6941f2feb97f481, + 0xa4879f532a7913ed, + 0xde825fb5498d325b, + 0xcf6eb126568f41c7, + 0xc15fb36ba6937f25, + 0x7125f3ecb3857e91, + 0xe5c26f9ba1567bfd, + 0xa638fecedf4a9c6b, + 0x24c6e8d1fc4ebad7, + 0x5f6794832d71ea45, + 0xf975d4143c64f8b1, + 0x4eb781965b67182f, + 0x6d4a1fe8795a268b, + 0x6d74c1fba86c35f7, + 0x96b382edc38f6475, + 0xb6d7253fe57384d1, + 0x6147352fe176924f, + 0xfa764284325791ab, + 0x615fc8a43e4abf19, + 0xcb2fe8654b3dce85, + 0x8e41fcd87a52fce1, + 0x5fba148a9a641c5f, + 0x8234691ed8462acb, + 0xdc9b532fe75a4b39, + 0x38a624b1f63d49a5, + 0x4b1af783265f7913, + 0x7ad4e2665342967f, + 0x8f5a6398713495eb, + 0xe98423b87f28c459, + 0x352e1a498e2ad3c5, + 0xd1c9eb6bab5de243, + 0x1746af3edb53129f, + 0xc24d6981fa56421d, + 0x829ae6c21a273f69, + 0x48e59bc437294ed5, + 0x43ecb7d9862c7d53, + 0x2c9b81a8732e6baf, + 0x9c54638cb1439a2d, + 0xa73f251cbf14ca89, + 0x7d4156ccbd17c8f5, + 0x83415bd1fc1be873, + 0x1e594733291be5cf, + 0xaed39f587b31264d, + 0x94cd38a87a1534b9, + 0x2c9af47cba196427, + 0x2e54176dc61b7293, + 0x9327cdbba42b71ef, + 0x3876a2dcb21e8f5d, + 0x5182cedcbdf1aec9, + 0x8afc2eb21ef4cd37, + 0x49e61c732bf6eca3, + 0x76f84c165ae9fb21, + 0x7cba912658fc1a7d, + 0x39ec1a8876df28e9, + 0x672539adc8f24957, + 0x2b13e46ed4f567c3, + 0xdb2384ffe3fa9741, + 0x47fd5b3212fb849d, + 0xc6ab189652fea41b, + 0xf316bce65fe1d287, + 0xe2a3c8187bc5d1e3, + 0x54e9b1a98ac7ef51, + 0xb3c81a7a97c81fad, + 0x37d5e62ba7dc3e2b, + 0xc54b837fe5cf3d97, + 0x6c3472a217d26bf3, + 0xc7e4a85434e58b71, + 0x2bef8ac542e678cd, + 0xe8fa315761eca84b, + 0x1c6b79e65faec6b7, + 0xb29df43badc1e725, + 0x748f16eedbc4f591, + 0x1398a7bfe9b714fd, + 0xb287af4219da236b, + 0x2b1f6c5438bc42d7, + 0x3ae7958768cf7145, + 0x47a691c985c37fa1, + 0xdec7123a93b58d1f, + 0x7edf34bba1c69d7b, + 0xa74bfe6dcf89abe7, + 0x823be591fc9edb65, + 0x9e6df2c43da2f9c1, + 0x5c1e3d954cb5193f, + 0x6735db954ac6279b, + 0x1e9c8d3768cb4719, + 0x91537d2ba7bd4685, + 0x5e47ca2cb4af75e1, + 0x16ae493ed4b2935f, + 0x12c58b31f1a592cb, + 0xfac7652542b8c139, + 0x71d6ca832e7acf95, + 0xe82a6c554a7bcdf1, + 0xf9528be87b921d6f, + 0xa96814f879842cdb, + 0xb674ea5ed8a73c49, + 0xa3d24b8fe6894ab5, + 0x92e4c3a1f59d7a23, + 0x673c9f82139e678f, + 0x71cab8f5438296fb, + 0x31a6b2e871a4c569, + 0x73ab98c76f78c4d5, + 0xa7ce82da9d8be453, + 0xbaec7569896ce2af, + 0x6c12493feb91432d, + 0xd72b51c1fba54189, + 0x657cfd2219874fe5, + 0x8c36a973258a7e63, + 0x28dcfb35435a6cbf, + 0x49fd5ae8726f8b3d, + 0x647f53b98162cba9, + 0x36e81cdcbf65da17, + 0x6eda542dcd57e983, + 0xe876294dca49e6df, + 0x1bc693532b6e175d, + 0xb17d2fe54b7135c9, + 0x6b94cea98b946537, + 0xa3f5e16cb96874a3, + 0xf514763dc67b9421, + 0xf34265ecb35c917d, + 0x5ac3d81cb14e8fd9, + 0x2467fe3edf52ce47, + 0xb5fc86d21f45edb3, + 0xe953d6c54d58fc31, + 0x12b37da65c4a1b8d, + 0xc7145987684d2af9, + 0x41ead72dcb514a67, + 0x2617fa9dc95468d3, + 0x297c415fe6479851, + 0x2a7c6d31f23985ad, + 0xe69253b2134da52b, + 0xa72dc896514fc397, + 0x1964df287e54d2f3, + 0x472bc8ea9d46f271, + 0x61b4d32a9b4821cd, + 0x5b269aedc94a2f3b, + 0x3e2f567dc82d3ea7, + 0xc87be351f9427d15, + 0xa57e918329347c81, + 0x72c48594342579ed, + 0x35d82eb76328a95b, + 0xd398c147612db8c7, + 0x2386fbaa9e1fd835, + 0xd37851ccbd23f6a1, + 0x67f54beedc37261f, + 0x29a18361fc19247b, + 0x6e83d1f32a1b43e7, + 0xeafc1bd54a1e7265, + 0x8ae39db8794382c1, + 0xa6b3c18a96148e2f, + 0x4c8219dba3159e8b, + 0x4cae753cb218acf7, + 0x7adb8cfa9efadc75, + 0x1c9625ecb9fcead1, + 0xb6149fa43ce21a4f, + 0x4cae8db43cf428ab, + 0x734bf2965bf74829, + 0xb5c972a768fb4795, + 0x17dc62fa95ec76f1, + 0xc3b8754ba3de846f, + 0x94b5e8fdc4f293db, + 0x48d3c56fe1f6c249, + 0xa9feb8d432f8d1b5, + 0x87bd5ae54ecadf13, + 0x162efdb439abed7f, + 0x31f289e769c12deb, + 0xf12bc3598ae43d59, + 0x83b2415ba8e74bc5, + 0xfb32749ed6ea7b43, + 0xd3f4c67fe3dc689f, + 0x135b4ae324cf981d, + 0xf39185c543e2c679, + 0x352dba6871d4c6e5, + 0x1ef3c9487fc9e563, + 0x98e7ab276ca9e3bf, + 0x81a6432a9abe143d, + 0xd2f6345febd142a9, + 0x6c4857d1fad56217, + 0x7ac2956219c86f73, + 0x135b6fd324a86dcf, + 0xb9f8cd6653ab8c4d, + 0x9f37ab2652af8cb9, + 0x1f63a2ba91c3db27, + 0xd46ef3a98fb5ea93, + 0x19b34c2bab96d7ef, + 0xec84bd11fcab186d, + 0x576def821bae26d9, + 0x9e58d7443bc15647, + 0x1dfb729769c475b3, + 0x597c23eba7c89531, + 0x41f39a5874ba928d, + 0x378d965cb38ca1f9, + 0x34b85aedc19ebf57, + 0x5f73c14cbf82dec3, + 0xf3a9cb632e96fd41, + 0xe82d5a743e871c9d, + 0x614dfe865d8a3c1b, + 0xd64b8a165a9e3b87, + 0x4d987cecb8a169e3, + 0x53927e8ed7b48961, + 0xd86ca15fe39586bd, + 0x9d15a471f289a63b, + 0xf38a4bd2128dc4a7, + 0x574a23d7629fd415, + 0x741c2de76e94f381, + 0x49ce8f687c8612ed, + 0xf68cbe5bad89315b, + 0x581f76ddc96a3fb7, + 0xb83529ddc98d6e25, + 0x2c15eb81f6827d91, + 0xea396b8215637afd, + 0x698d375323759a6b, + 0x31e9f8a54258b9d7, + 0x5bd12ec9817cd945, + 0x3af247c98d5fe7b1, + 0xae63751cbd84172f, + 0x614ac27fed76258b, + 0x51d7ba3feb6934f7, + 0xbfa74e921b8c6375, + 0x29f7ac55496e73d1, + 0xf185c9476872914f, + 0xcb8f34a874538f9b, + 0x7915eb2ba356be19, + 0x2d675c3cb149cd85, + 0x23b7f5da9f4adbe1, + 0xd9a124bdcb3dea5f, + 0x82bca9d21e5329cb, + 0xe73b4f932d564a39, + 0xea7c43276c3948a5, + 0xd2ba3cfa9a5c7813, + 0xf642db1ba63d857f, + 0x2db43aedc65194eb, + 0xf1bd936fe264c359, + 0xb6ec3241f147d2c5, + 0xc78fbe96526ae143, + 0xfa5c64743c2ade8f, + 0xae43bd665a3d1efb, + 0xd1c2b9698c423e69, + 0x1ba3487a9a264cd5, + 0xf9a8371eda297c53, + 0xb7e4952ed52b69af, + 0xa1248391f53e892d, + 0x9e83cda32531c789, + 0xc51ab3276423c7f5, + 0x4ace386a9128e673, + 0x4c81bd576d18e4cf, + 0x457e6d8a9e2c154d, + 0xc1b395dbac1f23b9, + 0x8753bd4fec146327, + 0xe9dc1831fb267193, + 0x7ac58eb328176edf, + 0xc6a89fb4361a8e5d, + 0xd73b8266541e8dc9, + 0x8a63fe7a9521dc37, + 0x4df8a1ca9214eba3, + 0x56db71ca9de6fa21, + 0xe78d49ccbcf8197d, + 0xa9e5fc3edafb27e9, + 0x58f9c6d21bfe3857, + 0xf92157a54af176c3, + 0xe265f3487af59641, + 0x8a4f6c1875f6839d, + 0x9b51f43985f9a31b, + 0xd43f8c9ba3fdc187, + 0x2c5be6aa91cebfd3, + 0x14a3267cbdc3fe51, + 0x85a794d32fc51ead, + 0x3698b7f54ce83d2b, + 0xdbc692154aeb3c97, + 0xe5ab19d768cd5af3, + 0x41f8c72cb9e28a71, + 0xde837f2ba5e387cd, + 0x3e6a7bfed3e6a74b, + 0x495a2e11f2e9c5b7, + 0xb8e7cd4213ecd625, + 0x49827ca652cfe491, + 0xfa519cd76eb413fd, + 0xcb12e6f98ed7326b, + 0x94df2cb98bc941d7, + 0x25ce6fdba9cb6f35, + 0xd18fe64dc7bd6ea1, + 0x3791a5ffe6b28c1f, + 0x9acd2e7215d39c7b, + 0x3f1ab59323c5bae7, + 0xb5e8316542c9da65, + 0x93d8f15762abe8c1, + 0xaefc52376c9de73f, + 0x18b4639baec3269b, + 0x6423facfedc74619, + 0x32bcd581fbca6485, + 0xfb317d9329ab74e1, + 0x28e6a51437ad825f, + 0xef48dc9656a291cb, + 0xa3246b9875a4bf29, + 0x7a35cdb982a6ce95, + 0xdf918e2ba298dcf1, + 0x56ce412a9d7aeb6f, + 0x812f39cfec7f1adb, + 0xa2b634e21ea23b49, + 0x37c6d5932da649b5, + 0xe8cb76d65cba7923, + 0x2af7c895459b768f, + 0x78a614ea947d85fb, + 0x27e6934ed5a1c469, + 0x825b9dafe294c3d5, + 0xb68179e1f1a8e253, + 0x19b7a4543278e1af, + 0xb7e38f665f8c312d, + 0x9e2cf7654c6e2f79, + 0xf169cbd87b824de5, + 0x17cdf65bab957d63, + 0xadf892bdc8576abf, + 0xc386b75fe56b8a3d, + 0x156d73a1f35eb8a9, + 0xd2a576443582d917, + 0xd7ca39865294e783, + 0x51dfb9654176e5df, + 0x64dc1a598f7a165d, + 0xdc5fa4698e6d24c9, + 0xfac3184cbc8f5437, + 0x2fa4395fec8472a3, + 0x9eb4c851fb879321, + 0x3796bd5219478f6d, + 0xd74a3f53254a8ed9, + 0x9bd82537635ebd47, + 0xe421dab98461ecb3, + 0x716f9b5ba275fb31, + 0xc846391cbf461a8d, + 0x6b1d7a4dcd4a28f9, + 0xcd579631fc4d3967, + 0x47fab6c21b4f57d3, + 0x15a8b9f54c639751, + 0x3297cdf7693584ad, + 0x17dba43a9758a42b, + 0x243ec1fba54bc297, + 0xd745b89ba45dc1f3, + 0xa3e5f27dc352ef61, + 0x61735a9dce341fbd, + 0x584e96d21f472e3b, + 0xf8175d654e293da7, + 0x8f5cb6487b3d6c15, + 0x6421a5f87a3f6b81, + 0x6827cd4ba93278ed, + 0xacb1837ed724a85b, + 0xda1386bfe428b6c7, + 0x8e27b1c1f42bd735, + 0xfbd637a3243de5a1, + 0x17e6d5498463251f, + 0x3946fdc98f15237b, + 0x4a1536ea9d1842e7, + 0x724c5f6bad2b7165, + 0xdc42975ba92c6fb1, + 0xa54f679cb81e7d2f, + 0x5ea63c71f6129d8b, + 0xfcbd5e832614abf7, + 0x17524bd43418db75, + 0x729fd587642ae9d1, + 0xc8af45b8721ce84f, + 0xa74128b76def17ab, + 0x4a36c1ecbdf34729, + 0x958cef6edcf74695, + 0x4276e19edae975f1, + 0xcb89d6a219eb836f, + 0x47ec598436fe82db, + 0xca74189767f2c149, + 0x28c14be874e3cfa5, + 0x425871da94f7de13, + 0xa263df4a91d8ec7f, + 0x4591a3298fda1ceb, + 0xc472d59febdf2c59, + 0xf56be4321de24ac5, + 0xd5a638e32ce67a43, + 0xe2846cd43ad8679f, + 0x812b493656eb971d, + 0xd4ae6c9984deb579, + 0x5817926ba6d1c4e5, + 0x8deb491dc2d5e463, + 0x17b6a95ed1c6e2bf, + 0x84f9e6d654ea123d, + 0xfb162a754fcd31a9, + 0xe7af9b154bad3ef5, + 0xcd264a198bc26e73, + 0x51d392c878a46bcf, + 0xf482b7dba6c78b4d, + 0x19f4873fe4dc8ab9, + 0x42c983d1f4beca27, + 0xad8b6e4325c1e893, + 0x7295fa8542a3d6ef, + 0xb234ecd652c8176d, + 0x7529acb76fba25d9, + 0x8d5731ca9ebd3547, + 0x7c82d6aa9caf64b3, + 0x8149fa2febc59431, + 0x6381a2b1f7b5918d, + 0xd39ea86215a68fe9, + 0xbde34653249abe57, + 0xa2c798e6548ebdc3, + 0xf61c934985a2fc41, + 0x94e5df6982a41b9d, + 0x2934df5dcf973a1b, + 0xf68ca5bede9b3a87, + 0xe5924861fb9c58e3, + 0xd843be932caf7861, + 0x574fec243a9285bd, + 0xf9d32ab54896a53b, + 0x45cea8276598c3a7, + 0x6973cb1ba69bd315, + 0x6a74cd8cb49de281, + 0xe24d16bdc49321ed, + 0xe59a8f2ede852f4b, + 0x4d635ae21f863eb7, + 0x961ce2843e8a6d25, + 0x19853cd54b7d6c91, + 0x2e3f8b95485e69fd, + 0xd7541ebdc872a96b, + 0xf4adb93dc564b8d7, + 0xa5468f1fe379d845, + 0x1bdcea61f37ae6b1, + 0x2b4fdec2137ce52f, + 0x4cb375a76391248b, + 0xfd759c476e8543f7, + 0xe8d75f3bae896275, + 0x7aef635a9c6a72d1, + 0x64c2de1ba95b7e3f, + 0xa9d743fdc64f7e9b, + 0xb654de31f763bd19, + 0x7cd483e21764dc85, + 0x6a8e45b43457dae1, + 0xf4d1b2a7624ae95f, + 0x45912a68725e18cb, + 0x2c73514cbf614839, + 0x7a5316bdce6347a5, + 0xb3ca147fed598713, + 0x3a615dbfeb3a847f, + 0x9bc785f2194c83eb, + 0x5c6e89d4384fb259, + 0x14582ac87863d1c5, + 0x28e1d3ca9756df23, + 0xb1d5638a9236ed8f, + 0xc1257deba2491dfb, + 0xc6e59d1cbf3e2d69, + 0xa6213de1fe314bd5, + 0x6c987a521e247b53, + 0x874c9b243c2568af, + 0x4cfb19365b3a982d, + 0xf3c92676572db689, + 0x3f8ad46a972eb6f5, + 0x127dfa8dc842e573, + 0xa3c56d4cb425e3cf, + 0x2ace3b71f259134d, + 0xb2c9f4d6514c32b9, + 0x7bef25976f3e5127, + 0x48ab9e587d216f83, + 0x91e5ac387a136cdf, + 0xad5e217a9a168c5d, + 0x76852fced6178bc9, + 0x638a4bdfe61dcb37, + 0x6a1f795fe51fd9a3, + 0xd7f429a65734f921, + 0x7f9a8ed76425187d, + 0xa4d9b6c8731826e9, + 0xc14f7e298efb3657, + 0xbdf4c2e98bfd65c3, + 0xdc96f27babef8541, + 0x9e4f72ddcaf3829d, + 0x2978561fe8f6a21b, + 0x4c76ad5215e8bf67, + 0x746ead8325f9bed3, + 0xd15fe98764fced51, + 0x3c91a4f874f21cad, + 0xf3ec421a91f53c2b, + 0x9b8d4c6bafe63b97, + 0x419ca53cbcda59f3, + 0x8b75ed61fbed6971, + 0x6a37928219bf76cd, + 0xd7f4be2439e2a64b, + 0xe5d1f7c438e5c4b7, + 0x5cb9a47987e9d425, + 0x254bfae985dbe391, + 0x71d5fbe983abe1fd, + 0x49c8f3bed4e2316b, + 0x257a36cedeb43fc7, + 0x8f54a7321fc86e35, + 0xe74f91243ec96da1, + 0x7965c8a549ac7b1f, + 0x7eb231f546cf8a7b, + 0x9f32c4e986c2b9e7, + 0x5f7c893cb7c4d965, + 0x268c59eed4b8e7c1, + 0x8b5e647ed2bae63f, + 0x865b9f7323ce159b, + 0x481d352873d24519, + 0xa9ec85387fc46385, + 0x5e84f1b76db873e1, + 0x8bcde1387cba815f, + 0xfd178e2a968c7fab, + 0xb23d147dc68fae29, + 0x2ed17a31f6a2cd95, + 0xec18f6932695dbf1, + 0x94bd1a732397ea6f, + 0x68cd94f6538a19db, + 0x9cd241a871be2a49, + 0xadb61cfa9fa148b5, + 0x9d7bf12dceb57823, + 0x467c3fbedca6758f, + 0x2fa7913fea7984fb, + 0xc9de75421a8db369, + 0xe7bf1a24378fb2d5, + 0x1643cf8878a4e153, + 0xa79c35e76374de9f, + 0xe15cb34ba4982f1d, + 0x18eda9fdc18b2e79, + 0xc5bd316baf7d3ce5, + 0x2dec3861fe917c63, + 0x7bda8c421d7369bf, + 0xa73bd9e32c76893d, + 0x12a94fe43c58b7a9, + 0xfa317496596dc817, + 0xbc4e561ba57fd683, + 0xedc4135ba572e4df, + 0x756d231fe397145d, + 0xca2e1b51f17823c9, + 0xcd2e1b95419c5237, + 0xeb293d754f7e61a3, + 0xedc7a1554b516def, + 0x93ed54187b538e6d, + 0x91df65287a458cd9, + 0xfc567a8ed859bc47, + 0xc13849ffe65cdab3, + 0xf6b1a35ed56fea31, + 0xfabe47632563198d, + 0x96218cf5436527f9, + 0x2fb685da915a3867, + 0xd739eb698f4b56d3, + 0x12c6847bad4e8651, + 0x5a2f1d7cbc5183ad, + 0x6b4a759fec65a32b, + 0xed37a851fa46c197, + 0x764825f21748bfe3, + 0xe462a174374bde61, + 0x7e8d3426543efcbd, + 0x36d5bf2a95642d3b, + 0x6c4e293cb1453ca7, + 0xd73f5bedcf396b15, + 0x51f6c38ede3c6a81, + 0x2b4951c1fa2c67ed, + 0xb84fec632d31a75b, + 0xd13e67854a23b5c7, + 0x6e95d1f87a28d635, + 0x3b7c56d98739e4a1, + 0xb4e852aa964be31f, + 0x72b3f41dc54f127b, + 0x96348faed25341e7, + 0x2671cf8ede176f45, + 0xbdc256943f286eb1, + 0xb8ef3ac54d1a7c2f, + 0xc521a6854a1e7c8b, + 0x398a74c76921baf7, + 0x4ad2c1fcb913da75, + 0x149efdccb726e8d1, + 0xeab5983dc519e74f, + 0x85214371f42d16ab, + 0x651c7295451f3629, + 0x3f51ce7983126495, + 0x4cbd2ef76de574f1, + 0xb21cf7e65ce7826f, + 0x1db57e976af981db, + 0xa93fe15987ecaf39, + 0xbe576d1a96dfbea5, + 0x61db7e4dc7f4ed13, + 0x7c65dea215d4eb7f, + 0x712b9e6434f71aeb, + 0x4ed8f12763fc2b59, + 0xbe9f361871fe39c5, + 0x9c8eb3fbafe17943, + 0x53db8e6bacd3769f, + 0x958d671dcbe7961d, + 0x4d9ce671f8eab479, + 0xf87cdbe218dcb3e5, + 0x8ea362c548cfd263, + 0x8613fbd656c3e1bf, + 0x34c6e1aa96e7213d, + 0xe57463dba3d72f89, + 0xc617a85a91ca3df5, + 0xbe81d93bafbe5d73, + 0x4365fa7fedb16acf, + 0xa5fb8dc21ec38a4d, + 0xa3cd1f832cd5a8b9, + 0x9816c53548dac927, + 0xa628743656bcd793, + 0x3a9efdc8749dc5ef, + 0x1784adccb7c3156d, + 0x1697df3fe3c624d9, + 0x75642e31f1da5347, + 0xdac8bef541dc62b3, + 0x71f9a3e65fbe8231, + 0xea5b18654ca18f7d, + 0x3b268de65ba38de9, + 0x5234ac6989a6bd57, + 0xd79b458ba698dbc3, + 0x153427fed69ceb41, + 0x584f23adc37ef89d, + 0xefa639c326c4391b, + 0xcde8532542c53987, + 0x2c5df19761b957e3, + 0x167df4865fac8761, + 0x7c5e3d976c8e74bd, + 0xbd96784dcd91a43b, + 0x36db97afeb94c2a7, + 0x758dce61f9a8d215, + 0x4e9bfa532689df71, + 0x9e5c38132469fecd, + 0x2418d9a7658f1e4b, + 0x26aedc7984923db7, + 0xd8f3ae1cb1a76c25, + 0x28d579fdcf786b91, + 0xfa14ed8cbc5a68fd, + 0xbc3685e1fc5e986b, + 0x8416ec932c81b6d7, + 0x984cfb332b93d745, + 0x17f8ac654987e5b1, + 0xb2c6f9598679e42f, + 0x17b24e6ba57d138b, + 0x6d9ce2fcb48e32f7, + 0x3c752a1fe2a36175, + 0xf2619bcede756fc1, + 0xe3f4bc521e587d3f, + 0xbd489f132e4a7d9b, + 0x721df5c54b5eac19, + 0x42d65f987a61db85, + 0xfc1ed56ba864d9e1, + 0x6ac7125cb746e85f, + 0x81b9f6dfe45917cb, + 0x986db4c1f46d2739, + 0xce9b32f2127f36a5, + 0xdeb69f8872948613, + 0xe31485d76e45837f, + 0x12ebdc476d4782eb, + 0x375d49f98d4cb159, + 0x3de8457a983dafb5, + 0x375d128dc961de23, + 0x8f971b4ed643ec8f, + 0x14b3dc6327461cfb, + 0x4c1bf7d4354a2c69, + 0xd46b18c8724c3ad5, + 0x715dc8ba914f6a53, + 0x857bcd2a9e3267af, + 0x58c3eadcbe35972d, + 0x739d48afed27b589, + 0xcf15a49fe92ab4f5, + 0x475c26a21a2ed473, + 0x8eb649f65841e2cf, + 0xa4d27fb98956124d, + 0xc9d37b8ba64731b9, + 0xad75219cb53a4f17, + 0x4ef67a8cb12c5e83, + 0xe18426da9c1e5bdf, + 0xe27a94b1fe128b5d, + 0xe63a94732e148ac9, + 0xbc5fe2154d18ca37, + 0xace6f216591bd8a3, + 0xb25e1c68793de821, + 0xec3f24acb932167d, + 0x4823a6bdc71425e9, + 0x89b34a6fe6193457, + 0x64d3be21f21a64c3, + 0x4a593727652d8341, + 0x6fac21943cfe719d, + 0x8d1fb3554bd18ef9, + 0xf2ac3b665af3be67, + 0xdc92afb878f6bcd3, + 0x9f1e852ba7f9ec51, + 0xb179c46984ebf9ad, + 0xaf38562ed5ef1a2b, + 0x95a6287215f23a97, + 0x5de6fbc542e658f3, + 0xbc2a84e652fa6871, + 0xa2d591b54fea75cd, + 0xb25fe9d87cde954b, + 0x5423b18a9ae1c3b7, + 0x18f7e26dcae6d325, + 0x6357dba1f8d7e291, + 0x92f8dc5215a7cfed, + 0x42859f1436dc1f5b, + 0x348bfc2654bf2ec7, + 0x57e8124a94e26d35, + 0xfe4c5b3a92e56ca1, + 0x2f76de5a9ec87a1f, + 0x8b7c5efbaedc897b, + 0x9b14a281f9bda8e7, + 0xb3598d432bc1d865, + 0xc76415d439b4e6c1, + 0xc192f3e548b7e53f, + 0x84ac215876da149b, + 0x145892bba6cd3419, + 0x781c543cb3cf4285, + 0x12c3b7eed3c472e1, + 0x758fa1bdcda57e4f, + 0x7b5d8a921f967eab, + 0xb965ed743e8bad29, + 0xfe842ca43a8ebc95, + 0x8afc47b76892daf1, + 0xf96531d987a3e96f, + 0x8b216a7dc5a618db, + 0x6c97dbafe5cb2849, + 0x36718d21f2ad37b5, + 0x6359aec214bf6723, + 0x23f98e7651b2748f, + 0x6fd39b554e9583fb, + 0x4eb376a65ea8b269, + 0xf4a621987c8ab1d5, + 0x8e75196ba98dcf43, + 0xdea6c83cb671ed9f, + 0xebd9c251f7952e1d, + 0x53afb4d215a62d79, + 0x7e56f38324893be5, + 0x6ac93858729d5b63, + 0x5937cb87617e58bf, + 0xb653e17baf72983d, + 0x483729adce74b6a9, + 0x5c964a7fed89c617, + 0x41d6bc51fa7bd583, + 0x4f926752186bc3df, + 0x345829f76a92135d, + 0x895bf2d7678532c9, + 0x9d485a7cb6a95137, + 0xc57ea8fcb27a5f93, + 0xbd61c38a916a5cef, + 0x376ef19bae4f7c6d, + 0x3954ba71fe528bd9, + 0x784cf5d21e65cb47, + 0xf176de932c57d9b3, + 0xe4fab7c65a6be931, + 0x182b93a6574cf68d, + 0xa7cef23cb87126f9, + 0x2a41567ed8943567, + 0x42b9a8cfe27865d3, + 0x382d9751f27b8451, + 0x1d824b54315c72ad, + 0xf2b86e554e5f912b, + 0x6a2bfed65d42bf87, + 0x2f369ed87a45bde3, + 0x8bc3e2da9a48ed61, + 0x76b52ada9638fabd, + 0xbc4f579ed75e1c3b, + 0xbc1248d1f6513ba7, + 0xcd45837328746a15, + 0x6e38c74653476981, + 0x8f673eb6513976ed, + 0xc4d926e87f2d965b, + 0x3abef5198d2fa4c7, + 0xc18a243cbc62d435, + 0x35c1e7fedb46e3a1, + 0x97536fced948e21f, + 0x1f7d59c4394c217b, + 0x6e97a285463c2fd7, + 0x4cbf126a98316e45, + 0xea1b42ca95346db1, + 0x83fe9cbba1367b2f, + 0xb95d463dcf197a8b, + 0x5da94c6cbd1ca9f7, + 0xd1a8b32feb1fc975, + 0xeb9257154b23e7d1, + 0xa9c2b4143a15e64f, + 0xe3f5dc17692815ab, + 0x4fdec16ba81c3529, + 0x5316cafcb71e4395, + 0x4239d16dc64273f1, + 0xf3a24c7ed324816f, + 0x4dc8593bade47fcb, + 0xfed5a2321df7ae39, + 0xfd3584b32cf9bda5, + 0x8326ba4659fedc13, + 0xd2bf139658d1ea7f, + 0x2754ca9987f419eb, + 0xe387ba9dc6f72a59, + 0xf275e6bed4fa38c5, + 0x129bc6afe2fd6843, + 0xe548ab7212de659f, + 0xc72e354762f3951d, + 0xd367b8254fe5b379, + 0xf8e159d76cd8b2e5, + 0x9a5421798aebd163, + 0xae16f398769bceaf, + 0xdf2785ccb8c31f2d, + 0x6e2c1a91f6d42e89, + 0xa9326e4216d73cf5, + 0xb45f1cd324ea5c73, + 0x391bcea542db59cf, + 0x34cf2d9761cf794d, + 0x829ad5c76fd2a7b9, + 0x397bf82baed5c827, + 0xf37dc1afebc8d693, + 0x527fca8ed7a9c4ef, + 0x75364be218acf36d, + 0x4978d2a658c123d9, + 0x7fc5e43989d65247, + 0xa85bfc2a95d861b3, + 0x451f863a94ca7f21, + 0xe8c75b4a91ab6e7d, + 0x93bf815bad8f7ce9, + 0x7dae4351fea2bc57, + 0x596fbe221e95dac3, + 0xc29ed7b43cb8ea41, + 0x9abd4164368af79d, + 0xa1befd3767ae281b, + 0xa5f821dcb9c13687, + 0x4d7f591dc7b456e3, + 0x27a1c5dfe3c98561, + 0x84573921f1a973bd, + 0x62d1fac541ad923b, + 0x5297bc143e8fb1a7, + 0xdcf832665c82bef3, + 0x5d3c94a76b95de71, + 0x9c62e1465876fbcd, + 0x2f5ae84dc78a1d4b, + 0xb7e8124ed58e2cb7, + 0x9d64c211f7a16b25, + 0x1a46d3f325b46a91, + 0x61b8dcf4329567fd, + 0x298ab355418a976b, + 0xc1f35be54f6ca5d7, + 0x7bd326ca9d8fc645, + 0x72c3f1dbac83e4b1, + 0x1ed8526dca86e32f, + 0x62c53e11fa79128b, + 0xdb4183c3298b31f7, + 0xcf9a61d3278d3f65, + 0xe298c54875826ec1, + 0x6148fada92847c3f, + 0x81db52eba1657c9b, + 0xa5e8136dcf58ab19, + 0x8daf465cbe4dca85, + 0x29ce47beda5fc8e1, + 0xa697cde21b62e75f, + 0xc12694f43a7516cb, + 0x1dc693265b7a2639, + 0x75c8f63a987c34a5, + 0x186cfa9cb68e7513, + 0x576f4addc461827f, + 0x5f6a749ed26481eb, + 0x59ce714ede36af49, + 0xa43d2bc21f38aeb5, + 0xcfd53e154e5bcd23, + 0xb7296a55493edb8f, + 0x2fe8a14879531afb, + 0x468f3abdca452b69, + 0x34d2a17dc74839d5, + 0xd1a2f57fe74c6953, + 0x5f73164fe23d56af, + 0x956a8fb43451962d, + 0xc9243df76153b489, + 0x38f4eb776e27b3f5, + 0x4c17b2598e4ad273, + 0xfa18e4d8793ad1cf, + 0xca6425fa982cef3d, + 0x81cbe97ed8432fa9, + 0x28bde511f9364e17, + 0x53e8acd217295d83, + 0x1759a64434295adf, + 0xd137a827632e7a5d, + 0x9af34e187231a8c9, + 0x1e327cfbaf14c937, + 0xde7ca24cbe16d7a3, + 0x6438ef5edc3ae721, + 0x5c3b17ffe91bf47d, + 0x9e25f8d43a2f14e9, + 0xbec63d498b124357, + 0x46ad9eb9891762c3, + 0xc68325dcb73a8241, + 0xc7d1382a931a6f8d, + 0x4c15d9eba21c7df9, + 0x3b8d26ca9cefad67, + 0xf724561feaf2cbd3, + 0xb1d5c9a32cf6eb51, + 0x1563a98329e6f8ad, + 0x3d291f8658fc192b, + 0x4a98172656fe2897, + 0x5d63bf4ba8e157f3, + 0xdfab591dc5f48671, + 0x8da29f7cb2f674cd, + 0xc51b348fe1fa934b, + 0x82a46fd431fda2b7, + 0xba2ced554edfc125, + 0xe3867c165bc3df81, + 0x976ab1c658a4fced, + 0x21be845879d81e5b, + 0x253876ca96ea2dc7, + 0x321ec84cb7de4c35, + 0xcab61721f5e26ba1, + 0xcb4f965325d4791f, + 0x8596d7b432e5987b, + 0xf98e216541d9a6e7, + 0x29e68bf54fbdc765, + 0xae3bc5487bafd5c1, + 0xcb7ad43a9ab2e43f, + 0xf2d8b5cfead6139b, + 0x72be4c61f8da4319, + 0x617abcd329dc4185, + 0xd25cf64436ac5fd1, + 0x392d51e765b17d4f, + 0x7ca5e19762c37dab, + 0x64eb159981d6ac29, + 0xb895ed387fa8cb95, + 0xf328ce6bad8bc9f1, + 0xfd13582dca9ed86f, + 0x5e6c87a32ca317db, + 0xf7dc62843bc62749, + 0x358b6ca548c936b5, + 0xe24f13aa98bc7623, + 0xa7356cda94ad638f, + 0x84253abdc4a182fb, + 0xfb65ca1fe2c4b169, + 0x61ecabfede86afc5, + 0xe976b5d21f89ce43, + 0xcd8fb7932b6adc9f, + 0xb7682155497efb1d, + 0x2ca4db876ba32c79, + 0x28af941cb8963ae5, + 0xef467cbed7b95a63, + 0xa67e541ed38a57bf, + 0xd68c75e1f29e873d, + 0x6e8cb4f32381b5a9, + 0xf8ae941762a4c517, + 0xa4e876d65f97d483, + 0x26e78a365b68c2df, + 0x4afec9298a7bf15d, + 0xf8369decba7f21c9, + 0xbc58e6aeda934f27, + 0xeab63241f7865e93, + 0x8d34e72214675bef, + 0x76d983f3235a7b6d, + 0xba6d3185425e7ad9, + 0xb64581ca9281ca47, + 0x25ea63fa9f64d8b3, + 0x9e3c85dcbd67e831, + 0x2735fa9dcb49f58d, + 0x189d65ffea6c15f9, + 0xec287bf21b8f2467, + 0x468dbfe65a8264d3, + 0xe47c1fb76a978351, + 0x5fb768aa945871ad, + 0x86dcf54a935a8f1b, + 0x12458f6cb14dae87, + 0x362bf4cbaf51bce3, + 0xc7235ed1fd54ec61, + 0x57e84ba21c35f9bd, + 0xfa8c61b54d591a3b, + 0x79a832f65b4d29a7, + 0xdb1a26998a6f4915, + 0x3769db2dca536781, + 0x928d57acb63475ed, + 0xdab97f4fe238945b, + 0x76c8bea1f14ba3c7, + 0xf53ba7c5416ec235, + 0x2c7b5d176f53e2a1, + 0x146ec7b65a23cefd, + 0xba6134998c371f6b, + 0x4ca9d7b98a392ed7, + 0x37fed98cb92c3d45, + 0xa7fc361ed73f5cb1, + 0x527ca83fe6437a2f, + 0xfb36e8a21524798b, + 0x2a769f154326a8f7, + 0x13a5ce77612bc875, + 0xc51b93687f2ec6d1, + 0xc285a61a9c21e54f, + 0xbd286fadcd2514ab, + 0x3af2154fec183429, + 0x2ca4d751fa1b4295, + 0xbcd13e85493c62f1, + 0xf186cb94371d6e5f, + 0xae573c4765127ecb, + 0xc4def6298415ad39, + 0xca8472ea9217bca5, + 0x914d6c298ef9db13, + 0xfdc521798aebd97f, + 0x4e7251bba8cdf7eb, + 0xb953a8421cf32859, + 0x5be976832af637c5, + 0x2bf43dc659fa6743, + 0x32568ea875eb649f, + 0xa1458bea95fe841d, + 0xb467a93dc4f1b279, + 0x38f415bdc2f4b1e5, + 0x5f764dccbed7cf53, + 0x9de8c7a21eb7cdaf, + 0xce467df439bafc2d, + 0xfc9213d54acf1d89, + 0x1afec42879d23bf5, + 0x3c9465bba9e65b73, + 0xb3f4e92ba4d758cf, + 0xade87b4dc3eb784d, + 0x14796281f2de86b9, + 0xf681cd7434e1c627, + 0x5be84c7761e4d593, + 0x5a9176e54da6c3ef, + 0x2d9e6bf65cb9f26d, + 0x56238ba87abc12d9, + 0xd658a12cbacf3147, + 0x8ec927fed8c25fa3, + 0x6e598b31f8c67e21, + 0xd6fc72b214b86c7d, + 0xfa3cd59323ca7be9, + 0x12a83be542ceab57, + 0x94abf1c872b1d9c3, + 0x6db241c98fb5e941, + 0xf17ba6398ca5f69d, + 0xc79f531fedca271b, + 0x19a6d341fabd2587, + 0x26b48f5219af45e3, + 0xce7134f65ac38461, + 0xc3df568546a572bd, + 0x649c3a1875c8913b, + 0x2e148fc7628baf97, + 0x78ca1eba918cadf3, + 0x3a249f5cbf92ed71, + 0x2d96c58feb73facd, + 0x45ebcf832e971c4b, + 0x2154e9a43d892ab7, + 0xe4185a776b9d4a25, + 0xed1bac8767af5891, + 0x9cb7582ba59276fd, + 0x2a418cbed3a4956b, + 0x369a425fe298a4d7, + 0x1db92651f19bc345, + 0x65ec9125428ed3b1, + 0x7d9ba4865d83e12f, + 0x3bd4c7f76e95218b, + 0xadc893f65b862fe7, + 0x6324e17a9b8a3e65, + 0xc7fde6bba87b5dc1, + 0x92d53b1dc57e6b3f, + 0x53c6d121f4627a9b, + 0xfeb6a9c32475ba19, + 0x5bc14e843267c985, + 0xe9acd726526ac7e1, + 0x15f83c487e4cd65f, + 0xc8adbf4a9e7215cb, + 0x6d2a9e8dcd862539, + 0x1dfc428fec7843a5, + 0xa498d131fa8b7413, + 0x64758b93295c617f, + 0xdf9184e3254e6fdb, + 0xc162a4987562ae49, + 0xfa17b5d98264adb5, + 0xf75d648ba168dc23, + 0xce4856287e39da8f, + 0x5e3d1baa9a3ce8fb, + 0xe8934511fd512a69, + 0xab8ed4921c6438d5, + 0xd8cf93a32c496853, + 0x1e75c965483965af, + 0xcb75814a974c852d, + 0x4eaf8c6cb54fa389, + 0x8b7596fdc463b2f5, + 0x9814367fe256d173, + 0xd74e5f8bad26cebf, + 0x8be934d21c29fe3d, + 0x8db51e654c3d1ea9, + 0x179be5398c524d17, + 0x3a2b86ca9b245c83, + 0x2def846ba82659df, + 0x9b748dfdc62a795d, + 0xd743f18fe42d87c9, + 0x5483a2cfe42fb837, + 0xcb98d6a21542d6a3, + 0xd3641b798347e621, + 0x3adebc965e18f37d, + 0xc6158b987d2b13e9, + 0xc6384e9bac1e3257, + 0xf23bc49edb4261c3, + 0xe816fcaeda257f31, + 0xbe4c51a1f7156e8d, + 0x683e4d9325187cf9, + 0x789ac2f4341dac67, + 0x97af85c7641fbad3, + 0x5ac2463a9423ea51, + 0xe573a4f76ce3f7ad, + 0x37e41b8badf7182b, + 0x91cef32edcfb2697, + 0xcea65fbed9ec46f3, + 0x8df9bc532aef6571, + 0xc53b176548f273cd, + 0x9eb4d6a657f6924b, + 0x14985cd764f8a1b7, + 0x3492615983eabf15, + 0x65b8421a92fdce81, + 0x396c21e98ca1fbed, + 0x4c36d791fce41d5b, + 0x85e4f7d21de62bc7, + 0xf9e4b3832cea4b35, + 0x52ea7c6548ed59a1, + 0x1cb83ef657ce681f, + 0xc81e46dba5e2967b, + 0x25461f8cb3d4a5e7, + 0x19fb536ed2e9c465, + 0x794a2b11f2ead4c1, + 0xeba3652541bcd23f, + 0x63edb4765fd3129b, + 0x642dcea87ed64219, + 0x859c73a76bc83f75, + 0x359abfe878b95ed1, + 0x73f584aa97ab6c4f, + 0x6a43591ed49f6cab, + 0x85bc7ae1f5d3ab29, + 0x6d93c85213d4ca95, + 0x3c5a6e1543b7c8f1, + 0x8c7db9e541bad76f, + 0x2eb91da54e8cf5db, + 0x8d467e3baec12649, + 0x7c92db1badc634b5, + 0x452b7c8febc97523, + 0x1b847d5fe7ba628f, + 0xd98fc3a3269c71fb, + 0x536ecd1324ae8f59, + 0xa5d4e8976492aec5, + 0xb12d94a982a6cd43, + 0xc358e4a87186db9f, + 0x2b13c7a98e79fa1d, + 0xa5748d1dcd8e1b79, + 0x4c3a56e1fca139e5, + 0xb6de5c721db45963, + 0xd49fa5132a9756bf, + 0xfc5e37a5479a863d, + 0xc35eb947657d84a9, + 0x3d987cbba59fb417, + 0x2d95634dc5a4d283, + 0xe9243dccb285c1df, + 0x583c6d4cbc67ef4d, + 0xfa97ed632e6a1fb9, + 0x915dafc54c8d3e27, + 0xc12bd7e76c815d93, + 0x13def54769735aef, + 0x6295dc8cb9857a6d, + 0x942be68dc45a78d9, + 0xb76a543fe36db947, + 0xa8396f2fe26fc7b3, + 0xc81be3d32594e731, + 0xdf8649e43175f48d, + 0x1c832a965e6814f9, + 0xd687425a9e8c2367, + 0xd63e128a9b7e52d3, + 0x46e29cbedc938251, + 0x3da8146dc8536f9d, + 0x487de6c1f7568e1b, + 0xdfb957421549ad87, + 0x64e813a3245cabe3, + 0x1d8ef468735fdb61, + 0x54f983287152f8bd, + 0x196452cbaf56193b, + 0x948fed7dce4928a7, + 0x94f3687fed6c4815, + 0x731cb541fb4e5681, + 0x6b5a14d32a5174ed, + 0x1d38f9432a64935b, + 0x3d876fb65846a2c7, + 0xf4d6bc3a976ac135, + 0xbd543a69834bcf91, + 0x2d751e49813ebcfd, + 0xa4f6e13dcf431e6b, + 0xe4c86d71fe352cd7, + 0xe2fdba421e293c45, + 0xa836ce554d3c5ab1, + 0x9e8ab3765a3d692f, + 0x89a7f5b76a31978b, + 0xe38f714cb823a6f7, + 0x49826a7ed428c675, + 0xf79db63fe439c5d1, + 0xf376984fe12bd34f, + 0x97c81525413ef2ab, + 0xf926b8a87f154329, + 0x3e7da1c98e274195, + 0x498da6c87b285fe1, + 0xc1f6a3b9891a6d5f, + 0x48bfae2a971e6dcb, + 0x28cf649fe721ac39, + 0xb5ed4911f613cba5, + 0xc35168954627da13, + 0xf3ce2d554319d87f, + 0xe2134c86521af6eb, + 0xc17eaf476dfe1759, + 0x43f8ea6a9df136c5, + 0xc284a35cbcf57643, + 0x78e5f4ddcae7639f, + 0x5c6b184fe7fa831d, + 0x6475bfe326fda179, + 0x7c8eab5324ce9fd5, + 0x2b543fd876f2ce53, + 0x83f714b762e4dcaf, + 0x3d9cae6981e7fb2d, + 0x53cfad887feb1c89, + 0xcd1a674a9bcd2af5, + 0x2a8b9741fce15a73, + 0x4a23d5921ad357cf, + 0x1a9bc4332ae6874d, + 0xba947e8436ea85b9, + 0xd179c4a986edb527, + 0xfb75a14985dfc493, + 0x17eda48a94b3c2ef, + 0x193564dcb2c5f16d, + 0x1a8dfcbfefc821d9, + 0x598cd7621ecb2f37, + 0xc178aef32cbd4ea3, + 0x29478b176bc37d21, + 0x8d7af13659c36b7d, + 0x5e62b4f986c57ae9, + 0x7f286badc4d9ba57, + 0x47f8ab2fe4adb8c3, + 0x9bf4618fe3bfd841, + 0x3ea57f6213b2f59d, + 0x6491efc653d7261b, + 0x196ca4b65fca2487, + 0x96ae35f87dab54e3, + 0x7bac38ea9cbe7361, + 0x2d81b54dc9a271bd, + 0xc8f95a4ed7a48f2b, + 0x2c56b181f4b5ae97, + 0x7e5693a21598acf3, + 0xe12a6fc4349bdc71, + 0xeb62af95427fe9cd, + 0x75e9a6d982c31a4b, + 0x3afc21498fa529b7, + 0x4627ad5dceba4925, + 0x9cd54b6fedac5791, + 0x352b97ffe98c65fd, + 0x8c5be9732ca1946b, + 0x7f1bd8532894a3d7, + 0xce754d9767a8c245, + 0x19283ea87589d2b1, + 0xb651a7d9837ace1f, + 0x3d75842a916dfe7b, + 0x9f4cd8acbf832de7, + 0xb4c1e531fe973d65, + 0xdfb34ea32e785bc1, + 0xfa1b45632c7b6a3f, + 0x8ec476143a5e689b, + 0x48b21ea76a72b819, + 0x3e91a4fcb693c785, + 0xe4523a7cb487c6e1, + 0xbda5194dc279d45f, + 0xcb7f184fe16af3cb, + 0x23a796c6528f1439, + 0x493287f76f8342a5, + 0xa7fdb9876e987213, + 0xba86dc987b485e6f, + 0x9db284e878496edb, + 0x7ce41d5cb75e8d49, + 0xdf5c791fe761acb5, + 0x2396a571f675db23, + 0xe48bfda21345d98f, + 0xefd8ba643248e7fb, + 0x2e1d3a88725d1869, + 0xe31f27598e4f27d5, + 0x358ec74cbe826753, + 0xdaf5264cbc3564af, + 0x297d3c8feb59842d, + 0x51d2ec61f74ca289, + 0xc4ed7383284da1f5, + 0xbe3ad6254851cf63, + 0xb49c12876543cdbf, + 0xcd4eba398246fc3d, + 0xed16547cb2481da9, + 0x25b3f41baf4d3c17, + 0x691fd24dcd2f4b83, + 0x2a4b958feb3258df, + 0x5ec789a21c24785d, + 0x89d7b6243b2786c9, + 0x18a9ce36592cb637, + 0xce5a4f19872ec5a3, + 0x57462cfcb863e521, + 0xa1e7f35cb534f27d, + 0xcb67a93ed34712e9, + 0x14fd627fef2b3157, + 0xbdae76f32e1c4fb3, + 0x8c392b665c2f6e31, + 0x8ac9d6465b126c8d, + 0x79d5ca276a147bf9, + 0x3a5698fdc918ab67, + 0x4fadb53dc61ab9d3, + 0x1267fdbdc62ed951, + 0x592a3fbfe421f6ad, + 0x7fea63954635172b, + 0x8791ca3763182597, + 0xc3b1d7476de945f3, + 0x75e943698dfc6471, + 0xfe94582879fe62cd, + 0xe39f671dcaf2914b, + 0x3782dbadc6e39fa7, + 0x18274c6ed6f7be15, + 0x4bdf359325f9cd81, + 0x7c98f6b323f9caed, + 0xe3ab916542defa5b, + 0xe3c546f981f32ac7, + 0xcd75361a9fe74a35, + 0x37524afcbde958a1, + 0x2bf6913dcadb671f, + 0xd8e4c361f9de857b, + 0xafc671b329d1a4e7, + 0x5d43c6f329e4c365, + 0xfd81c26656e7d3c1, + 0xfc1859a875c9d13f, + 0xd125ec8762caef8b, + 0x641e8a5a92bd1ef7, + 0x6f3215ccbfc23e75, + 0x395e48a1feb65cd1, + 0x76ed2ca21dc86b4f, + 0xb3c81d9328dc69ab, + 0xf56b813547ce8a29, + 0x2b8c4ed767d1c895, + 0x14fe628a96b4c7f1, + 0xe364b28ba3b7d56f, + 0xa58b312dc2a8f4db, + 0x894d5eb1f2cd1549, + 0xefa8d2c541cf23b5, + 0x24b1c3d76fc57423, + 0xabc793254db5618f, + 0x29b7c8d54a976feb, + 0x8dfa5c2767ab8e59, + 0x6e28bf7ba68e9dc5, + 0xfdacb63fe7a1dc43, + 0x71a2465fe483da9f, + 0x86ebd14324a6f91d, + 0x83a29cd543cb1a79, + 0xbacde28761ac28e5, + 0xc635a1b87eaf4863, + 0xfb96c4598d9265bf, + 0xd87fe56cbca6853d, + 0xc3472f6fecb783a9, + 0x8e2cd531f89cb317, + 0xd46b3ea3279ec183, + 0x2d46a9f43571becf, + 0x2b79cef76583fe4d, + 0xa5c6b2d873861eb9, + 0x541d7f2cb19a3d27, + 0x5b1cd39baf7d4c93, + 0x8b137c2bab6d49ef, + 0xd2e7b411fc82796d, + 0x48be75321c6487d9, + 0x98e41b632c69b847, + 0x953ec6b5487ac6b3, + 0xe275d1ba978ed631, + 0x46925d8ba571f38d, + 0x94fda82dc48513f9, + 0x8d927f6fe1a93267, + 0xac96b3dfef7a51d3, + 0x69d1fac32e7c6f41, + 0x5cb697832b4f5e9d, + 0xeb9f21465c638d1b, + 0x2c95fd776b54ac87, + 0xb14c267a9857bae3, + 0x574af83dc75bda61, + 0x3d16245ba34ce7bd, + 0x41c6d9a1f572183b, + 0x74bd53a2138426a7, + 0xb35f78a762894715, + 0xbed6ca187f4b6581, + 0x1963d5287c4b63ed, + 0xcea6f34a9c4f825b, + 0x5162e78edb53a1c7, + 0x6387b14ed946bf25, + 0x2b7e6491f647ce91, + 0x9482a5b21538cbfd, + 0x9a3e4cd3243dfc6b, + 0xe46a3d2984512bd7, + 0x938d64bba1763b45, + 0xc4b26e9baf3759b1, + 0x1a39dcecbd3a682f, + 0x3c6275afec2d768b, + 0x326e1b7eda2e95f7, + 0x2a7f48621b32c475, + 0x1d326c765936c4d1, + 0x95b2ec376738d24f, + 0xf31e2bc87539f1ab, + 0x85f623ecb65e3129, + 0x6dbaf57dc2413f85, + 0x95fc8a6cbf245de1, + 0x58ca93dfed176c5f, + 0xaf84d1332e186acb, + 0xf9b273654c1d8b39, + 0xf896a325481fb9a5, + 0xbf312da98a24d913, + 0x3d4b1f2ba814d67f, + 0x24b79d5ba417f5eb, + 0x9ac4b86fe42c1659, + 0x521eabd1f31e24c5, + 0x492ba6f986217543, + 0x586179254de3629f, + 0xd17fa9b65cf6821d, + 0x12a3d7854be78f69, + 0x218357a767fa9ed5, + 0x14e8dfaa97febd53, + 0x8b6d724a95e1dbaf, + 0xdf94ae7dc5e4fa2d, + 0xf7a9cd3324f61b89, + 0xa29bc36543ea29f5, + 0xbdaf358761fd4973, + 0x781c4e965dbe46cf, + 0xab2468da9ce2864d, + 0x67ec532bace584b9, + 0x81cae43edae9b427, + 0xa48b5291f7ebc293, + 0xadc5be8326acb1ef, + 0x451eb7a436b1ef5d, + 0xe7d4951765d41fc9, + 0x6e1cf5aa94d82e37, + 0xdfac524981e94da3, + 0x32f5de4a9fbd6c21, + 0x7d415fea9cbf5a7d, + 0x2a3b9461fbc278e9, + 0x9d752ec21cd4b957, + 0xbcf635a329d8b7c3, + 0x469a2ef658cbd741, + 0x5893271765ace49d, + 0x7f5cb29ba7d3251b, + 0x6478fb3dc4d52387, + 0x579e3b6ed1c852e3, + 0xf73da4bfefcb7261, + 0x42bed7521e8b5fad, + 0x9ab68f443c9f7e2b, + 0x8e3bfd954cb2ad97, + 0xfc4e1b576895abf3, + 0x6bd5c27a96a8db71, + 0xc39761eba479e8cd, + 0x713b5d9dc39df84b, + 0x9a3182e1f4c128b7, + 0xc9a8725213c64825, + 0x7586bd3542c85691, + 0xc21bdf643e8964fd, + 0xd9e4f3b65e9d836b, + 0xb549ae176b8f92d7, + 0xf31e4c6edba3c145, + 0x4e86712ed785cfa1, + 0xc8fb392fe587cd1f, + 0xf6d37ae21469fd7b, + 0xbf8521a4348d1ce7, + 0x3a5fd41984a13c65, + 0x1542a7f982945ac1, + 0xfe1b3d5bae87693f, + 0xb719d3fdce5a679b, + 0x2f4d537fec6da719, + 0x6b31984fea7fb685, + 0x1c8973432a83c5e1, + 0x89f15a332986d35f, + 0xa7bd8f554567f2cb, + 0x36b14cfba68c1239, + 0x7d21568cb48e31a5, + 0x28d6e97cb3825ef1, + 0xf95167ccbe735d6f, + 0x7283cd51fe456cdb, + 0x498eb7c21e5a8c49, + 0x391ecb632c4d9ab5, + 0xd4fa8ce6596fca23, + 0xb81237576952d78f, + 0x7ac1e4ba9754e6fb, + 0x5689c3fed45a1769, + 0x367f8a2fe37b26d5, + 0x16795cd1f18e4653, + 0xb13e2c55427163af, + 0xc5dbe2154f65832d, + 0xf64e19d65e46a189, + 0xd5f721a76b389fe5, + 0xf46acd29894cbe63, + 0x3152de69863eacbf, + 0x2a716dbdc752fb3d, + 0xb81e2651f6451ca9, + 0xad364f8326593b17, + 0x5efb7927625c4a83, + 0xb9d21fa7613c47df, + 0x25e3af4a9f31875d, + 0x8c61fd2bae2385c9, + 0xaf3e4b2dcd28b537, + 0x652b719feb29c4a3, + 0xa57edb21f95cd421, + 0x4ebd8973283fe17d, + 0x85a3cdf7685421e9, + 0x31e4857a98362f47, + 0x27fb836a95284eb3, + 0x41edc67ba24b6d31, + 0x3fe1b7da9f1e5b8d, + 0x42eda38dcd217af9, + 0x2a7cd651fd13ba67, + 0xa8e147632c16b8d3, + 0x7ac5e9354b2ad851, + 0x32b795c5471be5ad, + 0xe352a7f9871ef52b, + 0xf2ae7b5dc8132497, + 0x43576f9dc61754f3, + 0x76b1c38fe42a6371, + 0x8ca6974cbef961cd, + 0xc3a7fd421dec7f3b, + 0x78a53ef32bdf8ea7, + 0x8d94bcf76af3bd15, + 0xa8cf9e2769f5dc81, + 0x1e9d5a4875f6c9ed, + 0xf6714e2984eaf95b, + 0x1a96cf8cb4fe19c7, + 0x89b42c1fe6f14935, + 0x693b7da323f457a1, + 0x6b1fc78542e8761f, + 0x19afc5443fea847b, + 0xe6a8c1265bdc93e7, + 0x1ab9dc798adfb265, + 0xfc6d1b3ba9e4d2c1, + 0xe2f7b36ba7b5ce2f, + 0x8ea65f4ed4c6fe8b, + 0x8ce647f325ca1df7, + 0xbde8572434ce2d75, + 0x1e64d3c874e25bd1, + 0xf6ce4ba981d36a4f, + 0x5a61cef87fd568ab, + 0x6a5fe8c87edba829, + 0x3a6f892feacdb795, + 0xb67a8e5ed8aeb6f1, + 0x5d973c8219b2d46f, + 0x4e5d317327a5f3db, + 0xdfc1a34767da1349, + 0x5f4e976986dc32b5, + 0xc1d8942ba5ce6123, + 0xf519d67ba2b15e7f, + 0x716e28cbaf936deb, + 0xdbe41a61feb68d59, + 0xd6a39b821ea89bc5, + 0x79e64fb32a9dcb43, + 0x5cd24194367ec89f, + 0x3fe8b7a767a3f81d, + 0x4f28ae5cb6c51879, + 0x6fd9b42dc4b927e5, + 0x4b2786dfe2bc4763, + 0x2c5a4dbfe19d54bf, + 0x81723fb652b1843d, + 0x89714c243fb482a9, + 0xdbfa61465ea8b217, + 0xde6b41865c89bf73, + 0x76e9f8265769adcf, + 0x14e23dba967fec4d, + 0x16754affe6831db9, + 0x528ad491f5a63c27, + 0xc953aeb215a84b93, + 0xb97e1a84327a48ef, + 0xbf5c2365419e586d, + 0x236d7e165f7186d9, + 0x36bdc82bae93b647, + 0xf2e953cbad87c5b3, + 0xfbd2c61feb8ad531, + 0x1ea623d1f76be28d, + 0xbfed1c63276de1f9, + 0xb813e7c659a43167, + 0xae2d619875864fc3, + 0x12843bcba3896e41, + 0x1db39f29816a5c9d, + 0xe2b1876a9f5e7c1b, + 0x7bc5a34ede51ab87, + 0x31aecb71fc64b9e3, + 0xcf7693832c57d961, + 0xc8a6f5e32948e6bd, + 0xfc539715485cf63b, + 0x4ed2178a986f15a7, + 0x369f154dc8934615, + 0x835cb96ed3976481, + 0x9b128a4dc15862ed, + 0x58632a4fef4c815b, + 0xc6e7fd421e3d8fb7, + 0x8c215f654d61be25, + 0x418fdc976b54cd91, + 0x412b8c976835cafd, + 0x1b5d842a9738fa6b, + 0x3a2ed57cb64c1ad7, + 0xeb2a53ced76f2a45, + 0x92637db1f46358b1, + 0xe5d67f821345672f, + 0xa1265ec54139758b, + 0xfdb93c665e2b94f7, + 0xa7c4e3198d2eb375, + 0xecd3f28a9b52c3d1, + 0x6835ae9cba35d14f, + 0xf5967d2dc725ef9b, + 0xc549d86fe74a2f19, + 0x2be49a82173c2e85, + 0xf61eb8a6563f4ce1, + 0xd437c19984326b5f, + 0x53dfc679812469cb, + 0x45f87c9cbf178a39, + 0x561b384a9e1cb8a5, + 0xfae6925edb2ec813, + 0xc43967bfea21d57f, + 0x8c316db32913f4eb, + 0x21e75f476b281459, + 0xbe84f298781a23c5, + 0x3164758ba81d6243, + 0x87e3c4dba42e519f, + 0x468ce9dba3126efb, + 0x83751e9cbdf38e69, + 0xb9567fcfebf69cd5, + 0x6bda75221df9bc53, + 0xacb5d7f327ebc9af, + 0xafc5e98547cfe92d, + 0xbd95f8a767f31a89, + 0xe2713dcba7e628f5, + 0xe9a8d72dc5fa4873, + 0x261d3c9cb2ea45cf, + 0xbde5216dc1fe754d, + 0xbf8a791542f183b9, + 0xb659d3754fe5b327, + 0x6cdb31e65de7c193, + 0x519dab7548b7aedf, + 0x4d98ec1767bace5d, + 0xd8521f3875aefdc9, + 0x2d817efdc8e42d37, + 0x4ba89c21f5e64ca3, + 0xf9a1cbe435e96b21, + 0xb2419de432eb597d, + 0x9738fab541cd67e9, + 0xf85abd476fd1b857, + 0xf79d5a498ed4b6c3, + 0xb52df3cbabc8d641, + 0x8725916dc7b8e39d, + 0x8a3b567fe7acf31b, + 0x98d72e1439cf1287, + 0x1847fca768c451e3, + 0xce15769984c76f51, + 0xd82394b762b75ead, + 0x35b6f9a981ca7d2b, + 0x9afeb2576fae8c97, + 0x1a6347edcd91baf3, + 0x1e64cb91fcb4da71, + 0xe38924f21a95e7cd, + 0xb9c5a71328a9f74b, + 0x95e16b8548ad16b7, + 0xf4e3ab7a98bf3725, + 0x36fc875cb7c36591, + 0x96c485fcb2a563fd, + 0x5b362cafe1c9826b, + 0xdfc9b73fef8b91d7, + 0x5de276321e8daf35, + 0xf8e653d54d82cea1, + 0x74ebd6c65a84dc1f, + 0x68af25c54985fc7b, + 0x58c2934ba6891be7, + 0xdbfe297dc79d2b65, + 0x6b7cfe8ed58f49c1, + 0x3d2519cfe4a2683f, + 0x76dae92212a4769b, + 0xe9783cb542b8a619, + 0x81495ea43f7cb485, + 0x3ac895f76c7db4e1, + 0x7613ea8a9b81d25f, + 0x79bd38cba974f1cb, + 0x527986bfeba82139, + 0xcd1f384fe67a2f95, + 0x3c84a1d3267b4df1, + 0x48ecd393237e4c6f, + 0x6743ae1653726adb, + 0xbec48f1ba1758b49, + 0xf152a9698f47a9b5, + 0x1c75d4fbae6bc923, + 0x58c2641cba4dc68f, + 0xe84567fed961e5fb, + 0xf75e6d932c841569, + 0x9fa518b43a7824d5, + 0x68caf3d8798b6453, + 0x41ca3eb9846c52af, + 0xd27e489ba46f712d, + 0xf76d8b4dc1528f79, + 0x758cef4cbf349de5, + 0x7a1593c1fe48bd63, + 0x7354e2b21d38cabf, + 0x718fe643294cea3d, + 0xc35478f76c521ba9, + 0xc7b62a4a9b653a17, + 0xa3f8dbedca574983, + 0x1c6ae7dcb53946df, + 0xc73ba95fe23c765d, + 0x65d284afe13f74c9, + 0x1b27ef365162b437, + 0xbc1367a65f46c2a3, + 0x81da23c87e59d321, + 0xce83b2465a29cf6d, + 0xe7a395d7672bfed9, + 0xd59fe28dca512e47, + 0xab7fd28fe8254db3, + 0xec58dba1f7486c31, + 0x2ef478c214295a8d, + 0x18b7f565432c68f9, + 0x71feb346512fa967, + 0x3d2e61498f12b7d3, + 0x8e1dc47bae26d751, + 0x32abc15a9b17e4ad, + 0x48c52efed91af42b, + 0x36cdeb41fa2e1397, + 0xc5df14b76a4152f3, + 0xd2f1b5698a356271, + 0x53f81be874165fbd, + 0xc37df9e984197e3b, + 0x62c1478a921c8da7, + 0x5fd62b998dfeac15, + 0xd361924bacf2db81, + 0x723695dcb9f3c8ed, + 0x6c3a5f421ae6f85b, + 0xa9e625f439fa18c7, + 0xea54183769fd2835, + 0x6b4c93a987ef46a1, + 0xb386f9dba6e3751f, + 0xa9743fbdc2f5837b, + 0x8172439dc1f892e7, + 0x6249acbedfecb165, + 0x4a9753f32ecdafb1, + 0x6eba82554ab1cd2f, + 0xd913cf2549c3fd8b, + 0xfb4e732659d61cf7, + 0x528b3aea98ea2c75, + 0x5b4fe61a96ec4ad1, + 0xf6d4a2ccb3ce594f, + 0xb9c756d1f3e267ab, + 0x3f76e85213e5a729, + 0xa42c9f8431e8b695, + 0xafb52cd54ecab5f1, + 0x7ec218f65badc36f, + 0x412365e879a1f2db, + 0x61274eadcbd61249, + 0xf19c34bfe9d831b5, + 0x4dcfb57fe7ca5f13, + 0x39b265d215ab4d7f, + 0xcf3ab763239f5ceb, + 0xdfe932a763d28c59, + 0xb165a9d871d49ac5, + 0x15f28ad87fb8ca43, + 0xe31784b76d8ac79f, + 0x314987ecba9ce71d, + 0xa38b76c1fbc21679, + 0x5964aec21ab426e5, + 0x731edbc32ac94563, + 0xe265d98546a953bf, + 0xfa2519b985ac723d, + 0x9e41a56983bf71a9, + 0x26e1f97cb1a29ef5, + 0x9481a23dcf95be73, + 0x9dfa687fed76abcf, + 0xed2a3f621c79eb4d, + 0x1f8e4793286dfab9, + 0xd93ecf876ca13b27, + 0x3ad629b878b54a93, + 0x61b832dba59647ef, + 0x5ed1796dc39a576d, + 0xc3da648fe28c75d9, + 0x4f5a27cfe19fa547, + 0x93fba1c65192c4b3, + 0x43cead765f97d431, + 0xb5738d154c67e18d, + 0x3682fcd54a58dfe9, + 0xd48f217a9a8d1f57, + 0x245e89ccb9814ec3, + 0x684bd72fe8956d41, + 0x5d924b71f3765b9d, + 0xdb3ce5a324697a1b, + 0x27eacb64325d9a87, + 0x93d8ac66516fa8e3, + 0x6fde5b2a9f73d861, + 0x3c5d17298c64e5bd, + 0x2e4d6b9bac68f53b, + 0x243b1a5feb6c14a7, + 0x46c38be1fa8e3415, + 0x7a8513c54b926381, + 0xa76b9f14387461ed, + 0x15a49dc983567f4b, + 0xa71edc8762498eb7, + 0xef418d6a916cad25, + 0x3b12d9f98e4fbc91, + 0x96d8c1fbab42c9fd, + 0xc91642ffec34f96b, + 0xd753e9c32c4819d7, + 0x4fb6e2743b6c2945, + 0x49fcd857695e47b1, + 0xe7c1569ba951762f, + 0xfd769a8dc653748b, + 0x9e4b2d6dc24693f7, + 0xd7125affe14ab275, + 0x14c576bfef4cb2d1, + 0xcad972e21c2dbe3f, + 0x8925baf54c32fe9b, + 0x6182bc587c462e19, + 0xc9d162f87b392d85, + 0xce3d548a983a4be1, + 0x19a53fccb72d4a5f, + 0x3a6f851fe53168cb, + 0xae95b631f524a839, + 0x48e5fa321326b7a5, + 0xc3ed7fa7624ac713, + 0xb4f3dc965e1bc47f, + 0x4d8f97c76a1fd3eb, + 0xfe1a682cbd241359, + 0xa5e1724edb1732c5, + 0x5c182d6feb2a6143, + 0x9feb74ced61a4e8f, + 0xc65e18d3261c5dfb, + 0x68bd3ef545218d69, + 0x25843a6874139bd5, + 0x6e1d538a9217cb53, + 0x14afd3965de6c8af, + 0x1fce29887bfae82d, + 0x61834accbaedf689, + 0x4b68ec3edae127f5, + 0x9e5f4c221bf54673, + 0x5649bef328e754cf, + 0x6c42eba656fa734d, + 0xdba1f73764fd72b9, + 0xf4725eba94efa127, + 0x28be794ba1e2bf83, + 0xb341fe698eb4acdf, + 0xb6c24e11fab7ec5d, + 0xfe852ac21ad8fbc9, + 0x98c3fd654ade1c37, + 0x94c1fbd769e14ba3, + 0xdfbac31989e56a21, + 0xd321685ba4e6587d, + 0x7146cefcb3da76e9, + 0x8235da4dc2eda657, + 0x5bc3d4afe1dfa5c3, + 0x82e35d4762e3d541, + 0x6745b1943fb5e29d, + 0xa2d14e865dc8f21b, + 0x94fceb876bdc2187, + 0x841c92e878ac2fd3, + 0x251c486cb9c26e51, + 0x971385bfe6b35cad, + 0xbc25d831f4d67c2b, + 0xb57edfa213da8b97, + 0xe6f1795542bca9f3, + 0xe7a8d64652bfc971, + 0x83fdbc965f92e6cd, + 0xbf7a14e98da5f64b, + 0x271e839badc915b7, + 0xbfd6927feabc3625, + 0xdeb49181f8be5491, + 0x2d8f9c7438a162fd, + 0x71e2a6f437c4816b, + 0x3af2b9c543a58fc7, + 0x45829b3872b9ae35, + 0x48569fc8728cbda1, + 0xf4e5acb98d7ecb1f, + 0xdb375a2dcd82fa7b, + 0xa29ce151fc951ae7, + 0x528eab321db92a65, + 0xc865ad243a9b48c1, + 0xbc9a5f75489d573f, + 0x9c34bed986a1759b, + 0x64892bfdc6b4a519, + 0xc36152bed2a7b385, + 0x71f39a5ed289b3e1, + 0xe18495aede7bc15f, + 0x64927ed21c5edfab, + 0x6be381965d841f29, + 0xa5963fd54c862e95, + 0x35fd97b76a784cf1, + 0x768d1fba987a4b6f, + 0x473e9d5ba46e59db, + 0x5b324d1fe5718a49, + 0x6e4d5c91f273a8b5, + 0x3e6cd2f21497c823, + 0x825e14a43169c58f, + 0xe59d12743e5ad4fb, + 0x9b64de887c5ef369, + 0x947e8cbbac8423d5, + 0xfe23548edc986253, + 0x39be52ced96851af, + 0x6d47cb5fe75a6f1d, + 0xab5e6f72154d6e79, + 0x97b4c8e434619ce5, + 0xde796a298274bc63, + 0x95c1de887145c9bf, + 0x42856cf87f48e93d, + 0xe15763f98d3cf7a9, + 0x25f6c48edc5f2917, + 0x4d8b7e91fc624783, + 0xf62a9b721a3645df, + 0xa68513e32a39745d, + 0x43b72196564b73c9, + 0x5fdb4a2a965ea237, + 0x4891cf2cb562c1a3, + 0xde4b1c5a9143adef, + 0xd271e34baf25ce6d, + 0xb5d3ca6feb27fcd9, + 0xac9b5e832e3c1d47, + 0xfb936ec65a4f2cb3, + 0x9cab15e98c546b31, + 0x61e592d87a24598d, + 0x935d2c1cb52867f9, + 0xcf9e651ed42ca867, + 0xeb2817fdc42ea6d3, + 0xe854a711f342d651, + 0x6fd123965124e3ad, + 0xf6d8e3165e17f32b, + 0x4c81e7d76e3b1297, + 0x3ab416c98b2c41f3, + 0xa62537ea9a2e4f61, + 0xd673ec2ba8125ebd, + 0x476f23bfe8157d3b, + 0x5c4b9211f4168ca7, + 0x216a49b4362cab15, + 0xb6dc81e6542eca81, + 0x9cf3ea176321c7ed, + 0x45fed8976de2f75b, + 0xc471a36a9df516c7, + 0x6d71e5acbcfa2735, + 0x83b1c65ed9fc45a1, + 0xe5fd8b7dc8ed641f, + 0xfe295d1439f1827b, + 0xcaf714e436f491e7, + 0x1d59b8e763e7af45, + 0x854ea72763f8aeb1, + 0x32d9c5a871eabc2f, + 0x8c791ae76dafec8b, + 0xc6e4f1dbacd31bf7, + 0xca2e5741fce62b75, + 0xc3dbf8432be849d1, + 0x7a1598b329db584f, + 0x14c2a6b437de56ab, + 0xe4d1c27987e1a629, + 0x714f692ba6e3b495, + 0xf2e89cbba3d7b4f1, + 0x928641ccb1d9c26f, + 0x312765ddcf9ae1db, + 0xb2853ae21cadef39, + 0x713f69854dc32fa5, + 0x473ed5276bc75e13, + 0x6c37428659b84c7f, + 0xa9c6f35876c95aeb, + 0x5dfe7b1ba4ce7b59, + 0x9fc54b7fe4d1a9c5, + 0x5d7b9a61f2d5c943, + 0x35927cf212b5c69f, + 0x368297c542b9e61d, + 0x51498d743eacf479, + 0x659bdc887caf14e5, + 0xf682c95badc25463, + 0xb695a41dc9a652bf, + 0x92dc1b4fe8b9713d, + 0xd69b31ffe4ab6f89, + 0xbe743a62149c8df5, + 0x76b21dc545a1bd73, + 0x41cde6365283bacf, + 0x4bce93887196ea4d, + 0x1c746d365e67f8b9, + 0xad8f1c7cbe9d1a27, + 0x6b39e8fedcaf2893, + 0xc5918f6eda9246ef, + 0xbc4da5e21ba4756d, + 0x98fcd15326a874d9, + 0xad47ec66569ca347, + 0xd68ca4e8758ea2b3, + 0xa89ecd7cb6a4d231, + 0xe2936dcba183cf7d, + 0x267d8c9bac65fde9, + 0x9c287ba1fd8a1e57, + 0x3dc245a21e7b2dc3, + 0xafe5c4143b8f5c41, + 0x2fac61b54b725a9d, + 0x3457bae76a85791b, + 0x5a96284dc456a987, + 0xa861debdc46ba7e3, + 0x3a75c8fed38ec761, + 0xe6bc74d1f271e4bd, + 0x8de49b332185f43b, + 0x68cd57954f6813a7, + 0xefbd24687e8b4315, + 0xfe627bda9c7d5281, + 0xd68941b8785e4fcd, + 0x1e79f25dc9627e4b, + 0x9285f1dfe6548db7, + 0x6cda8e71f468ac25, + 0xb7a41d53245acb91, + 0xdcb82af4324cb8fd, + 0x6d9834b87251f86b, + 0xd5847fba9f5418d7, + 0x9d6a327cbe692845, + 0xba52413dcd5a46b1, + 0x65b2a9eeda4c652f, + 0xdab39f1fe94f638b, + 0x3fe86d721a5392f7, + 0x4d28ac943946b175, + 0x87cafed76547afc1, + 0x943abe187249bd3f, + 0xe293a8b8713ced9b, + 0xa7425f8cbf532d19, + 0xb29a73cede342c85, + 0xd4a693e1fc374ae1, + 0xd4cbf3621c2a495f, + 0xda4782e4392d57cb, + 0x28d36c165a2f8739, + 0xb63da12a9832b6a5, + 0x9c6d37ecb847c613, + 0xa18f493cb428c37f, + 0x153df47dc139d2eb, + 0x41a3f78dce2df159, + 0x8b5f7e976f4231c5, + 0xb2f8e1d87d165f23, + 0xd4328c665b164d8f, + 0xdb15c82769185cfb, + 0x9723146ba81d7c69, + 0x698c5a7cb61f8ad5, + 0x56b2df3fe712ca53, + 0x42d183bfe314c7af, + 0xf52abd843418e72d, + 0xa1783ef5421bf589, + 0x8c2a6b354dec16f5, + 0x3f769db98cef2573, + 0x9f25d1498ae253cf, + 0x6c5fd87cbaf6724d, + 0x243af8ced6f871b9, + 0xe3b145ced5eb9f17, + 0xd694b2a215fdae83, + 0x6cb2598434e1abdf, + 0x84bdcea762f3eb5d, + 0x5dce7f1761e5fac9, + 0xd29475a98fea1b37, + 0x4dfb93c98ced29a3, + 0xa1b26d9dcbdf5921, + 0x7c93a8e1fae2567d, + 0x5ad963f21ad475e9, + 0x97ac863328e9a457, + 0xa8d7196656eba4c3, + 0xed65937986dec341, + 0xb4379a6984c2e19d, + 0x9f3ce61981b3def9, + 0x2371564cbec81f67, + 0x73b429a1fcb92ed3, + 0x3c4ea1932ebc4d51, + 0xb46d9a33289f4bad, + 0x974cb6f659d37a2b, + 0x73bda2c656d48a97, + 0xf283d71a95c7a8f3, + 0xdce6987ba4dbc871, + 0xf519823ba29eb5cd, + 0xb946782fe2c1f54b, + 0x48b6c12432d514b7, + 0xb9851c376fc93425, + 0xd27e93b76ecb5391, + 0xb127acf76a9b51fd, + 0xa419fc28789e6f5b, + 0x4c7369fcb6a28ec7, + 0x2b8637cfe7b6ad35, + 0x6e8c2731f497bca1, + 0xcd6bf5932489ca1f, + 0xe624ca84328de97b, + 0xc85ed92763b219e7, + 0xb2acd7498fb42965, + 0xed631cfa9ea847c1, + 0x21c47e8cbc9a563f, + 0x679a8f2fea8d649b, + 0x7d9cf16fe7af8419, + 0xd4ab278219a3b285, + 0x52fe3cb54796b2e1, + 0x2daf68e65387be4f, + 0xac6348765268deab, + 0x5dc3bef9817cfd29, + 0x5f7dc86cbf812d95, + 0xbd9a736dcd854bf1, + 0xf31adbcfec874a6f, + 0x7ed832a21c6958db, + 0xca73f8e32b6d7849, + 0x5984f6c4386f97b5, + 0x648d2e7ba894c723, + 0x2bd574eba375c48f, + 0x9b432c8ba267d3fb, + 0x6a9bef8ed17bf269, + 0x124a78ddcf7e12d5, + 0x62e79cb54f926153, + 0x3f89ec432c634e9f, + 0xa3286c954b576e1d, + 0x7b689a265b4a6d79, + 0xc238f4da974c8be5, + 0x42df6b3dc75fab63, + 0xa4395b7ed452c8bf, + 0xc412d681f265e83d, + 0x56e7db921247f6a9, + 0x2489ebc6536c2817, + 0x813dfec87f5e2683, + 0x9fd173498c6154df, + 0x72e1c68bac64735d, + 0x5b726a4edb4672c9, + 0xacb2345fe95ba137, + 0x29f6d5afe64caf93, + 0xe6f92c72153d9cef, + 0x8df14ce43542ec6d, + 0x38fe17d76234fbd9, + 0x7cf95e3ba2591c47, + 0xf69b14e98f4c2ab3, + 0x91f73a4cbd4e5a31, + 0xb625f84fec31578d, + 0x6f5c9a7feb2376f9, + 0x3e45af621c28a567, + 0x263dfa154829a5d3, + 0xcd85a2f8783dc451, + 0x9e1ca268753fc2ad, + 0x8b5f3ceba654f12b, + 0xe38f94aed3462197, + 0x836fc7acbd182fe3, + 0x3b1e7cd1fd2b4e61, + 0x76e4d1f32a1e4cbd, + 0xaef68b265d217c3b, + 0x3967bdc65c138ba7, + 0xa136b4e98927ba15, + 0xd945c27cb62ac981, + 0x8e2fd1ba941ab6ed, + 0x5439ed7dc31fe65b, + 0x1e9375b1f42315c7, + 0xed46921874182635, + 0x65f8acd43ef854a1, + 0x6d24b8965cea631f, + 0x6f4ced865afd617b, + 0x86dcae3658ce6fd7, + 0x1ce7946cb8f2ae45, + 0xf975d21dc6f5adb1, + 0xc7621faed4e7cb2f, + 0xc43b8a9213f9ea8b, + 0x419a6d7432dce9f7, + 0x617fedb983f12a75, + 0xf15ebc687fe548d1, + 0x75bca84a9cd8574f, + 0xf41d2b598ce965ab, + 0xef428a5dcaed8529, + 0xa6f291bfe7dfa395, + 0x6d8c5bf328d4b3f1, + 0xfbde427437d5c16f, + 0x23598af543a6dfcb, + 0xcaf85d3762cafe39, + 0x57ed6cb982cd1ea5, + 0x6b89f3dbafc25d13, + 0x9cb8f56badc34b7f, + 0xbc3e45a1fac659eb, + 0x64a8bcd21cdb7a59, + 0xf546bc7327bd98c5, + 0x64a7bcd657cfb843, + 0xab36429876b2c59f, + 0xf81b5a4a94b6e51d, + 0x3845f7dcb2c8f379, + 0x8fe4579ed2cb13e5, + 0x1a2e78cedfbe4263, + 0x8c245b743ea251bf, + 0x4ce587243ca46f2d, + 0xd72eabc43cb56e89, + 0xe72afc3547a98cf5, + 0xd417c3f9869dac73, + 0x27c9e3f9847ea9cf, + 0x271b3a4dc5a2e94d, + 0x849c5f1fe2a4f7b9, + 0x547baf1434ca1927, + 0xda19fb8651bc2793, + 0x793ab5154d8c35ef, + 0x16eabd998ea1746d, + 0x2c5ae7b98ca473d9, + 0x86b2af3edcb8a247, + 0xdab5643fe789a1b3, + 0x7adc584fe68cbf21, + 0xe49db322146fbe7d, + 0xeda1f9743472fce9, + 0xc3e6b72983a61d57, + 0x8b1945d871982bc3, + 0x6bc1e72a9f8c5b41, + 0x46ced75bac6e489d, + 0xc1daf53fed92781b, + 0x3de5ac61fc93a687, + 0xd7cea6221b87a6e3, + 0x186ae794398ac561, + 0x85a362c5456ac3bd, + 0x4acb73f9857fe23b, + 0x7f49e3bdc59412a7, + 0xab459f7ed3a84215, + 0xb395f76dce694f71, + 0xc9dea851fb594ecd, + 0x438aec721c5e6d4b, + 0x6b98ad243d518cb7, + 0xe8c5fb776c74ab25, + 0xd2ec1bf87856ca91, + 0x4ab8d53a9548b7fd, + 0x17def46ba34ce76b, + 0x4cae563cb24ef5d7, + 0xa695d141f1932745, + 0x8954f264328745b1, + 0xce2f9ad43e59642f, + 0x7b1294e65e4c628b, + 0x291e8bd76b4d81f7, + 0x8fb13dca9b41af65, + 0xf2438e6cb854aec1, + 0xbc7a149ed746bc3f, + 0xa8d34761f437ec9b, + 0x5647fea3254cfb19, + 0x3527b897634f1b85, + 0xecb546a9826349e1, + 0x21746eda9e26485f, + 0x6bd812ca9e2856cb, + 0x8197fa5cbd2c8639, + 0x643a785edb2e94a5, + 0xe7845161fa62c513, + 0x2fb3da621934c27f, + 0xd5ba13e54736d1eb, + 0xbe39f1576528ef49, + 0xa91e3c69843c1fb5, + 0x2145b68ba15f4e23, + 0xfe26817bae124c8f, + 0xb4f2981dcd145afb, + 0x192ed4a1fd187b69, + 0x583e67c32c1b89d5, + 0xfc6798154a1eb953, + 0xfc94db365821c6af, + 0x67ed32aa9814e62d, + 0xe3d621acb516f489, + 0xe1743a2dc62a14f5, + 0xbf74965fe51d2473, + 0x79e2cd3babed42cf, + 0x271c45f43ef2714d, + 0x185b7fa32ce36fa9, + 0x916afc754bf69e17, + 0x8412369657f9ad83, + 0x3527d91765eb9adf, + 0x7cb9f1d984efca5d, + 0x4523fd9cb4e2f8c9, + 0xf49bd28fe4f61a37, + 0xc235a98214f928a3, + 0xdbe17c3763fc5821, + 0xc1f7da543fce457d, + 0xa5ecb1f76cd174e9, + 0xa6e5d1ca9ce4a357, + 0x3f7ed24cb9e7a2c3, + 0x69a35e2ed8eac241, + 0x96f7a83fe4cabf8d, + 0x9eb53d4214aecdf9, + 0xde38ac5545d31e67, + 0x6425df8874e62cd3, + 0x4a6279e982e94c51, + 0x7fe9bd376fcb49ad, + 0xd95214398dce692b, + 0xc39fa42fecd1a897, + 0xd5b68fafe9c4a7f3, + 0xb5ed61432ad8c671, + 0x95bf836326a8b4cd, + 0xdfae892656ace34b, + 0xd175439764aef2b7, + 0x5f8437ecb7d64325, + 0x563ea18dc3d75291, + 0x7c2841ebac974fed, + 0x2b6e91d1fd9a6e5b, + 0xb5a97e321b9e6dc7, + 0x2b85a7e54db1ac35, + 0xac6d7f965894cba1, + 0xf27963d657a6c91f, + 0xf31d5a8764a9e87b, + 0x91e6c7bba39bf6e7, + 0x2b3fc19ed3bf1865, + 0xab16c321f2b346c1, + 0xf38ced5321b7653f, + 0xca5348d32fa8639b, + 0xb91f2ca65eac8319, + 0x37ac18b76c9ea185, + 0xc5264a987982afd1, + 0xb7fe8d1ba783bd4f, + 0xaf14297dc475edab, + 0xaf37b2dfe478fc29, + 0x1f758963248d1c95, + 0x4c3fd8a6548e3af1, + 0xbf4253e871a2496f, + 0x9b754d376f8457db, + 0x8fa4629cbe6a8749, + 0x4dc72e8bad7c96b5, + 0x2f9c751eda8eb623, + 0x2185af9fe971c38f, + 0x5b4a2d621874d2fb, + 0x874a1de43587f169, + 0xbf29ace8768a21d5, + 0xcea14d2a958c2f43, + 0xa49d2e69816e3d9f, + 0xce2846fbaf736c1d, + 0x2ae8c91ede546c79, + 0x7ba48961fc478ae5, + 0x7ac5de621d5cba63, + 0xe1d583c3284da7bf, + 0x863712465961e73d, + 0x5a164bd98763f5a9, + 0x87adf25dc5892617, + 0x3b9f518ed47b2583, + 0x645b9f3dc16b43df, + 0x2879bf4dce4f625d, + 0x5b843c732f5371c9, + 0x6a8179e43d459f27, + 0x68ace4165c47ae93, + 0x6de1b4f657389bef, + 0xa5f31979873ecb6d, + 0x425a1f9cb641fad9, + 0xba78652fe8651b47, + 0xea7c3811f45729b3, + 0x5c94bfd3246b5931, + 0xb1ec2346513c468d, + 0x59731e254d2e65f9, + 0xb851f73a9e32a467, + 0x264ec3aa9c26a4d3, + 0xe4b158cedb49c351, + 0xa8c3f24fe739c1ad, + 0x2978561fe63cdf1b, + 0x7c8256d439421f87, + 0x4c8f2ae767452de3, + 0x837f6baa95384d61, + 0xab63e9f871284abd, + 0x126cd3798f1d6a3b, + 0xc63e18dcbd1f69a7, + 0xfa176d5fed23b915, + 0x9437ed21fb25c781, + 0x84c9b3d32917b5ed, + 0xd4c7b9e4381ae45b, + 0xba9e1f76561df3c7, + 0xc7941a5cb9612435, + 0x9b54f13dc72653a1, + 0x365eab4dc438621f, + 0x48e6932bade85f6b, + 0x769b31fdcbfa6ed7, + 0xa825fb421bfe9d45, + 0xef21d58549f2acb1, + 0x8f9cda1658e4ca2f, + 0x65798bc546f5e98b, + 0x8cf19b2764d9e8f7, + 0x591f2edcb4fd1975, + 0x94d125acb4ef37d1, + 0xfb167e3ed1e2564f, + 0x8b63fe4321f564ab, + 0xdc91ae643fea8429, + 0x21fbe3c54deca295, + 0x15b3f7e769cda2f1, + 0xef2965c878c1be5f, + 0xdb7612f986a3decb, + 0x538dcf2cb5c6fd39, + 0x589d7421f4e91da5, + 0xa98cb4f326ed4c13, + 0x5ed9f8c542ce3a7f, + 0x8cdfe7a761d258eb, + 0xf9821a476fd47859, + 0xf93aeb176ed897c5, + 0xc86213fa9adcb743, + 0xbe45218dc7adb49f, + 0xa8d62b41f8b2e41d, + 0x85943bd218c4f279, + 0x6e25df9547c812e5, + 0xf41e697987db4163, + 0x5d39e417629b3eaf, + 0xb23c9e4981af5e2d, + 0x58d24f3bafb26d89, + 0xdae2967dcda48bf5, + 0x7641c8d1fdc8ab73, + 0x43ba69d21b79a8cf, + 0x93e86c73279ec84d, + 0x8fcd7a3547a1f6b9, + 0x264938cba9c51827, + 0xf9123d7cb5c82693, + 0x3df6e54cb2a934ef, + 0x47f1d8cfe1ac536d, + 0x2b643e9dce8f62d9, + 0x7a9c86f32fb3a147, + 0x83bf76132d859fa3, + 0xd7c824b65c98be21, + 0x92adf6154869bc7d, + 0xda948158756cdbe9, + 0x83b941fed8a21c57, + 0x7da125ffe6952ac3, + 0x192e65c1f3b85a41, + 0x89ade3f2128a479d, + 0x8e9671c5429d671b, + 0x5bdf42643e6f9587, + 0xedcf6a387d82a5e3, + 0xb75ef84bad97c461, + 0xc247efbba967c2bd, + 0x87e4a52ed87ae13b, + 0xc38ae17ed45cef97, + 0xe1a35d6547812ef3, + 0xd2a518c436954e71, + 0xa19d8f3652764bcd, + 0x9f1d5ca981796c4b, + 0x7b152fe98f4d6ab7, + 0x5a76138cbd6f9a25, + 0xd791625fed63c891, + 0xc6b7193fe954b6fd, + 0x694d5fc21a48e56b, + 0xe86f15c3285af4d7, + 0xc6a45fe8798e1645, + 0x3467f9cba78254b1, + 0xc371d24cb485632f, + 0x17f3469ed257618b, + 0x9edf164cbd396fe7, + 0xab196341fd3c9e65, + 0xe3f75ab32b4f9dc1, + 0x36ec25854a52cb3f, + 0xf9b12c465834ea9b, + 0x3afc7de76847fa19, + 0x6187f9dcb74c1a85, + 0x7e325afcb65d38e1, + 0x317986aed361475f, + 0x2e3bd941f14365cb, + 0xd3ec875321478539, + 0x5ba2f8354f2b93a5, + 0x6d834f187e5db413, + 0xe387af476a3eb17f, + 0x14bce8a87832cfdb, + 0x612d5afcb825fe49, + 0xa368e7bed7381eb5, + 0xc3b69271f75b4d23, + 0xdaf8bce2152d3b8f, + 0x2e5bd877643159fb, + 0xdfb514e981237a69, + 0x4932bcd87f1698d5, + 0xae8dc52a9e1ab853, + 0xb63c5249891cb5af, + 0xdc34981cb91fc52d, + 0xbc342f1fea12f389, + 0xf78b6a254a2713f5, + 0x13f4cad7691a4273, + 0xde9a32b8762a41cf, + 0xda54e379841c5f3d, + 0x624e713cb3216ea9, + 0x93f216bbaef39d17, + 0xa2618f7cbdf5ac83, + 0x263ebf8dc8e6a9df, + 0x4cb6e8d218fac95d, + 0xa31f6ce326fde7c9, + 0x3d142c576af21937, + 0xcdaf586a98f527a3, + 0x91a36d2cb6f95721, + 0x3ec6a17cb2fa547d, + 0x1239aeccb1fc63e9, + 0xfb43825dcedf9257, + 0xde4c15732fe4a1c3, + 0x1a7c3be54cd6bf31, + 0x26db4c5439c6be8d, + 0xd8b1ae6546b8dcf9, + 0x1f64d53985bdfc67, + 0x69732bdba7e12bd3, + 0xeb45678ed7e64b51, + 0x96e4bd71f2e648ad, + 0xd2bf368213ea682b, + 0x284deb6431ed8697, + 0xe9dcf3a54dbe96f3, + 0x5e619cf98ed3c571, + 0x93ed18f879a5b3cd, + 0x9e381bdba9c8e24b, + 0x67a9248ed6caf1b7, + 0x1a596c41f8ce3125, + 0x5192874437c24f81, + 0xb174a6d325a34ced, + 0xda81265542c76d5b, + 0xac2e47d651d96bc7, + 0x3cf2b5d87fad9b35, + 0x23419cf87d8fb9a1, + 0xe21bc6fedba3c81f, + 0x37a4d211f9a4e67b, + 0x6b928c5219a8f5e7, + 0xafc892b439bc1765, + 0x758ad1e767ae35c1, + 0x3a48cf5a97b1643f, + 0x5cf3647ba3c4629b, + 0x7f54e32ed3c78219, + 0x92dba3fdce8a9f75, + 0xe3d68ac1fc7b9ed1, + 0xde397c621b7eac4f, + 0xc6fa74543972ecab, + 0x3adf98554a85fb29, + 0xa32cb97767a81b95, + 0x6b18592ba68b39f1, + 0xfca2e3dcb49d386f, + 0x816b3a2fe39156db, + 0x1543aec1f1b38649, + 0x391bec8321a794b5, + 0xf6ba25154f8ab523, + 0xfd3cb1e54d6cb28f, + 0x8cfab766596ec1fb, + 0x42615c798a72ef59, + 0xd84c536cb9861fc5, + 0x4ab79f1ed7892e43, + 0x3a879cdfe46a3c9f, + 0xc6fae143247e5b1d, + 0x8fa3571543816b79, + 0xfc371957617389e5, + 0x25acbf498f57b963, + 0xef2dc9187d48a6bf, + 0xf17d62ba9a5bc63d, + 0x4b2af98dc85fe4a9, + 0x918cb431fb942517, + 0xe38da6c21b972483, + 0x768f9a54376842df, + 0x6c9d7a19847b615d, + 0xbfa1ce28724d5fb9, + 0x759e1dfcb3619e27, + 0x187d6a9cbf54ad93, + 0x36742f1cbc359aef, + 0xdbe5c6a1fb38ca6d, + 0x27b89ca21a3be8d9, + 0x3e8bc6432a3ef947, + 0xbf385d187a6428b3, + 0x14c273acba675831, + 0xe5a6932cb639458d, + 0xf63bda5dc23b64f9, + 0x29bc83aed14e9367, + 0x1dc8a5ffef51a2d3, + 0x9fa824643f46c251, + 0x47f2b5843c25bf9d, + 0xb74ec8265a38de1b, + 0x94e2db16592bfd87, + 0xaef6185a984f1ce3, + 0x8be21c7ed9534c61, + 0x9a3c174fe62549bd, + 0xe45a1c71f428693b, + 0x4ec8d2b2132c68a7, + 0x9d23c417623ea815, + 0xd25b6e487f32c681, + 0x4ec98fa87c13b4ed, + 0x7a8b421a9c17e35b, + 0xf2a189dcba19f2c7, + 0xfd7a6b1fea4d1235, + 0x8234f79fe83f42a1, + 0x4cf78d1437124efd, + 0x475e1c9437145e6b, + 0xab8c239653186cd7, + 0x6ecbd1a9821b9c45, + 0x21b5f3776efd9ab1, + 0x3f48c2587adeb92f, + 0x3fa5b42dcaf2e78b, + 0x5831fa7dc9d4e6f7, + 0xf6b7ac332bfa1875, + 0x68925d7548fb36d1, + 0x7c2b84a767ed354f, + 0x695ce3b985f163ab, + 0xc1a6758cb4f58329, + 0x324ae85dc2f7a195, + 0x3c2b4d5badc89fe1, + 0x5a3fc84fe9cbad5f, + 0x2bf74862189fadcb, + 0xe6fb9a854ad2fc39, + 0xfd5eab3549e61ca5, + 0x391afb4878e94b13, + 0x276f9ed985db397f, + 0x1ea67c4a93cd47eb, + 0x415a37bed3e18759, + 0x14358921f1e396c5, + 0xd84165f321e8b643, + 0xe3c584632ec8b39f, + 0x14fe69765eabc31d, + 0x13bf2a765abfe179, + 0xe5a3f8ba9ac421e5, + 0x43265adcb9c72f53, + 0x1543f78dc5b73daf, + 0x5164bdc1f4ba5c2d, + 0x5273b4d213be5c89, + 0xc21fa6d543c18af5, + 0xb38a295761d4ba73, + 0xac6398754e95a7cf, + 0x81279ed76ea9c74d, + 0xc83f42187a8ce5b9, + 0x43f7958dc9aef527, + 0x7ac19461fac42593, + 0xcbf98d3218a643ef, + 0xdf7ec6b437b9526d, + 0x1acd24e654ab61d9, + 0x95cfb8a762ad8f37, + 0x192fc34982b19ea3, + 0x967f8d5baf95bd21, + 0x6132dc9bae85cb7d, + 0x8de153b1fb67dae9, + 0x82e4a6b21b8cfa57, + 0x9ae638c54a8f19c3, + 0x9ae486587ab35941, + 0x2e36dc1987a5469d, + 0x4fb7932dc4a9761b, + 0x3f958abed2ac9487, + 0x7d29148dc18d94e3, + 0x1a4fb3cfef92c361, + 0xf6b7da132f74c1bd, + 0xdf524e843c76df2b, + 0x4a19bd543b58fe97, + 0x8d5217b7697b1df3, + 0xb875649ba98f3d71, + 0x4d73825cb6724acd, + 0x3b52cadfe3856a4b, + 0xe96a8b41f25869b7, + 0x7e2538a2137ca925, + 0x93af56b5426eb791, + 0xf3b987154e61b5fd, + 0x5e7fd3198d73e46b, + 0xf87edbca9b56f3d7, + 0xe8f537cedc8b1345, + 0x8cf39d6fe97d43b1, + 0x63a85feed87e512f, + 0xcb53f98218625f7b, + 0xe97adb6323546de7, + 0x368aef5872489d65, + 0xaecd6138725a9bc1, + 0x45b928e87e4dba3f, + 0xed7bc8fbad41e89b, + 0x642a315edc54f819, + 0x892ea651fc471985, + 0x371d8ba32b5a37e1, + 0xfd6819a3294c365f, + 0xa47df9e7673f54cb, + 0x647eaf9cb7628439, + 0x9a32468dc34692a5, + 0x8fc4139ed469b213, + 0x7c948edcbd29ae6f, + 0x7a68d5e1f92caedb, + 0xdecb15432c31fd49, + 0xb28d5c176c341db5, + 0x2c9ba6487b584c23, + 0xf4ea215767293a8f, + 0x3125d6aa962c48fb, + 0x8937d52dc42f5869, + 0x5423dbcfe43297d5, + 0x74d835b1f126b753, + 0x59fe4d743127b4af, + 0xf217ce465f1ac42d, + 0x12dba9c65c1de289, + 0x75ac4f3a9c4312f5, + 0x8129eaccbc264173, + 0x9d216ceba8163ebf, + 0x64ab3e8dc7195e3d, + 0xe632b871f41c5da9, + 0x27de19f4352f8c17, + 0x7fb493a76512ab83, + 0xfba87d576214a8df, + 0x52137ba54ef6c85d, + 0x3bfa76465bf8e6c9, + 0xfbc5d27a9aecf637, + 0xd5a12b8dc9ef16a3, + 0xfd3c798feaf45621, + 0xac4e8d5219f6537d +}; + +} // namespace detail + +} // namespace random_iterator diff --git a/corsika/detail/framework/random/random_iterator/detail/functors/EngineCaller.hpp b/corsika/detail/framework/random/random_iterator/detail/functors/EngineCaller.hpp new file mode 100644 index 0000000000000000000000000000000000000000..b20ede7fd3a925e2bee0588b18297718e2a6888a --- /dev/null +++ b/corsika/detail/framework/random/random_iterator/detail/functors/EngineCaller.hpp @@ -0,0 +1,90 @@ +/*---------------------------------------------------------------------------- + * + * Copyright (C) 2021 Antonio Augusto Alves Junior + * + * This file is part of RandomIterator. + * + * RandomIterator is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * RandomIterator is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with RandomIterator. If not, see <http://www.gnu.org/licenses/>. + * + *---------------------------------------------------------------------------*/ +/* + * EngineCaller.hpp + * + * Created on: 23/02/2021 + * Author: Antonio Augusto Alves Junior + */ + +#pragma once + +#include <stdint.h> + +namespace random_iterator { + +namespace detail { + +template<typename DistibutionType, typename EngineType> +struct EngineCaller +{ + typedef EngineType engine_type; + typedef typename engine_type::state_type state_type; + typedef typename engine_type::seed_type seed_type; + typedef typename engine_type::advance_type advance_type; + typedef typename engine_type::init_type init_type; + + typedef DistibutionType distribution_type; + typedef typename distribution_type::result_type result_type; + + EngineCaller() = delete; + + EngineCaller(distribution_type const& dist , seed_type seed, uint32_t stream ): + distribution_(dist), + seed_(seed), + stream_(stream) + {} + + EngineCaller( EngineCaller<DistibutionType, EngineType> const& other ): + distribution_(other.distribution_), + seed_(other.seed_), + stream_(other.stream_) + { } + + EngineCaller<DistibutionType, EngineType>& + operator=( EngineCaller<DistibutionType, EngineType> const& other ){ + + if(this == &other) return *this; + + distribution_ = other.distribution_ ; + seed_ = other.seed_ ; + stream_ = other.stream_; + + return *this; + } + + inline result_type operator()(advance_type n) const { + + EngineType eng(seed_, stream_ ); + eng.discard(n); + + return static_cast<distribution_type>(distribution_)(eng); + + } + + distribution_type distribution_; + seed_type seed_; + uint32_t stream_; +}; + +} // namespace detail + +} // namespace random_iterator diff --git a/corsika/detail/framework/random/random_iterator/detail/mulhilo64.h b/corsika/detail/framework/random/random_iterator/detail/mulhilo64.h new file mode 100644 index 0000000000000000000000000000000000000000..db302b745423cf65eb6b8b060007ca6ba5fcd2e2 --- /dev/null +++ b/corsika/detail/framework/random/random_iterator/detail/mulhilo64.h @@ -0,0 +1,56 @@ +/*---------------------------------------------------------------------------- + * + * Copyright (C) 2021 Antonio Augusto Alves Junior + * + * This file is part of RandomIterator. + * + * RandomIterator is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * RandomIterator is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with RandomIterator. If not, see <http://www.gnu.org/licenses/>. + * + *---------------------------------------------------------------------------*/ +/* + * mulhilo64.h + * + * Created on: 12/03/2021 + * Author: Antonio Augusto Alves Junior + */ + +#pragma once + +#include <cmath> +#include <cstdint> + +#ifdef __powerpc64__ +static inline uint64_t _mulhilo_asm_64(uint64_t ax, uint64_t b, uint64_t *hip){ + uint64_t dx; + __asm__("\n\t" + "mulhdu" " %2\n\t" + : "=a"(ax), "=d"(dx) + : "r"(b), "0"(ax) + ); + *hip = dx; + return ax; +} +#else +static inline uint64_t _mulhilo_asm_64(uint64_t ax, uint64_t b, uint64_t *hip){ + uint64_t dx; + __asm__("\n\t" + "mulq" " %2\n\t" + : "=a"(ax), "=d"(dx) + : "r"(b), "0"(ax) + ); + *hip = dx; + return ax; +} + +#endif /* __powerpc64__ */ diff --git a/corsika/detail/framework/random/random_iterator/detail/tbb/internal/_tbb_windef.h b/corsika/detail/framework/random/random_iterator/detail/tbb/internal/_tbb_windef.h new file mode 100644 index 0000000000000000000000000000000000000000..e43d9db696e9d023ad3a6ca1431393418a2832a5 --- /dev/null +++ b/corsika/detail/framework/random/random_iterator/detail/tbb/internal/_tbb_windef.h @@ -0,0 +1,69 @@ +/* + Copyright (c) 2005-2020 Intel Corporation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +#ifndef __RANDOM_ITERATOR_TBB_tbb_windef_H +#error Do not #include this internal file directly; use public TBB headers instead. +#endif /* __RANDOM_ITERATOR_TBB_tbb_windef_H */ + +// Check that the target Windows version has all API calls required for TBB. +// Do not increase the version in condition beyond 0x0500 without prior discussion! +#if defined(_WIN32_WINNT) && _WIN32_WINNT<0x0501 +#error TBB is unable to run on old Windows versions; _WIN32_WINNT must be 0x0501 or greater. +#endif + +#if !defined(_MT) +#error TBB requires linkage with multithreaded C/C++ runtime library. \ + Choose multithreaded DLL runtime in project settings, or use /MD[d] compiler switch. +#endif + +// Workaround for the problem with MVSC headers failing to define namespace std +namespace std { + using ::size_t; using ::ptrdiff_t; +} + +#define __RANDOM_ITERATOR_TBB_STRING_AUX(x) #x +#define __RANDOM_ITERATOR_TBB_STRING(x) __RANDOM_ITERATOR_TBB_STRING_AUX(x) + +// Default setting of RANDOM_ITERATOR_TBB_USE_DEBUG +#ifdef RANDOM_ITERATOR_TBB_USE_DEBUG +# if RANDOM_ITERATOR_TBB_USE_DEBUG +# if !defined(_DEBUG) +# pragma message(__FILE__ "(" __RANDOM_ITERATOR_TBB_STRING(__LINE__) ") : Warning: Recommend using /MDd if compiling with RANDOM_ITERATOR_TBB_USE_DEBUG!=0") +# endif +# else +# if defined(_DEBUG) +# pragma message(__FILE__ "(" __RANDOM_ITERATOR_TBB_STRING(__LINE__) ") : Warning: Recommend using /MD if compiling with RANDOM_ITERATOR_TBB_USE_DEBUG==0") +# endif +# endif +#endif + +#if (__RANDOM_ITERATOR_TBB_BUILD || __RANDOM_ITERATOR_TBBMALLOC_BUILD || __RANDOM_ITERATOR_TBBBIND_BUILD) && !defined(__RANDOM_ITERATOR_TBB_NO_IMPLICIT_LINKAGE) +#define __RANDOM_ITERATOR_TBB_NO_IMPLICIT_LINKAGE 1 +#endif + +#if _MSC_VER + #if !__RANDOM_ITERATOR_TBB_NO_IMPLICIT_LINKAGE + #ifdef __RANDOM_ITERATOR_TBB_LIB_NAME + #pragma comment(lib, __RANDOM_ITERATOR_TBB_STRING(__RANDOM_ITERATOR_TBB_LIB_NAME)) + #else + #ifdef _DEBUG + #pragma comment(lib, "tbb_debug.lib") + #else + #pragma comment(lib, "tbb.lib") + #endif + #endif + #endif +#endif diff --git a/corsika/detail/framework/random/random_iterator/detail/tbb/internal/_template_helpers.h b/corsika/detail/framework/random/random_iterator/detail/tbb/internal/_template_helpers.h new file mode 100644 index 0000000000000000000000000000000000000000..f9f4de0c8e9dafdcd5e43d967d9171594bce97ea --- /dev/null +++ b/corsika/detail/framework/random/random_iterator/detail/tbb/internal/_template_helpers.h @@ -0,0 +1,311 @@ +/* + Copyright (c) 2005-2020 Intel Corporation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +#ifndef __RANDOM_ITERATOR_TBB_template_helpers_H +#define __RANDOM_ITERATOR_TBB_template_helpers_H + +#include <utility> +#include <cstddef> +#include "../tbb_config.h" +#if __RANDOM_ITERATOR_TBB_CPP11_VARIADIC_TEMPLATES_PRESENT && __RANDOM_ITERATOR_TBB_CPP11_TEMPLATE_ALIASES_PRESENT +#include <type_traits> +#endif +#if __RANDOM_ITERATOR_TBB_CPP11_PRESENT +#include <iterator> +#include <memory> // allocator_traits +#endif + +namespace random_iterator_tbb { namespace internal { + +//! Enables one or the other code branches +template<bool Condition, typename T = void> struct enable_if {}; +template<typename T> struct enable_if<true, T> { typedef T type; }; + +//! Strips its template type argument from cv- and ref-qualifiers +template<typename T> struct strip { typedef T type; }; +template<typename T> struct strip<const T> { typedef T type; }; +template<typename T> struct strip<volatile T> { typedef T type; }; +template<typename T> struct strip<const volatile T> { typedef T type; }; +template<typename T> struct strip<T&> { typedef T type; }; +template<typename T> struct strip<const T&> { typedef T type; }; +template<typename T> struct strip<volatile T&> { typedef T type; }; +template<typename T> struct strip<const volatile T&> { typedef T type; }; +//! Specialization for function pointers +template<typename T> struct strip<T(&)()> { typedef T(*type)(); }; +#if __RANDOM_ITERATOR_TBB_CPP11_RVALUE_REF_PRESENT +template<typename T> struct strip<T&&> { typedef T type; }; +template<typename T> struct strip<const T&&> { typedef T type; }; +template<typename T> struct strip<volatile T&&> { typedef T type; }; +template<typename T> struct strip<const volatile T&&> { typedef T type; }; +#endif +//! Specialization for arrays converts to a corresponding pointer +template<typename T, std::size_t N> struct strip<T(&)[N]> { typedef T* type; }; +template<typename T, std::size_t N> struct strip<const T(&)[N]> { typedef const T* type; }; +template<typename T, std::size_t N> struct strip<volatile T(&)[N]> { typedef volatile T* type; }; +template<typename T, std::size_t N> struct strip<const volatile T(&)[N]> { typedef const volatile T* type; }; + +//! Detects whether two given types are the same +template<class U, class V> struct is_same_type { static const bool value = false; }; +template<class W> struct is_same_type<W,W> { static const bool value = true; }; + +template<typename T> struct is_ref { static const bool value = false; }; +template<typename U> struct is_ref<U&> { static const bool value = true; }; + +//! Partial support for std::is_integral +template<typename T> struct is_integral_impl { static const bool value = false; }; +template<> struct is_integral_impl<bool> { static const bool value = true; }; +template<> struct is_integral_impl<char> { static const bool value = true; }; +#if __RANDOM_ITERATOR_TBB_CPP11_PRESENT +template<> struct is_integral_impl<char16_t> { static const bool value = true; }; +template<> struct is_integral_impl<char32_t> { static const bool value = true; }; +#endif +template<> struct is_integral_impl<wchar_t> { static const bool value = true; }; +template<> struct is_integral_impl<short> { static const bool value = true; }; +template<> struct is_integral_impl<int> { static const bool value = true; }; +template<> struct is_integral_impl<long> { static const bool value = true; }; +template<> struct is_integral_impl<long long> { static const bool value = true; }; + +template<typename T> +struct is_integral : is_integral_impl<typename strip<T>::type> {}; + +#if __RANDOM_ITERATOR_TBB_CPP11_VARIADIC_TEMPLATES_PRESENT +//! std::void_t internal implementation (to avoid GCC < 4.7 "template aliases" absence) +template<typename...> struct void_t { typedef void type; }; +#endif + +#if __RANDOM_ITERATOR_TBB_CPP11_VARIADIC_TEMPLATES_PRESENT && __RANDOM_ITERATOR_TBB_CPP11_TEMPLATE_ALIASES_PRESENT + +// Generic SFINAE helper for expression checks, based on the idea demonstrated in ISO C++ paper n4502 +template<typename T, typename, template<typename> class... Checks> +struct supports_impl { typedef std::false_type type; }; +template<typename T, template<typename> class... Checks> +struct supports_impl<T, typename void_t<Checks<T>...>::type, Checks...> { typedef std::true_type type; }; + +template<typename T, template<typename> class... Checks> +using supports = typename supports_impl<T, void, Checks...>::type; + +#endif /* __RANDOM_ITERATOR_TBB_CPP11_VARIADIC_TEMPLATES_PRESENT && __RANDOM_ITERATOR_TBB_CPP11_TEMPLATE_ALIASES_PRESENT */ + +#if __RANDOM_ITERATOR_TBB_CPP11_RVALUE_REF_PRESENT && __RANDOM_ITERATOR_TBB_CPP11_VARIADIC_TEMPLATES_PRESENT + +//! Allows to store a function parameter pack as a variable and later pass it to another function +template< typename... Types > +struct stored_pack; + +template<> +struct stored_pack<> +{ + typedef stored_pack<> pack_type; + stored_pack() {} + + // Friend front-end functions + template< typename F, typename Pack > friend void call( F&& f, Pack&& p ); + template< typename Ret, typename F, typename Pack > friend Ret call_and_return( F&& f, Pack&& p ); + +protected: + // Ideally, ref-qualified non-static methods would be used, + // but that would greatly reduce the set of compilers where it works. + template< typename Ret, typename F, typename... Preceding > + static Ret call( F&& f, const pack_type& /*pack*/, Preceding&&... params ) { + return std::forward<F>(f)( std::forward<Preceding>(params)... ); + } + template< typename Ret, typename F, typename... Preceding > + static Ret call( F&& f, pack_type&& /*pack*/, Preceding&&... params ) { + return std::forward<F>(f)( std::forward<Preceding>(params)... ); + } +}; + +template< typename T, typename... Types > +struct stored_pack<T, Types...> : stored_pack<Types...> +{ + typedef stored_pack<T, Types...> pack_type; + typedef stored_pack<Types...> pack_remainder; + // Since lifetime of original values is out of control, copies should be made. + // Thus references should be stripped away from the deduced type. + typename strip<T>::type leftmost_value; + + // Here rvalue references act in the same way as forwarding references, + // as long as class template parameters were deduced via forwarding references. + stored_pack( T&& t, Types&&... types ) + : pack_remainder(std::forward<Types>(types)...), leftmost_value(std::forward<T>(t)) {} + + // Friend front-end functions + template< typename F, typename Pack > friend void call( F&& f, Pack&& p ); + template< typename Ret, typename F, typename Pack > friend Ret call_and_return( F&& f, Pack&& p ); + +protected: + template< typename Ret, typename F, typename... Preceding > + static Ret call( F&& f, pack_type& pack, Preceding&&... params ) { + return pack_remainder::template call<Ret>( + std::forward<F>(f), static_cast<pack_remainder&>(pack), + std::forward<Preceding>(params)... , pack.leftmost_value + ); + } + template< typename Ret, typename F, typename... Preceding > + static Ret call( F&& f, const pack_type& pack, Preceding&&... params ) { + return pack_remainder::template call<Ret>( + std::forward<F>(f), static_cast<const pack_remainder&>(pack), + std::forward<Preceding>(params)... , pack.leftmost_value + ); + } + template< typename Ret, typename F, typename... Preceding > + static Ret call( F&& f, pack_type&& pack, Preceding&&... params ) { + return pack_remainder::template call<Ret>( + std::forward<F>(f), static_cast<pack_remainder&&>(pack), + std::forward<Preceding>(params)... , std::move(pack.leftmost_value) + ); + } +}; + +//! Calls the given function with arguments taken from a stored_pack +template< typename F, typename Pack > +void call( F&& f, Pack&& p ) { + strip<Pack>::type::template call<void>( std::forward<F>(f), std::forward<Pack>(p) ); +} + +template< typename Ret, typename F, typename Pack > +Ret call_and_return( F&& f, Pack&& p ) { + return strip<Pack>::type::template call<Ret>( std::forward<F>(f), std::forward<Pack>(p) ); +} + +template< typename... Types > +stored_pack<Types...> save_pack( Types&&... types ) { + return stored_pack<Types...>( std::forward<Types>(types)... ); +} + +#endif /* __RANDOM_ITERATOR_TBB_CPP11_RVALUE_REF_PRESENT && __RANDOM_ITERATOR_TBB_CPP11_VARIADIC_TEMPLATES_PRESENT */ + +#if __RANDOM_ITERATOR_TBB_CPP14_INTEGER_SEQUENCE_PRESENT + +using std::index_sequence; +using std::make_index_sequence; + +#elif __RANDOM_ITERATOR_TBB_CPP11_VARIADIC_TEMPLATES_PRESENT && __RANDOM_ITERATOR_TBB_CPP11_TEMPLATE_ALIASES_PRESENT + +template<std::size_t... S> class index_sequence {}; + +template<std::size_t N, std::size_t... S> +struct make_index_sequence_impl : make_index_sequence_impl < N - 1, N - 1, S... > {}; + +template<std::size_t... S> +struct make_index_sequence_impl <0, S...> { + using type = index_sequence<S...>; +}; + +template<std::size_t N> +using make_index_sequence = typename tbb::internal::make_index_sequence_impl<N>::type; + +#endif /* __RANDOM_ITERATOR_TBB_CPP14_INTEGER_SEQUENCE_PRESENT */ + +#if __RANDOM_ITERATOR_TBB_CPP11_VARIADIC_TEMPLATES_PRESENT +template<typename... Args> +struct conjunction; + +template<typename First, typename... Args> +struct conjunction<First, Args...> + : std::conditional<bool(First::value), conjunction<Args...>, First>::type {}; + +template<typename T> +struct conjunction<T> : T {}; + +template<> +struct conjunction<> : std::true_type {}; + +#endif + +#if __RANDOM_ITERATOR_TBB_CPP11_PRESENT + +template< typename Iter > +using iterator_value_t = typename std::iterator_traits<Iter>::value_type; + +template< typename Iter > +using iterator_key_t = typename std::remove_const<typename iterator_value_t<Iter>::first_type>::type; + +template< typename Iter > +using iterator_mapped_t = typename iterator_value_t<Iter>::second_type; + +template< typename A > using value_type = typename A::value_type; +template< typename A > using alloc_ptr_t = typename std::allocator_traits<A>::pointer; +template< typename A > using has_allocate = decltype(std::declval<alloc_ptr_t<A>&>() = std::declval<A>().allocate(0)); +template< typename A > using has_deallocate = decltype(std::declval<A>().deallocate(std::declval<alloc_ptr_t<A>>(), 0)); + +// value_type should be checked first because it can be used in other checks (via allocator_traits) +template< typename T > +using is_allocator = supports<T, value_type, has_allocate, has_deallocate>; + +#if __RANDOM_ITERATOR_TBB_CPP14_VARIABLE_TEMPLATES_PRESENT + +template< typename T > +static constexpr bool is_allocator_v = is_allocator<T>::value; + +#endif /*__RANDOM_ITERATOR_TBB_CPP14_VARIABLE_TEMPLATES */ + +template< std::size_t N, typename... Args > +struct pack_element { + using type = void; +}; + +template< std::size_t N, typename T, typename... Args > +struct pack_element<N, T, Args...> { + using type = typename pack_element<N - 1, Args...>::type; +}; + +template< typename T, typename... Args > +struct pack_element<0, T, Args...> { + using type = T; +}; + +template< std::size_t N, typename... Args > +using pack_element_t = typename pack_element<N, Args...>::type; + +// Helper alias for heterogeneous lookup functions in containers +// template parameter K and std::conditional are needed to provide immediate context +// and postpone getting is_trasparent from the compare functor until method instantiation. +template <typename Comp, typename K> +using is_transparent = typename std::conditional<true, Comp, K>::type::is_transparent; + +#endif /* __RANDOM_ITERATOR_TBB_CPP11_PRESENT */ + +template <typename F> +struct body_arg_detector; + +template <typename Callable, typename ReturnType, typename T> +struct body_arg_detector<ReturnType(Callable::*)(T)> { + typedef T arg_type; +}; + +template <typename Callable, typename ReturnType, typename T> +struct body_arg_detector<ReturnType(Callable::*)(T) const> { + typedef T arg_type; +}; + +#if __RANDOM_ITERATOR_TBB_CPP11_PRESENT +using std::conditional; +#else +template <bool C, typename T, typename U> +struct conditional { + typedef U type; +}; + +template <typename T, typename U> +struct conditional<true, T, U> { + typedef T type; +}; +#endif + +} } // namespace internal, namespace random_iterator_tbb + +#endif /* __RANDOM_ITERATOR_TBB_template_helpers_H */ diff --git a/corsika/detail/framework/random/random_iterator/detail/tbb/iterators.h b/corsika/detail/framework/random/random_iterator/detail/tbb/iterators.h new file mode 100644 index 0000000000000000000000000000000000000000..46b407aaaeb727307caaaffe458c42767610233e --- /dev/null +++ b/corsika/detail/framework/random/random_iterator/detail/tbb/iterators.h @@ -0,0 +1,366 @@ +/* + Copyright (c) 2017-2020 Intel Corporation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +#ifndef __RANDOM_ITERATOR_TBB_iterators_H +#define __RANDOM_ITERATOR_TBB_iterators_H + +#include <iterator> +#include <limits> + +#include "tbb_config.h" +#include "tbb_stddef.h" + +#if __RANDOM_ITERATOR_TBB_CPP11_PRESENT + +#include <type_traits> + +namespace random_iterator_tbb { + + +template <typename Type> +class constant_iterator { + +public: + typedef typename std::size_t difference_type; + typedef Type value_type; + typedef const Type* pointer; + typedef const Type& reference; + typedef std::random_access_iterator_tag iterator_category; + + constant_iterator() : my_value() {} + explicit constant_iterator(Type init) : my_value(init) {} + + inline reference operator*() const { return my_value; } + inline value_type operator[](difference_type i) const { return my_value; } + + inline difference_type operator-(const constant_iterator<Type>& it) const { return 0; } + + inline constant_iterator<Type>& operator+=(difference_type forward) const { return *this; } + inline constant_iterator<Type>& operator-=(difference_type backward) const { return *this; } + inline constant_iterator<Type>& operator++() const { return *this; } + inline constant_iterator<Type>& operator--() const { return *this; } + + inline constant_iterator<Type> operator++(int) { return constant_iterator<Type>(my_value); } + + inline constant_iterator<Type> operator--(int) { return constant_iterator<Type>(my_value); } + + inline constant_iterator<Type> operator-(difference_type backward) const { return constant_iterator<Type>(my_value); } + inline constant_iterator<Type> operator+(difference_type forward) const { return constant_iterator<Type>(my_value); } + friend constant_iterator<Type> operator+(difference_type forward, const constant_iterator<Type> it) { return constant_iterator<Type>(*it); } + + inline bool operator==(const constant_iterator<Type>& it) const { return (my_value - *it) == 0; } + inline bool operator!=(const constant_iterator<Type>& it) const { return !(my_value == *it); } + +private: + const value_type my_value; +}; + + +template <typename IntType> +class counting_iterator { + __RANDOM_ITERATOR_TBB_STATIC_ASSERT(std::numeric_limits<IntType>::is_integer, "Cannot instantiate counting_iterator with a non-integer type"); +public: + typedef typename std::make_signed<IntType>::type difference_type; + typedef IntType value_type; + typedef const IntType* pointer; + typedef const IntType& reference; + typedef std::random_access_iterator_tag iterator_category; + + counting_iterator() : my_counter() {} + explicit counting_iterator(IntType init) : my_counter(init) {} + + inline reference operator*() const { return my_counter; } + inline value_type operator[](difference_type i) const { return *(*this + i); } + + inline difference_type operator-(const counting_iterator& it) const { return my_counter - it.my_counter; } + + inline counting_iterator& operator+=(difference_type forward) { my_counter += forward; return *this; } + inline counting_iterator& operator-=(difference_type backward) { return *this += -backward; } + inline counting_iterator& operator++() { return *this += 1; } + inline counting_iterator& operator--() { return *this -= 1; } + + inline counting_iterator operator++(int) { + counting_iterator it(*this); + ++(*this); + return it; + } + inline counting_iterator operator--(int) { + counting_iterator it(*this); + --(*this); + return it; + } + + inline counting_iterator operator-(difference_type backward) const { return counting_iterator(my_counter - backward); } + inline counting_iterator operator+(difference_type forward) const { return counting_iterator(my_counter + forward); } + friend counting_iterator operator+(difference_type forward, const counting_iterator it) { return it + forward; } + + inline bool operator==(const counting_iterator& it) const { return *this - it == 0; } + inline bool operator!=(const counting_iterator& it) const { return !(*this == it); } + inline bool operator<(const counting_iterator& it) const {return *this - it < 0; } + inline bool operator>(const counting_iterator& it) const { return it < *this; } + inline bool operator<=(const counting_iterator& it) const { return !(*this > it); } + inline bool operator>=(const counting_iterator& it) const { return !(*this < it); } + +private: + IntType my_counter; +}; +} //namespace random_iterator_tbb + + +#include <tuple> + +#include "internal/_template_helpers.h" // index_sequence, make_index_sequence + +namespace random_iterator_tbb { +namespace internal { + +template<size_t N> +struct tuple_util { + template<typename TupleType, typename DifferenceType> + static void increment(TupleType& it, DifferenceType forward) { + std::get<N-1>(it) += forward; + tuple_util<N-1>::increment(it, forward); + } + template<typename TupleType, typename DifferenceType> + static bool check_sync(const TupleType& it1, const TupleType& it2, DifferenceType val) { + if(std::get<N-1>(it1) - std::get<N-1>(it2) != val) + return false; + return tuple_util<N-1>::check_sync(it1, it2, val); + } +}; + +template<> +struct tuple_util<0> { + template<typename TupleType, typename DifferenceType> + static void increment(TupleType&, DifferenceType) {} + template<typename TupleType, typename DifferenceType> + static bool check_sync(const TupleType&, const TupleType&, DifferenceType) { return true;} +}; + +template <typename TupleReturnType> +struct make_references { + template <typename TupleType, std::size_t... Is> + TupleReturnType operator()(const TupleType& t, random_iterator_tbb::internal::index_sequence<Is...>) { + return std::tie( *std::get<Is>(t)... ); + } +}; + +// A simple wrapper over a tuple of references. +// The class is designed to hold a temporary tuple of reference +// after dereferencing a zip_iterator; in particular, it is needed +// to swap these rvalue tuples. Any other usage is not supported. +template<typename... T> +struct tuplewrapper : public std::tuple<typename std::enable_if<std::is_reference<T>::value, T&&>::type...> { + // In the context of this class, T is a reference, so T&& is a "forwarding reference" + typedef std::tuple<T&&...> base_type; + // Construct from the result of std::tie + tuplewrapper(const base_type& in) : base_type(in) {} +#if __INTEL_COMPILER + // ICC cannot generate copy ctor & assignment + tuplewrapper(const tuplewrapper& rhs) : base_type(rhs) {} + tuplewrapper& operator=(const tuplewrapper& rhs) { + *this = base_type(rhs); + return *this; + } +#endif + // Assign any tuple convertible to std::tuple<T&&...>: *it = a_tuple; + template<typename... U> + tuplewrapper& operator=(const std::tuple<U...>& other) { + base_type::operator=(other); + return *this; + } +#if _LIBCPP_VERSION + // (Necessary for libc++ tuples) Convert to a tuple of values: v = *it; + operator std::tuple<typename std::remove_reference<T>::type...>() { return base_type(*this); } +#endif + // Swap rvalue tuples: swap(*it1,*it2); + friend void swap(tuplewrapper&& a, tuplewrapper&& b) { + std::swap<T&&...>(a,b); + } +}; + +} //namespace internal + +template <typename... Types> +class zip_iterator { + __RANDOM_ITERATOR_TBB_STATIC_ASSERT(sizeof...(Types)>0, "Cannot instantiate zip_iterator with empty template parameter pack"); + static const std::size_t num_types = sizeof...(Types); + typedef std::tuple<Types...> it_types; +public: + typedef typename std::make_signed<std::size_t>::type difference_type; + typedef std::tuple<typename std::iterator_traits<Types>::value_type...> value_type; +#if __INTEL_COMPILER && __INTEL_COMPILER < 1800 && _MSC_VER + typedef std::tuple<typename std::iterator_traits<Types>::reference...> reference; +#else + typedef random_iterator_tbb::internal::tuplewrapper<typename std::iterator_traits<Types>::reference...> reference; +#endif + typedef std::tuple<typename std::iterator_traits<Types>::pointer...> pointer; + typedef std::random_access_iterator_tag iterator_category; + + zip_iterator() : my_it() {} + explicit zip_iterator(Types... args) : my_it(std::make_tuple(args...)) {} + zip_iterator(const zip_iterator& input) : my_it(input.my_it) {} + zip_iterator& operator=(const zip_iterator& input) { + my_it = input.my_it; + return *this; + } + + reference operator*() const { + return random_iterator_tbb::internal::make_references<reference>()(my_it, random_iterator_tbb::internal::make_index_sequence<num_types>()); + } + reference operator[](difference_type i) const { return *(*this + i); } + + difference_type operator-(const zip_iterator& it) const { + __RANDOM_ITERATOR_TBB_ASSERT(internal::tuple_util<num_types>::check_sync(my_it, it.my_it, std::get<0>(my_it) - std::get<0>(it.my_it)), + "Components of zip_iterator are not synchronous"); + return std::get<0>(my_it) - std::get<0>(it.my_it); + } + + zip_iterator& operator+=(difference_type forward) { + internal::tuple_util<num_types>::increment(my_it, forward); + return *this; + } + zip_iterator& operator-=(difference_type backward) { return *this += -backward; } + zip_iterator& operator++() { return *this += 1; } + zip_iterator& operator--() { return *this -= 1; } + + zip_iterator operator++(int) { + zip_iterator it(*this); + ++(*this); + return it; + } + zip_iterator operator--(int) { + zip_iterator it(*this); + --(*this); + return it; + } + + zip_iterator operator-(difference_type backward) const { + zip_iterator it(*this); + return it -= backward; + } + zip_iterator operator+(difference_type forward) const { + zip_iterator it(*this); + return it += forward; + } + friend zip_iterator operator+(difference_type forward, const zip_iterator& it) { return it + forward; } + + bool operator==(const zip_iterator& it) const { + return *this - it == 0; + } + it_types base() const { return my_it; } + + bool operator!=(const zip_iterator& it) const { return !(*this == it); } + bool operator<(const zip_iterator& it) const { return *this - it < 0; } + bool operator>(const zip_iterator& it) const { return it < *this; } + bool operator<=(const zip_iterator& it) const { return !(*this > it); } + bool operator>=(const zip_iterator& it) const { return !(*this < it); } +private: + it_types my_it; +}; + +template<typename... T> +zip_iterator<T...> make_zip_iterator(T... args) { return zip_iterator<T...>(args...); } + +template <typename UnaryFunc, typename Iter> +class transform_iterator { +public: + typedef typename std::iterator_traits<Iter>::value_type value_type; + typedef typename std::iterator_traits<Iter>::difference_type difference_type; +#if __RANDOM_ITERATOR_TBB_CPP17_INVOKE_RESULT_PRESENT + typedef typename std::invoke_result<UnaryFunc, typename std::iterator_traits<Iter>::reference>::type reference; +#else + typedef typename std::result_of<UnaryFunc(typename std::iterator_traits<Iter>::reference)>::type reference; +#endif + typedef typename std::iterator_traits<Iter>::pointer pointer; + typedef typename std::random_access_iterator_tag iterator_category; + + transform_iterator(Iter it, UnaryFunc unary_func) : my_it(it), my_unary_func(unary_func) { + __RANDOM_ITERATOR_TBB_STATIC_ASSERT((std::is_same<typename std::iterator_traits<Iter>::iterator_category, + std::random_access_iterator_tag>::value), "Random access iterator required."); + } + transform_iterator(const transform_iterator& input) : my_it(input.my_it), my_unary_func(input.my_unary_func) { } + transform_iterator& operator=(const transform_iterator& input) { + my_it = input.my_it; + return *this; + } + reference operator*() const { + return my_unary_func(*my_it); + } + reference operator[](difference_type i) const { + return *(*this + i); + } + transform_iterator& operator++() { + ++my_it; + return *this; + } + transform_iterator& operator--() { + --my_it; + return *this; + } + transform_iterator operator++(int) { + transform_iterator it(*this); + ++(*this); + return it; + } + transform_iterator operator--(int) { + transform_iterator it(*this); + --(*this); + return it; + } + transform_iterator operator+(difference_type forward) const { + return { my_it + forward, my_unary_func }; + } + transform_iterator operator-(difference_type backward) const { + return { my_it - backward, my_unary_func }; + } + transform_iterator& operator+=(difference_type forward) { + my_it += forward; + return *this; + } + transform_iterator& operator-=(difference_type backward) { + my_it -= backward; + return *this; + } + friend transform_iterator operator+(difference_type forward, const transform_iterator& it) { + return it + forward; + } + difference_type operator-(const transform_iterator& it) const { + return my_it - it.my_it; + } + bool operator==(const transform_iterator& it) const { return *this - it == 0; } + bool operator!=(const transform_iterator& it) const { return !(*this == it); } + bool operator<(const transform_iterator& it) const { return *this - it < 0; } + bool operator>(const transform_iterator& it) const { return it < *this; } + bool operator<=(const transform_iterator& it) const { return !(*this > it); } + bool operator>=(const transform_iterator& it) const { return !(*this < it); } + + Iter base() const { return my_it; } +private: + Iter my_it; + const UnaryFunc my_unary_func; +}; + +template<typename UnaryFunc, typename Iter> +transform_iterator<UnaryFunc, Iter> make_transform_iterator(Iter it, UnaryFunc unary_func) { + return transform_iterator<UnaryFunc, Iter>(it, unary_func); +} + +} //namespace random_iterator_tbb + +#endif //__RANDOM_ITERATOR_TBB_CPP11_PRESENT + +#endif /* __RANDOM_ITERATOR_TBB_iterators_H */ diff --git a/corsika/detail/framework/random/random_iterator/detail/tbb/tbb_config.h b/corsika/detail/framework/random/random_iterator/detail/tbb/tbb_config.h new file mode 100644 index 0000000000000000000000000000000000000000..a185aeab879de7dccf16e3e06447f237959e490a --- /dev/null +++ b/corsika/detail/framework/random/random_iterator/detail/tbb/tbb_config.h @@ -0,0 +1,873 @@ +/* + Copyright (c) 2005-2020 Intel Corporation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +#ifndef __RANDOM_ITERATOR_TBB_tbb_config_H +#define __RANDOM_ITERATOR_TBB_tbb_config_H + +/** This header is supposed to contain macro definitions and C style comments only. + The macros defined here are intended to control such aspects of TBB build as + - presence of compiler features + - compilation modes + - feature sets + - known compiler/platform issues +**/ + +/* This macro marks incomplete code or comments describing ideas which are considered for the future. + * See also for plain comment with TODO and FIXME marks for small improvement opportunities. + */ +#define __RANDOM_ITERATOR_TBB_TODO 0 + +/* Check which standard library we use. */ +/* __RANDOM_ITERATOR_TBB_SYMBOL is defined only while processing exported symbols list where C++ is not allowed. */ +#if !defined(__RANDOM_ITERATOR_TBB_SYMBOL) && !__RANDOM_ITERATOR_TBB_CONFIG_PREPROC_ONLY + #include <cstddef> +#endif + +// Note that when ICC or Clang is in use, __RANDOM_ITERATOR_TBB_GCC_VERSION might not fully match +// the actual GCC version on the system. +#define __RANDOM_ITERATOR_TBB_GCC_VERSION (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) + +// Prior to GCC 7, GNU libstdc++ did not have a convenient version macro. +// Therefore we use different ways to detect its version. +#if defined(RANDOM_ITERATOR_TBB_USE_GLIBCXX_VERSION) && !defined(_GLIBCXX_RELEASE) +// The version is explicitly specified in our public RANDOM_ITERATOR_TBB_USE_GLIBCXX_VERSION macro. +// Its format should match the __RANDOM_ITERATOR_TBB_GCC_VERSION above, e.g. 70301 for libstdc++ coming with GCC 7.3.1. +#define __RANDOM_ITERATOR_TBB_GLIBCXX_VERSION RANDOM_ITERATOR_TBB_USE_GLIBCXX_VERSION +#elif _GLIBCXX_RELEASE && _GLIBCXX_RELEASE != __GNUC__ +// Reported versions of GCC and libstdc++ do not match; trust the latter +#define __RANDOM_ITERATOR_TBB_GLIBCXX_VERSION (_GLIBCXX_RELEASE*10000) +#elif __GLIBCPP__ || __GLIBCXX__ +// The version macro is not defined or matches the GCC version; use __RANDOM_ITERATOR_TBB_GCC_VERSION +#define __RANDOM_ITERATOR_TBB_GLIBCXX_VERSION __RANDOM_ITERATOR_TBB_GCC_VERSION +#endif + +#if __clang__ + // according to clang documentation, version can be vendor specific + #define __RANDOM_ITERATOR_TBB_CLANG_VERSION (__clang_major__ * 10000 + __clang_minor__ * 100 + __clang_patchlevel__) +#endif + +/** Target OS is either iOS* or iOS* simulator **/ +#if __ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__ + #define __RANDOM_ITERATOR_TBB_IOS 1 +#endif + +#if __APPLE__ + #if __INTEL_COMPILER && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ > 1099 \ + && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 101000 + // ICC does not correctly set the macro if -mmacosx-min-version is not specified + #define __RANDOM_ITERATOR_TBB_MACOS_TARGET_VERSION (100000 + 10*(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ - 1000)) + #else + #define __RANDOM_ITERATOR_TBB_MACOS_TARGET_VERSION __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ + #endif +#endif + +/** Preprocessor symbols to determine HW architecture **/ + +#if _WIN32||_WIN64 +# if defined(_M_X64)||defined(__x86_64__) // the latter for MinGW support +# define __RANDOM_ITERATOR_TBB_x86_64 1 +# elif defined(_M_IA64) +# define __RANDOM_ITERATOR_TBB_ipf 1 +# elif defined(_M_IX86)||defined(__i386__) // the latter for MinGW support +# define __RANDOM_ITERATOR_TBB_x86_32 1 +# else +# define __RANDOM_ITERATOR_TBB_generic_arch 1 +# endif +#else /* Assume generic Unix */ +# if !__linux__ && !__APPLE__ +# define __RANDOM_ITERATOR_TBB_generic_os 1 +# endif +# if __RANDOM_ITERATOR_TBB_IOS +# define __RANDOM_ITERATOR_TBB_generic_arch 1 +# elif __x86_64__ +# define __RANDOM_ITERATOR_TBB_x86_64 1 +# elif __ia64__ +# define __RANDOM_ITERATOR_TBB_ipf 1 +# elif __i386__||__i386 // __i386 is for Sun OS +# define __RANDOM_ITERATOR_TBB_x86_32 1 +# else +# define __RANDOM_ITERATOR_TBB_generic_arch 1 +# endif +#endif + +#if __MIC__ || __MIC2__ +#define __RANDOM_ITERATOR_TBB_DEFINE_MIC 1 +#endif + +#define __RANDOM_ITERATOR_TBB_TSX_AVAILABLE ((__RANDOM_ITERATOR_TBB_x86_32 || __RANDOM_ITERATOR_TBB_x86_64) && !__RANDOM_ITERATOR_TBB_DEFINE_MIC) + +/** Presence of compiler features **/ + +#if __INTEL_COMPILER == 9999 && __INTEL_COMPILER_BUILD_DATE == 20110811 +/* Intel(R) Composer XE 2011 Update 6 incorrectly sets __INTEL_COMPILER. Fix it. */ + #undef __INTEL_COMPILER + #define __INTEL_COMPILER 1210 +#endif + +#if __clang__ && !__INTEL_COMPILER +#define __RANDOM_ITERATOR_RANDOM_ITERATOR_TBB_USE_OPTIONAL_RTTI __has_feature(cxx_rtti) +#elif defined(_CPPRTTI) +#define __RANDOM_ITERATOR_RANDOM_ITERATOR_TBB_USE_OPTIONAL_RTTI 1 +#else +#define __RANDOM_ITERATOR_RANDOM_ITERATOR_TBB_USE_OPTIONAL_RTTI (__GXX_RTTI || __RTTI || __INTEL_RTTI__) +#endif + +#if __RANDOM_ITERATOR_TBB_GCC_VERSION >= 40400 && !defined(__INTEL_COMPILER) + /** warning suppression pragmas available in GCC since 4.4 **/ + #define __RANDOM_ITERATOR_TBB_GCC_WARNING_SUPPRESSION_PRESENT 1 +#endif + +/* Select particular features of C++11 based on compiler version. + ICC 12.1 (Linux*), GCC 4.3 and higher, clang 2.9 and higher + set __GXX_EXPERIMENTAL_CXX0X__ in c++11 mode. + + Compilers that mimics other compilers (ICC, clang) must be processed before + compilers they mimic (GCC, MSVC). + + TODO: The following conditions should be extended when new compilers/runtimes + support added. + */ + +/** + __RANDOM_ITERATOR_TBB_CPP11_PRESENT macro indicates that the compiler supports vast majority of C++11 features. + Depending on the compiler, some features might still be unsupported or work incorrectly. + Use it when enabling C++11 features individually is not practical, and be aware that + some "good enough" compilers might be excluded. **/ +#define __RANDOM_ITERATOR_TBB_CPP11_PRESENT (__cplusplus >= 201103L || _MSC_VER >= 1900) + +#define __RANDOM_ITERATOR_TBB_CPP17_FALLTHROUGH_PRESENT (__cplusplus >= 201703L) +#define __RANDOM_ITERATOR_TBB_FALLTHROUGH_PRESENT (__RANDOM_ITERATOR_TBB_GCC_VERSION >= 70000 && !__INTEL_COMPILER) + +/** C++11 mode detection macros for Intel(R) C++ Compiler (enabled by -std=c++XY option): + __INTEL_CXX11_MODE__ for version >=13.0 (not available for ICC 15.0 if -std=c++14 is used), + __STDC_HOSTED__ for version >=12.0 (useful only on Windows), + __GXX_EXPERIMENTAL_CXX0X__ for version >=12.0 on Linux and macOS. **/ +#if __INTEL_COMPILER && !__INTEL_CXX11_MODE__ + // __INTEL_CXX11_MODE__ is not set, try to deduce it + #define __INTEL_CXX11_MODE__ (__GXX_EXPERIMENTAL_CXX0X__ || (_MSC_VER && __STDC_HOSTED__)) +#endif + +#if __INTEL_COMPILER && (!_MSC_VER || __INTEL_CXX11_MODE__) + // On Windows, C++11 features supported by Visual Studio 2010 and higher are enabled by default, + // so in absence of /Qstd= use MSVC branch for feature detection. + // On other platforms, no -std= means C++03. + + #define __RANDOM_ITERATOR_TBB_CPP11_VARIADIC_TEMPLATES_PRESENT (__INTEL_CXX11_MODE__ && __VARIADIC_TEMPLATES) + // Both r-value reference support in compiler and std::move/std::forward + // presence in C++ standard library is checked. + #define __RANDOM_ITERATOR_TBB_CPP11_RVALUE_REF_PRESENT ((_MSC_VER >= 1700 || __GXX_EXPERIMENTAL_CXX0X__ && (__RANDOM_ITERATOR_TBB_GLIBCXX_VERSION >= 40500 || _LIBCPP_VERSION)) && __INTEL_COMPILER >= 1400) + #define __RANDOM_ITERATOR_TBB_IMPLICIT_MOVE_PRESENT (__INTEL_CXX11_MODE__ && __INTEL_COMPILER >= 1400 && (_MSC_VER >= 1900 || __RANDOM_ITERATOR_TBB_GCC_VERSION >= 40600 || __clang__)) + #if _MSC_VER >= 1600 + #define __RANDOM_ITERATOR_TBB_EXCEPTION_PTR_PRESENT ( __INTEL_COMPILER > 1300 \ + /*ICC 12.1 Upd 10 and 13 beta Upd 2 fixed exception_ptr linking issue*/ \ + || (__INTEL_COMPILER == 1300 && __INTEL_COMPILER_BUILD_DATE >= 20120530) \ + || (__INTEL_COMPILER == 1210 && __INTEL_COMPILER_BUILD_DATE >= 20120410) ) + /** libstdc++ that comes with GCC 4.6 use C++11 features not supported by ICC 12.1. + * Because of that ICC 12.1 does not support C++11 mode with gcc 4.6 (or higher), + * and therefore does not define __GXX_EXPERIMENTAL_CXX0X__ macro **/ + #elif __RANDOM_ITERATOR_TBB_GLIBCXX_VERSION >= 40404 && __RANDOM_ITERATOR_TBB_GLIBCXX_VERSION < 40600 + #define __RANDOM_ITERATOR_TBB_EXCEPTION_PTR_PRESENT (__GXX_EXPERIMENTAL_CXX0X__ && __INTEL_COMPILER >= 1200) + #elif __RANDOM_ITERATOR_TBB_GLIBCXX_VERSION >= 40600 + #define __RANDOM_ITERATOR_TBB_EXCEPTION_PTR_PRESENT (__GXX_EXPERIMENTAL_CXX0X__ && __INTEL_COMPILER >= 1300) + #elif _LIBCPP_VERSION + #define __RANDOM_ITERATOR_TBB_EXCEPTION_PTR_PRESENT __GXX_EXPERIMENTAL_CXX0X__ + #else + #define __RANDOM_ITERATOR_TBB_EXCEPTION_PTR_PRESENT 0 + #endif + #define __RANDOM_ITERATOR_TBB_STATIC_ASSERT_PRESENT (__INTEL_CXX11_MODE__ || _MSC_VER >= 1600) + #define __RANDOM_ITERATOR_TBB_CPP11_TUPLE_PRESENT (_MSC_VER >= 1600 || __GXX_EXPERIMENTAL_CXX0X__ && (__RANDOM_ITERATOR_TBB_GLIBCXX_VERSION >= 40300 || _LIBCPP_VERSION)) + #define __RANDOM_ITERATOR_TBB_INITIALIZER_LISTS_PRESENT (__INTEL_CXX11_MODE__ && __INTEL_COMPILER >= 1400 && (_MSC_VER >= 1800 || __RANDOM_ITERATOR_TBB_GLIBCXX_VERSION >= 40400 || _LIBCPP_VERSION)) + #define __RANDOM_ITERATOR_TBB_CONSTEXPR_PRESENT (__INTEL_CXX11_MODE__ && __INTEL_COMPILER >= 1400) + #define __RANDOM_ITERATOR_TBB_DEFAULTED_AND_DELETED_FUNC_PRESENT (__INTEL_CXX11_MODE__ && __INTEL_COMPILER >= 1200) + /** ICC seems to disable support of noexcept event in c++11 when compiling in compatibility mode for gcc <4.6 **/ + #define __RANDOM_ITERATOR_TBB_NOEXCEPT_PRESENT (__INTEL_CXX11_MODE__ && __INTEL_COMPILER >= 1300 && (__RANDOM_ITERATOR_TBB_GLIBCXX_VERSION >= 40600 || _LIBCPP_VERSION || _MSC_VER)) + #define __RANDOM_ITERATOR_TBB_CPP11_STD_BEGIN_END_PRESENT (_MSC_VER >= 1700 || __GXX_EXPERIMENTAL_CXX0X__ && __INTEL_COMPILER >= 1310 && (__RANDOM_ITERATOR_TBB_GLIBCXX_VERSION >= 40600 || _LIBCPP_VERSION)) + #define __RANDOM_ITERATOR_TBB_CPP11_AUTO_PRESENT (_MSC_VER >= 1600 || __GXX_EXPERIMENTAL_CXX0X__ && __INTEL_COMPILER >= 1210) + #define __RANDOM_ITERATOR_TBB_CPP11_DECLTYPE_PRESENT (_MSC_VER >= 1600 || __GXX_EXPERIMENTAL_CXX0X__ && __INTEL_COMPILER >= 1210) + #define __RANDOM_ITERATOR_TBB_CPP11_LAMBDAS_PRESENT (__INTEL_CXX11_MODE__ && __INTEL_COMPILER >= 1200) + #define __RANDOM_ITERATOR_TBB_CPP11_DEFAULT_FUNC_TEMPLATE_ARGS_PRESENT (_MSC_VER >= 1800 || __GXX_EXPERIMENTAL_CXX0X__ && __INTEL_COMPILER >= 1210) + #define __RANDOM_ITERATOR_TBB_OVERRIDE_PRESENT (__INTEL_CXX11_MODE__ && __INTEL_COMPILER >= 1400) + #define __RANDOM_ITERATOR_TBB_ALIGNAS_PRESENT (__INTEL_CXX11_MODE__ && __INTEL_COMPILER >= 1500) + #define __RANDOM_ITERATOR_TBB_CPP11_TEMPLATE_ALIASES_PRESENT (__INTEL_CXX11_MODE__ && __INTEL_COMPILER >= 1210) + #define __RANDOM_ITERATOR_TBB_CPP14_INTEGER_SEQUENCE_PRESENT (__cplusplus >= 201402L) + #define __RANDOM_ITERATOR_TBB_CPP14_VARIABLE_TEMPLATES_PRESENT (__cplusplus >= 201402L) + #define __RANDOM_ITERATOR_TBB_CPP17_DEDUCTION_GUIDES_PRESENT (__INTEL_COMPILER > 1910) // a future version + #define __RANDOM_ITERATOR_TBB_CPP17_INVOKE_RESULT_PRESENT (__cplusplus >= 201703L) +#elif __clang__ +/** TODO: these options need to be rechecked **/ + #define __RANDOM_ITERATOR_TBB_CPP11_VARIADIC_TEMPLATES_PRESENT __has_feature(__cxx_variadic_templates__) + #define __RANDOM_ITERATOR_TBB_CPP11_RVALUE_REF_PRESENT (__has_feature(__cxx_rvalue_references__) && (_LIBCPP_VERSION || __RANDOM_ITERATOR_TBB_GLIBCXX_VERSION >= 40500)) + #define __RANDOM_ITERATOR_TBB_IMPLICIT_MOVE_PRESENT __has_feature(cxx_implicit_moves) +/** TODO: extend exception_ptr related conditions to cover libstdc++ **/ + #define __RANDOM_ITERATOR_TBB_EXCEPTION_PTR_PRESENT (__cplusplus >= 201103L && (_LIBCPP_VERSION || __RANDOM_ITERATOR_TBB_GLIBCXX_VERSION >= 40600)) + #define __RANDOM_ITERATOR_TBB_STATIC_ASSERT_PRESENT __has_feature(__cxx_static_assert__) + #if (__cplusplus >= 201103L && __has_include(<tuple>)) + #define __RANDOM_ITERATOR_TBB_CPP11_TUPLE_PRESENT 1 + #endif + #if (__has_feature(__cxx_generalized_initializers__) && __has_include(<initializer_list>)) + #define __RANDOM_ITERATOR_TBB_INITIALIZER_LISTS_PRESENT 1 + #endif + #define __RANDOM_ITERATOR_TBB_CONSTEXPR_PRESENT __has_feature(__cxx_constexpr__) + #define __RANDOM_ITERATOR_TBB_DEFAULTED_AND_DELETED_FUNC_PRESENT (__has_feature(__cxx_defaulted_functions__) && __has_feature(__cxx_deleted_functions__)) + /**For some unknown reason __has_feature(__cxx_noexcept) does not yield true for all cases. Compiler bug ? **/ + #define __RANDOM_ITERATOR_TBB_NOEXCEPT_PRESENT (__cplusplus >= 201103L) + #define __RANDOM_ITERATOR_TBB_CPP11_STD_BEGIN_END_PRESENT (__has_feature(__cxx_range_for__) && (_LIBCPP_VERSION || __RANDOM_ITERATOR_TBB_GLIBCXX_VERSION >= 40600)) + #define __RANDOM_ITERATOR_TBB_CPP11_AUTO_PRESENT __has_feature(__cxx_auto_type__) + #define __RANDOM_ITERATOR_TBB_CPP11_DECLTYPE_PRESENT __has_feature(__cxx_decltype__) + #define __RANDOM_ITERATOR_TBB_CPP11_LAMBDAS_PRESENT __has_feature(cxx_lambdas) + #define __RANDOM_ITERATOR_TBB_CPP11_DEFAULT_FUNC_TEMPLATE_ARGS_PRESENT __has_feature(cxx_default_function_template_args) + #define __RANDOM_ITERATOR_TBB_OVERRIDE_PRESENT __has_feature(cxx_override_control) + #define __RANDOM_ITERATOR_TBB_ALIGNAS_PRESENT __has_feature(cxx_alignas) + #define __RANDOM_ITERATOR_TBB_CPP11_TEMPLATE_ALIASES_PRESENT __has_feature(cxx_alias_templates) + #define __RANDOM_ITERATOR_TBB_CPP14_INTEGER_SEQUENCE_PRESENT (__cplusplus >= 201402L) + #define __RANDOM_ITERATOR_TBB_CPP14_VARIABLE_TEMPLATES_PRESENT (__has_feature(cxx_variable_templates)) + #define __RANDOM_ITERATOR_TBB_CPP17_DEDUCTION_GUIDES_PRESENT (__has_feature(__cpp_deduction_guides)) + #define __RANDOM_ITERATOR_TBB_CPP17_INVOKE_RESULT_PRESENT (__has_feature(__cpp_lib_is_invocable)) +#elif __GNUC__ + #define __RANDOM_ITERATOR_TBB_CPP11_VARIADIC_TEMPLATES_PRESENT __GXX_EXPERIMENTAL_CXX0X__ + #define __RANDOM_ITERATOR_TBB_CPP11_VARIADIC_FIXED_LENGTH_EXP_PRESENT (__GXX_EXPERIMENTAL_CXX0X__ && __RANDOM_ITERATOR_TBB_GCC_VERSION >= 40700) + #define __RANDOM_ITERATOR_TBB_CPP11_RVALUE_REF_PRESENT (__GXX_EXPERIMENTAL_CXX0X__ && __RANDOM_ITERATOR_TBB_GCC_VERSION >= 40500) + #define __RANDOM_ITERATOR_TBB_IMPLICIT_MOVE_PRESENT (__GXX_EXPERIMENTAL_CXX0X__ && __RANDOM_ITERATOR_TBB_GCC_VERSION >= 40600) + /** __GCC_HAVE_SYNC_COMPARE_AND_SWAP_4 here is a substitution for _GLIBCXX_ATOMIC_BUILTINS_4, which is a prerequisite + for exception_ptr but cannot be used in this file because it is defined in a header, not by the compiler. + If the compiler has no atomic intrinsics, the C++ library should not expect those as well. **/ + #define __RANDOM_ITERATOR_TBB_EXCEPTION_PTR_PRESENT (__GXX_EXPERIMENTAL_CXX0X__ && __RANDOM_ITERATOR_TBB_GCC_VERSION >= 40404 && __GCC_HAVE_SYNC_COMPARE_AND_SWAP_4) + #define __RANDOM_ITERATOR_TBB_STATIC_ASSERT_PRESENT (__GXX_EXPERIMENTAL_CXX0X__ && __RANDOM_ITERATOR_TBB_GCC_VERSION >= 40300) + #define __RANDOM_ITERATOR_TBB_CPP11_TUPLE_PRESENT (__GXX_EXPERIMENTAL_CXX0X__ && __RANDOM_ITERATOR_TBB_GCC_VERSION >= 40300) + #define __RANDOM_ITERATOR_TBB_INITIALIZER_LISTS_PRESENT (__GXX_EXPERIMENTAL_CXX0X__ && __RANDOM_ITERATOR_TBB_GCC_VERSION >= 40400) + /** gcc seems have to support constexpr from 4.4 but tests in (test_atomic) seeming reasonable fail to compile prior 4.6**/ + #define __RANDOM_ITERATOR_TBB_CONSTEXPR_PRESENT (__GXX_EXPERIMENTAL_CXX0X__ && __RANDOM_ITERATOR_TBB_GCC_VERSION >= 40400) + #define __RANDOM_ITERATOR_TBB_DEFAULTED_AND_DELETED_FUNC_PRESENT (__GXX_EXPERIMENTAL_CXX0X__ && __RANDOM_ITERATOR_TBB_GCC_VERSION >= 40400) + #define __RANDOM_ITERATOR_TBB_NOEXCEPT_PRESENT (__GXX_EXPERIMENTAL_CXX0X__ && __RANDOM_ITERATOR_TBB_GCC_VERSION >= 40600) + #define __RANDOM_ITERATOR_TBB_CPP11_STD_BEGIN_END_PRESENT (__GXX_EXPERIMENTAL_CXX0X__ && __RANDOM_ITERATOR_TBB_GCC_VERSION >= 40600) + #define __RANDOM_ITERATOR_TBB_CPP11_AUTO_PRESENT (__GXX_EXPERIMENTAL_CXX0X__ && __RANDOM_ITERATOR_TBB_GCC_VERSION >= 40400) + #define __RANDOM_ITERATOR_TBB_CPP11_DECLTYPE_PRESENT (__GXX_EXPERIMENTAL_CXX0X__ && __RANDOM_ITERATOR_TBB_GCC_VERSION >= 40400) + #define __RANDOM_ITERATOR_TBB_CPP11_LAMBDAS_PRESENT (__GXX_EXPERIMENTAL_CXX0X__ && __RANDOM_ITERATOR_TBB_GCC_VERSION >= 40500) + #define __RANDOM_ITERATOR_TBB_CPP11_DEFAULT_FUNC_TEMPLATE_ARGS_PRESENT (__GXX_EXPERIMENTAL_CXX0X__ && __RANDOM_ITERATOR_TBB_GCC_VERSION >= 40300) + #define __RANDOM_ITERATOR_TBB_OVERRIDE_PRESENT (__GXX_EXPERIMENTAL_CXX0X__ && __RANDOM_ITERATOR_TBB_GCC_VERSION >= 40700) + #define __RANDOM_ITERATOR_TBB_ALIGNAS_PRESENT (__GXX_EXPERIMENTAL_CXX0X__ && __RANDOM_ITERATOR_TBB_GCC_VERSION >= 40800) + #define __RANDOM_ITERATOR_TBB_CPP11_TEMPLATE_ALIASES_PRESENT (__GXX_EXPERIMENTAL_CXX0X__ && __RANDOM_ITERATOR_TBB_GCC_VERSION >= 40700) + #define __RANDOM_ITERATOR_TBB_CPP14_INTEGER_SEQUENCE_PRESENT (__cplusplus >= 201402L && __RANDOM_ITERATOR_TBB_GCC_VERSION >= 50000) + #define __RANDOM_ITERATOR_TBB_CPP14_VARIABLE_TEMPLATES_PRESENT (__cplusplus >= 201402L && __RANDOM_ITERATOR_TBB_GCC_VERSION >= 50000) + #define __RANDOM_ITERATOR_TBB_CPP17_DEDUCTION_GUIDES_PRESENT (__cpp_deduction_guides >= 201606L) + #define __RANDOM_ITERATOR_TBB_CPP17_INVOKE_RESULT_PRESENT (__cplusplus >= 201703L && __RANDOM_ITERATOR_TBB_GCC_VERSION >= 70000) +#elif _MSC_VER + // These definitions are also used with Intel C++ Compiler in "default" mode (__INTEL_CXX11_MODE__ == 0); + // see a comment in "__INTEL_COMPILER" section above. + + #define __RANDOM_ITERATOR_TBB_CPP11_VARIADIC_TEMPLATES_PRESENT (_MSC_VER >= 1800) + // Contains a workaround for ICC 13 + #define __RANDOM_ITERATOR_TBB_CPP11_RVALUE_REF_PRESENT (_MSC_VER >= 1700 && (!__INTEL_COMPILER || __INTEL_COMPILER >= 1400)) + #define __RANDOM_ITERATOR_TBB_IMPLICIT_MOVE_PRESENT (_MSC_VER >= 1900) + #define __RANDOM_ITERATOR_TBB_EXCEPTION_PTR_PRESENT (_MSC_VER >= 1600) + #define __RANDOM_ITERATOR_TBB_STATIC_ASSERT_PRESENT (_MSC_VER >= 1600) + #define __RANDOM_ITERATOR_TBB_CPP11_TUPLE_PRESENT (_MSC_VER >= 1600) + #define __RANDOM_ITERATOR_TBB_INITIALIZER_LISTS_PRESENT (_MSC_VER >= 1800) + #define __RANDOM_ITERATOR_TBB_CONSTEXPR_PRESENT (_MSC_VER >= 1900) + #define __RANDOM_ITERATOR_TBB_DEFAULTED_AND_DELETED_FUNC_PRESENT (_MSC_VER >= 1800) + #define __RANDOM_ITERATOR_TBB_NOEXCEPT_PRESENT (_MSC_VER >= 1900) + #define __RANDOM_ITERATOR_TBB_CPP11_STD_BEGIN_END_PRESENT (_MSC_VER >= 1700) + #define __RANDOM_ITERATOR_TBB_CPP11_AUTO_PRESENT (_MSC_VER >= 1600) + #define __RANDOM_ITERATOR_TBB_CPP11_DECLTYPE_PRESENT (_MSC_VER >= 1600) + #define __RANDOM_ITERATOR_TBB_CPP11_LAMBDAS_PRESENT (_MSC_VER >= 1600) + #define __RANDOM_ITERATOR_TBB_CPP11_DEFAULT_FUNC_TEMPLATE_ARGS_PRESENT (_MSC_VER >= 1800) + #define __RANDOM_ITERATOR_TBB_OVERRIDE_PRESENT (_MSC_VER >= 1700) + #define __RANDOM_ITERATOR_TBB_ALIGNAS_PRESENT (_MSC_VER >= 1900) + #define __RANDOM_ITERATOR_TBB_CPP11_TEMPLATE_ALIASES_PRESENT (_MSC_VER >= 1800) + #define __RANDOM_ITERATOR_TBB_CPP14_INTEGER_SEQUENCE_PRESENT (_MSC_VER >= 1900) + /* Variable templates are supported in VS2015 Update 2 or later */ + #define __RANDOM_ITERATOR_TBB_CPP14_VARIABLE_TEMPLATES_PRESENT (_MSC_FULL_VER >= 190023918 && (!__INTEL_COMPILER || __INTEL_COMPILER >= 1700)) + #define __RANDOM_ITERATOR_TBB_CPP17_DEDUCTION_GUIDES_PRESENT (_MSVC_LANG >= 201703L && _MSC_VER >= 1914) + #define __RANDOM_ITERATOR_TBB_CPP17_INVOKE_RESULT_PRESENT (_MSVC_LANG >= 201703L && _MSC_VER >= 1911) +#else + #define __RANDOM_ITERATOR_TBB_CPP11_VARIADIC_TEMPLATES_PRESENT __RANDOM_ITERATOR_TBB_CPP11_PRESENT + #define __RANDOM_ITERATOR_TBB_CPP11_RVALUE_REF_PRESENT __RANDOM_ITERATOR_TBB_CPP11_PRESENT + #define __RANDOM_ITERATOR_TBB_IMPLICIT_MOVE_PRESENT __RANDOM_ITERATOR_TBB_CPP11_PRESENT + #define __RANDOM_ITERATOR_TBB_EXCEPTION_PTR_PRESENT __RANDOM_ITERATOR_TBB_CPP11_PRESENT + #define __RANDOM_ITERATOR_TBB_STATIC_ASSERT_PRESENT __RANDOM_ITERATOR_TBB_CPP11_PRESENT + #define __RANDOM_ITERATOR_TBB_CPP11_TUPLE_PRESENT __RANDOM_ITERATOR_TBB_CPP11_PRESENT + #define __RANDOM_ITERATOR_TBB_INITIALIZER_LISTS_PRESENT __RANDOM_ITERATOR_TBB_CPP11_PRESENT + #define __RANDOM_ITERATOR_TBB_CONSTEXPR_PRESENT __RANDOM_ITERATOR_TBB_CPP11_PRESENT + #define __RANDOM_ITERATOR_TBB_DEFAULTED_AND_DELETED_FUNC_PRESENT __RANDOM_ITERATOR_TBB_CPP11_PRESENT + #define __RANDOM_ITERATOR_TBB_NOEXCEPT_PRESENT __RANDOM_ITERATOR_TBB_CPP11_PRESENT + #define __RANDOM_ITERATOR_TBB_CPP11_STD_BEGIN_END_PRESENT __RANDOM_ITERATOR_TBB_CPP11_PRESENT + #define __RANDOM_ITERATOR_TBB_CPP11_AUTO_PRESENT __RANDOM_ITERATOR_TBB_CPP11_PRESENT + #define __RANDOM_ITERATOR_TBB_CPP11_DECLTYPE_PRESENT __RANDOM_ITERATOR_TBB_CPP11_PRESENT + #define __RANDOM_ITERATOR_TBB_CPP11_LAMBDAS_PRESENT __RANDOM_ITERATOR_TBB_CPP11_PRESENT + #define __RANDOM_ITERATOR_TBB_CPP11_DEFAULT_FUNC_TEMPLATE_ARGS_PRESENT __RANDOM_ITERATOR_TBB_CPP11_PRESENT + #define __RANDOM_ITERATOR_TBB_OVERRIDE_PRESENT __RANDOM_ITERATOR_TBB_CPP11_PRESENT + #define __RANDOM_ITERATOR_TBB_ALIGNAS_PRESENT __RANDOM_ITERATOR_TBB_CPP11_PRESENT + #define __RANDOM_ITERATOR_TBB_CPP11_TEMPLATE_ALIASES_PRESENT __RANDOM_ITERATOR_TBB_CPP11_PRESENT + #define __RANDOM_ITERATOR_TBB_CPP14_INTEGER_SEQUENCE_PRESENT (__cplusplus >= 201402L) + #define __RANDOM_ITERATOR_TBB_CPP14_VARIABLE_TEMPLATES_PRESENT (__cplusplus >= 201402L) + #define __RANDOM_ITERATOR_TBB_CPP17_DEDUCTION_GUIDES_PRESENT (__cplusplus >= 201703L) + #define __RANDOM_ITERATOR_TBB_CPP17_INVOKE_RESULT_PRESENT (__cplusplus >= 201703L) +#endif + +// C++11 standard library features + +#define __RANDOM_ITERATOR_TBB_CPP11_ARRAY_PRESENT (_MSC_VER >= 1700 || _LIBCPP_VERSION || __GXX_EXPERIMENTAL_CXX0X__ && __RANDOM_ITERATOR_TBB_GLIBCXX_VERSION >= 40300) + +#ifndef __RANDOM_ITERATOR_TBB_CPP11_VARIADIC_FIXED_LENGTH_EXP_PRESENT +#define __RANDOM_ITERATOR_TBB_CPP11_VARIADIC_FIXED_LENGTH_EXP_PRESENT __RANDOM_ITERATOR_TBB_CPP11_VARIADIC_TEMPLATES_PRESENT +#endif +#define __RANDOM_ITERATOR_TBB_CPP11_VARIADIC_TUPLE_PRESENT (!_MSC_VER || _MSC_VER >= 1800) + +#define __RANDOM_ITERATOR_TBB_CPP11_TYPE_PROPERTIES_PRESENT (_LIBCPP_VERSION || _MSC_VER >= 1700 || (__RANDOM_ITERATOR_TBB_GLIBCXX_VERSION >= 50000 && __GXX_EXPERIMENTAL_CXX0X__)) +// GCC supported some of type properties since 4.7 +#define __RANDOM_ITERATOR_TBB_CPP11_IS_COPY_CONSTRUCTIBLE_PRESENT (__GXX_EXPERIMENTAL_CXX0X__ && __RANDOM_ITERATOR_TBB_GLIBCXX_VERSION >= 40700 || __RANDOM_ITERATOR_TBB_CPP11_TYPE_PROPERTIES_PRESENT) + +// In GCC, std::move_if_noexcept appeared later than noexcept +#define __RANDOM_ITERATOR_TBB_MOVE_IF_NOEXCEPT_PRESENT (__RANDOM_ITERATOR_TBB_NOEXCEPT_PRESENT && (__RANDOM_ITERATOR_TBB_GLIBCXX_VERSION >= 40700 || _MSC_VER >= 1900 || _LIBCPP_VERSION)) +#define __RANDOM_ITERATOR_TBB_ALLOCATOR_TRAITS_PRESENT (__cplusplus >= 201103L && _LIBCPP_VERSION || _MSC_VER >= 1800 || \ + __GXX_EXPERIMENTAL_CXX0X__ && __RANDOM_ITERATOR_TBB_GLIBCXX_VERSION >= 40700 && !(__RANDOM_ITERATOR_TBB_GLIBCXX_VERSION == 40700 && __RANDOM_ITERATOR_TBB_DEFINE_MIC)) +#define __RANDOM_ITERATOR_TBB_MAKE_EXCEPTION_PTR_PRESENT (__RANDOM_ITERATOR_TBB_EXCEPTION_PTR_PRESENT && (_MSC_VER >= 1700 || __RANDOM_ITERATOR_TBB_GLIBCXX_VERSION >= 40600 || _LIBCPP_VERSION || __SUNPRO_CC)) + +// Due to libc++ limitations in C++03 mode, do not pass rvalues to std::make_shared() +#define __RANDOM_ITERATOR_TBB_CPP11_SMART_POINTERS_PRESENT ( _MSC_VER >= 1600 || _LIBCPP_VERSION \ + || ((__cplusplus >= 201103L || __GXX_EXPERIMENTAL_CXX0X__) \ + && (__RANDOM_ITERATOR_TBB_GLIBCXX_VERSION >= 40500 || __RANDOM_ITERATOR_TBB_GLIBCXX_VERSION >= 40400 && __RANDOM_ITERATOR_RANDOM_ITERATOR_TBB_USE_OPTIONAL_RTTI)) ) + +#define __RANDOM_ITERATOR_TBB_CPP11_FUTURE_PRESENT (_MSC_VER >= 1700 || __RANDOM_ITERATOR_TBB_GLIBCXX_VERSION >= 40600 && __GXX_EXPERIMENTAL_CXX0X__ || _LIBCPP_VERSION) + +#define __RANDOM_ITERATOR_TBB_CPP11_GET_NEW_HANDLER_PRESENT (_MSC_VER >= 1900 || __RANDOM_ITERATOR_TBB_GLIBCXX_VERSION >= 40900 && __GXX_EXPERIMENTAL_CXX0X__ || _LIBCPP_VERSION) + +#define __RANDOM_ITERATOR_TBB_CPP17_UNCAUGHT_EXCEPTIONS_PRESENT (_MSC_VER >= 1900 || __GLIBCXX__ && __cpp_lib_uncaught_exceptions \ + || _LIBCPP_VERSION >= 3700 && (!__RANDOM_ITERATOR_TBB_MACOS_TARGET_VERSION || __RANDOM_ITERATOR_TBB_MACOS_TARGET_VERSION >= 101200)) +// TODO: wait when memory_resource will be fully supported in clang and define the right macro +// Currently it is in experimental stage since 6 version. +#define __RANDOM_ITERATOR_TBB_CPP17_MEMORY_RESOURCE_PRESENT (_MSC_VER >= 1913 && (_MSVC_LANG > 201402L || __cplusplus > 201402L) || \ + __GLIBCXX__ && __cpp_lib_memory_resource >= 201603) +#define __RANDOM_ITERATOR_TBB_CPP17_HW_INTERFERENCE_SIZE_PRESENT (_MSC_VER >= 1911) +// std::swap is in <utility> only since C++11, though MSVC had it at least since VS2005 +#if _MSC_VER>=1400 || _LIBCPP_VERSION || __GXX_EXPERIMENTAL_CXX0X__ +#define __RANDOM_ITERATOR_TBB_STD_SWAP_HEADER <utility> +#else +#define __RANDOM_ITERATOR_TBB_STD_SWAP_HEADER <algorithm> +#endif + +//TODO: not clear how exactly this macro affects exception_ptr - investigate +// On linux ICC fails to find existing std::exception_ptr in libstdc++ without this define +#if __INTEL_COMPILER && __GNUC__ && __RANDOM_ITERATOR_TBB_EXCEPTION_PTR_PRESENT && !defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4) + #define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_4 1 +#endif + +// Work around a bug in MinGW32 +#if __MINGW32__ && __RANDOM_ITERATOR_TBB_EXCEPTION_PTR_PRESENT && !defined(_GLIBCXX_ATOMIC_BUILTINS_4) + #define _GLIBCXX_ATOMIC_BUILTINS_4 +#endif + +#if __GNUC__ || __SUNPRO_CC || __IBMCPP__ + /* ICC defines __GNUC__ and so is covered */ + #define __RANDOM_ITERATOR_TBB_ATTRIBUTE_ALIGNED_PRESENT 1 +#elif _MSC_VER && (_MSC_VER >= 1300 || __INTEL_COMPILER) + #define __RANDOM_ITERATOR_TBB_DECLSPEC_ALIGN_PRESENT 1 +#endif + +/* Actually ICC supports gcc __sync_* intrinsics starting 11.1, + * but 64 bit support for 32 bit target comes in later ones*/ +/* TODO: change the version back to 4.1.2 once macro __RANDOM_ITERATOR_TBB_WORD_SIZE become optional */ +/* Assumed that all clang versions have these gcc compatible intrinsics. */ +#if __RANDOM_ITERATOR_TBB_GCC_VERSION >= 40306 || __INTEL_COMPILER >= 1200 || __clang__ + /** built-in atomics available in GCC since 4.1.2 **/ + #define __RANDOM_ITERATOR_TBB_GCC_BUILTIN_ATOMICS_PRESENT 1 +#endif + +#if __RANDOM_ITERATOR_TBB_GCC_VERSION >= 70000 && !__INTEL_COMPILER && !__clang__ + // After GCC7 there was possible reordering problem in generic atomic load/store operations. + // So always using builtins. + #define RANDOM_ITERATOR_TBB_USE_GCC_BUILTINS 1 +#endif + +#if __INTEL_COMPILER >= 1200 + /** built-in C++11 style atomics available in ICC since 12.0 **/ + #define __RANDOM_ITERATOR_TBB_ICC_BUILTIN_ATOMICS_PRESENT 1 +#endif + +#if _MSC_VER>=1600 && (!__INTEL_COMPILER || __INTEL_COMPILER>=1310) + #define __RANDOM_ITERATOR_TBB_MSVC_PART_WORD_INTERLOCKED_INTRINSICS_PRESENT 1 +#endif + +#define __RANDOM_ITERATOR_TBB_TSX_INTRINSICS_PRESENT ((__RTM__ || _MSC_VER>=1700 || __INTEL_COMPILER>=1300) && !__RANDOM_ITERATOR_TBB_DEFINE_MIC && !__ANDROID__) + +/** Macro helpers **/ +#define __RANDOM_ITERATOR_TBB_CONCAT_AUX(A,B) A##B +// The additional level of indirection is needed to expand macros A and B (not to get the AB macro). +// See [cpp.subst] and [cpp.concat] for more details. +#define __RANDOM_ITERATOR_TBB_CONCAT(A,B) __RANDOM_ITERATOR_TBB_CONCAT_AUX(A,B) +// The IGNORED argument and comma are needed to always have 2 arguments (even when A is empty). +#define __RANDOM_ITERATOR_TBB_IS_MACRO_EMPTY(A,IGNORED) __RANDOM_ITERATOR_TBB_CONCAT_AUX(__RANDOM_ITERATOR_TBB_MACRO_EMPTY,A) +#define __RANDOM_ITERATOR_TBB_MACRO_EMPTY 1 + +/** User controlled TBB features & modes **/ +#ifndef RANDOM_ITERATOR_TBB_USE_DEBUG +/* +There are four cases that are supported: + 1. "_DEBUG is undefined" means "no debug"; + 2. "_DEBUG defined to something that is evaluated to 0" (including "garbage", as per [cpp.cond]) means "no debug"; + 3. "_DEBUG defined to something that is evaluated to a non-zero value" means "debug"; + 4. "_DEBUG defined to nothing (empty)" means "debug". +*/ +#ifdef _DEBUG +// Check if _DEBUG is empty. +#define __RANDOM_ITERATOR_TBB_IS__DEBUG_EMPTY (__RANDOM_ITERATOR_TBB_IS_MACRO_EMPTY(_DEBUG,IGNORED)==__RANDOM_ITERATOR_TBB_MACRO_EMPTY) +#if __RANDOM_ITERATOR_TBB_IS__DEBUG_EMPTY +#define RANDOM_ITERATOR_TBB_USE_DEBUG 1 +#else +#define RANDOM_ITERATOR_TBB_USE_DEBUG _DEBUG +#endif /* __RANDOM_ITERATOR_TBB_IS__DEBUG_EMPTY */ +#else +#define RANDOM_ITERATOR_TBB_USE_DEBUG 0 +#endif +#endif /* RANDOM_ITERATOR_TBB_USE_DEBUG */ + +#ifndef RANDOM_ITERATOR_TBB_USE_ASSERT +#define RANDOM_ITERATOR_TBB_USE_ASSERT RANDOM_ITERATOR_TBB_USE_DEBUG +#endif /* RANDOM_ITERATOR_TBB_USE_ASSERT */ + +#ifndef RANDOM_ITERATOR_TBB_USE_THREADING_TOOLS +#define RANDOM_ITERATOR_TBB_USE_THREADING_TOOLS RANDOM_ITERATOR_TBB_USE_DEBUG +#endif /* RANDOM_ITERATOR_TBB_USE_THREADING_TOOLS */ + +#ifndef RANDOM_ITERATOR_TBB_USE_PERFORMANCE_WARNINGS +#ifdef RANDOM_ITERATOR_TBB_PERFORMANCE_WARNINGS +#define RANDOM_ITERATOR_TBB_USE_PERFORMANCE_WARNINGS RANDOM_ITERATOR_TBB_PERFORMANCE_WARNINGS +#else +#define RANDOM_ITERATOR_TBB_USE_PERFORMANCE_WARNINGS RANDOM_ITERATOR_TBB_USE_DEBUG +#endif /* RANDOM_ITERATOR_TBB_PERFORMANCE_WARNINGS */ +#endif /* RANDOM_ITERATOR_TBB_USE_PERFORMANCE_WARNINGS */ + +#if __RANDOM_ITERATOR_TBB_DEFINE_MIC + #if RANDOM_ITERATOR_TBB_USE_EXCEPTIONS + #error The platform does not properly support exception handling. Please do not set RANDOM_ITERATOR_TBB_USE_EXCEPTIONS macro or set it to 0. + #elif !defined(RANDOM_ITERATOR_TBB_USE_EXCEPTIONS) + #define RANDOM_ITERATOR_TBB_USE_EXCEPTIONS 0 + #endif +#elif !(__EXCEPTIONS || defined(_CPPUNWIND) || __SUNPRO_CC) + #if RANDOM_ITERATOR_TBB_USE_EXCEPTIONS + #error Compilation settings do not support exception handling. Please do not set RANDOM_ITERATOR_TBB_USE_EXCEPTIONS macro or set it to 0. + #elif !defined(RANDOM_ITERATOR_TBB_USE_EXCEPTIONS) + #define RANDOM_ITERATOR_TBB_USE_EXCEPTIONS 0 + #endif +#elif !defined(RANDOM_ITERATOR_TBB_USE_EXCEPTIONS) + #define RANDOM_ITERATOR_TBB_USE_EXCEPTIONS 1 +#endif + +#ifndef RANDOM_ITERATOR_TBB_IMPLEMENT_CPP0X +/** By default, use C++11 classes if available **/ + #if __clang__ + /* Old versions of Intel C++ Compiler do not have __has_include or cannot use it in #define */ + #if (__INTEL_COMPILER && (__INTEL_COMPILER < 1500 || __INTEL_COMPILER == 1500 && __INTEL_COMPILER_UPDATE <= 1)) + #define RANDOM_ITERATOR_TBB_IMPLEMENT_CPP0X (__cplusplus < 201103L || !_LIBCPP_VERSION) + #else + #define RANDOM_ITERATOR_TBB_IMPLEMENT_CPP0X (__cplusplus < 201103L || (!__has_include(<thread>) && !__has_include(<condition_variable>))) + #endif + #elif __GNUC__ + #define RANDOM_ITERATOR_TBB_IMPLEMENT_CPP0X (__RANDOM_ITERATOR_TBB_GCC_VERSION < 40400 || !__GXX_EXPERIMENTAL_CXX0X__) + #elif _MSC_VER + #define RANDOM_ITERATOR_TBB_IMPLEMENT_CPP0X (_MSC_VER < 1700) + #else + // TODO: Reconsider general approach to be more reliable, e.g. (!(__cplusplus >= 201103L && __ STDC_HOSTED__)) + #define RANDOM_ITERATOR_TBB_IMPLEMENT_CPP0X (!__STDCPP_THREADS__) + #endif +#endif /* RANDOM_ITERATOR_TBB_IMPLEMENT_CPP0X */ + +/* RANDOM_ITERATOR_TBB_USE_CAPTURED_EXCEPTION should be explicitly set to either 0 or 1, as it is used as C++ const */ +#ifndef RANDOM_ITERATOR_TBB_USE_CAPTURED_EXCEPTION + /** IA-64 architecture pre-built TBB binaries do not support exception_ptr. **/ + #if __RANDOM_ITERATOR_TBB_EXCEPTION_PTR_PRESENT && !defined(__ia64__) + #define RANDOM_ITERATOR_TBB_USE_CAPTURED_EXCEPTION 0 + #else + #define RANDOM_ITERATOR_TBB_USE_CAPTURED_EXCEPTION 1 + #endif +#else /* defined RANDOM_ITERATOR_TBB_USE_CAPTURED_EXCEPTION */ + #if !RANDOM_ITERATOR_TBB_USE_CAPTURED_EXCEPTION && !__RANDOM_ITERATOR_TBB_EXCEPTION_PTR_PRESENT + #error Current runtime does not support std::exception_ptr. Set RANDOM_ITERATOR_TBB_USE_CAPTURED_EXCEPTION and make sure that your code is ready to catch tbb::captured_exception. + #endif +#endif /* defined RANDOM_ITERATOR_TBB_USE_CAPTURED_EXCEPTION */ + +/** Check whether the request to use GCC atomics can be satisfied **/ +#if RANDOM_ITERATOR_TBB_USE_GCC_BUILTINS && !__RANDOM_ITERATOR_TBB_GCC_BUILTIN_ATOMICS_PRESENT + #error "GCC atomic built-ins are not supported." +#endif + +/** Internal TBB features & modes **/ + +/** __RANDOM_ITERATOR_TBB_CONCURRENT_ORDERED_CONTAINERS indicates that all conditions of use + * concurrent_map and concurrent_set are met. **/ +// TODO: Add cpp11 random generation macro +#ifndef __RANDOM_ITERATOR_TBB_CONCURRENT_ORDERED_CONTAINERS_PRESENT + #define __RANDOM_ITERATOR_TBB_CONCURRENT_ORDERED_CONTAINERS_PRESENT ( __RANDOM_ITERATOR_TBB_CPP11_RVALUE_REF_PRESENT && __RANDOM_ITERATOR_TBB_CPP11_VARIADIC_TEMPLATES_PRESENT \ + && __RANDOM_ITERATOR_TBB_IMPLICIT_MOVE_PRESENT && __RANDOM_ITERATOR_TBB_CPP11_AUTO_PRESENT && __RANDOM_ITERATOR_TBB_CPP11_LAMBDAS_PRESENT && __RANDOM_ITERATOR_TBB_CPP11_ARRAY_PRESENT \ + && __RANDOM_ITERATOR_TBB_INITIALIZER_LISTS_PRESENT ) +#endif + +/** __RANDOM_ITERATOR_TBB_WEAK_SYMBOLS_PRESENT denotes that the system supports the weak symbol mechanism **/ +#ifndef __RANDOM_ITERATOR_TBB_WEAK_SYMBOLS_PRESENT +#define __RANDOM_ITERATOR_TBB_WEAK_SYMBOLS_PRESENT ( !_WIN32 && !__APPLE__ && !__sun && (__RANDOM_ITERATOR_TBB_GCC_VERSION >= 40000 || __INTEL_COMPILER ) ) +#endif + +/** __RANDOM_ITERATOR_TBB_DYNAMIC_LOAD_ENABLED describes the system possibility to load shared libraries at run time **/ +#ifndef __RANDOM_ITERATOR_TBB_DYNAMIC_LOAD_ENABLED + #define __RANDOM_ITERATOR_TBB_DYNAMIC_LOAD_ENABLED 1 +#endif + +/** __RANDOM_ITERATOR_TBB_SOURCE_DIRECTLY_INCLUDED is a mode used in whitebox testing when + it's necessary to test internal functions not exported from TBB DLLs +**/ +#if (_WIN32||_WIN64) && (__RANDOM_ITERATOR_TBB_SOURCE_DIRECTLY_INCLUDED || RANDOM_ITERATOR_TBB_USE_PREVIEW_BINARY) + #define __RANDOM_ITERATOR_TBB_NO_IMPLICIT_LINKAGE 1 + #define __RANDOM_ITERATOR_TBBMALLOC_NO_IMPLICIT_LINKAGE 1 +#endif + +#ifndef __RANDOM_ITERATOR_TBB_COUNT_TASK_NODES + #define __RANDOM_ITERATOR_TBB_COUNT_TASK_NODES RANDOM_ITERATOR_TBB_USE_ASSERT +#endif + +#ifndef __RANDOM_ITERATOR_TBB_TASK_GROUP_CONTEXT + #define __RANDOM_ITERATOR_TBB_TASK_GROUP_CONTEXT 1 +#endif /* __RANDOM_ITERATOR_TBB_TASK_GROUP_CONTEXT */ + +#ifndef __RANDOM_ITERATOR_TBB_SCHEDULER_OBSERVER + #define __RANDOM_ITERATOR_TBB_SCHEDULER_OBSERVER 1 +#endif /* __RANDOM_ITERATOR_TBB_SCHEDULER_OBSERVER */ + +#ifndef __RANDOM_ITERATOR_TBB_FP_CONTEXT + #define __RANDOM_ITERATOR_TBB_FP_CONTEXT __RANDOM_ITERATOR_TBB_TASK_GROUP_CONTEXT +#endif /* __RANDOM_ITERATOR_TBB_FP_CONTEXT */ + +#if __RANDOM_ITERATOR_TBB_FP_CONTEXT && !__RANDOM_ITERATOR_TBB_TASK_GROUP_CONTEXT + #error __RANDOM_ITERATOR_TBB_FP_CONTEXT requires __RANDOM_ITERATOR_TBB_TASK_GROUP_CONTEXT to be enabled +#endif + +#define __RANDOM_ITERATOR_TBB_RECYCLE_TO_ENQUEUE __RANDOM_ITERATOR_TBB_BUILD // keep non-official + +#ifndef __RANDOM_ITERATOR_TBB_ARENA_OBSERVER + #define __RANDOM_ITERATOR_TBB_ARENA_OBSERVER __RANDOM_ITERATOR_TBB_SCHEDULER_OBSERVER +#endif /* __RANDOM_ITERATOR_TBB_ARENA_OBSERVER */ + +#ifndef __RANDOM_ITERATOR_TBB_TASK_ISOLATION + #define __RANDOM_ITERATOR_TBB_TASK_ISOLATION 1 +#endif /* __RANDOM_ITERATOR_TBB_TASK_ISOLATION */ + +#if RANDOM_ITERATOR_TBB_USE_EXCEPTIONS && !__RANDOM_ITERATOR_TBB_TASK_GROUP_CONTEXT + #error RANDOM_ITERATOR_TBB_USE_EXCEPTIONS requires __RANDOM_ITERATOR_TBB_TASK_GROUP_CONTEXT to be enabled +#endif + +#ifndef __RANDOM_ITERATOR_TBB_TASK_PRIORITY + #define __RANDOM_ITERATOR_TBB_TASK_PRIORITY (__RANDOM_ITERATOR_TBB_TASK_GROUP_CONTEXT) +#endif /* __RANDOM_ITERATOR_TBB_TASK_PRIORITY */ + +#if __RANDOM_ITERATOR_TBB_TASK_PRIORITY && !__RANDOM_ITERATOR_TBB_TASK_GROUP_CONTEXT + #error __RANDOM_ITERATOR_TBB_TASK_PRIORITY requires __RANDOM_ITERATOR_TBB_TASK_GROUP_CONTEXT to be enabled +#endif + +#if RANDOM_ITERATOR_TBB_PREVIEW_NUMA_SUPPORT || __RANDOM_ITERATOR_TBB_BUILD + #define __RANDOM_ITERATOR_TBB_NUMA_SUPPORT 1 +#endif + +#if RANDOM_ITERATOR_TBB_PREVIEW_WAITING_FOR_WORKERS || __RANDOM_ITERATOR_TBB_BUILD + #define __RANDOM_ITERATOR_TBB_SUPPORTS_WORKERS_WAITING_IN_TERMINATE 1 +#endif + +#ifndef __RANDOM_ITERATOR_TBB_ENQUEUE_ENFORCED_CONCURRENCY + #define __RANDOM_ITERATOR_TBB_ENQUEUE_ENFORCED_CONCURRENCY 1 +#endif + +#if !defined(__RANDOM_ITERATOR_TBB_SURVIVE_THREAD_SWITCH) && \ + (_WIN32 || _WIN64 || __APPLE__ || (__linux__ && !__ANDROID__)) + #define __RANDOM_ITERATOR_TBB_SURVIVE_THREAD_SWITCH 1 +#endif /* __RANDOM_ITERATOR_TBB_SURVIVE_THREAD_SWITCH */ + +#ifndef __RANDOM_ITERATOR_TBB_DEFAULT_PARTITIONER +#define __RANDOM_ITERATOR_TBB_DEFAULT_PARTITIONER tbb::auto_partitioner +#endif + +#ifndef __RANDOM_ITERATOR_RANDOM_ITERATOR_TBB_USE_PROPORTIONAL_SPLIT_IN_BLOCKED_RANGES +#define __RANDOM_ITERATOR_RANDOM_ITERATOR_TBB_USE_PROPORTIONAL_SPLIT_IN_BLOCKED_RANGES 1 +#endif + +#ifndef __RANDOM_ITERATOR_TBB_ENABLE_RANGE_FEEDBACK +#define __RANDOM_ITERATOR_TBB_ENABLE_RANGE_FEEDBACK 0 +#endif + +#ifdef _VARIADIC_MAX + #define __RANDOM_ITERATOR_TBB_VARIADIC_MAX _VARIADIC_MAX +#else + #if _MSC_VER == 1700 + #define __RANDOM_ITERATOR_TBB_VARIADIC_MAX 5 // VS11 setting, issue resolved in VS12 + #elif _MSC_VER == 1600 + #define __RANDOM_ITERATOR_TBB_VARIADIC_MAX 10 // VS10 setting + #else + #define __RANDOM_ITERATOR_TBB_VARIADIC_MAX 15 + #endif +#endif + +// Intel C++ Compiler starts analyzing usages of the deprecated content at the template +// instantiation site, which is too late for suppression of the corresponding messages for internal +// stuff. +#if !defined(__INTEL_COMPILER) && (!defined(TBB_SUPPRESS_DEPRECATED_MESSAGES) || (TBB_SUPPRESS_DEPRECATED_MESSAGES == 0)) + #if (__cplusplus >= 201402L) + #define __RANDOM_ITERATOR_TBB_DEPRECATED [[deprecated]] + #define __RANDOM_ITERATOR_TBB_DEPRECATED_MSG(msg) [[deprecated(msg)]] + #elif _MSC_VER + #define __RANDOM_ITERATOR_TBB_DEPRECATED __declspec(deprecated) + #define __RANDOM_ITERATOR_TBB_DEPRECATED_MSG(msg) __declspec(deprecated(msg)) + #elif (__GNUC__ && __RANDOM_ITERATOR_TBB_GCC_VERSION >= 40805) || __clang__ + #define __RANDOM_ITERATOR_TBB_DEPRECATED __attribute__((deprecated)) + #define __RANDOM_ITERATOR_TBB_DEPRECATED_MSG(msg) __attribute__((deprecated(msg))) + #endif +#endif // !defined(TBB_SUPPRESS_DEPRECATED_MESSAGES) || (TBB_SUPPRESS_DEPRECATED_MESSAGES == 0) + +#if !defined(__RANDOM_ITERATOR_TBB_DEPRECATED) + #define __RANDOM_ITERATOR_TBB_DEPRECATED + #define __RANDOM_ITERATOR_TBB_DEPRECATED_MSG(msg) +#elif !defined(__RANDOM_ITERATOR_TBB_SUPPRESS_INTERNAL_DEPRECATED_MESSAGES) + // Suppress deprecated messages from self + #define __RANDOM_ITERATOR_TBB_SUPPRESS_INTERNAL_DEPRECATED_MESSAGES 1 +#endif + +#if defined(TBB_SUPPRESS_DEPRECATED_MESSAGES) && (TBB_SUPPRESS_DEPRECATED_MESSAGES == 0) + #define __RANDOM_ITERATOR_TBB_DEPRECATED_IN_VERBOSE_MODE __RANDOM_ITERATOR_TBB_DEPRECATED + #define __RANDOM_ITERATOR_TBB_DEPRECATED_IN_VERBOSE_MODE_MSG(msg) __RANDOM_ITERATOR_TBB_DEPRECATED_MSG(msg) +#else + #define __RANDOM_ITERATOR_TBB_DEPRECATED_IN_VERBOSE_MODE + #define __RANDOM_ITERATOR_TBB_DEPRECATED_IN_VERBOSE_MODE_MSG(msg) +#endif // (TBB_SUPPRESS_DEPRECATED_MESSAGES == 0) + +#if (!defined(TBB_SUPPRESS_DEPRECATED_MESSAGES) || (TBB_SUPPRESS_DEPRECATED_MESSAGES == 0)) && !__RANDOM_ITERATOR_TBB_CPP11_PRESENT + #pragma message("TBB Warning: Support for C++98/03 is deprecated. Please use the compiler that supports C++11 features at least.") +#endif + +/** __RANDOM_ITERATOR_TBB_WIN8UI_SUPPORT enables support of Windows* Store Apps and limit a possibility to load + shared libraries at run time only from application container **/ +// TODO: Separate this single macro into two for Windows 8 Store* (win8ui mode) and UWP/UWD modes. +#if defined(WINAPI_FAMILY) && WINAPI_FAMILY == WINAPI_FAMILY_APP + #define __RANDOM_ITERATOR_TBB_WIN8UI_SUPPORT 1 +#else + #define __RANDOM_ITERATOR_TBB_WIN8UI_SUPPORT 0 +#endif + +/** Macros of the form __RANDOM_ITERATOR_TBB_XXX_BROKEN denote known issues that are caused by + the bugs in compilers, standard or OS specific libraries. They should be + removed as soon as the corresponding bugs are fixed or the buggy OS/compiler + versions go out of the support list. +**/ + +#if __SIZEOF_POINTER__ < 8 && __ANDROID__ && __RANDOM_ITERATOR_TBB_GCC_VERSION <= 40403 && !__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8 + /** Necessary because on Android 8-byte CAS and F&A are not available for some processor architectures, + but no mandatory warning message appears from GCC 4.4.3. Instead, only a linkage error occurs when + these atomic operations are used (such as in unit test test_atomic.exe). **/ + #define __RANDOM_ITERATOR_TBB_GCC_64BIT_ATOMIC_BUILTINS_BROKEN 1 +#elif __RANDOM_ITERATOR_TBB_x86_32 && __RANDOM_ITERATOR_TBB_GCC_VERSION == 40102 && ! __GNUC_RH_RELEASE__ + /** GCC 4.1.2 erroneously emit call to external function for 64 bit sync_ intrinsics. + However these functions are not defined anywhere. It seems that this problem was fixed later on + and RHEL got an updated version of gcc 4.1.2. **/ + #define __RANDOM_ITERATOR_TBB_GCC_64BIT_ATOMIC_BUILTINS_BROKEN 1 +#endif + +#if __GNUC__ && __RANDOM_ITERATOR_TBB_x86_64 && __INTEL_COMPILER == 1200 + #define __RANDOM_ITERATOR_TBB_ICC_12_0_INL_ASM_FSTCW_BROKEN 1 +#endif + +#if _MSC_VER && __INTEL_COMPILER && (__INTEL_COMPILER<1110 || __INTEL_COMPILER==1110 && __INTEL_COMPILER_BUILD_DATE < 20091012) + /** Necessary to avoid ICL error (or warning in non-strict mode): + "exception specification for implicitly declared virtual destructor is + incompatible with that of overridden one". **/ + #define __RANDOM_ITERATOR_TBB_DEFAULT_DTOR_THROW_SPEC_BROKEN 1 +#endif + +#if !__INTEL_COMPILER && (_MSC_VER && _MSC_VER < 1500 || __GNUC__ && __RANDOM_ITERATOR_TBB_GCC_VERSION < 40102) + /** gcc 3.4.6 (and earlier) and VS2005 (and earlier) do not allow declaring template class as a friend + of classes defined in other namespaces. **/ + #define __RANDOM_ITERATOR_TBB_TEMPLATE_FRIENDS_BROKEN 1 +#endif + +#if __GLIBC__==2 && __GLIBC_MINOR__==3 || (__APPLE__ && ( __INTEL_COMPILER==1200 && !RANDOM_ITERATOR_TBB_USE_DEBUG)) + /** Macro controlling EH usages in TBB tests. + Some older versions of glibc crash when exception handling happens concurrently. **/ + #define __RANDOM_ITERATOR_TBB_THROW_ACROSS_MODULE_BOUNDARY_BROKEN 1 +#endif + +#if (_WIN32||_WIN64) && __INTEL_COMPILER == 1110 + /** That's a bug in Intel C++ Compiler 11.1.044/IA-32 architecture/Windows* OS, that leads to a worker thread crash on the thread's startup. **/ + #define __RANDOM_ITERATOR_TBB_ICL_11_1_CODE_GEN_BROKEN 1 +#endif + +#if __clang__ || (__GNUC__==3 && __GNUC_MINOR__==3 && !defined(__INTEL_COMPILER)) + /** Bugs with access to nested classes declared in protected area */ + #define __RANDOM_ITERATOR_TBB_PROTECTED_NESTED_CLASS_BROKEN 1 +#endif + +#if __MINGW32__ && __RANDOM_ITERATOR_TBB_GCC_VERSION < 40200 + /** MinGW has a bug with stack alignment for routines invoked from MS RTLs. + Since GCC 4.2, the bug can be worked around via a special attribute. **/ + #define __RANDOM_ITERATOR_TBB_SSE_STACK_ALIGNMENT_BROKEN 1 +#endif + +#if __RANDOM_ITERATOR_TBB_GCC_VERSION==40300 && !__INTEL_COMPILER && !__clang__ + /* GCC of this version may rashly ignore control dependencies */ + #define __RANDOM_ITERATOR_TBB_GCC_OPTIMIZER_ORDERING_BROKEN 1 +#endif + +#if __FreeBSD__ + /** A bug in FreeBSD 8.0 results in kernel panic when there is contention + on a mutex created with this attribute. **/ + #define __RANDOM_ITERATOR_TBB_PRIO_INHERIT_BROKEN 1 + + /** A bug in FreeBSD 8.0 results in test hanging when an exception occurs + during (concurrent?) object construction by means of placement new operator. **/ + #define __RANDOM_ITERATOR_TBB_PLACEMENT_NEW_EXCEPTION_SAFETY_BROKEN 1 +#endif /* __FreeBSD__ */ + +#if (__linux__ || __APPLE__) && __i386__ && defined(__INTEL_COMPILER) + /** The Intel C++ Compiler for IA-32 architecture (Linux* OS|macOS) crashes or generates + incorrect code when __asm__ arguments have a cast to volatile. **/ + #define __RANDOM_ITERATOR_TBB_ICC_ASM_VOLATILE_BROKEN 1 +#endif + +#if !__INTEL_COMPILER && (_MSC_VER && _MSC_VER < 1700 || __GNUC__==3 && __GNUC_MINOR__<=2) + /** Bug in GCC 3.2 and MSVC compilers that sometimes return 0 for __alignof(T) + when T has not yet been instantiated. **/ + #define __RANDOM_ITERATOR_TBB_ALIGNOF_NOT_INSTANTIATED_TYPES_BROKEN 1 +#endif + +#if __RANDOM_ITERATOR_TBB_DEFINE_MIC + /** Main thread and user's thread have different default thread affinity masks. **/ + #define __RANDOM_ITERATOR_TBB_MAIN_THREAD_AFFINITY_BROKEN 1 +#endif + +#if __GXX_EXPERIMENTAL_CXX0X__ && !defined(__EXCEPTIONS) && \ + ((!__INTEL_COMPILER && !__clang__ && (__RANDOM_ITERATOR_TBB_GCC_VERSION>=40400 && __RANDOM_ITERATOR_TBB_GCC_VERSION<40600)) || \ + (__INTEL_COMPILER<=1400 && (__RANDOM_ITERATOR_TBB_GLIBCXX_VERSION>=40400 && __RANDOM_ITERATOR_TBB_GLIBCXX_VERSION<=40801))) +/* There is an issue for specific GCC toolchain when C++11 is enabled + and exceptions are disabled: + exceprion_ptr.h/nested_exception.h use throw unconditionally. + GCC can ignore 'throw' since 4.6; but with ICC the issue still exists. + */ + #define __RANDOM_ITERATOR_TBB_LIBSTDCPP_EXCEPTION_HEADERS_BROKEN 1 +#endif + +#if __INTEL_COMPILER==1300 && __RANDOM_ITERATOR_TBB_GLIBCXX_VERSION>=40700 && defined(__GXX_EXPERIMENTAL_CXX0X__) +/* Some C++11 features used inside libstdc++ are not supported by Intel C++ Compiler. */ + #define __RANDOM_ITERATOR_TBB_ICC_13_0_CPP11_STDLIB_SUPPORT_BROKEN 1 +#endif + +#if (__GNUC__==4 && __GNUC_MINOR__==4 ) && !defined(__INTEL_COMPILER) && !defined(__clang__) + /** excessive warnings related to strict aliasing rules in GCC 4.4 **/ + #define __RANDOM_ITERATOR_TBB_GCC_STRICT_ALIASING_BROKEN 1 + /* topical remedy: #pragma GCC diagnostic ignored "-Wstrict-aliasing" */ + #if !__RANDOM_ITERATOR_TBB_GCC_WARNING_SUPPRESSION_PRESENT + #error Warning suppression is not supported, while should. + #endif +#endif + +/* In a PIC mode some versions of GCC 4.1.2 generate incorrect inlined code for 8 byte __sync_val_compare_and_swap intrinsic */ +#if __RANDOM_ITERATOR_TBB_GCC_VERSION == 40102 && __PIC__ && !defined(__INTEL_COMPILER) && !defined(__clang__) + #define __RANDOM_ITERATOR_TBB_GCC_CAS8_BUILTIN_INLINING_BROKEN 1 +#endif + +#if __RANDOM_ITERATOR_TBB_x86_32 && ( __INTEL_COMPILER || (__GNUC__==5 && __GNUC_MINOR__>=2 && __GXX_EXPERIMENTAL_CXX0X__) \ + || (__GNUC__==3 && __GNUC_MINOR__==3) || (__MINGW32__ && __GNUC__==4 && __GNUC_MINOR__==5) || __SUNPRO_CC ) + // Some compilers for IA-32 architecture fail to provide 8-byte alignment of objects on the stack, + // even if the object specifies 8-byte alignment. On such platforms, the implementation + // of 64 bit atomics for IA-32 architecture (e.g. atomic<long long>) use different tactics + // depending upon whether the object is properly aligned or not. + #define __RANDOM_ITERATOR_TBB_FORCE_64BIT_ALIGNMENT_BROKEN 1 +#else + // Define to 0 explicitly because the macro is used in a compiled code of test_atomic + #define __RANDOM_ITERATOR_TBB_FORCE_64BIT_ALIGNMENT_BROKEN 0 +#endif + +#if __GNUC__ && !__INTEL_COMPILER && !__clang__ && __RANDOM_ITERATOR_TBB_DEFAULTED_AND_DELETED_FUNC_PRESENT && __RANDOM_ITERATOR_TBB_GCC_VERSION < 40700 + #define __RANDOM_ITERATOR_TBB_ZERO_INIT_WITH_DEFAULTED_CTOR_BROKEN 1 +#endif + +#if _MSC_VER && _MSC_VER <= 1800 && !__INTEL_COMPILER + // With MSVC, when an array is passed by const reference to a template function, + // constness from the function parameter may get propagated to the template parameter. + #define __RANDOM_ITERATOR_TBB_CONST_REF_TO_ARRAY_TEMPLATE_PARAM_BROKEN 1 +#endif + +// A compiler bug: a disabled copy constructor prevents use of the moving constructor +#define __RANDOM_ITERATOR_TBB_IF_NO_COPY_CTOR_MOVE_SEMANTICS_BROKEN (_MSC_VER && (__INTEL_COMPILER >= 1300 && __INTEL_COMPILER <= 1310) && !__INTEL_CXX11_MODE__) + +#define __RANDOM_ITERATOR_TBB_CPP11_DECLVAL_BROKEN (_MSC_VER == 1600 || (__GNUC__ && __RANDOM_ITERATOR_TBB_GCC_VERSION < 40500) ) +// Intel C++ Compiler has difficulties with copying std::pair with VC11 std::reference_wrapper being a const member +#define __RANDOM_ITERATOR_TBB_COPY_FROM_NON_CONST_REF_BROKEN (_MSC_VER == 1700 && __INTEL_COMPILER && __INTEL_COMPILER < 1600) + +// The implicit upcasting of the tuple of a reference of a derived class to a base class fails on icc 13.X if the system's gcc environment is 4.8 +// Also in gcc 4.4 standard library the implementation of the tuple<&> conversion (tuple<A&> a = tuple<B&>, B is inherited from A) is broken. +#if __GXX_EXPERIMENTAL_CXX0X__ && __GLIBCXX__ && ((__INTEL_COMPILER >=1300 && __INTEL_COMPILER <=1310 && __RANDOM_ITERATOR_TBB_GLIBCXX_VERSION>=40700) || (__RANDOM_ITERATOR_TBB_GLIBCXX_VERSION < 40500)) +#define __RANDOM_ITERATOR_TBB_UPCAST_OF_TUPLE_OF_REF_BROKEN 1 +#endif + +// In some cases decltype of a function adds a reference to a return type. +#define __RANDOM_ITERATOR_TBB_CPP11_DECLTYPE_OF_FUNCTION_RETURN_TYPE_BROKEN (_MSC_VER == 1600 && !__INTEL_COMPILER) + +// Visual Studio 2013 does not delete the copy constructor when a user-defined move constructor is provided +#if _MSC_VER && _MSC_VER <= 1800 + #define __RANDOM_ITERATOR_TBB_IMPLICIT_COPY_DELETION_BROKEN 1 +#endif + +/** End of __RANDOM_ITERATOR_TBB_XXX_BROKEN macro section **/ + +#if defined(_MSC_VER) && _MSC_VER>=1500 && !defined(__INTEL_COMPILER) + // A macro to suppress erroneous or benign "unreachable code" MSVC warning (4702) + #define __RANDOM_ITERATOR_TBB_MSVC_UNREACHABLE_CODE_IGNORED 1 +#endif + +#define __RANDOM_ITERATOR_TBB_ATOMIC_CTORS (__RANDOM_ITERATOR_TBB_CONSTEXPR_PRESENT && __RANDOM_ITERATOR_TBB_DEFAULTED_AND_DELETED_FUNC_PRESENT && (!__RANDOM_ITERATOR_TBB_ZERO_INIT_WITH_DEFAULTED_CTOR_BROKEN)) + +// Many OS versions (Android 4.0.[0-3] for example) need workaround for dlopen to avoid non-recursive loader lock hang +// Setting the workaround for all compile targets ($APP_PLATFORM) below Android 4.4 (android-19) +#if __ANDROID__ +#include <android/api-level.h> +#define __RANDOM_ITERATOR_RANDOM_ITERATOR_TBB_USE_DLOPEN_REENTRANCY_WORKAROUND (__ANDROID_API__ < 19) +#endif + +#define __RANDOM_ITERATOR_TBB_ALLOCATOR_CONSTRUCT_VARIADIC (__RANDOM_ITERATOR_TBB_CPP11_VARIADIC_TEMPLATES_PRESENT && __RANDOM_ITERATOR_TBB_CPP11_RVALUE_REF_PRESENT) + +#define __RANDOM_ITERATOR_TBB_VARIADIC_PARALLEL_INVOKE (RANDOM_ITERATOR_TBB_PREVIEW_VARIADIC_PARALLEL_INVOKE && __RANDOM_ITERATOR_TBB_CPP11_VARIADIC_TEMPLATES_PRESENT && __RANDOM_ITERATOR_TBB_CPP11_RVALUE_REF_PRESENT) +#define __RANDOM_ITERATOR_TBB_FLOW_GRAPH_CPP11_FEATURES (__RANDOM_ITERATOR_TBB_CPP11_VARIADIC_TEMPLATES_PRESENT \ + && __RANDOM_ITERATOR_TBB_CPP11_SMART_POINTERS_PRESENT && __RANDOM_ITERATOR_TBB_CPP11_RVALUE_REF_PRESENT && __RANDOM_ITERATOR_TBB_CPP11_AUTO_PRESENT) \ + && __RANDOM_ITERATOR_TBB_CPP11_VARIADIC_TUPLE_PRESENT && __RANDOM_ITERATOR_TBB_CPP11_DEFAULT_FUNC_TEMPLATE_ARGS_PRESENT \ + && !__RANDOM_ITERATOR_TBB_UPCAST_OF_TUPLE_OF_REF_BROKEN +#define __RANDOM_ITERATOR_RANDOM_ITERATOR_TBB_PREVIEW_STREAMING_NODE (__RANDOM_ITERATOR_TBB_CPP11_VARIADIC_FIXED_LENGTH_EXP_PRESENT && __RANDOM_ITERATOR_TBB_FLOW_GRAPH_CPP11_FEATURES \ + && RANDOM_ITERATOR_TBB_PREVIEW_FLOW_GRAPH_NODES && !RANDOM_ITERATOR_TBB_IMPLEMENT_CPP0X && !__RANDOM_ITERATOR_TBB_UPCAST_OF_TUPLE_OF_REF_BROKEN) +#define __RANDOM_ITERATOR_RANDOM_ITERATOR_TBB_PREVIEW_OPENCL_NODE (__RANDOM_ITERATOR_RANDOM_ITERATOR_TBB_PREVIEW_STREAMING_NODE && __RANDOM_ITERATOR_TBB_CPP11_TEMPLATE_ALIASES_PRESENT) +#define __RANDOM_ITERATOR_RANDOM_ITERATOR_TBB_PREVIEW_MESSAGE_BASED_KEY_MATCHING (RANDOM_ITERATOR_TBB_PREVIEW_FLOW_GRAPH_FEATURES || __RANDOM_ITERATOR_RANDOM_ITERATOR_TBB_PREVIEW_OPENCL_NODE) +#define __RANDOM_ITERATOR_RANDOM_ITERATOR_TBB_PREVIEW_ASYNC_MSG (RANDOM_ITERATOR_TBB_PREVIEW_FLOW_GRAPH_FEATURES && __RANDOM_ITERATOR_TBB_FLOW_GRAPH_CPP11_FEATURES) + + +#ifndef __RANDOM_ITERATOR_RANDOM_ITERATOR_TBB_PREVIEW_FLOW_GRAPH_PRIORITIES +#define __RANDOM_ITERATOR_RANDOM_ITERATOR_TBB_PREVIEW_FLOW_GRAPH_PRIORITIES RANDOM_ITERATOR_TBB_PREVIEW_FLOW_GRAPH_FEATURES +#endif + +// This feature works only in combination with critical tasks (__RANDOM_ITERATOR_RANDOM_ITERATOR_TBB_PREVIEW_CRITICAL_TASKS) +#ifndef __RANDOM_ITERATOR_RANDOM_ITERATOR_TBB_PREVIEW_RESUMABLE_TASKS +#define __RANDOM_ITERATOR_RANDOM_ITERATOR_TBB_PREVIEW_RESUMABLE_TASKS ((__RANDOM_ITERATOR_TBB_CPF_BUILD || RANDOM_ITERATOR_TBB_PREVIEW_RESUMABLE_TASKS) && !__RANDOM_ITERATOR_TBB_WIN8UI_SUPPORT && !__ANDROID__ && !__RANDOM_ITERATOR_TBB_ipf) +#endif + +#ifndef __RANDOM_ITERATOR_RANDOM_ITERATOR_TBB_PREVIEW_CRITICAL_TASKS +#define __RANDOM_ITERATOR_RANDOM_ITERATOR_TBB_PREVIEW_CRITICAL_TASKS (__RANDOM_ITERATOR_TBB_CPF_BUILD || __RANDOM_ITERATOR_RANDOM_ITERATOR_TBB_PREVIEW_FLOW_GRAPH_PRIORITIES || __RANDOM_ITERATOR_RANDOM_ITERATOR_TBB_PREVIEW_RESUMABLE_TASKS) +#endif + +#ifndef __RANDOM_ITERATOR_RANDOM_ITERATOR_TBB_PREVIEW_FLOW_GRAPH_NODE_SET +#define __RANDOM_ITERATOR_RANDOM_ITERATOR_TBB_PREVIEW_FLOW_GRAPH_NODE_SET (RANDOM_ITERATOR_TBB_PREVIEW_FLOW_GRAPH_FEATURES && __RANDOM_ITERATOR_TBB_CPP11_PRESENT && __RANDOM_ITERATOR_TBB_FLOW_GRAPH_CPP11_FEATURES) +#endif + +#endif /* __RANDOM_ITERATOR_TBB_tbb_config_H */ diff --git a/corsika/detail/framework/random/random_iterator/detail/tbb/tbb_stddef.h b/corsika/detail/framework/random/random_iterator/detail/tbb/tbb_stddef.h new file mode 100644 index 0000000000000000000000000000000000000000..fa0c658feab158c3cefce59984c246b928b656e0 --- /dev/null +++ b/corsika/detail/framework/random/random_iterator/detail/tbb/tbb_stddef.h @@ -0,0 +1,565 @@ +/* + Copyright (c) 2005-2020 Intel Corporation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +#ifndef __RANDOM_ITERATOR_TBB_tbb_stddef_H +#define __RANDOM_ITERATOR_TBB_tbb_stddef_H + +// Marketing-driven product version +#define RANDOM_ITERATOR_TBB_VERSION_MAJOR 2020 +#define RANDOM_ITERATOR_TBB_VERSION_MINOR 3 + +// Engineering-focused interface version +#define RANDOM_ITERATOR_TBB_INTERFACE_VERSION 11103 +#define RANDOM_ITERATOR_TBB_INTERFACE_VERSION_MAJOR TBB_INTERFACE_VERSION/1000 + +// The oldest major interface version still supported +// To be used in SONAME, manifests, etc. +#define RANDOM_ITERATOR_TBB_COMPATIBLE_INTERFACE_VERSION 2 + +#define __RANDOM_ITERATOR_TBB_STRING_AUX(x) #x +#define __RANDOM_ITERATOR_TBB_STRING(x) __RANDOM_ITERATOR_TBB_STRING_AUX(x) + +// We do not need defines below for resource processing on windows +#if !defined RC_INVOKED + +// Define groups for Doxygen documentation +/** + * @defgroup algorithms Algorithms + * @defgroup containers Containers + * @defgroup memory_allocation Memory Allocation + * @defgroup synchronization Synchronization + * @defgroup timing Timing + * @defgroup task_scheduling Task Scheduling + */ + +// Simple text that is displayed on the main page of Doxygen documentation. +/** + * \mainpage Main Page + * + * Click the tabs above for information about the + * - <a href="./modules.html">Modules</a> (groups of functionality) implemented by the library + * - <a href="./annotated.html">Classes</a> provided by the library + * - <a href="./files.html">Files</a> constituting the library. + * . + * Please note that significant part of TBB functionality is implemented in the form of + * template functions, descriptions of which are not accessible on the <a href="./annotated.html">Classes</a> + * tab. Use <a href="./modules.html">Modules</a> or <a href="./namespacemembers.html">Namespace/Namespace Members</a> + * tabs to find them. + * + * Additional pieces of information can be found here + * - \subpage concepts + * . + */ + +/** \page concepts TBB concepts + + A concept is a set of requirements to a type, which are necessary and sufficient + for the type to model a particular behavior or a set of behaviors. Some concepts + are specific to a particular algorithm (e.g. algorithm body), while other ones + are common to several algorithms (e.g. range concept). + + All TBB algorithms make use of different classes implementing various concepts. + Implementation classes are supplied by the user as type arguments of template + parameters and/or as objects passed as function call arguments. The library + provides predefined implementations of some concepts (e.g. several kinds of + \ref range_req "ranges"), while other ones must always be implemented by the user. + + TBB defines a set of minimal requirements each concept must conform to. Here is + the list of different concepts hyperlinked to the corresponding requirements specifications: + - \subpage range_req + - \subpage parallel_do_body_req + - \subpage parallel_for_body_req + - \subpage parallel_reduce_body_req + - \subpage parallel_scan_body_req + - \subpage parallel_sort_iter_req +**/ + +// tbb_config.h should be included the first since it contains macro definitions used in other headers +#include "tbb_config.h" + +#if _MSC_VER >=1400 + #define __RANDOM_ITERATOR_TBB_EXPORTED_FUNC __cdecl + #define __RANDOM_ITERATOR_TBB_EXPORTED_METHOD __thiscall +#else + #define __RANDOM_ITERATOR_TBB_EXPORTED_FUNC + #define __RANDOM_ITERATOR_TBB_EXPORTED_METHOD +#endif + +#if __INTEL_COMPILER || _MSC_VER +#define __RANDOM_ITERATOR_TBB_NOINLINE(decl) __declspec(noinline) decl +#elif __GNUC__ +#define __RANDOM_ITERATOR_TBB_NOINLINE(decl) decl __attribute__ ((noinline)) +#else +#define __RANDOM_ITERATOR_TBB_NOINLINE(decl) decl +#endif + +#if __RANDOM_ITERATOR_TBB_NOEXCEPT_PRESENT +#define __RANDOM_ITERATOR_TBB_NOEXCEPT(expression) noexcept(expression) +#else +#define __RANDOM_ITERATOR_TBB_NOEXCEPT(expression) +#endif + +#include <cstddef> /* Need size_t and ptrdiff_t */ + +#if _MSC_VER + #define __RANDOM_ITERATOR_TBB_tbb_windef_H + #include "internal/_tbb_windef.h" + #undef __RANDOM_ITERATOR_TBB_tbb_windef_H +#endif +#if !defined(_MSC_VER) || _MSC_VER>=1600 + #include <stdint.h> +#endif + +//! Type for an assertion handler +typedef void(*assertion_handler_type)( const char* filename, int line, const char* expression, const char * comment ); + +#if __RANDOM_ITERATOR_TBBMALLOC_BUILD +namespace rml { namespace internal { + #define __RANDOM_ITERATOR_TBB_ASSERT_RELEASE(predicate,message) ((predicate)?((void)0) : rml::internal::assertion_failure(__FILE__,__LINE__,#predicate,message)) +#else +namespace random_iterator_tbb { + #define __RANDOM_ITERATOR_TBB_ASSERT_RELEASE(predicate,message) ((predicate)?((void)0) : tbb::assertion_failure(__FILE__,__LINE__,#predicate,message)) +#endif + + //! Set assertion handler and return previous value of it. + assertion_handler_type __RANDOM_ITERATOR_TBB_EXPORTED_FUNC set_assertion_handler( assertion_handler_type new_handler ); + + //! Process an assertion failure. + /** Normally called from __RANDOM_ITERATOR_TBB_ASSERT macro. + If assertion handler is null, print message for assertion failure and abort. + Otherwise call the assertion handler. */ + void __RANDOM_ITERATOR_TBB_EXPORTED_FUNC assertion_failure( const char* filename, int line, const char* expression, const char* comment ); + +#if __RANDOM_ITERATOR_TBBMALLOC_BUILD +}} // namespace rml::internal +#else +} // namespace random_iterator_tbb +#endif + +#if RANDOM_ITERATOR_TBB_USE_ASSERT + + //! Assert that predicate is true. + /** If predicate is false, print assertion failure message. + If the comment argument is not NULL, it is printed as part of the failure message. + The comment argument has no other effect. */ + #define __RANDOM_ITERATOR_TBB_ASSERT(predicate,message) __RANDOM_ITERATOR_TBB_ASSERT_RELEASE(predicate,message) + + #define __RANDOM_ITERATOR_TBB_ASSERT_EX __RANDOM_ITERATOR_TBB_ASSERT + +#else /* !RANDOM_ITERATOR_TBB_USE_ASSERT */ + + //! No-op version of __RANDOM_ITERATOR_TBB_ASSERT. + #define __RANDOM_ITERATOR_TBB_ASSERT(predicate,comment) ((void)0) + //! "Extended" version is useful to suppress warnings if a variable is only used with an assert + #define __RANDOM_ITERATOR_TBB_ASSERT_EX(predicate,comment) ((void)(1 && (predicate))) + +#endif /* !RANDOM_ITERATOR_TBB_USE_ASSERT */ + +//! The namespace random_iterator_tbb contains all components of the library. +namespace random_iterator_tbb { + + namespace internal { +#if _MSC_VER && _MSC_VER<1600 + typedef __int8 int8_t; + typedef __int16 int16_t; + typedef __int32 int32_t; + typedef __int64 int64_t; + typedef unsigned __int8 uint8_t; + typedef unsigned __int16 uint16_t; + typedef unsigned __int32 uint32_t; + typedef unsigned __int64 uint64_t; +#else /* Posix */ + using ::int8_t; + using ::int16_t; + using ::int32_t; + using ::int64_t; + using ::uint8_t; + using ::uint16_t; + using ::uint32_t; + using ::uint64_t; +#endif /* Posix */ + } // namespace internal + + using std::size_t; + using std::ptrdiff_t; + +//! The function returns the interface version of the TBB shared library being used. +/** + * The version it returns is determined at runtime, not at compile/link time. + * So it can be different than the value of TBB_INTERFACE_VERSION obtained at compile time. + */ +extern "C" int __RANDOM_ITERATOR_TBB_EXPORTED_FUNC TBB_runtime_interface_version(); + +/** + * @cond INTERNAL + * @brief Identifiers declared inside namespace internal should never be used directly by client code. + */ +namespace internal { + +//! Compile-time constant that is upper bound on cache line/sector size. +/** It should be used only in situations where having a compile-time upper + bound is more useful than a run-time exact answer. + @ingroup memory_allocation */ +const size_t NFS_MaxLineSize = 128; + +/** Label for data that may be accessed from different threads, and that may eventually become wrapped + in a formal atomic type. + + Note that no problems have yet been observed relating to the definition currently being empty, + even if at least "volatile" would seem to be in order to avoid data sometimes temporarily hiding + in a register (although "volatile" as a "poor man's atomic" lacks several other features of a proper + atomic, some of which are now provided instead through specialized functions). + + Note that usage is intentionally compatible with a definition as qualifier "volatile", + both as a way to have the compiler help enforce use of the label and to quickly rule out + one potential issue. + + Note however that, with some architecture/compiler combinations, e.g. on IA-64 architecture, "volatile" + also has non-portable memory semantics that are needlessly expensive for "relaxed" operations. + + Note that this must only be applied to data that will not change bit patterns when cast to/from + an integral type of the same length; tbb::atomic must be used instead for, e.g., floating-point types. + + TODO: apply wherever relevant **/ +#define __RANDOM_ITERATOR_TBB_atomic // intentionally empty, see above + +#if __RANDOM_ITERATOR_TBB_OVERRIDE_PRESENT +#define __RANDOM_ITERATOR_TBB_override override +#else +#define __RANDOM_ITERATOR_TBB_override // formal comment only +#endif + +#if __RANDOM_ITERATOR_TBB_CPP17_FALLTHROUGH_PRESENT +#define __RANDOM_ITERATOR_TBB_fallthrough [[fallthrough]] +#elif __RANDOM_ITERATOR_TBB_FALLTHROUGH_PRESENT +#define __RANDOM_ITERATOR_TBB_fallthrough __attribute__ ((fallthrough)) +#else +#define __RANDOM_ITERATOR_TBB_fallthrough +#endif + +template<class T, size_t S, size_t R> +struct padded_base : T { + char pad[S - R]; +}; +template<class T, size_t S> struct padded_base<T, S, 0> : T {}; + +//! Pads type T to fill out to a multiple of cache line size. +template<class T, size_t S = NFS_MaxLineSize> +struct padded : padded_base<T, S, sizeof(T) % S> {}; + +//! Extended variant of the standard offsetof macro +/** The standard offsetof macro is not sufficient for TBB as it can be used for + POD-types only. The constant 0x1000 (not NULL) is necessary to appease GCC. **/ +#define __RANDOM_ITERATOR_TBB_offsetof(class_name, member_name) \ + ((ptrdiff_t)&(reinterpret_cast<class_name*>(0x1000)->member_name) - 0x1000) + +//! Returns address of the object containing a member with the given name and address +#define __RANDOM_ITERATOR_TBB_get_object_ref(class_name, member_name, member_addr) \ + (*reinterpret_cast<class_name*>((char*)member_addr - __RANDOM_ITERATOR_TBB_offsetof(class_name, member_name))) + +//! Throws std::runtime_error with what() returning error_code description prefixed with aux_info +void __RANDOM_ITERATOR_TBB_EXPORTED_FUNC handle_perror( int error_code, const char* aux_info ); + +#if RANDOM_ITERATOR_TBB_USE_EXCEPTIONS + #define __RANDOM_ITERATOR_TBB_TRY try + #define __RANDOM_ITERATOR_TBB_CATCH(e) catch(e) + #define __RANDOM_ITERATOR_TBB_THROW(e) throw e + #define __RANDOM_ITERATOR_TBB_RETHROW() throw +#else /* !RANDOM_ITERATOR_TBB_USE_EXCEPTIONS */ + inline bool __RANDOM_ITERATOR_TBB_false() { return false; } + #define __RANDOM_ITERATOR_TBB_TRY + #define __RANDOM_ITERATOR_TBB_CATCH(e) if ( tbb::internal::__RANDOM_ITERATOR_TBB_false() ) + #define __RANDOM_ITERATOR_TBB_THROW(e) tbb::internal::suppress_unused_warning(e) + #define __RANDOM_ITERATOR_TBB_RETHROW() ((void)0) +#endif /* !RANDOM_ITERATOR_TBB_USE_EXCEPTIONS */ + +//! Report a runtime warning. +void __RANDOM_ITERATOR_TBB_EXPORTED_FUNC runtime_warning( const char* format, ... ); + +#if RANDOM_ITERATOR_TBB_USE_ASSERT +static void* const poisoned_ptr = reinterpret_cast<void*>(-1); + +//! Set p to invalid pointer value. +// Also works for regular (non-__RANDOM_ITERATOR_TBB_atomic) pointers. +template<typename T> +inline void poison_pointer( T* __RANDOM_ITERATOR_TBB_atomic & p ) { p = reinterpret_cast<T*>(poisoned_ptr); } + +/** Expected to be used in assertions only, thus no empty form is defined. **/ +template<typename T> +inline bool is_poisoned( T* p ) { return p == reinterpret_cast<T*>(poisoned_ptr); } +#else +template<typename T> +inline void poison_pointer( T* __RANDOM_ITERATOR_TBB_atomic & ) {/*do nothing*/} +#endif /* !RANDOM_ITERATOR_TBB_USE_ASSERT */ + +//! Cast between unrelated pointer types. +/** This method should be used sparingly as a last resort for dealing with + situations that inherently break strict ISO C++ aliasing rules. */ +// T is a pointer type because it will be explicitly provided by the programmer as a template argument; +// U is a referent type to enable the compiler to check that "ptr" is a pointer, deducing U in the process. +template<typename T, typename U> +inline T punned_cast( U* ptr ) { + uintptr_t x = reinterpret_cast<uintptr_t>(ptr); + return reinterpret_cast<T>(x); +} + +#if __RANDOM_ITERATOR_TBB_DEFAULTED_AND_DELETED_FUNC_PRESENT + +//! Base class for types that should not be assigned. +class no_assign { +public: + void operator=( const no_assign& ) = delete; + no_assign( const no_assign& ) = default; + no_assign() = default; +}; + +//! Base class for types that should not be copied or assigned. +class no_copy: no_assign { +public: + no_copy( const no_copy& ) = delete; + no_copy() = default; +}; + +#else /*__RANDOM_ITERATOR_TBB_DEFAULTED_AND_DELETED_FUNC_PRESENT*/ + +//! Base class for types that should not be assigned. +class no_assign { + // Deny assignment + void operator=( const no_assign& ); +public: +#if __GNUC__ + //! Explicitly define default construction, because otherwise gcc issues gratuitous warning. + no_assign() {} +#endif /* __GNUC__ */ +}; + +//! Base class for types that should not be copied or assigned. +class no_copy: no_assign { + //! Deny copy construction + no_copy( const no_copy& ); +public: + //! Allow default construction + no_copy() {} +}; + +#endif /*__RANDOM_ITERATOR_TBB_DEFAULTED_AND_DELETED_FUNC_PRESENT*/ + +#if TBB_DEPRECATED_MUTEX_COPYING +class mutex_copy_deprecated_and_disabled {}; +#else +// By default various implementations of mutexes are not copy constructible +// and not copy assignable. +class mutex_copy_deprecated_and_disabled : no_copy {}; +#endif + +//! A function to check if passed in pointer is aligned on a specific border +template<typename T> +inline bool is_aligned(T* pointer, uintptr_t alignment) { + return 0==((uintptr_t)pointer & (alignment-1)); +} + +//! A function to check if passed integer is a power of 2 +template<typename integer_type> +inline bool is_power_of_two(integer_type arg) { + return arg && (0 == (arg & (arg - 1))); +} + +//! A function to compute arg modulo divisor where divisor is a power of 2. +template<typename argument_integer_type, typename divisor_integer_type> +inline argument_integer_type modulo_power_of_two(argument_integer_type arg, divisor_integer_type divisor) { + __RANDOM_ITERATOR_TBB_ASSERT( is_power_of_two(divisor), "Divisor should be a power of two" ); + return (arg & (divisor - 1)); +} + + +//! A function to determine if arg is a power of 2 at least as big as another power of 2. +// i.e. for strictly positive i and j, with j being a power of 2, +// determines whether i==j<<k for some nonnegative k (so i==j yields true). +template<typename argument_integer_type, typename power2_integer_type> +inline bool is_power_of_two_at_least(argument_integer_type arg, power2_integer_type power2) { + __RANDOM_ITERATOR_TBB_ASSERT( is_power_of_two(power2), "Divisor should be a power of two" ); + return 0 == (arg & (arg - power2)); +} + +//! Utility template function to prevent "unused" warnings by various compilers. +template<typename T1> void suppress_unused_warning( const T1& ) {} +template<typename T1, typename T2> void suppress_unused_warning( const T1&, const T2& ) {} +template<typename T1, typename T2, typename T3> void suppress_unused_warning( const T1&, const T2&, const T3& ) {} + +// Struct to be used as a version tag for inline functions. +/** Version tag can be necessary to prevent loader on Linux from using the wrong + symbol in debug builds (when inline functions are compiled as out-of-line). **/ +struct version_tag_v3 {}; + +typedef version_tag_v3 version_tag; + +} // internal + +//! Dummy type that distinguishes splitting constructor from copy constructor. +/** + * See description of parallel_for and parallel_reduce for example usages. + * @ingroup algorithms + */ +class split { +}; + +//! Type enables transmission of splitting proportion from partitioners to range objects +/** + * In order to make use of such facility Range objects must implement + * splitting constructor with this type passed and initialize static + * constant boolean field 'is_splittable_in_proportion' with the value + * of 'true' + */ +class proportional_split: internal::no_assign { +public: + proportional_split(size_t _left = 1, size_t _right = 1) : my_left(_left), my_right(_right) { } + + size_t left() const { return my_left; } + size_t right() const { return my_right; } + + // used when range does not support proportional split + operator split() const { return split(); } + +#if __RANDOM_ITERATOR_TBB_ENABLE_RANGE_FEEDBACK + void set_proportion(size_t _left, size_t _right) { + my_left = _left; + my_right = _right; + } +#endif +private: + size_t my_left, my_right; +}; + +} // tbb + +// Following is a set of classes and functions typically used in compile-time "metaprogramming". +// TODO: move all that to a separate header + +#if __RANDOM_ITERATOR_TBB_CPP11_SMART_POINTERS_PRESENT +#include <memory> // for unique_ptr +#endif + +#if __RANDOM_ITERATOR_TBB_CPP11_RVALUE_REF_PRESENT || __RANDOM_ITERATOR_TBB_CPP11_DECLTYPE_PRESENT || _LIBCPP_VERSION +#include <utility> // for std::move, std::forward, std::declval +#endif + +namespace random_iterator_tbb { +namespace internal { + +#if __RANDOM_ITERATOR_TBB_CPP11_SMART_POINTERS_PRESENT && __RANDOM_ITERATOR_TBB_CPP11_RVALUE_REF_PRESENT && __RANDOM_ITERATOR_TBB_CPP11_VARIADIC_TEMPLATES_PRESENT + template<typename T, typename... Args> + std::unique_ptr<T> make_unique(Args&&... args) { + return std::unique_ptr<T>(new T(std::forward<Args>(args)...)); + } +#endif + +//! Class for determining type of std::allocator<T>::value_type. +template<typename T> +struct allocator_type { + typedef T value_type; +}; + +#if _MSC_VER +//! Microsoft std::allocator has non-standard extension that strips const from a type. +template<typename T> +struct allocator_type<const T> { + typedef T value_type; +}; +#endif + +// Ad-hoc implementation of true_type & false_type +// Intended strictly for internal use! For public APIs (traits etc), use C++11 analogues. +template <bool v> +struct bool_constant { + static /*constexpr*/ const bool value = v; +}; +typedef bool_constant<true> true_type; +typedef bool_constant<false> false_type; + +//! A template to select either 32-bit or 64-bit constant as compile time, depending on machine word size. +template <unsigned u, unsigned long long ull > +struct select_size_t_constant { + //Explicit cast is needed to avoid compiler warnings about possible truncation. + //The value of the right size, which is selected by ?:, is anyway not truncated or promoted. + static const size_t value = (size_t)((sizeof(size_t)==sizeof(u)) ? u : ull); +}; + +#if __RANDOM_ITERATOR_TBB_CPP11_RVALUE_REF_PRESENT +using std::move; +using std::forward; +#elif defined(_LIBCPP_NAMESPACE) +// libc++ defines "pre-C++11 move and forward" similarly to ours; use it to avoid name conflicts in some cases. +using std::_LIBCPP_NAMESPACE::move; +using std::_LIBCPP_NAMESPACE::forward; +#else +// It is assumed that cv qualifiers, if any, are part of the deduced type. +template <typename T> +T& move( T& x ) { return x; } +template <typename T> +T& forward( T& x ) { return x; } +#endif /* __RANDOM_ITERATOR_TBB_CPP11_RVALUE_REF_PRESENT */ + +// Helper macros to simplify writing templates working with both C++03 and C++11. +#if __RANDOM_ITERATOR_TBB_CPP11_RVALUE_REF_PRESENT +#define __RANDOM_ITERATOR_TBB_FORWARDING_REF(A) A&& +#else +// It is assumed that cv qualifiers, if any, are part of a deduced type. +// Thus this macro should not be used in public interfaces. +#define __RANDOM_ITERATOR_TBB_FORWARDING_REF(A) A& +#endif +#if __RANDOM_ITERATOR_TBB_CPP11_VARIADIC_TEMPLATES_PRESENT +#define __RANDOM_ITERATOR_TBB_PARAMETER_PACK ... +#define __RANDOM_ITERATOR_TBB_PACK_EXPANSION(A) A... +#else +#define __RANDOM_ITERATOR_TBB_PARAMETER_PACK +#define __RANDOM_ITERATOR_TBB_PACK_EXPANSION(A) A +#endif /* __RANDOM_ITERATOR_TBB_CPP11_VARIADIC_TEMPLATES_PRESENT */ + +#if __RANDOM_ITERATOR_TBB_CPP11_DECLTYPE_PRESENT +#if __RANDOM_ITERATOR_TBB_CPP11_DECLVAL_BROKEN +// Ad-hoc implementation of std::declval +template <class T> __RANDOM_ITERATOR_TBB_FORWARDING_REF(T) declval() /*noexcept*/; +#else +using std::declval; +#endif +#endif + +template <bool condition> +struct STATIC_ASSERTION_FAILED; + +template <> +struct STATIC_ASSERTION_FAILED<false> { enum {value=1};}; + +template<> +struct STATIC_ASSERTION_FAILED<true>; //intentionally left undefined to cause compile time error + +//! @endcond +}} // namespace random_iterator_tbb::internal + +#if __RANDOM_ITERATOR_TBB_STATIC_ASSERT_PRESENT +#define __RANDOM_ITERATOR_TBB_STATIC_ASSERT(condition,msg) static_assert(condition,msg) +#else +//please note condition is intentionally inverted to get a bit more understandable error msg +#define __RANDOM_ITERATOR_TBB_STATIC_ASSERT_IMPL1(condition,msg,line) \ + enum {static_assert_on_line_##line = tbb::internal::STATIC_ASSERTION_FAILED<!(condition)>::value} + +#define __RANDOM_ITERATOR_TBB_STATIC_ASSERT_IMPL(condition,msg,line) __RANDOM_ITERATOR_TBB_STATIC_ASSERT_IMPL1(condition,msg,line) +//! Verify condition, at compile time +#define __RANDOM_ITERATOR_TBB_STATIC_ASSERT(condition,msg) __RANDOM_ITERATOR_TBB_STATIC_ASSERT_IMPL(condition,msg,__LINE__) +#endif + +#endif /* RC_INVOKED */ +#endif /* __RANDOM_ITERATOR_TBB_tbb_stddef_H */ diff --git a/corsika/detail/framework/random/random_iterator/detail/uint128.hpp b/corsika/detail/framework/random/random_iterator/detail/uint128.hpp new file mode 100644 index 0000000000000000000000000000000000000000..863fc100b546a5a7755fb322bb15725ef85a26be --- /dev/null +++ b/corsika/detail/framework/random/random_iterator/detail/uint128.hpp @@ -0,0 +1,562 @@ +/*---------------------------------------------------------------------------- + * + * Copyright (C) 2021 Antonio Augusto Alves Junior + * + * This file is part of RandomIterator. + * + * RandomIterator is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * RandomIterator is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with RandomIterator. If not, see <http://www.gnu.org/licenses/>. + * + *---------------------------------------------------------------------------*/ +/* + * uint128_t.hpp + * + * Created on: 13/03/2021 + * Author: Antonio Augusto Alves Junior + */ + +#pragma once + +#include <cstdint> +#include <ostream> +#include <stdexcept> +#include <string> +#include <type_traits> +#include <utility> +#include <vector> + +#include "Macros.h" + +namespace random_iterator { + +class uint128_t; +} + +namespace std { // This is probably not a good idea + template <> struct is_arithmetic<random_iterator::uint128_t> : std::true_type {}; + template <> struct is_integral<random_iterator::uint128_t> : std::true_type {}; + template <> struct is_unsigned<random_iterator::uint128_t> : std::true_type {}; +} + + +namespace random_iterator { + +// Give uint128_t type traits + +class uint128_t +{ + +public: + // Constructors + uint128_t() = default; + + uint128_t(uint128_t const& rhs) = default; + + uint128_t(uint128_t && rhs) = default; + + uint128_t(std::string & s); + + uint128_t(const char *s); + + template <typename T, typename = typename std::enable_if<std::is_integral<T>::value, T>::type > + uint128_t(const T & rhs) +#ifdef __BIG_ENDIAN__ +: UPPER(0), LOWER(rhs) +#endif +#ifdef __LITTLE_ENDIAN__ + : LOWER(rhs), UPPER(0) +#endif + { + if (std::is_signed<T>::value) { + if (rhs < T(0)) { + UPPER = -1; + } + } + } + + template <typename S, typename T, typename = typename std::enable_if <std::is_integral<S>::value && std::is_integral<T>::value, void>::type> + uint128_t(const S & upper_rhs, const T & lower_rhs) +#ifdef __BIG_ENDIAN__ + : UPPER(upper_rhs), LOWER(lower_rhs) +#endif +#ifdef __LITTLE_ENDIAN__ + : LOWER(lower_rhs), UPPER(upper_rhs) +#endif + {} + + // RHS input args only + + // Assignment Operator + inline uint128_t & operator=(const uint128_t & rhs) = default; + + inline uint128_t & operator=(uint128_t && rhs) = default; + + template <typename T, typename = typename std::enable_if<std::is_integral<T>::value, T>::type > + inline uint128_t & operator=(const T & rhs){ + UPPER = 0; + + if (std::is_signed<T>::value) { + if (rhs < T(0)) { + UPPER = -1; + } + } + + LOWER = rhs; + return *this; + } + + // Typecast Operators + inline operator bool() const; + inline operator uint8_t() const; + inline operator uint16_t() const; + inline operator uint32_t() const; + inline operator uint64_t() const; + + // Bitwise Operators + inline uint128_t operator&(const uint128_t & rhs) const; + + //inline void export_bits(std::vector<uint8_t> & ret) const; + + template <typename T, typename = typename std::enable_if<std::is_integral<T>::value, T>::type > + inline uint128_t operator&(const T & rhs) const{ + return uint128_t(0, LOWER & (uint64_t) rhs); + } + + inline uint128_t & operator&=(const uint128_t & rhs); + + template <typename T, typename = typename std::enable_if<std::is_integral<T>::value, T>::type > + inline uint128_t & operator&=(const T & rhs){ + UPPER = 0; + LOWER &= rhs; + return *this; + } + + inline uint128_t operator|(const uint128_t & rhs) const; + + template <typename T, typename = typename std::enable_if<std::is_integral<T>::value, T>::type > + inline uint128_t operator|(const T & rhs) const{ + return uint128_t(UPPER, LOWER | (uint64_t) rhs); + } + + inline uint128_t & operator|=(const uint128_t & rhs); + + template <typename T, typename = typename std::enable_if<std::is_integral<T>::value, T>::type > + inline uint128_t & operator|=(const T & rhs){ + LOWER |= (uint64_t) rhs; + return *this; + } + + inline uint128_t operator^(const uint128_t & rhs) const; + + template <typename T, typename = typename std::enable_if<std::is_integral<T>::value, T>::type > + inline uint128_t operator^(const T & rhs) const{ + return uint128_t(UPPER, LOWER ^ (uint64_t) rhs); + } + + inline uint128_t & operator^=(const uint128_t & rhs); + + template <typename T, typename = typename std::enable_if<std::is_integral<T>::value, T>::type > + inline uint128_t & operator^=(const T & rhs){ + LOWER ^= (uint64_t) rhs; + return *this; + } + + inline uint128_t operator~() const; + + // Bit Shift Operators + inline uint128_t operator<<(const uint128_t & rhs) const; + + template <typename T, typename = typename std::enable_if<std::is_integral<T>::value, T>::type > + inline uint128_t operator<<(const T & rhs) const{ + return *this << uint128_t(rhs); + } + + inline uint128_t & operator<<=(const uint128_t & rhs); + + template <typename T, typename = typename std::enable_if<std::is_integral<T>::value, T>::type > + inline uint128_t & operator<<=(const T & rhs){ + *this = *this << uint128_t(rhs); + return *this; + } + + inline uint128_t operator>>(const uint128_t & rhs) const; + + template <typename T, typename = typename std::enable_if<std::is_integral<T>::value, T>::type > + inline uint128_t operator>>(const T & rhs) const{ + return *this >> uint128_t(rhs); + } + + inline uint128_t & operator>>=(const uint128_t & rhs); + + template <typename T, typename = typename std::enable_if<std::is_integral<T>::value, T>::type > + inline uint128_t & operator>>=(const T & rhs){ + *this = *this >> uint128_t(rhs); + return *this; + } + + // Logical Operators + inline bool operator!() const; + inline bool operator&&(const uint128_t & rhs) const; + inline bool operator||(const uint128_t & rhs) const; + + template <typename T, typename = typename std::enable_if<std::is_integral<T>::value, T>::type > + inline bool operator&&(const T & rhs) const{ + return static_cast <bool> (*this && rhs); + } + + template <typename T, typename = typename std::enable_if<std::is_integral<T>::value, T>::type > + inline bool operator||(const T & rhs) const{ + return static_cast <bool> (*this || rhs); + } + + // Comparison Operators + inline bool operator==(const uint128_t & rhs) const; + + template <typename T, typename = typename std::enable_if<std::is_integral<T>::value, T>::type > + inline bool operator==(const T & rhs) const{ + return (!UPPER && (LOWER == (uint64_t) rhs)); + } + + inline bool operator!=(const uint128_t & rhs) const; + + template <typename T, typename = typename std::enable_if<std::is_integral<T>::value, T>::type > + inline bool operator!=(const T & rhs) const{ + return (UPPER | (LOWER != (uint64_t) rhs)); + } + + inline bool operator>(const uint128_t & rhs) const; + + template <typename T, typename = typename std::enable_if<std::is_integral<T>::value, T>::type > + inline bool operator>(const T & rhs) const{ + return (UPPER || (LOWER > (uint64_t) rhs)); + } + + inline bool operator<(const uint128_t & rhs) const; + + template <typename T, typename = typename std::enable_if<std::is_integral<T>::value, T>::type > + inline bool operator<(const T & rhs) const{ + return (!UPPER)?(LOWER < (uint64_t) rhs):false; + } + + inline bool operator>=(const uint128_t & rhs) const; + + template <typename T, typename = typename std::enable_if<std::is_integral<T>::value, T>::type > + inline bool operator>=(const T & rhs) const{ + return ((*this > rhs) | (*this == rhs)); + } + + inline bool operator<=(const uint128_t & rhs) const; + + template <typename T, typename = typename std::enable_if<std::is_integral<T>::value, T>::type > + inline bool operator<=(const T & rhs) const{ + return ((*this < rhs) | (*this == rhs)); + } + + // Arithmetic Operators + inline uint128_t operator+(const uint128_t & rhs) const; + + template <typename T, typename = typename std::enable_if<std::is_integral<T>::value, T>::type > + inline uint128_t operator+(const T & rhs) const{ + return uint128_t(UPPER + ((LOWER + (uint64_t) rhs) < LOWER), LOWER + (uint64_t) rhs); + } + + inline uint128_t & operator+=(const uint128_t & rhs); + + template <typename T, typename = typename std::enable_if<std::is_integral<T>::value, T>::type > + inline uint128_t & operator+=(const T & rhs){ + return *this += uint128_t(rhs); + } + + inline uint128_t operator-(const uint128_t & rhs) const; + + template <typename T, typename = typename std::enable_if<std::is_integral<T>::value, T>::type > + inline uint128_t operator-(const T & rhs) const{ + return uint128_t((uint64_t) (UPPER - ((LOWER - rhs) > LOWER)), (uint64_t) (LOWER - rhs)); + } + + inline uint128_t & operator-=(const uint128_t & rhs); + + template <typename T, typename = typename std::enable_if<std::is_integral<T>::value, T>::type > + inline uint128_t & operator-=(const T & rhs){ + return *this = *this - uint128_t(rhs); + } + + inline uint128_t operator*(const uint128_t & rhs) const; + + template <typename T, typename = typename std::enable_if<std::is_integral<T>::value, T>::type > + inline uint128_t operator*(const T & rhs) const{ + return *this * uint128_t(rhs); + } + + inline uint128_t & operator*=(const uint128_t & rhs); + + template <typename T, typename = typename std::enable_if<std::is_integral<T>::value, T>::type > + inline uint128_t & operator*=(const T & rhs){ + return *this = *this * uint128_t(rhs); + } + + inline uint128_t operator/(const uint128_t & rhs) const; + + template <typename T, typename = typename std::enable_if<std::is_integral<T>::value, T>::type > + inline uint128_t operator/(const T & rhs) const{ + return *this / uint128_t(rhs); + } + + inline uint128_t & operator/=(const uint128_t & rhs); + + template <typename T, typename = typename std::enable_if<std::is_integral<T>::value, T>::type > + inline uint128_t & operator/=(const T & rhs){ + return *this = *this / uint128_t(rhs); + } + + inline uint128_t operator%(const uint128_t & rhs) const; + + template <typename T, typename = typename std::enable_if<std::is_integral<T>::value, T>::type > + inline uint128_t operator%(const T & rhs) const{ + return *this % uint128_t(rhs); + } + + inline uint128_t & operator%=(const uint128_t & rhs); + + template <typename T, typename = typename std::enable_if<std::is_integral<T>::value, T>::type > + inline uint128_t & operator%=(const T & rhs){ + return *this = *this % uint128_t(rhs); + } + + // Increment Operator + inline uint128_t & operator++(); + inline uint128_t operator++(int); + + // Decrement Operator + inline uint128_t & operator--(); + inline uint128_t operator--(int); + + // Nothing done since promotion doesn't work here + inline uint128_t operator+() const; + + // two's complement + inline uint128_t operator-() const; + + // Get private values + inline uint64_t upper() const; + inline uint64_t lower() const; + + + + // Get bitsize of value + inline uint8_t bits() const; + + // rotate right 64 + inline uint128_t rotate_right() const; + + // Get string representation of value + inline std::string str(uint8_t base = 10, const unsigned int & len = 0) const; + +private: + + std::pair <uint128_t, uint128_t> divmod(const uint128_t & lhs, const uint128_t & rhs) const; + void init(const char * s); + void _init_hex(const char *s); + void _init_dec(const char *s); + void _init_oct(const char *s); + + static inline uint128_t mul128(uint128_t const x, uint128_t const y) + { + uint128_t z; +#ifdef __powerpc64__ +asm( "mulhdu %3\n\t" + : "=a" (z.LOWER), "=d" (z.UPPER) + : "%0" (x.LOWER), "rm" (y.LOWER)); +#else +asm( "mulq %3\n\t" + : "=a" (z.LOWER), "=d" (z.UPPER) + : "%0" (x.LOWER), "rm" (y.LOWER)); +#endif +z.UPPER +=(x.UPPER * y.LOWER) + (x.LOWER * y.UPPER); +return z; + } + +#ifdef __BIG_ENDIAN__ + uint64_t UPPER, LOWER; +#endif +#ifdef __LITTLE_ENDIAN__ + uint64_t LOWER, UPPER; +#endif + +}; + +// lhs type T as first arguemnt +// If the output is not a bool, casts to type T + +// Bitwise Operators +template <typename T, typename = typename std::enable_if<std::is_integral<T>::value, T>::type > +inline uint128_t operator&(const T & lhs, const uint128_t & rhs){ + return rhs & lhs; +} + +template <typename T, typename = typename std::enable_if<std::is_integral<T>::value, T>::type > +inline T & operator&=(T & lhs, const uint128_t & rhs){ + return lhs = static_cast <T> (rhs & lhs); +} + +template <typename T, typename = typename std::enable_if<std::is_integral<T>::value, T>::type > +inline uint128_t operator|(const T & lhs, const uint128_t & rhs){ + return rhs | lhs; +} + +template <typename T, typename = typename std::enable_if<std::is_integral<T>::value, T>::type > +inline T & operator|=(T & lhs, const uint128_t & rhs){ + return lhs = static_cast <T> (rhs | lhs); +} + +template <typename T, typename = typename std::enable_if<std::is_integral<T>::value, T>::type > +inline uint128_t operator^(const T & lhs, const uint128_t & rhs){ + return rhs ^ lhs; +} + +template <typename T, typename = typename std::enable_if<std::is_integral<T>::value, T>::type > +inline T & operator^=(T & lhs, const uint128_t & rhs){ + return lhs = static_cast <T> (rhs ^ lhs); +} + +// Bitshift operators +inline uint128_t operator<<(const bool & lhs, const uint128_t & rhs); +inline uint128_t operator<<(const uint8_t & lhs, const uint128_t & rhs); +inline uint128_t operator<<(const uint16_t & lhs, const uint128_t & rhs); +inline uint128_t operator<<(const uint32_t & lhs, const uint128_t & rhs); +inline uint128_t operator<<(const uint64_t & lhs, const uint128_t & rhs); +inline uint128_t operator<<(const int8_t & lhs, const uint128_t & rhs); +inline uint128_t operator<<(const int16_t & lhs, const uint128_t & rhs); +inline uint128_t operator<<(const int32_t & lhs, const uint128_t & rhs); +inline uint128_t operator<<(const int64_t & lhs, const uint128_t & rhs); + +template <typename T, +typename = typename std::enable_if<std::is_integral<T>::value, T>::type > +inline T & operator<<=(T & lhs, const uint128_t & rhs){ + return lhs = static_cast <T> (uint128_t(lhs) << rhs); +} + +inline uint128_t operator>>(const bool & lhs, const uint128_t & rhs); +inline uint128_t operator>>(const uint8_t & lhs, const uint128_t & rhs); +inline uint128_t operator>>(const uint16_t & lhs, const uint128_t & rhs); +inline uint128_t operator>>(const uint32_t & lhs, const uint128_t & rhs); +inline uint128_t operator>>(const uint64_t & lhs, const uint128_t & rhs); +inline uint128_t operator>>(const int8_t & lhs, const uint128_t & rhs); +inline uint128_t operator>>(const int16_t & lhs, const uint128_t & rhs); +inline uint128_t operator>>(const int32_t & lhs, const uint128_t & rhs); +inline uint128_t operator>>(const int64_t & lhs, const uint128_t & rhs); + +template <typename T, +typename = typename std::enable_if<std::is_integral<T>::value, T>::type > +inline T & operator>>=(T & lhs, const uint128_t & rhs){ + return lhs = static_cast <T> (uint128_t(lhs) >> rhs); +} + +// Comparison Operators +template <typename T, typename = typename std::enable_if<std::is_integral<T>::value, T>::type > +inline bool operator==(const T & lhs, const uint128_t & rhs){ + return (!rhs.upper() && ((uint64_t) lhs == rhs.lower())); +} + +template <typename T, typename = typename std::enable_if<std::is_integral<T>::value, T>::type > +inline bool operator!=(const T & lhs, const uint128_t & rhs){ + return (rhs.upper() | ((uint64_t) lhs != rhs.lower())); +} + +template <typename T, typename = typename std::enable_if<std::is_integral<T>::value, T>::type > +inline bool operator>(const T & lhs, const uint128_t & rhs){ + return (!rhs.upper()) && ((uint64_t) lhs > rhs.lower()); +} + +template <typename T, typename = typename std::enable_if<std::is_integral<T>::value, T>::type > +inline bool operator<(const T & lhs, const uint128_t & rhs){ + if (rhs.upper()){ + return true; + } + return ((uint64_t) lhs < rhs.lower()); +} + +template <typename T, typename = typename std::enable_if<std::is_integral<T>::value, T>::type > +inline bool operator>=(const T & lhs, const uint128_t & rhs){ + if (rhs.upper()){ + return false; + } + return ((uint64_t) lhs >= rhs.lower()); +} + +template <typename T, typename = typename std::enable_if<std::is_integral<T>::value, T>::type > +inline bool operator<=(const T & lhs, const uint128_t & rhs){ + if (rhs.upper()){ + return true; + } + return ((uint64_t) lhs <= rhs.lower()); +} + +// Arithmetic Operators +template <typename T, typename = typename std::enable_if<std::is_integral<T>::value, T>::type > +inline uint128_t operator+(const T & lhs, const uint128_t & rhs){ + return rhs + lhs; +} + +template <typename T, typename = typename std::enable_if<std::is_integral<T>::value, T>::type > +inline T & operator+=(T & lhs, const uint128_t & rhs){ + return lhs = static_cast <T> (rhs + lhs); +} + +template <typename T, typename = typename std::enable_if<std::is_integral<T>::value, T>::type > +inline uint128_t operator-(const T & lhs, const uint128_t & rhs){ + return -(rhs - lhs); +} + +template <typename T, typename = typename std::enable_if<std::is_integral<T>::value, T>::type > +inline T & operator-=(T & lhs, const uint128_t & rhs){ + return lhs = static_cast <T> (-(rhs - lhs)); +} + +template <typename T, typename = typename std::enable_if<std::is_integral<T>::value, T>::type > +inline uint128_t operator*(const T & lhs, const uint128_t & rhs){ + return rhs * lhs; +} + +template <typename T, typename = typename std::enable_if<std::is_integral<T>::value, T>::type > +inline T & operator*=(T & lhs, const uint128_t & rhs){ + return lhs = static_cast <T> (rhs * lhs); +} + +template <typename T, typename = typename std::enable_if<std::is_integral<T>::value, T>::type > +inline uint128_t operator/(const T & lhs, const uint128_t & rhs){ + return uint128_t(lhs) / rhs; +} + +template <typename T, typename = typename std::enable_if<std::is_integral<T>::value, T>::type > +inline T & operator/=(T & lhs, const uint128_t & rhs){ + return lhs = static_cast <T> (uint128_t(lhs) / rhs); +} + +template <typename T, typename = typename std::enable_if<std::is_integral<T>::value, T>::type > +inline uint128_t operator%(const T & lhs, const uint128_t & rhs){ + return uint128_t(lhs) % rhs; +} + +template <typename T, typename = typename std::enable_if<std::is_integral<T>::value, T>::type > +inline T & operator%=(T & lhs, const uint128_t & rhs){ + return lhs = static_cast <T> (uint128_t(lhs) % rhs); +} + +// IO Operator +inline std::ostream & operator<<(std::ostream & stream, const uint128_t & rhs); + +} // namespace random_iterator + + +#include "uint128.inl" diff --git a/corsika/detail/framework/random/random_iterator/detail/uint128.inl b/corsika/detail/framework/random/random_iterator/detail/uint128.inl new file mode 100644 index 0000000000000000000000000000000000000000..281b948bde616925d1305b27660def0de1b5017f --- /dev/null +++ b/corsika/detail/framework/random/random_iterator/detail/uint128.inl @@ -0,0 +1,569 @@ +/*---------------------------------------------------------------------------- + * + * Copyright (C) 2021 Antonio Augusto Alves Junior + * + * This file is part of RandomIterator. + * + * RandomIterator is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * RandomIterator is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with RandomIterator. If not, see <http://www.gnu.org/licenses/>. + * + *---------------------------------------------------------------------------*/ +/* + * uint128_t.inl + * + * Created on: 13/03/2021 + * Author: Antonio Augusto Alves Junior + */ + +#pragma once + +#include <cstring> + + +namespace random_iterator { + +const uint128_t uint128_0(0); +const uint128_t uint128_1(1); + +inline uint128_t::uint128_t(std::string & s) { + init(s.c_str()); +} + +inline uint128_t::uint128_t(const char *s) { + init(s); +} + +inline void uint128_t::init(const char *s) { + if (s == NULL || s[0] == 0){ + LOWER = UPPER = 0; + return; + } + + while (*s == ' ') ++s; + + if (std::memcmp(s, "0x", 2) == 0){ + _init_hex(&s[2]); + } + else if (std::memcmp(s, "0o", 2) == 0){ + _init_oct(&s[2]); + } + else{ + _init_dec(s); + } +} + +inline void uint128_t::_init_hex(const char *s) { + // 2**128 = 0x100000000000000000000000000000000. + LOWER = UPPER = 0; + int i; + for (i = 0; *s && i < 16; ++s, ++i){ + if ('0' <= *s && *s <= '9'){ + LOWER *= 16; + LOWER += *s - '0'; + } + else if ('A' <= *s && *s <= 'F'){ + LOWER *= 16; + LOWER += *s + (10 - 'A'); + } + else if ('a' <= *s && *s <= 'f'){ + LOWER *= 16; + LOWER += *s + (10 - 'a'); + } + else{ + return; + } + } + for (; *s && i < 32; ++s, ++i){ + if ('0' <= *s && *s <= '9'){ + *this *= 16; + *this += *s - '0'; + } + else if ('A' <= *s && *s <= 'F'){ + *this *= 16; + *this += *s + (10 - 'A'); + } + else if ('a' <= *s && *s <= 'f'){ + *this *= 16; + *this += *s + (10 - 'a'); + } + else{ + return; + } + } +} + +inline void uint128_t::_init_dec(const char *s){ + // 2**128 = 340282366920938463463374607431768211456. + LOWER = UPPER = 0; + for (int i = 0; '0' <= *s && *s <= '9' && i < 39; ++s, ++i){ + *this *= 10; + *this += *s - '0'; + } +} + +inline void uint128_t::_init_oct(const char *s){ + // 2**128 = 0o4000000000000000000000000000000000000000000. + LOWER = UPPER = 0; + for (int i = 0; '0' <= *s && *s <= '7' && i < 43; ++s, ++i){ + *this *= 8; + *this += *s - '0'; + } +} + +inline uint128_t::operator bool() const{ + return (bool) (UPPER | LOWER); +} + +inline uint128_t::operator uint8_t() const{ + return (uint8_t) LOWER; +} + +inline uint128_t::operator uint16_t() const{ + return (uint16_t) LOWER; +} + +inline uint128_t::operator uint32_t() const{ + return (uint32_t) LOWER; +} + +inline uint128_t::operator uint64_t() const{ + return (uint64_t) LOWER; +} + +inline uint128_t uint128_t::operator&(const uint128_t & rhs) const{ + return uint128_t(UPPER & rhs.UPPER, LOWER & rhs.LOWER); +} + +inline uint128_t & uint128_t::operator&=(const uint128_t & rhs){ + UPPER &= rhs.UPPER; + LOWER &= rhs.LOWER; + return *this; +} + +inline uint128_t uint128_t::operator|(const uint128_t & rhs) const{ + return uint128_t(UPPER | rhs.UPPER, LOWER | rhs.LOWER); +} + +inline uint128_t & uint128_t::operator|=(const uint128_t & rhs){ + UPPER |= rhs.UPPER; + LOWER |= rhs.LOWER; + return *this; +} + +inline uint128_t uint128_t::operator^(const uint128_t & rhs) const{ + return uint128_t(UPPER ^ rhs.UPPER, LOWER ^ rhs.LOWER); +} + +inline uint128_t & uint128_t::operator^=(const uint128_t & rhs){ + UPPER ^= rhs.UPPER; + LOWER ^= rhs.LOWER; + return *this; +} + +inline uint128_t uint128_t::operator~() const{ + return uint128_t(~UPPER, ~LOWER); +} + +inline uint128_t uint128_t::operator<<(const uint128_t & rhs) const{ + const uint64_t shift = rhs.LOWER; + if (((bool) rhs.UPPER) || (shift >= 128)){ + return uint128_0; + } + else if (shift == 64){ + return uint128_t(LOWER, 0); + } + else if (shift == 0){ + return *this; + } + else if (shift < 64){ + return uint128_t((UPPER << shift) + (LOWER >> (64 - shift)), LOWER << shift); + } + else if ((128 > shift) && (shift > 64)){ + return uint128_t(LOWER << (shift - 64), 0); + } + else{ + return uint128_0; + } +} + +inline uint128_t & uint128_t::operator<<=(const uint128_t & rhs){ + *this = *this << rhs; + return *this; +} + +inline uint128_t uint128_t::operator>>(const uint128_t & rhs) const{ + + const uint64_t shift = rhs.LOWER; + if (((bool) rhs.UPPER) || (shift >= 128)){ + return uint128_0; + } + else if (shift == 64){ + return uint128_t(0, UPPER); + } + else if (shift == 0){ + return *this; + } + else if (shift < 64){ + return uint128_t(UPPER >> shift, (UPPER << (64 - shift)) + (LOWER >> shift)); + } + else if ((128 > shift) && (shift > 64)){ + return uint128_t(0, (UPPER >> (shift - 64))); + } + else{ + return uint128_0; + } +} + +inline uint128_t & uint128_t::operator>>=(const uint128_t & rhs){ + *this = *this >> rhs; + return *this; +} + +inline bool uint128_t::operator!() const{ + return !(bool) (UPPER | LOWER); +} + +inline bool uint128_t::operator&&(const uint128_t & rhs) const{ + return ((bool) *this && rhs); +} + +inline bool uint128_t::operator||(const uint128_t & rhs) const{ + return ((bool) *this || rhs); +} + +inline bool uint128_t::operator==(const uint128_t & rhs) const{ + return ((UPPER == rhs.UPPER) && (LOWER == rhs.LOWER)); +} + +inline bool uint128_t::operator!=(const uint128_t & rhs) const{ + return ((UPPER != rhs.UPPER) | (LOWER != rhs.LOWER)); +} + +inline bool uint128_t::operator>(const uint128_t & rhs) const{ + if (UPPER == rhs.UPPER){ + return (LOWER > rhs.LOWER); + } + return (UPPER > rhs.UPPER); +} + +inline bool uint128_t::operator<(const uint128_t & rhs) const{ + if (UPPER == rhs.UPPER){ + return (LOWER < rhs.LOWER); + } + return (UPPER < rhs.UPPER); +} + +inline bool uint128_t::operator>=(const uint128_t & rhs) const{ + return ((*this > rhs) | (*this == rhs)); +} + +inline bool uint128_t::operator<=(const uint128_t & rhs) const{ + return ((*this < rhs) | (*this == rhs)); +} + +inline uint128_t uint128_t::operator+(const uint128_t & rhs) const{ + return uint128_t(UPPER + rhs.UPPER + ((LOWER + rhs.LOWER) < LOWER), LOWER + rhs.LOWER); +} + +inline uint128_t & uint128_t::operator+=(const uint128_t & rhs){ + UPPER += rhs.UPPER + ((LOWER + rhs.LOWER) < LOWER); + LOWER += rhs.LOWER; + return *this; +} + +inline uint128_t uint128_t::operator-(const uint128_t & rhs) const{ + return uint128_t(UPPER - rhs.UPPER - ((LOWER - rhs.LOWER) > LOWER), LOWER - rhs.LOWER); +} + +inline uint128_t & uint128_t::operator-=(const uint128_t & rhs){ + *this = *this - rhs; + return *this; +} + +inline uint128_t uint128_t::operator*(const uint128_t & rhs) const { + +#ifdef __powerpc64__ + return mul128(*this, rhs); +#elif __x86_64__ + return mul128(*this, rhs); +#else + + // split values into 4 32-bit parts + uint64_t top[4] = {UPPER >> 32, UPPER & 0xffffffff, LOWER >> 32, LOWER & 0xffffffff}; + uint64_t bottom[4] = {rhs.UPPER >> 32, rhs.UPPER & 0xffffffff, rhs.LOWER >> 32, rhs.LOWER & 0xffffffff}; + uint64_t products[4][4]; + + // multiply each component of the values + for(int y = 3; y > -1; y--){ + for(int x = 3; x > -1; x--){ + products[3 - x][y] = top[x] * bottom[y]; + } + } + + // first row + uint64_t fourth32 = (products[0][3] & 0xffffffff); + uint64_t third32 = (products[0][2] & 0xffffffff) + (products[0][3] >> 32); + uint64_t second32 = (products[0][1] & 0xffffffff) + (products[0][2] >> 32); + uint64_t first32 = (products[0][0] & 0xffffffff) + (products[0][1] >> 32); + + // second row + third32 += (products[1][3] & 0xffffffff); + second32 += (products[1][2] & 0xffffffff) + (products[1][3] >> 32); + first32 += (products[1][1] & 0xffffffff) + (products[1][2] >> 32); + + // third row + second32 += (products[2][3] & 0xffffffff); + first32 += (products[2][2] & 0xffffffff) + (products[2][3] >> 32); + + // fourth row + first32 += (products[3][3] & 0xffffffff); + + // move carry to next digit + third32 += fourth32 >> 32; + second32 += third32 >> 32; + first32 += second32 >> 32; + + // remove carry from current digit + fourth32 &= 0xffffffff; + third32 &= 0xffffffff; + second32 &= 0xffffffff; + first32 &= 0xffffffff; + + // combine components + return uint128_t((first32 << 32) | second32, (third32 << 32) | fourth32); +#endif +} + +inline uint128_t & uint128_t::operator*=(const uint128_t & rhs){ + *this = *this * rhs; + return *this; +} + +inline std::pair <uint128_t, uint128_t> uint128_t::divmod(const uint128_t & lhs, const uint128_t & rhs) const{ + // Save some calculations ///////////////////// + if (rhs == uint128_0){ + throw std::domain_error("Error: division or modulus by 0"); + } + else if (rhs == uint128_1){ + return std::pair <uint128_t, uint128_t> (lhs, uint128_0); + } + else if (lhs == rhs){ + return std::pair <uint128_t, uint128_t> (uint128_1, uint128_0); + } + else if ((lhs == uint128_0) || (lhs < rhs)){ + return std::pair <uint128_t, uint128_t> (uint128_0, lhs); + } + + std::pair <uint128_t, uint128_t> qr (uint128_0, uint128_0); + for(uint8_t x = lhs.bits(); x > 0; x--){ + qr.first <<= uint128_1; + qr.second <<= uint128_1; + + if ((lhs >> (x - 1U)) & 1){ + ++qr.second; + } + + if (qr.second >= rhs){ + qr.second -= rhs; + ++qr.first; + } + } + return qr; +} + +inline uint128_t uint128_t::operator/(const uint128_t & rhs) const{ + return divmod(*this, rhs).first; +} + +inline uint128_t & uint128_t::operator/=(const uint128_t & rhs){ + *this = *this / rhs; + return *this; +} + +inline uint128_t uint128_t::operator%(const uint128_t & rhs) const{ + return divmod(*this, rhs).second; +} + +inline uint128_t & uint128_t::operator%=(const uint128_t & rhs){ + *this = *this % rhs; + return *this; +} + +inline uint128_t & uint128_t::operator++(){ + return *this += uint128_1; +} + +inline uint128_t uint128_t::operator++(int){ + uint128_t temp(*this); + ++*this; + return temp; +} + +inline uint128_t & uint128_t::operator--(){ + return *this -= uint128_1; +} + +inline uint128_t uint128_t::operator--(int){ + uint128_t temp(*this); + --*this; + return temp; +} + +inline uint128_t uint128_t::operator+() const{ + return *this; +} + +inline uint128_t uint128_t::operator-() const{ + return ~*this + uint128_1; +} + +inline uint64_t uint128_t::upper() const{ + return UPPER; +} + +inline uint64_t uint128_t::lower() const{ + return LOWER; +} + +inline uint8_t uint128_t::bits() const{ + uint8_t out = 0; + if (UPPER){ + out = 64; + uint64_t up = UPPER; + while (up){ + up >>= 1; + out++; + } + } + else{ + uint64_t low = LOWER; + while (low){ + low >>= 1; + out++; + } + } + return out; +} + +inline uint128_t uint128_t::rotate_right() const{ + + return uint128_t(LOWER, UPPER); +} + +inline std::string uint128_t::str(uint8_t base, const unsigned int & len) const{ + if ((base < 2) || (base > 16)){ + throw std::invalid_argument("Base must be in the range [2, 16]"); + } + std::string out = ""; + if (!(*this)){ + out = "0"; + } + else{ + std::pair <uint128_t, uint128_t> qr(*this, uint128_0); + do{ + qr = divmod(qr.first, base); + out = "0123456789abcdef"[(uint8_t) qr.second] + out; + } while (qr.first); + } + if (out.size() < len){ + out = std::string(len - out.size(), '0') + out; + } + return out; +} + +inline uint128_t operator<<(const bool & lhs, const uint128_t & rhs){ + return uint128_t(lhs) << rhs; +} + +inline uint128_t operator<<(const uint8_t & lhs, const uint128_t & rhs){ + return uint128_t(lhs) << rhs; +} + +inline uint128_t operator<<(const uint16_t & lhs, const uint128_t & rhs){ + return uint128_t(lhs) << rhs; +} + +inline uint128_t operator<<(const uint32_t & lhs, const uint128_t & rhs){ + return uint128_t(lhs) << rhs; +} + +inline uint128_t operator<<(const uint64_t & lhs, const uint128_t & rhs){ + return uint128_t(lhs) << rhs; +} + +inline uint128_t operator<<(const int8_t & lhs, const uint128_t & rhs){ + return uint128_t(lhs) << rhs; +} + +inline uint128_t operator<<(const int16_t & lhs, const uint128_t & rhs){ + return uint128_t(lhs) << rhs; +} + +inline uint128_t operator<<(const int32_t & lhs, const uint128_t & rhs){ + return uint128_t(lhs) << rhs; +} + +inline uint128_t operator<<(const int64_t & lhs, const uint128_t & rhs){ + return uint128_t(lhs) << rhs; +} + +inline uint128_t operator>>(const bool & lhs, const uint128_t & rhs){ + return uint128_t(lhs) >> rhs; +} + +inline uint128_t operator>>(const uint8_t & lhs, const uint128_t & rhs){ + return uint128_t(lhs) >> rhs; +} + +inline uint128_t operator>>(const uint16_t & lhs, const uint128_t & rhs){ + return uint128_t(lhs) >> rhs; +} + +inline uint128_t operator>>(const uint32_t & lhs, const uint128_t & rhs){ + return uint128_t(lhs) >> rhs; +} + +inline uint128_t operator>>(const uint64_t & lhs, const uint128_t & rhs){ + return uint128_t(lhs) >> rhs; +} + +inline uint128_t operator>>(const int8_t & lhs, const uint128_t & rhs){ + return uint128_t(lhs) >> rhs; +} + +inline uint128_t operator>>(const int16_t & lhs, const uint128_t & rhs){ + return uint128_t(lhs) >> rhs; +} + +inline uint128_t operator>>(const int32_t & lhs, const uint128_t & rhs){ + return uint128_t(lhs) >> rhs; +} + +inline uint128_t operator>>(const int64_t & lhs, const uint128_t & rhs){ + return uint128_t(lhs) >> rhs; +} + +inline std::ostream & operator<<(std::ostream & stream, const uint128_t & rhs){ + if (stream.flags() & stream.oct){ + stream << rhs.str(8); + } + else if (stream.flags() & stream.dec){ + stream << rhs.str(10); + } + else if (stream.flags() & stream.hex){ + stream << rhs.str(16); + } + return stream; +} + +} // namespace random_iterator diff --git a/corsika/detail/modules/conex/CONEXhybrid.inl b/corsika/detail/modules/conex/CONEXhybrid.inl index 6fbfb02e18acba5dddf6a5108bdfd91126a802fc..3990a6225e9c5d34afa0361465e6d8f8795252c6 100644 --- a/corsika/detail/modules/conex/CONEXhybrid.inl +++ b/corsika/detail/modules/conex/CONEXhybrid.inl @@ -112,7 +112,7 @@ namespace corsika { theta, phi); int ipart = static_cast<int>(primaryPDG); - auto rng = RNGManager::getInstance().getRandomStream("cascade"); + auto rng = RNGManager<>::getInstance().getRandomStream("cascade"); double dimpact = 0.; // valid only if shower core is fixed on the observation plane; // for skimming showers an offset is needed like in CONEX diff --git a/corsika/framework/core/Cascade.hpp b/corsika/framework/core/Cascade.hpp index 1804f406e98e915fd15970cb5dce75f9d721e6cc..10f9eb9a2d4820643a7562ae76be890b68febfc7 100644 --- a/corsika/framework/core/Cascade.hpp +++ b/corsika/framework/core/Cascade.hpp @@ -133,7 +133,7 @@ namespace corsika { TProcessList& sequence_; TOutput& output_; TStack& stack_; - default_prng_type& rng_ = RNGManager::getInstance().getRandomStream("cascade"); + default_prng_type& rng_ = RNGManager<>::getInstance().getRandomStream("cascade"); unsigned int count_ = 0; // but this here temporarily. Should go into dedicated file later: diff --git a/corsika/framework/random/RNGManager.hpp b/corsika/framework/random/RNGManager.hpp index 0e687adf45d3a93dca4f2e0975d0b9b7d5b82c0d..1bf2f41da7520b10299afacff6046bc8d1857022 100644 --- a/corsika/framework/random/RNGManager.hpp +++ b/corsika/framework/random/RNGManager.hpp @@ -15,27 +15,28 @@ #include <corsika/framework/utility/Singleton.hpp> #include <corsika/framework/core/Logging.hpp> - +#include <corsika/detail/framework/random/random_iterator/Stream.hpp> /*! * With this class modules can register streams of random numbers. */ namespace corsika { - class RNGManager : public corsika::Singleton<RNGManager> { +template<typename CBPRNG=random_iterator::philox> + class RNGManager : public corsika::Singleton<RNGManager<CBPRNG>> { - friend class corsika::Singleton<RNGManager>; + friend class corsika::Singleton<RNGManager<CBPRNG>>; public: - typedef std::mt19937_64 prng_type; + + typedef CBPRNG prng_type; typedef std::uint64_t seed_type; typedef std::string string_type; typedef std::map<std::string, prng_type> streams_type; - typedef std::map<std::string, std::seed_seq> seeds_type; - RNGManager(RNGManager const&) = delete; // since it is a singleton + RNGManager(RNGManager<CBPRNG> const&) = delete; // since it is a singleton - RNGManager& operator=(RNGManager const&) = delete; + RNGManager<CBPRNG>& operator=(RNGManager<CBPRNG> const&) = delete; /*! * This function is to be called by a module requiring a random-number @@ -43,35 +44,25 @@ namespace corsika { * * \throws sth. when stream \a pModuleName is already registered */ - void registerRandomStream(string_type const& streamName); + inline void registerRandomStream(string_type const& streamName); /*! * returns the pre-stored stream of given name \a pStreamName if * available */ - prng_type& getRandomStream(string_type const& streamName); + inline prng_type& getRandomStream(string_type const& streamName); /*! * Check whether a stream has been registered. */ - bool isRegistered(string_type const& streamName) const; + inline bool isRegistered(string_type const& streamName) const; /*! * dumps the names and states of all registered random-number streams * into a std::stringstream. */ - std::stringstream dumpState() const; - - /** - * Set explicit seeds for all currently registered streams. The actual seed values - * are incremented from \a vSeed. - */ - void seedAll(seed_type seed); + inline std::stringstream dumpState() const; - /** - * Set seeds for all currently registered streams. - */ - void seedAll(void); //!< seed all currently registered streams with "real" randomness /** * @fn const streams_type getRngs&()const @@ -83,15 +74,6 @@ namespace corsika { */ const streams_type& getRngs() const { return rngs_; } - /** - * @fn const seeds_type getSeeds&()const - * @brief Constant access to the seeds. - * - * @pre - * @post - * @return RNGManager::seeds_type - */ - const seeds_type& getSeeds() const { return seeds_; } /** * @fn streams_type Rngs() @@ -101,27 +83,29 @@ namespace corsika { * @post * @return RNGManager::streams_type& */ - streams_type Rngs() { return rngs_; } + streams_type& Rngs() { return rngs_; } - /** - * @fn seeds_type Seeds&() - * @brief Non-constant access to seeds. - * - * @pre - * @post - * @return RNGManager::seeds_type& - */ - seeds_type& getSeeds() { return seeds_; } + seed_type getSeed() const { + return seed_; + } + + void setSeed(seed_type seed) { + seed_ = seed; + //update the rgn states + for (auto& [streamName, rng] : rngs_) rng.setSeed(seed_) ; + + } protected: + RNGManager() = default; private: streams_type rngs_; - seeds_type seeds_; + seed_type seed_; }; - typedef typename RNGManager::prng_type default_prng_type; + typedef typename RNGManager<>::prng_type default_prng_type; } // namespace corsika diff --git a/corsika/modules/pythia8/Interaction.hpp b/corsika/modules/pythia8/Interaction.hpp index f1a6e0d935c63367472025e10444aad4820eabc0..c099997a4019de54deb00980ef7349669b744e08 100644 --- a/corsika/modules/pythia8/Interaction.hpp +++ b/corsika/modules/pythia8/Interaction.hpp @@ -47,7 +47,7 @@ namespace corsika::pythia8 { void doInteraction(TView&); private: - default_prng_type& RNG_ = RNGManager::getInstance().getRandomStream("pythia"); + default_prng_type& RNG_ = RNGManager<>::getInstance().getRandomStream("pythia"); Pythia8::SigmaTotal sigma_; const bool internalDecays_ = true; int count_ = 0; diff --git a/corsika/modules/pythia8/Random.hpp b/corsika/modules/pythia8/Random.hpp index 0e04cdb6ba49801610b9903cd2ce152f9735ddd8..5e1b8d4a53341e65d9efba31316592cfc15d6118 100644 --- a/corsika/modules/pythia8/Random.hpp +++ b/corsika/modules/pythia8/Random.hpp @@ -19,7 +19,7 @@ namespace corsika::pythia8 { private: std::uniform_real_distribution<double> Dist_; - default_prng_type& RNG_ = RNGManager::getInstance().getRandomStream("pythia"); + default_prng_type& RNG_ = RNGManager<>::getInstance().getRandomStream("pythia"); }; } // namespace corsika::pythia8 diff --git a/corsika/modules/qgsjetII/Interaction.hpp b/corsika/modules/qgsjetII/Interaction.hpp index 63c878df5d4cea4feadbe2ff028760a79643e741..4f2f1c1db733322a93d3becd6d73ce5790c4f8c1 100644 --- a/corsika/modules/qgsjetII/Interaction.hpp +++ b/corsika/modules/qgsjetII/Interaction.hpp @@ -57,7 +57,7 @@ namespace corsika::qgsjetII { QgsjetIIHadronType::PiPlusType; // for pi0, rho0 projectiles corsika::default_prng_type& rng_ = - corsika::RNGManager::getInstance().getRandomStream("qgsjet"); + corsika::RNGManager<>::getInstance().getRandomStream("qgsjet"); const int maxMassNumber_ = 208; }; diff --git a/corsika/modules/qgsjetII/Random.hpp b/corsika/modules/qgsjetII/Random.hpp index 1ba33351dff63470f1bdd2fe299999df33e1e374..83a5d0903192cb64c34f898587f69263aa927dd0 100644 --- a/corsika/modules/qgsjetII/Random.hpp +++ b/corsika/modules/qgsjetII/Random.hpp @@ -15,7 +15,7 @@ namespace qgsjetII { double rndm_interface() { static corsika::default_prng_type& rng = - corsika::RNGManager::getInstance().getRandomStream("qgsjet"); + corsika::RNGManager<>::getInstance().getRandomStream("qgsjet"); std::uniform_real_distribution<double> dist; return dist(rng); } diff --git a/corsika/modules/sibyll/Interaction.hpp b/corsika/modules/sibyll/Interaction.hpp index c00c68ac995cf0dfd4dc9bace54af082952b2dda..423d9319b9c9458265d65f1a28f0a0f1a17240f2 100644 --- a/corsika/modules/sibyll/Interaction.hpp +++ b/corsika/modules/sibyll/Interaction.hpp @@ -56,7 +56,7 @@ namespace corsika::sibyll { HEPEnergyType getMinEnergyCoM() const { return minEnergyCoM_; } HEPEnergyType getMaxEnergyCoM() const { return maxEnergyCoM_; } - default_prng_type& RNG_ = RNGManager::getInstance().getRandomStream("sibyll"); + default_prng_type& RNG_ = RNGManager<>::getInstance().getRandomStream("sibyll"); const HEPEnergyType minEnergyCoM_ = 10. * 1e9 * electronvolt; const HEPEnergyType maxEnergyCoM_ = 1.e6 * 1e9 * electronvolt; const int maxTargetMassNumber_ = 18; diff --git a/corsika/modules/sibyll/NuclearInteraction.hpp b/corsika/modules/sibyll/NuclearInteraction.hpp index 22a70bcb2f98389dabd60af44ecbbc5c3c0cab69..7196363131bd7bca26961bbe427d995927e134d0 100644 --- a/corsika/modules/sibyll/NuclearInteraction.hpp +++ b/corsika/modules/sibyll/NuclearInteraction.hpp @@ -53,7 +53,7 @@ namespace corsika::sibyll { TEnvironment const& environment_; sibyll::Interaction& hadronicInteraction_; std::map<Code, int> targetComponentsIndex_; - default_prng_type& RNG_ = RNGManager::getInstance().getRandomStream("sibyll"); + default_prng_type& RNG_ = RNGManager<>::getInstance().getRandomStream("sibyll"); static unsigned int constexpr gNSample_ = 500; // number of samples in MC estimation of cross section static unsigned int constexpr gMaxNucleusAProjectile_ = 56; diff --git a/corsika/modules/sibyll/Random.hpp b/corsika/modules/sibyll/Random.hpp index b3f3d86ba899e1dce4ac18687c2d1e4aaa47853a..a54d628db86343365a70aa4df10f3c25433c52ba 100644 --- a/corsika/modules/sibyll/Random.hpp +++ b/corsika/modules/sibyll/Random.hpp @@ -23,7 +23,7 @@ namespace sibyll { double rndm_interface() { static corsika::default_prng_type& rng = - corsika::RNGManager::getInstance().getRandomStream("sibyll"); + corsika::RNGManager<>::getInstance().getRandomStream("sibyll"); std::uniform_real_distribution<double> dist; return dist(rng); } diff --git a/corsika/modules/urqmd/Random.hpp b/corsika/modules/urqmd/Random.hpp index aa8f555e022b06eba90aaf0e97bb277f4d3a730d..37a5d2df4a8d3371dcdbb24e3e629436e918af42 100644 --- a/corsika/modules/urqmd/Random.hpp +++ b/corsika/modules/urqmd/Random.hpp @@ -18,7 +18,7 @@ namespace urqmd { */ double rndm_interface() { static corsika::default_prng_type& rng = - corsika::RNGManager::getInstance().getRandomStream("urqmd"); + corsika::RNGManager<>::getInstance().getRandomStream("urqmd"); static std::uniform_real_distribution<double> dist; return dist(rng); } diff --git a/corsika/modules/urqmd/UrQMD.hpp b/corsika/modules/urqmd/UrQMD.hpp index ca857e170ac5007367b16f9f526cd0e719434ddb..e83c6e8c0f1b71a1987378d9ccf0068736c72953 100644 --- a/corsika/modules/urqmd/UrQMD.hpp +++ b/corsika/modules/urqmd/UrQMD.hpp @@ -47,7 +47,7 @@ namespace corsika::urqmd { void readXSFile(boost::filesystem::path); // data members - default_prng_type& RNG_ = RNGManager::getInstance().getRandomStream("urqmd"); + default_prng_type& RNG_ = RNGManager<>::getInstance().getRandomStream("urqmd"); std::uniform_int_distribution<int> booleanDist_{0, 1}; boost::multi_array<CrossSectionType, 3> xs_interp_support_table_; }; diff --git a/tests/framework/testCascade.cpp b/tests/framework/testCascade.cpp index b069c23b9f8b49c5e70fc873b078198ffc08bd09..607daac9929bf407aae9bb87d904cf7c09f6cb51 100644 --- a/tests/framework/testCascade.cpp +++ b/tests/framework/testCascade.cpp @@ -144,7 +144,7 @@ TEST_CASE("Cascade", "[Cascade]") { HEPEnergyType E0 = 100_GeV; - RNGManager& rmng = RNGManager::getInstance(); + auto& rmng = RNGManager<>::getInstance(); rmng.registerRandomStream("cascade"); auto env = make_dummy_env(); diff --git a/tests/framework/testRandom.cpp b/tests/framework/testRandom.cpp index 2d0c0720ae163f2777c80837d8179b9355aba044..26363a914b21b457eb6b2629c24025f659f5547f 100644 --- a/tests/framework/testRandom.cpp +++ b/tests/framework/testRandom.cpp @@ -20,7 +20,7 @@ using namespace corsika; SCENARIO("random-number streams can be registered and retrieved") { GIVEN("a RNGManager") { - RNGManager& rngManager = RNGManager::getInstance(); + RNGManager<>& rngManager = RNGManager<>::getInstance(); WHEN("the sequence name is not registered") { CHECK(rngManager.isRegistered("stream_A") == false); diff --git a/tests/modules/testCONEX.cpp b/tests/modules/testCONEX.cpp index 63ca1fd573b3e7e2d0bbfff907d75ea609c7f6f2..05e76b8b7c4c601268b24de4f5fbe30040781915 100644 --- a/tests/modules/testCONEX.cpp +++ b/tests/modules/testCONEX.cpp @@ -40,8 +40,8 @@ TEST_CASE("CONEXSourceCut") { logging::set_level(logging::level::info); - RNGManager::getInstance().registerRandomStream("cascade"); - RNGManager::getInstance().registerRandomStream("sibyll"); + RNGManager<>::getInstance().registerRandomStream("cascade"); + RNGManager<>::getInstance().registerRandomStream("sibyll"); feenableexcept(FE_INVALID); diff --git a/tests/modules/testPythia8.cpp b/tests/modules/testPythia8.cpp index d07c791f5a73cfeb8801597cc62d2c77091e727b..e6cd55e8f51fe9d96c1f92c508362e68de0b9969 100644 --- a/tests/modules/testPythia8.cpp +++ b/tests/modules/testPythia8.cpp @@ -63,7 +63,7 @@ TEST_CASE("Pythia8", "modules") { std::set<Code> const particleList = {Code::PiPlus, Code::PiMinus, Code::KPlus, Code::KMinus, Code::K0Long, Code::K0Short}; - RNGManager::getInstance().registerRandomStream("pythia"); + RNGManager<>::getInstance().registerRandomStream("pythia"); corsika::pythia8::Decay decay(particleList); } } @@ -114,7 +114,7 @@ TEST_CASE("Pythia8Interface", "modules") { std::set<Code> const particleList = {Code::PiPlus, Code::PiMinus, Code::KPlus, Code::KMinus, Code::K0Long, Code::K0Short}; - RNGManager::getInstance().registerRandomStream("pythia"); + RNGManager<>::getInstance().registerRandomStream("pythia"); corsika::pythia8::Decay decay(particleList); diff --git a/tests/modules/testQGSJetII.cpp b/tests/modules/testQGSJetII.cpp index 1dfe2f57379d46206ea2d36e7268205b3bcec9c2..25765146ea86573b7da40882918f5bf49aef1e8c 100644 --- a/tests/modules/testQGSJetII.cpp +++ b/tests/modules/testQGSJetII.cpp @@ -137,7 +137,7 @@ TEST_CASE("QgsjetIIInterface", "[processes]") { [[maybe_unused]] auto const& env_dummy = env; [[maybe_unused]] auto const& node_dummy = nodePtr; - RNGManager::getInstance().registerRandomStream("qgsjet"); + RNGManager<>::getInstance().registerRandomStream("qgsjet"); SECTION("InteractionInterface") { diff --git a/tests/modules/testSibyll.cpp b/tests/modules/testSibyll.cpp index 41f511a47742e1eef4ddd70b3673b71597194474..58af6a2937df8ff21126e3b5ffd570f68d0b38f1 100644 --- a/tests/modules/testSibyll.cpp +++ b/tests/modules/testSibyll.cpp @@ -107,7 +107,7 @@ TEST_CASE("SibyllInterface", "[processes]") { auto const& cs = *csPtr; [[maybe_unused]] auto const& env_dummy = env; - RNGManager::getInstance().registerRandomStream("sibyll"); + RNGManager<>::getInstance().registerRandomStream("sibyll"); SECTION("InteractionInterface - valid targets") { diff --git a/tests/modules/testUrQMD.cpp b/tests/modules/testUrQMD.cpp index f55aa032948c22026b170776d8946dc074c6e688..b5c207a59e7b48487897404cdfee93a376aa1049 100644 --- a/tests/modules/testUrQMD.cpp +++ b/tests/modules/testUrQMD.cpp @@ -68,7 +68,7 @@ TEST_CASE("UrQMD") { } feenableexcept(FE_INVALID); - RNGManager::getInstance().registerRandomStream("urqmd"); + RNGManager<>::getInstance().registerRandomStream("urqmd"); UrQMD urqmd; SECTION("interaction length") {